@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.
Files changed (82) hide show
  1. package/_virtual/index.es13.js +2 -2
  2. package/_virtual/index.es14.js +2 -2
  3. package/bundle-stats.html +1 -1
  4. package/external/react-is/index.cjs.js +1 -1
  5. package/external/react-is/index.es.js +1 -1
  6. package/external/toposort/index.cjs.js +1 -1
  7. package/external/toposort/index.es.js +1 -1
  8. package/index.css +1 -1
  9. package/package.json +1 -1
  10. package/src/community/components/form/pickers/calendar/calendar.d.ts +6 -0
  11. package/src/community/components/form/pickers/datepicker/datepicker.d.ts +6 -0
  12. package/src/community/components/form/pickers/datetimepicker/datetimepicker.d.ts +6 -0
  13. package/src/community/components/form/pickers/timepicker/timepicker.d.ts +6 -0
  14. package/src/tedi/components/content/calendar/calendar-grid.cjs.js +1 -1
  15. package/src/tedi/components/content/calendar/calendar-grid.es.js +7 -6
  16. package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.cjs.js +1 -1
  17. package/src/tedi/components/content/calendar/components/calendar-header/calendar-header.es.js +99 -79
  18. package/src/tedi/components/form/date-field/date-field-helpers.cjs.js +1 -0
  19. package/src/tedi/components/form/date-field/date-field-helpers.d.ts +66 -0
  20. package/src/tedi/components/form/date-field/date-field-helpers.es.js +28 -0
  21. package/src/tedi/components/form/date-field/date-field.cjs.js +1 -1
  22. package/src/tedi/components/form/date-field/date-field.d.ts +22 -0
  23. package/src/tedi/components/form/date-field/date-field.es.js +248 -212
  24. package/src/tedi/components/form/date-time-field/date-time-field.cjs.js +1 -0
  25. package/src/tedi/components/form/date-time-field/date-time-field.d.ts +207 -0
  26. package/src/tedi/components/form/date-time-field/date-time-field.es.js +376 -0
  27. package/src/tedi/components/form/date-time-field/date-time-field.module.scss.cjs.js +1 -0
  28. package/src/tedi/components/form/date-time-field/date-time-field.module.scss.es.js +30 -0
  29. package/src/tedi/components/form/time-field/time-field.cjs.js +1 -1
  30. package/src/tedi/components/form/time-field/time-field.d.ts +9 -0
  31. package/src/tedi/components/form/time-field/time-field.es.js +81 -79
  32. package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.cjs.js +1 -0
  33. package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.d.ts +52 -0
  34. package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.es.js +68 -0
  35. package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.module.scss.cjs.js +1 -0
  36. package/src/tedi/components/layout/mobile-nav/components/mobile-nav-toggle/mobile-nav-toggle.module.scss.es.js +9 -0
  37. package/src/tedi/components/layout/mobile-nav/index.d.ts +2 -0
  38. package/src/tedi/components/layout/mobile-nav/mobile-nav.cjs.js +1 -0
  39. package/src/tedi/components/layout/mobile-nav/mobile-nav.d.ts +20 -0
  40. package/src/tedi/components/layout/{sidenav/components/sidenav-mobile/sidenav-mobile.es.js → mobile-nav/mobile-nav.es.js} +21 -20
  41. package/src/tedi/components/layout/sidenav/index.d.ts +2 -2
  42. package/src/tedi/components/layout/sidenav/sidenav.cjs.js +1 -1
  43. package/src/tedi/components/layout/sidenav/sidenav.d.ts +2 -11
  44. package/src/tedi/components/layout/sidenav/sidenav.es.js +27 -27
  45. package/src/tedi/components/layout/top-nav/components/top-nav-group/top-nav-group.cjs.js +1 -0
  46. package/src/tedi/components/layout/top-nav/components/top-nav-group/top-nav-group.d.ts +34 -0
  47. package/src/tedi/components/layout/top-nav/components/top-nav-group/top-nav-group.es.js +33 -0
  48. package/src/tedi/components/layout/top-nav/components/top-nav-item/top-nav-item.cjs.js +1 -0
  49. package/src/tedi/components/layout/top-nav/components/top-nav-item/top-nav-item.d.ts +66 -0
  50. package/src/tedi/components/layout/top-nav/components/top-nav-item/top-nav-item.es.js +101 -0
  51. package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.cjs.js +1 -0
  52. package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.d.ts +11 -0
  53. package/src/tedi/components/layout/top-nav/components/top-nav-separator/top-nav-separator.es.js +9 -0
  54. package/src/tedi/components/layout/top-nav/components/top-nav-subitem/top-nav-subitem.cjs.js +1 -0
  55. package/src/tedi/components/layout/top-nav/components/top-nav-subitem/top-nav-subitem.d.ts +28 -0
  56. package/src/tedi/components/layout/top-nav/components/top-nav-subitem/top-nav-subitem.es.js +30 -0
  57. package/src/tedi/components/layout/top-nav/index.d.ts +5 -0
  58. package/src/tedi/components/layout/top-nav/top-nav-context.cjs.js +1 -0
  59. package/src/tedi/components/layout/top-nav/top-nav-context.d.ts +11 -0
  60. package/src/tedi/components/layout/top-nav/top-nav-context.es.js +6 -0
  61. package/src/tedi/components/layout/top-nav/top-nav.cjs.js +1 -0
  62. package/src/tedi/components/layout/top-nav/top-nav.d.ts +91 -0
  63. package/src/tedi/components/layout/top-nav/top-nav.es.js +171 -0
  64. package/src/tedi/components/layout/top-nav/top-nav.module.scss.cjs.js +1 -0
  65. package/src/tedi/components/layout/top-nav/top-nav.module.scss.es.js +28 -0
  66. package/src/tedi/components/overlays/dropdown/dropdown.es.js +0 -3
  67. package/src/tedi/helpers/hooks/use-breakpoint.cjs.js +1 -1
  68. package/src/tedi/helpers/hooks/use-breakpoint.d.ts +7 -0
  69. package/src/tedi/helpers/hooks/use-breakpoint.es.js +22 -14
  70. package/src/tedi/index.d.ts +3 -0
  71. package/src/tedi/providers/label-provider/labels-map.cjs.js +1 -1
  72. package/src/tedi/providers/label-provider/labels-map.d.ts +28 -0
  73. package/src/tedi/providers/label-provider/labels-map.es.js +93 -65
  74. package/tedi.cjs.js +1 -1
  75. package/tedi.es.js +237 -222
  76. package/src/tedi/components/layout/sidenav/components/sidenav-mobile/sidenav-mobile.cjs.js +0 -1
  77. package/src/tedi/components/layout/sidenav/components/sidenav-mobile/sidenav-mobile.d.ts +0 -14
  78. package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.cjs.js +0 -1
  79. package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.d.ts +0 -31
  80. package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.es.js +0 -48
  81. package/src/tedi/components/layout/sidenav/components/sidenav-toggle/sidenav-toggle.module.scss.cjs.js +0 -1
  82. 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 O, useEffect as V, createElement as q } from "react";
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 M } from "./components/sidenav-item/sidenav-item.es.js";
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 = (n) => {
11
+ const Q = (l) => {
12
12
  const {
13
13
  navItems: d,
14
- ariaLabel: l,
14
+ ariaLabel: n,
15
15
  linkAs: p,
16
- showDividers: S = !0,
16
+ showDividers: k = !0,
17
17
  className: c,
18
- mobileBreakpoint: k = "tablet",
19
- showMobileOverlay: w = !0,
18
+ mobileBreakpoint: w = "tablet",
19
+ showMobileOverlay: I = !0,
20
20
  isMobileOpen: v,
21
- isCollapsed: I = !1,
21
+ isCollapsed: B = !1,
22
22
  onMenuToggle: r,
23
23
  onCollapseToggle: m,
24
- sideNavItemSize: B = "default",
24
+ sideNavItemSize: S = "default",
25
25
  ...f
26
- } = n, y = (e) => ({
26
+ } = l, y = (e) => ({
27
27
  mobile: "md",
28
28
  tablet: "lg"
29
- })[e], j = J(), i = K(j, y(k)), s = v !== void 0, [x, b] = O(!i), u = s ? v : x, [D, E] = O(I), t = i ? !1 : D, P = "isCollapsed" in n;
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
- s || b(!i);
32
- }, [i, s]);
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
- s || b(e), r == null || r(e);
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"]]: S,
42
+ [a["tedi-sidenav--has-dividers"]]: k,
43
43
  [a["tedi-sidenav--collapsed"]]: t
44
44
  });
