@geomak/ui 1.3.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');
@@ -467,23 +467,49 @@ function Drawer({
467
467
  ) }) })
468
468
  ] }) });
469
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
+ };
470
476
  function Tooltip({
471
477
  children,
472
478
  title,
473
- placement = "left",
474
- delayDuration = 400
479
+ placement = "top",
480
+ delayDuration = 300,
481
+ sideOffset = 8
475
482
  }) {
476
483
  return /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Provider, { delayDuration, children: /* @__PURE__ */ jsxRuntime.jsxs(TooltipPrimitive__namespace.Root, { children: [
477
- /* @__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 }) }),
478
485
  /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(
479
486
  TooltipPrimitive__namespace.Content,
480
487
  {
481
488
  side: placement,
482
- sideOffset: 8,
483
- 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(" "),
484
503
  children: [
485
504
  title,
486
- /* @__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
+ )
487
513
  ]
488
514
  }
489
515
  ) })
@@ -542,7 +568,7 @@ function Tabs({
542
568
  onClick: toPreviousTab,
543
569
  "aria-label": "Previous tab",
544
570
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence rotate-180 flex-shrink-0",
545
- 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" }) })
546
572
  }
547
573
  ),
548
574
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -567,7 +593,7 @@ function Tabs({
567
593
  onTabClose?.(tab.key);
568
594
  },
569
595
  className: "flex-shrink-0 rounded hover:bg-ice-dark dark:hover:bg-independence p-0.5 transition-colors",
570
- 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" }) })
571
597
  }
572
598
  )
573
599
  ]
@@ -583,7 +609,7 @@ function Tabs({
583
609
  onClick: toNextTab,
584
610
  "aria-label": "Next tab",
585
611
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence flex-shrink-0",
586
- 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" }) })
587
613
  }
588
614
  )
589
615
  ] }),
@@ -741,44 +767,74 @@ var TYPE_BG = {
741
767
  warning: "bg-status-warning",
742
768
  danger: "bg-status-error"
743
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"
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
+ }
744
791
  function TypeIcon({ type }) {
745
792
  if (type === "success") {
746
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "20", height: "20", viewBox: "0 0 28 28", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
747
- "path",
748
- {
749
- fillRule: "evenodd",
750
- clipRule: "evenodd",
751
- 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",
752
- fill: "#fff"
753
- }
754
- ) });
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" }) });
755
794
  }
756
795
  if (type === "info") {
757
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#fff", className: "w-5 h-5", "aria-hidden": "true", 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
+ ] });
758
801
  }
759
802
  if (type === "warning") {
760
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#fff", className: "w-5 h-5", "aria-hidden": "true", 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
+ ] });
761
808
  }
762
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#fff", className: "w-5 h-5", "aria-hidden": "true", 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
+ ] });
763
814
  }
764
815
  function NotificationItem({
765
816
  n,
817
+ pos,
766
818
  onClose,
767
819
  reduced
768
820
  }) {
821
+ const initial = getInitialMotion(pos, reduced);
822
+ const center = pos.endsWith("center");
769
823
  return /* @__PURE__ */ jsxRuntime.jsx(
770
824
  framerMotion.motion.div,
771
825
  {
772
826
  layout: true,
773
- initial: { opacity: 0, x: reduced ? 0 : 56, scale: reduced ? 0.97 : 1 },
774
- animate: { opacity: 1, x: 0, scale: 1 },
775
- exit: { opacity: 0, x: reduced ? 0 : 40, scale: reduced ? 0.97 : 1 },
827
+ initial,
828
+ animate: { opacity: 1, x: 0, y: 0, scale: 1 },
829
+ exit: { ...initial, opacity: 0 },
776
830
  transition: reduced ? { duration: 0 } : {
777
- opacity: { duration: 0.15 },
831
+ opacity: { duration: 0.14 },
778
832
  x: { type: "tween", duration: 0.22, ease: [0.16, 1, 0.3, 1] },
779
- layout: { duration: 0.2 }
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 }
780
836
  },
781
- children: /* @__PURE__ */ jsxRuntime.jsxs(
837
+ children: /* @__PURE__ */ jsxRuntime.jsx(
782
838
  Toast__namespace.Root,
783
839
  {
784
840
  open: true,
@@ -787,32 +843,36 @@ function NotificationItem({
787
843
  if (!o) onClose(n.id);
788
844
  },
789
845
  className: [
790
- "rounded-xl shadow-md p-3 w-[300px] text-white",
791
- "focus:outline-none focus-visible:ring-2 focus-visible:ring-white/60",
846
+ "w-[300px] rounded-md shadow-lg overflow-hidden",
847
+ center ? "mx-auto" : "",
848
+ "focus:outline-none",
792
849
  TYPE_BG[n.type ?? "info"]
793
850
  ].join(" "),
794
- children: [
795
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5", children: [
796
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(TypeIcon, { type: n.type ?? "info" }) }),
797
- /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Title, { className: "font-semibold text-sm leading-snug flex-1", children: n.title }),
798
- /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Action, { asChild: true, altText: "Close", children: /* @__PURE__ */ jsxRuntime.jsx(
799
- "button",
800
- {
801
- "aria-label": "Close notification",
802
- onClick: () => onClose(n.id),
803
- className: "flex-shrink-0 rounded-md p-1 hover:bg-white/20 transition-colors duration-150 focus:outline-none focus-visible:ring-1 focus-visible:ring-white/60",
804
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 5L5 15M5 5l10 10", stroke: "#fff", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
805
- }
806
- ) })
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 })
807
856
  ] }),
808
- n.description && /* @__PURE__ */ jsxRuntime.jsx(Toast__namespace.Description, { className: "mt-1.5 text-xs text-white/80 leading-relaxed pl-7", children: n.description })
809
- ]
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
+ ] })
810
867
  }
