@geomak/ui 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkZS3HB5YJ_cjs = require('./chunk-ZS3HB5YJ.cjs');
3
+ var chunkRLL7ES4F_cjs = require('./chunk-RLL7ES4F.cjs');
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
  var React9 = require('react');
6
6
  var Dialog = require('@radix-ui/react-dialog');
@@ -234,8 +234,45 @@ function IconButton({
234
234
  }
235
235
  );
236
236
  }
237
+ var VARIANT_CLASSES = {
238
+ primary: [
239
+ "bg-accent text-white",
240
+ "hover:bg-accent-hover",
241
+ "active:bg-accent",
242
+ "disabled:bg-roman-silver disabled:text-white/70 disabled:cursor-not-allowed",
243
+ "focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2"
244
+ ].join(" "),
245
+ secondary: [
246
+ "bg-transparent border border-accent text-accent",
247
+ "hover:bg-accent hover:text-white",
248
+ "active:bg-accent-hover active:text-white",
249
+ "disabled:border-roman-silver disabled:text-roman-silver disabled:cursor-not-allowed",
250
+ "focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2"
251
+ ].join(" "),
252
+ ghost: [
253
+ "bg-transparent text-foreground-secondary",
254
+ "hover:bg-ice dark:hover:bg-oxford-blue-700 hover:text-foreground",
255
+ "active:bg-ice-dark dark:active:bg-independence",
256
+ "disabled:text-roman-silver disabled:cursor-not-allowed",
257
+ "focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2"
258
+ ].join(" "),
259
+ danger: [
260
+ "bg-status-error text-white",
261
+ "hover:opacity-90",
262
+ "active:opacity-100",
263
+ "disabled:opacity-50 disabled:cursor-not-allowed",
264
+ "focus-visible:ring-2 focus-visible:ring-status-error focus-visible:ring-offset-2"
265
+ ].join(" ")
266
+ };
267
+ var SIZE_CLASSES = {
268
+ sm: "h-7 px-3 text-xs gap-1 rounded-md",
269
+ md: "h-9 px-4 text-sm gap-1.5 rounded-lg",
270
+ lg: "h-11 px-5 text-sm gap-2 rounded-xl"
271
+ };
237
272
  function Button({
238
273
  content,
274
+ variant = "primary",
275
+ size = "md",
239
276
  buttonType = "button",
240
277
  loading,
241
278
  disabled,
@@ -249,26 +286,33 @@ function Button({
249
286
  onClick,
250
287
  disabled: disabled || loading,
251
288
  type: buttonType,
252
- className: "bg-usafa-blue w-60 h-9 outline-offset-2 mt-5 rounded-lg disabled:bg-roman-silver disabled:cursor-not-allowed transition-all duration-300 hover:bg-true-blue active:bg-usafa-blue flex justify-center gap-1 items-center text-white",
253
- style: style ?? {},
289
+ style,
290
+ className: [
291
+ // Base — layout, transitions, focus reset
292
+ "inline-flex items-center justify-center font-medium",
293
+ "outline-none transition-colors duration-150 select-none",
294
+ "whitespace-nowrap",
295
+ SIZE_CLASSES[size],
296
+ VARIANT_CLASSES[variant]
297
+ ].join(" "),
254
298
  children: [
255
299
  loading ? /* @__PURE__ */ jsxRuntime.jsx(
256
300
  "svg",
257
301
  {
258
- xmlns: "http://www.w3.org/2000/svg",
259
302
  viewBox: "0 0 24 24",
260
- fill: "#fff",
261
- className: "w-6 h-6 animate-spin",
303
+ fill: "currentColor",
304
+ className: "w-4 h-4 animate-spin flex-shrink-0",
305
+ "aria-hidden": "true",
262
306
  children: /* @__PURE__ */ jsxRuntime.jsx(
263
307
  "path",
264
308
  {
265
309
  fillRule: "evenodd",
266
- d: "M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z",
267
- clipRule: "evenodd"
310
+ clipRule: "evenodd",
311
+ d: "M4.755 10.059a7.5 7.5 0 0112.548-3.364l1.903 1.903h-3.183a.75.75 0 100 1.5h4.992a.75.75 0 00.75-.75V4.356a.75.75 0 00-1.5 0v3.18l-1.9-1.9A9 9 0 003.306 9.67a.75.75 0 101.45.388zm15.408 3.352a.75.75 0 00-.919.53 7.5 7.5 0 01-12.548 3.364l-1.902-1.903h3.183a.75.75 0 000-1.5H2.984a.75.75 0 00-.75.75v4.992a.75.75 0 001.5 0v-3.18l1.9 1.9a9 9 0 0015.059-4.035.75.75 0 00-.53-.918z"
268
312
  }
269
313
  )
270
314
  }
271
- ) : icon ? icon : null,
315
+ ) : icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", "aria-hidden": "true", children: icon }) : null,
272
316
  content
273
317
  ]
274
318
  }
@@ -423,23 +467,49 @@ function Drawer({
423
467
  ) }) })
424
468
  ] }) });
425
469
  }
470
+ var ANIMATION = {
471
+ top: "data-[state=delayed-open]:animate-tooltip-in-top",
472
+ bottom: "data-[state=delayed-open]:animate-tooltip-in-bottom",
473
+ left: "data-[state=delayed-open]:animate-tooltip-in-left",
474
+ right: "data-[state=delayed-open]:animate-tooltip-in-right"
475
+ };
426
476
  function Tooltip({
427
477
  children,
428
478
  title,
429
- placement = "left",
430
- delayDuration = 400
479
+ placement = "top",
480
+ delayDuration = 300,
481
+ sideOffset = 8
431
482
  }) {
432
483
  return /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Provider, { delayDuration, children: /* @__PURE__ */ jsxRuntime.jsxs(TooltipPrimitive__namespace.Root, { children: [
433
- /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-max w-max", children }) }),
484
+ /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex", children }) }),
434
485
  /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(
435
486
  TooltipPrimitive__namespace.Content,
436
487
  {
437
488
  side: placement,
438
- sideOffset: 8,
439
- className: "pointer-events-none z-[500000000] rounded-lg bg-prussian-blue dark:bg-rich-black-fogra px-2 py-1.5 text-white text-sm w-max max-w-xs animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
489
+ sideOffset,
490
+ className: [
491
+ // Layout + typography
492
+ "pointer-events-none z-[500000] max-w-[220px] px-2.5 py-1.5",
493
+ "text-xs font-medium leading-snug text-white",
494
+ // Background + border — slightly translucent for depth
495
+ "bg-foreground/95 rounded-md border border-white/5",
496
+ // Shadow
497
+ "shadow-md",
498
+ // Out animation (always the same — just fade)
499
+ "data-[state=closed]:animate-tooltip-out",
500
+ // In animation — direction-aware
501
+ ANIMATION[placement]
502
+ ].join(" "),
440
503
  children: [
441
504
  title,
442
- /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Arrow, { className: "fill-prussian-blue dark:fill-rich-black-fogra" })
505
+ /* @__PURE__ */ jsxRuntime.jsx(
506
+ TooltipPrimitive__namespace.Arrow,
507
+ {
508
+ width: 10,
509
+ height: 5,
510
+ className: "fill-foreground/95"
511
+ }
512
+ )
443
513
  ]
444
514
  }
445
515
  ) })
@@ -498,7 +568,7 @@ function Tabs({
498
568
  onClick: toPreviousTab,
499
569
  "aria-label": "Previous tab",
500
570
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence rotate-180 flex-shrink-0",
501
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-6 w-6 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
571
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-6 w-6 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
502
572
  }
503
573
  ),
504
574
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -523,7 +593,7 @@ function Tabs({
523
593
  onTabClose?.(tab.key);
524
594
  },
525
595
  className: "flex-shrink-0 rounded hover:bg-ice-dark dark:hover:bg-independence p-0.5 transition-colors",
526
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 5L5 15M5 5l10 10", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: "dark:stroke-white" }) })
596
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 5L5 15M5 5l10 10", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", className: "dark:stroke-white" }) })
527
597
  }