45
- return i ? /* @__PURE__ */ o(
45
+ return s ? /* @__PURE__ */ o(
46
46
  g,
47
47
  {
48
48
  navItems: d,
49
- ariaLabel: l,
49
+ ariaLabel: n,
50
50
  linkAs: p,
51
51
  isOpen: u,
52
52
  onClose: () => C(!1),
53
- showOverlay: w,
53
+ showOverlay: I,
54
54
  className: c,
55
55
  ...f
56
56
  }
57
- ) : /* @__PURE__ */ o(G, { visibility: "hide", children: /* @__PURE__ */ T("nav", { id: n.id, "data-name": "sidenav", ...f, className: L, "aria-label": l, children: [
58
- P && /* @__PURE__ */ o(h, { menuOpen: !t, toggleMenu: z, variant: "collapse" }),
59
- /* @__PURE__ */ o("ul", { className: a["tedi-sidenav__list"], role: "menubar", "aria-label": l, children: d.map((e, N) => /* @__PURE__ */ q(
60
- M,
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: B
67
+ sideNavItemSize: S
68
68
  }
69
69
  )) })
70
70
  ] }) });
71
71
  }, te = Object.assign(Q, {
72
- Toggle: h,
73
- Item: M,
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
+ };
@@ -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;
@@ -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;
@@ -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,6 @@
1
+ import { useContext as t, createContext as o } from "react";
2
+ const e = o(null), x = () => t(e);
3
+ export {
4
+ e as TopNavContext,
5
+ x as useTopNavContext
6
+ };
@@ -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;