@humain/ui 2.2.2 → 2.2.3

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 (67) hide show
  1. package/dist/components/templates/AppShell/AppShell.d.ts +4 -2
  2. package/dist/components/templates/AppShell/index.d.ts +1 -1
  3. package/dist/components/templates/AppSidebar/AppSidebar.constants.d.ts +4 -0
  4. package/dist/components/templates/AppSidebar/AppSidebar.d.ts +1 -0
  5. package/dist/index.js +19 -18
  6. package/dist/index217.js +6 -24
  7. package/dist/index217.js.map +1 -1
  8. package/dist/index218.js +20 -23
  9. package/dist/index218.js.map +1 -1
  10. package/dist/index219.js +20 -95
  11. package/dist/index219.js.map +1 -1
  12. package/dist/index220.js +92 -88
  13. package/dist/index220.js.map +1 -1
  14. package/dist/index221.js +97 -29
  15. package/dist/index221.js.map +1 -1
  16. package/dist/index222.js +24 -470
  17. package/dist/index222.js.map +1 -1
  18. package/dist/index223.js +450 -196
  19. package/dist/index223.js.map +1 -1
  20. package/dist/index224.js +199 -754
  21. package/dist/index224.js.map +1 -1
  22. package/dist/index225.js +777 -61
  23. package/dist/index225.js.map +1 -1
  24. package/dist/index226.js +58 -181
  25. package/dist/index226.js.map +1 -1
  26. package/dist/index227.js +175 -259
  27. package/dist/index227.js.map +1 -1
  28. package/dist/index228.js +246 -172
  29. package/dist/index228.js.map +1 -1
  30. package/dist/index229.js +195 -32
  31. package/dist/index229.js.map +1 -1
  32. package/dist/index230.js +12 -40
  33. package/dist/index230.js.map +1 -1
  34. package/dist/index231.js +23 -26
  35. package/dist/index231.js.map +1 -1
  36. package/dist/index232.js +45 -22
  37. package/dist/index232.js.map +1 -1
  38. package/dist/index233.js +27 -48
  39. package/dist/index233.js.map +1 -1
  40. package/dist/index234.js +52 -26
  41. package/dist/index234.js.map +1 -1
  42. package/dist/index235.js +40 -225
  43. package/dist/index235.js.map +1 -1
  44. package/dist/index236.js +217 -39
  45. package/dist/index236.js.map +1 -1
  46. package/dist/index237.js +50 -0
  47. package/dist/index237.js.map +1 -0
  48. package/dist/styles.css +1 -1
  49. package/dist/wc/{sidebar.js → AppSidebar.constants.js} +80 -78
  50. package/dist/wc/AppSidebar.constants.js.map +1 -0
  51. package/dist/wc/hf-app-shell.js +346 -343
  52. package/dist/wc/hf-app-shell.js.map +1 -1
  53. package/dist/wc/hf-app-sidebar.js +65 -62
  54. package/dist/wc/hf-app-sidebar.js.map +1 -1
  55. package/dist/wc-react/{sidebar.js → AppSidebar.constants.js} +89 -87
  56. package/dist/wc-react/AppSidebar.constants.js.map +1 -0
  57. package/dist/wc-react/hf-app-shell.js +383 -380
  58. package/dist/wc-react/hf-app-shell.js.map +1 -1
  59. package/dist/wc-react/hf-app-sidebar.js +69 -66
  60. package/dist/wc-react/hf-app-sidebar.js.map +1 -1
  61. package/package.json +1 -1
  62. package/skills/humain-ui/SKILL.md +1 -1
  63. package/skills/humain-ui-wc/SKILL.md +1 -1
  64. package/skills/humain-ui-wc.skill +0 -0
  65. package/skills/humain-ui.skill +0 -0
  66. package/dist/wc/sidebar.js.map +0 -1
  67. package/dist/wc-react/sidebar.js.map +0 -1
package/dist/index225.js CHANGED
@@ -1,70 +1,786 @@
1
+ "use client";
1
2
  import { cn } from "./index2.js";