528
598
  )
529
599
  ]
@@ -539,7 +609,7 @@ function Tabs({
539
609
  onClick: toNextTab,
540
610
  "aria-label": "Next tab",
541
611
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence flex-shrink-0",
542
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-6 w-6 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
612
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-6 w-6 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
543
613
  }
544
614
  )
545
615
  ] }),
@@ -691,71 +761,151 @@ var NotificationContext = React9.createContext({
691
761
  open: () => void 0,
692
762
  close: () => void 0
693
763
  });
694
- var typeClass = {
695
- info: "bg-info",
696
- success: "bg-success",
697
- warning: "bg-warning",
698
- danger: "bg-error"
764
+ var TYPE_BG = {
765
+ info: "bg-status-info",
766
+ success: "bg-status-success",
767
+ warning: "bg-status-warning",
768
+ danger: "bg-status-error"
769
+ };
770
+ var VIEWPORT_CLASSES = {
771
+ "top-right": "fixed top-14 right-0 flex flex-col items-end",
772
+ "top-left": "fixed top-14 left-0 flex flex-col items-start",
773
+ "top-center": "fixed top-14 left-1/2 flex flex-col items-center -translate-x-1/2",
774
+ "bottom-right": "fixed bottom-4 right-0 flex flex-col-reverse items-end",
775
+ "bottom-left": "fixed bottom-4 left-0 flex flex-col-reverse items-start",
776
+ "bottom-center": "fixed bottom-4 left-1/2 flex flex-col-reverse items-center -translate-x-1/2"
699
777
  };
778
+ function getInitialMotion(pos, reduced) {
779
+ if (reduced) return { opacity: 0, x: 0, y: 0, scale: 1 };
780
+ const right = pos.endsWith("right");
781
+ const left = pos.endsWith("left");
782
+ const center = pos.endsWith("center");
783
+ const bottom = pos.startsWith("bottom");
784
+ return {
785
+ opacity: 0,
786
+ x: right ? 40 : left ? -40 : 0,
787
+ y: center ? bottom ? 12 : -12 : 0,
788
+ scale: center ? 0.96 : 1
789
+ };
790
+ }
700
791
  function TypeIcon({ type }) {
701
792
  if (type === "success") {
702
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "28", height: "28", viewBox: "0 0 28 28", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
703
- "path",
704
- {
705
- fillRule: "evenodd",
706
- clipRule: "evenodd",
707
- d: "M14 0.25C6.40625 0.25 0.25 6.40625 0.25 14C0.25 21.5937 6.40625 27.75 14 27.75C21.5937 27.75 27.75 21.5937 27.75 14C27.75 6.40625 21.5937 0.25 14 0.25ZM19.96 11.675C20.0697 11.5496 20.1533 11.4034 20.2057 11.2452C20.2582 11.087 20.2784 10.9199 20.2653 10.7537C20.2522 10.5876 20.206 10.4257 20.1295 10.2777C20.0529 10.1296 19.9475 9.99838 19.8194 9.89168C19.6914 9.78497 19.5433 9.70495 19.3839 9.65633C19.2244 9.6077 19.0569 9.59145 18.8911 9.60853C18.7253 9.62562 18.5646 9.67568 18.4184 9.75579C18.2723 9.8359 18.1436 9.94443 18.04 10.075L12.665 16.5237L9.88375 13.7412C9.648 13.5136 9.33224 13.3876 9.0045 13.3904C8.67675 13.3933 8.36324 13.5247 8.13148 13.7565C7.89972 13.9882 7.76825 14.3018 7.76541 14.6295C7.76256 14.9572 7.88855 15.273 8.11625 15.5087L11.8662 19.2587C11.9891 19.3815 12.1361 19.4773 12.298 19.5401C12.4599 19.6028 12.6331 19.6312 12.8066 19.6233C12.98 19.6154 13.15 19.5715 13.3055 19.4943C13.4611 19.4171 13.5988 19.3084 13.71 19.175L19.96 11.675Z",
708
- fill: "#fff"
709
- }
710
- ) });
793
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) });
711
794
  }
712
795
  if (type === "info") {
713
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#fff", className: "w-7 h-7", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 01.67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 11-.671-1.34l.041-.022zM12 9a.75.75 0 100-1.5.75.75 0 000 1.5z", clipRule: "evenodd" }) });
796
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
797
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
798
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
799
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
800
+ ] });
714
801
  }
715
802
  if (type === "warning") {
716
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#fff", className: "w-7 h-7", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z", clipRule: "evenodd" }) });
803
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
804
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z" }),
805
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
806
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
807
+ ] });
717
808
  }
