@wealthx/shadcn 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -63,7 +63,8 @@ __export(sidebar_nav_exports, {
63
63
  });
64
64
  module.exports = __toCommonJS(sidebar_nav_exports);
65
65
  var React3 = __toESM(require("react"));
66
- var import_lucide_react2 = require("lucide-react");
66
+ var import_lucide_react3 = require("lucide-react");
67
+ var import_accordion2 = require("@base-ui/react/accordion");
67
68
 
68
69
  // src/lib/utils.ts
69
70
  var import_clsx = require("clsx");
@@ -120,10 +121,50 @@ function formatCurrency(value, options) {
120
121
  return formatted;
121
122
  }
122
123
 
124
+ // src/components/ui/accordion.tsx
125
+ var import_lucide_react = require("lucide-react");
126
+ var import_accordion = require("@base-ui/react/accordion");
127
+ var import_jsx_runtime = require("react/jsx-runtime");
128
+ function Accordion(props) {
129
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_accordion.Accordion.Root, __spreadValues({ "data-slot": "accordion" }, props));
130
+ }
131
+ function AccordionItem(_a) {
132
+ var _b = _a, {
133
+ className
134
+ } = _b, props = __objRest(_b, [
135
+ "className"
136
+ ]);
137
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
138
+ import_accordion.Accordion.Item,
139
+ __spreadValues({
140
+ className: cn("border-b", className),
141
+ "data-slot": "accordion-item"
142
+ }, props)
143
+ );
144
+ }
145
+ function AccordionContent(_a) {
146
+ var _b = _a, {
147
+ className,
148
+ children
149
+ } = _b, props = __objRest(_b, [
150
+ "className",
151
+ "children"
152
+ ]);
153
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
154
+ import_accordion.Accordion.Panel,
155
+ __spreadProps(__spreadValues({
156
+ className: "overflow-hidden text-body-small h-(--accordion-panel-height) transition-[height] duration-200 ease-out data-starting-style:h-0 data-ending-style:h-0",
157
+ "data-slot": "accordion-content"
158
+ }, props), {
159
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cn("pb-4 text-muted-foreground", className), children })
160
+ })
161
+ );
162
+ }
163
+
123
164
  // src/components/ui/button.tsx
124
165
  var import_react = require("react");
125
166
  var import_class_variance_authority = require("class-variance-authority");
126
- var import_lucide_react = require("lucide-react");
167
+ var import_lucide_react2 = require("lucide-react");
127
168
 
128
169
  // src/lib/slot.tsx
129
170
  var React = __toESM(require("react"));
@@ -173,7 +214,7 @@ var Slot = React.forwardRef(
173
214
  Slot.displayName = "Slot";
174
215
 
175
216
  // src/components/ui/button.tsx
176
- var import_jsx_runtime = require("react/jsx-runtime");
217
+ var import_jsx_runtime2 = require("react/jsx-runtime");
177
218
  var buttonVariants = (0, import_class_variance_authority.cva)(
178
219
  "inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 font-sans text-button whitespace-nowrap transition-all active:scale-[0.98] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
179
220
  {
@@ -227,7 +268,7 @@ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
227
268
  ]);
228
269
  const Comp = asChild ? Slot : "button";
229
270
  const isIconOnly = size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg";
230
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
271
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
231
272
  Comp,
232
273
  __spreadProps(__spreadValues({
233
274
  className: cn(buttonVariants({ variant, size, className })),
@@ -238,8 +279,8 @@ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
238
279
  ref,
239
280
  type
240
281
  }, props), {
241
- children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
242
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
282
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
283
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react2.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
243
284
  !isIconOnly && children
244
285
  ] }) : children
245
286
  })
@@ -251,21 +292,21 @@ var import_tooltip = require("@base-ui/react/tooltip");
251
292
 
252
293
  // src/lib/theme-provider.tsx
253
294
  var import_react2 = require("react");
254
- var import_jsx_runtime2 = require("react/jsx-runtime");
295
+ var import_jsx_runtime3 = require("react/jsx-runtime");
255
296
  var ThemeVarsContext = (0, import_react2.createContext)({});
256
297
  function useThemeVars() {
257
298
  return (0, import_react2.useContext)(ThemeVarsContext);
258
299
  }
259
300
 
260
301
  // src/components/ui/tooltip.tsx