2
- import { jsx, jsxs } from "react/jsx-runtime";
3
- //#region src/components/templates/PageBackground/PageBackground.tsx
4
- /** Grid pattern: 17 vertical + 17 horizontal lines at 48px spacing */
5
- function GridPattern() {
6
- return /* @__PURE__ */ jsxs("g", {
7
- className: "stroke-border",
8
- strokeWidth: "1",
9
- children: [Array.from({ length: 17 }).map((_, i) => /* @__PURE__ */ jsx("line", {
10
- x1: i * 48,
11
- y1: "0",
12
- x2: i * 48,
13
- y2: "768"
14
- }, `v-${i}`)), Array.from({ length: 17 }).map((_, i) => /* @__PURE__ */ jsx("line", {
15
- x1: "0",
16
- y1: i * 48,
17
- x2: "768",
18
- y2: i * 48
19
- }, `h-${i}`))]
20
- });
21
- }
22
- /** Circular pattern: 8 concentric circles at 48px radius increments */
23
- function CircularPattern() {
24
- return /* @__PURE__ */ jsx("g", {
25
- className: "stroke-border",
26
- strokeWidth: "1",
27
- fill: "none",
28
- children: [
29
- 48,
30
- 96,
31
- 144,
32
- 192,
33
- 240,
34
- 288,
35
- 336,
36
- 384
37
- ].map((radius) => /* @__PURE__ */ jsx("circle", {
38
- cx: "384",
39
- cy: "384",
40
- r: radius
41
- }, radius))
42
- });
43
- }
44
- var FADE_MASK = "radial-gradient(circle at center, black 0%, transparent 70%)";
45
- function PageBackground({ pattern, offset = "top", className }) {
46
- const isIconCenter = offset === "icon-center";
47
- const topOffset = isIconCenter ? void 0 : offset === "top" ? -260 : offset === "center" ? -384 : offset;
3
+ import { Badge } from "./index11.js";
4
+ import { Separator } from "./index48.js";
5
+ import { Avatar } from "./index72.js";
6
+ import { BrandIcon } from "./index73.js";
7
+ import { Tooltip, TooltipPopup, TooltipTrigger } from "./index121.js";
8
+ import { PopoverPopup, PopoverRoot, PopoverTrigger } from "./index211.js";
9
+ import { MOBILE_BREAKPOINT, useIsMobile } from "./index215.js";
10
+ import { Sidebar as SidebarCompound, SidebarAccountSkeleton, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarNavSkeleton, SidebarProvider, SidebarTrigger, useSidebar } from "./index216.js";
11
+ import { APP_SIDEBAR_COLLAPSED_WIDTH, APP_SIDEBAR_EXPANDED_WIDTH } from "./index217.js";
12
+ import { cva } from "class-variance-authority";
13
+ import { ChevronRight, MessageCircle, PanelLeftClose, PanelLeftOpen } from "lucide-react";
14
+ import * as React$1 from "react";
15
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
+ //#region src/components/templates/AppSidebar/AppSidebar.tsx
17
+ /** biome-ignore-all lint/a11y/noNoninteractiveTabindex: ChatList uses tabIndex on scrollable div for keyboard scrolling */
18
+ /** biome-ignore-all lint/a11y/useSemanticElements: NavSection uses role="separator" on inner <div>; ChatList uses role="list" on scrollable div */
19
+ /** biome-ignore-all lint/a11y/useFocusableInteractive: Non-focusable separator per WAI-ARIA spec for decorative separators */
20
+ /** biome-ignore-all lint/a11y/useAriaPropsForRole: Non-focusable separators don't require aria-valuenow per WAI-ARIA spec */
21
+ /** biome-ignore-all lint/a11y/noNoninteractiveElementToInteractiveRole: role="separator" on <div> inside list items for semantic section boundaries */
22
+ function formatAccessibleLabel(label, badge) {
23
+ if (badge == null) return label;
24
+ return `${label}, ${typeof badge === "number" ? `${badge} ${badge === 1 ? "item" : "items"}` : badge}`;
25
+ }
26
+ function getSidebarBgClass(isCollapsed, sidebarBgColor) {
27
+ return isCollapsed ? "bg-transparent" : sidebarBgColor ?? "bg-[var(--sidebar)]";
28
+ }
29
+ function getSidebarSurfaceClass({ isCollapsed, side, rounded, backgroundClass }) {
30
+ return cn("flex h-full min-h-0 flex-col items-center pb-4 pt-6", isCollapsed ? "w-full px-6" : ["w-[calc(100%-0.75rem)] px-3", side === "left" ? "mr-3 self-start" : "ml-3 self-end"], backgroundClass, rounded && (side === "left" ? "rounded-r-lg" : "rounded-l-lg"));
31
+ }
32
+ function getSkeletonCount(count, fallback) {
33
+ return typeof count === "number" && Number.isFinite(count) && count >= 0 ? Math.floor(count) : fallback;
34
+ }
35
+ var APP_SIDEBAR_IMPLICIT_SLOT = Symbol("AppSidebarImplicitSlot");
36
+ function markAppSidebarImplicitSlot(component, slot) {
37
+ const slottedComponent = component;
38
+ slottedComponent[APP_SIDEBAR_IMPLICIT_SLOT] = slot;
39
+ return slottedComponent;
40
+ }
41
+ function isAppSidebarImplicitSlotComponent(value) {
42
+ return (typeof value === "function" || typeof value === "object" && value !== null) && APP_SIDEBAR_IMPLICIT_SLOT in value;
43
+ }
44
+ function getAppSidebarImplicitSlot(childType) {
45
+ if (isAppSidebarImplicitSlotComponent(childType)) return childType[APP_SIDEBAR_IMPLICIT_SLOT];
46
+ if (typeof childType === "object" && childType !== null) {
47
+ const wrappedComponent = childType;
48
+ return getAppSidebarImplicitSlot(wrappedComponent.type) ?? getAppSidebarImplicitSlot(wrappedComponent.render);
49
+ }
50
+ }
51
+ function useSlotChildren(children) {
52
+ return React$1.useMemo(() => {
53
+ const result = {
54
+ header: [],
55
+ content: [],
56
+ footer: [],
57
+ explicitHeader: null,
58
+ explicitContent: null,
59
+ explicitFooter: null
60
+ };
61
+ React$1.Children.forEach(children, (child) => {
62
+ if (!React$1.isValidElement(child)) return;
63
+ const childType = child.type;
64
+ if (childType === AppSidebarHeader) {
65
+ result.explicitHeader = child;
66
+ return;
67
+ }
68
+ if (childType === AppSidebarContent) {
69
+ result.explicitContent = child;
70
+ return;
71
+ }
72
+ if (childType === AppSidebarFooter) {
73
+ result.explicitFooter = child;
74
+ return;
75
+ }
76
+ const implicitSlot = getAppSidebarImplicitSlot(childType);
77
+ if (implicitSlot === "header") result.header.push(child);
78
+ else if (implicitSlot === "content") result.content.push(child);
79
+ else if (implicitSlot === "footer") result.footer.push(child);
80
+ else result.content.push(child);
81
+ });
82
+ return result;
83
+ }, [children]);
84
+ }
85
+ var AppSidebarLayoutContext = React$1.createContext({ side: "left" });
86
+ function useAppSidebarLayout() {
87
+ return React$1.useContext(AppSidebarLayoutContext);
88
+ }
89
+ function getAppSidebarDirection(element) {
90
+ const win = element?.ownerDocument.defaultView;
91
+ if (!element || !win) return "ltr";
92
+ return win.getComputedStyle(element).direction === "rtl" ? "rtl" : "ltr";
93
+ }
94
+ function normalizeAppSidebarDirection(dir) {
95
+ return dir === "rtl" || dir === "ltr" ? dir : void 0;
96
+ }
97
+ function getAppSidebarSideFromDirection(direction) {
98
+ return direction === "rtl" ? "right" : "left";
99
+ }
100
+ function getAppSidebarDirectionTargets(element) {
101
+ const targets = /* @__PURE__ */ new Set();
102
+ let current = element;
103
+ while (current) {
104
+ targets.add(current);
105
+ if (current === element.ownerDocument.documentElement) break;
106
+ current = current.parentElement;
107
+ }
108
+ targets.add(element.ownerDocument.documentElement);
109
+ if (element.ownerDocument.body) targets.add(element.ownerDocument.body);
110
+ return Array.from(targets);
111
+ }
112
+ function useResolvedAppSidebarSide({ containerRef, explicitDir, explicitSide }) {
113
+ const [detectedDirection, setDetectedDirection] = React$1.useState(() => normalizeAppSidebarDirection(explicitDir) ?? "ltr");
114
+ React$1.useEffect(() => {
115
+ if (explicitSide) return;
116
+ const normalizedExplicitDir = normalizeAppSidebarDirection(explicitDir);
117
+ if (normalizedExplicitDir) {
118
+ setDetectedDirection((current) => current === normalizedExplicitDir ? current : normalizedExplicitDir);
119
+ return;
120
+ }
121
+ const container = containerRef.current;
122
+ const win = container?.ownerDocument.defaultView;
123
+ if (!container || !win) return;
124
+ const detectDirection = () => {
125
+ const nextDirection = getAppSidebarDirection(container);
126
+ setDetectedDirection((current) => current === nextDirection ? current : nextDirection);
127
+ };
128
+ detectDirection();
129
+ const Observer = win.MutationObserver;
130
+ if (!Observer) return;
131
+ const observer = new Observer(detectDirection);
132
+ for (const target of getAppSidebarDirectionTargets(container)) observer.observe(target, {
133
+ attributes: true,
134
+ attributeFilter: [
135
+ "dir",
136
+ "class",
137
+ "style"
138
+ ]
139
+ });
140
+ return () => observer.disconnect();
141
+ }, [
142
+ containerRef,
143
+ explicitDir,
144
+ explicitSide
145
+ ]);
146
+ return explicitSide ?? getAppSidebarSideFromDirection(detectedDirection);
147
+ }
148
+ var DEFAULT_COMPACTED_LOGO = /* @__PURE__ */ jsx("span", {
149
+ className: "flex size-9 items-center justify-center rounded-lg bg-primary text-primary-foreground",
150
+ children: /* @__PURE__ */ jsx(BrandIcon, {
151
+ icon: "mark",
152
+ size: "sm"
153
+ })
154
+ });
155
+ function AppSidebarLogo({ logo, compactedLogo, subtext, className, ...props }) {
156
+ const { state, toggleSidebar } = useSidebar();
157
+ const isCollapsed = state === "collapsed";
158
+ const effectiveCompactedLogo = compactedLogo ?? DEFAULT_COMPACTED_LOGO;
159
+ if (isCollapsed) return /* @__PURE__ */ jsx("div", {
160
+ "data-slot": "app-sidebar-logo",
161
+ className: cn("flex items-center justify-center", className),
162
+ ...props,
163
+ dir: "ltr",
164
+ children: /* @__PURE__ */ jsxs("button", {
165
+ type: "button",
166
+ onClick: toggleSidebar,
167
+ className: "group/logo relative flex size-[52px] items-center justify-center rounded-md p-2 transition-colors duration-200 ease-smooth hover:bg-sidebar-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none",
168
+ "aria-label": "Expand sidebar",
169
+ children: [/* @__PURE__ */ jsx("span", {
170
+ className: "transition-opacity duration-200 ease-smooth group-hover/logo:opacity-0 motion-reduce:transition-none",
171
+ children: effectiveCompactedLogo
172
+ }), /* @__PURE__ */ jsx(PanelLeftOpen, { className: "absolute size-5 opacity-0 transition-opacity duration-200 ease-smooth group-hover/logo:opacity-100 motion-reduce:transition-none" })]
173
+ })
174
+ });
175
+ return /* @__PURE__ */ jsxs("div", {
176
+ "data-slot": "app-sidebar-logo",
177
+ className: cn("flex h-[52px] items-center justify-between gap-2 rounded-md p-2", className),
178
+ ...props,
179
+ dir: "ltr",
180
+ children: [/* @__PURE__ */ jsxs("div", {
181
+ className: "flex min-w-0 flex-col gap-0",
182
+ children: [/* @__PURE__ */ jsx("div", {
183
+ className: "flex items-center gap-2",
184
+ children: logo || /* @__PURE__ */ jsxs(Fragment, { children: [DEFAULT_COMPACTED_LOGO, /* @__PURE__ */ jsx("span", {
185
+ className: "text-lg font-semibold tracking-tight text-foreground",
186
+ children: "HUMAIN"
187
+ })] })
188
+ }), subtext && /* @__PURE__ */ jsx("p", {
189
+ className: "ps-11 text-sm text-sidebar-foreground",
190
+ children: /* @__PURE__ */ jsx("span", {
191
+ "data-slot": "app-sidebar-logo-subtext",
192
+ children: subtext
193
+ })
194
+ })]
195
+ }), /* @__PURE__ */ jsx("button", {
196
+ type: "button",
197
+ onClick: toggleSidebar,
198
+ className: "relative flex size-9 items-center justify-center rounded-lg text-sidebar-foreground transition-colors duration-200 ease-smooth hover:bg-sidebar-accent hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none after:absolute after:-inset-1",
199
+ "aria-label": "Collapse sidebar",
200
+ children: /* @__PURE__ */ jsx(PanelLeftClose, {
201
+ "aria-hidden": "true",
202
+ className: "size-5"
203
+ })
204
+ })]
205
+ });
206
+ }
207
+ AppSidebarLogo.displayName = "AppSidebar.Logo";
208
+ function AppSidebarHeader({ children, className }) {
209
+ return /* @__PURE__ */ jsx("div", {
210
+ "data-slot": "app-sidebar-header",
211
+ className,
212
+ children
213
+ });
214
+ }
215
+ AppSidebarHeader.displayName = "AppSidebar.Header";
216
+ function AppSidebarContent({ children, className }) {
217
+ return /* @__PURE__ */ jsx("div", {
218
+ "data-slot": "app-sidebar-content",
219
+ className,
220
+ children
221
+ });
222
+ }
223
+ AppSidebarContent.displayName = "AppSidebar.Content";
224
+ function AppSidebarFooter({ children, className }) {
48
225
  return /* @__PURE__ */ jsx("div", {
49
- "data-slot": "page-background",
50
- className: cn("pointer-events-none absolute left-1/2 -translate-x-1/2 size-[768px]", isIconCenter && "top-1/2 -translate-y-1/2", className),
51
- style: {
52
- ...topOffset !== void 0 ? { top: topOffset } : {},
53
- maskImage: FADE_MASK,
54
- WebkitMaskImage: FADE_MASK
55
- },
226
+ "data-slot": "app-sidebar-footer",
227
+ className,
228
+ children
229
+ });
230
+ }
231
+ AppSidebarFooter.displayName = "AppSidebar.Footer";
232
+ function AppSidebarNav({ children, "aria-label": ariaLabel = "Sidebar navigation", className }) {
233
+ const menuContent = /* @__PURE__ */ jsx(SidebarMenu, {
234
+ className: "gap-0.5 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:gap-1",
235
+ children: React$1.Children.map(children, (child) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: child }))
236
+ });
237
+ return /* @__PURE__ */ jsx(SidebarGroup, {
238
+ "data-slot": "app-sidebar-nav",
239
+ className: cn("shrink-0 p-0 group-data-[collapsible=icon]:w-auto", className),
240
+ children: /* @__PURE__ */ jsx(SidebarGroupContent, { children: /* @__PURE__ */ jsx("nav", {
241
+ "aria-label": ariaLabel,
242
+ children: menuContent
243
+ }) })
244
+ });
245
+ }
246
+ AppSidebarNav.displayName = "AppSidebar.Nav";
247
+ markAppSidebarImplicitSlot(AppSidebarNav, "content");
248
+ function AppSidebarNavSection({ label, className }) {
249
+ return /* @__PURE__ */ jsxs("div", {
250
+ "data-slot": "app-sidebar-nav-section",
251
+ role: "separator",
252
+ "aria-label": label,
253
+ className: cn("py-2 group-data-[collapsible=icon]:w-[52px]", className),
254
+ children: [/* @__PURE__ */ jsx("div", {
255
+ className: "flex h-8 items-center px-2 group-data-[collapsible=icon]:hidden",
256
+ children: /* @__PURE__ */ jsx("span", {
257
+ className: "text-xs font-medium text-sidebar-foreground/80",
258
+ children: label
259
+ })
260
+ }), /* @__PURE__ */ jsxs("div", {
261
+ className: "hidden py-2 group-data-[collapsible=icon]:block",
262
+ children: [/* @__PURE__ */ jsx("span", {
263
+ className: "sr-only",
264
+ children: label
265
+ }), /* @__PURE__ */ jsx(Separator, { className: "mx-auto w-full" })]
266
+ })]
267
+ });
268
+ }
269
+ AppSidebarNavSection.displayName = "AppSidebar.NavSection";
270
+ var navItemVariants = cva("relative flex w-full items-center gap-1.5 rounded-lg px-2 py-2 text-sm font-normal transition-[color,background-color] duration-200 ease-smooth motion-reduce:transition-none", {
271
+ variants: { state: {
272
+ default: "text-sidebar-foreground hover:bg-sidebar-accent",
273
+ active: "bg-primary/10 text-sidebar-foreground"
274
+ } },
275
+ defaultVariants: { state: "default" }
276
+ });
277
+ function AppSidebarNavItem({ icon, label, isActive = false, badge, onClick, href, className, children }) {
278
+ const { state, containerRef } = useSidebar();
279
+ const { side: sidebarSide } = useAppSidebarLayout();
280
+ const isCollapsed = state === "collapsed";
281
+ const hasChildren = React$1.Children.count(children) > 0;
282
+ const hasActiveChild = React$1.Children.toArray(children).some((child) => React$1.isValidElement(child) && child.props.isActive === true);
283
+ const isHighlighted = isActive || hasActiveChild;
284
+ const [isOpen, setIsOpen] = React$1.useState(isHighlighted && hasChildren);
285
+ const subNavId = React$1.useId();
286
+ const floatingSide = sidebarSide === "right" ? "left" : "right";
287
+ const flyoutPanelBackground = "linear-gradient(108deg, var(--opacity-white-87) 0.5219%, var(--opacity-white-75) 98.419%)";
288
+ const flyoutFrameEdgeClassName = sidebarSide === "right" ? "justify-end rounded-l-xl rounded-r-none" : "justify-start rounded-r-xl rounded-l-none";
289
+ const flyoutPanelEdgeClassName = sidebarSide === "right" ? "rounded-l-xl" : "rounded-r-xl";
290
+ const flyoutAnchor = React$1.useMemo(() => ({ getBoundingClientRect: () => {
291
+ const container = containerRef.current;
292
+ const rect = container?.getBoundingClientRect();
293
+ const viewportHeight = (container?.ownerDocument.defaultView)?.innerHeight ?? rect?.height ?? 0;
294
+ const x = rect ? sidebarSide === "right" ? rect.left : rect.right : 0;
295
+ return {
296
+ x,
297
+ y: 0,
298
+ top: 0,
299
+ right: x,
300
+ bottom: viewportHeight,
301
+ left: x,
302
+ width: 0,
303
+ height: viewportHeight
304
+ };
305
+ } }), [containerRef, sidebarSide]);
306
+ React$1.useEffect(() => {
307
+ if (isHighlighted && hasChildren) setIsOpen(true);
308
+ }, [isHighlighted, hasChildren]);
309
+ const accessibleLabel = formatAccessibleLabel(label, badge);
310
+ const iconElement = /* @__PURE__ */ jsx("span", {
311
+ "data-slot": "nav-icon",
312
+ className: "flex shrink-0 items-center p-0.5 [&>svg]:size-4",
313
+ children: icon
314
+ });
315
+ const labelElement = /* @__PURE__ */ jsx("span", {
316
+ className: "flex-1 text-start group-data-[collapsible=icon]:hidden",
317
+ children: label
318
+ });
319
+ const badgeElement = badge != null && /* @__PURE__ */ jsx(Badge, {
320
+ size: "sm",
321
+ variant: "soft",
322
+ color: "primary",
323
+ className: "px-1.5 group-data-[collapsible=icon]:hidden",
324
+ "aria-hidden": "true",
325
+ children: badge
326
+ });
327
+ const chevronElement = hasChildren && /* @__PURE__ */ jsx(ChevronRight, {
328
+ "aria-hidden": "true",
329
+ className: cn("size-4 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth group-data-[collapsible=icon]:hidden motion-reduce:transition-none", isOpen ? "rotate-90" : "rtl:rotate-180", isHighlighted && isOpen && "text-primary")
330
+ });
331
+ const itemClassName = cn(navItemVariants({ state: isHighlighted ? "active" : "default" }), "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", "min-h-11 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0 group-data-[collapsible=icon]:py-2 group-data-[collapsible=icon]:w-11 group-data-[collapsible=icon]:h-11", className);
332
+ const ariaProps = isActive ? { "aria-current": "page" } : {};
333
+ if (isCollapsed) {
334
+ const collapsedIconElement = /* @__PURE__ */ jsx("span", {
335
+ "data-slot": "nav-icon",
336
+ className: "flex shrink-0 items-center justify-center p-0.5 [&>svg]:size-4",
337
+ children: icon
338
+ });
339
+ const triggerElement = href ? /* @__PURE__ */ jsx("a", {
340
+ href,
341
+ className: cn(itemClassName),
342
+ "aria-label": accessibleLabel,
343
+ ...ariaProps,
344
+ "data-slot": "app-sidebar-nav-item",
345
+ children: collapsedIconElement
346
+ }) : /* @__PURE__ */ jsx("button", {
347
+ type: "button",
348
+ onClick: hasChildren ? () => setIsOpen(!isOpen) : onClick,
349
+ className: cn(itemClassName, "cursor-pointer"),
350
+ "aria-label": accessibleLabel,
351
+ ...ariaProps,
352
+ "data-slot": "app-sidebar-nav-item",
353
+ children: collapsedIconElement
354
+ });
355
+ if (!hasChildren) {
356
+ if (!label) return triggerElement;
357
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: triggerElement }), /* @__PURE__ */ jsx(TooltipPopup, {
358
+ side: floatingSide,
359
+ sideOffset: 8,
360
+ children: label
361
+ })] });
362
+ }
363
+ return /* @__PURE__ */ jsxs(PopoverRoot, { children: [/* @__PURE__ */ jsx(PopoverTrigger, {
364
+ className: cn(itemClassName, "cursor-pointer"),
365
+ "aria-label": accessibleLabel,
366
+ "data-slot": "app-sidebar-nav-item",
367
+ children: collapsedIconElement
368
+ }), /* @__PURE__ */ jsx(PopoverPopup, {
369
+ side: floatingSide,
370
+ align: "start",
371
+ sideOffset: 0,
372
+ alignOffset: 0,
373
+ anchor: flyoutAnchor,
374
+ collisionAvoidance: {
375
+ side: "none",
376
+ align: "none",
377
+ fallbackAxisSide: "none"
378
+ },
379
+ positionMethod: "fixed",
380
+ "aria-label": `${label} sub-navigation`,
381
+ style: { "--app-sidebar-flyout-panel-bg": flyoutPanelBackground },
382
+ className: cn("flex h-[var(--anchor-height)] w-[276px] border-0 bg-transparent p-0 ring-0 shadow-none", "overflow-clip", flyoutFrameEdgeClassName),
383
+ children: /* @__PURE__ */ jsxs("div", {
384
+ className: cn("flex h-full w-64 flex-col gap-0.5 overflow-y-auto p-3 shadow-[var(--shadow-hover-card)]", "supports-backdrop-filter:backdrop-blur-[60px] [background-image:var(--app-sidebar-flyout-panel-bg)] delight-tooltip-stagger", flyoutPanelEdgeClassName),
385
+ "data-slot": "app-sidebar-nav-flyout-panel",
386
+ role: "group",
387
+ "aria-label": label,
388
+ children: [/* @__PURE__ */ jsx("p", {
389
+ className: "px-2 pb-2 pt-1 text-xs font-semibold text-primary opacity-70",
390
+ "aria-hidden": "true",
391
+ children: label
392
+ }), children]
393
+ })
394
+ })] });
395
+ }
396
+ const handleClick = () => {
397
+ if (hasChildren) setIsOpen(!isOpen);
398
+ onClick?.();
399
+ };
400
+ const mainElement = href && !hasChildren ? /* @__PURE__ */ jsxs("a", {
401
+ href,
402
+ className: itemClassName,
403
+ "aria-label": accessibleLabel,
404
+ ...ariaProps,
405
+ "data-slot": "app-sidebar-nav-item",
406
+ children: [
407
+ iconElement,
408
+ labelElement,
409
+ badgeElement,
410
+ chevronElement
411
+ ]
412
+ }) : /* @__PURE__ */ jsxs("button", {
413
+ type: "button",
414
+ onClick: handleClick,
415
+ className: cn(itemClassName, "cursor-pointer"),
416
+ "aria-label": accessibleLabel,
417
+ "aria-expanded": hasChildren ? isOpen : void 0,
418
+ "aria-controls": hasChildren ? subNavId : void 0,
419
+ ...ariaProps,
420
+ "data-slot": "app-sidebar-nav-item",
421
+ children: [
422
+ iconElement,
423
+ labelElement,
424
+ badgeElement,
425
+ chevronElement
426
+ ]
427
+ });
428
+ if (!hasChildren) return mainElement;
429
+ return /* @__PURE__ */ jsxs(Fragment, { children: [mainElement, isOpen && /* @__PURE__ */ jsx("ul", {
430
+ id: subNavId,
431
+ role: "group",
432
+ "aria-label": `${label} sub-navigation`,
433
+ className: "ms-4 flex flex-col items-start border-s border-sidebar-border py-1 ps-2",
434
+ children
435
+ })] });
436
+ }
437
+ AppSidebarNavItem.displayName = "AppSidebar.NavItem";
438
+ function AppSidebarNavSub({ label, badge, isActive = false, href, onClick, className }) {
439
+ const accessibleLabel = formatAccessibleLabel(label, badge);
440
+ const itemClassName = cn(navItemVariants({ state: isActive ? "active" : "default" }), "min-h-11 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", "transition-[color,background-color,transform] ltr:hover:translate-x-0.5 rtl:hover:-translate-x-0.5 motion-reduce:ltr:hover:translate-x-0 motion-reduce:rtl:hover:translate-x-0", className);
441
+ const ariaProps = isActive ? { "aria-current": "page" } : {};
442
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
443
+ className: "flex-1 text-start",
444
+ children: label
445
+ }), badge != null && /* @__PURE__ */ jsx(Badge, {
446
+ size: "sm",
447
+ variant: "soft",
448
+ color: "primary",
449
+ className: "px-1.5",
56
450
  "aria-hidden": "true",
57
- children: /* @__PURE__ */ jsx("svg", {
58
- className: "absolute inset-0 size-[768px]",
59
- viewBox: "0 0 768 768",
60
- fill: "none",
61
- focusable: "false",
62
- children: pattern === "grid" ? /* @__PURE__ */ jsx(GridPattern, {}) : /* @__PURE__ */ jsx(CircularPattern, {})
451
+ children: badge
452
+ })] });
453
+ if (href) return /* @__PURE__ */ jsx("a", {
454
+ href,
455
+ className: itemClassName,
456
+ "aria-label": accessibleLabel,
457
+ ...ariaProps,
458
+ "data-slot": "app-sidebar-nav-sub",
459
+ children: content
460
+ });
461
+ return /* @__PURE__ */ jsx("button", {
462
+ type: "button",
463
+ onClick,
464
+ className: cn(itemClassName, "cursor-pointer delight-selection-press"),
465
+ "aria-label": accessibleLabel,
466
+ ...ariaProps,
467
+ "data-slot": "app-sidebar-nav-sub",
468
+ children: content
469
+ });
470
+ }
471
+ AppSidebarNavSub.displayName = "AppSidebar.NavSub";
472
+ function AppSidebarNavSkeleton({ count = 3, className }) {
473
+ const skeletonCount = getSkeletonCount(count, 3);
474
+ return /* @__PURE__ */ jsx(SidebarGroup, {
475
+ className: cn("shrink-0 p-0 group-data-[collapsible=icon]:w-auto", className),
476
+ children: /* @__PURE__ */ jsx(SidebarGroupContent, { children: /* @__PURE__ */ jsx(SidebarMenu, {
477
+ className: "gap-0.5 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:gap-2",
478
+ children: Array.from({ length: skeletonCount }).map((_, i) => /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsx(SidebarNavSkeleton, {}) }, `nav-skeleton-${i}`))
479
+ }) })
480
+ });
481
+ }
482
+ AppSidebarNavSkeleton.displayName = "AppSidebar.NavSkeleton";
483
+ markAppSidebarImplicitSlot(AppSidebarNavSkeleton, "content");
484
+ function AppSidebarChatList({ label = "Recent Chats", children, className }) {
485
+ const { state } = useSidebar();
486
+ if (state === "collapsed") return null;
487
+ return /* @__PURE__ */ jsxs(SidebarGroup, {
488
+ "data-slot": "app-sidebar-chat-list",
489
+ className: cn("mt-4 flex min-h-0 flex-1 flex-col p-0", className),
490
+ children: [/* @__PURE__ */ jsx(SidebarGroupLabel, {
491
+ className: "shrink-0 px-3 py-1 text-xs font-bold text-muted-foreground",
492
+ children: label
493
+ }), /* @__PURE__ */ jsx(SidebarGroupContent, {
494
+ className: "flex-1 overflow-hidden",
495
+ children: /* @__PURE__ */ jsx("div", {
496
+ className: "flex h-full flex-col overflow-y-auto pb-5 rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",
497
+ tabIndex: 0,
498
+ role: "list",
499
+ "aria-label": label,
500
+ children
501
+ })
502
+ })]
503
+ });
504
+ }
505
+ AppSidebarChatList.displayName = "AppSidebar.ChatList";
506
+ markAppSidebarImplicitSlot(AppSidebarChatList, "content");
507
+ var chatItemVariants = cva("flex w-full items-center justify-between gap-2 rounded-md px-3 py-2 min-h-11 transition-[color,background-color,transform] duration-200 ease-smooth cursor-pointer motion-reduce:transition-none ltr:hover:translate-x-0.5 rtl:hover:-translate-x-0.5 motion-reduce:ltr:hover:translate-x-0 motion-reduce:rtl:hover:translate-x-0", {
508
+ variants: { state: {
509
+ default: "hover:bg-muted",
510
+ hover: "bg-muted",
511
+ selected: "bg-primary/10"
512
+ } },
513
+ defaultVariants: { state: "default" }
514
+ });
515
+ function AppSidebarChatItem({ title, time, icon, isSelected = false, onClick, onContextMenu, className }) {
516
+ const { state } = useSidebar();
517
+ const { side: sidebarSide } = useAppSidebarLayout();
518
+ const isCollapsed = state === "collapsed";
519
+ const tooltipSide = sidebarSide === "right" ? "left" : "right";
520
+ if (isCollapsed) {
521
+ const collapsedButton = /* @__PURE__ */ jsx("button", {
522
+ type: "button",
523
+ onClick,
524
+ onContextMenu,
525
+ "data-slot": "app-sidebar-chat-item",
526
+ "aria-label": title || void 0,
527
+ className: cn("flex size-11 items-center justify-center rounded-md transition-colors duration-200 ease-smooth motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", isSelected ? "bg-primary/10" : "hover:bg-muted", className),
528
+ children: icon || /* @__PURE__ */ jsx(MessageCircle, { className: "size-5 text-secondary-foreground" })
529
+ });
530
+ if (!title && !time) return collapsedButton;
531
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: collapsedButton }), /* @__PURE__ */ jsx(TooltipPopup, {
532
+ side: tooltipSide,
533
+ sideOffset: 8,
534
+ children: /* @__PURE__ */ jsxs("div", {
535
+ className: "flex flex-col",
536
+ children: [/* @__PURE__ */ jsx("span", {
537
+ className: "font-medium",
538
+ children: title
539
+ }), time && /* @__PURE__ */ jsx("span", {
540
+ className: "text-xs text-muted-foreground",
541
+ children: time
542
+ })]
543
+ })
544
+ })] });
545
+ }
546
+ return /* @__PURE__ */ jsx("div", {
547
+ role: "listitem",
548
+ children: /* @__PURE__ */ jsxs("button", {
549
+ type: "button",
550
+ onClick,
551
+ onContextMenu,
552
+ "data-slot": "app-sidebar-chat-item",
553
+ "aria-label": title,
554
+ className: cn(chatItemVariants({ state: isSelected ? "selected" : "default" }), "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", className),
555
+ children: [/* @__PURE__ */ jsx("span", {
556
+ className: "text-base font-semibold text-secondary-foreground truncate",
557
+ children: title
558
+ }), time && /* @__PURE__ */ jsx("span", {
559
+ className: "text-xs font-normal text-muted-foreground shrink-0",
560
+ children: time
561
+ })]
562
+ })
563
+ });
564
+ }
565
+ AppSidebarChatItem.displayName = "AppSidebar.ChatItem";
566
+ function AppSidebarChatListSkeleton({ count = 5, label = "Recent Chats", className }) {
567
+ const skeletonCount = getSkeletonCount(count, 5);
568
+ return /* @__PURE__ */ jsxs(SidebarGroup, {
569
+ className: cn("mt-4 flex min-h-0 flex-1 flex-col p-0 group-data-[collapsible=icon]:hidden", className),
570
+ children: [/* @__PURE__ */ jsx(SidebarGroupLabel, {
571
+ className: "shrink-0 px-3 py-1 text-xs font-bold text-muted-foreground",
572
+ children: label
573
+ }), /* @__PURE__ */ jsx(SidebarGroupContent, {
574
+ className: "flex-1 overflow-hidden",
575
+ children: /* @__PURE__ */ jsx("div", {
576
+ className: "flex h-full flex-col overflow-y-auto pb-5",
577
+ children: Array.from({ length: skeletonCount }).map((_, i) => /* @__PURE__ */ jsx(SidebarMenuSkeleton, {}, `chat-skeleton-${i}`))
578
+ })
579
+ })]
580
+ });
581
+ }
582
+ AppSidebarChatListSkeleton.displayName = "AppSidebar.ChatListSkeleton";
583
+ markAppSidebarImplicitSlot(AppSidebarChatListSkeleton, "content");
584
+ function AppSidebarAccount({ name, subtitle, avatarSrc, isOnline = false, onExpand, className }) {
585
+ const { state } = useSidebar();
586
+ const { side: sidebarSide } = useAppSidebarLayout();
587
+ const isCollapsed = state === "collapsed";
588
+ const tooltipSide = sidebarSide === "right" ? "left" : "right";
589
+ if (isCollapsed) {
590
+ const avatarButton = /* @__PURE__ */ jsx("button", {
591
+ type: "button",
592
+ onClick: onExpand,
593
+ "data-slot": "app-sidebar-account",
594
+ "aria-label": name ? `${name} account menu` : "Account menu",
595
+ "aria-haspopup": "true",
596
+ className: cn("flex min-h-11 min-w-11 items-center justify-center rounded-lg transition-opacity duration-200 ease-smooth hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none", className),
597
+ children: /* @__PURE__ */ jsx(Avatar, {
598
+ src: avatarSrc,
599
+ alt: name,
600
+ fallback: name,
601
+ size: "sm",
602
+ className: "size-[42px]",
603
+ indicator: isOnline ? "online" : void 0
604
+ })
605
+ });
606
+ if (!name && !subtitle) return avatarButton;
607
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { render: avatarButton }), /* @__PURE__ */ jsx(TooltipPopup, {
608
+ side: tooltipSide,
609
+ sideOffset: 8,
610
+ children: /* @__PURE__ */ jsxs("div", {
611
+ className: "flex flex-col",
612
+ children: [name && /* @__PURE__ */ jsx("span", {
613
+ className: "font-medium",
614
+ children: name
615
+ }), subtitle && /* @__PURE__ */ jsx("span", {
616
+ className: "text-xs text-muted-foreground",
617
+ children: subtitle
618
+ })]
619
+ })
620
+ })] });
621
+ }
622
+ return /* @__PURE__ */ jsxs("button", {
623
+ type: "button",
624
+ onClick: onExpand,
625
+ "data-slot": "app-sidebar-account",
626
+ "aria-label": name ? `${name} account menu` : "Account menu",
627
+ "aria-haspopup": "true",
628
+ className: cn("flex w-full items-center gap-1.5 rounded-lg px-1 py-2 transition-colors duration-200 ease-smooth hover:bg-sidebar-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none", className),
629
+ children: [/* @__PURE__ */ jsx(Avatar, {
630
+ src: avatarSrc,
631
+ alt: name,
632
+ fallback: name,
633
+ size: "sm",
634
+ className: "size-[42px]",
635
+ indicator: isOnline ? "online" : void 0
636
+ }), /* @__PURE__ */ jsxs("div", {
637
+ className: "flex flex-1 flex-col items-start overflow-hidden",
638
+ children: [/* @__PURE__ */ jsx("span", {
639
+ className: "w-full truncate text-start text-sm font-medium text-sidebar-foreground",
640
+ children: name
641
+ }), subtitle && /* @__PURE__ */ jsx("span", {
642
+ className: "w-full truncate text-start text-xs font-light text-sidebar-foreground",
643
+ children: subtitle
644
+ })]
645
+ })]
646
+ });
647
+ }
648
+ AppSidebarAccount.displayName = "AppSidebar.Account";
649
+ markAppSidebarImplicitSlot(AppSidebarAccount, "footer");
650
+ function AppSidebarAccountSkeleton({ className }) {
651
+ return /* @__PURE__ */ jsx(SidebarAccountSkeleton, { className });
652
+ }
653
+ AppSidebarAccountSkeleton.displayName = "AppSidebar.AccountSkeleton";
654
+ markAppSidebarImplicitSlot(AppSidebarAccountSkeleton, "footer");
655
+ function AppSidebarSkeleton({ navCount = 4, chatCount = 5, logo, compactedLogo, collapsible = "icon", side, rounded = false, sidebarBgColor, className }) {
656
+ const { state, containerRef } = useSidebar();
657
+ const isCollapsed = state === "collapsed";
658
+ const resolvedSide = useResolvedAppSidebarSide({
659
+ containerRef,
660
+ explicitSide: side
661
+ });
662
+ const bgClass = getSidebarBgClass(isCollapsed, sidebarBgColor);
663
+ return /* @__PURE__ */ jsx(SidebarCompound, {
664
+ collapsible,
665
+ side: resolvedSide,
666
+ width: APP_SIDEBAR_EXPANDED_WIDTH,
667
+ collapsedWidth: APP_SIDEBAR_COLLAPSED_WIDTH,
668
+ className: cn("bg-transparent", className),
669
+ children: /* @__PURE__ */ jsxs("div", {
670
+ "data-slot": "app-sidebar-surface",
671
+ className: getSidebarSurfaceClass({
672
+ isCollapsed,
673
+ side: resolvedSide,
674
+ rounded,
675
+ backgroundClass: bgClass
676
+ }),
677
+ children: [
678
+ /* @__PURE__ */ jsx(SidebarHeader, {
679
+ className: "h-[68px] w-full p-2",
680
+ children: /* @__PURE__ */ jsx(AppSidebarLogo, {
681
+ logo,
682
+ compactedLogo
683
+ })
684
+ }),
685
+ /* @__PURE__ */ jsxs(SidebarContent, {
686
+ className: "flex w-full flex-col gap-0 overflow-hidden pt-3 group-data-[collapsible=icon]:items-center",
687
+ children: [/* @__PURE__ */ jsx(AppSidebarNavSkeleton, { count: navCount }), /* @__PURE__ */ jsx(AppSidebarChatListSkeleton, { count: chatCount })]
688
+ }),
689
+ /* @__PURE__ */ jsx(SidebarFooter, {
690
+ className: "w-full gap-0 p-0 group-data-[collapsible=icon]:items-center",
691
+ children: /* @__PURE__ */ jsx(AppSidebarAccountSkeleton, {})
692
+ })
693
+ ]
694
+ })
695
+ });
696
+ }
697
+ AppSidebarSkeleton.displayName = "AppSidebar.Skeleton";
698
+ /**
699
+ * AppSidebar is a full-featured application sidebar with navigation, chat list, and account sections.
700
+ * Supports collapsible modes with a unified logo toggle and loading skeletons.
701
+ *
702
+ * @llms Full-featured app sidebar with nav, chat list, account, collapsible modes
703
+ * @example
704
+ * ```tsx
705
+ * <AppSidebar logo={<Logo />} collapsible="icon">
706
+ * <AppSidebar.Nav>
707
+ * <AppSidebar.NavItem icon={<Home />} label="Home" isActive />
708
+ * </AppSidebar.Nav>
709
+ * <AppSidebar.ChatList>
710
+ * <AppSidebar.ChatItem title="Chat 1" />
711
+ * </AppSidebar.ChatList>
712
+ * <AppSidebar.Account name="User" subtitle="user@example.com" />
713
+ * </AppSidebar>
714
+ * ```
715
+ */
716
+ function AppSidebarRoot({ logo, compactedLogo, logoSubtext, collapsible = "icon", side, rounded = false, sidebarBgColor, className, children, dir, ...props }) {
717
+ const { state, containerRef } = useSidebar();
718
+ const isCollapsed = state === "collapsed";
719
+ const resolvedSide = useResolvedAppSidebarSide({
720
+ containerRef,
721
+ explicitDir: dir,
722
+ explicitSide: side
723
+ });
724
+ const bgClass = getSidebarBgClass(isCollapsed, sidebarBgColor);
725
+ const slots = useSlotChildren(children);
726
+ return /* @__PURE__ */ jsx(AppSidebarLayoutContext.Provider, {
727
+ value: { side: resolvedSide },
728
+ children: /* @__PURE__ */ jsx(SidebarCompound, {
729
+ collapsible,
730
+ side: resolvedSide,
731
+ width: APP_SIDEBAR_EXPANDED_WIDTH,
732
+ collapsedWidth: APP_SIDEBAR_COLLAPSED_WIDTH,
733
+ dir,
734
+ className: cn("bg-transparent", className),
735
+ ...props,
736
+ children: /* @__PURE__ */ jsxs("div", {
737
+ "data-slot": "app-sidebar-surface",
738
+ className: getSidebarSurfaceClass({
739
+ isCollapsed,
740
+ side: resolvedSide,
741
+ rounded,
742
+ backgroundClass: bgClass
743
+ }),
744
+ children: [
745
+ /* @__PURE__ */ jsx(SidebarHeader, {
746
+ className: "h-[68px] w-full p-2",
747
+ children: /* @__PURE__ */ jsx(AppSidebarLogo, {
748
+ logo,
749
+ compactedLogo,
750
+ subtext: logoSubtext
751
+ })
752
+ }),
753
+ /* @__PURE__ */ jsx(SidebarContent, {
754
+ className: "flex w-full flex-col gap-0 overflow-hidden pt-3 group-data-[collapsible=icon]:items-center",
755
+ children: slots.explicitContent ? slots.explicitContent.props.children : slots.content
756
+ }),
757
+ /* @__PURE__ */ jsx(SidebarFooter, {
758
+ className: "w-full gap-0 p-0 group-data-[collapsible=icon]:items-center",
759
+ children: slots.explicitFooter ? slots.explicitFooter.props.children : slots.footer
760
+ })
761
+ ]
762
+ })
63
763
  })
64
764
  });
65
765
  }