718
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#fff", className: "w-7 h-7", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm11.378-3.917c-.89-.777-2.366-.777-3.255 0a.75.75 0 01-.988-1.129c1.454-1.272 3.776-1.272 5.23 0 1.513 1.324 1.513 3.518 0 4.842a3.75 3.75 0 01-.837.552c-.676.328-1.028.774-1.028 1.152v.75a.75.75 0 01-1.5 0v-.75c0-1.279 1.06-2.107 1.875-2.502.182-.088.351-.199.503-.331.83-.727.83-1.857 0-2.584zM12 18a.75.75 0 100-1.5.75.75 0 000 1.5z", clipRule: "evenodd" }) });
809
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
810
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
811
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
812
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
813
+ ] });
814
+ }
815
+ function NotificationItem({
816
+ n,
817
+ pos,
818
+ onClose,
819
+ reduced
820
+ }) {
821
+ const initial = getInitialMotion(pos, reduced);
822
+ const center = pos.endsWith("center");
823
+ return /* @__PURE__ */ jsxRuntime.jsx(
824
+ framerMotion.motion.div,
825
+ {
826
+ layout: true,
827
+ initial,
828
+ animate: { opacity: 1, x: 0, y: 0, scale: 1 },
829
+ exit: { ...initial, opacity: 0 },
830
+ transition: reduced ? { duration: 0 } : {
831
+ opacity: { duration: 0.14 },
832
+ x: { type: "tween", duration: 0.22, ease: [0.16, 1, 0.3, 1] },
833
+ y: { type: "tween", duration: 0.22, ease: [0.16, 1, 0.3, 1] },
834
+ scale: { type: "tween", duration: 0.22, ease: [0.16, 1, 0.3, 1] },
835
+ layout: { duration: 0.18 }
836
+ },
837
+ children: /* @__PURE__ */ jsxRuntime.jsx(
838
+ Toast__namespace.Root,
839
+ {
840
+ open: true,
841
+ duration: n.duration,
842
+ onOpenChange: (o) => {
843
+ if (!o) onClose(n.id);
844
+ },
845
+ className: [
846
+ "w-[300px] rounded-md shadow-lg overflow-hidden",
847
+ center ? "mx-auto" : "",
848
+ "focus:outline-none",
849
+ TYPE_BG[n.type ?? "info"]
850
+ ].join(" "),
851
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3 p-3 pr-2.5", children: [
852
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 flex-shrink-0 text-white/90", children: /* @__PURE__ */ jsxRuntime.jsx(TypeIcon, { type: n.type ?? "info" }) }),
853
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
854
+ /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Title, { className: "text-sm font-semibold text-white leading-snug", children: n.title }),
855
+ n.description && /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Description, { className: "mt-0.5 text-xs text-white/75 leading-relaxed", children: n.description })
856
+ ] }),
857
+ /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Action, { asChild: true, altText: "Close", children: /* @__PURE__ */ jsxRuntime.jsx(
858
+ "button",
859
+ {
860
+ "aria-label": "Close",
861
+ onClick: () => onClose(n.id),
862
+ className: "flex-shrink-0 mt-0.5 rounded p-1 text-white/60 hover:text-white hover:bg-white/15 transition-colors duration-100 focus:outline-none focus-visible:ring-1 focus-visible:ring-white/50",
863
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 3L3 9M3 3l6 6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) })
864
+ }
865
+ ) })
866
+ ] })
867
+ }
868
+ )
869
+ }
870
+ );
719
871
  }
720
- function NotificationProvider({ children }) {
872
+ function NotificationProvider({
873
+ children,
874
+ position = "top-right"
875
+ }) {
721
876
  const [notifications, setNotifications] = React9.useState([]);
877
+ const reduced = framerMotion.useReducedMotion();
722
878
  const open = (payload) => {
723
- setNotifications((prev) => [...prev, { duration: 4e3, ...payload, id: Date.now() + Math.random() }]);
879
+ setNotifications((prev) => [
880
+ ...prev,
881
+ { duration: 4e3, ...payload, id: Date.now() + Math.random() }
882
+ ]);
724
883
  };
725
884
  const close = (id) => {
726
885
  setNotifications((prev) => prev.filter((n) => n.id !== id));
727
886
  };
728
- return /* @__PURE__ */ jsxRuntime.jsx(NotificationContext.Provider, { value: { open, close }, children: /* @__PURE__ */ jsxRuntime.jsxs(Toast__namespace.Provider, { swipeDirection: "right", children: [
887
+ return /* @__PURE__ */ jsxRuntime.jsx(NotificationContext.Provider, { value: { open, close }, children: /* @__PURE__ */ jsxRuntime.jsxs(Toast__namespace.Provider, { swipeDirection: position.endsWith("right") ? "right" : position.endsWith("left") ? "left" : "up", children: [
729
888
  children,
730
- notifications.map((n) => /* @__PURE__ */ jsxRuntime.jsxs(
731
- Toast__namespace.Root,
889
+ /* @__PURE__ */ jsxRuntime.jsx(
890
+ Toast__namespace.Viewport,
732
891
  {
733
- open: true,
734
- duration: n.duration,
735
- onOpenChange: (o) => {
736
- if (!o) close(n.id);
737
- },
738
- className: `rounded-lg shadow-md p-2 w-[300px] text-white ${typeClass[n.type ?? "info"]} data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=open]:slide-in-from-right-full data-[state=closed]:slide-out-to-right-full`,
739
- children: [
740
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3 border-b border-white pb-1", children: [
741
- /* @__PURE__ */ jsxRuntime.jsx(TypeIcon, { type: n.type ?? "info" }),
742
- /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Title, { className: "text-center font-bold text-lg flex-1", children: n.title }),
743
- /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Action, { asChild: true, altText: "Close", children: /* @__PURE__ */ jsxRuntime.jsx(
744
- "button",
745
- {
746
- "aria-label": "Close notification",
747
- onClick: () => close(n.id),
748
- className: "cursor-pointer rounded p-0.5 hover:bg-white/20 transition-colors",
749
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 5L5 15M5 5l10 10", stroke: "#fff", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
750
- }
751
- ) })
752
- ] }),
753
- n.description && /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Description, { className: "text-center mt-1 text-sm", children: n.description })
754
- ]
755
- },
756
- n.id
757
- )),
758
- /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Viewport, { className: "fixed top-[50px] right-0 flex flex-col gap-2 w-[350px] z-[500000] p-4 outline-none" })
892
+ asChild: true,
893
+ className: [
894
+ VIEWPORT_CLASSES[position],
895
+ "z-[500000] gap-2 w-[332px] p-4 outline-none"
896
+ ].join(" "),
897
+ children: /* @__PURE__ */ jsxRuntime.jsx("ul", { children: /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, children: notifications.map((n) => /* @__PURE__ */ jsxRuntime.jsx(
898
+ NotificationItem,
899
+ {
900
+ n,
901
+ pos: position,
902
+ onClose: close,
903
+ reduced
904
+ },
905
+ n.id
906
+ )) }) })
907
+ }
908
+ )
759
909
  ] }) });
760
910
  }
761
911
  function useNotification() {
@@ -1002,7 +1152,7 @@ function CatalogCarousel({ items, buttonText, onOpen }) {
1002
1152
  onClick: previousApp,
1003
1153
  "aria-label": "Previous",
1004
1154
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence rotate-180",
1005
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-10 w-10 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
1155
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-10 w-10 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
1006
1156
  }
1007
1157
  ),