261
- var import_jsx_runtime3 = require("react/jsx-runtime");
302
+ var import_jsx_runtime4 = require("react/jsx-runtime");
262
303
  function TooltipProvider(_a) {
263
304
  var _b = _a, {
264
305
  delay = 0
265
306
  } = _b, props = __objRest(_b, [
266
307
  "delay"
267
308
  ]);
268
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
309
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
269
310
  import_tooltip.Tooltip.Provider,
270
311
  __spreadValues({
271
312
  "data-slot": "tooltip-provider",
@@ -275,11 +316,11 @@ function TooltipProvider(_a) {
275
316
  }
276
317
  function Tooltip(_a) {
277
318
  var props = __objRest(_a, []);
278
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Root, __spreadValues({ "data-slot": "tooltip" }, props));
319
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_tooltip.Tooltip.Root, __spreadValues({ "data-slot": "tooltip" }, props));
279
320
  }
280
321
  function TooltipTrigger(_a) {
281
322
  var props = __objRest(_a, []);
282
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Trigger, __spreadValues({ "data-slot": "tooltip-trigger" }, props));
323
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_tooltip.Tooltip.Trigger, __spreadValues({ "data-slot": "tooltip-trigger" }, props));
283
324
  }
284
325
  function TooltipContent(_a) {
285
326
  var _b = _a, {
@@ -296,7 +337,7 @@ function TooltipContent(_a) {
296
337
  "style"
297
338
  ]);
298
339
  const themeVars = useThemeVars();
299
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Positioner, { sideOffset, side, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
340
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_tooltip.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_tooltip.Tooltip.Positioner, { sideOffset, side, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
300
341
  import_tooltip.Tooltip.Popup,
301
342
  __spreadProps(__spreadValues({
302
343
  className: cn(
@@ -308,14 +349,14 @@ function TooltipContent(_a) {
308
349
  }, props), {
309
350
  children: [
310
351
  children,
311
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Arrow, { className: "z-50 size-2.5 rotate-45 bg-brand-secondary data-[side=bottom]:-top-1 data-[side=left]:-right-1 data-[side=right]:-left-1 data-[side=top]:-bottom-1" })
352
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_tooltip.Tooltip.Arrow, { className: "z-50 size-2.5 rotate-45 bg-brand-secondary data-[side=bottom]:-top-1 data-[side=left]:-right-1 data-[side=right]:-left-1 data-[side=top]:-bottom-1" })
312
353
  ]
313
354
  })
314
355
  ) }) });
315
356
  }
316
357
 
317
358
  // src/components/ui/sidebar-nav.tsx
318
- var import_jsx_runtime4 = require("react/jsx-runtime");
359
+ var import_jsx_runtime5 = require("react/jsx-runtime");
319
360
  function getInitials(name) {
320
361
  return name.split(" ").filter(Boolean).map((word) => word[0]).join("").toUpperCase().slice(0, 2);
321
362
  }
@@ -327,19 +368,19 @@ function navIconCn(isActive) {
327
368
  }
328
369
  function NavTooltip({ label, collapsed, children }) {
329
370
  if (!collapsed) return children;
330
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Tooltip, { children: [
331
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(TooltipTrigger, { render: children }),
332
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(TooltipContent, { side: "right", children: label })
371
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Tooltip, { children: [
372
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TooltipTrigger, { render: children }),
373
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TooltipContent, { side: "right", children: label })
333
374
  ] });
334
375
  }
335
376
  function MetricsGroup({ group }) {
336
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "border-b border-white/15 py-4 px-5 flex flex-col gap-1.5", children: group.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
377
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "border-b border-white/15 py-4 px-5 flex flex-col gap-1.5", children: group.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
337
378
  "div",
338
379
  {
339
380
  className: "flex items-center justify-between gap-2",
340
381
  children: [
341
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-center gap-1 min-w-0", children: [
342
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
382
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex items-center gap-1 min-w-0", children: [
383
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
343
384
  "span",
344
385
  {
345
386
  className: cn(
@@ -349,8 +390,8 @@ function MetricsGroup({ group }) {
349
390
  children: item.name
350
391
  }
351
392
  ),
352
- item.info && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
353
- import_lucide_react2.Info,
393
+ item.info && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
394
+ import_lucide_react3.Info,
354
395
  {
355
396
  size: 11,
356
397
  strokeWidth: 2,
@@ -358,7 +399,7 @@ function MetricsGroup({ group }) {
358
399
  }
359
400
  )
360
401
  ] }),
361
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
402
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
362
403
  "span",
363
404
  {
364
405
  className: cn(
@@ -380,7 +421,7 @@ function SidebarNavItemView({
380
421
  }) {
381
422
  var _a;
382
423
  const Icon = item.icon;
383
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NavTooltip, { label: item.title, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
424
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NavTooltip, { label: item.title, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
384
425
  Button,
385
426
  {
386
427
  type: "button",
@@ -395,15 +436,15 @@ function SidebarNavItemView({
395
436
  )
396
437
  ),
397
438
  children: [
398
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
439
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
399
440
  Icon,
400
441
  {
401
442
  className: navIconCn((_a = item.isActive) != null ? _a : false),
402
- size: 18,
443
+ size: 24,
403
444
  strokeWidth: 1.75
404
445
  }
405
446
  ),
406
- !collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate", children: item.title })
447
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "truncate", children: item.title })
407
448
  ]
408
449
  }
409
450
  ) });