66
- PageBackground.displayName = "PageBackground";
766
+ AppSidebarRoot.displayName = "AppSidebar";
767
+ var AppSidebar = Object.assign(AppSidebarRoot, {
768
+ Header: AppSidebarHeader,
769
+ Content: AppSidebarContent,
770
+ Footer: AppSidebarFooter,
771
+ Nav: AppSidebarNav,
772
+ NavSection: AppSidebarNavSection,
773
+ NavItem: AppSidebarNavItem,
774
+ NavSub: AppSidebarNavSub,
775
+ NavSkeleton: AppSidebarNavSkeleton,
776
+ ChatList: AppSidebarChatList,
777
+ ChatItem: AppSidebarChatItem,
778
+ ChatListSkeleton: AppSidebarChatListSkeleton,
779
+ Account: AppSidebarAccount,
780
+ AccountSkeleton: AppSidebarAccountSkeleton,
781
+ Skeleton: AppSidebarSkeleton
782
+ });
67
783
  //#endregion
68
- export { PageBackground };
784
+ export { AppSidebar, MOBILE_BREAKPOINT, SidebarCompound as Sidebar, SidebarAccountSkeleton, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarNavSkeleton, SidebarProvider, SidebarTrigger, chatItemVariants, navItemVariants, useIsMobile, useSidebar };
69
785
 
70
786
  //# sourceMappingURL=index225.js.map