1008
1158
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex", children: indexPool.map((index, id) => {
@@ -1039,7 +1189,7 @@ function CatalogCarousel({ items, buttonText, onOpen }) {
1039
1189
  onClick: nextApp,
1040
1190
  "aria-label": "Next",
1041
1191
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence",
1042
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-10 w-10 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
1192
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-10 w-10 dark:stroke-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
1043
1193
  }
1044
1194
  )
1045
1195
  ] }) });
@@ -1169,7 +1319,7 @@ function ContextMenu({ items, position, visible, onClose }) {
1169
1319
  item.icon,
1170
1320
  item.value
1171
1321
  ] }),
1172
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none", children: item.children && /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) }) })
1322
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none", children: item.children && /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) }) })
1173
1323
  ]
1174
1324
  },
1175
1325
  item.key
@@ -1300,7 +1450,7 @@ var SearchInput = React9__default.default.forwardRef(function SearchInput2({
1300
1450
  placeholder: placeholder ?? ""
1301
1451
  }
1302
1452
  ),
1303
- /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], className: "w-6 h-6", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z", clipRule: "evenodd" }) })
1453
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], className: "w-6 h-6", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z", clipRule: "evenodd" }) })
1304
1454
  ] })
1305
1455
  ]
1306
1456
  }
@@ -1411,7 +1561,7 @@ function Dropdown({
1411
1561
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(DropdownPill, { value: innerItems.find((it) => it.key === value)?.label })
1412
1562
  }
1413
1563
  ),
1414
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `transition-transform duration-300 mr-2 ${open ? "rotate-180" : "rotate-0"}`, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) })
1564
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `transition-transform duration-300 mr-2 ${open ? "rotate-180" : "rotate-0"}`, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) })
1415
1565
  ]
1416
1566
  }
1417
1567
  ) }),
@@ -1453,7 +1603,7 @@ function Dropdown({
1453
1603
  "path",
1454
1604
  {
1455
1605
  d: "M4 10l4.5 4.5L16 6",
1456
- stroke: hoveredItem === item.key ? "#fff" : chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"],
1606
+ stroke: hoveredItem === item.key ? "#fff" : chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"],
1457
1607
  strokeWidth: "2",
1458
1608
  strokeLinecap: "round",
1459
1609
  strokeLinejoin: "round"
@@ -1541,7 +1691,7 @@ function TableBody({
1541
1691
  onClick: () => toggleRow(row.key),
1542
1692
  className: `p-2 cursor-pointer origin-center transition-all duration-200 ${visibleRows[row.key]?.visible ? "rotate-180" : "rotate-0"}`,
1543
1693
  children: expandRow.expandIcon ?? /* PlusCircle */
1544
- /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], className: "w-5 h-5 dark:fill-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 9a.75.75 0 00-1.5 0v2.25H9a.75.75 0 000 1.5h2.25V15a.75.75 0 001.5 0v-2.25H15a.75.75 0 000-1.5h-2.25V9z", clipRule: "evenodd" }) })
1694
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], className: "w-5 h-5 dark:fill-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM12.75 9a.75.75 0 00-1.5 0v2.25H9a.75.75 0 000 1.5h2.25V15a.75.75 0 001.5 0v-2.25H15a.75.75 0 000-1.5h-2.25V9z", clipRule: "evenodd" }) })
1545
1695
  }
1546
1696
  ) }),
1547
1697
  columns.map((col, index) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -1594,8 +1744,8 @@ function Pagination({
1594
1744
  const navBtn = (icon, disabled, onClick) => /* @__PURE__ */ jsxRuntime.jsx(IconButton, { disabled, onClick, icon });
1595
1745
  const chevronRight = (color) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "h-5 w-5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
1596
1746
  const doubleChevronRight = (color) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "h-5 w-5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) });
1597
- const disabledColor = chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"];
1598
- const enabledColor = chunkZS3HB5YJ_cjs.colors_default.PALETTE.white;
1747
+ const disabledColor = chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"];
1748
+ const enabledColor = chunkRLL7ES4F_cjs.colors_default.PALETTE.white;
1599
1749
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2 items-center justify-end pt-2", children: [
1600
1750
  navBtn(
1601
1751
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rotate-180 inline-flex", children: doubleChevronRight(activePage === 0 ? disabledColor : enabledColor) }),
@@ -1732,29 +1882,319 @@ function Table({
1732
1882
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: footer })
1733
1883
  ] });
1734
1884
  }
