@tomny-dev/uzi 0.1.8 → 0.1.9-pr.2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -58,8 +58,12 @@ __export(index_exports, {
58
58
  Label: () => Label,
59
59
  Modal: () => Modal,
60
60
  ModalOverlay: () => ModalOverlay,
61
+ MultiSelect: () => MultiSelect,
61
62
  Pill: () => Pill,
63
+ Progress: () => Progress,
64
+ Select: () => Select,
62
65
  SidebarNav: () => SidebarNav,
66
+ Skeleton: () => Skeleton,
63
67
  ThemeProvider: () => ThemeProvider,
64
68
  ThemeToggleButton: () => ThemeToggleButton,
65
69
  ToastProvider: () => ToastProvider,
@@ -220,36 +224,20 @@ function Pill({
220
224
  }
221
225
 
222
226
  // src/components/modal/Modal.tsx
223
- var import_react = require("react");
227
+ var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"), 1);
224
228
  var import_jsx_runtime5 = require("react/jsx-runtime");
225
229
  function ModalOverlay({ open, onClose, className, children }) {
226
- const mouseDownOnBackdrop = (0, import_react.useRef)(false);
227
- (0, import_react.useEffect)(() => {
228
- if (!open) return;
229
- const handleKeyDown = (e) => {
230
- if (e.key === "Escape") {
231
- e.stopPropagation();
232
- onClose();
233
- }
234
- };
235
- window.addEventListener("keydown", handleKeyDown, true);
236
- return () => window.removeEventListener("keydown", handleKeyDown, true);
237
- }, [open, onClose]);
238
- if (!open) return null;
239
230
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
240
- "div",
231
+ DialogPrimitive.Root,
241
232
  {
242
- className: cx("backdrop", className),
243
- role: "dialog",
244
- "aria-modal": "true",
245
- onMouseDown: (e) => {
246
- mouseDownOnBackdrop.current = e.target === e.currentTarget;
233
+ open,
234
+ onOpenChange: (nextOpen) => {
235
+ if (!nextOpen) onClose();
247
236
  },
248
- onMouseUp: (e) => {
249
- if (mouseDownOnBackdrop.current && e.target === e.currentTarget) onClose();
250
- mouseDownOnBackdrop.current = false;
251
- },
252
- children
237
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "portalLayer", children: [
238
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogPrimitive.Overlay, { className: cx("backdrop", className) }),
239
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogPrimitive.Content, { className: "overlayContent", children })
240
+ ] }) })
253
241
  }
254
242
  );
255
243
  }
@@ -257,13 +245,13 @@ function Modal({ open, onClose, title, subtitle, size = "md", children, footer }
257
245
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ModalOverlay, { open, onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: cx("modal", `size-${size}`), children: [
258
246
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "header", children: [
259
247
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "titles", children: [
260
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "title", children: title }),
261
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "subtitle", children: subtitle })
248
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogPrimitive.Title, { className: "title", children: title }),
249
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogPrimitive.Description, { className: "subtitle", children: subtitle }) : null
262
250
  ] }),
263
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { className: "closeButton", onClick: onClose, "aria-label": "Close", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
251
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { className: "closeButton", "aria-label": "Close", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
264
252
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
265
253
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
266
- ] }) })
254
+ ] }) }) })
267
255
  ] }),
268
256
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "body", children }),
269
257
  footer && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "footer", children: footer })
@@ -283,7 +271,8 @@ function Alert({ tone, children, className }) {
283
271
  }
284
272
 
285
273
  // src/components/toast/ToastContext.tsx
286
- var import_react2 = require("react");
274
+ var import_react = require("react");
275
+ var ToastPrimitive = __toESM(require("@radix-ui/react-toast"), 1);
287
276
  var import_jsx_runtime7 = require("react/jsx-runtime");
