@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 +229 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +93 -1
- package/dist/index.d.ts +93 -1
- package/dist/index.js +229 -15
- package/dist/index.js.map +1 -1
- package/dist/styles.css +89 -2
- package/package.json +2 -1
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
|
|
991
|
+
const select = React8.useCallback((next) => {
|
|
990
992
|
if (!isControlled) setInternal(next);
|
|
991
993
|
onValueChange?.(next);
|
|
992
|
-
};
|
|
993
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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;
|