@humain/ui 2.1.63 → 2.1.65

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 (160) hide show
  1. package/dist/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
  2. package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
  3. package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
  4. package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
  5. package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
  6. package/dist/index.js +52 -52
  7. package/dist/index151.js +1 -1
  8. package/dist/index174.js +7 -339
  9. package/dist/index174.js.map +1 -1
  10. package/dist/index175.js +310 -137
  11. package/dist/index175.js.map +1 -1
  12. package/dist/index176.js +148 -174
  13. package/dist/index176.js.map +1 -1
  14. package/dist/index177.js +186 -78
  15. package/dist/index177.js.map +1 -1
  16. package/dist/index178.js +74 -124
  17. package/dist/index178.js.map +1 -1
  18. package/dist/index179.js +133 -1
  19. package/dist/index179.js.map +1 -0
  20. package/dist/index180.js +2 -201
  21. package/dist/index181.js +201 -0
  22. package/dist/{index180.js.map → index181.js.map} +1 -1
  23. package/dist/index183.js +130 -166
  24. package/dist/index183.js.map +1 -1
  25. package/dist/index184.js +195 -983
  26. package/dist/index184.js.map +1 -1
  27. package/dist/index185.js +1069 -369
  28. package/dist/index185.js.map +1 -1
  29. package/dist/index186.js +395 -197
  30. package/dist/index186.js.map +1 -1
  31. package/dist/index187.js +198 -243
  32. package/dist/index187.js.map +1 -1
  33. package/dist/index188.js +263 -3
  34. package/dist/index188.js.map +1 -1
  35. package/dist/index189.js +3 -209
  36. package/dist/index189.js.map +1 -1
  37. package/dist/index190.js +190 -777
  38. package/dist/index190.js.map +1 -1
  39. package/dist/index191.js +771 -252
  40. package/dist/index191.js.map +1 -1
  41. package/dist/index192.js +250 -65
  42. package/dist/index192.js.map +1 -1
  43. package/dist/index193.js +72 -523
  44. package/dist/index193.js.map +1 -1
  45. package/dist/index194.js +537 -144
  46. package/dist/index194.js.map +1 -1
  47. package/dist/index195.js +139 -720
  48. package/dist/index195.js.map +1 -1
  49. package/dist/index196.js +707 -167
  50. package/dist/index196.js.map +1 -1
  51. package/dist/index197.js +175 -151
  52. package/dist/index197.js.map +1 -1
  53. package/dist/index198.js +152 -487
  54. package/dist/index198.js.map +1 -1
  55. package/dist/index199.js +472 -225
  56. package/dist/index199.js.map +1 -1
  57. package/dist/index200.js +236 -260
  58. package/dist/index200.js.map +1 -1
  59. package/dist/index201.js +265 -215
  60. package/dist/index201.js.map +1 -1
  61. package/dist/index202.js +207 -307
  62. package/dist/index202.js.map +1 -1
  63. package/dist/index203.js +302 -135
  64. package/dist/index203.js.map +1 -1
  65. package/dist/index204.js +140 -271
  66. package/dist/index204.js.map +1 -1
  67. package/dist/index205.js +263 -253
  68. package/dist/index205.js.map +1 -1
  69. package/dist/index206.js +244 -137
  70. package/dist/index206.js.map +1 -1
  71. package/dist/index207.js +100 -238
  72. package/dist/index207.js.map +1 -1
  73. package/dist/index208.js +278 -74
  74. package/dist/index208.js.map +1 -1
  75. package/dist/index209.js +56 -97
  76. package/dist/index209.js.map +1 -1
  77. package/dist/index210.js +142 -47
  78. package/dist/index210.js.map +1 -1
  79. package/dist/index211.js +38 -84
  80. package/dist/index211.js.map +1 -1
  81. package/dist/index212.js +72 -252
  82. package/dist/index212.js.map +1 -1
  83. package/dist/index213.js +274 -26
  84. package/dist/index213.js.map +1 -1
  85. package/dist/index214.js +29 -94
  86. package/dist/index214.js.map +1 -1
  87. package/dist/index215.js +98 -25
  88. package/dist/index215.js.map +1 -1
  89. package/dist/index216.js +20 -565
  90. package/dist/index216.js.map +1 -1
  91. package/dist/index217.js +564 -17
  92. package/dist/index217.js.map +1 -1
  93. package/dist/index218.js +20 -23
  94. package/dist/index218.js.map +1 -1
  95. package/dist/index219.js +20 -95
  96. package/dist/index219.js.map +1 -1
  97. package/dist/index220.js +92 -88
  98. package/dist/index220.js.map +1 -1
  99. package/dist/index221.js +97 -29
  100. package/dist/index221.js.map +1 -1
  101. package/dist/index222.js +24 -470
  102. package/dist/index222.js.map +1 -1
  103. package/dist/index223.js +446 -196
  104. package/dist/index223.js.map +1 -1
  105. package/dist/index224.js +199 -729
  106. package/dist/index224.js.map +1 -1
  107. package/dist/index225.js +750 -61
  108. package/dist/index225.js.map +1 -1
  109. package/dist/index226.js +58 -181
  110. package/dist/index226.js.map +1 -1
  111. package/dist/index227.js +175 -259
  112. package/dist/index227.js.map +1 -1
  113. package/dist/index228.js +246 -172
  114. package/dist/index228.js.map +1 -1
  115. package/dist/index229.js +195 -32
  116. package/dist/index229.js.map +1 -1
  117. package/dist/index230.js +12 -40
  118. package/dist/index230.js.map +1 -1
  119. package/dist/index231.js +23 -26
  120. package/dist/index231.js.map +1 -1
  121. package/dist/index232.js +45 -22
  122. package/dist/index232.js.map +1 -1
  123. package/dist/index233.js +27 -48
  124. package/dist/index233.js.map +1 -1
  125. package/dist/index234.js +52 -26
  126. package/dist/index234.js.map +1 -1
  127. package/dist/index235.js +40 -225
  128. package/dist/index235.js.map +1 -1
  129. package/dist/index236.js +217 -39
  130. package/dist/index236.js.map +1 -1
  131. package/dist/index237.js +50 -0
  132. package/dist/index237.js.map +1 -0
  133. package/dist/styles.css +1 -1
  134. package/dist/wc/AIToolCall.js +218 -0
  135. package/dist/wc/AIToolCall.js.map +1 -0
  136. package/dist/wc/hf-ai-tool-call.js +34 -219
  137. package/dist/wc/hf-ai-tool-call.js.map +1 -1
  138. package/dist/wc/hf-ai-tool-run.js +673 -576
  139. package/dist/wc/hf-ai-tool-run.js.map +1 -1
  140. package/dist/wc/workflow-step-renderer.js +79 -78
  141. package/dist/wc/workflow-step-renderer.js.map +1 -1
  142. package/dist/wc-react/AIToolCall.js +218 -0
  143. package/dist/wc-react/AIToolCall.js.map +1 -0
  144. package/dist/wc-react/hf-ai-tool-call.js +32 -217
  145. package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
  146. package/dist/wc-react/hf-ai-tool-run.js +698 -601
  147. package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
  148. package/dist/wc-react/workflow-step-renderer.js +58 -57
  149. package/dist/wc-react/workflow-step-renderer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/skills/humain-ui/SKILL.md +1 -1
  152. package/skills/humain-ui-wc/SKILL.md +1 -1
  153. package/skills/humain-ui-wc.skill +0 -0
  154. package/skills/humain-ui.skill +0 -0
  155. package/dist/index182.js +0 -143
  156. package/dist/index182.js.map +0 -1
  157. package/dist/wc/wrench.js +0 -10
  158. package/dist/wc/wrench.js.map +0 -1
  159. package/dist/wc-react/wrench.js +0 -10
  160. package/dist/wc-react/wrench.js.map +0 -1