@@ -421,7 +462,7 @@ function CollapsibleNavItem({
421
462
  if (hasActiveChild) setOpen(true);
422
463
  }, [hasActiveChild]);
423
464
  if (collapsed) {
424
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NavTooltip, { label: item.title, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
465
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NavTooltip, { label: item.title, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
425
466
  Button,
426
467
  {
427
468
  type: "button",
@@ -432,83 +473,87 @@ function CollapsibleNavItem({
432
473
  "text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground",
433
474
  hasActiveChild && "bg-white/15 text-brand-secondary-foreground"
434
475
  ),
435
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
476
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
436
477
  Icon,
437
478
  {
438
479
  className: navIconCn(hasActiveChild),
439
- size: 18,
480
+ size: 24,
440
481
  strokeWidth: 1.75
441
482
  }
442
483
  )
443
484
  }
444
485
  ) });
445
486
  }
446
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
447
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
448
- Button,
449
- {
450
- type: "button",
451
- variant: "ghost",
452
- onClick: () => setOpen((prev) => !prev),
453
- className: cn(
454
- "group h-auto w-full justify-start gap-3 px-3 py-2.5 text-base font-medium transition-colors",
455
- "text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground",
456
- "border-l-4 border-transparent",
457
- hasActiveChild && "bg-white/15 text-brand-secondary-foreground border-primary"
458
- ),
459
- children: [
460
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
461
- Icon,
462
- {
463
- className: navIconCn(hasActiveChild),
464
- size: 18,
465
- strokeWidth: 1.75
466
- }
467
- ),
468
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "flex-1 truncate text-left", children: item.title }),
469
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
470
- import_lucide_react2.ChevronDown,
471
- {
472
- className: cn(
473
- "ml-auto shrink-0 text-brand-secondary-foreground/40 transition-transform duration-200",
474
- open && "rotate-180"
487
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
488
+ Accordion,
489
+ {
490
+ value: open ? [item.href] : [],
491
+ onValueChange: (values) => setOpen(values.length > 0),
492
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(AccordionItem, { className: "border-none", value: item.href, children: [
493
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_accordion2.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
494
+ import_accordion2.Accordion.Trigger,
495
+ {
496
+ className: cn(
497
+ "group flex h-auto w-full items-center justify-start gap-3 px-3 py-2.5 text-base font-medium transition-colors",
498
+ "text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground",
499
+ "border-l-4 border-transparent",
500
+ hasActiveChild && "bg-white/15 text-brand-secondary-foreground border-primary"
501
+ ),
502
+ children: [
503
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
504
+ Icon,
505
+ {
506
+ className: navIconCn(hasActiveChild),
507
+ size: 24,
508
+ strokeWidth: 1.75
509
+ }
475
510
  ),
476
- size: 14,
477
- strokeWidth: 2
478
- }
479
- )
480
- ]
481
- }
482
- ),
483
- open && item.subItems && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ml-9 border-l border-white/15 pl-3", children: item.subItems.map((sub) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
484
- Button,
485
- {
486
- type: "button",
487
- variant: "ghost",
488
- onClick: () => onNavigate == null ? void 0 : onNavigate(sub.href),
489
- className: cn(
490
- "h-auto w-full justify-start gap-2 py-1.5 pl-1 text-sm transition-colors",
491
- "text-brand-secondary-foreground/50 hover:text-brand-secondary-foreground",
492
- sub.isActive && "text-primary font-medium"
493
- ),
494
- children: [
495
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
496
- import_lucide_react2.ChevronRight,
497
- {
498
- size: 11,
499
- strokeWidth: 2,
500
- className: cn(
501
- "shrink-0",
502
- sub.isActive ? "text-primary" : "text-brand-secondary-foreground/30"
511
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "flex-1 truncate text-left", children: item.title }),
512
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
513
+ import_lucide_react3.ChevronDown,
514
+ {
515
+ className: cn(
516
+ "ml-auto shrink-0 text-brand-secondary-foreground/40 transition-transform duration-200",
517
+ "group-data-[panel-open]:rotate-180"
518
+ ),
519
+ size: 14,
520
+ strokeWidth: 2
521
+ }
503
522
  )
504
- }
505
- ),
506
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate", children: sub.title })
507
- ]
508
- },
509
- sub.href
510
- )) })
511
- ] });
523
+ ]
524
+ }
525
+ ) }),
526
+ item.subItems && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AccordionContent, { className: "p-0 text-inherit", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ml-9 border-l border-white/15 pl-3", children: item.subItems.map((sub) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
527
+ Button,
528
+ {
529
+ type: "button",
530
+ variant: "ghost",
531
+ onClick: () => onNavigate == null ? void 0 : onNavigate(sub.href),
532
+ className: cn(
533
+ "h-auto w-full justify-start gap-2 py-1.5 pl-1 text-sm transition-colors",
534
+ "text-brand-secondary-foreground/50 hover:text-brand-secondary-foreground",
535
+ sub.isActive && "text-primary font-medium"
536
+ ),
537
+ children: [
538
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
539
+ import_lucide_react3.ChevronRight,
540
+ {
541
+ size: 11,
542
+ strokeWidth: 2,
543
+ className: cn(
544
+ "shrink-0",
545
+ sub.isActive ? "text-primary" : "text-brand-secondary-foreground/30"
546
+ )
547
+ }
548
+ ),
549
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "truncate", children: sub.title })
550
+ ]
551
+ },
552
+ sub.href
553
+ )) }) })
554
+ ] })
555
+ }
556
+ );
512
557
  }
