@govtechsg/sgds-web-component 3.26.1-rc.2 → 3.27.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/base/dropdown-list-element.js +9 -2
  2. package/base/dropdown-list-element.js.map +1 -1
  3. package/base/nav-element.d.ts +64 -0
  4. package/base/nav-element.js +263 -0
  5. package/base/nav-element.js.map +1 -0
  6. package/base/nav-profile-element.d.ts +47 -0
  7. package/base/nav-profile-element.js +191 -0
  8. package/base/nav-profile-element.js.map +1 -0
  9. package/base/nav-profile.js +6 -0
  10. package/base/nav-profile.js.map +1 -0
  11. package/components/Appnav/appnav-context.d.ts +6 -0
  12. package/components/Appnav/appnav-context.js +7 -0
  13. package/components/Appnav/appnav-context.js.map +1 -0
  14. package/components/Appnav/appnav.js +6 -0
  15. package/components/Appnav/appnav.js.map +1 -0
  16. package/components/Appnav/index.d.ts +9 -0
  17. package/components/Appnav/index.js +8 -0
  18. package/components/Appnav/index.js.map +1 -0
  19. package/components/Appnav/index.umd.min.js +2542 -0
  20. package/components/Appnav/index.umd.min.js.map +1 -0
  21. package/components/Appnav/sgds-appnav-profile.d.ts +17 -0
  22. package/components/Appnav/sgds-appnav-profile.js +31 -0
  23. package/components/Appnav/sgds-appnav-profile.js.map +1 -0
  24. package/components/Appnav/sgds-appnav.d.ts +44 -0
  25. package/components/Appnav/sgds-appnav.js +183 -0
  26. package/components/Appnav/sgds-appnav.js.map +1 -0
  27. package/components/Breadcrumb/index.umd.min.js +1 -1
  28. package/components/Breadcrumb/index.umd.min.js.map +1 -1
  29. package/components/ComboBox/index.umd.min.js +248 -248
  30. package/components/ComboBox/index.umd.min.js.map +1 -1
  31. package/components/Dropdown/index.umd.min.js +1 -1
  32. package/components/Dropdown/index.umd.min.js.map +1 -1
  33. package/components/Mainnav/index.umd.min.js +293 -281
  34. package/components/Mainnav/index.umd.min.js.map +1 -1
  35. package/components/Mainnav/mainnav.js +1 -1
  36. package/components/Mainnav/sgds-mainnav-profile.d.ts +5 -31
  37. package/components/Mainnav/sgds-mainnav-profile.js +5 -112
  38. package/components/Mainnav/sgds-mainnav-profile.js.map +1 -1
  39. package/components/Mainnav/sgds-mainnav.d.ts +5 -46
  40. package/components/Mainnav/sgds-mainnav.js +24 -260
  41. package/components/Mainnav/sgds-mainnav.js.map +1 -1
  42. package/components/OverflowMenu/index.umd.min.js +21 -21
  43. package/components/OverflowMenu/index.umd.min.js.map +1 -1
  44. package/components/QuantityToggle/index.umd.min.js +39 -39
  45. package/components/QuantityToggle/index.umd.min.js.map +1 -1
  46. package/components/QuantityToggle/sgds-quantity-toggle.d.ts +1 -2
  47. package/components/QuantityToggle/sgds-quantity-toggle.js +9 -18
  48. package/components/QuantityToggle/sgds-quantity-toggle.js.map +1 -1
  49. package/components/Select/index.umd.min.js +1 -1
  50. package/components/Select/index.umd.min.js.map +1 -1
  51. package/components/index.d.ts +2 -0
  52. package/components/index.js +2 -0
  53. package/components/index.js.map +1 -1
  54. package/components/index.umd.min.js +592 -543
  55. package/components/index.umd.min.js.map +1 -1
  56. package/css/fouc.css +6 -4
  57. package/custom-elements.json +17733 -15914
  58. package/index.d.ts +1 -0
  59. package/index.js +1 -0
  60. package/index.js.map +1 -1
  61. package/index.umd.min.js +537 -483
  62. package/index.umd.min.js.map +1 -1
  63. package/package.json +1 -1
  64. package/react/appnav/index.cjs.js +45 -0
  65. package/react/appnav/index.cjs.js.map +1 -0
  66. package/react/appnav/index.d.ts +4 -0
  67. package/react/appnav/index.js +21 -0
  68. package/react/appnav/index.js.map +1 -0
  69. package/react/appnav-profile/index.cjs.js +40 -0
  70. package/react/appnav-profile/index.cjs.js.map +1 -0
  71. package/react/appnav-profile/index.d.ts +4 -0
  72. package/react/appnav-profile/index.js +16 -0
  73. package/react/appnav-profile/index.js.map +1 -0
  74. package/react/base/dropdown-list-element.cjs.js +9 -2
  75. package/react/base/dropdown-list-element.cjs.js.map +1 -1
  76. package/react/base/dropdown-list-element.js +9 -2
  77. package/react/base/dropdown-list-element.js.map +1 -1
  78. package/react/base/nav-element.cjs.js +268 -0
  79. package/react/base/nav-element.cjs.js.map +1 -0
  80. package/react/base/nav-element.js +264 -0
  81. package/react/base/nav-element.js.map +1 -0
  82. package/react/base/nav-profile-element.cjs.js +196 -0
  83. package/react/base/nav-profile-element.cjs.js.map +1 -0
  84. package/react/base/nav-profile-element.js +192 -0
  85. package/react/base/nav-profile-element.js.map +1 -0
  86. package/react/base/nav-profile.cjs.js +11 -0
  87. package/react/base/nav-profile.cjs.js.map +1 -0
  88. package/react/base/nav-profile.js +7 -0
  89. package/react/base/nav-profile.js.map +1 -0
  90. package/react/components/Appnav/appnav-context.cjs.js +13 -0
  91. package/react/components/Appnav/appnav-context.cjs.js.map +1 -0
  92. package/react/components/Appnav/appnav-context.js +8 -0
  93. package/react/components/Appnav/appnav-context.js.map +1 -0
  94. package/react/components/Appnav/appnav.cjs.js +11 -0
  95. package/react/components/Appnav/appnav.cjs.js.map +1 -0
  96. package/react/components/Appnav/appnav.js +7 -0
  97. package/react/components/Appnav/appnav.js.map +1 -0
  98. package/react/components/Appnav/sgds-appnav-profile.cjs.js +37 -0
  99. package/react/components/Appnav/sgds-appnav-profile.cjs.js.map +1 -0
  100. package/react/components/Appnav/sgds-appnav-profile.js +32 -0
  101. package/react/components/Appnav/sgds-appnav-profile.js.map +1 -0
  102. package/react/components/Appnav/sgds-appnav.cjs.js +189 -0
  103. package/react/components/Appnav/sgds-appnav.cjs.js.map +1 -0
  104. package/react/components/Appnav/sgds-appnav.js +184 -0
  105. package/react/components/Appnav/sgds-appnav.js.map +1 -0
  106. package/react/components/Mainnav/mainnav.cjs.js +1 -1
  107. package/react/components/Mainnav/mainnav.js +1 -1
  108. package/react/components/Mainnav/sgds-mainnav-profile.cjs.js +4 -111
  109. package/react/components/Mainnav/sgds-mainnav-profile.cjs.js.map +1 -1
  110. package/react/components/Mainnav/sgds-mainnav-profile.js +5 -112
  111. package/react/components/Mainnav/sgds-mainnav-profile.js.map +1 -1
  112. package/react/components/Mainnav/sgds-mainnav.cjs.js +22 -258
  113. package/react/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
  114. package/react/components/Mainnav/sgds-mainnav.js +24 -260
  115. package/react/components/Mainnav/sgds-mainnav.js.map +1 -1
  116. package/react/components/QuantityToggle/sgds-quantity-toggle.cjs.js +9 -18
  117. package/react/components/QuantityToggle/sgds-quantity-toggle.cjs.js.map +1 -1
  118. package/react/components/QuantityToggle/sgds-quantity-toggle.js +9 -18
  119. package/react/components/QuantityToggle/sgds-quantity-toggle.js.map +1 -1
  120. package/react/index.cjs.js +130 -126
  121. package/react/index.cjs.js.map +1 -1
  122. package/react/index.d.ts +6 -4
  123. package/react/index.js +6 -4
  124. package/react/index.js.map +1 -1
  125. package/types/react.d.ts +197 -158
  126. package/components/Mainnav/mainnav-profile.js +0 -6
  127. package/components/Mainnav/mainnav-profile.js.map +0 -1
  128. package/react/components/Mainnav/mainnav-profile.cjs.js +0 -11
  129. package/react/components/Mainnav/mainnav-profile.cjs.js.map +0 -1
  130. package/react/components/Mainnav/mainnav-profile.js +0 -7
  131. package/react/components/Mainnav/mainnav-profile.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { css } from 'lit';