1735
- function Switch({ checked, onChange }) {
1885
+ function ThemeSwitch({ checked, onChange, label = "Toggle dark mode" }) {
1736
1886
  const id = React9.useId();
1737
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative bottom-5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: id, className: "flex items-center cursor-pointer mr-12 select-none", children: /* @__PURE__ */ jsxRuntime.jsx(
1887
+ return /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: id, className: "flex items-center gap-2 cursor-pointer select-none", children: /* @__PURE__ */ jsxRuntime.jsx(
1738
1888
  SwitchPrimitive__namespace.Root,
1739
1889
  {
1740
1890
  id,
1741
1891
  checked,
1742
1892
  onCheckedChange: (c) => onChange({ target: { checked: c } }),
1743
- className: "relative inline-flex h-6 w-14 items-center rounded-full bg-prussian-blue dark:bg-white transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-usafa-blue",
1893
+ "aria-label": label,
1894
+ className: [
1895
+ "relative inline-flex h-6 w-11 items-center rounded-full",
1896
+ "transition-colors duration-200",
1897
+ "bg-foreground-secondary data-[state=checked]:bg-accent",
1898
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2"
1899
+ ].join(" "),
1744
1900
  children: /* @__PURE__ */ jsxRuntime.jsx(
1745
1901
  SwitchPrimitive__namespace.Thumb,
1746
1902
  {
1747
- className: "pointer-events-none inline-flex h-8 w-8 rounded-full shadow transition-transform duration-200 data-[state=checked]:translate-x-[22px] data-[state=unchecked]:translate-x-[-4px]",
1748
- children: /* @__PURE__ */ jsxRuntime.jsx(
1749
- "div",
1903
+ className: [
1904
+ "pointer-events-none block h-5 w-5 rounded-full shadow-sm",
1905
+ "transition-transform duration-200",
1906
+ "data-[state=checked]:translate-x-[22px]",
1907
+ "data-[state=unchecked]:translate-x-[2px]",
1908
+ // Moon icon (dark mode indicator) when checked, sun when unchecked
1909
+ checked ? "bg-oxford-blue-900" : "bg-white"
1910
+ ].join(" "),
1911
+ children: checked ? (
1912
+ // Moon
1913
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 16 16", fill: "currentColor", className: "w-3 h-3 m-1 text-manatee", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z" }) })
1914
+ ) : (
1915
+ // Sun
1916
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 16 16", fill: "currentColor", className: "w-3 h-3 m-1 text-usafa-blue", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707z" }) })
1917
+ )
1918
+ }
1919
+ )
1920
+ }
1921
+ ) });
1922
+ }
1923
+ function TopBar({
1924
+ brand,
1925
+ center,
1926
+ actions,
1927
+ height = 56,
1928
+ className = ""
1929
+ }) {
1930
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1931
+ "header",
1932
+ {
1933
+ className: [
1934
+ "sticky top-0 z-[100]",
1935
+ "flex items-center justify-between gap-4",
1936
+ "border-b border-border bg-surface",
1937
+ "px-4 md:px-6",
1938
+ className
1939
+ ].join(" "),
1940
+ style: {
1941
+ height,
1942
+ // Expose as CSS var so consumers can write:
1943
+ // padding-top: calc(var(--topbar-height) + 1rem)
1944
+ ["--topbar-height"]: `${height}px`
1945
+ },
1946
+ children: [
1947
+ brand !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 flex-shrink-0", children: brand }) : (
1948
+ // Reserve leading space even when brand is null so center stays centred
1949
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": "true", className: "flex-shrink-0 w-0" })
1950
+ ),
1951
+ center !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 items-center justify-center min-w-0", children: center }),
1952
+ actions !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 flex-shrink-0", children: actions })
1953
+ ]
1954
+ }
1955
+ );
1956
+ }
1957
+ function NavItem({
1958
+ item,
1959
+ isExpanded
1960
+ }) {
1961
+ const btn = /* @__PURE__ */ jsxRuntime.jsxs(
1962
+ "button",
1963
+ {
1964
+ type: "button",
1965
+ onClick: item.onClick,
1966
+ className: [
1967
+ "group relative flex w-full items-center gap-2.5 rounded-md",
1968
+ "px-2.5 py-2 transition-colors duration-100",
1969
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-inset",
1970
+ item.isActive ? "bg-accent/10 text-accent" : "text-foreground-secondary hover:bg-surface-raised hover:text-foreground"
1971
+ ].join(" "),
1972
+ children: [
1973
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative flex h-5 w-5 flex-shrink-0 items-center justify-center", children: [
1974
+ item.icon,
1975
+ item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -right-1 -top-1 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-status-error text-[9px] font-bold text-white leading-none", children: item.badge > 99 ? "99+" : item.badge })
1976
+ ] }),
1977
+ isExpanded && /* @__PURE__ */ jsxRuntime.jsx(
1978
+ framerMotion.motion.span,
1979
+ {
1980
+ initial: false,
1981
+ animate: { opacity: 1 },
1982
+ className: "truncate text-sm font-medium",
1983
+ children: item.label
1984
+ }
1985
+ ),
1986
+ item.isActive && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-y-0 left-0 w-[3px] rounded-r-full bg-accent" })
1987
+ ]
1988
+ }
1989
+ );
1990
+ if (isExpanded) return btn;
1991
+ return /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { title: item.label, placement: "right", delayDuration: 200, children: btn });
1992
+ }
1993
+ function Sidebar({
1994
+ sections,
1995
+ isExpanded,
1996
+ onToggle,
1997
+ expandedWidth = 220,
1998
+ collapsedWidth = 52,
1999
+ footer
2000
+ }) {
2001
+ return /* @__PURE__ */ jsxRuntime.jsx(TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ jsxRuntime.jsxs(
2002
+ framerMotion.motion.aside,
2003
+ {
2004
+ initial: false,
2005
+ animate: { width: isExpanded ? expandedWidth : collapsedWidth },
2006
+ transition: { type: "tween", duration: 0.22, ease: [0.16, 1, 0.3, 1] },
2007
+ className: "relative flex h-full flex-col border-r border-border bg-surface overflow-hidden flex-shrink-0",
2008
+ children: [
2009
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: [
2010
+ "flex h-14 flex-shrink-0 items-center border-b border-border",
2011
+ isExpanded ? "justify-between px-3" : "justify-center px-1.5"
2012
+ ].join(" "), children: [
2013
+ isExpanded && /* @__PURE__ */ jsxRuntime.jsx(
2014
+ framerMotion.motion.span,
1750
2015
  {
1751
- className: `rounded-full w-8 h-8 ${checked ? "bg-success" : "bg-error"} transition-colors duration-200`
2016
+ initial: { opacity: 0 },
2017
+ animate: { opacity: 1 },
2018
+ transition: { delay: 0.08 },
2019
+ className: "text-xs font-semibold uppercase tracking-widest text-foreground-muted select-none",
2020
+ children: "Menu"
1752
2021
  }
1753
- )
2022
+ ),
2023
+ /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { title: isExpanded ? "Collapse menu" : "Expand menu", placement: "right", delayDuration: 500, children: /* @__PURE__ */ jsxRuntime.jsx(
2024
+ "button",
2025
+ {
2026
+ type: "button",
2027
+ onClick: onToggle,
2028
+ "aria-label": isExpanded ? "Collapse sidebar" : "Expand sidebar",
2029
+ className: "flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md text-foreground-muted hover:bg-surface-raised hover:text-foreground transition-colors duration-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent",
2030
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2031
+ framerMotion.motion.svg,
2032
+ {
2033
+ viewBox: "0 0 20 20",
2034
+ fill: "none",
2035
+ stroke: "currentColor",
2036
+ strokeWidth: "1.8",
2037
+ strokeLinecap: "round",
2038
+ strokeLinejoin: "round",
2039
+ className: "h-4 w-4",
2040
+ animate: { rotate: isExpanded ? 0 : 180 },
2041
+ transition: { type: "tween", duration: 0.22 },
2042
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M13 5l-5 5 5 5" })
2043
+ }
2044
+ )
2045
+ }
2046
+ ) })
2047
+ ] }),
2048
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "flex-1 overflow-y-auto overflow-x-hidden py-2 px-1.5 space-y-0.5", children: sections.map((section, si) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: si > 0 ? "pt-3" : "", children: [
2049
+ section.title && isExpanded && /* @__PURE__ */ jsxRuntime.jsx(
2050
+ framerMotion.motion.p,
2051
+ {
2052
+ initial: { opacity: 0 },
2053
+ animate: { opacity: 1 },
2054
+ transition: { delay: 0.06 },
2055
+ className: "px-2.5 pb-1 text-[10px] font-semibold uppercase tracking-widest text-foreground-muted select-none",
2056
+ children: section.title
2057
+ }
2058
+ ),
2059
+ section.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(NavItem, { item, isExpanded }, item.key))
2060
+ ] }, section.key)) }),
2061
+ footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: [
2062
+ "flex flex-shrink-0 items-center border-t border-border py-2",
2063
+ isExpanded ? "px-3 gap-2" : "justify-center px-1.5"
2064
+ ].join(" "), children: footer })
2065
+ ]
2066
+ }
2067
+ ) });
2068
+ }
2069
+ function AppShell({
2070
+ topBar,
2071
+ sidebarSections = [],
2072
+ sidebarExpandedWidth = 220,
2073
+ sidebarCollapsedWidth = 52,
2074
+ sidebarDefaultExpanded = false,
2075
+ sidebarFooter,
2076
+ children,
2077
+ className = ""
2078
+ }) {
2079
+ const [expanded, setExpanded] = React9.useState(sidebarDefaultExpanded);
2080
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `flex flex-col h-screen bg-background ${className}`, children: [
2081
+ topBar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0 z-[200]", children: topBar }),
2082
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 overflow-hidden", children: [
2083
+ sidebarSections.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
2084
+ Sidebar,
2085
+ {
2086
+ sections: sidebarSections,
2087
+ isExpanded: expanded,
2088
+ onToggle: () => setExpanded((e) => !e),
2089
+ expandedWidth: sidebarExpandedWidth,
2090
+ collapsedWidth: sidebarCollapsedWidth,
2091
+ footer: sidebarFooter
2092
+ }
2093
+ ),
2094
+ /* @__PURE__ */ jsxRuntime.jsx(
2095
+ framerMotion.motion.main,
2096
+ {
2097
+ className: "flex-1 overflow-y-auto overflow-x-hidden",
2098
+ animate: { marginLeft: 0 },
2099
+ transition: { type: "tween", duration: 0.22, ease: [0.16, 1, 0.3, 1] },
2100
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full p-6", children })
1754
2101
  }
1755
2102
  )
2103
+ ] })
2104
+ ] });
2105
+ }
2106
+ var SHIMMER = [
2107
+ "animate-shimmer rounded-sm",
2108
+ "bg-[length:400%_100%]",
2109
+ "bg-gradient-to-r",
2110
+ "from-border via-border-strong/40 to-border"
2111
+ ].join(" ");
2112
+ function SkeletonBox({ width, height = 16, radius, className = "", style }) {
2113
+ return /* @__PURE__ */ jsxRuntime.jsx(
2114
+ "span",
2115
+ {
2116
+ role: "presentation",
2117
+ "aria-hidden": "true",
2118
+ className: `block ${SHIMMER} ${className}`,
2119
+ style: {
2120
+ width: width ?? "100%",
2121
+ height,
2122
+ borderRadius: radius ?? "var(--radius-md)",
2123
+ ...style
2124
+ }
1756
2125
  }
1757
- ) }) });
2126
+ );
2127
+ }
2128
+ function SkeletonText({
2129
+ lines = 3,
2130
+ lastLineWidth = 60,
2131
+ lineHeight = 14,
2132
+ gap = 8,
2133
+ className = "",
2134
+ style
2135
+ }) {
2136
+ return /* @__PURE__ */ jsxRuntime.jsx(
2137
+ "div",
2138
+ {
2139
+ role: "presentation",
2140
+ "aria-hidden": "true",
2141
+ className: `flex flex-col ${className}`,
2142
+ style: { gap, ...style },
2143
+ children: Array.from({ length: lines }).map((_, i) => {
2144
+ const isLast = i === lines - 1;
2145
+ const width = isLast && lines > 1 ? `${lastLineWidth}%` : "100%";
2146
+ return /* @__PURE__ */ jsxRuntime.jsx(
2147
+ "span",
2148
+ {
2149
+ className: `block ${SHIMMER}`,
2150
+ style: { height: lineHeight, width, borderRadius: "var(--radius-sm)" }
2151
+ },
2152
+ i
2153
+ );
2154
+ })
2155
+ }
2156
+ );
2157
+ }
2158
+ function SkeletonCircle({ size = 40, className = "", style }) {
2159
+ return /* @__PURE__ */ jsxRuntime.jsx(
2160
+ "span",
2161
+ {
2162
+ role: "presentation",
2163
+ "aria-hidden": "true",
2164
+ className: `block flex-shrink-0 ${SHIMMER} ${className}`,
2165
+ style: {
2166
+ width: size,
2167
+ height: size,
2168
+ borderRadius: "50%",
2169
+ ...style
2170
+ }
2171
+ }
2172
+ );
2173
+ }
2174
+ function SkeletonCard({ hasAvatar = true, lines = 3, className = "", style }) {
2175
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2176
+ "div",
2177
+ {
2178
+ role: "presentation",
2179
+ "aria-hidden": "true",
2180
+ className: `rounded-lg border border-border bg-surface p-4 ${className}`,
2181
+ style,
2182
+ children: [
2183
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 mb-4", children: [
2184
+ hasAvatar && /* @__PURE__ */ jsxRuntime.jsx(SkeletonCircle, { size: 36 }),
2185
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex flex-col gap-2", children: [
2186
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonBox, { height: 12, width: "55%" }),
2187
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonBox, { height: 10, width: "35%" })
2188
+ ] })
2189
+ ] }),
2190
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonText, { lines, lastLineWidth: 55 }),
2191
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex gap-2", children: [
2192
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonBox, { height: 28, width: 72 }),
2193
+ /* @__PURE__ */ jsxRuntime.jsx(SkeletonBox, { height: 28, width: 56 })
2194
+ ] })
2195
+ ]
2196
+ }
2197
+ );
1758
2198
  }
