@solostylist/ui-kit 2.0.1 → 2.0.3

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.
Files changed (102) hide show
  1. package/dist/s-animated-gradient-text/index.d.ts +2 -0
  2. package/dist/s-animated-gradient-text/index.js +2 -0
  3. package/dist/s-animated-gradient-text/s-animated-gradient-text.d.ts +64 -0
  4. package/dist/s-animated-gradient-text/s-animated-gradient-text.js +92 -0
  5. package/dist/s-announcement-bar/index.d.ts +2 -0
  6. package/dist/s-announcement-bar/index.js +2 -0
  7. package/dist/s-announcement-bar/s-announcement-bar.d.ts +113 -0
  8. package/dist/s-announcement-bar/s-announcement-bar.js +272 -0
  9. package/dist/s-carousel/s-carousel.d.ts +2 -0
  10. package/dist/s-carousel/s-carousel.js +52 -50
  11. package/dist/s-date-picker/s-date-picker.js +1 -1
  12. package/dist/s-datetime-picker/s-datetime-picker.js +1 -1
  13. package/dist/s-drawer/index.d.ts +3 -0
  14. package/dist/s-drawer/index.js +2 -0
  15. package/dist/s-drawer/s-drawer.d.ts +70 -0
  16. package/dist/s-drawer/s-drawer.js +139 -0
  17. package/dist/s-gradient-blob-pulse/index.d.ts +2 -0
  18. package/dist/s-gradient-blob-pulse/index.js +2 -0
  19. package/dist/s-gradient-blob-pulse/s-gradient-blob-pulse.d.ts +62 -0
  20. package/dist/s-gradient-blob-pulse/s-gradient-blob-pulse.js +236 -0
  21. package/dist/s-gradient-icon/index.d.ts +1 -1
  22. package/dist/s-gradient-icon/s-gradient-icon.d.ts +4 -4
  23. package/dist/s-gradient-icon/s-gradient-icon.js +2 -2
  24. package/dist/s-icon-button/s-icon-button.d.ts +6 -2
  25. package/dist/s-interactive-card/index.d.ts +3 -0
  26. package/dist/s-interactive-card/index.js +2 -0
  27. package/dist/s-interactive-card/s-interactive-card.d.ts +57 -0
  28. package/dist/s-interactive-card/s-interactive-card.js +150 -0
  29. package/dist/s-language-switcher/s-language-switcher.js +66 -71
  30. package/dist/s-list-action-item/index.d.ts +2 -0
  31. package/dist/s-list-action-item/index.js +2 -0
  32. package/dist/s-list-action-item/s-list-action-item.d.ts +89 -0
  33. package/dist/s-list-action-item/s-list-action-item.js +149 -0
  34. package/dist/s-mega-menu/index.d.ts +3 -0
  35. package/dist/s-mega-menu/index.js +2 -0
  36. package/dist/s-mega-menu/mega-menu-panel.d.ts +38 -0
  37. package/dist/s-mega-menu/mega-menu-panel.js +251 -0
  38. package/dist/s-mega-menu/mega-menu-slots.d.ts +65 -0
  39. package/dist/s-mega-menu/mega-menu-slots.js +232 -0
  40. package/dist/s-mega-menu/mega-menu-trigger.d.ts +35 -0
  41. package/dist/s-mega-menu/mega-menu-trigger.js +49 -0
  42. package/dist/s-mega-menu/s-mega-menu.d.ts +23 -0
  43. package/dist/s-mega-menu/s-mega-menu.js +225 -0
  44. package/dist/s-mega-menu/types.d.ts +188 -0
  45. package/dist/s-mega-menu/types.js +0 -0
  46. package/dist/s-mega-menu/utils.d.ts +51 -0
  47. package/dist/s-mega-menu/utils.js +51 -0
  48. package/dist/s-mobile-dock/index.d.ts +3 -0
  49. package/dist/s-mobile-dock/index.js +2 -0
  50. package/dist/s-mobile-dock/s-mobile-dock.d.ts +96 -0
  51. package/dist/s-mobile-dock/s-mobile-dock.js +145 -0
  52. package/dist/s-nav-item/index.d.ts +1 -1
  53. package/dist/s-nav-item/s-nav-item.d.ts +35 -16
  54. package/dist/s-nav-item/s-nav-item.js +55 -77
  55. package/dist/s-nav-items/s-nav-items.js +68 -112
  56. package/dist/s-number-range/index.d.ts +3 -0
  57. package/dist/s-number-range/index.js +2 -0
  58. package/dist/s-number-range/s-number-range.d.ts +109 -0
  59. package/dist/s-number-range/s-number-range.js +250 -0
  60. package/dist/s-popover/index.d.ts +5 -0
  61. package/dist/s-popover/index.js +3 -0
  62. package/dist/s-popover/placement.d.ts +14 -0
  63. package/dist/s-popover/placement.js +65 -0
  64. package/dist/s-popover/s-popover-content.d.ts +22 -0
  65. package/dist/s-popover/s-popover-content.js +21 -0
  66. package/dist/s-popover/s-popover.d.ts +59 -0
  67. package/dist/s-popover/s-popover.js +66 -0
  68. package/dist/s-product-card/index.d.ts +3 -0
  69. package/dist/s-product-card/index.js +2 -0
  70. package/dist/s-product-card/s-product-card.d.ts +216 -0
  71. package/dist/s-product-card/s-product-card.js +499 -0
  72. package/dist/s-product-gallery/index.d.ts +3 -0
  73. package/dist/s-product-gallery/index.js +2 -0
  74. package/dist/s-product-gallery/s-product-gallery.d.ts +116 -0
  75. package/dist/s-product-gallery/s-product-gallery.js +427 -0
  76. package/dist/s-scroll-to-top/s-scroll-to-top.d.ts +1 -1
  77. package/dist/s-segmented-control/index.d.ts +3 -0
  78. package/dist/s-segmented-control/index.js +2 -0
  79. package/dist/s-segmented-control/s-segmented-control.d.ts +94 -0
  80. package/dist/s-segmented-control/s-segmented-control.js +298 -0
  81. package/dist/s-stepper/index.d.ts +3 -0
  82. package/dist/s-stepper/index.js +2 -0
  83. package/dist/s-stepper/s-stepper.d.ts +90 -0
  84. package/dist/s-stepper/s-stepper.js +102 -0
  85. package/dist/s-swatch/index.d.ts +3 -0
  86. package/dist/s-swatch/index.js +2 -0
  87. package/dist/s-swatch/s-swatch.d.ts +235 -0
  88. package/dist/s-swatch/s-swatch.js +218 -0
  89. package/dist/s-text-editor/s-text-editor-toolbar.js +105 -108
  90. package/dist/s-tool-item/s-tool-item.d.ts +10 -6
  91. package/dist/s-tool-item/s-tool-item.js +12 -12
  92. package/dist/theme/component-augmentation.d.ts +65 -1
  93. package/dist/theme/components/drawer.d.ts +1 -0
  94. package/dist/theme/components/drawer.js +4 -1
  95. package/dist/theme/components/slider.js +18 -1
  96. package/dist/theme/components/step-connector.d.ts +0 -3
  97. package/dist/theme/components/step-connector.js +1 -6
  98. package/dist/theme/components/step-icon.d.ts +3 -12
  99. package/dist/theme/components/step-icon.js +3 -14
  100. package/package.json +7 -2
  101. package/dist/theme/components/components.d.ts +0 -2
  102. package/dist/theme/components/slider.d.ts +0 -34