2
2
 
3
- var css_248z = css`:host{display:block}nav{background-color:var(--sgds-surface-default);box-shadow:0 2px 4px 0 hsla(0,0%,5%,.08);position:relative;z-index:var(--sgds-z-index-floating)}:host([tone=brand]) nav{background-color:var(--sgds-primary-surface-default)}:host([tone=gradient-1]) nav{background:var(--sgds-gradient-1)}:host([tone=gradient-2]) nav{background:var(--sgds-gradient-2)}:host([tone=gradient-3]) nav{background:var(--sgds-gradient-3)}:host([tone=gradient-4]) nav{background:var(--sgds-gradient-4)}.navbar{align-items:stretch;display:flex;flex-wrap:wrap;font-size:var(--sgds-font-size-label-sm);gap:var(--sgds-gap-xs);justify-content:flex-start;margin:auto;max-width:var(--sgds-mainnav-max-width,1440px);min-height:var(--sgds-mainnav-height,72px);padding:0 var(--sgds-mainnav-mobile-padding-x);width:100%}:host([fluid]) .navbar{max-width:none}.navbar-brand{align-items:center;color:var(--sgds-color-default);display:flex;text-decoration:none;white-space:nowrap}:host([tone=brand]) .navbar-brand,:host([tone^=gradient]) .navbar-brand{color:var(--sgds-color-fixed-light)}.navbar-brand:focus-visible{outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.navbar-nav{display:flex;flex-direction:column;height:100%;margin-bottom:0;margin-top:0;width:100%}nav>.navbar-body{background-color:var(--sgds-surface-default);border-top:var(--sgds-border-width-1) solid var(--sgds-border-color-translucent);box-shadow:0 2px 4px 0 hsla(0,0%,5%,.08);padding:var(--sgds-padding-md) 0;position:absolute;transition:transform .2s ease-in-out;width:100%;z-index:var(--sgds-z-index-floating)}nav>.navbar-body .navbar-nav{height:100dvh;margin:auto;max-width:var(--sgds-mainnav-max-width,1440px)}nav>.navbar-body slot::slotted(:not(sgds-mainnav-item):not(sgds-mainnav-dropdown):not(sgds-mainnav-profile)){padding:var(--sgds-padding-sm) var(--sgds-mainnav-mobile-padding-x)}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{align-self:center}:host([tone=brand]) .navbar-toggler,:host([tone^=gradient]) .navbar-toggler{color:var(--sgds-color-fixed-light)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-nav-scroll{overflow-y:auto}@media (min-width:512px){.navbar-expand-sm{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:1024px){.navbar{padding:0 var(--sgds-mainnav-padding-x)}.navbar-expand-lg{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1280px){.navbar-expand-xl{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .nav-link{padding-left:var(--mainnav-nav-link-padding-x);padding-right:var(--mainnav-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1440px){.navbar-expand-xxl{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-end{margin-left:auto}.navbar-end,slot[name=start]{align-items:center;display:flex;gap:var(--sgds-gap-xs)}slot[name=profile]{align-self:stretch;display:flex}slot[name=non-collapsible]{align-items:center;display:flex;gap:var(--sgds-spacer-4)}slot[name=non-collapsible].non-collapsible-empty{display:none}:host([tone=brand]) slot[name=non-collapsible]::slotted(*),:host([tone^=gradient]) slot[name=non-collapsible]::slotted(*){color:var(--sgds-color-fixed-light)}.slot-end{align-items:stretch;display:flex;gap:var(--sgds-gap-xs);height:inherit;margin-left:auto}.slot-end::slotted(:not([name$=-mainnav-item]):not([name$=-mainnav-dropdown])){align-self:center}`;
3
+ var css_248z = css`:host{display:block}nav{background-color:var(--sgds-surface-default);box-shadow:0 2px 4px 0 hsla(0,0%,5%,.08);position:relative;z-index:var(--sgds-z-index-floating)}:host([tone=brand]) nav{background-color:var(--sgds-primary-surface-default)}:host([tone=gradient-1]) nav{background:var(--sgds-gradient-1)}:host([tone=gradient-2]) nav{background:var(--sgds-gradient-2)}:host([tone=gradient-3]) nav{background:var(--sgds-gradient-3)}:host([tone=gradient-4]) nav{background:var(--sgds-gradient-4)}.navbar{align-items:stretch;display:flex;flex-wrap:wrap;font-size:var(--sgds-font-size-label-sm);gap:var(--sgds-gap-xs);justify-content:flex-start;margin:auto;max-width:var(--sgds-mainnav-max-width,1440px);min-height:var(--sgds-mainnav-height,72px);padding:0 var(--sgds-mainnav-mobile-padding-x);width:100%}:host([fluid]) .navbar{max-width:none}.navbar-brand{align-items:center;color:var(--sgds-color-default);display:flex;text-decoration:none;white-space:nowrap}:host([tone=brand]) .navbar-brand,:host([tone^=gradient]) .navbar-brand{color:var(--sgds-color-fixed-light)}.navbar-brand:focus-visible{outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.navbar-nav{display:flex;flex-direction:column;height:100%;margin-bottom:0;margin-top:0;width:100%}nav>.navbar-body{background-color:var(--sgds-surface-default);border-top:var(--sgds-border-width-1) solid var(--sgds-border-color-translucent);box-shadow:0 2px 4px 0 hsla(0,0%,5%,.08);padding:var(--sgds-padding-md) 0;position:absolute;transition:transform .2s ease-in-out;width:100%;z-index:var(--sgds-z-index-floating)}nav>.navbar-body .navbar-nav{height:100dvh;margin:auto;max-width:var(--sgds-mainnav-max-width,1440px)}nav>.navbar-body slot::slotted(:not(sgds-mainnav-item):not(sgds-mainnav-dropdown):not(sgds-mainnav-profile)){padding:var(--sgds-padding-sm) var(--sgds-mainnav-mobile-padding-x)}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{align-self:center}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-nav-scroll{overflow-y:auto}@media (min-width:512px){.navbar-expand-sm{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:1024px){.navbar{padding:0 var(--sgds-mainnav-padding-x)}.navbar-expand-lg{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1280px){.navbar-expand-xl{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .nav-link{padding-left:var(--mainnav-nav-link-padding-x);padding-right:var(--mainnav-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1440px){.navbar-expand-xxl{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;gap:var(--sgds-gap-xl);justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-end{align-items:center;display:flex;gap:var(--sgds-gap-xs);margin-left:auto}slot[name=non-collapsible].slot-empty{display:none}slot[name=profile]{align-self:stretch;display:flex}slot[name=non-collapsible]{align-items:center;display:flex;gap:var(--sgds-spacer-4)}:host([tone=brand]) slot[name=non-collapsible]::slotted(*),:host([tone^=gradient]) slot[name=non-collapsible]::slotted(*){color:var(--sgds-color-fixed-light)}.slot-end{align-items:stretch;display:flex;gap:var(--sgds-gap-xs);height:inherit;margin-left:auto}.slot-end::slotted(:not([name$=-mainnav-item]):not([name$=-mainnav-dropdown])){align-self:center}`;
4
4
 