288
277
  var DEFAULT_CONFIG = {
289
278
  position: "top-right",
@@ -292,17 +281,17 @@ var DEFAULT_CONFIG = {
292
281
  pauseOnHover: true,
293
282
  pauseOnFocusLoss: true
294
283
  };
295
- var ToastContext = (0, import_react2.createContext)(void 0);
284
+ var ToastContext = (0, import_react.createContext)(void 0);
296
285
  var toastIdCounter = 0;
297
286
  var generateToastId = () => `toast-${++toastIdCounter}-${Date.now()}`;
298
287
  function ToastProvider({
299
288
  children,
300
289
  config
301
290
  }) {
302
- const [toasts, setToasts] = (0, import_react2.useState)([]);
303
- const [isPaused, setIsPaused] = (0, import_react2.useState)(false);
304
- const merged = (0, import_react2.useMemo)(() => ({ ...DEFAULT_CONFIG, ...config }), [config]);
305
- const push = (0, import_react2.useCallback)(
291
+ const [toasts, setToasts] = (0, import_react.useState)([]);
292
+ const [isPaused, setIsPaused] = (0, import_react.useState)(false);
293
+ const merged = (0, import_react.useMemo)(() => ({ ...DEFAULT_CONFIG, ...config }), [config]);
294
+ const push = (0, import_react.useCallback)(
306
295
  (message, options = {}) => {
307
296
  const id = generateToastId();
308
297
  setToasts((prev) => {
@@ -324,37 +313,37 @@ function ToastProvider({
324
313
  },
325
314
  [merged.defaultDuration, merged.maxToasts]
326
315
  );
327
- const success = (0, import_react2.useCallback)(
316
+ const success = (0, import_react.useCallback)(
328
317
  (message, options) => push(message, { ...options, type: "success" }),
329
318
  [push]
330
319
  );
331
- const error = (0, import_react2.useCallback)(
320
+ const error = (0, import_react.useCallback)(
332
321
  (message, options) => push(message, { ...options, type: "error", duration: options?.duration ?? 6e3 }),
333
322
  [push]
334
323
  );
335
- const warning = (0, import_react2.useCallback)(
324
+ const warning = (0, import_react.useCallback)(
336
325
  (message, options) => push(message, { ...options, type: "warning" }),
337
326
  [push]
338
327
  );
339
- const info = (0, import_react2.useCallback)(
328
+ const info = (0, import_react.useCallback)(
340
329
  (message, options) => push(message, { ...options, type: "info" }),
341
330
  [push]
342
331
  );
343
- const dismiss = (0, import_react2.useCallback)((id) => {
332
+ const dismiss = (0, import_react.useCallback)((id) => {
344
333
  setToasts((prev) => prev.filter((t) => t.id !== id));
345
334
  }, []);
346
- const dismissAll = (0, import_react2.useCallback)(() => setToasts([]), []);
347
- (0, import_react2.useEffect)(() => {
335
+ const dismissAll = (0, import_react.useCallback)(() => setToasts([]), []);
336
+ (0, import_react.useEffect)(() => {
348
337
  if (!merged.pauseOnFocusLoss) return;
349
338
  const handleVisibility = () => setIsPaused(document.visibilityState !== "visible");
350
339
  document.addEventListener("visibilitychange", handleVisibility);
351
340
  return () => document.removeEventListener("visibilitychange", handleVisibility);
352
341
  }, [merged.pauseOnFocusLoss]);
353
- const value = (0, import_react2.useMemo)(
342
+ const value = (0, import_react.useMemo)(
354
343
  () => ({ toasts, push, success, error, warning, info, dismiss, dismissAll }),
355
344
  [toasts, push, success, error, warning, info, dismiss, dismissAll]
356
345
  );
357
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(ToastContext.Provider, { value, children: [
346
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(ToastPrimitive.Provider, { swipeDirection: "right", children: [
358
347
  children,
359
348
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
360
349
  ToastContainer,
@@ -367,10 +356,10 @@ function ToastProvider({
367
356
  onPauseChange: setIsPaused
368
357
  }
369
358
  )
370
- ] });
359
+ ] }) });
371
360
  }
372
361
  function useToast() {
373
- const ctx = (0, import_react2.useContext)(ToastContext);
362
+ const ctx = (0, import_react.useContext)(ToastContext);
374
363
  if (!ctx) throw new Error("useToast must be used within a ToastProvider");
375
364
  return ctx;
376
365
  }
@@ -399,26 +388,29 @@ function ToastContainer({
399
388
  return "topRight";
400
389
  }
401
390
  })();
402
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
403
- "div",
404
- {
405
- className: cx("stack", posClass),
406
- role: "presentation",
407
- onMouseEnter: () => pauseOnHover && onPauseChange(true),
408
- onMouseLeave: () => pauseOnHover && onPauseChange(false),
409
- children: toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastItem, { toast, isPaused, onDismiss }, toast.id))
410
- }
411
- );
391
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
392
+ toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastItem, { toast, isPaused, onDismiss }, toast.id)),
393
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
394
+ ToastPrimitive.Viewport,
395
+ {
396
+ className: cx("stack", posClass),
397
+ label: "Notifications",
398
+ onMouseEnter: () => pauseOnHover && onPauseChange(true),
399
+ onMouseLeave: () => pauseOnHover && onPauseChange(false)
400
+ }
401
+ )
402
+ ] });
412
403
  }
413
404
  function ToastItem({
414
405
  toast,
415
406
  isPaused,
416
407
  onDismiss
417
408
  }) {
418
- const [exiting, setExiting] = (0, import_react2.useState)(false);
419
- const timerRef = (0, import_react2.useRef)(null);
420
- const startRef = (0, import_react2.useRef)(0);
421
- const remainingRef = (0, import_react2.useRef)(toast.duration ?? 0);
409
+ const [open, setOpen] = (0, import_react.useState)(true);
410
+ const timerRef = (0, import_react.useRef)(null);
411
+ const startRef = (0, import_react.useRef)(0);
412
+ const remainingRef = (0, import_react.useRef)(toast.duration ?? 0);
413
+ const closingRef = (0, import_react.useRef)(false);
422
414
  const palette = getPalette(toast.type);
423
415
  const styleVars = {
424
416
  ["--toast-bg"]: palette.background,
@@ -435,12 +427,14 @@ function ToastItem({
435
427
  timerRef.current = null;
436
428
  }
437
429
  };
438
- const triggerDismiss = (0, import_react2.useCallback)(() => {
439
- setExiting(true);
430
+ const triggerDismiss = (0, import_react.useCallback)(() => {
431
+ if (closingRef.current) return;
432
+ closingRef.current = true;
433
+ setOpen(false);
440
434
  stopTimer();
441
435
  window.setTimeout(() => onDismiss(toast.id), 160);
442
436
  }, [onDismiss, toast.id]);
443
- const schedule = (0, import_react2.useCallback)(
437
+ const schedule = (0, import_react.useCallback)(
444
438
  (delay) => {
445
439
  if (!delay || delay <= 0) {
446
440
  triggerDismiss();
@@ -452,12 +446,12 @@ function ToastItem({
452
446
  },
453
447
  [triggerDismiss]
454
448
  );
455
- (0, import_react2.useEffect)(() => {
449
+ (0, import_react.useEffect)(() => {
456
450
  if (!toast.duration || toast.duration <= 0) return void 0;
457
451
  schedule(toast.duration);
458
452
  return stopTimer;
459
453
  }, [schedule, toast.duration]);
460
- (0, import_react2.useEffect)(() => {
454
+ (0, import_react.useEffect)(() => {
461
455
  if (!toast.duration || toast.duration <= 0) return;
462
456
  if (isPaused) {
463
457
  const elapsed = performance.now() - startRef.current;
@@ -468,42 +462,60 @@ function ToastItem({
468
462
  }
469
463
  }, [isPaused, schedule, toast.duration]);
470
464
  const icon = getIcon(toast.type);
471
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: cx("toast", exiting && "exit"), style: styleVars, role: "status", "aria-live": "polite", children: [
472
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "icon", "aria-hidden": true, children: icon }),
473
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "body", children: [
474
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "message", children: toast.message }),
475
- toast.action && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "actions", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
476
- "button",
477
- {
478
- type: "button",
479
- className: "actionButton",
480
- onClick: () => {
481
- toast.action?.onClick();
482
- triggerDismiss();
483
- },
484
- children: toast.action.label
485
- }
486
- ) })
487
- ] }),
488
- toast.dismissible !== false && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
489
- "button",
490
- {
491
- type: "button",
492
- className: "closeButton",
493
- onClick: triggerDismiss,
494
- "aria-label": "Dismiss notification",
495
- children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
496
- "path",
465
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
466
+ ToastPrimitive.Root,
467
+ {
468
+ open,
469
+ onOpenChange: (nextOpen) => {
470
+ if (!nextOpen) triggerDismiss();
471
+ },
472
+ duration: 2147483647,
473
+ className: "toast",
474
+ style: styleVars,
475
+ children: [
476
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "icon", "aria-hidden": true, children: icon }),
477
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "body", children: [
478
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastPrimitive.Description, { className: "message", children: toast.message }),
479
+ toast.action && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "actions", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
480
+ ToastPrimitive.Action,
481
+ {
482
+ asChild: true,
483
+ altText: toast.action.label,
484
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
485
+ "button",
486
+ {
487
+ type: "button",
488
+ className: "actionButton",
489
+ onClick: () => {
490
+ toast.action?.onClick();
491
+ triggerDismiss();
492
+ },
493
+ children: toast.action.label
494
+ }
495
+ )
496
+ }
497
+ ) })
498
+ ] }),
499
+ toast.dismissible !== false && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastPrimitive.Close, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
500
+ "button",
497
501
  {
498
- d: "M11 3L3 11M3 3l8 8",
499
- stroke: "currentColor",
500
- strokeWidth: "1.5",
501
- strokeLinecap: "round"
502
+ type: "button",
503
+ className: "closeButton",
504
+ "aria-label": "Dismiss notification",
505
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
506
+ "path",
507
+ {
508
+ d: "M11 3L3 11M3 3l8 8",
509
+ stroke: "currentColor",
510
+ strokeWidth: "1.5",
511
+ strokeLinecap: "round"
512
+ }
513
+ ) })
502
514
  }
503
515
  ) })
504
- }
505
- )
506
- ] });
516
+ ]
517
+ }
518
+ );
507
519
  }