@@ -0,0 +1,251 @@
1
+ import { toSxArray as e } from "../utils/sx.js";
2
+ import { resolveOwnerStateSlotProps as t } from "../utils/slots.js";
3
+ import { LIST_ATTRIBUTE as n, NODE_ATTRIBUTE as r, PANEL_ATTRIBUTE as i, ROW_ATTRIBUTE as a, focusAdjacentList as o, focusRowByOffset as s, getFirstRow as c, getSiblingRows as l, hasNestedChildren as u, resolveLayout as d, resolveSubmenuSide as f } from "./utils.js";
4
+ import { SMegaMenuColumn as p, SMegaMenuHeading as m, SMegaMenuItemRoot as h, SMegaMenuPanel as g, SMegaMenuSubmenu as _, SMegaMenuSubmenuNode as v } from "./mega-menu-slots.js";
5
+ import * as y from "react";
6
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
7
+ import { mergeSlotProps as S, useEventCallback as C, useForkRef as w } from "@mui/material/utils";
8
+ import T from "@mui/utils/appendOwnerState";
9
+ import E from "@mui/icons-material/ChevronRight";
10
+ //#region lib/s-mega-menu/mega-menu-panel.tsx
11
+ function D(e, t, n) {
12
+ return {
13
+ ...e.ownerState,
14
+ active: e.getIsActive(t),
15
+ hasChildren: !!t.children?.length,
16
+ item: t,
17
+ ...n
18
+ };
19
+ }
20
+ function O({ closeParent: e, ctx: n, depth: r, item: i, onOpenSubmenu: c, onRowClick: u, open: d = !1, resolvedLayout: f, rowRef: p, side: m = "right", submenuId: g, triggerId: _ }) {
21
+ let v = D(n, i, {
22
+ depth: r,
23
+ heading: !1,
24
+ open: d,
25
+ resolvedLayout: f,
26
+ side: m
27
+ }), y = n.slots?.item ?? h, x = v.hasChildren, O = C((t) => {
28
+ let r = t.currentTarget;
29
+ switch (t.key) {
30
+ case "ArrowDown":
31
+ t.preventDefault(), s(l(r), r, 1);
32
+ break;
33
+ case "ArrowUp":
34
+ t.preventDefault(), s(l(r), r, -1);
35
+ break;
36
+ case "Home":
37
+ t.preventDefault(), l(r)[0]?.focus();
38
+ break;
39
+ case "End": {
40
+ t.preventDefault();
41
+ let e = l(r);
42
+ e[e.length - 1]?.focus();
43
+ break;
44
+ }
45
+ case "ArrowRight":
46
+ t.preventDefault(), c ? c() : o(r, 1);
47
+ break;
48
+ case "ArrowLeft":
49
+ t.preventDefault(), e ? e() : o(r, -1) || n.closeMenu({
50
+ event: t,
51
+ focusTrigger: !0,
52
+ reason: "triggerKeyDown"
53
+ });
54
+ break;
55
+ case "Escape":
56
+ t.preventDefault(), n.closeMenu({
57
+ event: t,
58
+ focusTrigger: !0,
59
+ reason: "escapeKeyDown"
60
+ });
61
+ break;
62
+ default: break;
63
+ }
64
+ }), k = x ? void 0 : i.component ?? (i.href ? n.linkComponent : void 0), A = x ? void 0 : i.href, { slotProps: j, ...M } = t(n.slotProps?.item, v) ?? {}, { ref: N, ...P } = T(y, S(M, {
65
+ [a]: "",
66
+ "aria-controls": x ? g : void 0,
67
+ "aria-current": v.active && A ? "page" : void 0,
68
+ "aria-expanded": x ? d : void 0,
69
+ component: k,
70
+ description: i.description,
71
+ disabled: i.disabled,
72
+ href: A,
73
+ icon: i.icon,
74
+ onClick: u,
75
+ onKeyDown: O,
76
+ rel: A ? i.rel : void 0,
77
+ selected: v.active,
78
+ slotProps: {
79
+ ...j,
80
+ label: S(j?.label, { variant: r === 0 ? "body1" : "body2" }),
81
+ trailing: S(j?.trailing, { sx: { color: "inherit" } })
82
+ },
83
+ target: A ? i.target : void 0,
84
+ trailing: x ? /* @__PURE__ */ b(E, { fontSize: "small" }) : void 0,
85
+ id: _,
86
+ variant: f === "columns" ? "plain" : "inset"
87
+ }), v), F = w(N, p);
88
+ return /* @__PURE__ */ b(y, {
89
+ ...P,
90
+ ref: F,
91
+ label: n.renderItem ? n.renderItem(i, v) : i.label
92
+ });
93
+ }
94
+ function k({ closeParent: n, ctx: i, depth: a, item: o, onSubmenuOpenChange: s, open: l = !1, resolvedLayout: u }) {
95
+ let d = y.useRef(null), p = y.useRef(null), m = y.useRef(null), h = y.useRef(void 0), g = y.useRef(!1), [E, k] = y.useState("right"), A = y.useId(), M = `${A}-submenu`, N = `${A}-trigger`, P = o.children ?? [], F = y.useCallback(() => {
96
+ h.current &&= (clearTimeout(h.current), void 0);
97
+ }, []);
98
+ y.useEffect(() => F, [F]);
99
+ let I = C(() => {
100
+ k(f(d.current, p.current));
101
+ });
102
+ y.useLayoutEffect(() => {
103
+ l && (I(), g.current && (g.current = !1, c(p.current)?.focus()));
104
+ }, [l, I]);
105
+ let L = C(() => {
106
+ F(), !o.disabled && (I(), s?.(!0));
107
+ }), R = C(() => {
108
+ F(), h.current = setTimeout(() => s?.(!1), i.ownerState.closeDelay);
109
+ }), z = C((e) => {
110
+ F(), s?.(!1), e && m.current?.focus();
111
+ }), B = C(() => {
112
+ if (l) {
113
+ c(p.current)?.focus();
114
+ return;
115
+ }
116
+ g.current = !0, L();
117
+ }), V = C(() => {
118
+ if (!l) {
119
+ L();
120
+ return;
121
+ }
122
+ z(!1);
123
+ }), H = D(i, o, {
124
+ depth: a,
125
+ heading: !1,
126
+ open: l,
127
+ resolvedLayout: u,
128
+ side: E
129
+ }), U = i.slots?.submenuNode ?? v, W = i.slots?.submenu ?? _, G = C((e) => {
130
+ let t = e.relatedTarget;
131
+ !t || e.currentTarget.contains(t) || z(!1);
132
+ }), { ref: K, ...q } = T(U, S(t(i.slotProps?.submenuNode, H), {
133
+ [r]: "",
134
+ "data-side": E,
135
+ onBlurCapture: G,
136
+ onFocus: I,
137
+ onPointerEnter: (e) => {
138
+ !o.disabled && e.pointerType !== "touch" && L();
139
+ },
140
+ onPointerLeave: (e) => {
141
+ e.pointerType !== "touch" && R();
142
+ }
143
+ }), H), J = w(K, d), { ref: Y, sx: X, ...Z } = T(W, S(t(i.slotProps?.submenu, H), {
144
+ "aria-hidden": l ? void 0 : !0,
145
+ "aria-labelledby": N,
146
+ id: M,
147
+ role: "region"
148
+ }), H), Q = w(Y, p);
149
+ return /* @__PURE__ */ x(U, {
150
+ ...q,
151
+ ref: J,
152
+ children: [/* @__PURE__ */ b(O, {
153
+ closeParent: n,
154
+ ctx: i,
155
+ depth: a,
156
+ item: o,
157
+ onOpenSubmenu: B,
158
+ onRowClick: V,
159
+ open: l,
160
+ resolvedLayout: u,
161
+ rowRef: m,
162
+ side: E,
163
+ submenuId: M,
164
+ triggerId: N
165
+ }), /* @__PURE__ */ b(W, {
166
+ ...Z,
167
+ ref: Q,
168
+ sx: [...e(X)],
169
+ children: l || i.keepMounted ? /* @__PURE__ */ b(j, {
170
+ closeParent: () => z(!0),
171
+ ctx: i,
172
+ depth: a + 1,
173
+ items: P
174
+ }) : null
175
+ })]
176
+ });
177
+ }
178
+ function A({ closeParent: e, ctx: r, depth: i, item: a }) {
179
+ let o = D(r, a, {
180
+ depth: i,
181
+ heading: !0,
182
+ open: !1,
183
+ resolvedLayout: "columns",
184
+ side: "right"
185
+ }), s = `${y.useId()}-heading`, c = r.slots?.column ?? p, l = r.slots?.heading ?? m, u = T(c, S(t(r.slotProps?.column, o), {
186
+ [n]: "",
187
+ "aria-labelledby": s
188
+ }), o), d = T(l, S(t(r.slotProps?.heading, o), {
189
+ component: "h3",
190
+ id: s
191
+ }), o);
192
+ return /* @__PURE__ */ x(c, {
193
+ ...u,
194
+ children: [/* @__PURE__ */ b(l, {
195
+ ...d,
196
+ children: r.renderItem ? r.renderItem(a, o) : a.label
197
+ }), (a.children ?? []).map((t) => /* @__PURE__ */ b(O, {
198
+ closeParent: e,
199
+ ctx: r,
200
+ depth: i + 1,
201
+ item: t,
202
+ onRowClick: (e) => r.closeMenu({
203
+ event: e,
204
+ reason: "itemClick"
205
+ }),
206
+ resolvedLayout: "columns"
207
+ }, t.id))]
208
+ });
209
+ }
210
+ function j({ closeParent: r, ctx: a, depth: o, items: s }) {
211
+ let c = d(s, a.ownerState.layout), [l, f] = y.useState(null), p = c === "columns" || !u(s), m = {
212
+ ...a.ownerState,
213
+ depth: o,
214
+ resolvedLayout: c,
215
+ scrollable: p
216
+ }, h = a.slots?.panel ?? g, { sx: _, ...v } = T(h, S(t(a.slotProps?.panel, m), {
217
+ [i]: "",
218
+ ...c === "list" ? { [n]: "" } : {}
219
+ }), m);
220
+ return /* @__PURE__ */ b(h, {
221
+ ...v,
222
+ sx: [...e(_)],
223
+ children: c === "columns" ? s.map((e) => /* @__PURE__ */ b(A, {
224
+ closeParent: r,
225
+ ctx: a,
226
+ depth: o,
227
+ item: e,
228
+ resolvedLayout: c
229
+ }, e.id)) : s.map((e) => e.children?.length ? /* @__PURE__ */ b(k, {
230
+ closeParent: r,
231
+ ctx: a,
232
+ depth: o,
233
+ item: e,
234
+ onSubmenuOpenChange: (t) => f((n) => t ? e.id : n === e.id ? null : n),
235
+ open: l === e.id,
236
+ resolvedLayout: c
237
+ }, e.id) : /* @__PURE__ */ b(O, {
238
+ closeParent: r,
239
+ ctx: a,
240
+ depth: o,
241
+ item: e,
242
+ onRowClick: (e) => a.closeMenu({
243
+ event: e,
244
+ reason: "itemClick"
245
+ }),
246
+ resolvedLayout: c
247
+ }, e.id))
248
+ });
249
+ }
250
+ //#endregion
251
+ export { j as MegaMenuPanelContent };
@@ -0,0 +1,65 @@
1
+ import { SMegaMenuItemState, SMegaMenuOwnerState, SMegaMenuPanelState, SMegaMenuTriggerState } from './types';
2
+ /**
3
+ * Navigation root. Semantic `nav` markup is fixed by the default slot; consumers
4
+ * can replace the slot when their application needs a custom navigation root.
5
+ */
6
+ export declare const SMegaMenuRoot: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
7
+ ownerState: SMegaMenuOwnerState;
8
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLElement>, HTMLElement>, {}>;
9
+ /**
10
+ * Top-level trigger.
11
+ *
12
+ * While its panel is open an invisible `::after` bridge extends past the bottom
13
+ * edge so the pointer never leaves a hoverable element on its way down to the
14
+ * panel surface. See the close-intent explanation in `s-mega-menu.tsx`.
15
+ */
16
+ export declare const SMegaMenuTrigger: import('@emotion/styled').StyledComponent<import('@mui/material').ButtonBaseOwnProps & Omit<import('@mui/material').ButtonBaseOwnProps, keyof import('@mui/material').ButtonBaseOwnProps> & import('@mui/material/OverridableComponent').CommonProps & Omit<import('react').DetailedHTMLProps<import('react').ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "className" | "style" | "classes" | "children" | "sx" | "disabled" | "tabIndex" | "action" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "nativeButton" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "type"> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
17
+ ownerState: SMegaMenuTriggerState;
18
+ }, {}, {}>;
19
+ /** Chevron rendered by the default trigger content, rotated while the panel is open. */
20
+ export declare const SMegaMenuTriggerArrow: import('@emotion/styled').StyledComponent<import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
21
+ ownerState: SMegaMenuTriggerState;
22
+ }, import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, {}>;
23
+ /**
24
+ * Popover hosting the top-level panel.
25
+ *
26
+ * `pointerEvents: 'none'` on the popover root plus `pointerEvents: 'auto'` on the
27
+ * surface keeps the page underneath interactive — the non-modal pattern
28
+ * documented in the SPopover `hover-preview` example. Without it the modal root
29
+ * would swallow every pointer event outside the surface.
30
+ */
31
+ export declare const SMegaMenuPopover: import('@emotion/styled').StyledComponent<Omit<import('../s-popover').SPopoverProps, "ref"> & import('react').RefAttributes<HTMLDivElement> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
32
+ ownerState?: SMegaMenuOwnerState;
33
+ }, {}, {}>;
34
+ /** Content container inside a panel surface. Also used for every flyout submenu. */
35
+ export declare const SMegaMenuPanel: import('@emotion/styled').StyledComponent<import('@mui/system').BoxOwnProps<import('@mui/material').Theme> & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('@mui/system').BoxOwnProps<import('@mui/material').Theme>> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
36
+ ownerState: SMegaMenuPanelState;
37
+ }, {}, {}>;
38
+ /** Column wrapper in the `columns` layout. */
39
+ export declare const SMegaMenuColumn: import('@emotion/styled').StyledComponent<import('@mui/system').BoxOwnProps<import('@mui/material').Theme> & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('@mui/system').BoxOwnProps<import('@mui/material').Theme>> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
40
+ ownerState: SMegaMenuItemState;
41
+ }, {}, {}>;
42
+ /** Non-interactive label of one column group. */
43
+ export declare const SMegaMenuHeading: import('@emotion/styled').StyledComponent<import('@mui/material').TypographyOwnProps & import('@mui/material/OverridableComponent').CommonProps & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "color" | "className" | "style" | "classes" | "children" | "sx" | "variant" | "align" | "gutterBottom" | "noWrap" | "variantMapping"> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
44
+ ownerState: SMegaMenuItemState;
45
+ }, {}, {}>;
46
+ /** Panel row. */
47
+ export declare const SMegaMenuItemRoot: import('@emotion/styled').StyledComponent<Omit<import('../s-list-action-item').SListActionItemProps, "ref"> & import('react').RefAttributes<HTMLElement> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
48
+ ownerState: SMegaMenuItemState;
49
+ }, {}, {}>;
50
+ /**
51
+ * Positioned wrapper around a row plus its flyout submenu.
52
+ *
53
+ * While open, an invisible `::after` bridge spans the horizontal gap between the
54
+ * row and the submenu, flipped to the other side when collision detection moved
55
+ * the submenu left. Because the submenu is a DOM descendant of this wrapper, the
56
+ * pointer never leaves the wrapper on its way across — `pointerleave` simply
57
+ * does not fire.
58
+ */
59
+ export declare const SMegaMenuSubmenuNode: import('@emotion/styled').StyledComponent<import('@mui/system').BoxOwnProps<import('@mui/material').Theme> & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof import('@mui/system').BoxOwnProps<import('@mui/material').Theme>> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
60
+ ownerState: SMegaMenuItemState;
61
+ }, {}, {}>;
62
+ /** Flyout submenu surface rendered next to a nested row. */
63
+ export declare const SMegaMenuSubmenu: import('@emotion/styled').StyledComponent<import('@mui/material').PaperOwnProps & import('@mui/material/OverridableComponent').CommonProps & Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "className" | "style" | "classes" | "children" | "elevation" | "square" | "sx" | "variant"> & import('@mui/system').MUIStyledCommonProps<import('@mui/material').Theme> & {
64
+ ownerState: SMegaMenuItemState;
65
+ }, {}, {}>;
@@ -0,0 +1,232 @@
1
+ import { actionHoverMedia as e, getFocusVisibleStyle as t, reducedMotionMedia as n } from "../theme/components/action-styles.js";
2
+ import { SListActionItem as r } from "../s-list-action-item/s-list-action-item.js";
3
+ import { SPopover as i } from "../s-popover/s-popover.js";
4
+ import { Box as a, ButtonBase as o, Paper as s, Typography as c, styled as l } from "@mui/material";
5
+ //#region lib/s-mega-menu/mega-menu-slots.tsx
6
+ var u = 44, d = .75, f = l("nav", {
7
+ name: "SMegaMenu",
8
+ slot: "Root",
9
+ shouldForwardProp: (e) => e !== "ownerState"
10
+ })(({ theme: e }) => ({
11
+ alignItems: "center",
12
+ display: "flex",
13
+ flexWrap: "nowrap",
14
+ gap: e.spacing(1.25),
15
+ minWidth: 0,
16
+ [e.breakpoints.down("lg")]: { gap: e.spacing(.75) }
17
+ })), p = l(o, {
18
+ name: "SMegaMenu",
19
+ slot: "Trigger",
20
+ shouldForwardProp: (e) => e !== "ownerState"
21
+ })(({ theme: r }) => ({
22
+ ...r.typography.body1,
23
+ alignItems: "center",
24
+ backgroundColor: "transparent",
25
+ border: "1px solid transparent",
26
+ borderRadius: r.radius.md,
27
+ color: (r.vars ?? r).palette.text.primary,
28
+ display: "inline-flex",
29
+ gap: r.spacing(1.25),
30
+ minHeight: u,
31
+ minWidth: 0,
32
+ padding: r.spacing(.75, 1.5),
33
+ position: "relative",
34
+ textDecoration: "none",
35
+ transition: r.transitions.create([
36
+ "background-color",
37
+ "border-color",
38
+ "color"
39
+ ], { duration: r.transitions.duration.shorter }),
40
+ whiteSpace: "nowrap",
41
+ [e]: { "&:hover": { backgroundColor: (r.vars ?? r).palette.action.hover } },
42
+ "&.Mui-focusVisible": {
43
+ backgroundColor: (r.vars ?? r).palette.action.focus,
44
+ ...t(r)
45
+ },
46
+ "&.Mui-disabled": { color: (r.vars ?? r).palette.text.disabled },
47
+ [r.breakpoints.down("lg")]: { padding: r.spacing(.75, 1) },
48
+ [n]: { transition: "none" },
49
+ variants: [{
50
+ props: ({ ownerState: e }) => e.open,
51
+ style: {
52
+ backgroundColor: (r.vars ?? r).palette.action.selected,
53
+ "&::after": {
54
+ content: "\"\"",
55
+ height: r.spacing(2.5),
56
+ left: 0,
57
+ position: "absolute",
58
+ top: "100%",
59
+ width: "100%"
60
+ },
61
+ [e]: { "&:hover": { backgroundColor: (r.vars ?? r).palette.action.selected } }
62
+ }
63
+ }, {
64
+ props: ({ ownerState: e }) => e.active,
65
+ style: {
66
+ backgroundColor: (r.vars ?? r).palette.action.selected,
67
+ color: (r.vars ?? r).palette.text.primary,
68
+ fontWeight: r.typography.fontWeightMedium,
69
+ [e]: { "&:hover": { backgroundColor: (r.vars ?? r).palette.action.selected } }
70
+ }
71
+ }]
72
+ })), m = l("span", {
73
+ name: "SMegaMenu",
74
+ slot: "TriggerArrow",
75
+ shouldForwardProp: (e) => e !== "ownerState"
76
+ })(({ theme: e }) => ({
77
+ alignItems: "center",
78
+ color: "inherit",
79
+ display: "inline-flex",
80
+ flexShrink: 0,
81
+ transition: e.transitions.create(["transform"], { duration: e.transitions.duration.shorter }),
82
+ [n]: { transition: "none" },
83
+ variants: [{
84
+ props: ({ ownerState: e }) => e.open,
85
+ style: { transform: "rotate(180deg)" }
86
+ }]
87
+ })), h = l(i, {
88
+ name: "SMegaMenu",
89
+ slot: "Popover",
90
+ shouldForwardProp: (e) => e !== "ownerState"
91
+ })({ pointerEvents: "none" }), g = l(a, {
92
+ name: "SMegaMenu",
93
+ slot: "Panel",
94
+ shouldForwardProp: (e) => e !== "ownerState"
95
+ })(({ theme: e }) => ({
96
+ minWidth: 0,
97
+ variants: [
98
+ {
99
+ props: ({ ownerState: e }) => e.resolvedLayout === "list",
100
+ style: {
101
+ display: "block",
102
+ paddingBlock: e.spacing(d)
103
+ }
104
+ },
105
+ {
106
+ props: ({ ownerState: e }) => e.resolvedLayout === "columns",
107
+ style: {
108
+ alignItems: "start",
109
+ columnGap: e.spacing(5),
110
+ display: "grid",
111
+ gridAutoColumns: "1fr",
112
+ gridAutoFlow: "column",
113
+ padding: e.spacing(d)
114
+ }
115
+ },
116
+ {
117
+ props: ({ ownerState: e }) => e.scrollable,
118
+ style: {
119
+ maxHeight: "min(70vh, 620px)",
120
+ overflowY: "auto"
121
+ }
122
+ }
123
+ ]
124
+ })), _ = l(a, {
125
+ name: "SMegaMenu",
126
+ slot: "Column",
127
+ shouldForwardProp: (e) => e !== "ownerState"
128
+ })(({ theme: e }) => ({
129
+ display: "flex",
130
+ flexDirection: "column",
131
+ gap: e.spacing(d),
132
+ minWidth: 0
133
+ })), v = l(c, {
134
+ name: "SMegaMenu",
135
+ slot: "Heading",
136
+ shouldForwardProp: (e) => e !== "ownerState"
137
+ })(({ theme: e }) => ({
138
+ ...e.typography.subtitle1,
139
+ color: (e.vars ?? e).palette.text.primary,
140
+ margin: 0,
141
+ padding: e.spacing(1, 1.5, .5),
142
+ whiteSpace: "nowrap"
143
+ })), y = l(r, {
144
+ name: "SMegaMenu",
145
+ slot: "Item",
146
+ shouldForwardProp: (e) => e !== "ownerState"
147
+ })(({ theme: e }) => ({
148
+ borderRadius: e.radius.md,
149
+ flex: "0 0 auto",
150
+ paddingInline: e.spacing(1.5),
151
+ whiteSpace: "nowrap",
152
+ variants: [{
153
+ props: ({ ownerState: e }) => e.resolvedLayout === "list",
154
+ style: {
155
+ marginInline: e.spacing(d),
156
+ width: `calc(100% - ${e.spacing(d * 2)})`
157
+ }
158
+ }]
159
+ })), b = l(a, {
160
+ name: "SMegaMenu",
161
+ slot: "SubmenuNode",
162
+ shouldForwardProp: (e) => e !== "ownerState"
163
+ })(({ theme: e }) => ({
164
+ minWidth: 0,
165
+ position: "relative",
166
+ variants: [{
167
+ props: ({ ownerState: e }) => e.open,
168
+ style: { "&::after": {
169
+ content: "\"\"",
170
+ height: "100%",
171
+ left: "100%",
172
+ position: "absolute",
173
+ top: 0,
174
+ width: e.spacing(1.5)
175
+ } }
176
+ }, {
177
+ props: ({ ownerState: e }) => e.open && e.side === "left",
178
+ style: { "&::after": {
179
+ left: "auto",
180
+ right: "100%"
181
+ } }
182
+ }]
183
+ })), x = l(s, {
184
+ name: "SMegaMenu",
185
+ slot: "Submenu",
186
+ shouldForwardProp: (e) => e !== "ownerState"
187
+ })(({ theme: e }) => ({
188
+ backgroundColor: (e.vars ?? e).palette.background.paper,
189
+ backgroundImage: "none",
190
+ border: "1px solid",
191
+ borderColor: (e.vars ?? e).palette.divider,
192
+ borderRadius: e.radius.md,
193
+ left: `calc(100% + ${e.spacing(1.5)})`,
194
+ minWidth: e.spacing(25),
195
+ opacity: 0,
196
+ overflow: "visible",
197
+ pointerEvents: "none",
198
+ position: "absolute",
199
+ top: 0,
200
+ transform: `translateX(${e.spacing(1)})`,
201
+ transition: e.transitions.create([
202
+ "opacity",
203
+ "transform",
204
+ "visibility"
205
+ ], { duration: e.transitions.duration.shorter }),
206
+ visibility: "hidden",
207
+ width: "max-content",
208
+ zIndex: 1,
209
+ [n]: {
210
+ transform: "none",
211
+ transition: "none"
212
+ },
213
+ variants: [{
214
+ props: ({ ownerState: e }) => e.side === "left",
215
+ style: {
216
+ left: "auto",
217
+ right: `calc(100% + ${e.spacing(1.5)})`,
218
+ transform: `translateX(-${e.spacing(1)})`
219
+ }
220
+ }, {
221
+ props: ({ ownerState: e }) => e.open,
222
+ style: {
223
+ opacity: 1,
224
+ pointerEvents: "auto",
225
+ transform: "translateX(0)",
226
+ visibility: "visible",
227
+ zIndex: 2
228
+ }
229
+ }]
230
+ }));
231
+ //#endregion
232
+ export { _ as SMegaMenuColumn, v as SMegaMenuHeading, y as SMegaMenuItemRoot, g as SMegaMenuPanel, h as SMegaMenuPopover, f as SMegaMenuRoot, x as SMegaMenuSubmenu, b as SMegaMenuSubmenuNode, p as SMegaMenuTrigger, m as SMegaMenuTriggerArrow };
@@ -0,0 +1,35 @@
1
+ import { SMegaMenuItem, SMegaMenuOwnerState, SMegaMenuSlotProps, SMegaMenuSlots, SMegaMenuTriggerState } from './types';
2
+ import * as React from 'react';
3
+ export interface MegaMenuTriggerButtonProps<T = unknown> {
4
+ /** The trigger points at the active `href`. */
5
+ active: boolean;
6
+ /** The item has children, so the trigger owns a panel. */
7
+ hasPanel: boolean;
8
+ item: SMegaMenuItem<T>;
9
+ /** Default element used when the item has an `href`. */
10
+ linkComponent?: React.ElementType;
11
+ onClick: React.MouseEventHandler<HTMLElement>;
12
+ onFocus: React.FocusEventHandler<HTMLElement>;
13
+ onKeyDown: React.KeyboardEventHandler<HTMLElement>;
14
+ onPointerEnter: React.PointerEventHandler<HTMLElement>;
15
+ onPointerLeave: React.PointerEventHandler<HTMLElement>;
16
+ /** The trigger's panel is open. */
17
+ open: boolean;
18
+ ownerState: SMegaMenuOwnerState<T>;
19
+ /** `id` of the panel surface, referenced by `aria-controls` while open. */
20
+ panelId: string;
21
+ /** Registers the rendered element so the menu can anchor to it and restore focus. */
22
+ registerRef: (id: string, node: HTMLElement | null) => void;
23
+ renderTrigger?: (item: SMegaMenuItem<T>, state: SMegaMenuTriggerState<T>) => React.ReactNode;
24
+ slotProps?: SMegaMenuSlotProps<T>;
25
+ slots?: SMegaMenuSlots;
26
+ /** Stable accessible relationship target for the panel's `aria-labelledby`. */
27
+ triggerId: string;
28
+ }
29
+ /**
30
+ * A single top-level trigger.
31
+ *
32
+ * Extracted from `SMegaMenu` so the per-item `useForkRef` stays a top-level hook
33
+ * instead of being called inside a render loop.
34
+ */
35
+ export declare function MegaMenuTriggerButton<T>({ active, hasPanel, item, linkComponent, onClick, onFocus, onKeyDown, onPointerEnter, onPointerLeave, open, ownerState, panelId, registerRef, renderTrigger, slotProps, slots, triggerId, }: Readonly<MegaMenuTriggerButtonProps<T>>): React.JSX.Element;
@@ -0,0 +1,49 @@
1
+ import { resolveOwnerStateSlotProps as e } from "../utils/slots.js";
2
+ import { TRIGGER_ATTRIBUTE as t } from "./utils.js";
3
+ import { SMegaMenuTrigger as n, SMegaMenuTriggerArrow as r } from "./mega-menu-slots.js";
4
+ import * as i from "react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ import { mergeSlotProps as s, useForkRef as c } from "@mui/material/utils";
7
+ import l from "@mui/utils/appendOwnerState";
8
+ import u from "@mui/icons-material/KeyboardArrowDown";
9
+ //#region lib/s-mega-menu/mega-menu-trigger.tsx
10
+ function d({ active: d, hasPanel: f, item: p, linkComponent: m, onClick: h, onFocus: g, onKeyDown: _, onPointerEnter: v, onPointerLeave: y, open: b, ownerState: x, panelId: S, registerRef: C, renderTrigger: w, slotProps: T, slots: E, triggerId: D }) {
11
+ let O = {
12
+ ...x,
13
+ active: d,
14
+ hasPanel: f,
15
+ item: p,
16
+ open: b
17
+ }, k = E?.trigger ?? n, A = E?.triggerArrow ?? r, j = f || !p.href ? "button" : p.component ?? m ?? "a", { ref: M, ...N } = l(k, s(e(T?.trigger, O), {
18
+ [t]: "",
19
+ "aria-controls": b ? S : void 0,
20
+ "aria-current": d && !f ? "page" : void 0,
21
+ "aria-expanded": f ? b : void 0,
22
+ component: j,
23
+ disabled: p.disabled,
24
+ href: f ? void 0 : p.href,
25
+ id: D,
26
+ nativeButton: j === "button",
27
+ onClick: h,
28
+ onFocus: g,
29
+ onKeyDown: _,
30
+ onPointerEnter: v,
31
+ onPointerLeave: y,
32
+ rel: p.rel,
33
+ target: p.target
34
+ }), O), P = l(A, e(T?.triggerArrow, O) ?? {}, O), F = c(M, i.useCallback((e) => C(p.id, e), [p.id, C]));
35
+ return /* @__PURE__ */ a(k, {
36
+ ...N,
37
+ ref: F,
38
+ children: w ? w(p, O) : /* @__PURE__ */ o(i.Fragment, { children: [
39
+ p.icon,
40
+ /* @__PURE__ */ a("span", { children: p.label }),
41
+ f ? /* @__PURE__ */ a(A, {
42
+ ...P,
43
+ children: /* @__PURE__ */ a(u, { fontSize: "small" })
44
+ }) : null
45
+ ] })
46
+ });
47
+ }
48
+ //#endregion
49
+ export { d as MegaMenuTriggerButton };
@@ -0,0 +1,23 @@
1
+ import { SMegaMenuProps } from './types';
2
+ import * as React from 'react';
3
+ interface SMegaMenuComponent {
4
+ <T = unknown>(props: SMegaMenuProps<T> & React.RefAttributes<HTMLElement>): React.JSX.Element;
5
+ displayName?: string;
6
+ }
7
+ /**
8
+ * Multi-level navigation mega menu built on `SPopover`.
9
+ *
10
+ * The panel opens on hover, click/tap and keyboard, and — the point of
11
+ * the component — never closes while the pointer or focus travels between the
12
+ * trigger and the panel content:
13
+ *
14
+ * 1. An invisible `::after` bridge under an open trigger covers the vertical gap,
15
+ * and a second bridge on every submenu wrapper covers the horizontal gap, so
16
+ * `pointerleave` usually does not fire at all while crossing.
17
+ * 2. Any `pointerleave` that does fire only *schedules* a close after
18
+ * `closeDelay`; entering the panel surface cancels the pending close.
19
+ * 3. Focus never closes the panel unless `relatedTarget` is outside both the
20
+ * navigation root and the panel surface.
21
+ */
22
+ export declare const SMegaMenu: SMegaMenuComponent;
23
+ export default SMegaMenu;