@geomak/ui 6.0.1 → 6.2.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
@@ -13,6 +13,7 @@ var Accordion = require('@radix-ui/react-accordion');
13
13
  var ContextMenuPrimitive = require('@radix-ui/react-context-menu');
14
14
  var Popover = require('@radix-ui/react-popover');
15
15
  var SwitchPrimitive = require('@radix-ui/react-switch');
16
+ var NavigationMenu = require('@radix-ui/react-navigation-menu');
16
17
  var CheckboxPrimitive = require('@radix-ui/react-checkbox');
17
18
  var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
18
19
  var ToggleGroup = require('@radix-ui/react-toggle-group');
@@ -47,6 +48,7 @@ var Accordion__namespace = /*#__PURE__*/_interopNamespace(Accordion);
47
48
  var ContextMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(ContextMenuPrimitive);
48
49
  var Popover__namespace = /*#__PURE__*/_interopNamespace(Popover);
49
50
  var SwitchPrimitive__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitive);
51
+ var NavigationMenu__namespace = /*#__PURE__*/_interopNamespace(NavigationMenu);
50
52
  var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
51
53
  var RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(RadioGroupPrimitive);
52
54
  var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
@@ -986,15 +988,27 @@ function Tabs({
986
988
  const current = isControlled ? value : internal;
987
989
  const reduced = !!framerMotion.useReducedMotion();
988
990
  const indicatorId = React8.useId();
989
- const handle = (next) => {
991
+ const select = React8.useCallback((next) => {
990
992
  if (!isControlled) setInternal(next);
991
993
  onValueChange?.(next);
992
- };
993
- return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { value: current, variant, size, orientation, indicatorId, reduced }, children: /* @__PURE__ */ jsxRuntime.jsx(
994
+ }, [isControlled, onValueChange]);
995
+ const registry = React8.useRef(/* @__PURE__ */ new Map());
996
+ const orderRef = React8.useRef(0);
997
+ const [, bump] = React8.useState(0);
998
+ const registerTab = React8.useCallback((val, meta) => {
999
+ const existing = registry.current.get(val);
1000
+ registry.current.set(val, { ...meta, order: existing?.order ?? orderRef.current++ });
1001
+ if (!existing) bump((v) => v + 1);
1002
+ }, []);
1003
+ const unregisterTab = React8.useCallback((val) => {
1004
+ if (registry.current.delete(val)) bump((v) => v + 1);
1005
+ }, []);
1006
+ const getTabs = React8.useCallback(() => [...registry.current.entries()].sort((a, b) => a[1].order - b[1].order).map(([val, m]) => ({ value: val, label: m.label, icon: m.icon, disabled: m.disabled })), []);
1007
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { value: current, variant, size, orientation, indicatorId, reduced, select, registerTab, unregisterTab, getTabs }, children: /* @__PURE__ */ jsxRuntime.jsx(
994
1008
  TabsPrimitive__namespace.Root,
995
1009
  {
996
1010
  value: current,
997
- onValueChange: handle,
1011
+ onValueChange: select,
998
1012
  orientation,
999
1013
  className: [
1000
1014
  "flex min-w-0",
@@ -1007,7 +1021,7 @@ function Tabs({
1007
1021
  ) });
1008
1022
  }
1009
1023
  function TabsList({ children, "aria-label": ariaLabel, className = "" }) {
1010
- const { variant, orientation, reduced } = useTabsContext();
1024
+ const { variant, orientation, reduced, value } = useTabsContext();
1011
1025
  const horizontal = orientation === "horizontal";
1012
1026
  const scrollRef = React8.useRef(null);
1013
1027
  const [edges, setEdges] = React8.useState({ start: false, end: false });
@@ -1043,6 +1057,14 @@ function TabsList({ children, "aria-label": ariaLabel, className = "" }) {
1043
1057
  const amount = (horizontal ? el.clientWidth : el.clientHeight) * 0.7 * dir;
1044
1058
  el.scrollBy({ [horizontal ? "left" : "top"]: amount, behavior: reduced ? "auto" : "smooth" });
1045
1059
  }, [horizontal, reduced]);
1060
+ React8.useLayoutEffect(() => {
1061
+ const el = scrollRef.current;
1062
+ if (!el || !scrollable) return;
1063
+ const active = el.querySelector("[role=tab][data-state=active]");
1064
+ if (active && typeof active.scrollIntoView === "function") {
1065
+ active.scrollIntoView({ block: "nearest", inline: "nearest", behavior: reduced ? "auto" : "smooth" });
1066
+ }
1067
+ }, [value, scrollable, reduced]);
1046
1068
  const maskStyle = scrollable && (edges.start || edges.end) ? (() => {
1047
1069
  const dir = horizontal ? "to right" : "to bottom";
1048
1070
  const a = edges.start ? "transparent, black 36px" : "black";
@@ -1059,7 +1081,8 @@ function TabsList({ children, "aria-label": ariaLabel, className = "" }) {
1059
1081
  return `flex ${horizontal ? "flex-row" : "flex-col"} ${align} gap-1 ${hairline}`;
1060
1082
  })();
1061
1083
  const scrollClass = scrollable ? horizontal ? "overflow-x-auto overflow-y-hidden hidden-scrollbar" : "overflow-y-auto overflow-x-hidden hidden-scrollbar" : "";
1062
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ["relative flex min-w-0", horizontal ? "flex-row items-stretch" : "flex-col items-stretch", className].filter(Boolean).join(" "), children: [
1084
+ const overflowing = scrollable && (edges.start || edges.end);
1085
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ["relative flex min-w-0 gap-1", horizontal ? "flex-row items-stretch" : "flex-col items-stretch", className].filter(Boolean).join(" "), children: [
1063
1086
  scrollable && edges.start && /* @__PURE__ */ jsxRuntime.jsx(Chevron, { side: "start", orientation, onClick: () => nudge(-1) }),
1064
1087
  /* @__PURE__ */ jsxRuntime.jsx(
1065
1088
  TabsPrimitive__namespace.List,
@@ -1071,37 +1094,131 @@ function TabsList({ children, "aria-label": ariaLabel, className = "" }) {
1071
1094
  children
1072
1095
  }
1073
1096
  ),
1074
- scrollable && edges.end && /* @__PURE__ */ jsxRuntime.jsx(Chevron, { side: "end", orientation, onClick: () => nudge(1) })
1097
+ scrollable && edges.end && /* @__PURE__ */ jsxRuntime.jsx(Chevron, { side: "end", orientation, onClick: () => nudge(1) }),
1098
+ overflowing && /* @__PURE__ */ jsxRuntime.jsx(OverflowMenu, {})
1075
1099
  ] });
1076
1100
  }
1077
1101
  function Chevron({ side, orientation, onClick }) {
1078
1102
  const horizontal = orientation === "horizontal";
1079
1103
  const rotate = horizontal ? side === "start" ? "rotate-180" : "" : side === "start" ? "-rotate-90" : "rotate-90";
1080
- const pos = horizontal ? side === "start" ? "left-0 top-1/2 -translate-y-1/2" : "right-0 top-1/2 -translate-y-1/2" : side === "start" ? "top-0 left-1/2 -translate-x-1/2" : "bottom-0 left-1/2 -translate-x-1/2";
1081
1104
  return /* @__PURE__ */ jsxRuntime.jsx(
1082
1105
  "button",
1083
1106
  {
1084
1107
  type: "button",
1085
1108
  "aria-label": side === "start" ? "Scroll tabs backward" : "Scroll tabs forward",
1086
1109
  onClick,
1087
- className: `absolute z-20 ${pos} flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent`,
1110
+ className: "flex-shrink-0 self-center flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent",
1088
1111
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, className: `h-4 w-4 ${rotate}`, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) })
1089
1112
  }
1090
1113
  );
1091
1114
  }