811
868
  )
812
869
  }
813
870
  );
814
871
  }
815
- function NotificationProvider({ children }) {
872
+ function NotificationProvider({
873
+ children,
874
+ position = "top-right"
875
+ }) {
816
876
  const [notifications, setNotifications] = React9.useState([]);
817
877
  const reduced = framerMotion.useReducedMotion();
818
878
  const open = (payload) => {
@@ -824,17 +884,21 @@ function NotificationProvider({ children }) {
824
884
  const close = (id) => {
825
885
  setNotifications((prev) => prev.filter((n) => n.id !== id));
826
886
  };
827
- 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: [
828
888
  children,
829
889
  /* @__PURE__ */ jsxRuntime.jsx(
830
890
  Toast__namespace.Viewport,
831
891
  {
832
892
  asChild: true,
833
- className: "fixed top-[56px] right-0 z-[500000] flex flex-col gap-2 w-[350px] p-4 outline-none",
893
+ className: [
894
+ VIEWPORT_CLASSES[position],
895
+ "z-[500000] gap-2 w-[332px] p-4 outline-none"
896
+ ].join(" "),
834
897
  children: /* @__PURE__ */ jsxRuntime.jsx("ul", { children: /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, children: notifications.map((n) => /* @__PURE__ */ jsxRuntime.jsx(
835
898
  NotificationItem,
836
899
  {
837
900
  n,
901
+ pos: position,
838
902
  onClose: close,
839
903
  reduced
840
904
  },
@@ -1088,7 +1152,7 @@ function CatalogCarousel({ items, buttonText, onOpen }) {
1088
1152
  onClick: previousApp,
1089
1153
  "aria-label": "Previous",
1090
1154
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence rotate-180",
1091
- 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" }) })
1092
1156
  }
1093
1157
  ),
1094
1158
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex", children: indexPool.map((index, id) => {
@@ -1125,7 +1189,7 @@ function CatalogCarousel({ items, buttonText, onOpen }) {
1125
1189
  onClick: nextApp,
1126
1190
  "aria-label": "Next",
1127
1191
  className: "cursor-pointer rounded-lg transition-all duration-300 hover:bg-ice-dark dark:hover:bg-independence",
1128
- 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" }) })
1129
1193
  }
1130
1194
  )
1131
1195
  ] }) });
@@ -1255,7 +1319,7 @@ function ContextMenu({ items, position, visible, onClose }) {
1255
1319
  item.icon,
1256
1320
  item.value
1257
1321
  ] }),
1258
- /* @__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" }) }) })
1259
1323
  ]
1260
1324
  },
1261
1325
  item.key
@@ -1386,7 +1450,7 @@ var SearchInput = React9__default.default.forwardRef(function SearchInput2({
1386
1450
  placeholder: placeholder ?? ""
1387
1451
  }
1388
1452
  ),
1389
- /* @__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" }) })
1390
1454
  ] })
1391
1455
  ]
1392
1456
  }
@@ -1497,7 +1561,7 @@ function Dropdown({
1497
1561
  ] }) : /* @__PURE__ */ jsxRuntime.jsx(DropdownPill, { value: innerItems.find((it) => it.key === value)?.label })
1498
1562
  }
1499
1563
  ),