508
520
  function getPalette(type) {
509
521
  switch (type) {
@@ -608,105 +620,376 @@ var Checkbox = React3.forwardRef(
608
620
  );
609
621
  Checkbox.displayName = "Checkbox";
610
622
 
611
- // src/components/dropdown/Dropdown.tsx
612
- var import_react3 = require("react");
623
+ // src/components/multi-select/MultiSelect.tsx
624
+ var React4 = __toESM(require("react"), 1);
625
+ var DropdownMenuPrimitive = __toESM(require("@radix-ui/react-dropdown-menu"), 1);
613
626
  var import_jsx_runtime11 = require("react/jsx-runtime");
614
- function Dropdown({
615
- options,
616
- value,
617
- onChange,
618
- placeholder = "All",
619
- className,
620
- allowClear = true,
621
- "aria-labelledby": ariaLabelledBy,
622
- "aria-label": ariaLabel
623
- }) {
624
- const [open, setOpen] = (0, import_react3.useState)(false);
625
- const ref = (0, import_react3.useRef)(null);
626
- const selected = options.find((o) => o.value === value);
627
- const isActive = allowClear && value !== "";
628
- (0, import_react3.useEffect)(() => {
629
- function handleClickOutside(e) {
630
- if (ref.current && !ref.current.contains(e.target)) {
631
- setOpen(false);
627
+ var MultiSelect = React4.forwardRef(
628
+ ({
629
+ options,
630
+ value,
631
+ onChange,
632
+ placeholder = "Select options",
633
+ fullWidth = true,
634
+ maxVisibleValues = 2,
635
+ className,
636
+ disabled = false,
637
+ name,
638
+ "aria-label": ariaLabel,
639
+ "aria-labelledby": ariaLabelledBy
640
+ }, ref) => {
641
+ const selectedSet = React4.useMemo(() => new Set(value), [value]);
642
+ const selectedOptions = React4.useMemo(
643
+ () => options.filter((opt) => selectedSet.has(opt.value)),
644
+ [options, selectedSet]
645
+ );
646
+ const toggleValue = React4.useCallback(
647
+ (nextValue) => {
648
+ if (selectedSet.has(nextValue)) {
649
+ onChange(value.filter((entry) => entry !== nextValue));
650
+ return;
651
+ }
652
+ onChange([...value, nextValue]);
653
+ },
654
+ [onChange, selectedSet, value]
655
+ );
656
+ const visibleCount = Math.max(1, maxVisibleValues);
657
+ const visibleOptions = selectedOptions.slice(0, visibleCount);
658
+ const overflowCount = Math.max(
659
+ 0,
660
+ selectedOptions.length - visibleOptions.length
661
+ );
662
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DropdownMenuPrimitive.Root, { modal: false, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
663
+ "div",
664
+ {
665
+ className: cx("wrapper", fullWidth && "wrapper-fullWidth", className),
666
+ children: [
667
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DropdownMenuPrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
668
+ "button",
669
+ {
670
+ ref,
671
+ type: "button",
672
+ className: cx(
673
+ "trigger",
674
+ selectedOptions.length > 0 && "trigger-hasValue"
675
+ ),
676
+ "aria-label": ariaLabel,
677
+ "aria-labelledby": ariaLabelledBy,
678
+ disabled,
679
+ children: [
680
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "value", children: selectedOptions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "placeholder", children: placeholder }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
681
+ visibleOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "chip", children: option.label }, option.value)),
682
+ overflowCount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "chip chip-summary", children: [
683
+ "+",
684
+ overflowCount
685
+ ] }) : null
686
+ ] }) }),
687
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "chevron", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
688
+ "svg",
689
+ {
690
+ viewBox: "0 0 10 10",
691
+ fill: "none",
692
+ xmlns: "http://www.w3.org/2000/svg",
693
+ width: "10",
694
+ height: "10",
695
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
696
+ "path",
697
+ {
698
+ d: "M2 3.5L5 6.5L8 3.5",
699
+ stroke: "currentColor",
700
+ strokeWidth: "1.5",
701
+ strokeLinecap: "round",
702
+ strokeLinejoin: "round"
703
+ }
704
+ )
705
+ }
706
+ ) })
707
+ ]
708
+ }
709
+ ) }),
710
+ name ? value.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("input", { type: "hidden", name, value: entry }, entry)) : null,
711
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
712
+ DropdownMenuPrimitive.Content,
713
+ {
714
+ className: "menu",
715
+ sideOffset: 4,
716
+ align: "start",
717
+ children: options.map((option) => {
718
+ const selected = selectedSet.has(option.value);
719
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
720
+ DropdownMenuPrimitive.CheckboxItem,
721
+ {
722
+ className: cx(
723
+ "option",
724
+ selected && "option-selected",
725
+ option.disabled && "option-disabled"
726
+ ),
727
+ checked: selected,
728
+ disabled: option.disabled,
729
+ onCheckedChange: () => toggleValue(option.value),
730
+ onSelect: (event) => event.preventDefault(),
731
+ children: [
732
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
733
+ "span",
734
+ {
735
+ className: cx(
736
+ "indicator",
737
+ selected && "indicator-selected",
738
+ option.disabled && "indicator-disabled"
739
+ ),
740
+ "aria-hidden": "true",
741
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DropdownMenuPrimitive.ItemIndicator, { forceMount: true, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
742
+ "svg",
743
+ {
744
+ viewBox: "0 0 16 16",
745
+ width: "16",
746
+ height: "16",
747
+ fill: "none",
748
+ xmlns: "http://www.w3.org/2000/svg",
749
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
750
+ "path",
751
+ {
752
+ d: "M3.5 8.5 6.5 11.5 12.5 4.5",
753
+ stroke: "currentColor",
754
+ strokeWidth: "1.8",
755
+ strokeLinecap: "round",
756
+ strokeLinejoin: "round"
757
+ }
758
+ )
759
+ }
760
+ ) })
761
+ }
762
+ ),
763
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "option-label", children: option.label })
764
+ ]
765
+ },
766
+ option.value
767
+ );
768
+ })
769
+ }
770
+ ) })
771
+ ]
632
772
  }