1115
+ function OverflowMenu() {
1116
+ const { getTabs, value, select, orientation } = useTabsContext();
1117
+ const horizontal = orientation === "horizontal";
1118
+ const [open, setOpen] = React8.useState(false);
1119
+ const wrapRef = React8.useRef(null);
1120
+ const timer = React8.useRef(null);
1121
+ const openNow = () => {
1122
+ if (timer.current) clearTimeout(timer.current);
1123
+ setOpen(true);
1124
+ };
1125
+ const closeSoon = () => {
1126
+ timer.current = setTimeout(() => setOpen(false), 160);
1127
+ };
1128
+ React8.useLayoutEffect(() => {
1129
+ if (!open) return;
1130
+ const onDoc = (e) => {
1131
+ if (wrapRef.current && !wrapRef.current.contains(e.target)) setOpen(false);
1132
+ };
1133
+ const onKey = (e) => {
1134
+ if (e.key === "Escape") setOpen(false);
1135
+ };
1136
+ document.addEventListener("mousedown", onDoc);
1137
+ document.addEventListener("keydown", onKey);
1138
+ return () => {
1139
+ document.removeEventListener("mousedown", onDoc);
1140
+ document.removeEventListener("keydown", onKey);
1141
+ };
1142
+ }, [open]);
1143
+ const tabs = getTabs();
1144
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1145
+ "div",
1146
+ {
1147
+ ref: wrapRef,
1148
+ className: "relative flex-shrink-0 self-center",
1149
+ onMouseEnter: openNow,
1150
+ onMouseLeave: closeSoon,
1151
+ children: [
1152
+ /* @__PURE__ */ jsxRuntime.jsx(
1153
+ "button",
1154
+ {
1155
+ type: "button",
1156
+ "aria-haspopup": "menu",
1157
+ "aria-expanded": open,
1158
+ "aria-label": "Show all tabs",
1159
+ onClick: () => setOpen((o) => !o),
1160
+ className: "flex h-7 w-7 items-center justify-center rounded-full border border-border bg-surface text-foreground-secondary shadow-sm hover:text-foreground hover:bg-surface-raised data-[expanded=true]:text-foreground transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent",
1161
+ "data-expanded": open,
1162
+ children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 24 24", fill: "currentColor", className: "h-4 w-4", "aria-hidden": "true", children: [
1163
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "5", cy: "12", r: "1.6" }),
1164
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "1.6" }),
1165
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "19", cy: "12", r: "1.6" })
1166
+ ] })
1167
+ }
1168
+ ),
1169
+ open && /* @__PURE__ */ jsxRuntime.jsx(
1170
+ "div",
1171
+ {
1172
+ role: "menu",
1173
+ onMouseEnter: openNow,
1174
+ onMouseLeave: closeSoon,
1175
+ className: `absolute z-30 ${horizontal ? "right-0 top-full mt-1.5" : "left-full top-0 ml-1.5"} min-w-[184px] max-h-72 overflow-y-auto hidden-scrollbar rounded-lg border border-border bg-surface p-1 shadow-md animate-in fade-in-0 zoom-in-95`,
1176
+ children: tabs.map((t) => {
1177
+ const isActive = t.value === value;
1178
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1179
+ "button",
1180
+ {
1181
+ type: "button",
1182
+ role: "menuitem",
1183
+ disabled: t.disabled,
1184
+ onClick: () => {
1185
+ select(t.value);
1186
+ setOpen(false);
1187
+ },
1188
+ className: `flex w-full items-center gap-2 rounded-md px-2.5 py-1.5 text-left text-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${isActive ? "bg-surface-raised text-accent" : "text-foreground-secondary hover:bg-surface-raised hover:text-foreground"}`,
1189
+ children: [
1190
+ t.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 inline-flex h-4 w-4 items-center justify-center", children: t.icon }),
1191
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 truncate", children: t.label }),
1192
+ isActive && /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 20 20", fill: "none", className: "h-4 w-4 flex-shrink-0 text-accent", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10l4.5 4.5L16 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })
1193
+ ]
1194
+ },
1195
+ t.value
1196
+ );
1197
+ })
1198
+ }
1199
+ )
1200
+ ]
1201
+ }
1202
+ );
1203
+ }
1092
1204
  function TabsTrigger({ value, icon, badge, closeable, onClose, disabled, className = "", children }) {
1093
- const { value: active, variant, size, orientation, indicatorId, reduced } = useTabsContext();
1205
+ const { value: active, variant, size, orientation, indicatorId, reduced, registerTab, unregisterTab } = useTabsContext();
1094
1206
  const isActive = active === value;
1095
1207
  const horizontal = orientation === "horizontal";
1096
1208
  const sz = SIZE[size];
1097
- const base = "group/trigger relative inline-flex items-center justify-center whitespace-nowrap font-medium select-none transition-colors duration-150 focus:outline-none disabled:opacity-40 disabled:cursor-not-allowed flex-shrink-0";
1209
+ React8.useLayoutEffect(() => {
1210
+ registerTab(value, { label: children, icon, disabled });
1211
+ return () => unregisterTab(value);
1212
+ }, [value, children, icon, disabled, registerTab, unregisterTab]);
1213
+ const layoutCls = horizontal ? "justify-center flex-shrink-0" : "justify-start w-full";
1214
+ const base = "group/trigger relative inline-flex items-center whitespace-nowrap font-medium select-none transition-colors duration-150 focus:outline-none disabled:opacity-40 disabled:cursor-not-allowed";
1098
1215
  const variantCls = variant === "segmented" ? `rounded-md ${isActive ? "text-accent" : "text-foreground-secondary hover:text-foreground"} focus-visible:text-accent` : variant === "enclosed" ? `${horizontal ? "rounded-t-md border border-b-0 -mb-px" : "rounded-l-md border border-r-0 -mr-px"} ${isActive ? "bg-surface border-border text-foreground" : "border-transparent text-foreground-secondary hover:text-foreground hover:bg-surface-raised"} focus-visible:text-accent` : `${isActive ? "text-accent" : "text-foreground-secondary hover:text-foreground"} focus-visible:text-accent`;
1099
1216
  const trigger = /* @__PURE__ */ jsxRuntime.jsxs(
1100
1217
  TabsPrimitive__namespace.Trigger,
1101
1218
  {
1102
1219
  value,
1103
1220
  disabled,
1104
- className: [base, sz.trigger, closeable ? "pr-8" : "", variantCls, className].filter(Boolean).join(" "),
1221
+ className: [base, sz.trigger, layoutCls, closeable ? "pr-8" : "", variantCls, className].filter(Boolean).join(" "),
1105
1222
  children: [
1106
1223
  variant === "segmented" && isActive && /* @__PURE__ */ jsxRuntime.jsx(
1107
1224
  framerMotion.motion.span,
@@ -1134,7 +1251,7 @@ function TabsTrigger({ value, icon, badge, closeable, onClose, disabled, classNa
1134
1251
  }
1135
1252
  );
1136
1253
  if (!closeable) return trigger;
1137
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative inline-flex items-center flex-shrink-0", children: [
1254
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `relative inline-flex items-center ${horizontal ? "flex-shrink-0" : "w-full"}`, children: [
1138
1255
  trigger,
1139
1256
  /* @__PURE__ */ jsxRuntime.jsx(
1140
1257
  "button",
@@ -3306,6 +3423,104 @@ function Sidebar({
3306
3423
  }
3307
3424
  ) });
3308
3425
  }
3426
+ function MegaMenu({ children, align = "start", delayDuration = 200, className = "", style, "aria-label": ariaLabel }) {
3427
+ const justify = align === "center" ? "justify-center" : align === "end" ? "justify-end" : "justify-start";
3428
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3429
+ NavigationMenu__namespace.Root,
3430
+ {
3431
+ delayDuration,
3432
+ "aria-label": ariaLabel,
3433
+ className: ["relative z-10 flex", className].filter(Boolean).join(" "),
3434
+ style,
3435
+ children: [
3436
+ /* @__PURE__ */ jsxRuntime.jsx(NavigationMenu__namespace.List, { className: "flex items-center gap-1", children }),
3437
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `absolute left-0 top-full flex w-full ${justify} pt-2`, children: /* @__PURE__ */ jsxRuntime.jsx(
3438
+ NavigationMenu__namespace.Viewport,
3439
+ {
3440
+ className: "relative origin-top overflow-hidden rounded-lg border border-border bg-surface shadow-lg\n h-[var(--radix-navigation-menu-viewport-height)] w-[var(--radix-navigation-menu-viewport-width)]\n transition-[width,height] duration-200 ease-out\n data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\n data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
3441
+ }
3442
+ ) })
3443
+ ]
3444
+ }
3445
+ );
3446
+ }
3447
+ var TOP_ITEM = "group/top inline-flex items-center gap-1.5 h-10 px-3 rounded-md text-sm font-medium select-none text-foreground-secondary hover:text-foreground hover:bg-surface-raised data-[state=open]:text-accent data-[active]:text-accent transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent";
3448
+ function MegaMenuItem({ label, icon, href, children, className = "" }) {
3449
+ if (!children) {
3450
+ return /* @__PURE__ */ jsxRuntime.jsx(NavigationMenu__namespace.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs(NavigationMenu__namespace.Link, { href, className: [TOP_ITEM, className].filter(Boolean).join(" "), children: [
3451
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center", children: icon }),
3452
+ label
3453
+ ] }) });
3454
+ }
3455
+ return /* @__PURE__ */ jsxRuntime.jsxs(NavigationMenu__namespace.Item, { children: [
3456
+ /* @__PURE__ */ jsxRuntime.jsxs(NavigationMenu__namespace.Trigger, { className: [TOP_ITEM, className].filter(Boolean).join(" "), children: [
3457
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center", children: icon }),
3458
+ label,
3459
+ /* @__PURE__ */ jsxRuntime.jsx(
3460
+ "svg",
3461
+ {
3462
+ viewBox: "0 0 24 24",
3463
+ fill: "none",
3464
+ stroke: "currentColor",
3465
+ strokeWidth: 2,
3466
+ "aria-hidden": "true",
3467
+ className: "h-3.5 w-3.5 text-foreground-muted transition-transform duration-200 group-data-[state=open]/top:rotate-180 group-data-[state=open]/top:text-accent",
3468
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
3469
+ }
3470
+ )
3471
+ ] }),
3472
+ /* @__PURE__ */ jsxRuntime.jsx(NavigationMenu__namespace.Content, { className: "data-[motion=from-start]:animate-in data-[motion=to-end]:animate-out", children })
3473
+ ] });
3474
+ }
3475
+ var COLS = { 1: "grid-cols-1", 2: "grid-cols-2", 3: "grid-cols-3", 4: "grid-cols-4" };
3476
+ function MegaMenuPanel({ children, columns, className = "", style }) {
3477
+ return /* @__PURE__ */ jsxRuntime.jsx(
3478
+ "div",
3479
+ {
3480
+ className: ["grid gap-6 p-6", columns ? COLS[columns] : "auto-cols-fr grid-flow-col", "w-max max-w-[min(92vw,860px)]", className].filter(Boolean).join(" "),
3481
+ style,
3482
+ children
3483
+ }
3484
+ );
3485
+ }
3486
+ function MegaMenuSection({ title, children, className = "" }) {
3487
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ["min-w-[200px] flex flex-col", className].filter(Boolean).join(" "), children: [
3488
+ title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 pb-1.5 text-[11px] font-semibold uppercase tracking-widest text-foreground-muted select-none", children: title }),
3489
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-0.5", children })
3490
+ ] });
3491
+ }
3492
+ function MegaMenuLink({ href, icon, description, active, onClick, children, className = "" }) {
3493
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3494
+ NavigationMenu__namespace.Link,
3495
+ {
3496
+ active,
3497
+ href,
3498
+ onClick,
3499
+ className: [
3500
+ "group/link flex items-start gap-3 rounded-md p-3 transition-colors select-none",
3501
+ "hover:bg-surface-raised focus:outline-none focus-visible:ring-2 focus-visible:ring-accent",
3502
+ "data-[active]:bg-surface-raised",
3503
+ className
3504
+ ].filter(Boolean).join(" "),
3505
+ children: [
3506
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-surface-raised text-accent group-hover/link:bg-surface group-data-[active]/link:bg-surface transition-colors", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-[18px] w-[18px] inline-flex items-center justify-center", children: icon }) }),
3507
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex flex-col min-w-0", children: [
3508
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-foreground group-data-[active]/link:text-accent", children }),
3509
+ description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-foreground-muted leading-snug mt-0.5", children: description })
3510
+ ] })
3511
+ ]
3512
+ }
3513
+ );
3514
+ }
3515
+ function MegaMenuFeatured({ children, className = "" }) {
3516
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: ["min-w-[220px] rounded-lg bg-surface-raised border border-border p-4 flex flex-col", className].filter(Boolean).join(" "), children });
3517
+ }
3518
+ MegaMenu.Item = MegaMenuItem;
3519
+ MegaMenu.Panel = MegaMenuPanel;
3520
+ MegaMenu.Section = MegaMenuSection;
3521
+ MegaMenu.Link = MegaMenuLink;
3522
+ MegaMenu.Featured = MegaMenuFeatured;
3523
+ var MegaMenu_default = MegaMenu;
3309
3524
  function AppShell({
3310
3525
  topBar,
3311
3526
  sidebarSections = [],
@@ -6782,6 +6997,7 @@ exports.Icon = icons_default;
6782
6997
  exports.IconButton = IconButton;
6783
6998
  exports.List = List2;
6784
6999
  exports.LoadingSpinner = LoadingSpinner;
7000
+ exports.MegaMenu = MegaMenu_default;
6785
7001
  exports.Modal = Modal;
6786
7002
  exports.NotificationProvider = NotificationProvider;
6787
7003
  exports.NumberInput = NumberInput;