1500
- /* @__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" }) }) })
1501
1565
  ]
1502
1566
  }
1503
1567
  ) }),
@@ -1539,7 +1603,7 @@ function Dropdown({
1539
1603
  "path",
1540
1604
  {
1541
1605
  d: "M4 10l4.5 4.5L16 6",
1542
- 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"],
1543
1607
  strokeWidth: "2",
1544
1608
  strokeLinecap: "round",
1545
1609
  strokeLinejoin: "round"
@@ -1627,7 +1691,7 @@ function TableBody({
1627
1691
  onClick: () => toggleRow(row.key),
1628
1692
  className: `p-2 cursor-pointer origin-center transition-all duration-200 ${visibleRows[row.key]?.visible ? "rotate-180" : "rotate-0"}`,
1629
1693
  children: expandRow.expandIcon ?? /* PlusCircle */
1630
- /* @__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" }) })
1631
1695
  }
1632
1696
  ) }),
1633
1697
  columns.map((col, index) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -1680,8 +1744,8 @@ function Pagination({
1680
1744
  const navBtn = (icon, disabled, onClick) => /* @__PURE__ */ jsxRuntime.jsx(IconButton, { disabled, onClick, icon });
1681
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" }) });
1682
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" }) });
1683
- const disabledColor = chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"];
1684
- 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;
1685
1749
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2 items-center justify-end pt-2", children: [
1686
1750
  navBtn(
1687
1751
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rotate-180 inline-flex", children: doubleChevronRight(activePage === 0 ? disabledColor : enabledColor) }),
@@ -1890,6 +1954,248 @@ function TopBar({
1890
1954
  }
1891
1955
  );
1892
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,
2015
+ {
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"
2021
+ }
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 })
2101
+ }
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
+ }
2125
+ }
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
+ );
2198
+ }
1893
2199
  function TextInput({
1894
2200
  value,
1895
2201
  onChange,
@@ -2017,7 +2323,7 @@ function NumberInput({
2017
2323
  {
2018
2324
  onClick: onIncrement,
2019
2325
  className: "rotate-180 cursor-pointer transition-all duration-300 hover:bg-ice rounded-sm",
2020
- 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" }) })
2021
2327
  }
2022
2328
  ),
2023
2329
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -2025,7 +2331,7 @@ function NumberInput({
2025
2331
  {
2026
2332
  onClick: onDecrement,
2027
2333
  className: "cursor-pointer transition-all duration-300 hover:bg-ice rounded-sm",
2028
- 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" }) })
2029
2335
  }
2030
2336
  )
2031
2337
  ] })
@@ -2055,7 +2361,7 @@ function Password({
2055
2361
  iconColor
2056
2362
  }) {
2057
2363
  const [passwordVisible, setPasswordVisible] = React9.useState(false);
2058
- const color = iconColor ?? chunkZS3HB5YJ_cjs.colors_default.PALETTE["prussian-blue"];
2364
+ const color = iconColor ?? chunkRLL7ES4F_cjs.colors_default.PALETTE["prussian-blue"];
2059
2365
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col items-center justify-center", style: style ?? {}, children: [
2060
2366
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `flex ${layout === "vertical" ? "flex-col" : "flex-row items-center gap-2"}`, children: [
2061
2367
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -2113,56 +2419,82 @@ function Password({
2113
2419
  ] });
2114
2420
  }
2115
2421
  function Checkbox({
2116
- layout = "vertical",
2117
- labelPosition = "left",
2422
+ checked,
2423
+ value,
2424
+ // legacy alias
2425
+ onChange,
2118
2426
  label,
2119
2427
  name,
2120
2428
  htmlFor,
2121
2429
  errorMessage,
2122
- value = false,
2123
- onChange
2430
+ disabled = false
2124
2431
  }) {
2125
- 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: [
2126
2434
  /* @__PURE__ */ jsxRuntime.jsxs(
2127
- "div",
2435
+ "label",
2128
2436
  {
2129
- 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(" "),
2130
2442
  children: [
2131
- /* @__PURE__ */ jsxRuntime.jsx(
2132
- "label",
2133
- {
2134
- htmlFor,
2135
- className: "font-bold text-md text-prussian-blue dark:text-white cursor-pointer",
2136
- children: label
2137
- }
2138
- ),
2139
2443
  /* @__PURE__ */ jsxRuntime.jsx(
2140
2444
  CheckboxPrimitive__namespace.Root,
2141
2445
  {
2142
2446
  id: htmlFor,
2143
2447
  name,
2144
- checked: value,
2145
- onCheckedChange: (checked) => onChange?.({
2146
- target: { value: !!checked, id: htmlFor, name }
2147
- }),
2148
- 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(" "),
2149
2464
  "aria-label": typeof label === "string" ? label : void 0,
2150
- 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(
2151
- "path",
2465
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2466
+ CheckboxPrimitive__namespace.Indicator,
2152
2467
  {
2153
- d: "M4 10l4.5 4.5L16 6",
2154
- stroke: "#fff",
2155
- strokeWidth: "2",
2156
- strokeLinecap: "round",
2157
- 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
+ )
2158
2489
  }
2159
- ) }) })
2490
+ )
2160
2491
  }
2161
- )
2492
+ ),
2493
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground-secondary select-none leading-snug", children: label })
2162
2494
  ]