513
558
  function SidebarNav({
514
559
  items,
@@ -523,97 +568,145 @@ function SidebarNav({
523
568
  className
524
569
  }) {
525
570
  const [userMenuOpen, setUserMenuOpen] = React3.useState(false);
526
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(TooltipProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
571
+ const navScrollRef = React3.useRef(null);
572
+ const expandedScrollRef = React3.useRef(0);
573
+ React3.useEffect(() => {
574
+ if (collapsed) setUserMenuOpen(false);
575
+ }, [collapsed]);
576
+ React3.useLayoutEffect(() => {
577
+ const nav = navScrollRef.current;
578
+ if (!nav) return;
579
+ if (!collapsed) {
580
+ nav.scrollTop = expandedScrollRef.current;
581
+ }
582
+ return () => {
583
+ if (!collapsed && nav) {
584
+ expandedScrollRef.current = nav.scrollTop;
585
+ }
586
+ };
587
+ }, [collapsed]);
588
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TooltipProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
527
589
  "nav",
528
590
  {
529
591
  "data-slot": "sidebar-nav",
530
592
  "data-collapsed": collapsed,
531
593
  className: cn(
532
- // Force dark-mode CSS variable resolution — sidebar is always dark-backgrounded
533
- // regardless of system theme, so semantic tokens (destructive, success, etc.)
534
- // must use their dark-mode values to maintain WCAG contrast.
535
- "dark flex h-full flex-col bg-brand-secondary text-brand-secondary-foreground",
594
+ "flex h-full flex-col bg-brand-secondary text-brand-secondary-foreground",
536
595
  "transition-all duration-200 ease-in-out",
537
596
  collapsed ? "w-14" : "w-[279px]",
538
597
  className
539
598
  ),
540
599
  children: [
541
- !collapsed && logo && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex items-center border-b border-white/15 px-5 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
542
- "img",
543
- {
544
- src: logo,
545
- alt: "Logo",
546
- className: "h-8 w-auto object-contain object-left",
547
- style: { filter: "brightness(0) invert(1)" }
548
- }
549
- ) }),
550
- collapsed && logoCollapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex items-center justify-center border-b border-white/15 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
551
- "img",
552
- {
553
- src: logoCollapsed,
554
- alt: "Logo",
555
- className: "h-8 w-8 object-contain",
556
- style: { filter: "brightness(0) invert(1)" }
557
- }
558
- ) }),
559
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "border-b border-white/15", children: [
560
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NavTooltip, { label: userName, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
561
- Button,
600
+ (logo || logoCollapsed) && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "relative flex items-center border-b border-white/15 py-4 overflow-hidden", children: [
601
+ logo && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
602
+ "img",
562
603
  {
563
- type: "button",
564
- variant: "ghost",
565
- onClick: () => !collapsed && setUserMenuOpen((prev) => !prev),
604
+ src: logo,
605
+ alt: "Logo",
566
606
  className: cn(
567
- "group h-auto w-full justify-start gap-3 px-5 py-5 text-base transition-colors",
568
- "text-brand-secondary-foreground hover:bg-white/10",
569
- collapsed && "justify-center px-2 py-4"
607
+ "h-8 w-auto object-contain object-left px-5 transition-opacity duration-200",
608
+ collapsed ? "opacity-0" : "opacity-100"
570
609
  ),
571
- children: [
572
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center font-semibold text-xs bg-primary text-primary-foreground", children: getInitials(userName) }),
573
- !collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
574
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "flex-1 truncate text-left font-medium text-brand-secondary-foreground", children: userName }),
575
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
576
- import_lucide_react2.ChevronDown,
577
- {
578
- className: cn(
579
- "shrink-0 text-brand-secondary-foreground/50 transition-transform duration-200",
580
- userMenuOpen && "rotate-180"
581
- ),
582
- size: 16,
583
- strokeWidth: 2
584
- }
585
- )
586
- ] })
587
- ]
610
+ style: { filter: "brightness(0) invert(1)" }
588
611
  }