1759
2199
  function TextInput({
1760
2200
  value,
@@ -1883,7 +2323,7 @@ function NumberInput({
1883
2323
  {
1884
2324
  onClick: onIncrement,
1885
2325
  className: "rotate-180 cursor-pointer transition-all duration-300 hover:bg-ice rounded-sm",
1886
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-3 w-3", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })
2326
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-3 w-3", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })
1887
2327
  }
1888
2328
  ),
1889
2329
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1891,7 +2331,7 @@ function NumberInput({
1891
2331
  {
1892
2332
  onClick: onDecrement,
1893
2333
  className: "cursor-pointer transition-all duration-300 hover:bg-ice rounded-sm",
1894
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-3 w-3", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })
2334
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-3 w-3", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })
1895
2335
  }
1896
2336
  )
1897
2337
  ] })
@@ -1921,7 +2361,7 @@ function Password({
1921
2361
  iconColor
1922
2362
  }) {
1923
2363
  const [passwordVisible, setPasswordVisible] = React9.useState(false);
1924
- const color = iconColor ?? chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"];
2364
+ const color = iconColor ?? chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"];
1925
2365
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col items-center justify-center", style: style ?? {}, children: [
1926
2366
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `flex ${layout === "vertical" ? "flex-col" : "flex-row items-center gap-2"}`, children: [
1927
2367
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1979,59 +2419,85 @@ function Password({
1979
2419
  ] });
1980
2420
  }
1981
2421
  function Checkbox({
1982
- layout = "vertical",
1983
- labelPosition = "left",
2422
+ checked,
2423
+ value,
2424
+ // legacy alias
2425
+ onChange,
1984
2426
  label,
1985
2427
  name,
1986
2428
  htmlFor,
1987
2429
  errorMessage,
1988
- value = false,
1989
- onChange
2430
+ disabled = false
1990
2431
  }) {
1991
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-2", children: [
2432
+ const isChecked = checked ?? value ?? false;
2433
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
1992
2434
  /* @__PURE__ */ jsxRuntime.jsxs(
1993
- "div",
2435
+ "label",
1994
2436
  {
1995
- className: `flex ${layout === "vertical" ? "flex-col" : labelPosition === "left" ? "flex-row" : "flex-row-reverse"} gap-2`,
2437
+ htmlFor,
2438
+ className: [
2439
+ "inline-flex items-center gap-2.5",
2440
+ disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"
2441
+ ].join(" "),
1996
2442
  children: [
1997
- /* @__PURE__ */ jsxRuntime.jsx(
1998
- "label",
1999
- {
2000
- htmlFor,
2001
- className: "font-bold text-md text-prussian-blue dark:text-white cursor-pointer",
2002
- children: label
2003
- }
2004
- ),
2005
2443
  /* @__PURE__ */ jsxRuntime.jsx(
2006
2444
  CheckboxPrimitive__namespace.Root,
2007
2445
  {
2008
2446
  id: htmlFor,
2009
2447
  name,
2010
- checked: value,
2011
- onCheckedChange: (checked) => onChange?.({
2012
- target: { value: !!checked, id: htmlFor, name }
2013
- }),
2014
- className: "border-2 border-prussian-blue dark:border-independence rounded-md w-6 h-6 flex items-center justify-center cursor-pointer transition-colors duration-150 data-[state=checked]:bg-prussian-blue dark:data-[state=checked]:bg-independence focus:outline-none focus-visible:ring-2 focus-visible:ring-usafa-blue",
2448
+ checked: isChecked,
2449
+ disabled,
2450
+ onCheckedChange: (c) => onChange?.({ target: { checked: !!c, id: htmlFor, name } }),
2451
+ className: [
2452
+ // Box
2453
+ "relative flex h-[18px] w-[18px] flex-shrink-0 items-center justify-center",
2454
+ "rounded-sm border transition-colors duration-150",
2455
+ // Unchecked
2456
+ "border-border-strong bg-surface",
2457
+ // Checked
2458
+ "data-[state=checked]:bg-accent data-[state=checked]:border-accent",
2459
+ // Focus
2460
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1",
2461
+ // Disabled
2462
+ "disabled:cursor-not-allowed"
2463
+ ].join(" "),
2015
2464
  "aria-label": typeof label === "string" ? label : void 0,
2016
- children: /* @__PURE__ */ jsxRuntime.jsx(CheckboxPrimitive__namespace.Indicator, { className: "transition-transform duration-150 scale-100", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
2017
- "path",
2465
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2466
+ CheckboxPrimitive__namespace.Indicator,
2018
2467
  {
2019
- d: "M4 10l4.5 4.5L16 6",
2020
- stroke: "#fff",
2021
- strokeWidth: "2",
2022
- strokeLinecap: "round",
2023
- strokeLinejoin: "round"
2468
+ className: "flex items-center justify-center data-[state=checked]:animate-check-pop",
2469
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2470
+ "svg",
2471
+ {
2472
+ width: "11",
2473
+ height: "9",
2474
+ viewBox: "0 0 11 9",
2475
+ fill: "none",
2476
+ "aria-hidden": "true",
2477
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2478
+ "path",
2479
+ {
2480
+ d: "M1 4.5L4 7.5L10 1",
2481
+ stroke: "white",
2482
+ strokeWidth: "1.8",
2483
+ strokeLinecap: "round",
2484
+ strokeLinejoin: "round"
2485
+ }
2486
+ )
2487
+ }
2488
+ )
2024
2489
  }
2025
- ) }) })
2490
+ )
2026
2491
  }