633
- }
634
- document.addEventListener("mousedown", handleClickOutside);
635
- return () => document.removeEventListener("mousedown", handleClickOutside);
636
- }, []);
637
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: cx("wrapper", className), ref, children: [
638
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
639
- "button",
773
+ ) });
774
+ }
775
+ );
776
+ MultiSelect.displayName = "MultiSelect";
777
+
778
+ // src/components/dropdown/Dropdown.tsx
779
+ var React6 = __toESM(require("react"), 1);
780
+
781
+ // src/components/select/Select.tsx
782
+ var React5 = __toESM(require("react"), 1);
783
+ var SelectPrimitive = __toESM(require("@radix-ui/react-select"), 1);
784
+ var import_jsx_runtime12 = require("react/jsx-runtime");
785
+ var EMPTY_OPTION_VALUE = "__uzi_select_empty__";
786
+ var Select = React5.forwardRef(
787
+ ({
788
+ options,
789
+ value,
790
+ onChange,
791
+ placeholder,
792
+ allowEmptyOption = false,
793
+ fullWidth = true,
794
+ className,
795
+ id,
796
+ name,
797
+ disabled,
798
+ required,
799
+ autoComplete,
800
+ form,
801
+ title,
802
+ "aria-label": ariaLabel,
803
+ "aria-labelledby": ariaLabelledBy,
804
+ onBlur,
805
+ onFocus
806
+ }, ref) => {
807
+ const internalValue = value === "" && allowEmptyOption ? EMPTY_OPTION_VALUE : value;
808
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: cx("wrapper", fullWidth && "wrapper-fullWidth", className), children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
809
+ SelectPrimitive.Root,
640
810
  {
641
- type: "button",
642
- className: cx("trigger", isActive && "trigger-active"),
643
- onClick: () => setOpen((o) => !o),
644
- "aria-labelledby": ariaLabelledBy,
645
- "aria-label": ariaLabel,
811
+ value: internalValue,
812
+ onValueChange: (nextValue) => onChange(nextValue === EMPTY_OPTION_VALUE ? "" : nextValue),
813
+ name,
814
+ disabled,
815
+ required,
816
+ autoComplete,
646
817
  children: [
647
- selected ? selected.label : placeholder,
648
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: cx("chevron", open && "chevron-open"), children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("svg", { viewBox: "0 0 10 10", fill: "none", xmlns: "http://www.w3.org/2000/svg", width: "10", height: "10", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("path", { d: "M2 3.5L5 6.5L8 3.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
818
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
819
+ SelectPrimitive.Trigger,
820
+ {
821
+ ref,
822
+ id,
823
+ className: "select",
824
+ form,
825
+ title,
826
+ "aria-label": ariaLabel,
827
+ "aria-labelledby": ariaLabelledBy,
828
+ onBlur,
829
+ onFocus,
830
+ children: [
831
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.Value, { placeholder }),
832
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.Icon, { className: "chevron", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
833
+ "svg",
834
+ {
835
+ viewBox: "0 0 10 10",
836
+ fill: "none",
837
+ xmlns: "http://www.w3.org/2000/svg",
838
+ width: "10",
839
+ height: "10",
840
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
841
+ "path",
842
+ {
843
+ d: "M2 3.5L5 6.5L8 3.5",
844
+ stroke: "currentColor",
845
+ strokeWidth: "1.5",
846
+ strokeLinecap: "round",
847
+ strokeLinejoin: "round"
848
+ }
849
+ )
850
+ }
851
+ ) })
852
+ ]
853
+ }
854
+ ),
855
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
856
+ SelectPrimitive.Content,
857
+ {
858
+ className: "content",
859
+ position: "popper",
860
+ sideOffset: 4,
861
+ align: "start",
862
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(SelectPrimitive.Viewport, { className: "viewport", children: [
863
+ placeholder && allowEmptyOption ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
864
+ SelectPrimitive.Item,
865
+ {
866
+ value: EMPTY_OPTION_VALUE,
867
+ className: "item",
868
+ children: [
869
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "indicator", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
870
+ "svg",
871
+ {
872
+ viewBox: "0 0 16 16",
873
+ width: "16",
874
+ height: "16",
875
+ "aria-hidden": "true",
876
+ className: "indicatorIcon",
877
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
878
+ "path",
879
+ {
880
+ d: "M3.5 8.5 6.5 11.5 12.5 4.5",
881
+ fill: "none",
882
+ stroke: "currentColor",
883
+ strokeWidth: "1.8",
884
+ strokeLinecap: "round",
885
+ strokeLinejoin: "round"
886
+ }
887
+ )
888
+ }
889
+ ) }) }),
890
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.ItemText, { children: placeholder })
891
+ ]
892
+ }
893
+ ) : null,
894
+ options.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
895
+ SelectPrimitive.Item,
896
+ {
897
+ value: opt.value,
898
+ disabled: opt.disabled,
899
+ className: "item",
900
+ children: [
901
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "indicator", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
902
+ "svg",
903
+ {
904
+ viewBox: "0 0 16 16",
905
+ width: "16",
906
+ height: "16",
907
+ "aria-hidden": "true",
908
+ className: "indicatorIcon",
909
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
910
+ "path",
911
+ {
912
+ d: "M3.5 8.5 6.5 11.5 12.5 4.5",
913
+ fill: "none",
914
+ stroke: "currentColor",
915
+ strokeWidth: "1.8",
916
+ strokeLinecap: "round",
917
+ strokeLinejoin: "round"
918
+ }
919
+ )
920
+ }
921
+ ) }) }),
922
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(SelectPrimitive.ItemText, { children: opt.label })
923
+ ]
924
+ },
925
+ opt.value
926
+ ))
927
+ ] })
928
+ }
929
+ ) })
649
930
  ]
650
931
  }
651
- ),
652
- open && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "menu", children: [
653
- allowClear && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
654
- "button",
655
- {
656
- type: "button",
657
- className: cx("option", value === "" && "option-selected"),
658
- onClick: () => {
659
- onChange("");
660
- setOpen(false);
661
- },
662
- children: placeholder
663
- }
664
- ),
665
- options.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
666
- "button",
667
- {
668
- type: "button",
669
- className: cx("option", value === opt.value && "option-selected"),
670
- onClick: () => {
671
- onChange(opt.value);
672
- setOpen(false);
673
- },
674
- children: opt.label
675
- },
676
- opt.value
677
- ))
678
- ] })
679
- ] });
680
- }
932
+ ) });
933
+ }
934
+ );
935
+ Select.displayName = "Select";
936
+
937
+ // src/components/dropdown/Dropdown.tsx
938
+ var import_jsx_runtime13 = require("react/jsx-runtime");
939
+ var Dropdown = React6.forwardRef(
940
+ ({
941
+ options,
942
+ value,
943
+ onChange,
944
+ placeholder = "All",
945
+ allowClear = true,
946
+ ...rest
947
+ }, ref) => {
948
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
949
+ Select,
950
+ {
951
+ ref,
952
+ options,
953
+ value,
954
+ onChange,
955
+ placeholder,
956
+ allowEmptyOption: allowClear,
957
+ fullWidth: false,
958
+ ...rest
959
+ }
960
+ );
961
+ }
962
+ );
963
+ Dropdown.displayName = "Dropdown";
681
964
 
682
965
  // src/components/dropdown-menu/DropdownMenu.tsx
683
- var DropdownMenuPrimitive = __toESM(require("@radix-ui/react-dropdown-menu"), 1);
684
- var import_jsx_runtime12 = require("react/jsx-runtime");
966
+ var DropdownMenuPrimitive2 = __toESM(require("@radix-ui/react-dropdown-menu"), 1);
967
+ var import_jsx_runtime14 = require("react/jsx-runtime");
685
968
  function DropdownMenu(props) {
686
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.Root, { ...props });
969
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.Root, { ...props });
687
970
  }
688
971
  function DropdownMenuTrigger(props) {
689
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.Trigger, { ...props });
972
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.Trigger, { ...props });
690
973
  }
691
974
  function DropdownMenuGroup(props) {
692
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.Group, { ...props });
975
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.Group, { ...props });
693
976
  }