589
- ) }),
590
- !collapsed && userMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "border-t border-white/15 bg-black/20", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
591
- Button,
612
+ ),
613
+ logoCollapsed && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
614
+ "img",
592
615
  {
593
- type: "button",
594
- variant: "ghost",
595
- onClick: onLogout,
616
+ src: logoCollapsed,
617
+ alt: "Logo",
596
618
  className: cn(
597
- "h-auto w-full justify-start gap-3 px-5 py-3 text-base",
598
- "text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground transition-colors"
619
+ "absolute inset-y-0 left-0 right-0 m-auto h-8 w-8 object-contain transition-opacity duration-200",
620
+ collapsed ? "opacity-100" : "opacity-0"
599
621
  ),
600
- children: [
601
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
602
- import_lucide_react2.LogOut,
603
- {
604
- size: 16,
605
- strokeWidth: 1.75,
606
- className: "shrink-0 text-destructive"
607
- }
608
- ),
609
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Logout" })
610
- ]
622
+ style: { filter: "brightness(0) invert(1)" }
623
+ }
624
+ )
625
+ ] }),
626
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "relative border-b border-white/15", children: [
627
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
628
+ "div",
629
+ {
630
+ className: cn(
631
+ collapsed ? "opacity-0 pointer-events-none" : "opacity-100"
632
+ ),
633
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
634
+ Accordion,
635
+ {
636
+ value: userMenuOpen ? ["user-menu"] : [],
637
+ onValueChange: (values) => setUserMenuOpen(values.length > 0),
638
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(AccordionItem, { className: "border-none", value: "user-menu", children: [
639
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_accordion2.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
640
+ import_accordion2.Accordion.Trigger,
641
+ {
642
+ className: cn(
643
+ "group flex h-auto w-full items-center justify-start gap-3 px-5 py-5 text-base transition-colors",
644
+ "text-brand-secondary-foreground hover:bg-white/10"
645
+ ),
646
+ children: [
647
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center font-semibold text-xs bg-primary text-primary-foreground", children: getInitials(userName) }),
648
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "flex-1 truncate text-left font-medium text-brand-secondary-foreground", children: userName }),
649
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
650
+ import_lucide_react3.ChevronDown,
651
+ {
652
+ className: "ml-auto shrink-0 text-brand-secondary-foreground/50 transition-transform duration-200 group-data-[panel-open]:rotate-180",
653
+ size: 16,
654
+ strokeWidth: 2
655
+ }
656
+ )
657
+ ]
658
+ }
659
+ ) }),
660
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AccordionContent, { className: "p-0 text-inherit", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "border-t border-white/15 bg-black/20", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
661
+ Button,
662
+ {
663
+ type: "button",
664
+ variant: "ghost",
665
+ onClick: onLogout,
666
+ className: cn(
667
+ "h-auto w-full justify-start gap-3 px-5 py-3 text-base",
668
+ "text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground transition-colors"
669
+ ),
670
+ children: [
671
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
672
+ import_lucide_react3.LogOut,
673
+ {
674
+ size: 16,
675
+ strokeWidth: 1.75,
676
+ className: "shrink-0 text-destructive"
677
+ }
678
+ ),
679
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: "Logout" })
680
+ ]
681
+ }
682
+ ) }) })
683
+ ] })
684
+ }
685
+ )
686
+ }
687
+ ),
688
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NavTooltip, { label: userName, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
689
+ "div",
690
+ {
691
+ className: cn(
692
+ "absolute inset-0 flex items-center justify-center transition-opacity duration-200",
693
+ collapsed ? "opacity-100" : "opacity-0 pointer-events-none"
694
+ ),
695
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center font-semibold text-xs bg-primary text-primary-foreground", children: getInitials(userName) })
611
696
  }
612
697
  ) })