2027
- )
2492
+ ),
2493
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground-secondary select-none leading-snug", children: label })
2028
2494
  ]
2029
2495
  }
2030
2496
  ),
2031
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-error text-center", children: errorMessage })
2497
+ errorMessage && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-status-error pl-[26px]", children: errorMessage })
2032
2498
  ] });
2033
2499
  }
2034
- function Switch2({
2500
+ function Switch({
2035
2501
  checked = false,
2036
2502
  onChange,
2037
2503
  checkedIcon,
@@ -2107,7 +2573,7 @@ function AutoComplete({
2107
2573
  "aria-autocomplete": "list"
2108
2574
  }
2109
2575
  ),
2110
- /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], className: "w-5 h-5 flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z", clipRule: "evenodd" }) })
2576
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], className: "w-5 h-5 flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z", clipRule: "evenodd" }) })
2111
2577
  ] }) }),
2112
2578
  /* @__PURE__ */ jsxRuntime.jsx(Popover__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
2113
2579
  Popover__namespace.Content,
@@ -2200,7 +2666,7 @@ function TreeSelect({
2200
2666
  )),
2201
2667
  value.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(DropdownPill, { value: `+${value.length - 1} more` })
2202
2668
  ] }) : value != null ? /* @__PURE__ */ jsxRuntime.jsx(DropdownPill, { value: innerItems.find((it) => it.key === value)?.label }) : null }),
2203
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `transition-transform duration-300 ml-2 ${open ? "rotate-180" : "rotate-0"}`, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) })
2669
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `transition-transform duration-300 ml-2 ${open ? "rotate-180" : "rotate-0"}`, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) }) })
2204
2670
  ]
2205
2671
  }
2206
2672
  ) }),