694
977
  function DropdownMenuPortal(props) {
695
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.Portal, { ...props });
978
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.Portal, { ...props });
696
979
  }
697
980
  function DropdownMenuSub(props) {
698
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.Sub, { ...props });
981
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.Sub, { ...props });
699
982
  }
700
983
  function DropdownMenuRadioGroup(props) {
701
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.RadioGroup, { ...props });
984
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.RadioGroup, { ...props });
702
985
  }
703
986
  function DropdownMenuContent({
704
987
  className,
705
988
  sideOffset = 4,
706
989
  ...props
707
990
  }) {
708
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
709
- DropdownMenuPrimitive.Content,
991
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
992
+ DropdownMenuPrimitive2.Content,
710
993
  {
711
994
  sideOffset,
712
995
  className: cx("content", className),
@@ -720,8 +1003,8 @@ function DropdownMenuItem({
720
1003
  variant = "default",
721
1004
  ...props
722
1005
  }) {
723
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
724
- DropdownMenuPrimitive.Item,
1006
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1007
+ DropdownMenuPrimitive2.Item,
725
1008
  {
726
1009
  "data-inset": inset ? "true" : void 0,
727
1010
  className: cx(
@@ -738,13 +1021,13 @@ function DropdownMenuCheckboxItem({
738
1021
  children,
739
1022
  ...props
740
1023
  }) {
741
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
742
- DropdownMenuPrimitive.CheckboxItem,
1024
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1025
+ DropdownMenuPrimitive2.CheckboxItem,
743
1026
  {
744
1027
  className: cx("item", "insetItem", className),
745
1028
  ...props,
746
1029
  children: [
747
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "indicator", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1030
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "indicator", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
748
1031
  "svg",
749
1032
  {
750
1033
  viewBox: "0 0 16 16",
@@ -752,7 +1035,7 @@ function DropdownMenuCheckboxItem({
752
1035
  height: "16",
753
1036
  "aria-hidden": "true",
754
1037
  className: "indicatorIcon",
755
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1038
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
756
1039
  "path",
757
1040
  {
758
1041
  d: "M3.5 8.5 6.5 11.5 12.5 4.5",
@@ -775,13 +1058,13 @@ function DropdownMenuRadioItem({
775
1058
  children,
776
1059
  ...props
777
1060
  }) {
778
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
779
- DropdownMenuPrimitive.RadioItem,
1061
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1062
+ DropdownMenuPrimitive2.RadioItem,
780
1063
  {
781
1064
  className: cx("item", "insetItem", className),
782
1065
  ...props,
783
1066
  children: [
784
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "indicator", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "radioDot" }) }) }),
1067
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "indicator", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuPrimitive2.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "radioDot" }) }) }),
785
1068
  children
786
1069
  ]
787
1070
  }
@@ -792,8 +1075,8 @@ function DropdownMenuLabel({
792
1075
  inset,
793
1076
  ...props
794
1077
  }) {
795
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
796
- DropdownMenuPrimitive.Label,
1078
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1079
+ DropdownMenuPrimitive2.Label,
797
1080
  {
798
1081
  "data-inset": inset ? "true" : void 0,
799
1082
  className: cx("label", className),
@@ -805,8 +1088,8 @@ function DropdownMenuSeparator({
805
1088
  className,
806
1089
  ...props
807
1090
  }) {
808
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
809
- DropdownMenuPrimitive.Separator,
1091
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1092
+ DropdownMenuPrimitive2.Separator,
810
1093
  {
811
1094
  className: cx("separator", className),
812
1095
  ...props
@@ -819,15 +1102,15 @@ function DropdownMenuSubTrigger({
819
1102
  children,
820
1103
  ...props
821
1104
  }) {
822
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
823
- DropdownMenuPrimitive.SubTrigger,
1105
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1106
+ DropdownMenuPrimitive2.SubTrigger,
824
1107
  {
825
1108
  "data-inset": inset ? "true" : void 0,
826
1109
  className: cx("item", className),
827
1110
  ...props,
828
1111
  children: [
829
1112
  children,
830
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1113
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
831
1114
  "svg",
832
1115
  {
833
1116
  viewBox: "0 0 16 16",
@@ -835,7 +1118,7 @@ function DropdownMenuSubTrigger({
835
1118
  height: "16",
836
1119
  "aria-hidden": "true",
837
1120
  className: "chevron",
838
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1121
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
839
1122
  "path",
840
1123
  {
841
1124
  d: "M6 3.5 10.5 8 6 12.5",
@@ -856,8 +1139,8 @@ function DropdownMenuSubContent({
856
1139
  className,
857
1140
  ...props
858
1141
  }) {
859
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
860
- DropdownMenuPrimitive.SubContent,
1142
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1143
+ DropdownMenuPrimitive2.SubContent,
861
1144
  {
862
1145
  className: cx("content", className),
863
1146
  ...props
@@ -866,10 +1149,10 @@ function DropdownMenuSubContent({
866
1149
  }
867
1150
 
868
1151
  // src/components/app-shell/AppShell.tsx
869
- var import_react5 = require("react");
1152
+ var import_react3 = require("react");
870
1153
 
871
1154
  // src/theme/ThemeProvider.tsx
872
- var import_react4 = require("react");
1155
+ var import_react2 = require("react");
873
1156
 
874
1157
  // src/theme/constants.ts
875
1158
  var UZI_THEMES = ["light", "dark", "system"];
@@ -878,12 +1161,12 @@ var THEME_STORAGE_KEY = "uzi-theme";
878
1161
  var ACCENT_STORAGE_KEY = "uzi-accent";
879
1162
 
880
1163
  // src/theme/ThemeProvider.tsx
881
- var import_jsx_runtime13 = require("react/jsx-runtime");
1164
+ var import_jsx_runtime15 = require("react/jsx-runtime");
882
1165
  var THEME_STORAGE_KEY2 = THEME_STORAGE_KEY;
883
1166
  var ACCENT_STORAGE_KEY2 = ACCENT_STORAGE_KEY;
884
1167
  var THEME_ATTRIBUTE = "data-uzi-theme";
885
1168
  var ACCENT_ATTRIBUTE = "data-uzi-accent";
886
- var ThemeContext = (0, import_react4.createContext)(void 0);
1169
+ var ThemeContext = (0, import_react2.createContext)(void 0);
887
1170
  function isTheme(value) {
888
1171
  return UZI_THEMES.includes(value);
889
1172
  }
@@ -906,10 +1189,10 @@ function ThemeProvider({
906
1189
  accentStorageKey = ACCENT_STORAGE_KEY2,
907
1190
  disableStorage = false
908
1191
  }) {
909
- const [internalTheme, setInternalTheme] = (0, import_react4.useState)(defaultTheme);
910
- const [internalAccent, setInternalAccent] = (0, import_react4.useState)(defaultAccent);
911
- const [systemTheme, setSystemTheme] = (0, import_react4.useState)("light");
912
- (0, import_react4.useEffect)(() => {
1192
+ const [internalTheme, setInternalTheme] = (0, import_react2.useState)(defaultTheme);
1193
+ const [internalAccent, setInternalAccent] = (0, import_react2.useState)(defaultAccent);
1194
+ const [systemTheme, setSystemTheme] = (0, import_react2.useState)("light");
1195
+ (0, import_react2.useEffect)(() => {
913
1196
  setSystemTheme(getSystemTheme());
914
1197
  if (!disableStorage) {
915
1198
  const storedTheme = window.localStorage.getItem(storageKey);
@@ -923,7 +1206,7 @@ function ThemeProvider({
923
1206
  const currentTheme = isThemeControlled ? theme : internalTheme;
924
1207
  const currentAccent = isAccentControlled ? accent : internalAccent;
925
1208
  const resolvedTheme = currentTheme === "system" ? systemTheme : currentTheme;
926
- (0, import_react4.useEffect)(() => {
1209
+ (0, import_react2.useEffect)(() => {
927
1210
  if (typeof window === "undefined") return;
928
1211
  const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
929
1212
  const handleChange = () => setSystemTheme(mediaQuery.matches ? "dark" : "light");
@@ -931,7 +1214,7 @@ function ThemeProvider({
931
1214
  mediaQuery.addEventListener("change", handleChange);
932
1215
  return () => mediaQuery.removeEventListener("change", handleChange);
933
1216
  }, []);
934
- (0, import_react4.useEffect)(() => {
1217
+ (0, import_react2.useEffect)(() => {
935
1218
  if (typeof document === "undefined") return;
936
1219
  const root = document.documentElement;
937
1220
  root.setAttribute(THEME_ATTRIBUTE, resolvedTheme);
@@ -939,7 +1222,7 @@ function ThemeProvider({
939
1222
  root.style.colorScheme = resolvedTheme;
940
1223
  root.classList.toggle("dark", resolvedTheme === "dark");
941
1224
  }, [currentAccent, resolvedTheme]);
942
- const setTheme = (0, import_react4.useCallback)(
1225
+ const setTheme = (0, import_react2.useCallback)(
943
1226
  (nextTheme) => {
944
1227
  if (!isThemeControlled) setInternalTheme(nextTheme);
945
1228
  if (!disableStorage && typeof window !== "undefined") {
@@ -949,7 +1232,7 @@ function ThemeProvider({
949
1232
  },
950
1233
  [disableStorage, isThemeControlled, onThemeChange, storageKey]
951
1234
  );
952
- const setAccent = (0, import_react4.useCallback)(
1235
+ const setAccent = (0, import_react2.useCallback)(
953
1236
  (nextAccent) => {
954
1237
  if (!isAccentControlled) setInternalAccent(nextAccent);
955
1238
  if (!disableStorage && typeof window !== "undefined") {
@@ -959,10 +1242,10 @@ function ThemeProvider({
959
1242
  },
960
1243
  [accentStorageKey, disableStorage, isAccentControlled, onAccentChange]
961
1244
  );
962
- const toggleTheme = (0, import_react4.useCallback)(() => {
1245
+ const toggleTheme = (0, import_react2.useCallback)(() => {
963
1246
  setTheme(resolvedTheme === "dark" ? "light" : "dark");
964
1247
  }, [resolvedTheme, setTheme]);
965
- const value = (0, import_react4.useMemo)(
1248
+ const value = (0, import_react2.useMemo)(
966
1249
  () => ({
967
1250
  theme: currentTheme,
968
1251
  resolvedTheme,
@@ -973,18 +1256,18 @@ function ThemeProvider({
973
1256
  }),
974
1257
  [currentAccent, currentTheme, resolvedTheme, setAccent, setTheme, toggleTheme]
975
1258
  );
976
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ThemeContext.Provider, { value, children });
1259
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ThemeContext.Provider, { value, children });
977
1260
  }
978
1261
  function useTheme() {
979
- const context = (0, import_react4.useContext)(ThemeContext);
1262
+ const context = (0, import_react2.useContext)(ThemeContext);
980
1263
  if (!context) throw new Error("useTheme must be used within a ThemeProvider");
981
1264
  return context;
982
1265
  }
983
1266
 
984
1267
  // src/components/theme-toggle-button/ThemeToggleButton.tsx
985
- var import_jsx_runtime14 = require("react/jsx-runtime");
1268
+ var import_jsx_runtime16 = require("react/jsx-runtime");
986
1269
  function MoonIcon() {
987
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", width: "16", height: "16", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1270
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", width: "16", height: "16", fill: "none", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
988
1271
  "path",
989
1272
  {
990
1273
  d: "M20 15.2A8.5 8.5 0 0 1 8.8 4 9 9 0 1 0 20 15.2Z",
@@ -996,9 +1279,9 @@ function MoonIcon() {
996
1279
  ) });
997
1280
  }
998
1281
  function SunIcon() {
999
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", width: "16", height: "16", fill: "none", children: [
1000
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("circle", { cx: "12", cy: "12", r: "4", stroke: "currentColor", strokeWidth: "1.8" }),
1001
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1282
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", width: "16", height: "16", fill: "none", children: [
1283
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("circle", { cx: "12", cy: "12", r: "4", stroke: "currentColor", strokeWidth: "1.8" }),
1284
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1002
1285
  "path",
1003
1286
  {
1004
1287
  d: "M12 2.75v2.5M12 18.75v2.5M21.25 12h-2.5M5.25 12h-2.5M18.54 5.46l-1.77 1.77M7.23 16.77l-1.77 1.77M18.54 18.54l-1.77-1.77M7.23 7.23 5.46 5.46",
@@ -1019,7 +1302,7 @@ function ThemeToggleButton({
1019
1302
  }) {
1020
1303
  const { resolvedTheme, toggleTheme } = useTheme();
1021
1304
  const nextThemeLabel = resolvedTheme === "dark" ? lightLabel : darkLabel;
1022
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1305
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1023
1306
  Button,
1024
1307
  {
1025
1308
  type: "button",
@@ -1034,15 +1317,15 @@ function ThemeToggleButton({
1034
1317
  },
1035
1318
  ...rest,
1036
1319
  children: [
1037
- resolvedTheme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SunIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MoonIcon, {}),
1038
- showLabel && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: nextThemeLabel })
1320
+ resolvedTheme === "dark" ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(SunIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(MoonIcon, {}),
1321
+ showLabel && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: nextThemeLabel })
1039
1322
  ]
1040
1323
  }
1041
1324
  );
1042
1325
  }
1043
1326
 
1044
1327
  // src/components/top-bar/TopBar.tsx
1045
- var import_jsx_runtime15 = require("react/jsx-runtime");
1328
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1046
1329
  function TopBar({
1047
1330
  leading,
1048
1331
  brand,
@@ -1061,24 +1344,24 @@ function TopBar({
1061
1344
  ...rest
1062
1345
  }) {
1063
1346
  const shouldStick = isSticky ?? sticky;
1064
- const brandNode = !brand ? null : brandHref ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: brandHref, className: "topBarBrand", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "topBarBrandContent", children: brand }) }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "topBarBrand", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "topBarBrandContent", children: brand }) });
1065
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1347
+ const brandNode = !brand ? null : brandHref ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("a", { href: brandHref, className: "topBarBrand", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "topBarBrandContent", children: brand }) }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "topBarBrand", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "topBarBrandContent", children: brand }) });
1348
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1066
1349
  "header",
1067
1350
  {
1068
1351
  className: cx("topBar", !shouldStick && "topBarStatic", className),
1069
1352
  ...rest,
1070
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: cx("topBarInner", innerClassName), children: [
1071
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "topBarStart", children: [
1353
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: cx("topBarInner", innerClassName), children: [
1354
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "topBarStart", children: [
1072
1355
  leading,
1073
1356
  brandingLocation === "left" && brandNode,
1074
1357
  start
1075
1358
  ] }),
1076
- brandNode && brandingLocation === "center" || center || children ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "topBarCenter", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "topBarCenterGroup", children: [
1359
+ brandNode && brandingLocation === "center" || center || children ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "topBarCenter", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "topBarCenterGroup", children: [
1077
1360
  brandingLocation === "center" && brandNode,
1078
1361
  center ?? children
1079
1362
  ] }) }) : null,
1080
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "topBarActions", children: [
1081
- showThemeToggle && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ThemeToggleButton, { ...themeToggleProps }),
1363
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "topBarActions", children: [
1364
+ showThemeToggle && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ThemeToggleButton, { ...themeToggleProps }),
1082
1365
  actions
1083
1366
  ] })
1084
1367
  ] })
@@ -1087,7 +1370,7 @@ function TopBar({
1087
1370
  }
1088
1371
 
1089
1372
  // src/components/app-shell/AppShell.tsx
1090
- var import_jsx_runtime16 = require("react/jsx-runtime");
1373
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1091
1374
  var DESKTOP_BREAKPOINT = 960;
1092
1375
  function getIsDesktop() {
1093
1376
  if (typeof window === "undefined") return false;
@@ -1112,16 +1395,16 @@ function AppShell({
1112
1395
  hamburgerLabel = "Toggle navigation",
1113
1396
  onSidebarToggle
1114
1397
  }) {
1115
- const [isDesktop, setIsDesktop] = (0, import_react5.useState)(false);
1116
- const [sidebarOpen, setSidebarOpen] = (0, import_react5.useState)(false);
1117
- const [transitionsReady, setTransitionsReady] = (0, import_react5.useState)(false);
1118
- const prevIsDesktopRef = (0, import_react5.useRef)(false);
1119
- const closeKeyRef = (0, import_react5.useRef)(closeSidebarOnChangeKey);
1120
- const sidebarRef = (0, import_react5.useRef)(null);
1121
- const hamburgerRef = (0, import_react5.useRef)(null);
1122
- const mainRef = (0, import_react5.useRef)(null);
1123
- const sidebarId = (0, import_react5.useId)();
1124
- (0, import_react5.useEffect)(() => {
1398
+ const [isDesktop, setIsDesktop] = (0, import_react3.useState)(false);
1399
+ const [sidebarOpen, setSidebarOpen] = (0, import_react3.useState)(false);
1400
+ const [transitionsReady, setTransitionsReady] = (0, import_react3.useState)(false);
1401
+ const prevIsDesktopRef = (0, import_react3.useRef)(false);
1402
+ const closeKeyRef = (0, import_react3.useRef)(closeSidebarOnChangeKey);
1403
+ const sidebarRef = (0, import_react3.useRef)(null);
1404
+ const hamburgerRef = (0, import_react3.useRef)(null);
1405
+ const mainRef = (0, import_react3.useRef)(null);
1406
+ const sidebarId = (0, import_react3.useId)();
1407
+ (0, import_react3.useEffect)(() => {
1125
1408
  const desktop = getIsDesktop();
1126
1409
  setIsDesktop(desktop);
1127
1410
  setSidebarOpen(desktop);
@@ -1143,7 +1426,7 @@ function AppShell({
1143
1426
  window.removeEventListener("resize", handleResize);
1144
1427
  };
1145
1428
  }, []);
1146
- (0, import_react5.useEffect)(() => {
1429
+ (0, import_react3.useEffect)(() => {
1147
1430
  if (isDesktop || !sidebarOpen) return;
1148
1431
  const mainElement = mainRef.current;
1149
1432
  const closeSidebar = () => setSidebarOpen(false);
@@ -1168,13 +1451,13 @@ function AppShell({
1168
1451
  document.removeEventListener("touchmove", closeSidebar);
1169
1452
  };
1170
1453
  }, [sidebarOpen, isDesktop]);
1171
- (0, import_react5.useEffect)(() => {
1454
+ (0, import_react3.useEffect)(() => {
1172
1455
  if (!isDesktop && closeKeyRef.current !== closeSidebarOnChangeKey) {
1173
1456
  setSidebarOpen(false);
1174
1457
  }
1175
1458
  closeKeyRef.current = closeSidebarOnChangeKey;
1176
1459
  }, [closeSidebarOnChangeKey, isDesktop]);
1177
- (0, import_react5.useEffect)(() => {
1460
+ (0, import_react3.useEffect)(() => {
1178
1461
  onSidebarToggle?.(sidebarOpen);
1179
1462
  }, [sidebarOpen, onSidebarToggle]);
1180
1463
  const toggleSidebar = () => setSidebarOpen((open) => !open);
@@ -1187,7 +1470,7 @@ function AppShell({
1187
1470
  className
1188
1471
  );
1189
1472
  const sidebarClasses = cx("appShellSidebar", sidebarOpen && "appShellSidebarOpen", sidebarClassName);
1190
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1473
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1191
1474
  "div",
1192
1475
  {
1193
1476
  className: shellClasses,
@@ -1196,11 +1479,11 @@ function AppShell({
1196
1479
  "data-desktop": isDesktop ? "true" : "false",
1197
1480
  "data-sidebar-open": sidebarOpen ? "true" : "false",
1198
1481
  children: [
1199
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1482
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1200
1483
  TopBar,
1201
1484
  {
1202
1485
  className: cx("appShellTopbar", topbarClassName),
1203
- leading: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1486
+ leading: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1204
1487
  "button",
1205
1488
  {
1206
1489
  ref: hamburgerRef,
@@ -1210,7 +1493,7 @@ function AppShell({
1210
1493
  "aria-label": hamburgerLabel,
1211
1494
  "aria-expanded": sidebarOpen,
1212
1495
  "aria-controls": sidebarId,
1213
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { d: "M3 6h18M3 12h18M3 18h18", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" }) })
1496
+ children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { d: "M3 6h18M3 12h18M3 18h18", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" }) })
1214
1497
  }
1215
1498
  ),
1216
1499
  brand,
@@ -1222,16 +1505,16 @@ function AppShell({
1222
1505
  themeToggleProps
1223
1506
  }
1224
1507
  ),
1225
- !isDesktop && sidebarOpen && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "appShellBackdrop", onClick: () => setSidebarOpen(false), onTouchStart: () => setSidebarOpen(false), "aria-hidden": "true" }),
1226
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("aside", { ref: sidebarRef, id: sidebarId, className: sidebarClasses, "aria-label": "Sidebar navigation", children: sidebar }),
1227
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("main", { ref: mainRef, className: cx("appShellMain", mainClassName), children })
1508
+ !isDesktop && sidebarOpen && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "appShellBackdrop", onClick: () => setSidebarOpen(false), onTouchStart: () => setSidebarOpen(false), "aria-hidden": "true" }),
1509
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("aside", { ref: sidebarRef, id: sidebarId, className: sidebarClasses, "aria-label": "Sidebar navigation", children: sidebar }),
1510
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("main", { ref: mainRef, className: cx("appShellMain", mainClassName), children })
1228
1511
  ]
1229
1512
  }
1230
1513
  );
1231
1514
  }
1232
1515
 
1233
1516
  // src/components/sidebar-nav/SidebarNav.tsx
1234
- var import_jsx_runtime17 = require("react/jsx-runtime");
1517
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1235
1518
  var defaultIsActive = (item, path) => {
1236
1519
  if (item.active !== void 0) return item.active;
1237
1520
  if (!item.href) return false;
@@ -1258,21 +1541,21 @@ function SidebarNav({
1258
1541
  const style = iconSize !== void 0 ? {
1259
1542
  ["--sidebar-nav-icon-size"]: typeof iconSize === "number" ? `${iconSize}px` : iconSize
1260
1543
  } : void 0;
1261
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1544
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1262
1545
  "nav",
1263
1546
  {
1264
1547
  className: cx("uziSidebarNav", collapsed && "uziSidebarNavCollapsed", className),
1265
1548
  "aria-label": ariaLabel,
1266
1549
  style,
1267
1550
  children: [
1268
- header ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "uziSidebarNavHeader", children: header }) : null,
1269
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "uziSidebarNavSections", children: resolvedSections.map((section, sectionIndex) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1551
+ header ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "uziSidebarNavHeader", children: header }) : null,
1552
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "uziSidebarNavSections", children: resolvedSections.map((section, sectionIndex) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1270
1553
  "div",
1271
1554
  {
1272
1555
  className: cx("uziSidebarNavSection", sectionClassName),
1273
1556
  children: [
1274
- section.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "uziSidebarNavSectionLabel", children: section.label }) : null,
1275
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "uziSidebarNavSectionItems", children: section.items.map((item, itemIndex) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1557
+ section.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "uziSidebarNavSectionLabel", children: section.label }) : null,
1558
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "uziSidebarNavSectionItems", children: section.items.map((item, itemIndex) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1276
1559
  SidebarNavEntry,
1277
1560
  {
1278
1561
  item,
@@ -1287,7 +1570,7 @@ function SidebarNav({
1287
1570
  },
1288
1571
  section.id ?? `section-${sectionIndex}`
1289
1572
  )) }),
1290
- footer ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "uziSidebarNavFooter", children: footer }) : null
1573
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "uziSidebarNavFooter", children: footer }) : null
1291
1574
  ]
1292
1575
  }
1293
1576
  );
@@ -1308,14 +1591,14 @@ function SidebarNavEntry({
1308
1591
  item.disabled && "uziSidebarNavItemDisabled",
1309
1592
  itemClassName
1310
1593
  );
1311
- const content = /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
1312
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "uziSidebarNavIcon", children: item.icon }),
1313
- !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "uziSidebarNavItemBody", children: [
1314
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "uziSidebarNavLabelRow", children: [
1315
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "uziSidebarNavLabel", children: item.label }),
1316
- item.badge && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "uziSidebarNavBadge", children: item.badge })
1594
+ const content = /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
1595
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "uziSidebarNavIcon", children: item.icon }),
1596
+ !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "uziSidebarNavItemBody", children: [
1597
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "uziSidebarNavLabelRow", children: [
1598
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "uziSidebarNavLabel", children: item.label }),
1599
+ item.badge && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "uziSidebarNavBadge", children: item.badge })
1317
1600
  ] }),
1318
- item.description ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "uziSidebarNavDescription", children: item.description }) : null
1601
+ item.description ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "uziSidebarNavDescription", children: item.description }) : null
1319
1602
  ] }) : null
1320
1603
  ] });
1321
1604
  const handleClick = () => {
@@ -1324,7 +1607,7 @@ function SidebarNavEntry({
1324
1607
  onItemClick?.(item);
1325
1608
  };
1326
1609
  if (!item.href) {
1327
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1610
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1328
1611
  "button",
1329
1612
  {
1330
1613
  type: "button",
@@ -1339,7 +1622,7 @@ function SidebarNavEntry({
1339
1622
  );
1340
1623
  }
1341
1624
  if (item.disabled) {
1342
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1625
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1343
1626
  "div",
1344
1627
  {
1345
1628
  className: classes,
@@ -1350,7 +1633,7 @@ function SidebarNavEntry({
1350
1633
  }
1351
1634
  );
1352
1635
  }
1353
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1636
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1354
1637
  "a",
1355
1638
  {
1356
1639
  className: classes,
@@ -1364,6 +1647,58 @@ function SidebarNavEntry({
1364
1647
  }
1365
1648
  );
1366
1649
  }
1650
+
1651
+ // src/components/skeleton/Skeleton.tsx
1652
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1653
+ function Skeleton({
1654
+ width,
1655
+ height,
1656
+ radius = "md",
1657
+ className,
1658
+ style,
1659
+ ...rest
1660
+ }) {
1661
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1662
+ "div",
1663
+ {
1664
+ className: cx("skeleton", `radius-${radius}`, className),
1665
+ style: { width, height, ...style },
1666
+ "aria-hidden": "true",
1667
+ ...rest
1668
+ }
1669
+ );
1670
+ }
1671
+
1672
+ // src/components/progress/Progress.tsx
1673
+ var import_jsx_runtime21 = require("react/jsx-runtime");
1674
+ function Progress({
1675
+ value,
1676
+ tone = "default",
1677
+ className,
1678
+ "aria-label": ariaLabel,
1679
+ ...rest
1680
+ }) {
1681
+ const clamped = Math.max(0, Math.min(100, value));
1682
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1683
+ "div",
1684
+ {
1685
+ className: cx("track", className),
1686
+ role: "progressbar",
1687
+ "aria-valuenow": clamped,
1688
+ "aria-valuemin": 0,
1689
+ "aria-valuemax": 100,
1690
+ "aria-label": ariaLabel,
1691
+ ...rest,
1692
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1693
+ "div",
1694
+ {
1695
+ className: cx("fill", `tone-${tone}`),
1696
+ style: { width: `${clamped}%` }
1697
+ }
1698
+ )
1699
+ }
1700
+ );
1701
+ }
1367
1702
  // Annotate the CommonJS export names for ESM import in node:
1368
1703
  0 && (module.exports = {
1369
1704
  Alert,
@@ -1393,8 +1728,12 @@ function SidebarNavEntry({
1393
1728
  Label,
1394
1729
  Modal,
1395
1730
  ModalOverlay,
1731
+ MultiSelect,
1396
1732
  Pill,
1733
+ Progress,
1734
+ Select,
1397
1735
  SidebarNav,
1736
+ Skeleton,
1398
1737
  ThemeProvider,
1399
1738
  ThemeToggleButton,
1400
1739
  ToastProvider,