@snksergio/design-system 0.40.0 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/chunks/{avatar-DQYiVRlE.mjs → avatar-DFWEwBKu.mjs} +101 -51
- package/dist-lib/chunks/avatar-DFWEwBKu.mjs.map +1 -0
- package/dist-lib/chunks/{avatar-BiaG9OJS.cjs → avatar-eM5txRFZ.cjs} +53 -1
- package/dist-lib/chunks/avatar-eM5txRFZ.cjs.map +1 -0
- package/dist-lib/chunks/{input-CaC0B-_v.mjs → input-CfmzMYtd.mjs} +2 -2
- package/dist-lib/chunks/{input-CaC0B-_v.mjs.map → input-CfmzMYtd.mjs.map} +1 -1
- package/dist-lib/chunks/{input-DMH5rSP1.cjs → input-az2SuVXQ.cjs} +2 -2
- package/dist-lib/chunks/{input-DMH5rSP1.cjs.map → input-az2SuVXQ.cjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-NnEu4oIs.cjs → kpi-delta-DAfakvFp.cjs} +3 -3
- package/dist-lib/chunks/{kpi-delta-NnEu4oIs.cjs.map → kpi-delta-DAfakvFp.cjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-CjR0OsdC.mjs → kpi-delta-DaDwKOaP.mjs} +3 -3
- package/dist-lib/chunks/{kpi-delta-CjR0OsdC.mjs.map → kpi-delta-DaDwKOaP.mjs.map} +1 -1
- package/dist-lib/chunks/{page-header-DEGbgT4w.mjs → page-header--cPS_Z-a.mjs} +2 -2
- package/dist-lib/chunks/{page-header-DEGbgT4w.mjs.map → page-header--cPS_Z-a.mjs.map} +1 -1
- package/dist-lib/chunks/{page-header-Cp_9Wog4.cjs → page-header-DvAJoEfb.cjs} +2 -2
- package/dist-lib/chunks/{page-header-Cp_9Wog4.cjs.map → page-header-DvAJoEfb.cjs.map} +1 -1
- package/dist-lib/chunks/{panel-B1xKDbjB.mjs → panel-Bje0kUTh.mjs} +5 -5
- package/dist-lib/chunks/{panel-B1xKDbjB.mjs.map → panel-Bje0kUTh.mjs.map} +1 -1
- package/dist-lib/chunks/{panel-ma7e3s4C.cjs → panel-DtU3KlKY.cjs} +5 -5
- package/dist-lib/chunks/{panel-ma7e3s4C.cjs.map → panel-DtU3KlKY.cjs.map} +1 -1
- package/dist-lib/chunks/{textarea-DivoQmJw.mjs → textarea-BPRIHZVd.mjs} +2 -2
- package/dist-lib/chunks/{textarea-DivoQmJw.mjs.map → textarea-BPRIHZVd.mjs.map} +1 -1
- package/dist-lib/chunks/{textarea-c80RFmMP.cjs → textarea-K20CL_gF.cjs} +2 -2
- package/dist-lib/chunks/{textarea-c80RFmMP.cjs.map → textarea-K20CL_gF.cjs.map} +1 -1
- package/dist-lib/chunks/{tooltip-pvZ_X-Ub.cjs → toggle-group-BEPs3e0Y.cjs} +2 -54
- package/dist-lib/chunks/toggle-group-BEPs3e0Y.cjs.map +1 -0
- package/dist-lib/chunks/{tooltip-mMF4YHZg.mjs → toggle-group-XMO6ReVo.mjs} +77 -127
- package/dist-lib/chunks/toggle-group-XMO6ReVo.mjs.map +1 -0
- package/dist-lib/chunks/{useTheme-BD0nloAv.cjs → useTheme-3iZAognE.cjs} +876 -73
- package/dist-lib/chunks/useTheme-3iZAognE.cjs.map +1 -0
- package/dist-lib/chunks/{useTheme-D1QVzZDW.mjs → useTheme-B3ZakPqk.mjs} +886 -83
- package/dist-lib/chunks/useTheme-B3ZakPqk.mjs.map +1 -0
- package/dist-lib/index.cjs +40 -732
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.mjs +94 -786
- package/dist-lib/index.mjs.map +1 -1
- package/dist-lib/preview/chat.cjs +3 -3
- package/dist-lib/preview/chat.mjs +3 -3
- package/dist-lib/preview/clientes.cjs +6 -6
- package/dist-lib/preview/clientes.mjs +6 -6
- package/dist-lib/preview/dashboard.cjs +4 -4
- package/dist-lib/preview/dashboard.mjs +4 -4
- package/dist-lib/shadcn.cjs +112 -112
- package/dist-lib/shadcn.mjs +136 -136
- package/dist-lib/src/components/ui/AppShell/app-shell.d.ts +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.d.ts.map +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.styles.d.ts +45 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.styles.d.ts.map +1 -1
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +106 -3
- package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts.map +1 -1
- package/dist-lib/src/components/ui/MenuSidebar/index.d.ts +2 -2
- package/dist-lib/src/components/ui/MenuSidebar/index.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/category.d.ts +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/category.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/menu-item.d.ts +25 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/menu-item.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.d.ts +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.types.d.ts +57 -2
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.types.d.ts.map +1 -1
- package/dist-lib/src/utils/nav-link.d.ts.map +1 -0
- package/package.json +207 -207
- package/dist-lib/chunks/avatar-BiaG9OJS.cjs.map +0 -1
- package/dist-lib/chunks/avatar-DQYiVRlE.mjs.map +0 -1
- package/dist-lib/chunks/tooltip-mMF4YHZg.mjs.map +0 -1
- package/dist-lib/chunks/tooltip-pvZ_X-Ub.cjs.map +0 -1
- package/dist-lib/chunks/useTheme-BD0nloAv.cjs.map +0 -1
- package/dist-lib/chunks/useTheme-D1QVzZDW.mjs.map +0 -1
- package/dist-lib/src/components/ui/MenuSidebar/nav-link.d.ts.map +0 -1
- /package/dist-lib/src/{components/ui/MenuSidebar → utils}/nav-link.d.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const jsxRuntime = require("react/jsx-runtime");
|
|
3
3
|
const React = require("react");
|
|
4
|
-
const avatar = require("./avatar-
|
|
4
|
+
const avatar = require("./avatar-eM5txRFZ.cjs");
|
|
5
5
|
const lucideReact = require("lucide-react");
|
|
6
6
|
const ToggleGroupPrimitive = require("@radix-ui/react-toggle-group");
|
|
7
7
|
function _interopNamespaceDefault(e) {
|
|
@@ -1204,7 +1204,7 @@ function Header({
|
|
|
1204
1204
|
] })
|
|
1205
1205
|
] });
|
|
1206
1206
|
}
|
|
1207
|
-
const sidebarRoot = avatar.tv({
|
|
1207
|
+
const sidebarRoot$1 = avatar.tv({
|
|
1208
1208
|
base: "relative flex h-screen w-fit bg-bg-sidebar text-fg-default font-sans",
|
|
1209
1209
|
variants: {
|
|
1210
1210
|
mobile: {
|
|
@@ -2187,7 +2187,7 @@ function MenuSidebar({
|
|
|
2187
2187
|
"div",
|
|
2188
2188
|
{
|
|
2189
2189
|
className: avatar.cn(
|
|
2190
|
-
sidebarRoot({ mobile: isMobile, mobileOpen: isMobile && openMobile }),
|
|
2190
|
+
sidebarRoot$1({ mobile: isMobile, mobileOpen: isMobile && openMobile }),
|
|
2191
2191
|
className
|
|
2192
2192
|
),
|
|
2193
2193
|
onMouseEnter: () => {
|
|
@@ -2258,6 +2258,752 @@ function MenuSidebar({
|
|
|
2258
2258
|
)
|
|
2259
2259
|
] });
|
|
2260
2260
|
}
|
|
2261
|
+
const SingleMenuSidebarContext = React.createContext({
|
|
2262
|
+
expanded: true,
|
|
2263
|
+
isHoverExpand: false,
|
|
2264
|
+
toggle: () => {
|
|
2265
|
+
},
|
|
2266
|
+
openCategoryId: null,
|
|
2267
|
+
setOpenCategoryId: () => {
|
|
2268
|
+
}
|
|
2269
|
+
});
|
|
2270
|
+
function useSingleMenuSidebar() {
|
|
2271
|
+
return React.useContext(SingleMenuSidebarContext);
|
|
2272
|
+
}
|
|
2273
|
+
function useSingleMenuSidebarState(defaultExpanded, controlledExpanded, onExpandedChange) {
|
|
2274
|
+
const [internal, setInternal] = React.useState(defaultExpanded);
|
|
2275
|
+
const isControlled = controlledExpanded !== void 0;
|
|
2276
|
+
const expanded = isControlled ? controlledExpanded : internal;
|
|
2277
|
+
const [lockedOpen, setLockedOpen] = React.useState(defaultExpanded);
|
|
2278
|
+
const [hoverOpen, setHoverOpen] = React.useState(false);
|
|
2279
|
+
const hoverTimeoutRef = React.useRef(null);
|
|
2280
|
+
const suppressHoverRef = React.useRef(false);
|
|
2281
|
+
const suppressTimerRef = React.useRef(null);
|
|
2282
|
+
const setExpanded = React.useCallback(
|
|
2283
|
+
(v) => {
|
|
2284
|
+
if (!isControlled) setInternal(v);
|
|
2285
|
+
onExpandedChange?.(v);
|
|
2286
|
+
},
|
|
2287
|
+
[isControlled, onExpandedChange]
|
|
2288
|
+
);
|
|
2289
|
+
const toggle = React.useCallback(() => {
|
|
2290
|
+
const next = !lockedOpen;
|
|
2291
|
+
setLockedOpen(next);
|
|
2292
|
+
setHoverOpen(false);
|
|
2293
|
+
if (!next) {
|
|
2294
|
+
suppressHoverRef.current = true;
|
|
2295
|
+
if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);
|
|
2296
|
+
suppressTimerRef.current = setTimeout(() => {
|
|
2297
|
+
suppressHoverRef.current = false;
|
|
2298
|
+
}, 500);
|
|
2299
|
+
}
|
|
2300
|
+
setExpanded(next);
|
|
2301
|
+
}, [lockedOpen, setExpanded]);
|
|
2302
|
+
const onMouseEnter = React.useCallback(() => {
|
|
2303
|
+
if (lockedOpen) return;
|
|
2304
|
+
if (suppressHoverRef.current) return;
|
|
2305
|
+
if (hoverTimeoutRef.current) {
|
|
2306
|
+
clearTimeout(hoverTimeoutRef.current);
|
|
2307
|
+
hoverTimeoutRef.current = null;
|
|
2308
|
+
}
|
|
2309
|
+
setHoverOpen(true);
|
|
2310
|
+
setExpanded(true);
|
|
2311
|
+
}, [lockedOpen, setExpanded]);
|
|
2312
|
+
const onMouseLeave = React.useCallback(() => {
|
|
2313
|
+
if (lockedOpen) return;
|
|
2314
|
+
hoverTimeoutRef.current = setTimeout(() => {
|
|
2315
|
+
setHoverOpen(false);
|
|
2316
|
+
setExpanded(false);
|
|
2317
|
+
}, 200);
|
|
2318
|
+
}, [lockedOpen, setExpanded]);
|
|
2319
|
+
React.useEffect(() => {
|
|
2320
|
+
return () => {
|
|
2321
|
+
if (hoverTimeoutRef.current) clearTimeout(hoverTimeoutRef.current);
|
|
2322
|
+
if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);
|
|
2323
|
+
};
|
|
2324
|
+
}, []);
|
|
2325
|
+
const isHoverExpand = hoverOpen && !lockedOpen;
|
|
2326
|
+
const [openCategoryId, setOpenCategoryId] = React.useState(null);
|
|
2327
|
+
return {
|
|
2328
|
+
expanded,
|
|
2329
|
+
isHoverExpand,
|
|
2330
|
+
toggle,
|
|
2331
|
+
onMouseEnter,
|
|
2332
|
+
onMouseLeave,
|
|
2333
|
+
openCategoryId,
|
|
2334
|
+
setOpenCategoryId
|
|
2335
|
+
};
|
|
2336
|
+
}
|
|
2337
|
+
const sidebarRoot = avatar.tv({
|
|
2338
|
+
base: [
|
|
2339
|
+
"relative flex h-full flex-col overflow-x-hidden",
|
|
2340
|
+
"border-r border-border-sidebar bg-bg-sidebar",
|
|
2341
|
+
"transition-[width] duration-300 ease-in-out"
|
|
2342
|
+
],
|
|
2343
|
+
variants: {
|
|
2344
|
+
// Mobile (< md): expandida = 100% da largura; recolhida = SOME (hidden).
|
|
2345
|
+
// Desktop (md+): largura fixa, expandida (280px) ou recolhida (rail 80px).
|
|
2346
|
+
expanded: {
|
|
2347
|
+
true: "w-full md:w-[280px]",
|
|
2348
|
+
false: "hidden md:flex md:w-20"
|
|
2349
|
+
}
|
|
2350
|
+
},
|
|
2351
|
+
defaultVariants: {
|
|
2352
|
+
expanded: true
|
|
2353
|
+
}
|
|
2354
|
+
});
|
|
2355
|
+
const category = avatar.tv({
|
|
2356
|
+
slots: {
|
|
2357
|
+
root: "flex items-center rounded-radius-lg cursor-pointer transition-all",
|
|
2358
|
+
text: "flex-1 text-left text-body-sm whitespace-nowrap overflow-hidden text-ellipsis",
|
|
2359
|
+
// SVG do consumidor (ícone bare do lucide vem 24px) dimensionado no slot → 18px
|
|
2360
|
+
icon: "grid size-[18px] shrink-0 place-items-center [&>svg]:size-[18px]",
|
|
2361
|
+
chevron: "size-icon-sm shrink-0 transition-transform"
|
|
2362
|
+
},
|
|
2363
|
+
variants: {
|
|
2364
|
+
// selected = folha ativa OU pai que contém o item ativo → card cheio
|
|
2365
|
+
// default = nada marcado (inclui pai apenas aberto, sem filho ativo)
|
|
2366
|
+
state: {
|
|
2367
|
+
selected: {
|
|
2368
|
+
root: "bg-bg-sidebar-accent shadow-sh-sm",
|
|
2369
|
+
text: "font-bold text-fg-brand",
|
|
2370
|
+
icon: "text-fg-brand",
|
|
2371
|
+
chevron: "text-fg-brand"
|
|
2372
|
+
},
|
|
2373
|
+
default: {
|
|
2374
|
+
root: "hover:bg-bg-sidebar-accent",
|
|
2375
|
+
text: "font-medium text-fg-default",
|
|
2376
|
+
icon: "text-fg-muted",
|
|
2377
|
+
chevron: "text-fg-subtle"
|
|
2378
|
+
}
|
|
2379
|
+
},
|
|
2380
|
+
collapsed: {
|
|
2381
|
+
true: { root: "justify-center px-0 size-form-xl" },
|
|
2382
|
+
false: { root: "w-full gap-gp-lg px-pad-2xl py-pad-xl" }
|
|
2383
|
+
}
|
|
2384
|
+
},
|
|
2385
|
+
defaultVariants: {
|
|
2386
|
+
state: "default",
|
|
2387
|
+
collapsed: false
|
|
2388
|
+
}
|
|
2389
|
+
});
|
|
2390
|
+
const menuItem = avatar.tv({
|
|
2391
|
+
slots: {
|
|
2392
|
+
root: "flex h-[38px] items-center gap-[18px] pl-[18px] pr-pad-2xl cursor-pointer transition-colors hover:bg-bg-sidebar-accent",
|
|
2393
|
+
border: "h-full w-0 shrink-0",
|
|
2394
|
+
text: "text-body-sm text-left"
|
|
2395
|
+
},
|
|
2396
|
+
variants: {
|
|
2397
|
+
selected: {
|
|
2398
|
+
true: {
|
|
2399
|
+
border: "border-l-[3px] border-border-brand",
|
|
2400
|
+
text: "font-semibold text-fg-default"
|
|
2401
|
+
},
|
|
2402
|
+
false: {
|
|
2403
|
+
border: "border-l border-border-subtle",
|
|
2404
|
+
text: "font-medium text-fg-muted"
|
|
2405
|
+
}
|
|
2406
|
+
}
|
|
2407
|
+
},
|
|
2408
|
+
defaultVariants: {
|
|
2409
|
+
selected: false
|
|
2410
|
+
}
|
|
2411
|
+
});
|
|
2412
|
+
const styles = {
|
|
2413
|
+
// Header
|
|
2414
|
+
header: {
|
|
2415
|
+
wrapper: "flex h-layout-navbar items-center overflow-hidden px-pad-4xl py-pad-md shrink-0",
|
|
2416
|
+
wrapperCollapsed: "justify-center px-0",
|
|
2417
|
+
inner: "flex items-center gap-gp-md",
|
|
2418
|
+
logo: "shrink-0",
|
|
2419
|
+
title: "text-title-sm font-bold text-fg-default whitespace-nowrap",
|
|
2420
|
+
collapseBtn: "ml-auto shrink-0 cursor-pointer rounded-radius-md p-pad-xs text-fg-subtle hover:bg-bg-sidebar-accent hover:text-fg-muted transition-colors",
|
|
2421
|
+
expandBtn: "absolute right-0 top-16 translate-x-1/2 z-10 cursor-pointer rounded-radius-full bg-bg-surface border border-border-default p-pad-xs shadow-sh-sm text-fg-subtle hover:text-fg-muted transition-colors",
|
|
2422
|
+
expandBtnIcon: "size-icon-sm"
|
|
2423
|
+
},
|
|
2424
|
+
// Module selector
|
|
2425
|
+
module: {
|
|
2426
|
+
trigger: "flex w-full cursor-pointer items-center gap-gp-lg rounded-radius-md bg-bg-sidebar-accent py-pad-md pl-pad-md pr-pad-2xl shadow-sh-sm transition-colors hover:bg-bg-sidebar-accent-hover focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-brand",
|
|
2427
|
+
iconContainer: "flex size-icon-xl shrink-0 items-center justify-center rounded-radius-md bg-bg-brand text-fg-on-brand",
|
|
2428
|
+
textContainer: "flex flex-col items-start gap-gp-xs overflow-hidden",
|
|
2429
|
+
title: "text-body-md font-bold leading-4 text-fg-default truncate text-left",
|
|
2430
|
+
subtitle: "text-caption-sm font-semibold text-fg-subtle text-left",
|
|
2431
|
+
chevron: "ml-auto shrink-0 size-icon-sm text-fg-subtle",
|
|
2432
|
+
dropdownItem: "flex items-center gap-gp-lg cursor-pointer",
|
|
2433
|
+
// selecionado: realça a linha (bg-brand-subtle) + label/check em fg-brand
|
|
2434
|
+
dropdownItemSelected: "bg-bg-brand-subtle text-fg-brand",
|
|
2435
|
+
// [&>svg]:!text-fg-on-brand: o DropdownMenuItem força [&_svg]:text-fg-muted
|
|
2436
|
+
// (+ fg-default no hover) em TODOS os svgs descendentes — o ! garante que o
|
|
2437
|
+
// ícone do chip siga fg-on-brand igual ao trigger (branco light / preto dark).
|
|
2438
|
+
dropdownItemIcon: "flex size-icon-lg shrink-0 items-center justify-center rounded-radius-sm bg-bg-brand [&>svg]:size-icon-sm [&>svg]:!text-fg-on-brand",
|
|
2439
|
+
dropdownItemLabel: "flex-1 text-body-md font-medium",
|
|
2440
|
+
dropdownItemCheck: "ml-auto shrink-0 size-icon-sm !text-fg-brand"
|
|
2441
|
+
},
|
|
2442
|
+
// Search
|
|
2443
|
+
search: {
|
|
2444
|
+
wrapper: "flex w-full items-center justify-between rounded-radius-lg bg-bg-muted py-pad-sm pl-pad-lg pr-pad-sm transition-all focus-within:bg-bg-surface focus-within:ring-4 focus-within:ring-ring-brand",
|
|
2445
|
+
inner: "flex flex-1 items-center gap-gp-md opacity-60 focus-within:opacity-100",
|
|
2446
|
+
icon: "shrink-0 size-icon-sm text-fg-muted",
|
|
2447
|
+
text: "text-body-sm font-medium text-fg-default placeholder:text-fg-subtle",
|
|
2448
|
+
shortcutBadge: "shrink-0 flex items-center justify-center rounded-radius-md bg-bg-surface px-pad-md py-pad-xs shadow-sh-sm",
|
|
2449
|
+
shortcutText: "text-body-sm font-medium text-fg-muted"
|
|
2450
|
+
},
|
|
2451
|
+
// Footer
|
|
2452
|
+
footer: {
|
|
2453
|
+
wrapper: "px-pad-lg py-pad-xl",
|
|
2454
|
+
button: "flex w-full cursor-pointer items-center gap-gp-lg rounded-radius-lg bg-bg-sidebar-accent px-pad-2xl py-pad-xl transition-colors hover:bg-bg-sidebar-accent-hover focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-ring-brand",
|
|
2455
|
+
avatar: "flex size-form-sm shrink-0 items-center justify-center rounded-radius-full bg-bg-muted overflow-hidden",
|
|
2456
|
+
avatarIcon: "shrink-0 size-icon-sm text-fg-muted",
|
|
2457
|
+
textContainer: "flex flex-col items-start gap-gp-2xs overflow-hidden",
|
|
2458
|
+
name: "text-body-sm font-semibold text-fg-default truncate w-full text-left",
|
|
2459
|
+
email: "text-caption-sm font-medium text-fg-muted truncate w-full text-left",
|
|
2460
|
+
chevron: "ml-auto shrink-0 size-icon-sm text-fg-subtle",
|
|
2461
|
+
dropdownLabel: "flex flex-col gap-gp-2xs px-pad-sm py-pad-xs normal-case tracking-normal",
|
|
2462
|
+
dropdownLabelName: "text-body-md font-semibold",
|
|
2463
|
+
dropdownLabelEmail: "text-caption-md font-normal text-fg-muted",
|
|
2464
|
+
dropdownItem: "flex items-center gap-gp-md cursor-pointer",
|
|
2465
|
+
dropdownItemIcon: "size-icon-sm shrink-0"
|
|
2466
|
+
},
|
|
2467
|
+
// Layout
|
|
2468
|
+
// Fade do conteúdo textual durante a transição de largura (evita wrap visível)
|
|
2469
|
+
textFadeIn: "animate-in fade-in-0 duration-200",
|
|
2470
|
+
divider: "mx-pad-3xl h-px bg-border-sidebar",
|
|
2471
|
+
sectionPadding: "flex flex-col gap-gp-2xl px-pad-3xl py-pad-4xl shrink-0 overflow-hidden",
|
|
2472
|
+
navContainer: "scrollbar-thin flex flex-1 flex-col overflow-y-auto overflow-x-hidden py-pad-4xl",
|
|
2473
|
+
navContainerExpanded: "px-pad-3xl",
|
|
2474
|
+
navContainerCollapsed: "items-center",
|
|
2475
|
+
navList: "flex flex-col",
|
|
2476
|
+
subItemList: "flex flex-col py-pad-lg"
|
|
2477
|
+
};
|
|
2478
|
+
function SingleMenuHeader({
|
|
2479
|
+
logo,
|
|
2480
|
+
title,
|
|
2481
|
+
showToggleIndicator = false
|
|
2482
|
+
}) {
|
|
2483
|
+
const { expanded, isHoverExpand, toggle } = useSingleMenuSidebar();
|
|
2484
|
+
const isFlipped = isHoverExpand || !expanded;
|
|
2485
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2486
|
+
"div",
|
|
2487
|
+
{
|
|
2488
|
+
className: avatar.cn(
|
|
2489
|
+
styles.header.wrapper,
|
|
2490
|
+
!expanded && styles.header.wrapperCollapsed
|
|
2491
|
+
),
|
|
2492
|
+
children: [
|
|
2493
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.header.inner, children: [
|
|
2494
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.header.logo, children: logo }),
|
|
2495
|
+
expanded && /* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(styles.header.title, styles.textFadeIn), children: title })
|
|
2496
|
+
] }),
|
|
2497
|
+
expanded ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2498
|
+
"button",
|
|
2499
|
+
{
|
|
2500
|
+
type: "button",
|
|
2501
|
+
onClick: toggle,
|
|
2502
|
+
className: styles.header.collapseBtn,
|
|
2503
|
+
"aria-label": isFlipped ? "Expandir sidebar" : "Recolher sidebar",
|
|
2504
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2505
|
+
lucideReact.PanelLeftClose,
|
|
2506
|
+
{
|
|
2507
|
+
className: avatar.cn(
|
|
2508
|
+
"size-icon-sm transition-transform duration-300",
|
|
2509
|
+
isFlipped && "rotate-180"
|
|
2510
|
+
)
|
|
2511
|
+
}
|
|
2512
|
+
)
|
|
2513
|
+
}
|
|
2514
|
+
) : showToggleIndicator ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2515
|
+
"button",
|
|
2516
|
+
{
|
|
2517
|
+
type: "button",
|
|
2518
|
+
onClick: toggle,
|
|
2519
|
+
className: styles.header.expandBtn,
|
|
2520
|
+
"aria-label": "Expandir sidebar",
|
|
2521
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2522
|
+
lucideReact.PanelLeftClose,
|
|
2523
|
+
{
|
|
2524
|
+
className: avatar.cn(
|
|
2525
|
+
styles.header.expandBtnIcon,
|
|
2526
|
+
"transition-transform duration-300 rotate-180"
|
|
2527
|
+
)
|
|
2528
|
+
}
|
|
2529
|
+
)
|
|
2530
|
+
}
|
|
2531
|
+
) : null
|
|
2532
|
+
]
|
|
2533
|
+
}
|
|
2534
|
+
);
|
|
2535
|
+
}
|
|
2536
|
+
SingleMenuHeader.displayName = "SingleMenuHeader";
|
|
2537
|
+
function SingleMenuModuleSelector({
|
|
2538
|
+
icon,
|
|
2539
|
+
title,
|
|
2540
|
+
subtitle,
|
|
2541
|
+
options,
|
|
2542
|
+
onModuleChange
|
|
2543
|
+
}) {
|
|
2544
|
+
const s = styles.module;
|
|
2545
|
+
const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2546
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: s.iconContainer, children: icon }),
|
|
2547
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.textContainer, children: [
|
|
2548
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.title, children: title }),
|
|
2549
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.subtitle, children: subtitle })
|
|
2550
|
+
] }),
|
|
2551
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: s.chevron })
|
|
2552
|
+
] });
|
|
2553
|
+
if (!options || options.length === 0) {
|
|
2554
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.trigger, children: triggerContent });
|
|
2555
|
+
}
|
|
2556
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenu, { children: [
|
|
2557
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuTrigger, { className: s.trigger, children: triggerContent }),
|
|
2558
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuContent, { side: "bottom", sideOffset: 4, align: "start", children: options.map((option) => {
|
|
2559
|
+
const isSelected = option.label === title;
|
|
2560
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2561
|
+
avatar.DropdownMenuItem,
|
|
2562
|
+
{
|
|
2563
|
+
className: avatar.cn(
|
|
2564
|
+
s.dropdownItem,
|
|
2565
|
+
isSelected && s.dropdownItemSelected
|
|
2566
|
+
),
|
|
2567
|
+
onClick: () => onModuleChange?.(option.id),
|
|
2568
|
+
children: [
|
|
2569
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: s.dropdownItemIcon, children: option.icon }),
|
|
2570
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownItemLabel, children: option.label }),
|
|
2571
|
+
isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: s.dropdownItemCheck })
|
|
2572
|
+
]
|
|
2573
|
+
},
|
|
2574
|
+
option.id
|
|
2575
|
+
);
|
|
2576
|
+
}) })
|
|
2577
|
+
] });
|
|
2578
|
+
}
|
|
2579
|
+
SingleMenuModuleSelector.displayName = "SingleMenuModuleSelector";
|
|
2580
|
+
function SingleMenuSearch({
|
|
2581
|
+
placeholder = "Buscar",
|
|
2582
|
+
onOpen
|
|
2583
|
+
}) {
|
|
2584
|
+
const s = styles.search;
|
|
2585
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", onClick: onOpen, className: s.wrapper, children: [
|
|
2586
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.inner, children: [
|
|
2587
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: s.icon }),
|
|
2588
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.text, children: placeholder })
|
|
2589
|
+
] }),
|
|
2590
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: s.shortcutBadge, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.shortcutText, children: "⌘K" }) })
|
|
2591
|
+
] });
|
|
2592
|
+
}
|
|
2593
|
+
SingleMenuSearch.displayName = "SingleMenuSearch";
|
|
2594
|
+
function SingleMenuCommand({
|
|
2595
|
+
open,
|
|
2596
|
+
onOpenChange,
|
|
2597
|
+
categories,
|
|
2598
|
+
placeholder = "Buscar no menu…",
|
|
2599
|
+
onSelect,
|
|
2600
|
+
custom
|
|
2601
|
+
}) {
|
|
2602
|
+
const leaves = categories.filter((c) => !c.items?.length);
|
|
2603
|
+
const groups = categories.filter((c) => c.items?.length);
|
|
2604
|
+
const handle = (id, parentId) => {
|
|
2605
|
+
onSelect(id, parentId);
|
|
2606
|
+
onOpenChange(false);
|
|
2607
|
+
};
|
|
2608
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(avatar.CommandDialog, { open, onOpenChange, children: [
|
|
2609
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.CommandInput, { placeholder }),
|
|
2610
|
+
/* @__PURE__ */ jsxRuntime.jsxs(avatar.CommandList, { children: [
|
|
2611
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.CommandEmpty, { children: "Nenhum resultado." }),
|
|
2612
|
+
custom ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2613
|
+
leaves.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandGroup, { heading: "Menu", children: leaves.map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2614
|
+
avatar.CommandItem,
|
|
2615
|
+
{
|
|
2616
|
+
value: c.label,
|
|
2617
|
+
onSelect: () => handle(c.id),
|
|
2618
|
+
children: [
|
|
2619
|
+
c.icon,
|
|
2620
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: c.label })
|
|
2621
|
+
]
|
|
2622
|
+
},
|
|
2623
|
+
c.id
|
|
2624
|
+
)) }),
|
|
2625
|
+
groups.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(avatar.CommandGroup, { heading: cat.label, children: cat.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2626
|
+
avatar.CommandItem,
|
|
2627
|
+
{
|
|
2628
|
+
value: `${cat.label} ${item.label}`,
|
|
2629
|
+
onSelect: () => handle(item.id, cat.id),
|
|
2630
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label })
|
|
2631
|
+
},
|
|
2632
|
+
item.id
|
|
2633
|
+
)) }, cat.id))
|
|
2634
|
+
] })
|
|
2635
|
+
] })
|
|
2636
|
+
] });
|
|
2637
|
+
}
|
|
2638
|
+
SingleMenuCommand.displayName = "SingleMenuCommand";
|
|
2639
|
+
function SingleMenuItem({
|
|
2640
|
+
label,
|
|
2641
|
+
selected = false,
|
|
2642
|
+
href,
|
|
2643
|
+
target,
|
|
2644
|
+
onClick,
|
|
2645
|
+
renderLink,
|
|
2646
|
+
interceptNavigation
|
|
2647
|
+
}) {
|
|
2648
|
+
const s = menuItem({ selected });
|
|
2649
|
+
const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2650
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: s.border() }),
|
|
2651
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.text(), children: label })
|
|
2652
|
+
] });
|
|
2653
|
+
const handleClick = (e) => {
|
|
2654
|
+
if (!renderLink) {
|
|
2655
|
+
const prevent = shouldPreventNavigation({
|
|
2656
|
+
href,
|
|
2657
|
+
hasHandler: interceptNavigation ?? !!onClick,
|
|
2658
|
+
target,
|
|
2659
|
+
event: e
|
|
2660
|
+
});
|
|
2661
|
+
if (prevent) e.preventDefault();
|
|
2662
|
+
}
|
|
2663
|
+
onClick?.(e);
|
|
2664
|
+
};
|
|
2665
|
+
if (href) {
|
|
2666
|
+
const linkProps = {
|
|
2667
|
+
href,
|
|
2668
|
+
target,
|
|
2669
|
+
className: s.root(),
|
|
2670
|
+
onClick: handleClick,
|
|
2671
|
+
"aria-current": selected ? "page" : void 0,
|
|
2672
|
+
children: content
|
|
2673
|
+
};
|
|
2674
|
+
if (renderLink) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
|
|
2675
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
|
|
2676
|
+
}
|
|
2677
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: handleClick, className: s.root(), children: content });
|
|
2678
|
+
}
|
|
2679
|
+
SingleMenuItem.displayName = "SingleMenuItem";
|
|
2680
|
+
function SingleMenuCategory({
|
|
2681
|
+
id,
|
|
2682
|
+
icon,
|
|
2683
|
+
label,
|
|
2684
|
+
active = false,
|
|
2685
|
+
items,
|
|
2686
|
+
activeItemId,
|
|
2687
|
+
onItemClick,
|
|
2688
|
+
onCategoryClick,
|
|
2689
|
+
href,
|
|
2690
|
+
renderLink
|
|
2691
|
+
}) {
|
|
2692
|
+
const { expanded, openCategoryId, setOpenCategoryId } = useSingleMenuSidebar();
|
|
2693
|
+
const hasItems = !!items && items.length > 0;
|
|
2694
|
+
const isOpen = hasItems ? openCategoryId === id : false;
|
|
2695
|
+
const isLeafActive = !hasItems && (activeItemId !== void 0 ? activeItemId === id : !!active);
|
|
2696
|
+
const containsActive = hasItems && items.some((item) => item.id === activeItemId);
|
|
2697
|
+
const selected = !expanded ? hasItems ? isOpen || containsActive : isLeafActive : hasItems ? isOpen : isLeafActive && openCategoryId == null;
|
|
2698
|
+
const state = selected ? "selected" : "default";
|
|
2699
|
+
const s = category({ state, collapsed: !expanded });
|
|
2700
|
+
const handleToggle = () => {
|
|
2701
|
+
if (hasItems) {
|
|
2702
|
+
setOpenCategoryId(isOpen ? null : id);
|
|
2703
|
+
onCategoryClick?.();
|
|
2704
|
+
} else {
|
|
2705
|
+
onItemClick?.(id);
|
|
2706
|
+
setOpenCategoryId(null);
|
|
2707
|
+
onCategoryClick?.();
|
|
2708
|
+
}
|
|
2709
|
+
};
|
|
2710
|
+
if (!expanded) {
|
|
2711
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(avatar.Tooltip, { children: [
|
|
2712
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2713
|
+
avatar.TooltipTrigger,
|
|
2714
|
+
{
|
|
2715
|
+
role: "button",
|
|
2716
|
+
tabIndex: 0,
|
|
2717
|
+
onClick: handleToggle,
|
|
2718
|
+
onKeyDown: (e) => {
|
|
2719
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
2720
|
+
e.preventDefault();
|
|
2721
|
+
handleToggle();
|
|
2722
|
+
}
|
|
2723
|
+
},
|
|
2724
|
+
className: s.root(),
|
|
2725
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon })
|
|
2726
|
+
}
|
|
2727
|
+
),
|
|
2728
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.TooltipContent, { side: "right", sideOffset: 8, children: label })
|
|
2729
|
+
] });
|
|
2730
|
+
}
|
|
2731
|
+
if (!hasItems) {
|
|
2732
|
+
const conteudo = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2733
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon }),
|
|
2734
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(s.text(), styles.textFadeIn), children: label })
|
|
2735
|
+
] });
|
|
2736
|
+
if (href) {
|
|
2737
|
+
const linkProps = {
|
|
2738
|
+
href,
|
|
2739
|
+
className: s.root(),
|
|
2740
|
+
onClick: (e) => {
|
|
2741
|
+
if (!renderLink) {
|
|
2742
|
+
const prevent = shouldPreventNavigation({ href, hasHandler: true, event: e });
|
|
2743
|
+
if (prevent) e.preventDefault();
|
|
2744
|
+
}
|
|
2745
|
+
handleToggle();
|
|
2746
|
+
},
|
|
2747
|
+
"aria-current": selected ? "page" : void 0,
|
|
2748
|
+
children: conteudo
|
|
2749
|
+
};
|
|
2750
|
+
if (renderLink) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: renderLink(linkProps) });
|
|
2751
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { ...linkProps });
|
|
2752
|
+
}
|
|
2753
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: handleToggle, className: s.root(), children: conteudo });
|
|
2754
|
+
}
|
|
2755
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2756
|
+
avatar.Collapsible,
|
|
2757
|
+
{
|
|
2758
|
+
open: isOpen,
|
|
2759
|
+
onOpenChange: (open) => {
|
|
2760
|
+
setOpenCategoryId(open ? id : null);
|
|
2761
|
+
onCategoryClick?.();
|
|
2762
|
+
},
|
|
2763
|
+
children: [
|
|
2764
|
+
/* @__PURE__ */ jsxRuntime.jsxs(avatar.CollapsibleTrigger, { className: s.root(), children: [
|
|
2765
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.icon(), children: icon }),
|
|
2766
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: avatar.cn(s.text(), styles.textFadeIn), children: label }),
|
|
2767
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: avatar.cn(s.chevron(), isOpen && "rotate-180") })
|
|
2768
|
+
] }),
|
|
2769
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.CollapsibleContent, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.subItemList, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2770
|
+
SingleMenuItem,
|
|
2771
|
+
{
|
|
2772
|
+
label: item.label,
|
|
2773
|
+
selected: item.id === activeItemId,
|
|
2774
|
+
href: item.href,
|
|
2775
|
+
renderLink,
|
|
2776
|
+
interceptNavigation: !!onItemClick,
|
|
2777
|
+
onClick: () => onItemClick?.(item.id)
|
|
2778
|
+
},
|
|
2779
|
+
item.id
|
|
2780
|
+
)) }) })
|
|
2781
|
+
]
|
|
2782
|
+
}
|
|
2783
|
+
);
|
|
2784
|
+
}
|
|
2785
|
+
SingleMenuCategory.displayName = "SingleMenuCategory";
|
|
2786
|
+
function SingleMenuFooter({
|
|
2787
|
+
name,
|
|
2788
|
+
email,
|
|
2789
|
+
avatar: avatar$1,
|
|
2790
|
+
actions,
|
|
2791
|
+
onAction
|
|
2792
|
+
}) {
|
|
2793
|
+
const { expanded } = useSingleMenuSidebar();
|
|
2794
|
+
const s = styles.footer;
|
|
2795
|
+
const triggerContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2796
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: s.avatar, children: avatar$1 ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: s.avatarIcon }) }),
|
|
2797
|
+
expanded && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2798
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: s.textContainer, children: [
|
|
2799
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.name, children: name }),
|
|
2800
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.email, children: email })
|
|
2801
|
+
] }),
|
|
2802
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: s.chevron })
|
|
2803
|
+
] })
|
|
2804
|
+
] });
|
|
2805
|
+
if (!actions || actions.length === 0) {
|
|
2806
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.wrapper, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: avatar.cn(s.button, !expanded && "justify-center px-0"), children: triggerContent }) });
|
|
2807
|
+
}
|
|
2808
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.wrapper, children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenu, { children: [
|
|
2809
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2810
|
+
avatar.DropdownMenuTrigger,
|
|
2811
|
+
{
|
|
2812
|
+
className: avatar.cn(s.button, !expanded && "justify-center px-0"),
|
|
2813
|
+
children: triggerContent
|
|
2814
|
+
}
|
|
2815
|
+
),
|
|
2816
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2817
|
+
avatar.DropdownMenuContent,
|
|
2818
|
+
{
|
|
2819
|
+
side: expanded ? "top" : "right",
|
|
2820
|
+
sideOffset: 8,
|
|
2821
|
+
align: expanded ? "end" : "start",
|
|
2822
|
+
children: [
|
|
2823
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.DropdownMenuLabel, { className: s.dropdownLabel, children: [
|
|
2824
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownLabelName, children: name }),
|
|
2825
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownLabelEmail, children: email })
|
|
2826
|
+
] }) }),
|
|
2827
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.DropdownMenuSeparator, {}),
|
|
2828
|
+
actions.map((action) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2829
|
+
avatar.DropdownMenuItem,
|
|
2830
|
+
{
|
|
2831
|
+
variant: action.variant === "destructive" ? "destructive" : "default",
|
|
2832
|
+
onClick: () => onAction?.(action.id),
|
|
2833
|
+
className: s.dropdownItem,
|
|
2834
|
+
children: [
|
|
2835
|
+
action.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: s.dropdownItemIcon, children: action.icon }),
|
|
2836
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: action.label })
|
|
2837
|
+
]
|
|
2838
|
+
},
|
|
2839
|
+
action.id
|
|
2840
|
+
))
|
|
2841
|
+
]
|
|
2842
|
+
}
|
|
2843
|
+
)
|
|
2844
|
+
] }) });
|
|
2845
|
+
}
|
|
2846
|
+
SingleMenuFooter.displayName = "SingleMenuFooter";
|
|
2847
|
+
function SingleMenuSidebar({
|
|
2848
|
+
logo,
|
|
2849
|
+
title,
|
|
2850
|
+
module: module2,
|
|
2851
|
+
modules,
|
|
2852
|
+
activeModuleId,
|
|
2853
|
+
defaultModuleId,
|
|
2854
|
+
onModuleChange,
|
|
2855
|
+
showSearch = true,
|
|
2856
|
+
searchPlaceholder,
|
|
2857
|
+
searchCommand,
|
|
2858
|
+
categories,
|
|
2859
|
+
activeItemId,
|
|
2860
|
+
onItemClick,
|
|
2861
|
+
renderLink,
|
|
2862
|
+
user,
|
|
2863
|
+
defaultExpanded = true,
|
|
2864
|
+
expanded: controlledExpanded,
|
|
2865
|
+
onExpandedChange,
|
|
2866
|
+
showToggleIndicator = false,
|
|
2867
|
+
className,
|
|
2868
|
+
...props
|
|
2869
|
+
}) {
|
|
2870
|
+
const {
|
|
2871
|
+
expanded,
|
|
2872
|
+
isHoverExpand,
|
|
2873
|
+
toggle,
|
|
2874
|
+
onMouseEnter,
|
|
2875
|
+
onMouseLeave,
|
|
2876
|
+
openCategoryId,
|
|
2877
|
+
setOpenCategoryId
|
|
2878
|
+
} = useSingleMenuSidebarState(
|
|
2879
|
+
defaultExpanded,
|
|
2880
|
+
controlledExpanded,
|
|
2881
|
+
onExpandedChange
|
|
2882
|
+
);
|
|
2883
|
+
const hasModules = !!modules && modules.length > 0;
|
|
2884
|
+
const [internalModuleId, setInternalModuleId] = React.useState(
|
|
2885
|
+
defaultModuleId ?? modules?.[0]?.id
|
|
2886
|
+
);
|
|
2887
|
+
const currentModuleId = activeModuleId ?? internalModuleId;
|
|
2888
|
+
const activeModule = hasModules ? modules.find((m) => m.id === currentModuleId) ?? modules[0] : void 0;
|
|
2889
|
+
const handleModuleChange = (id) => {
|
|
2890
|
+
if (activeModuleId === void 0) setInternalModuleId(id);
|
|
2891
|
+
onModuleChange?.(id);
|
|
2892
|
+
};
|
|
2893
|
+
const moduleDisplay = hasModules ? {
|
|
2894
|
+
icon: activeModule.icon,
|
|
2895
|
+
title: activeModule.title,
|
|
2896
|
+
subtitle: activeModule.subtitle ?? "",
|
|
2897
|
+
options: modules.map((m) => ({
|
|
2898
|
+
id: m.id,
|
|
2899
|
+
label: m.title,
|
|
2900
|
+
icon: m.icon
|
|
2901
|
+
})),
|
|
2902
|
+
onModuleChange: handleModuleChange
|
|
2903
|
+
} : module2;
|
|
2904
|
+
const effectiveCategories = hasModules ? activeModule.categories : categories ?? [];
|
|
2905
|
+
const [commandOpen, setCommandOpen] = React.useState(false);
|
|
2906
|
+
React.useEffect(() => {
|
|
2907
|
+
if (!showSearch) return;
|
|
2908
|
+
const onKey = (e) => {
|
|
2909
|
+
if (e.key.toLowerCase() === "k" && (e.metaKey || e.ctrlKey)) {
|
|
2910
|
+
e.preventDefault();
|
|
2911
|
+
setCommandOpen((o) => !o);
|
|
2912
|
+
}
|
|
2913
|
+
};
|
|
2914
|
+
document.addEventListener("keydown", onKey);
|
|
2915
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
2916
|
+
}, [showSearch]);
|
|
2917
|
+
const selectFromSearch = (id, parentId) => {
|
|
2918
|
+
onItemClick?.(id);
|
|
2919
|
+
setOpenCategoryId(parentId ?? null);
|
|
2920
|
+
};
|
|
2921
|
+
const resolvedOpenCategoryId = openCategoryId ?? effectiveCategories.find(
|
|
2922
|
+
(cat) => cat.items?.some((item) => item.id === activeItemId)
|
|
2923
|
+
)?.id ?? null;
|
|
2924
|
+
const contextValue = React.useMemo(
|
|
2925
|
+
() => ({
|
|
2926
|
+
expanded,
|
|
2927
|
+
isHoverExpand,
|
|
2928
|
+
toggle,
|
|
2929
|
+
openCategoryId: resolvedOpenCategoryId,
|
|
2930
|
+
setOpenCategoryId
|
|
2931
|
+
}),
|
|
2932
|
+
[
|
|
2933
|
+
expanded,
|
|
2934
|
+
isHoverExpand,
|
|
2935
|
+
toggle,
|
|
2936
|
+
resolvedOpenCategoryId,
|
|
2937
|
+
setOpenCategoryId
|
|
2938
|
+
]
|
|
2939
|
+
);
|
|
2940
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(SingleMenuSidebarContext.Provider, { value: contextValue, children: [
|
|
2941
|
+
/* @__PURE__ */ jsxRuntime.jsx(avatar.TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2942
|
+
"aside",
|
|
2943
|
+
{
|
|
2944
|
+
"aria-label": "Navegação lateral",
|
|
2945
|
+
className: avatar.cn(sidebarRoot({ expanded }), className),
|
|
2946
|
+
onMouseEnter,
|
|
2947
|
+
onMouseLeave,
|
|
2948
|
+
...props,
|
|
2949
|
+
children: [
|
|
2950
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2951
|
+
SingleMenuHeader,
|
|
2952
|
+
{
|
|
2953
|
+
logo,
|
|
2954
|
+
title,
|
|
2955
|
+
showToggleIndicator
|
|
2956
|
+
}
|
|
2957
|
+
),
|
|
2958
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.divider }),
|
|
2959
|
+
expanded && (moduleDisplay || showSearch) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: avatar.cn(styles.sectionPadding, styles.textFadeIn), children: [
|
|
2960
|
+
moduleDisplay && /* @__PURE__ */ jsxRuntime.jsx(SingleMenuModuleSelector, { ...moduleDisplay }),
|
|
2961
|
+
showSearch && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2962
|
+
SingleMenuSearch,
|
|
2963
|
+
{
|
|
2964
|
+
placeholder: searchPlaceholder,
|
|
2965
|
+
onOpen: () => setCommandOpen(true)
|
|
2966
|
+
}
|
|
2967
|
+
)
|
|
2968
|
+
] }),
|
|
2969
|
+
expanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.divider }),
|
|
2970
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2971
|
+
"nav",
|
|
2972
|
+
{
|
|
2973
|
+
className: avatar.cn(
|
|
2974
|
+
styles.navContainer,
|
|
2975
|
+
expanded ? styles.navContainerExpanded : styles.navContainerCollapsed
|
|
2976
|
+
),
|
|
2977
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.navList, children: effectiveCategories.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2978
|
+
SingleMenuCategory,
|
|
2979
|
+
{
|
|
2980
|
+
...cat,
|
|
2981
|
+
activeItemId,
|
|
2982
|
+
onItemClick,
|
|
2983
|
+
renderLink
|
|
2984
|
+
},
|
|
2985
|
+
cat.id
|
|
2986
|
+
)) })
|
|
2987
|
+
}
|
|
2988
|
+
),
|
|
2989
|
+
/* @__PURE__ */ jsxRuntime.jsx(SingleMenuFooter, { ...user })
|
|
2990
|
+
]
|
|
2991
|
+
}
|
|
2992
|
+
) }),
|
|
2993
|
+
showSearch && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2994
|
+
SingleMenuCommand,
|
|
2995
|
+
{
|
|
2996
|
+
open: commandOpen,
|
|
2997
|
+
onOpenChange: setCommandOpen,
|
|
2998
|
+
categories: effectiveCategories,
|
|
2999
|
+
placeholder: searchPlaceholder,
|
|
3000
|
+
onSelect: selectFromSearch,
|
|
3001
|
+
custom: searchCommand
|
|
3002
|
+
}
|
|
3003
|
+
)
|
|
3004
|
+
] });
|
|
3005
|
+
}
|
|
3006
|
+
SingleMenuSidebar.displayName = "SingleMenuSidebar";
|
|
2261
3007
|
function deriveInitials(name) {
|
|
2262
3008
|
return name.split(" ").filter(Boolean).map((p) => p[0]).join("").slice(0, 2).toUpperCase();
|
|
2263
3009
|
}
|
|
@@ -2392,10 +3138,17 @@ function UserMenu({
|
|
|
2392
3138
|
}
|
|
2393
3139
|
const root = avatar.tv({
|
|
2394
3140
|
base: [
|
|
2395
|
-
"flex
|
|
3141
|
+
"flex w-full bg-bg-canvas",
|
|
2396
3142
|
"overflow-hidden"
|
|
2397
|
-
// garante que sidebar + main não vazem
|
|
2398
|
-
]
|
|
3143
|
+
// garante que sidebar + main não vazem o container
|
|
3144
|
+
],
|
|
3145
|
+
variants: {
|
|
3146
|
+
fillHeight: {
|
|
3147
|
+
false: "h-screen",
|
|
3148
|
+
true: "h-full"
|
|
3149
|
+
}
|
|
3150
|
+
},
|
|
3151
|
+
defaultVariants: { fillHeight: false }
|
|
2399
3152
|
});
|
|
2400
3153
|
const main = avatar.tv({
|
|
2401
3154
|
base: [
|
|
@@ -2437,47 +3190,60 @@ const bodyInner = avatar.tv({
|
|
|
2437
3190
|
mobileEdgeToEdge: false
|
|
2438
3191
|
}
|
|
2439
3192
|
});
|
|
2440
|
-
function AppShell({
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
3193
|
+
function AppShell(props) {
|
|
3194
|
+
const {
|
|
3195
|
+
// Sidebar
|
|
3196
|
+
contexts,
|
|
3197
|
+
defaultActiveContextId,
|
|
3198
|
+
activeContextId,
|
|
3199
|
+
onContextChange,
|
|
3200
|
+
defaultActiveItemHref,
|
|
3201
|
+
activeItemHref,
|
|
3202
|
+
onItemClick,
|
|
3203
|
+
renderLink,
|
|
3204
|
+
brandHref,
|
|
3205
|
+
onBrandClick,
|
|
3206
|
+
// Header
|
|
3207
|
+
breadcrumb,
|
|
3208
|
+
commandGroups,
|
|
3209
|
+
commandPlaceholder,
|
|
3210
|
+
commandEmptyMessage,
|
|
3211
|
+
searchPlaceholder,
|
|
3212
|
+
notifications,
|
|
3213
|
+
messages,
|
|
3214
|
+
theme,
|
|
3215
|
+
onThemeChange,
|
|
3216
|
+
themeOptions,
|
|
3217
|
+
headerRightSlot,
|
|
3218
|
+
// User menu
|
|
3219
|
+
user,
|
|
3220
|
+
layout,
|
|
3221
|
+
onLayoutChange,
|
|
3222
|
+
layoutOptions,
|
|
3223
|
+
onSettings,
|
|
3224
|
+
onLogout,
|
|
3225
|
+
// Menu collapse (controlled/uncontrolled)
|
|
3226
|
+
menuCollapsed: controlledCollapsed,
|
|
3227
|
+
defaultMenuCollapsed,
|
|
3228
|
+
onMenuCollapseChange,
|
|
3229
|
+
// Body
|
|
3230
|
+
children,
|
|
3231
|
+
bodyClassName,
|
|
3232
|
+
mobileEdgeToEdge,
|
|
3233
|
+
fillHeight,
|
|
3234
|
+
// Escolha da sidebar. SEM default aqui: um default literal estreitaria o tipo pra
|
|
3235
|
+
// "menu" e o TS marcaria a comparação com "single" como morta (TS2367).
|
|
3236
|
+
sidebar,
|
|
3237
|
+
categories,
|
|
3238
|
+
sidebarLogo,
|
|
3239
|
+
sidebarTitle,
|
|
3240
|
+
activeItemId,
|
|
3241
|
+
onSidebarItemClick,
|
|
3242
|
+
sidebarModules,
|
|
3243
|
+
sidebarShowSearch,
|
|
3244
|
+
sidebarSearchPlaceholder,
|
|
3245
|
+
className
|
|
3246
|
+
} = props;
|
|
2481
3247
|
const [internalCollapsed, setInternalCollapsed] = React.useState(() => {
|
|
2482
3248
|
if (defaultMenuCollapsed !== void 0) return defaultMenuCollapsed;
|
|
2483
3249
|
if (typeof window === "undefined") return false;
|
|
@@ -2509,37 +3275,73 @@ function AppShell({
|
|
|
2509
3275
|
onLogout
|
|
2510
3276
|
}
|
|
2511
3277
|
) : void 0;
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
3278
|
+
const sidebarNode = sidebar === "single" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
3279
|
+
SingleMenuSidebar,
|
|
3280
|
+
{
|
|
3281
|
+
logo: sidebarLogo,
|
|
3282
|
+
title: sidebarTitle ?? "",
|
|
3283
|
+
categories,
|
|
3284
|
+
modules: sidebarModules,
|
|
3285
|
+
activeItemId,
|
|
3286
|
+
onItemClick: onSidebarItemClick,
|
|
3287
|
+
renderLink,
|
|
3288
|
+
showSearch: sidebarShowSearch ?? false,
|
|
3289
|
+
searchPlaceholder: sidebarSearchPlaceholder,
|
|
3290
|
+
expanded: isMobile ? mobileMenuOpen : !menuCollapsed,
|
|
3291
|
+
onExpandedChange: (next) => {
|
|
3292
|
+
if (isMobile) {
|
|
3293
|
+
setMobileMenuOpen(next);
|
|
3294
|
+
return;
|
|
3295
|
+
}
|
|
3296
|
+
const nextCollapsed = !next;
|
|
3297
|
+
if (controlledCollapsed === void 0) setInternalCollapsed(nextCollapsed);
|
|
3298
|
+
onMenuCollapseChange?.(nextCollapsed);
|
|
3299
|
+
},
|
|
3300
|
+
user: {
|
|
3301
|
+
name: user?.name ?? "",
|
|
3302
|
+
email: user?.email ?? "",
|
|
3303
|
+
actions: [
|
|
3304
|
+
...onSettings ? [{ id: "settings", label: "Configurações" }] : [],
|
|
3305
|
+
...onLogout ? [{ id: "logout", label: "Sair", variant: "destructive" }] : []
|
|
3306
|
+
],
|
|
3307
|
+
onAction: (id) => {
|
|
3308
|
+
if (id === "settings") onSettings?.();
|
|
3309
|
+
if (id === "logout") onLogout?.();
|
|
3310
|
+
}
|
|
2534
3311
|
}
|
|
2535
|
-
|
|
3312
|
+
}
|
|
3313
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3314
|
+
MenuSidebar,
|
|
3315
|
+
{
|
|
3316
|
+
contexts,
|
|
3317
|
+
activeContextId,
|
|
3318
|
+
defaultActiveContextId,
|
|
3319
|
+
onContextChange,
|
|
3320
|
+
activeItemHref,
|
|
3321
|
+
defaultActiveItemHref,
|
|
3322
|
+
onItemClick,
|
|
3323
|
+
renderLink,
|
|
3324
|
+
brandHref,
|
|
3325
|
+
onBrandClick,
|
|
3326
|
+
user: userNode,
|
|
3327
|
+
panelCollapsed: menuCollapsed,
|
|
3328
|
+
onPanelCollapseChange: (next) => {
|
|
3329
|
+
if (controlledCollapsed === void 0) setInternalCollapsed(next);
|
|
3330
|
+
onMenuCollapseChange?.(next);
|
|
3331
|
+
},
|
|
3332
|
+
mobileOpen: mobileMenuOpen,
|
|
3333
|
+
onMobileOpenChange: setMobileMenuOpen
|
|
3334
|
+
}
|
|
3335
|
+
);
|
|
3336
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: avatar.cn(root({ fillHeight: fillHeight ?? false }), className), children: [
|
|
3337
|
+
sidebarNode,
|
|
2536
3338
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: main(), children: [
|
|
2537
3339
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2538
3340
|
Header,
|
|
2539
3341
|
{
|
|
2540
3342
|
breadcrumb,
|
|
2541
|
-
onCollapseMenu: handleToggleMenu,
|
|
2542
|
-
menuCollapsed,
|
|
3343
|
+
onCollapseMenu: sidebar === "single" && !isMobile ? void 0 : handleToggleMenu,
|
|
3344
|
+
menuCollapsed: isMobile ? !mobileMenuOpen : menuCollapsed,
|
|
2543
3345
|
commandGroups,
|
|
2544
3346
|
commandPlaceholder,
|
|
2545
3347
|
commandEmptyMessage,
|
|
@@ -2645,6 +3447,7 @@ exports.SidebarPill = SidebarPill;
|
|
|
2645
3447
|
exports.SidebarRail = SidebarRail;
|
|
2646
3448
|
exports.SidebarSection = SidebarSection;
|
|
2647
3449
|
exports.SidebarSubgroup = SidebarSubgroup;
|
|
3450
|
+
exports.SingleMenuSidebar = SingleMenuSidebar;
|
|
2648
3451
|
exports.UserMenu = UserMenu;
|
|
2649
3452
|
exports.chipCount = chipCount;
|
|
2650
3453
|
exports.chipVariants = chipVariants;
|
|
@@ -2655,4 +3458,4 @@ exports.shouldPreventNavigation = shouldPreventNavigation;
|
|
|
2655
3458
|
exports.useControllable = useControllable;
|
|
2656
3459
|
exports.useMediaQuery = useMediaQuery;
|
|
2657
3460
|
exports.useTheme = useTheme;
|
|
2658
|
-
//# sourceMappingURL=useTheme-
|
|
3461
|
+
//# sourceMappingURL=useTheme-3iZAognE.cjs.map
|