@tedi-design-system/react 18.0.0-rc.7 → 18.0.0-rc.9
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/_virtual/index.es13.js +2 -2
- package/_virtual/index.es14.js +2 -2
- package/bundle-stats.html +1 -1
- package/external/react-is/index.cjs.js +1 -1
- package/external/react-is/index.es.js +1 -1
- package/external/toposort/index.cjs.js +1 -1
- package/external/toposort/index.es.js +1 -1
- package/index.css +1 -1
- package/package.json +1 -1
- package/src/community/components/form/pickers/calendar/calendar.d.ts +6 -0
- package/src/community/components/form/pickers/datepicker/datepicker.d.ts +6 -0
- package/src/community/components/form/pickers/datetimepicker/datetimepicker.d.ts +6 -0
- package/src/community/components/form/pickers/timepicker/timepicker.d.ts +6 -0
- package/src/tedi/components/content/calendar/calendar-grid.cjs.js +1 -1
- package/src/tedi/components/content/calendar/calendar-grid.es.js +7 -6
- package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.cjs.js +1 -1
- package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.es.js +99 -79
- package/src/tedi/components/form/date-field/date-field-helpers.cjs.js +1 -0
- package/src/tedi/components/form/date-field/date-field-helpers.d.ts +66 -0
- package/src/tedi/components/form/date-field/date-field-helpers.es.js +28 -0
- package/src/tedi/components/form/date-field/date-field.cjs.js +1 -1
- package/src/tedi/components/form/date-field/date-field.d.ts +22 -0
- package/src/tedi/components/form/date-field/date-field.es.js +248 -212
- package/src/tedi/components/form/date-time-field/date-time-field.cjs.js +1 -0
- package/src/tedi/components/form/date-time-field/date-time-field.d.ts +207 -0
- package/src/tedi/components/form/date-time-field/date-time-field.es.js +376 -0
- package/src/tedi/components/form/date-time-field/date-time-field.module.scss.cjs.js +1 -0
- package/src/tedi/components/form/date-time-field/date-time-field.module.scss.es.js +30 -0
- package/src/tedi/components/form/time-field/time-field.cjs.js +1 -1
- package/src/tedi/components/form/time-field/time-field.d.ts +9 -0
- package/src/tedi/components/form/time-field/time-field.es.js +81 -79
- package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.cjs.js +1 -0
- package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.d.ts +52 -0
- package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.es.js +68 -0
- package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.module.scss.cjs.js +1 -0
- package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.module.scss.es.js +9 -0
- package/src/tedi/components/layout/mobile-nav/index.d.ts +2 -0
- package/src/tedi/components/layout/mobile-nav/mobile-nav.cjs.js +1 -0
- package/src/tedi/components/layout/mobile-nav/mobile-nav.d.ts +20 -0
- package/src/tedi/components/layout/{sidenav/components/sidenav-mobile/sidenav-mobile.es.js → mobile-nav/mobile-nav.es.js} +21 -20
- package/src/tedi/components/layout/sidenav/index.d.ts +2 -2
- package/src/tedi/components/layout/sidenav/sidenav.cjs.js +1 -1
- package/src/tedi/components/layout/sidenav/sidenav.d.ts +2 -11
- package/src/tedi/components/layout/sidenav/sidenav.es.js +27 -27
- package/src/tedi/components/layout/top-nav/components/top-nav-group/top-nav-group.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-group/top-nav-group.d.ts +34 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-group/top-nav-group.es.js +33 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-item/top-nav-item.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-item/top-nav-item.d.ts +66 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-item/top-nav-item.es.js +101 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.d.ts +11 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.es.js +9 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-subitem/top-nav-subitem.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-subitem/top-nav-subitem.d.ts +28 -0
- package/src/tedi/components/layout/top-nav/components/top-nav-subitem/top-nav-subitem.es.js +30 -0
- package/src/tedi/components/layout/top-nav/index.d.ts +5 -0
- package/src/tedi/components/layout/top-nav/top-nav-context.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/top-nav-context.d.ts +11 -0
- package/src/tedi/components/layout/top-nav/top-nav-context.es.js +6 -0
- package/src/tedi/components/layout/top-nav/top-nav.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/top-nav.d.ts +91 -0
- package/src/tedi/components/layout/top-nav/top-nav.es.js +171 -0
- package/src/tedi/components/layout/top-nav/top-nav.module.scss.cjs.js +1 -0
- package/src/tedi/components/layout/top-nav/top-nav.module.scss.es.js +28 -0
- package/src/tedi/components/overlays/dropdown/dropdown.es.js +0 -3
- package/src/tedi/helpers/hooks/use-breakpoint.cjs.js +1 -1
- package/src/tedi/helpers/hooks/use-breakpoint.d.ts +7 -0
- package/src/tedi/helpers/hooks/use-breakpoint.es.js +22 -14
- package/src/tedi/index.d.ts +3 -0
- package/src/tedi/providers/label-provider/labels-map.cjs.js +1 -1
- package/src/tedi/providers/label-provider/labels-map.d.ts +28 -0
- package/src/tedi/providers/label-provider/labels-map.es.js +93 -65
- package/tedi.cjs.js +1 -1
- package/tedi.es.js +237 -222
- package/src/tedi/components/layout/sidenav/components/sidenav-mobile/sidenav-mobile.cjs.js +0 -1
- package/src/tedi/components/layout/sidenav/components/sidenav-mobile/sidenav-mobile.d.ts +0 -14
- package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.cjs.js +0 -1
- package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.d.ts +0 -31
- package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.es.js +0 -48
- package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.module.scss.cjs.js +0 -1
- package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.module.scss.es.js +0 -8
|
@@ -1,76 +1,76 @@
|
|
|
1
1
|
import { jsx as o, jsxs as T } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
2
|
+
import { useState as M, useEffect as V, createElement as q } from "react";
|
|
3
3
|
import F from "../../../../../external/classnames/index.es.js";
|
|
4
4
|
import { Print as G } from "../../misc/print/print.es.js";
|
|
5
|
+
import { MobileNavToggle as O } from "../mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.es.js";
|
|
6
|
+
import { MobileNav as g } from "../mobile-nav/mobile-nav.es.js";
|
|
5
7
|
import { SideNavDropdown as H } from "./components/sidenav-dropdown/sidenav-dropdown.es.js";
|
|
6
|
-
import { SideNavItem as
|
|
7
|
-
import { SideNavMobile as g } from "./components/sidenav-mobile/sidenav-mobile.es.js";
|
|
8
|
-
import { SidenavToggle as h } from "./components/sidenav-toggle/sidenav-toggle.es.js";
|
|
8
|
+
import { SideNavItem as h } from "./components/sidenav-item/sidenav-item.es.js";
|
|
9
9
|
import a from "./sidenav.module.scss.es.js";
|
|
10
10
|
import { useBreakpoint as J, isBreakpointBelow as K } from "../../../helpers/hooks/use-breakpoint.es.js";
|
|
11
|
-
const Q = (
|
|
11
|
+
const Q = (l) => {
|
|
12
12
|
const {
|
|
13
13
|
navItems: d,
|
|
14
|
-
ariaLabel:
|
|
14
|
+
ariaLabel: n,
|
|
15
15
|
linkAs: p,
|
|
16
|
-
showDividers:
|
|
16
|
+
showDividers: k = !0,
|
|
17
17
|
className: c,
|
|
18
|
-
mobileBreakpoint:
|
|
19
|
-
showMobileOverlay:
|
|
18
|
+
mobileBreakpoint: w = "tablet",
|
|
19
|
+
showMobileOverlay: I = !0,
|
|
20
20
|
isMobileOpen: v,
|
|
21
|
-
isCollapsed:
|
|
21
|
+
isCollapsed: B = !1,
|
|
22
22
|
onMenuToggle: r,
|
|
23
23
|
onCollapseToggle: m,
|
|
24
|
-
sideNavItemSize:
|
|
24
|
+
sideNavItemSize: S = "default",
|
|
25
25
|
...f
|
|
26
|
-
} =
|
|
26
|
+
} = l, y = (e) => ({
|
|
27
27
|
mobile: "md",
|
|
28
28
|
tablet: "lg"
|
|
29
|
-
})[e], j = J(),
|
|
29
|
+
})[e], j = J(), s = K(j, y(w)), i = v !== void 0, [x, b] = M(!s), u = i ? v : x, [D, E] = M(B), t = s ? !1 : D, P = "isCollapsed" in l;
|
|
30
30
|
V(() => {
|
|
31
|
-
|
|
32
|
-
}, [
|
|
31
|
+
i || b(!s);
|
|
32
|
+
}, [s, i]);
|
|
33
33
|
const _ = (e) => {
|
|
34
34
|
E(e), m == null || m(e);
|
|
35
35
|
}, z = () => {
|
|
36
36
|
_(!t);
|
|
37
37
|
}, C = (e) => {
|
|
38
|
-
|
|
38
|
+
i || b(e), r == null || r(e);
|
|
39
39
|
}, A = () => {
|
|
40
40
|
C(!u);
|
|
41
41
|
}, L = F(a["tedi-sidenav"], c, {
|
|
42
|
-
[a["tedi-sidenav--has-dividers"]]:
|
|
42
|
+
[a["tedi-sidenav--has-dividers"]]: k,
|
|
43
43
|
[a["tedi-sidenav--collapsed"]]: t
|
|
44
44
|
});
|
|
45
|
-
return
|
|
45
|
+
return s ? /* @__PURE__ */ o(
|
|
46
46
|
g,
|
|
47
47
|
{
|
|
48
48
|
navItems: d,
|
|
49
|
-
ariaLabel:
|
|
49
|
+
ariaLabel: n,
|
|
50
50
|
linkAs: p,
|
|
51
51
|
isOpen: u,
|
|
52
52
|
onClose: () => C(!1),
|
|
53
|
-
showOverlay:
|
|
53
|
+
showOverlay: I,
|
|
54
54
|
className: c,
|
|
55
55
|
...f
|
|
56
56
|
}
|
|
57
|
-
) : /* @__PURE__ */ o(G, { visibility: "hide", children: /* @__PURE__ */ T("nav", { id:
|
|
58
|
-
P && /* @__PURE__ */ o(
|
|
59
|
-
/* @__PURE__ */ o("ul", { className: a["tedi-sidenav__list"], role: "menubar", "aria-label":
|
|
60
|
-
|
|
57
|
+
) : /* @__PURE__ */ o(G, { visibility: "hide", children: /* @__PURE__ */ T("nav", { id: l.id, "data-name": "sidenav", ...f, className: L, "aria-label": n, children: [
|
|
58
|
+
P && /* @__PURE__ */ o(O, { menuOpen: !t, toggleMenu: z, variant: "collapse" }),
|
|
59
|
+
/* @__PURE__ */ o("ul", { className: a["tedi-sidenav__list"], role: "menubar", "aria-label": n, children: d.map((e, N) => /* @__PURE__ */ q(
|
|
60
|
+
h,
|
|
61
61
|
{
|
|
62
62
|
as: p,
|
|
63
63
|
...e,
|
|
64
64
|
key: N,
|
|
65
65
|
onItemClick: A,
|
|
66
66
|
isCollapsed: t,
|
|
67
|
-
sideNavItemSize:
|
|
67
|
+
sideNavItemSize: S
|
|
68
68
|
}
|
|
69
69
|
)) })
|
|
70
70
|
] }) });
|
|
71
71
|
}, te = Object.assign(Q, {
|
|
72
|
-
Toggle:
|
|
73
|
-
Item:
|
|
72
|
+
Toggle: O,
|
|
73
|
+
Item: h,
|
|
74
74
|
Dropdown: H,
|
|
75
75
|
Mobile: g
|
|
76
76
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),n=require("../../../../../../../external/classnames/index.cjs.js"),d=require("../../../../base/icon/icon.cjs.js"),s=require("../../top-nav.module.scss.cjs.js"),o=({title:a,children:r,icon:e,headingLevel:u="h3",className:i})=>{const l=u;return t.jsxs("section",{className:n.default(s.default["tedi-top-nav__group"],i),children:[a&&t.jsxs(l,{className:s.default["tedi-top-nav__group-title"],children:[e&&t.jsx(d.Icon,{className:s.default["tedi-top-nav__group-icon"],...typeof e=="string"?{name:e}:e,size:typeof e=="string"?16:e.size??16,color:"inherit"}),a]}),t.jsx("ul",{className:s.default["tedi-top-nav__group-list"],children:r})]})};o.displayName="TopNav.Group";exports.TopNavGroup=o;exports.default=o;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { IconWithoutBackgroundProps } from '../../../../base/icon/icon';
|
|
3
|
+
export interface TopNavGroupProps {
|
|
4
|
+
/**
|
|
5
|
+
* Uppercase section title rendered above the link list. When omitted, the
|
|
6
|
+
* heading is not rendered — useful for a single-column mega-menu that only
|
|
7
|
+
* lists links.
|
|
8
|
+
*/
|
|
9
|
+
title?: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* `TopNav.SubItem` children. Anything else is ignored.
|
|
12
|
+
*/
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Optional leading icon rendered next to the title — material-symbol name or
|
|
16
|
+
* full `IconWithoutBackgroundProps`. Ignored when `title` is omitted.
|
|
17
|
+
*/
|
|
18
|
+
icon?: string | IconWithoutBackgroundProps;
|
|
19
|
+
/**
|
|
20
|
+
* HTML heading level used for the title — pick the value that keeps the
|
|
21
|
+
* document outline correct on the host page.
|
|
22
|
+
* @default h3
|
|
23
|
+
*/
|
|
24
|
+
headingLevel?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
25
|
+
/**
|
|
26
|
+
* Additional class name applied to the column.
|
|
27
|
+
*/
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare const TopNavGroup: {
|
|
31
|
+
({ title, children, icon, headingLevel, className, }: TopNavGroupProps): JSX.Element;
|
|
32
|
+
displayName: string;
|
|
33
|
+
};
|
|
34
|
+
export default TopNavGroup;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsxs as e, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import l from "../../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { Icon as n } from "../../../../base/icon/icon.es.js";
|
|
4
|
+
import o from "../../top-nav.module.scss.es.js";
|
|
5
|
+
const d = ({
|
|
6
|
+
title: t,
|
|
7
|
+
children: r,
|
|
8
|
+
icon: s,
|
|
9
|
+
headingLevel: p = "h3",
|
|
10
|
+
className: i
|
|
11
|
+
}) => {
|
|
12
|
+
const m = p;
|
|
13
|
+
return /* @__PURE__ */ e("section", { className: l(o["tedi-top-nav__group"], i), children: [
|
|
14
|
+
t && /* @__PURE__ */ e(m, { className: o["tedi-top-nav__group-title"], children: [
|
|
15
|
+
s && /* @__PURE__ */ a(
|
|
16
|
+
n,
|
|
17
|
+
{
|
|
18
|
+
className: o["tedi-top-nav__group-icon"],
|
|
19
|
+
...typeof s == "string" ? { name: s } : s,
|
|
20
|
+
size: typeof s == "string" ? 16 : s.size ?? 16,
|
|
21
|
+
color: "inherit"
|
|
22
|
+
}
|
|
23
|
+
),
|
|
24
|
+
t
|
|
25
|
+
] }),
|
|
26
|
+
/* @__PURE__ */ a("ul", { className: o["tedi-top-nav__group-list"], children: r })
|
|
27
|
+
] });
|
|
28
|
+
};
|
|
29
|
+
d.displayName = "TopNav.Group";
|
|
30
|
+
export {
|
|
31
|
+
d as TopNavGroup,
|
|
32
|
+
d as default
|
|
33
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),a=require("../../../../../../../external/classnames/index.cjs.js"),C=require("react"),f=require("../../../../base/icon/icon.cjs.js"),e=require("../../top-nav.module.scss.cjs.js"),v=C.forwardRef((b,h)=>{const{children:N,href:d,icon:n,isActive:o=!1,hasSubmenu:u=!1,disabled:s=!1,onClick:l,as:x,className:I,submenu:j,renderSubmenuInline:g=!1,isSubmenuOpen:y,panelId:r,...S}=b,c=!d&&u,T=x??(c?"button":"a"),i=y??o,p=g&&i&&u,k=m=>{if(s){m.preventDefault();return}l==null||l(m)},q=a.default(e.default["tedi-top-nav__link"],{[e.default["tedi-top-nav__link--active"]]:o||i},I),w={...S,ref:h,className:q,onClick:k,...c?{type:"button",disabled:s,"aria-haspopup":!0,"aria-expanded":i,"aria-controls":r}:{href:s?void 0:d,"aria-current":o?"page":void 0,"aria-disabled":s||void 0}};return t.jsxs("li",{className:a.default(e.default["tedi-top-nav__item"],{[e.default["tedi-top-nav__item--has-inline-submenu"]]:p}),children:[t.jsxs(T,{...w,children:[n&&t.jsx(f.Icon,{className:e.default["tedi-top-nav__icon"],...typeof n=="string"?{name:n}:n,size:typeof n=="string"?18:n.size??18,color:"inherit"}),N,u&&t.jsx(f.Icon,{className:a.default(e.default["tedi-top-nav__icon"],e.default["tedi-top-nav__chevron"],{[e.default["tedi-top-nav__chevron--open"]]:i}),name:"keyboard_arrow_down",size:18,color:"inherit"})]}),p&&t.jsx("div",{id:r,className:a.default(e.default["tedi-top-nav__submenu"],e.default["tedi-top-nav__submenu--inline"]),"data-name":"top-nav-submenu",children:t.jsx("div",{className:a.default(e.default["tedi-top-nav__submenu-inner"],e.default["tedi-top-nav__submenu-inner--inline"]),children:j})})]})});v.displayName="TopNav.Item";const _=v;exports.TopNavItem=_;exports.default=_;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { PolymorphicComponentPropWithRef } from '../../../../../helpers/polymorphic/types';
|
|
3
|
+
import { IconWithoutBackgroundProps } from '../../../../base/icon/icon';
|
|
4
|
+
type TopNavItemLinkProps = {
|
|
5
|
+
/**
|
|
6
|
+
* Submenu content — typically a fragment of `TopNav.Group` elements.
|
|
7
|
+
* When provided and `isActive` is `true`, the parent `TopNav` renders
|
|
8
|
+
* the submenu inside the mega-menu panel below the bar, and a
|
|
9
|
+
* `keyboard_arrow_down` chevron is added next to the label.
|
|
10
|
+
*
|
|
11
|
+
* A mega-menu item is a toggle, not a link, so `href` is **not** allowed
|
|
12
|
+
* alongside `submenu` — the two are mutually exclusive.
|
|
13
|
+
*/
|
|
14
|
+
submenu: React.ReactNode;
|
|
15
|
+
href?: never;
|
|
16
|
+
} | {
|
|
17
|
+
/**
|
|
18
|
+
* Destination URL. Omit when the item only opens a submenu.
|
|
19
|
+
*/
|
|
20
|
+
href?: string;
|
|
21
|
+
submenu?: never;
|
|
22
|
+
};
|
|
23
|
+
type TopNavItemOwnProps = {
|
|
24
|
+
/**
|
|
25
|
+
* Bar label. Pass a string or any ReactNode that renders inline.
|
|
26
|
+
*/
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
/**
|
|
29
|
+
* Optional leading icon — material-symbol name or full `IconWithoutBackgroundProps`.
|
|
30
|
+
*/
|
|
31
|
+
icon?: string | IconWithoutBackgroundProps;
|
|
32
|
+
/**
|
|
33
|
+
* Marks this item as the current page. Renders `aria-current="page"`,
|
|
34
|
+
* applies the active visual, and (when the item has a submenu) surfaces
|
|
35
|
+
* the mega-menu panel below the bar.
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
isActive?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Disables interaction. For a link, sets `aria-disabled` and removes the
|
|
41
|
+
* `href`. For a toggle-only parent (`<button>`), sets the native `disabled`
|
|
42
|
+
* attribute.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Click handler. Receives the original mouse / keyboard event.
|
|
48
|
+
*/
|
|
49
|
+
onClick?: (event: React.MouseEvent | React.KeyboardEvent) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Additional class name applied to the trigger element.
|
|
52
|
+
*/
|
|
53
|
+
className?: string;
|
|
54
|
+
/** @internal Set by the parent to indicate the item carries submenu content. */
|
|
55
|
+
hasSubmenu?: boolean;
|
|
56
|
+
/** @internal When true and the submenu is open, render the submenu inside this `<li>` instead of as a full-width panel. */
|
|
57
|
+
renderSubmenuInline?: boolean;
|
|
58
|
+
/** @internal Parent-controlled submenu visibility. Defaults to `isActive` when undefined (standalone use / link items). */
|
|
59
|
+
isSubmenuOpen?: boolean;
|
|
60
|
+
/** @internal Shared id used to link the toggle button (`aria-controls`) to the submenu panel (`id`). */
|
|
61
|
+
panelId?: string;
|
|
62
|
+
};
|
|
63
|
+
type TopNavItemBaseProps = TopNavItemOwnProps & TopNavItemLinkProps;
|
|
64
|
+
export type TopNavItemProps<C extends React.ElementType = 'a'> = PolymorphicComponentPropWithRef<C, TopNavItemBaseProps>;
|
|
65
|
+
export declare const TopNavItem: <C extends React.ElementType = "a">(props: TopNavItemProps<C>) => React.ReactElement | null;
|
|
66
|
+
export default TopNavItem;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { jsxs as _, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import t from "../../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { forwardRef as P } from "react";
|
|
4
|
+
import { Icon as v } from "../../../../base/icon/icon.es.js";
|
|
5
|
+
import e from "../../top-nav.module.scss.es.js";
|
|
6
|
+
const f = P(
|
|
7
|
+
(b, h) => {
|
|
8
|
+
const {
|
|
9
|
+
children: N,
|
|
10
|
+
href: p,
|
|
11
|
+
icon: n,
|
|
12
|
+
isActive: s = !1,
|
|
13
|
+
hasSubmenu: r = !1,
|
|
14
|
+
disabled: a = !1,
|
|
15
|
+
onClick: m,
|
|
16
|
+
as: I,
|
|
17
|
+
className: y,
|
|
18
|
+
submenu: g,
|
|
19
|
+
renderSubmenuInline: k = !1,
|
|
20
|
+
isSubmenuOpen: w,
|
|
21
|
+
panelId: l,
|
|
22
|
+
...x
|
|
23
|
+
} = b, c = !p && r, C = I ?? (c ? "button" : "a"), o = w ?? s, d = k && o && r, S = (u) => {
|
|
24
|
+
if (a) {
|
|
25
|
+
u.preventDefault();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
m == null || m(u);
|
|
29
|
+
}, T = t(
|
|
30
|
+
e["tedi-top-nav__link"],
|
|
31
|
+
{
|
|
32
|
+
[e["tedi-top-nav__link--active"]]: s || o
|
|
33
|
+
},
|
|
34
|
+
y
|
|
35
|
+
), z = {
|
|
36
|
+
...x,
|
|
37
|
+
ref: h,
|
|
38
|
+
className: T,
|
|
39
|
+
onClick: S,
|
|
40
|
+
...c ? {
|
|
41
|
+
type: "button",
|
|
42
|
+
disabled: a,
|
|
43
|
+
"aria-haspopup": !0,
|
|
44
|
+
"aria-expanded": o,
|
|
45
|
+
"aria-controls": l
|
|
46
|
+
} : {
|
|
47
|
+
href: a ? void 0 : p,
|
|
48
|
+
"aria-current": s ? "page" : void 0,
|
|
49
|
+
"aria-disabled": a || void 0
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return /* @__PURE__ */ _(
|
|
53
|
+
"li",
|
|
54
|
+
{
|
|
55
|
+
className: t(e["tedi-top-nav__item"], {
|
|
56
|
+
[e["tedi-top-nav__item--has-inline-submenu"]]: d
|
|
57
|
+
}),
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ _(C, { ...z, children: [
|
|
60
|
+
n && /* @__PURE__ */ i(
|
|
61
|
+
v,
|
|
62
|
+
{
|
|
63
|
+
className: e["tedi-top-nav__icon"],
|
|
64
|
+
...typeof n == "string" ? { name: n } : n,
|
|
65
|
+
size: typeof n == "string" ? 18 : n.size ?? 18,
|
|
66
|
+
color: "inherit"
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
N,
|
|
70
|
+
r && /* @__PURE__ */ i(
|
|
71
|
+
v,
|
|
72
|
+
{
|
|
73
|
+
className: t(e["tedi-top-nav__icon"], e["tedi-top-nav__chevron"], {
|
|
74
|
+
[e["tedi-top-nav__chevron--open"]]: o
|
|
75
|
+
}),
|
|
76
|
+
name: "keyboard_arrow_down",
|
|
77
|
+
size: 18,
|
|
78
|
+
color: "inherit"
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
] }),
|
|
82
|
+
d && /* @__PURE__ */ i(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
id: l,
|
|
86
|
+
className: t(e["tedi-top-nav__submenu"], e["tedi-top-nav__submenu--inline"]),
|
|
87
|
+
"data-name": "top-nav-submenu",
|
|
88
|
+
children: /* @__PURE__ */ i("div", { className: t(e["tedi-top-nav__submenu-inner"], e["tedi-top-nav__submenu-inner--inline"]), children: g })
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
f.displayName = "TopNav.Item";
|
|
97
|
+
const B = f;
|
|
98
|
+
export {
|
|
99
|
+
B as TopNavItem,
|
|
100
|
+
B as default
|
|
101
|
+
};
|
package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.cjs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("react/jsx-runtime"),o=require("../../../../../../../external/classnames/index.cjs.js"),t=require("../../top-nav.module.scss.cjs.js"),e=({className:r})=>a.jsx("li",{role:"separator","aria-orientation":"vertical",className:o.default(t.default["tedi-top-nav__separator"],r),children:a.jsx("span",{className:t.default["tedi-top-nav__separator-line"],"aria-hidden":"true"})});e.displayName="TopNav.Separator";exports.TopNavSeparator=e;exports.default=e;
|
package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TopNavSeparatorProps {
|
|
2
|
+
/**
|
|
3
|
+
* Additional class name applied to the separator list item.
|
|
4
|
+
*/
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const TopNavSeparator: {
|
|
8
|
+
({ className }: TopNavSeparatorProps): JSX.Element;
|
|
9
|
+
displayName: string;
|
|
10
|
+
};
|
|
11
|
+
export default TopNavSeparator;
|
package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.es.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import o from "../../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import r from "../../top-nav.module.scss.es.js";
|
|
4
|
+
const t = ({ className: e }) => /* @__PURE__ */ a("li", { role: "separator", "aria-orientation": "vertical", className: o(r["tedi-top-nav__separator"], e), children: /* @__PURE__ */ a("span", { className: r["tedi-top-nav__separator-line"], "aria-hidden": "true" }) });
|
|
5
|
+
t.displayName = "TopNav.Separator";
|
|
6
|
+
export {
|
|
7
|
+
t as TopNavSeparator,
|
|
8
|
+
t as default
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("react/jsx-runtime"),_=require("../../../../../../../external/classnames/index.cjs.js"),S=require("react"),o=require("../../top-nav.module.scss.cjs.js"),x=require("../../top-nav-context.cjs.js"),n=S.forwardRef((i,r)=>{const{children:c,href:l,isActive:s=!1,onClick:e,as:d,className:m,...p}=i,v=d||"a",t=x.useTopNavContext(),b=N=>{e==null||e(N),t==null||t.closeSubmenu()},f={...p,ref:r,className:_.default(o.default["tedi-top-nav__subitem-link"],{[o.default["tedi-top-nav__subitem-link--active"]]:s},m),href:l,"aria-current":s?"page":void 0,onClick:b};return a.jsx("li",{className:o.default["tedi-top-nav__subitem"],children:a.jsx(v,{...f,children:c})})});n.displayName="TopNav.SubItem";const u=n;exports.TopNavSubItem=u;exports.default=u;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { PolymorphicComponentPropWithRef } from '../../../../../helpers/polymorphic/types';
|
|
3
|
+
type TopNavSubItemBaseProps = {
|
|
4
|
+
/**
|
|
5
|
+
* Link label.
|
|
6
|
+
*/
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Destination URL.
|
|
10
|
+
*/
|
|
11
|
+
href?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Marks this submenu item as the current page.
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
isActive?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Click handler. Receives the original mouse / keyboard event.
|
|
19
|
+
*/
|
|
20
|
+
onClick?: (event: React.MouseEvent | React.KeyboardEvent) => void;
|
|
21
|
+
/**
|
|
22
|
+
* Additional class name applied to the link element.
|
|
23
|
+
*/
|
|
24
|
+
className?: string;
|
|
25
|
+
};
|
|
26
|
+
export type TopNavSubItemProps<C extends React.ElementType = 'a'> = PolymorphicComponentPropWithRef<C, TopNavSubItemBaseProps>;
|
|
27
|
+
export declare const TopNavSubItem: <C extends React.ElementType = "a">(props: TopNavSubItemProps<C>) => React.ReactElement | null;
|
|
28
|
+
export default TopNavSubItem;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import b from "../../../../../../../external/classnames/index.es.js";
|
|
3
|
+
import { forwardRef as _ } from "react";
|
|
4
|
+
import o from "../../top-nav.module.scss.es.js";
|
|
5
|
+
import { useTopNavContext as h } from "../../top-nav-context.es.js";
|
|
6
|
+
const m = _(
|
|
7
|
+
(n, i) => {
|
|
8
|
+
const { children: r, href: c, isActive: s = !1, onClick: e, as: p, className: l, ...u } = n, d = p || "a", t = h(), f = (N) => {
|
|
9
|
+
e == null || e(N), t == null || t.closeSubmenu();
|
|
10
|
+
}, v = {
|
|
11
|
+
...u,
|
|
12
|
+
ref: i,
|
|
13
|
+
className: b(
|
|
14
|
+
o["tedi-top-nav__subitem-link"],
|
|
15
|
+
{ [o["tedi-top-nav__subitem-link--active"]]: s },
|
|
16
|
+
l
|
|
17
|
+
),
|
|
18
|
+
href: c,
|
|
19
|
+
"aria-current": s ? "page" : void 0,
|
|
20
|
+
onClick: f
|
|
21
|
+
};
|
|
22
|
+
return /* @__PURE__ */ a("li", { className: o["tedi-top-nav__subitem"], children: /* @__PURE__ */ a(d, { ...v, children: r }) });
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
m.displayName = "TopNav.SubItem";
|
|
26
|
+
const I = m;
|
|
27
|
+
export {
|
|
28
|
+
I as TopNavSubItem,
|
|
29
|
+
I as default
|
|
30
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './components/top-nav-group/top-nav-group';
|
|
2
|
+
export * from './components/top-nav-item/top-nav-item';
|
|
3
|
+
export * from './components/top-nav-separator/top-nav-separator';
|
|
4
|
+
export * from './components/top-nav-subitem/top-nav-subitem';
|
|
5
|
+
export * from './top-nav';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),e=t.createContext(null),o=()=>t.useContext(e);exports.TopNavContext=e;exports.useTopNavContext=o;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TopNavContextValue {
|
|
2
|
+
/**
|
|
3
|
+
* Closes the open desktop submenu (mega-menu) panel. Called by `TopNav.SubItem`
|
|
4
|
+
* when a submenu link is activated so the panel dismisses on navigation
|
|
5
|
+
* (important for SPA / client-side routing where the nav stays mounted).
|
|
6
|
+
* No-op when there is no open panel.
|
|
7
|
+
*/
|
|
8
|
+
closeSubmenu: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare const TopNavContext: import('react').Context<TopNavContextValue | null>;
|
|
11
|
+
export declare const useTopNavContext: () => TopNavContextValue | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("react/jsx-runtime"),ne=require("../../../../../external/classnames/index.cjs.js"),t=require("react"),oe=require("../mobile-nav/mobile-nav.cjs.js"),W=require("./components/top-nav-group/top-nav-group.cjs.js"),g=require("./components/top-nav-item/top-nav-item.cjs.js"),G=require("./components/top-nav-separator/top-nav-separator.cjs.js"),R=require("./components/top-nav-subitem/top-nav-subitem.cjs.js"),v=require("./top-nav.module.scss.cjs.js"),se=require("./top-nav-context.cjs.js"),C=require("../../../helpers/hooks/use-breakpoint.cjs.js"),re=n=>{if(!(n===void 0||n==="none"||n===0))return typeof n=="string"&&n!=="xs"&&n in C.BREAKPOINT_WIDTHS?C.BREAKPOINT_WIDTHS[n]:n},L=n=>{const r=[];return t.Children.forEach(n,o=>{if(t.isValidElement(o)){if(o.type===t.Fragment){r.push(...L(o.props.children));return}(o.type===g.TopNavItem||o.type===G.TopNavSeparator)&&r.push(o)}}),r},A=n=>n.type===g.TopNavItem,ie=n=>({children:n.props.children,href:n.props.href,isActive:n.props.isActive,onClick:n.props.onClick}),P=n=>{if(!n)return;const r=[];return t.Children.forEach(n,o=>{if(!t.isValidElement(o))return;if(o.type===t.Fragment){const i=P(o.props.children);i&&r.push(...i);return}if(o.type!==W.TopNavGroup)return;const f=o.props,c=[];t.Children.forEach(f.children,i=>{t.isValidElement(i)&&i.type===R.TopNavSubItem&&c.push(ie(i))}),c.length>0&&r.push({subHeading:f.title,subItems:c})}),r.length>0?r:void 0},p=n=>{const{children:r,ariaLabel:o,mobileBreakpoint:f="md",isMobileOpen:c,onMenuToggle:i,showMobileOverlay:V=!0,className:O,id:D,submenuFit:F="full",maxWidth:H="xxl"}=n,K=C.useBreakpoint(),T=C.isBreakpointBelow(K,f),b=c!==void 0,[$,_]=t.useState(!1),z=b?c:$;t.useEffect(()=>{!b&&!T&&_(!1)},[T,b]);const J=e=>{b||_(e),i==null||i(e)},E=t.useMemo(()=>L(r),[r]),l=t.useMemo(()=>E.filter(A),[E]),k=e=>!e.props.href&&t.Children.count(e.props.submenu)>0,M=t.useMemo(()=>{const e=l.findIndex(s=>k(s)&&s.props.isActive);return e===-1?null:e},[l]),[N,d]=t.useState(M);t.useEffect(()=>{d(M)},[M]);const q=t.useCallback(()=>d(null),[]),Q=t.useMemo(()=>({closeSubmenu:q}),[q]),I=t.useRef(null),h=t.useId();t.useEffect(()=>{if(N===null)return;const e=u=>{I.current&&!I.current.contains(u.target)&&d(null)},s=u=>{var S;if(u.key!=="Escape")return;const m=(S=I.current)==null?void 0:S.querySelector(`[aria-controls="${CSS.escape(h)}"][aria-expanded="true"]`);m==null||m.focus(),d(null)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",s),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",s)}},[N,h]);const w=(e,s)=>k(e)?N===s:!!e.props.isActive,B=t.useMemo(()=>l.find((e,s)=>w(e,s)&&t.Children.count(e.props.submenu)>0),[l,N]),U=t.useMemo(()=>l.map(e=>({children:e.props.children,disabled:e.props.disabled,href:e.props.href,icon:e.props.icon,isActive:e.props.isActive,onClick:e.props.onClick,subItemGroups:P(e.props.submenu)})),[l]);if(T)return a.jsx(oe.MobileNav,{navItems:U,ariaLabel:o,isOpen:z,onClose:()=>J(!1),showOverlay:V,className:O});const j=F==="content",x=re(H);let X=0;return a.jsx(se.TopNavContext.Provider,{value:Q,children:a.jsxs("nav",{ref:I,id:D,className:ne.default(v.default["tedi-top-nav"],O),"aria-label":o,"data-name":"top-nav",children:[a.jsx("div",{className:v.default["tedi-top-nav__bar"],children:a.jsx("ul",{className:v.default["tedi-top-nav__list"],style:x!==void 0?{maxWidth:x}:void 0,children:E.map((e,s)=>{if(A(e)){const u=X++,m=t.Children.count(e.props.submenu)>0,S=k(e),Y=w(e,u),y=e.props.onClick,Z=S?ee=>{y==null||y(ee),d(te=>te===u?null:u)}:y;return t.cloneElement(e,{key:s,hasSubmenu:m,renderSubmenuInline:j,isSubmenuOpen:Y,panelId:h,onClick:Z})}return t.cloneElement(e,{key:s})})})}),!j&&B&&a.jsx("div",{id:h,className:v.default["tedi-top-nav__submenu"],"data-name":"top-nav-submenu",children:a.jsx("div",{className:v.default["tedi-top-nav__submenu-inner"],style:x!==void 0?{maxWidth:x}:void 0,children:B.props.submenu})})]})})};p.displayName="TopNav";p.Item=g.TopNavItem;p.Group=W.TopNavGroup;p.SubItem=R.TopNavSubItem;p.Separator=G.TopNavSeparator;exports.TopNav=p;exports.default=p;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { default as React, ReactNode } from 'react';
|
|
2
|
+
import { Breakpoint } from '../../../helpers';
|
|
3
|
+
import { TopNavGroupProps } from './components/top-nav-group/top-nav-group';
|
|
4
|
+
import { TopNavItemProps } from './components/top-nav-item/top-nav-item';
|
|
5
|
+
import { TopNavSubItemProps } from './components/top-nav-subitem/top-nav-subitem';
|
|
6
|
+
type BreakpointWidthName = Exclude<Breakpoint, 'xs'>;
|
|
7
|
+
export type TopNavMaxWidth = number | BreakpointWidthName | (string & {});
|
|
8
|
+
export interface TopNavProps {
|
|
9
|
+
/**
|
|
10
|
+
* `TopNav.Item` and `TopNav.Separator` children. Any other
|
|
11
|
+
* React node is ignored. Fragments are flattened, so `<>…</>` wrappers work
|
|
12
|
+
* transparently.
|
|
13
|
+
*/
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
/**
|
|
16
|
+
* Accessible name for the wrapping `<nav>` landmark.
|
|
17
|
+
*/
|
|
18
|
+
ariaLabel: string;
|
|
19
|
+
/**
|
|
20
|
+
* Breakpoint below which the bar collapses into the shared Sidenav mobile
|
|
21
|
+
* drawer. Pass any TEDI breakpoint name (`xs`/`sm`/`md`/`lg`/`xl`/`xxl`).
|
|
22
|
+
* @default md
|
|
23
|
+
*/
|
|
24
|
+
mobileBreakpoint?: Breakpoint;
|
|
25
|
+
/**
|
|
26
|
+
* Controlled open state for the mobile drawer. Pair with `onMenuToggle`
|
|
27
|
+
* to wire it to an external toggle button.
|
|
28
|
+
*/
|
|
29
|
+
isMobileOpen?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Fires whenever the mobile drawer opens or closes.
|
|
32
|
+
*/
|
|
33
|
+
onMenuToggle?: (open: boolean) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Dim the rest of the viewport when the mobile drawer is open.
|
|
36
|
+
* @default true
|
|
37
|
+
*/
|
|
38
|
+
showMobileOverlay?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Additional class name applied to the desktop `<nav>`.
|
|
41
|
+
*/
|
|
42
|
+
className?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Element id forwarded to the desktop `<nav>`.
|
|
45
|
+
*/
|
|
46
|
+
id?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Controls how the submenu (mega-menu) panel sizes and positions itself
|
|
49
|
+
* when the active item has submenu content. Both options use the same
|
|
50
|
+
* padding — this only affects the panel's width and horizontal position,
|
|
51
|
+
* not its density.
|
|
52
|
+
*
|
|
53
|
+
* - `'full'` (default) — the panel stretches to the full nav width and is
|
|
54
|
+
* centered, suitable for wide multi-column mega-menus.
|
|
55
|
+
* - `'content'` — the panel is only as wide as its content and sits
|
|
56
|
+
* left-aligned directly under the active item (it is *not* a smaller /
|
|
57
|
+
* tighter variant — just not stretched). Good for single- or few-column
|
|
58
|
+
* menus.
|
|
59
|
+
* @default full
|
|
60
|
+
*/
|
|
61
|
+
submenuFit?: 'full' | 'content';
|
|
62
|
+
/**
|
|
63
|
+
* Constrains the inner content (item bar and full-width submenu inner) to a
|
|
64
|
+
* maximum width and centers it inside the blue `<nav>` background. Pass any
|
|
65
|
+
* valid CSS length (e.g. `1440`, `'1440px'`, `'90rem'`), or a TEDI breakpoint
|
|
66
|
+
* name (`'sm' | 'md' | 'lg' | 'xl' | 'xxl'`) — these resolve to the
|
|
67
|
+
* breakpoint's `min-width` (36rem / 48rem / 62rem / 75rem / 87.5rem
|
|
68
|
+
* respectively), useful for aligning the nav inner with a breakpoint-driven
|
|
69
|
+
* content container. The `<nav>` itself still spans 100% of its container.
|
|
70
|
+
*
|
|
71
|
+
* Pass `'none'` (or `0`) to disable the constraint and let the bar fill the
|
|
72
|
+
* full width of the nav.
|
|
73
|
+
* @default xxl
|
|
74
|
+
*/
|
|
75
|
+
maxWidth?: TopNavMaxWidth | 'none';
|
|
76
|
+
}
|
|
77
|
+
export declare const TopNav: {
|
|
78
|
+
(props: TopNavProps): React.ReactElement | null;
|
|
79
|
+
displayName: string;
|
|
80
|
+
Item: <C extends React.ElementType = "a">(props: TopNavItemProps<C>) => React.ReactElement | null;
|
|
81
|
+
Group: {
|
|
82
|
+
({ title, children, icon, headingLevel, className, }: TopNavGroupProps): JSX.Element;
|
|
83
|
+
displayName: string;
|
|
84
|
+
};
|
|
85
|
+
SubItem: <C extends React.ElementType = "a">(props: TopNavSubItemProps<C>) => React.ReactElement | null;
|
|
86
|
+
Separator: {
|
|
87
|
+
({ className }: import('./components/top-nav-separator/top-nav-separator').TopNavSeparatorProps): JSX.Element;
|
|
88
|
+
displayName: string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
export default TopNav;
|