@@ -2230,7 +2696,7 @@ function TreeSelect({
2230
2696
  "path",
2231
2697
  {
2232
2698
  d: "M4 10l4.5 4.5L16 6",
2233
- stroke: hoveredItem === item.key ? "#fff" : chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"],
2699
+ stroke: hoveredItem === item.key ? "#fff" : chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"],
2234
2700
  strokeWidth: "2",
2235
2701
  strokeLinecap: "round",
2236
2702
  strokeLinejoin: "round"
@@ -2312,7 +2778,7 @@ function FileInput({
2312
2778
  }
2313
2779
  ),
2314
2780
  files.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-full items-center justify-center gap-2", children: [
2315
- /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], className: "w-16 h-16 dark:fill-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M11.47 2.47a.75.75 0 011.06 0l4.5 4.5a.75.75 0 01-1.06 1.06l-3.22-3.22V16.5a.75.75 0 01-1.5 0V4.81L8.03 8.03a.75.75 0 01-1.06-1.06l4.5-4.5zM3 15.75a.75.75 0 01.75.75v2.25a1.5 1.5 0 001.5 1.5h13.5a1.5 1.5 0 001.5-1.5V16.5a.75.75 0 011.5 0v2.25a3 3 0 01-3 3H5.25a3 3 0 01-3-3V16.5a.75.75 0 01.75-.75z", clipRule: "evenodd" }) }),
2781
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], className: "w-16 h-16 dark:fill-white", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M11.47 2.47a.75.75 0 011.06 0l4.5 4.5a.75.75 0 01-1.06 1.06l-3.22-3.22V16.5a.75.75 0 01-1.5 0V4.81L8.03 8.03a.75.75 0 01-1.06-1.06l4.5-4.5zM3 15.75a.75.75 0 01.75.75v2.25a1.5 1.5 0 001.5 1.5h13.5a1.5 1.5 0 001.5-1.5V16.5a.75.75 0 011.5 0v2.25a3 3 0 01-3 3H5.25a3 3 0 01-3-3V16.5a.75.75 0 01.75-.75z", clipRule: "evenodd" }) }),
2316
2782
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-prussian-blue dark:text-white text-sm", children: "Click or Drop a file" })
2317
2783
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-3 items-center justify-center w-full h-full", children: files.map((file, id) => /* @__PURE__ */ jsxRuntime.jsxs(
2318
2784
  "div",
@@ -2329,7 +2795,7 @@ function FileInput({
2329
2795
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "10", height: "10", viewBox: "0 0 20 20", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 5L5 15M5 5l10 10", stroke: "#fff", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
2330
2796
  }
2331
2797
  ),
2332
- /* @__PURE__ */ jsxRuntime.jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"], className: "w-10 h-10 dark:fill-white", children: [
2798
+ /* @__PURE__ */ jsxRuntime.jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"], className: "w-10 h-10 dark:fill-white", children: [
2333
2799
  /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0016.5 9h-1.875a1.875 1.875 0 01-1.875-1.875V5.25A3.75 3.75 0 009 1.5H5.625z", clipRule: "evenodd" }),
2334
2800
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12.971 1.816A5.23 5.23 0 0114.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 013.434 1.279 9.768 9.768 0 00-6.963-6.963z" })
2335
2801
  ] }),
@@ -2374,9 +2840,9 @@ function getMonthDays(year, month) {
2374
2840
  }
2375
2841
  return days;
2376
2842
  }
2377
- var ChevronRight2 = ({ color = chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"] }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "w-4 h-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
2378
- var DoubleChevronRight2 = ({ color = chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"] }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "w-4 h-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) });
2379
- var ChevronDown2 = ({ color = chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"] }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "w-4 h-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) });
2843
+ var ChevronRight2 = ({ color = chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"] }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "w-4 h-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
2844
+ var DoubleChevronRight2 = ({ color = chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"] }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "w-4 h-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) });
2845
+ var ChevronDown2 = ({ color = chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"] }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2, className: "w-4 h-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) });
2380
2846
  function DatePickerBase({
2381
2847
  value,
2382
2848
  onChange,
@@ -2633,20 +3099,21 @@ var DatePicker_default = Temporal;
2633
3099
 
2634
3100
  Object.defineProperty(exports, "COLORS", {
2635
3101
  enumerable: true,
2636
- get: function () { return chunkZS3HB5YJ_cjs.colors_default; }
3102
+ get: function () { return chunkRLL7ES4F_cjs.colors_default; }
2637
3103
  });
2638
3104
  Object.defineProperty(exports, "palette", {
2639
3105
  enumerable: true,
2640
- get: function () { return chunkZS3HB5YJ_cjs.PALETTE; }
3106
+ get: function () { return chunkRLL7ES4F_cjs.PALETTE; }
2641
3107
  });
2642
3108
  Object.defineProperty(exports, "semanticTokens", {
2643
3109
  enumerable: true,
2644
- get: function () { return chunkZS3HB5YJ_cjs.semanticTokens; }
3110
+ get: function () { return chunkRLL7ES4F_cjs.semanticTokens; }
2645
3111
  });
2646
3112
  Object.defineProperty(exports, "vars", {
2647
3113
  enumerable: true,
2648
- get: function () { return chunkZS3HB5YJ_cjs.vars; }
3114
+ get: function () { return chunkRLL7ES4F_cjs.vars; }
2649
3115
  });
3116
+ exports.AppShell = AppShell;
2650
3117
  exports.AutoComplete = AutoComplete;
2651
3118
  exports.Button = Button;
2652
3119
  exports.Catalog = Catalog;
@@ -2673,15 +3140,21 @@ exports.OpaqueGridCard = OpaqueGridCard;
2673
3140
  exports.Password = Password;
2674
3141
  exports.ScalableContainer = ScalableContainer;
2675
3142
  exports.SearchInput = SearchInput_default;
2676
- exports.Switch = Switch2;
3143
+ exports.Sidebar = Sidebar;
3144
+ exports.SkeletonBox = SkeletonBox;
3145
+ exports.SkeletonCard = SkeletonCard;
3146
+ exports.SkeletonCircle = SkeletonCircle;
3147
+ exports.SkeletonText = SkeletonText;
3148
+ exports.Switch = Switch;
2677
3149
  exports.Table = Table;
2678
3150
  exports.Tabs = Tabs;
2679
3151
  exports.Temporal = DatePicker_default;
2680
3152
  exports.TextInput = TextInput;
2681
- exports.ThemeSwitch = Switch;
3153
+ exports.ThemeSwitch = ThemeSwitch;
2682
3154
  exports.ToggleButton = ToggleButton;
2683
3155
  exports.Tooltip = Tooltip;
2684
3156
  exports.TooltipProvider = TooltipProvider;
3157
+ exports.TopBar = TopBar;
2685
3158
  exports.Tree = Tree;
2686
3159
  exports.TreeSelect = TreeSelect;
2687
3160
  exports.Wizard = Wizard;