613
698
  ] }),
614
- !collapsed && !!(metricsGroups == null ? void 0 : metricsGroups.length) && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { children: metricsGroups.map((group, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MetricsGroup, { group }, i)) }),
615
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex flex-col overflow-y-auto py-3", children: items.map(
616
- (item) => item.isCollapsible ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
699
+ !!(metricsGroups == null ? void 0 : metricsGroups.length) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
700
+ Accordion,
701
+ {
702
+ value: !collapsed ? ["metrics"] : [],
703
+ onValueChange: () => {
704
+ },
705
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AccordionItem, { className: "border-none", value: "metrics", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AccordionContent, { className: "p-0 text-inherit", children: metricsGroups.map((group, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MetricsGroup, { group }, i)) }) })
706
+ }
707
+ ),
708
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { ref: navScrollRef, className: "flex flex-col overflow-y-auto py-3", children: items.map(
709
+ (item) => item.isCollapsible ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
617
710
  CollapsibleNavItem,
618
711
  {
619
712
  item,
@@ -621,7 +714,7 @@ function SidebarNav({
621
714
  onNavigate
622
715
  },
623
716
  item.href
624
- ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
717
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
625
718
  SidebarNavItemView,
626
719
  {
627
720
  item,
@@ -631,39 +724,39 @@ function SidebarNav({
631
724
  item.href
632
725
  )
633
726
  ) }),
634
- onCollapsedChange && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mt-auto border-t border-white/15 bg-white/8", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
727
+ onCollapsedChange && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mt-auto border-t border-white/15 bg-white/8", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
635
728
  NavTooltip,
636
729
  {
637
730
  label: collapsed ? "Expand" : "Collapse",
638
731
  collapsed,
639
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
732
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
640
733
  Button,
641
734
  {
642
735
  type: "button",
643
736
  variant: "ghost",
644
737
  onClick: () => onCollapsedChange(!collapsed),
645
738
  className: cn(
646
- "h-auto w-full justify-start gap-3 px-3 py-3 transition-colors",
739
+ "h-12 w-full justify-start gap-3 px-3 py-3 transition-colors",
647
740
  "text-brand-secondary-foreground/80 hover:bg-white/10 hover:text-brand-secondary-foreground",
648
741
  collapsed && "justify-center px-2"
649
742
  ),
650
743
  children: [
651
- collapsed ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
652
- import_lucide_react2.PanelLeftOpen,
744
+ collapsed ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
745
+ import_lucide_react3.PanelLeftOpen,
653
746
  {
654
- size: 18,
747
+ size: 24,
655
748
  strokeWidth: 1.75,
656
749
  className: "shrink-0"
657
750
  }
658
- ) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
659
- import_lucide_react2.PanelLeftClose,
751
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
752
+ import_lucide_react3.PanelLeftClose,
660
753
  {
661
- size: 18,
754
+ size: 24,
662
755
  strokeWidth: 1.75,
663
756
  className: "shrink-0"
664
757
  }
665
758
  ),
666
- !collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm", children: "Collapse" })
759
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-sm", children: "Collapse" })
667
760
  ]
668
761
  }
669
762
  )