package/dist/index217.js CHANGED
@@ -1,27 +1,574 @@
1
+ "use client";
2
+ import { cn } from "./index2.js";
3
+ import { Button } from "./index5.js";
4
+ import { Separator } from "./index6.js";
5
+ import { Skeleton } from "./index19.js";
6
+ import { createSafeContext } from "./index21.js";
7
+ import { Input } from "./index43.js";
8
+ import { Tooltip, TooltipPopup, TooltipTrigger } from "./index122.js";
9
+ import { Sheet as SheetNamespace, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "./index215.js";
10
+ import { useIsMobile } from "./index216.js";
11
+ import { cva } from "class-variance-authority";
12
+ import { PanelLeft } from "lucide-react";
1
13
  import * as React from "react";
2
- //#region src/components/templates/AppShell/AppShellContext.ts
3
- var AppShellContext = React.createContext(null);
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ import { mergeProps } from "@base-ui/react/merge-props";
16
+ import { useRender } from "@base-ui/react/use-render";
17
+ //#region src/components/ui/sidebar.tsx
18
+ var SIDEBAR_COOKIE_NAME = "sidebar_state";
19
+ var SIDEBAR_COOKIE_MAX_AGE = 3600 * 24 * 7;
20
+ var SIDEBAR_WIDTH = "324px";
21
+ var SIDEBAR_WIDTH_MOBILE = "18rem";
22
+ var SIDEBAR_WIDTH_ICON = "108px";
23
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
24
+ var [SidebarContext, useSidebar] = createSafeContext("SidebarProvider");
25
+ function SidebarProvider({ defaultOpen = false, open: openProp, onOpenChange: setOpenProp, connected = true, loading = false, contentBgColor, className, style, children, ...props }) {
26
+ const isMobile = useIsMobile();
27
+ const [openMobile, setOpenMobile] = React.useState(false);
28
+ const wrapperRef = React.useRef(null);
29
+ const [_open, _setOpen] = React.useState(defaultOpen);
30
+ const open = openProp ?? _open;
31
+ const openRef = React.useRef(open);
32
+ openRef.current = open;
33
+ const setOpen = React.useCallback((value) => {
34
+ const openState = typeof value === "function" ? value(openRef.current) : value;
35
+ if (setOpenProp) setOpenProp(openState);
36
+ else _setOpen(openState);
37
+ const ownerDocument = wrapperRef.current?.ownerDocument;
38
+ if (ownerDocument) ownerDocument.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
39
+ }, [setOpenProp]);
40
+ const toggleSidebar = React.useCallback(() => {
41
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
42
+ }, [isMobile, setOpen]);
43
+ const containerRef = React.useRef(null);
44
+ React.useEffect(() => {
45
+ const handleKeyDown = (event) => {
46
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
47
+ event.preventDefault();
48
+ toggleSidebar();
49
+ }
50
+ };
51
+ const win = wrapperRef.current?.ownerDocument.defaultView;
52
+ if (!win) return;
53
+ win.addEventListener("keydown", handleKeyDown);
54
+ return () => win.removeEventListener("keydown", handleKeyDown);
55
+ }, [toggleSidebar]);
56
+ React.useEffect(() => {
57
+ const root = wrapperRef.current?.ownerDocument.documentElement;
58
+ if (!root) return;
59
+ root.style.setProperty("--sidebar-width", SIDEBAR_WIDTH);
60
+ root.style.setProperty("--sidebar-width-mobile", SIDEBAR_WIDTH_MOBILE);
61
+ root.style.setProperty("--sidebar-width-icon", SIDEBAR_WIDTH_ICON);
62
+ if (isMobile) {
63
+ root.style.setProperty("--sidebar-mobile", "1");
64
+ root.style.setProperty("--sidebar-width-current", SIDEBAR_WIDTH_MOBILE);
65
+ root.dataset.sidebarMobile = "true";
66
+ } else {
67
+ root.style.setProperty("--sidebar-mobile", "0");
68
+ root.style.setProperty("--sidebar-width-current", SIDEBAR_WIDTH);
69
+ root.dataset.sidebarMobile = "false";
70
+ }
71
+ return () => {
72
+ root.style.removeProperty("--sidebar-mobile");
73
+ root.style.removeProperty("--sidebar-width");
74
+ root.style.removeProperty("--sidebar-width-mobile");
75
+ root.style.removeProperty("--sidebar-width-icon");
76
+ root.style.removeProperty("--sidebar-width-current");
77
+ delete root.dataset.sidebarMobile;
78
+ };
79
+ }, [isMobile]);
80
+ const state = open ? "expanded" : "collapsed";
81
+ const contextValue = React.useMemo(() => ({
82
+ state,
83
+ open,
84
+ setOpen,
85
+ isMobile,
86
+ openMobile,
87
+ setOpenMobile,
88
+ toggleSidebar,
89
+ connected,
90
+ loading,
91
+ contentBgColor,
92
+ containerRef
93
+ }), [
94
+ state,
95
+ open,
96
+ setOpen,
97
+ isMobile,
98
+ openMobile,
99
+ toggleSidebar,
100
+ connected,
101
+ loading,
102
+ contentBgColor
103
+ ]);
104
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, {
105
+ value: contextValue,
106
+ children: /* @__PURE__ */ jsx("div", {
107
+ ref: wrapperRef,
108
+ "data-slot": "sidebar-wrapper",
109
+ style: {
110
+ "--sidebar-width": SIDEBAR_WIDTH,
111
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
112
+ ...style
113
+ },
114
+ className: cn("group/sidebar-wrapper flex w-full", connected ? "h-full" : "min-h-svh", className),
115
+ ...props,
116
+ children
117
+ })
118
+ });
119
+ }
120
+ SidebarProvider.displayName = "SidebarProvider";
4
121
  /**
5
- * Read AppShell layout context. Returns null when used outside AppShell.Root.
122
+ * Sidebar is a responsive navigation container.
123
+ * Supports mobile sheet mode, keyboard shortcuts, and persistent state via cookies.
124
+ *
125
+ * @llms Responsive sidebar with mobile sheet mode
126
+ * @example
127
+ * ```tsx
128
+ * <SidebarProvider>
129
+ * <Sidebar collapsible="icon">
130
+ * <SidebarHeader />
131
+ * <SidebarContent>...</SidebarContent>
132
+ * <SidebarFooter />
133
+ * </Sidebar>
134
+ * </SidebarProvider>
135
+ * ```
6
136
  */