2163
2495
  }
2164
2496
  ),
2165
- /* @__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 })
2166
2498
  ] });
2167
2499
  }
2168
2500
  function Switch({
@@ -2241,7 +2573,7 @@ function AutoComplete({
2241
2573
  "aria-autocomplete": "list"
2242
2574
  }
2243
2575
  ),
2244
- /* @__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" }) })
2245
2577
  ] }) }),
2246
2578
  /* @__PURE__ */ jsxRuntime.jsx(Popover__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
2247
2579
  Popover__namespace.Content,
@@ -2334,7 +2666,7 @@ function TreeSelect({
2334
2666
  )),
2335
2667
  value.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(DropdownPill, { value: `+${value.length - 1} more` })
2336
2668
  ] }) : value != null ? /* @__PURE__ */ jsxRuntime.jsx(DropdownPill, { value: innerItems.find((it) => it.key === value)?.label }) : null }),
2337
- /* @__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" }) }) })
2338
2670
  ]
2339
2671
  }
2340
2672
  ) }),
@@ -2364,7 +2696,7 @@ function TreeSelect({
2364
2696
  "path",
2365
2697
  {
2366
2698
  d: "M4 10l4.5 4.5L16 6",
2367
- 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"],
2368
2700
  strokeWidth: "2",
2369
2701
  strokeLinecap: "round",
2370
2702
  strokeLinejoin: "round"
@@ -2446,7 +2778,7 @@ function FileInput({
2446
2778
  }
2447
2779
  ),
2448
2780
  files.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-full items-center justify-center gap-2", children: [
2449
- /* @__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" }) }),
2450
2782
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-prussian-blue dark:text-white text-sm", children: "Click or Drop a file" })
2451
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(
2452
2784
  "div",
@@ -2463,7 +2795,7 @@ function FileInput({
2463
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" }) })
2464
2796
  }
2465
2797
  ),
2466
- /* @__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: [
2467
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" }),
2468
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" })
2469
2801
  ] }),
@@ -2508,9 +2840,9 @@ function getMonthDays(year, month) {
2508
2840
  }
2509
2841
  return days;
2510
2842
  }
2511
- 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" }) });
2512
- 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" }) });
2513
- 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" }) });
2514
2846
  function DatePickerBase({
2515
2847
  value,
2516
2848
  onChange,
@@ -2767,20 +3099,21 @@ var DatePicker_default = Temporal;
2767
3099
 
2768
3100
  Object.defineProperty(exports, "COLORS", {
2769
3101
  enumerable: true,
2770
- get: function () { return chunkZS3HB5YJ_cjs.colors_default; }
3102
+ get: function () { return chunkRLL7ES4F_cjs.colors_default; }
2771
3103
  });
2772
3104
  Object.defineProperty(exports, "palette", {
2773
3105
  enumerable: true,
2774
- get: function () { return chunkZS3HB5YJ_cjs.PALETTE; }
3106
+ get: function () { return chunkRLL7ES4F_cjs.PALETTE; }
2775
3107
  });
2776
3108
  Object.defineProperty(exports, "semanticTokens", {
2777
3109
  enumerable: true,
2778
- get: function () { return chunkZS3HB5YJ_cjs.semanticTokens; }
3110
+ get: function () { return chunkRLL7ES4F_cjs.semanticTokens; }
2779
3111
  });
2780
3112
  Object.defineProperty(exports, "vars", {
2781
3113
  enumerable: true,
2782
- get: function () { return chunkZS3HB5YJ_cjs.vars; }
3114
+ get: function () { return chunkRLL7ES4F_cjs.vars; }
2783
3115
  });
3116
+ exports.AppShell = AppShell;
2784
3117
  exports.AutoComplete = AutoComplete;
2785
3118
  exports.Button = Button;
2786
3119
  exports.Catalog = Catalog;
@@ -2807,6 +3140,11 @@ exports.OpaqueGridCard = OpaqueGridCard;
2807
3140
  exports.Password = Password;
2808
3141
  exports.ScalableContainer = ScalableContainer;
2809
3142
  exports.SearchInput = SearchInput_default;
3143
+ exports.Sidebar = Sidebar;
3144
+ exports.SkeletonBox = SkeletonBox;
3145
+ exports.SkeletonCard = SkeletonCard;
3146
+ exports.SkeletonCircle = SkeletonCircle;
3147
+ exports.SkeletonText = SkeletonText;
2810
3148
  exports.Switch = Switch;
2811
3149
  exports.Table = Table;
2812
3150
  exports.Tabs = Tabs;