5
5
  export { css_248z as default };
6
6
  //# sourceMappingURL=mainnav.js.map
@@ -1,41 +1,15 @@
1
- import SgdsElement from "../../base/sgds-element";
2
- import SgdsDropdown from "../Dropdown/sgds-dropdown";
3
- import SgdsDropdownItem from "../Dropdown/sgds-dropdown-item";
4
- import SgdsIcon from "../Icon/sgds-icon";
1
+ import NavProfileElement from "../../base/nav-profile-element";
5
2
  /**
6
3
  * @summary A profile component for the mainnav that shows a full dropdown in desktop and handles its own mobile menu.
7
4
  * In desktop: renders avatar + label + secondaryText with a dropdown.
8
5
  * In mobile: renders the avatar as a toggler that opens a self-contained mobile panel with profile items.
6
+ * When no dropdown items are slotted, renders as a non-interactive read-only element (no caret, no pointer cursor, not focusable).
9
7
  * When present, it disables the mainnav's default hamburger toggler.
10
8
  *
11
9
  * @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)
12
- * @slot default - Profile menu items (sgds-dropdown-item elements)
10
+ * @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.
13
11
  */
14
- export declare class SgdsMainnavProfile extends SgdsElement {
15
- static styles: import("lit").CSSResult[];
16
- /** @internal */
17
- static dependencies: {
18
- "sgds-dropdown": typeof SgdsDropdown;
19
- "sgds-dropdown-item": typeof SgdsDropdownItem;
20
- "sgds-icon": typeof SgdsIcon;
21
- };
22
- private _breakpointReached;
23
- /** @internal Whether the mobile menu is open */
24
- private _mobileMenuOpen;
25
- /** Primary text displayed next to the avatar in desktop (e.g. user name) */
26
- label: string;
27
- /** Secondary text displayed below the label in desktop (e.g. agency or role) */
28
- secondaryText: string;
29
- /** When true, disables the profile dropdown */
30
- disabled: boolean;
31
- /** Accessible label for the profile toggle button */
32
- ariaLabel: string;
33
- /** Controls dropdown close behavior. "default" auto-closes on item/outside click, "outside" closes only on outside click, "inside" prevents auto-close. */
34
- close: "default" | "outside" | "inside";
35
- /** @internal */
36
- private togglerId;
37
- private _handleMobileToggle;
38
- private _handleKeydown;
39
- render(): import("lit").TemplateResult<1>;
12
+ export declare class SgdsMainnavProfile extends NavProfileElement {
13
+ protected _breakpointReached: boolean;
40
14
  }
41
15
  export default SgdsMainnavProfile;
@@ -1,136 +1,29 @@
1
1
  import { __decorate } from 'tslib';
2
- import { html, nothing } from 'lit';
3
2
  import { consume } from '@lit/context';
4
- import { state, property } from 'lit/decorators.js';
5
- import { classMap } from 'lit/directives/class-map.js';
6
- import { ifDefined } from 'lit/directives/if-defined.js';
7
- import { offset } from '@floating-ui/dom';
8
- import SgdsElement from '../../base/sgds-element.js';
9
- import { SgdsDropdown } from '../Dropdown/sgds-dropdown.js';
10
- import { SgdsDropdownItem } from '../Dropdown/sgds-dropdown-item.js';
11
- import { SgdsIcon } from '../Icon/sgds-icon.js';
3
+ import { state } from 'lit/decorators.js';
4
+ import NavProfileElement from '../../base/nav-profile-element.js';
12
5
  import { MainnavBreakpointContext } from './mainnav-context.js';
13
- import css_248z from './mainnav-profile.js';
14
- import genId from '../../utils/generateId.js';
15
6
 
16
7
  /**
17
8
  * @summary A profile component for the mainnav that shows a full dropdown in desktop and handles its own mobile menu.
18
9
  * In desktop: renders avatar + label + secondaryText with a dropdown.
19
10
  * In mobile: renders the avatar as a toggler that opens a self-contained mobile panel with profile items.
11
+ * When no dropdown items are slotted, renders as a non-interactive read-only element (no caret, no pointer cursor, not focusable).
20
12
  * When present, it disables the mainnav's default hamburger toggler.
21
13
  *
22
14
  * @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)
23
- * @slot default - Profile menu items (sgds-dropdown-item elements)
15
+ * @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.
24
16
  */
25
- class SgdsMainnavProfile extends SgdsElement {
17
+ class SgdsMainnavProfile extends NavProfileElement {
26
18
  constructor() {
27
19
  super(...arguments);
28
20
  this._breakpointReached = true;
29
- /** @internal Whether the mobile menu is open */
30
- this._mobileMenuOpen = false;
31
- /** Primary text displayed next to the avatar in desktop (e.g. user name) */
32
- this.label = "";
33
- /** Secondary text displayed below the label in desktop (e.g. agency or role) */
34
- this.secondaryText = "";
35
- /** When true, disables the profile dropdown */
36
- this.disabled = false;
37
- /** Accessible label for the profile toggle button */
38
- this.ariaLabel = "";
39
- /** Controls dropdown close behavior. "default" auto-closes on item/outside click, "outside" closes only on outside click, "inside" prevents auto-close. */
40
- this.close = "default";
41
- /** @internal */
42
- this.togglerId = genId("profile", "button");
43
- this._handleMobileToggle = () => {
44
- this._mobileMenuOpen = !this._mobileMenuOpen;
45
- };
46
- this._handleKeydown = (e) => {
47
- if (e.key === "Enter" || e.key === " ") {
48
- e.preventDefault();
49
- this._handleMobileToggle();
50
- }
51
- };
52
- }
53
- render() {
54
- if (!this._breakpointReached) {
55
- // Desktop: dropdown with avatar + label + secondaryText
56
- return html `
57
- <sgds-dropdown .floatingOpts=${{ middleware: [offset(0)] }} ?disabled=${this.disabled} close=${this.close}>
58
- <button
59
- class="${classMap({
60
- "nav-link": true,
61
- disabled: this.disabled
62
- })}"
63
- aria-disabled=${this.disabled ? "true" : "false"}
64
- aria-label=${ifDefined(this.ariaLabel)}
65
- id=${this.togglerId}
66
- tabindex=${this.disabled ? "-1" : "0"}
67
- slot="toggler"
68
- >
69
- <slot name="avatar"></slot>
70
- ${this.label || this.secondaryText
71
- ? html `<div class="profile-text">
72
- ${this.label ? html `<span class="profile-label">${this.label}</span>` : nothing}
73
- ${this.secondaryText
74
- ? html `<span class="profile-secondary-text">${this.secondaryText}</span>`
75
- : nothing}
76
- </div>`
77
- : nothing}
78
- <sgds-icon name="chevron-down" size="md"></sgds-icon>
79
- </button>
80
- <slot></slot>
81
- </sgds-dropdown>
82
- `;
83
- }
84
- // Mobile: avatar toggler + self-contained mobile panel
85
- return html `
86
- <div
87
- class="profile-avatar-mobile"
88
- role="button"
89
- tabindex="0"
90
- aria-label=${this.ariaLabel || "Toggle navigation"}
91
- aria-expanded=${this._mobileMenuOpen ? "true" : "false"}
92
- @click=${this._handleMobileToggle}
93
- @keydown=${this._handleKeydown}
94
- >
95
- <slot name="avatar"></slot>
96
- </div>
97
- <div class="profile-mobile-panel" ?hidden=${!this._mobileMenuOpen}>
98
- <div class="profile-mobile-items">
99
- <slot></slot>
100
- </div>
101
- </div>
102
- `;
103
21
  }
104
22
  }
105
- SgdsMainnavProfile.styles = [...SgdsElement.styles, css_248z];
106
- /** @internal */
107
- SgdsMainnavProfile.dependencies = {
108
- "sgds-dropdown": SgdsDropdown,
109
- "sgds-dropdown-item": SgdsDropdownItem,
110
- "sgds-icon": SgdsIcon
111
- };
112
23
  __decorate([
113
24
  consume({ context: MainnavBreakpointContext, subscribe: true }),
114
25
  state()
115
26
  ], SgdsMainnavProfile.prototype, "_breakpointReached", void 0);
116
- __decorate([
117
- state()
118
- ], SgdsMainnavProfile.prototype, "_mobileMenuOpen", void 0);
119
- __decorate([
120
- property({ type: String, reflect: true })
121
- ], SgdsMainnavProfile.prototype, "label", void 0);
122
- __decorate([
123
- property({ type: String, reflect: true })
124
- ], SgdsMainnavProfile.prototype, "secondaryText", void 0);
125
- __decorate([
126
- property({ type: Boolean })
127
- ], SgdsMainnavProfile.prototype, "disabled", void 0);
128
- __decorate([
129
- property({ type: String })
130
- ], SgdsMainnavProfile.prototype, "ariaLabel", void 0);
131
- __decorate([
132
- property({ type: String })
133
- ], SgdsMainnavProfile.prototype, "close", void 0);
134
27
 
135
28
  export { SgdsMainnavProfile, SgdsMainnavProfile as default };
136
29
  //# sourceMappingURL=sgds-mainnav-profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sgds-mainnav-profile.js","sources":["../../../src/components/Mainnav/sgds-mainnav-profile.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { consume } from \"@lit/context\";\nimport { property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { offset } from \"@floating-ui/dom\";\nimport SgdsElement from \"../../base/sgds-element\";\nimport SgdsDropdown from \"../Dropdown/sgds-dropdown\";\nimport SgdsDropdownItem from \"../Dropdown/sgds-dropdown-item\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport { MainnavBreakpointContext } from \"./mainnav-context\";\nimport mainnavProfileStyle from \"./mainnav-profile.css\";\nimport genId from \"../../utils/generateId\";\n\n/**\n * @summary A profile component for the mainnav that shows a full dropdown in desktop and handles its own mobile menu.\n * In desktop: renders avatar + label + secondaryText with a dropdown.\n * In mobile: renders the avatar as a toggler that opens a self-contained mobile panel with profile items.\n * When present, it disables the mainnav's default hamburger toggler.\n *\n * @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)\n * @slot default - Profile menu items (sgds-dropdown-item elements)\n */\nexport class SgdsMainnavProfile extends SgdsElement {\n static styles = [...SgdsElement.styles, mainnavProfileStyle];\n /** @internal */\n static dependencies = {\n \"sgds-dropdown\": SgdsDropdown,\n \"sgds-dropdown-item\": SgdsDropdownItem,\n \"sgds-icon\": SgdsIcon\n };\n\n @consume({ context: MainnavBreakpointContext, subscribe: true })\n @state()\n private _breakpointReached = true;\n\n /** @internal Whether the mobile menu is open */\n @state()\n private _mobileMenuOpen = false;\n\n /** Primary text displayed next to the avatar in desktop (e.g. user name) */\n @property({ type: String, reflect: true })\n label = \"\";\n\n /** Secondary text displayed below the label in desktop (e.g. agency or role) */\n @property({ type: String, reflect: true })\n secondaryText = \"\";\n\n /** When true, disables the profile dropdown */\n @property({ type: Boolean })\n disabled = false;\n\n /** Accessible label for the profile toggle button */\n @property({ type: String })\n ariaLabel = \"\";\n\n /** Controls dropdown close behavior. \"default\" auto-closes on item/outside click, \"outside\" closes only on outside click, \"inside\" prevents auto-close. */\n @property({ type: String })\n close: \"default\" | \"outside\" | \"inside\" = \"default\";\n\n /** @internal */\n private togglerId: string = genId(\"profile\", \"button\");\n\n private _handleMobileToggle = () => {\n this._mobileMenuOpen = !this._mobileMenuOpen;\n };\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this._handleMobileToggle();\n }\n };\n\n render() {\n if (!this._breakpointReached) {\n // Desktop: dropdown with avatar + label + secondaryText\n return html`\n <sgds-dropdown .floatingOpts=${{ middleware: [offset(0)] }} ?disabled=${this.disabled} close=${this.close}>\n <button\n class=\"${classMap({\n \"nav-link\": true,\n disabled: this.disabled\n })}\"\n aria-disabled=${this.disabled ? \"true\" : \"false\"}\n aria-label=${ifDefined(this.ariaLabel)}\n id=${this.togglerId}\n tabindex=${this.disabled ? \"-1\" : \"0\"}\n slot=\"toggler\"\n >\n <slot name=\"avatar\"></slot>\n ${this.label || this.secondaryText\n ? html`<div class=\"profile-text\">\n ${this.label ? html`<span class=\"profile-label\">${this.label}</span>` : nothing}\n ${this.secondaryText\n ? html`<span class=\"profile-secondary-text\">${this.secondaryText}</span>`\n : nothing}\n </div>`\n : nothing}\n <sgds-icon name=\"chevron-down\" size=\"md\"></sgds-icon>\n </button>\n <slot></slot>\n </sgds-dropdown>\n `;\n }\n\n // Mobile: avatar toggler + self-contained mobile panel\n return html`\n <div\n class=\"profile-avatar-mobile\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=${this.ariaLabel || \"Toggle navigation\"}\n aria-expanded=${this._mobileMenuOpen ? \"true\" : \"false\"}\n @click=${this._handleMobileToggle}\n @keydown=${this._handleKeydown}\n >\n <slot name=\"avatar\"></slot>\n </div>\n <div class=\"profile-mobile-panel\" ?hidden=${!this._mobileMenuOpen}>\n <div class=\"profile-mobile-items\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport default SgdsMainnavProfile;\n"],"names":["mainnavProfileStyle"],"mappings":"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"}
1
+ {"version":3,"file":"sgds-mainnav-profile.js","sources":["../../../src/components/Mainnav/sgds-mainnav-profile.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { state } from \"lit/decorators.js\";\nimport NavProfileElement from \"../../base/nav-profile-element\";\nimport { MainnavBreakpointContext } from \"./mainnav-context\";\n\n/**\n * @summary A profile component for the mainnav that shows a full dropdown in desktop and handles its own mobile menu.\n * In desktop: renders avatar + label + secondaryText with a dropdown.\n * In mobile: renders the avatar as a toggler that opens a self-contained mobile panel with profile items.\n * When no dropdown items are slotted, renders as a non-interactive read-only element (no caret, no pointer cursor, not focusable).\n * When present, it disables the mainnav's default hamburger toggler.\n *\n * @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)\n * @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.\n */\nexport class SgdsMainnavProfile extends NavProfileElement {\n @consume({ context: MainnavBreakpointContext, subscribe: true })\n @state()\n protected override _breakpointReached = true;\n}\n\nexport default SgdsMainnavProfile;\n"],"names":[],"mappings":";;;;;;AAKA;;;;;;;;;AASG;AACG,MAAO,kBAAmB,SAAQ,iBAAiB,CAAA;AAAzD,IAAA,WAAA,GAAA;;QAGqB,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;KAC9C;AAAA,CAAA;AADoB,UAAA,CAAA;IAFlB,OAAO,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,KAAK,EAAE;AACqC,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA;;;;"}
@@ -1,10 +1,7 @@
1
- import { PropertyValueMap } from "lit";
2
- import SgdsElement from "../../base/sgds-element";
3
- import SgdsIconButton from "../IconButton/sgds-icon-button";
1
+ import NavElement from "../../base/nav-element";
4
2
  import SgdsMainnavDropdown from "./sgds-mainnav-dropdown";
5
3
  import SgdsMainnavItem from "./sgds-mainnav-item";
6
4
  export type MainnavExpandSize = "sm" | "md" | "lg" | "xl" | "xxl" | "always" | "never";
7
- export type MainnavTone = "default" | "brand" | "gradient-1" | "gradient-2" | "gradient-3" | "gradient-4";
8
5
  /**
9
6
  * @summary This component is the primary means that your users will use to navigate through your portal. It includes horizontal navigation and branding to identify your site.
10
7
  *
@@ -21,36 +18,14 @@ export type MainnavTone = "default" | "brand" | "gradient-1" | "gradient-2" | "g
21
18
  * @slot non-collapsible - Elements in this slot will not be collapsed
22
19
  *
23
20
  */
24
- export declare class SgdsMainnav extends SgdsElement {
21
+ export declare class SgdsMainnav extends NavElement {
25
22
  static styles: import("lit").CSSResult[];
26
- /** @internal */
27
- static dependencies: {
28
- "sgds-icon-button": typeof SgdsIconButton;
29
- };
30
23
  private _breakpointReached;
31
- /** Indicates if mobile menu is open or closed */
32
- private expanded;
33
- /** Denotes the transition state of mobile mainnav menu opening */
34
- private expanding;
35
- private nav;
36
- private navbar;
37
- private header;
38
- private body;
39
- private navScroll;
40
- private navbarEnd;
41
- /** @internal Whether sgds-mainnav-profile is slotted in the profile slot */
42
- private _hasProfileComponent;
24
+ private _expanded;
43
25
  /** Used only for SSR to indicate the presence of the `non-collapsible` slot. */
44
26
  hasNonCollapsibleSlot: boolean;
45
- /** The href link for brand logo */
46
- brandHref: string;
47
- tone: MainnavTone;
48
- private collapseId;
49
- /** The breakpoint, below which, the Navbar will collapse. When always the Navbar will always be expanded regardless of screen size. When never, the Navbar will always be collapsed */
50
- expand: MainnavExpandSize;
51
27
  /** When true, removes max-width constraint to allow content to stretch full screen width */
52
28
  fluid: boolean;
53
- private breakpointReached;
54
29
  private defaultNodes;
55
30
  private endNodes;
56
31
  /** @internal */
@@ -58,28 +33,12 @@ export declare class SgdsMainnav extends SgdsElement {
58
33
  /** @internal */
59
34
  get endSlotItems(): SgdsMainnavItem[] | SgdsMainnavDropdown[];
60
35
  private readonly hasSlotController;
61
- connectedCallback(): void;
62
- disconnectedCallback(): void;
63
- firstUpdated(changedProperties: PropertyValueMap<this>): void;
64
36
  updated(): void;
65
- private _handleClickOutOfElement;
66
- private _handleSummaryClick;
67
- private _handleResize;
68
- private _handleMobileNavBound;
69
- private _handleMobileNav;
70
- private _handleDesktopNav;
71
- private _animateToShow;
72
- private _animateToHide;
73
- /** @internal */
74
- handleOpenChange(): Promise<void>;
75
- /** Shows the menu. For when mainnav is in the collapsed form */
76
- show(): Promise<void>;
77
- /** Hide the menu. For when mainnav is in the collapsed form */
78
- hide(): Promise<void>;
37
+ protected _onBreakpointReached(reached: boolean): void;
38
+ protected _isBreakpointReached(): boolean;
79
39
  private _handleDefaultSlotChange;
80
40
  private _handleSlotChange;
81
41
  private _handleProfileSlotChange;
82
42
  render(): import("lit").TemplateResult<1>;
83
- _expandClass(): string;
84
43
  }
85
44
  export default SgdsMainnav;