7
- function useAppShell() {
8
- return React.useContext(AppShellContext);
137
+ function Sidebar({ side = "left", collapsible = "offcanvas", width = SIDEBAR_WIDTH, collapsedWidth = SIDEBAR_WIDTH_ICON, mobileWidth = SIDEBAR_WIDTH_MOBILE, offsetTop = "0px", offsetBottom = "0px", rounded = false, className, style, children, ...props }) {
138
+ const { isMobile, state, openMobile, setOpenMobile, connected, containerRef } = useSidebar();
139
+ const roundedClass = React.useMemo(() => {
140
+ if (!rounded) return "";
141
+ return side === "left" ? "rounded-r-(--sidebar-radius,0.5rem)" : "rounded-l-(--sidebar-radius,0.5rem)";
142
+ }, [rounded, side]);
143
+ if (connected) return /* @__PURE__ */ jsx("div", {
144
+ ref: containerRef,
145
+ "data-slot": "sidebar",
146
+ "data-state": state,
147
+ "data-collapsible": state === "collapsed" ? collapsible : "",
148
+ "data-connected": "true",
149
+ className: cn("group text-sidebar-foreground flex h-full w-full flex-col overflow-hidden", className),
150
+ style: {
151
+ "--sidebar-width": width,
152
+ "--sidebar-width-icon": collapsedWidth,
153
+ ...style
154
+ },
155
+ ...props,
156
+ children
157
+ });
158
+ if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
159
+ "data-slot": "sidebar",
160
+ className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className),
161
+ ...props,
162
+ children
163
+ });
164
+ if (isMobile) return /* @__PURE__ */ jsx(SheetNamespace, {
165
+ open: openMobile,
166
+ onOpenChange: setOpenMobile,
167
+ ...props,
168
+ children: /* @__PURE__ */ jsxs(SheetContent, {
169
+ "data-sidebar": "sidebar",
170
+ "data-slot": "sidebar",
171
+ "data-mobile": "true",
172
+ className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
173
+ style: { "--sidebar-width": mobileWidth },
174
+ side,
175
+ children: [/* @__PURE__ */ jsxs(SheetHeader, {
176
+ className: "sr-only",
177
+ children: [/* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }), /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })]
178
+ }), /* @__PURE__ */ jsx("div", {
179
+ className: "flex h-full w-full flex-col",
180
+ children
181
+ })]
182
+ })
183
+ });
184
+ return /* @__PURE__ */ jsxs("div", {
185
+ className: "group peer text-sidebar-foreground hidden md:block",
186
+ "data-state": state,
187
+ "data-collapsible": state === "collapsed" ? collapsible : "",
188
+ "data-side": side,
189
+ "data-slot": "sidebar",
190
+ children: [/* @__PURE__ */ jsx("div", {
191
+ "data-slot": "sidebar-gap-container",
192
+ className: cn("grid transition-[grid-template-columns] duration-200 ease-linear motion-reduce:transition-none", "grid-cols-[var(--sidebar-width)]", "group-data-[collapsible=offcanvas]:grid-cols-[0fr]", "group-data-[side=right]:rotate-180", "group-data-[collapsible=icon]:grid-cols-[var(--sidebar-width-icon)]"),
193
+ children: /* @__PURE__ */ jsx("div", {
194
+ "data-slot": "sidebar-gap",
195
+ className: "overflow-hidden bg-transparent"
196
+ })
197
+ }), /* @__PURE__ */ jsx("div", {
198
+ ref: containerRef,
199
+ "data-slot": "sidebar-container",
200
+ style: {
201
+ "--sidebar-width": width,
202
+ "--sidebar-width-icon": collapsedWidth,
203
+ "--sidebar-offset-top": offsetTop,
204
+ "--sidebar-offset-bottom": offsetBottom,
205
+ ...style
206
+ },
207
+ className: cn("fixed z-10 hidden transition-[left,right,width,height,top,bottom] duration-200 ease-linear will-change-[width,transform] motion-reduce:transition-none md:flex", "w-(--sidebar-width)", "top-[var(--sidebar-offset-top)] bottom-[var(--sidebar-offset-bottom)] h-[calc(100svh-var(--sidebar-offset-top)-var(--sidebar-offset-bottom))]", 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)]", "group-data-[collapsible=icon]:w-(--sidebar-width-icon)", className),
208
+ ...props,
209
+ children: /* @__PURE__ */ jsx("div", {
210
+ "data-sidebar": "sidebar",
211
+ "data-slot": "sidebar-inner",
212
+ className: cn("flex size-full flex-col", roundedClass),
213
+ children
214
+ })
215
+ })]
216
+ });
217
+ }
218
+ Sidebar.displayName = "Sidebar";
219
+ function SidebarTrigger({ className, onClick, ...props }) {
220
+ const { toggleSidebar, open } = useSidebar();
221
+ return /* @__PURE__ */ jsxs(Button, {
222
+ "data-sidebar": "trigger",
223
+ "data-slot": "sidebar-trigger",
224
+ appearance: "ghost",
225
+ variant: "secondary",
226
+ size: "icon-sm",
227
+ "aria-label": "Toggle sidebar",
228
+ "aria-expanded": open,
229
+ className: cn(className),
230
+ onClick: (event) => {
231
+ onClick?.(event);
232
+ toggleSidebar();
233
+ },
234
+ ...props,
235
+ children: [/* @__PURE__ */ jsx(PanelLeft, { "aria-hidden": "true" }), /* @__PURE__ */ jsx("span", {
236
+ className: "sr-only",
237
+ children: "Toggle Sidebar"
238
+ })]
239
+ });
240
+ }
241
+ SidebarTrigger.displayName = "SidebarTrigger";
242
+ function SidebarRail({ className, ...props }) {
243
+ const { toggleSidebar } = useSidebar();
244
+ return /* @__PURE__ */ jsx("button", {
245
+ "data-sidebar": "rail",
246
+ "data-slot": "sidebar-rail",
247
+ "aria-label": "Toggle Sidebar",
248
+ tabIndex: -1,
249
+ onClick: toggleSidebar,
250
+ title: "Toggle Sidebar",
251
+ className: cn("hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear motion-reduce:transition-none group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className),
252
+ ...props
253
+ });
254
+ }
255
+ SidebarRail.displayName = "SidebarRail";
256
+ function SidebarInset({ className, connected: connectedProp, contentBgColor: contentBgColorProp, ...props }) {
257
+ const context = React.useContext(SidebarContext);
258
+ const connected = connectedProp ?? context?.connected ?? false;
259
+ const isMobile = context?.isMobile ?? false;
260
+ const bgColor = contentBgColorProp ?? context?.contentBgColor ?? "bg-background";
261
+ if (connected) return /* @__PURE__ */ jsx("main", {
262
+ "data-slot": "sidebar-inset",
263
+ "data-connected": "true",
264
+ "data-mobile": isMobile ? "true" : "false",
265
+ className: cn("relative flex h-full w-full flex-1 flex-col overflow-hidden", bgColor, isMobile && "p-0", className),
266
+ ...props
267
+ });
268
+ return /* @__PURE__ */ jsx("main", {
269
+ "data-slot": "sidebar-inset",
270
+ "data-mobile": isMobile ? "true" : "false",
271
+ className: cn(bgColor, "relative flex w-full flex-1 flex-col", className),
272
+ ...props
273
+ });
274
+ }
275
+ SidebarInset.displayName = "SidebarInset";
276
+ function SidebarInput({ className, ...props }) {
277
+ return /* @__PURE__ */ jsx(Input, {
278
+ "data-slot": "sidebar-input",
279
+ "data-sidebar": "input",
280
+ className: cn("bg-background h-8 w-full shadow-none", className),
281
+ ...props
282
+ });
283
+ }
284
+ SidebarInput.displayName = "SidebarInput";
285
+ function SidebarHeader({ className, ...props }) {
286
+ return /* @__PURE__ */ jsx("div", {
287
+ "data-slot": "sidebar-header",
288
+ "data-sidebar": "header",
289
+ className: cn("gap-[var(--sidebar-gap,0.5rem)] p-[var(--sidebar-padding-inner,0.5rem)] flex shrink-0 flex-col", className),
290
+ ...props
291
+ });
292
+ }
293
+ SidebarHeader.displayName = "SidebarHeader";
294
+ function SidebarFooter({ className, ...props }) {
295
+ return /* @__PURE__ */ jsx("div", {
296
+ "data-slot": "sidebar-footer",
297
+ "data-sidebar": "footer",
298
+ className: cn("gap-[var(--sidebar-gap,0.5rem)] p-[var(--sidebar-padding-inner,0.5rem)] flex shrink-0 flex-col", className),
299
+ ...props
300
+ });
301
+ }
302
+ SidebarFooter.displayName = "SidebarFooter";
303
+ function SidebarSeparator({ className, ...props }) {
304
+ return /* @__PURE__ */ jsx(Separator, {
305
+ "data-slot": "sidebar-separator",
306
+ "data-sidebar": "separator",
307
+ className: cn("bg-sidebar-border mx-2 w-auto", className),
308
+ ...props
309
+ });
310
+ }
311
+ SidebarSeparator.displayName = "SidebarSeparator";
312
+ function SidebarContent({ className, ...props }) {
313
+ return /* @__PURE__ */ jsx("div", {
314
+ "data-slot": "sidebar-content",
315
+ "data-sidebar": "content",
316
+ className: cn("no-scrollbar gap-[var(--sidebar-gap,0.5rem)] flex min-h-0 flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden", className),
317
+ ...props
318
+ });
319
+ }
320
+ SidebarContent.displayName = "SidebarContent";
321
+ function SidebarGroup({ className, ...props }) {
322
+ return /* @__PURE__ */ jsx("div", {
323
+ "data-slot": "sidebar-group",
324
+ "data-sidebar": "group",
325
+ className: cn("p-[var(--sidebar-padding-inner,0.5rem)] relative flex w-full min-w-0 flex-col", className),
326
+ ...props
327
+ });
328
+ }
329
+ SidebarGroup.displayName = "SidebarGroup";
330
+ function SidebarGroupLabel({ className, render, ...props }) {
331
+ return useRender({
332
+ defaultTagName: "div",
333
+ props: mergeProps({ className: cn("text-sidebar-foreground/80 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium transition-[transform,opacity] duration-200 ease-linear motion-reduce:transition-none group-data-[collapsible=icon]:-translate-y-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0", className) }, props),
334
+ render,
335
+ state: {
336
+ slot: "sidebar-group-label",
337
+ sidebar: "group-label"
338
+ }
339
+ });
340
+ }
341
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
342
+ function SidebarGroupAction({ className, render, ...props }) {
343
+ return useRender({
344
+ defaultTagName: "button",
345
+ props: mergeProps({ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 end-3 w-5 rounded-md p-0 focus-visible:ring-2 [&>svg]:size-4 flex aspect-square items-center justify-center outline-hidden transition-transform motion-reduce:transition-none [&>svg]:shrink-0 after:absolute after:-inset-2 group-data-[collapsible=icon]:hidden", className) }, props),
346
+ render,
347
+ state: {
348
+ slot: "sidebar-group-action",
349
+ sidebar: "group-action"
350
+ }
351
+ });
352
+ }
353
+ SidebarGroupAction.displayName = "SidebarGroupAction";
354
+ function SidebarGroupContent({ className, ...props }) {
355
+ return /* @__PURE__ */ jsx("div", {
356
+ "data-slot": "sidebar-group-content",
357
+ "data-sidebar": "group-content",
358
+ className: cn("text-sm w-full", className),
359
+ ...props
360
+ });
9
361
  }
10
- var AppShellProvider = AppShellContext.Provider;
362
+ SidebarGroupContent.displayName = "SidebarGroupContent";
363
+ function SidebarMenu({ className, ...props }) {
364
+ return /* @__PURE__ */ jsx("ul", {
365
+ "data-slot": "sidebar-menu",
366
+ "data-sidebar": "menu",
367
+ className: cn("gap-[var(--sidebar-gap,0.5rem)] flex w-full min-w-0 flex-col", className),
368
+ ...props
369
+ });
370
+ }
371
+ SidebarMenu.displayName = "SidebarMenu";
372
+ function SidebarMenuItem({ className, ...props }) {
373
+ return /* @__PURE__ */ jsx("li", {
374
+ "data-slot": "sidebar-menu-item",
375
+ "data-sidebar": "menu-item",
376
+ className: cn("group/menu-item relative", className),
377
+ ...props
378
+ });
379
+ }
380
+ SidebarMenuItem.displayName = "SidebarMenuItem";
381
+ var sidebarMenuButtonVariants = cva("ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-left text-sm transition-[width,height,padding] motion-reduce:transition-none group-has-data-[sidebar=menu-action]/menu-item:pe-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 data-active:font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button 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", {
382
+ variants: {
383
+ variant: {
384
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
385
+ outline: "bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_var(--sidebar-border)] hover:shadow-[0_0_0_1px_var(--sidebar-accent)]"
386
+ },
387
+ size: {
388
+ default: "min-h-11 text-sm",
389
+ sm: "min-h-8 text-xs",
390
+ lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!"
391
+ }
392
+ },
393
+ defaultVariants: {
394
+ variant: "default",
395
+ size: "default"
396
+ }
397
+ });
398
+ function SidebarMenuButton({ render, isActive = false, variant = "default", size = "default", tooltip, className, ...props }) {
399
+ const { isMobile, state } = useSidebar();
400
+ const comp = useRender({
401
+ defaultTagName: "button",
402
+ props: mergeProps({ className: cn(sidebarMenuButtonVariants({
403
+ variant,
404
+ size
405
+ }), className) }, props),
406
+ render: !tooltip ? render : TooltipTrigger,
407
+ state: {
408
+ slot: "sidebar-menu-button",
409
+ sidebar: "menu-button",
410
+ size,
411
+ active: isActive
412
+ }
413
+ });
414
+ if (!tooltip) return comp;
415
+ if (typeof tooltip === "string") tooltip = { children: tooltip };
416
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [comp, /* @__PURE__ */ jsx(TooltipPopup, {
417
+ side: "right",
418
+ align: "center",
419
+ hidden: state !== "collapsed" || isMobile,
420
+ ...tooltip
421
+ })] });
422
+ }
423
+ SidebarMenuButton.displayName = "SidebarMenuButton";
424
+ function SidebarMenuAction({ className, render, showOnHover = false, ...props }) {
425
+ return useRender({
426
+ defaultTagName: "button",
427
+ props: mergeProps({ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 aspect-square w-5 rounded-md p-0 peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 focus-visible:ring-2 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform motion-reduce:transition-none group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 [&>svg]:shrink-0", showOnHover && "peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-open:opacity-100 md:opacity-0", className) }, props),
428
+ render,
429
+ state: {
430
+ slot: "sidebar-menu-action",
431
+ sidebar: "menu-action"
432
+ }
433
+ });
434
+ }
435
+ SidebarMenuAction.displayName = "SidebarMenuAction";
436
+ function SidebarMenuBadge({ className, ...props }) {
437
+ return /* @__PURE__ */ jsx("div", {
438
+ "data-slot": "sidebar-menu-badge",
439
+ "data-sidebar": "menu-badge",
440
+ className: cn("text-sidebar-foreground peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-accent-foreground pointer-events-none absolute end-1 flex h-5 min-w-5 rounded-md px-1 text-xs font-medium peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 flex items-center justify-center tabular-nums select-none group-data-[collapsible=icon]:hidden", className),
441
+ ...props
442
+ });
443
+ }
444
+ SidebarMenuBadge.displayName = "SidebarMenuBadge";
445
+ function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
446
+ const width = showIcon ? "72%" : "64%";
447
+ return /* @__PURE__ */ jsxs("div", {
448
+ "data-slot": "sidebar-menu-skeleton",
449
+ "data-sidebar": "menu-skeleton",
450
+ className: cn("h-8 gap-2 rounded-md px-2 flex items-center", className),
451
+ ...props,
452
+ children: [showIcon && /* @__PURE__ */ jsx(Skeleton, {
453
+ className: "size-4 rounded-md",
454
+ "data-sidebar": "menu-skeleton-icon"
455
+ }), /* @__PURE__ */ jsx(Skeleton, {
456
+ className: "h-4 max-w-(--skeleton-width) flex-1",
457
+ "data-sidebar": "menu-skeleton-text",
458
+ style: { "--skeleton-width": width }
459
+ })]
460
+ });
461
+ }
462
+ SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
463
+ function SidebarNavSkeleton({ className, ...props }) {
464
+ return /* @__PURE__ */ jsxs("div", {
465
+ "data-slot": "sidebar-nav-skeleton",
466
+ "data-sidebar": "nav-skeleton",
467
+ className: cn("flex h-10 w-full items-center gap-3 rounded-md px-3 py-2", "group-data-[collapsible=icon]:h-11 group-data-[collapsible=icon]:w-[76px] group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0 group-data-[collapsible=icon]:py-3", className),
468
+ ...props,
469
+ children: [/* @__PURE__ */ jsx(Skeleton, { className: "size-5 shrink-0 rounded" }), /* @__PURE__ */ jsx(Skeleton, { className: "h-4 flex-1 group-data-[collapsible=icon]:hidden" })]
470
+ });
471
+ }
472
+ SidebarNavSkeleton.displayName = "SidebarNavSkeleton";
473
+ function SidebarAccountSkeleton({ className, ...props }) {
474
+ return /* @__PURE__ */ jsxs("div", {
475
+ "data-slot": "sidebar-account-skeleton",
476
+ "data-sidebar": "account-skeleton",
477
+ className: cn("flex w-full items-center gap-2 rounded-md p-2", className),
478
+ ...props,
479
+ children: [/* @__PURE__ */ jsx(Skeleton, { className: "size-8 shrink-0 rounded-lg" }), /* @__PURE__ */ jsxs("div", {
480
+ className: "flex flex-1 flex-col gap-1 group-data-[collapsible=icon]:hidden",
481
+ children: [/* @__PURE__ */ jsx(Skeleton, { className: "h-3.5 w-20" }), /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-16" })]
482
+ })]
483
+ });
484
+ }
485
+ SidebarAccountSkeleton.displayName = "SidebarAccountSkeleton";
486
+ function SidebarMenuSub({ className, ...props }) {
487
+ return /* @__PURE__ */ jsx("ul", {
488
+ "data-slot": "sidebar-menu-sub",
489
+ "data-sidebar": "menu-sub",
490
+ className: cn("border-sidebar-border mx-3.5 translate-x-px gap-[var(--sidebar-gap,0.5rem)] border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col", className),
491
+ ...props
492
+ });
493
+ }
494
+ SidebarMenuSub.displayName = "SidebarMenuSub";
495
+ function SidebarMenuSubItem({ className, ...props }) {
496
+ return /* @__PURE__ */ jsx("li", {
497
+ "data-slot": "sidebar-menu-sub-item",
498
+ "data-sidebar": "menu-sub-item",
499
+ className: cn("group/menu-sub-item relative", className),
500
+ ...props
501
+ });
502
+ }
503
+ SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
504
+ function SidebarMenuSubButton({ render, size = "md", isActive = false, className, ...props }) {
505
+ return useRender({
506
+ defaultTagName: "a",
507
+ props: mergeProps({ className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground min-h-9 gap-2 rounded-md px-2 focus-visible:ring-2 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0", className) }, props),
508
+ render,
509
+ state: {
510
+ slot: "sidebar-menu-sub-button",
511
+ sidebar: "menu-sub-button",
512
+ size,
513
+ active: isActive
514
+ }
515
+ });
516
+ }
517
+ SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
11
518
  /**
12
- * Internal context for passing the panel index from Panel to Content.
13
- * Content reads this to determine its position in connected mode.
519
+ * Sidebar compound component with dot notation access to all parts.
520
+ *
521
+ * Usage:
522
+ * - `Sidebar.Root` - Main sidebar container (alias for Sidebar)
523
+ * - `Sidebar.Header` - Header section
524
+ * - `Sidebar.Content` - Scrollable content area
525
+ * - `Sidebar.Footer` - Footer section
526
+ * - `Sidebar.Group` - Group container for menu items
527
+ * - `Sidebar.GroupLabel` - Label for a group
528
+ * - `Sidebar.GroupContent` - Content within a group
529
+ * - `Sidebar.GroupAction` - Action button for a group
530
+ * - `Sidebar.Menu` - Menu container
531
+ * - `Sidebar.MenuItem` - Menu item wrapper
532
+ * - `Sidebar.MenuButton` - Clickable menu button
533
+ * - `Sidebar.MenuAction` - Action within a menu item
534
+ * - `Sidebar.MenuBadge` - Badge within a menu item
535
+ * - `Sidebar.MenuSkeleton` - Loading skeleton for menu
536
+ * - `Sidebar.MenuSub` - Submenu container
537
+ * - `Sidebar.MenuSubItem` - Submenu item
538
+ * - `Sidebar.MenuSubButton` - Submenu button
539
+ * - `Sidebar.Input` - Input within sidebar
540
+ * - `Sidebar.Separator` - Visual separator
541
+ * - `Sidebar.Rail` - Resize/toggle rail
542
+ * - `Sidebar.Inset` - Main content inset area
543
+ * - `Sidebar.Trigger` - Toggle button
14
544
  */
15
- var PanelIndexContext = React.createContext(0);
16
- var PanelLayoutContext = React.createContext({
17
- visible: true,
18
- isMobile: false
545
+ var SidebarCompound = Object.assign(Sidebar, {
546
+ Root: Sidebar,
547
+ Header: SidebarHeader,
548
+ Content: SidebarContent,
549
+ Footer: SidebarFooter,
550
+ Group: SidebarGroup,
551
+ GroupLabel: SidebarGroupLabel,
552
+ GroupContent: SidebarGroupContent,
553
+ GroupAction: SidebarGroupAction,
554
+ Menu: SidebarMenu,
555
+ MenuItem: SidebarMenuItem,
556
+ MenuButton: SidebarMenuButton,
557
+ MenuAction: SidebarMenuAction,
558
+ MenuBadge: SidebarMenuBadge,
559
+ MenuSkeleton: SidebarMenuSkeleton,
560
+ MenuSub: SidebarMenuSub,
561
+ MenuSubItem: SidebarMenuSubItem,
562
+ MenuSubButton: SidebarMenuSubButton,
563
+ Input: SidebarInput,
564
+ Separator: SidebarSeparator,
565
+ Rail: SidebarRail,
566
+ Inset: SidebarInset,
567
+ Trigger: SidebarTrigger,
568
+ NavSkeleton: SidebarNavSkeleton,
569
+ AccountSkeleton: SidebarAccountSkeleton
19
570
  });
20
- var PanelExpansionContext = React.createContext(null);
21
- function usePanelExpansion() {
22
- return React.useContext(PanelExpansionContext);
23
- }
24
571
  //#endregion
25
- export { AppShellContext, AppShellProvider, PanelExpansionContext, PanelIndexContext, PanelLayoutContext, useAppShell, usePanelExpansion };
572
+ export { SidebarCompound as Sidebar, SidebarAccountSkeleton, SidebarContent, SidebarContext, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarNavSkeleton, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar };
26
573
 
27
574
  //# sourceMappingURL=index217.js.map