@govtechsg/sgds-web-component 3.26.1 → 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.
- package/base/dropdown-list-element.js +9 -2
- package/base/dropdown-list-element.js.map +1 -1
- package/base/nav-element.d.ts +64 -0
- package/base/nav-element.js +263 -0
- package/base/nav-element.js.map +1 -0
- package/base/nav-profile-element.d.ts +47 -0
- package/base/nav-profile-element.js +191 -0
- package/base/nav-profile-element.js.map +1 -0
- package/base/nav-profile.js +6 -0
- package/base/nav-profile.js.map +1 -0
- package/components/Appnav/appnav-context.d.ts +6 -0
- package/components/Appnav/appnav-context.js +7 -0
- package/components/Appnav/appnav-context.js.map +1 -0
- package/components/Appnav/appnav.js +6 -0
- package/components/Appnav/appnav.js.map +1 -0
- package/components/Appnav/index.d.ts +9 -0
- package/components/Appnav/index.js +8 -0
- package/components/Appnav/index.js.map +1 -0
- package/components/Appnav/index.umd.min.js +2542 -0
- package/components/Appnav/index.umd.min.js.map +1 -0
- package/components/Appnav/sgds-appnav-profile.d.ts +17 -0
- package/components/Appnav/sgds-appnav-profile.js +31 -0
- package/components/Appnav/sgds-appnav-profile.js.map +1 -0
- package/components/Appnav/sgds-appnav.d.ts +44 -0
- package/components/Appnav/sgds-appnav.js +183 -0
- package/components/Appnav/sgds-appnav.js.map +1 -0
- package/components/Breadcrumb/index.umd.min.js +25 -25
- package/components/Breadcrumb/index.umd.min.js.map +1 -1
- package/components/Checkbox/index.umd.min.js +233 -233
- package/components/Checkbox/index.umd.min.js.map +1 -1
- package/components/Checkbox/sgds-checkbox.d.ts +1 -0
- package/components/Checkbox/sgds-checkbox.js +6 -1
- package/components/Checkbox/sgds-checkbox.js.map +1 -1
- package/components/ComboBox/index.umd.min.js +254 -254
- package/components/ComboBox/index.umd.min.js.map +1 -1
- package/components/DataTable/data-table.js +6 -0
- package/components/DataTable/data-table.js.map +1 -0
- package/components/DataTable/index.d.ts +12 -0
- package/components/DataTable/index.js +11 -0
- package/components/DataTable/index.js.map +1 -0
- package/components/DataTable/index.umd.min.js +2634 -0
- package/components/DataTable/index.umd.min.js.map +1 -0
- package/components/DataTable/sgds-data-table-cell.d.ts +15 -0
- package/components/DataTable/sgds-data-table-cell.js +32 -0
- package/components/DataTable/sgds-data-table-cell.js.map +1 -0
- package/components/DataTable/sgds-data-table-head.d.ts +28 -0
- package/components/DataTable/sgds-data-table-head.js +69 -0
- package/components/DataTable/sgds-data-table-head.js.map +1 -0
- package/components/DataTable/sgds-data-table-row.d.ts +76 -0
- package/components/DataTable/sgds-data-table-row.js +333 -0
- package/components/DataTable/sgds-data-table-row.js.map +1 -0
- package/components/DataTable/sgds-data-table.d.ts +82 -0
- package/components/DataTable/sgds-data-table.js +405 -0
- package/components/DataTable/sgds-data-table.js.map +1 -0
- package/components/Datepicker/index.umd.min.js +86 -86
- package/components/Datepicker/index.umd.min.js.map +1 -1
- package/components/Dropdown/dropdown-item.js +1 -1
- package/components/Dropdown/index.umd.min.js +5 -5
- package/components/Dropdown/index.umd.min.js.map +1 -1
- package/components/Dropdown/sgds-dropdown-item.d.ts +2 -0
- package/components/Dropdown/sgds-dropdown-item.js +8 -2
- package/components/Dropdown/sgds-dropdown-item.js.map +1 -1
- package/components/Input/index.umd.min.js +2 -2
- package/components/Input/index.umd.min.js.map +1 -1
- package/components/Input/input.js +1 -1
- package/components/Mainnav/index.d.ts +2 -0
- package/components/Mainnav/index.js +2 -0
- package/components/Mainnav/index.js.map +1 -1
- package/components/Mainnav/index.umd.min.js +339 -286
- package/components/Mainnav/index.umd.min.js.map +1 -1
- package/components/Mainnav/mainnav-dropdown.js +1 -1
- package/components/Mainnav/mainnav-item.js +1 -1
- package/components/Mainnav/mainnav.js +1 -1
- package/components/Mainnav/sgds-mainnav-profile.d.ts +15 -0
- package/components/Mainnav/sgds-mainnav-profile.js +29 -0
- package/components/Mainnav/sgds-mainnav-profile.js.map +1 -0
- package/components/Mainnav/sgds-mainnav.d.ts +8 -51
- package/components/Mainnav/sgds-mainnav.js +40 -238
- package/components/Mainnav/sgds-mainnav.js.map +1 -1
- package/components/OverflowMenu/index.umd.min.js +25 -25
- package/components/OverflowMenu/index.umd.min.js.map +1 -1
- package/components/QuantityToggle/index.umd.min.js +1 -1
- package/components/QuantityToggle/index.umd.min.js.map +1 -1
- package/components/Select/index.umd.min.js +1 -1
- package/components/Select/index.umd.min.js.map +1 -1
- package/components/Tab/index.umd.min.js +1 -1
- package/components/Tab/index.umd.min.js.map +1 -1
- package/components/Tab/tab-panel.js +1 -1
- package/components/Textarea/index.umd.min.js +1 -1
- package/components/Textarea/index.umd.min.js.map +1 -1
- package/components/Textarea/textarea.js +1 -1
- package/components/index.d.ts +7 -0
- package/components/index.js +7 -0
- package/components/index.js.map +1 -1
- package/components/index.umd.min.js +812 -628
- package/components/index.umd.min.js.map +1 -1
- package/css/fouc.css +9 -2
- package/custom-elements.json +11501 -7967
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/index.umd.min.js +699 -510
- package/index.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/react/appnav/index.cjs.js +45 -0
- package/react/appnav/index.cjs.js.map +1 -0
- package/react/appnav/index.d.ts +4 -0
- package/react/appnav/index.js +21 -0
- package/react/appnav/index.js.map +1 -0
- package/react/appnav-profile/index.cjs.js +40 -0
- package/react/appnav-profile/index.cjs.js.map +1 -0
- package/react/appnav-profile/index.d.ts +4 -0
- package/react/appnav-profile/index.js +16 -0
- package/react/appnav-profile/index.js.map +1 -0
- package/react/base/dropdown-list-element.cjs.js +9 -2
- package/react/base/dropdown-list-element.cjs.js.map +1 -1
- package/react/base/dropdown-list-element.js +9 -2
- package/react/base/dropdown-list-element.js.map +1 -1
- package/react/base/nav-element.cjs.js +268 -0
- package/react/base/nav-element.cjs.js.map +1 -0
- package/react/base/nav-element.js +264 -0
- package/react/base/nav-element.js.map +1 -0
- package/react/base/nav-profile-element.cjs.js +196 -0
- package/react/base/nav-profile-element.cjs.js.map +1 -0
- package/react/base/nav-profile-element.js +192 -0
- package/react/base/nav-profile-element.js.map +1 -0
- package/react/base/nav-profile.cjs.js +11 -0
- package/react/base/nav-profile.cjs.js.map +1 -0
- package/react/base/nav-profile.js +7 -0
- package/react/base/nav-profile.js.map +1 -0
- package/react/components/Appnav/appnav-context.cjs.js +13 -0
- package/react/components/Appnav/appnav-context.cjs.js.map +1 -0
- package/react/components/Appnav/appnav-context.js +8 -0
- package/react/components/Appnav/appnav-context.js.map +1 -0
- package/react/components/Appnav/appnav.cjs.js +11 -0
- package/react/components/Appnav/appnav.cjs.js.map +1 -0
- package/react/components/Appnav/appnav.js +7 -0
- package/react/components/Appnav/appnav.js.map +1 -0
- package/react/components/Appnav/sgds-appnav-profile.cjs.js +37 -0
- package/react/components/Appnav/sgds-appnav-profile.cjs.js.map +1 -0
- package/react/components/Appnav/sgds-appnav-profile.js +32 -0
- package/react/components/Appnav/sgds-appnav-profile.js.map +1 -0
- package/react/components/Appnav/sgds-appnav.cjs.js +189 -0
- package/react/components/Appnav/sgds-appnav.cjs.js.map +1 -0
- package/react/components/Appnav/sgds-appnav.js +184 -0
- package/react/components/Appnav/sgds-appnav.js.map +1 -0
- package/react/components/Checkbox/sgds-checkbox.cjs.js +6 -1
- package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
- package/react/components/Checkbox/sgds-checkbox.js +6 -1
- package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
- package/react/components/DataTable/data-table.cjs.js +11 -0
- package/react/components/DataTable/data-table.cjs.js.map +1 -0
- package/react/components/DataTable/data-table.js +7 -0
- package/react/components/DataTable/data-table.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-cell.cjs.js +38 -0
- package/react/components/DataTable/sgds-data-table-cell.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-cell.js +33 -0
- package/react/components/DataTable/sgds-data-table-cell.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-head.cjs.js +75 -0
- package/react/components/DataTable/sgds-data-table-head.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-head.js +70 -0
- package/react/components/DataTable/sgds-data-table-head.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-row.cjs.js +339 -0
- package/react/components/DataTable/sgds-data-table-row.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-row.js +334 -0
- package/react/components/DataTable/sgds-data-table-row.js.map +1 -0
- package/react/components/DataTable/sgds-data-table.cjs.js +411 -0
- package/react/components/DataTable/sgds-data-table.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table.js +406 -0
- package/react/components/DataTable/sgds-data-table.js.map +1 -0
- package/react/components/Dropdown/dropdown-item.cjs.js +1 -1
- package/react/components/Dropdown/dropdown-item.js +1 -1
- package/react/components/Dropdown/sgds-dropdown-item.cjs.js +8 -2
- package/react/components/Dropdown/sgds-dropdown-item.cjs.js.map +1 -1
- package/react/components/Dropdown/sgds-dropdown-item.js +8 -2
- package/react/components/Dropdown/sgds-dropdown-item.js.map +1 -1
- package/react/components/Input/input.cjs.js +1 -1
- package/react/components/Input/input.js +1 -1
- package/react/components/Mainnav/mainnav-dropdown.cjs.js +1 -1
- package/react/components/Mainnav/mainnav-dropdown.js +1 -1
- package/react/components/Mainnav/mainnav-item.cjs.js +1 -1
- package/react/components/Mainnav/mainnav-item.js +1 -1
- package/react/components/Mainnav/mainnav.cjs.js +1 -1
- package/react/components/Mainnav/mainnav.js +1 -1
- package/react/components/Mainnav/sgds-mainnav-profile.cjs.js +35 -0
- package/react/components/Mainnav/sgds-mainnav-profile.cjs.js.map +1 -0
- package/react/components/Mainnav/sgds-mainnav-profile.js +30 -0
- package/react/components/Mainnav/sgds-mainnav-profile.js.map +1 -0
- package/react/components/Mainnav/sgds-mainnav.cjs.js +39 -237
- package/react/components/Mainnav/sgds-mainnav.cjs.js.map +1 -1
- package/react/components/Mainnav/sgds-mainnav.js +40 -238
- package/react/components/Mainnav/sgds-mainnav.js.map +1 -1
- package/react/components/Tab/tab-panel.cjs.js +1 -1
- package/react/components/Tab/tab-panel.js +1 -1
- package/react/components/Textarea/textarea.cjs.js +1 -1
- package/react/components/Textarea/textarea.js +1 -1
- package/react/data-table/index.cjs.js +44 -0
- package/react/data-table/index.cjs.js.map +1 -0
- package/react/data-table/index.d.ts +4 -0
- package/react/data-table/index.js +20 -0
- package/react/data-table/index.js.map +1 -0
- package/react/data-table-cell/index.cjs.js +40 -0
- package/react/data-table-cell/index.cjs.js.map +1 -0
- package/react/data-table-cell/index.d.ts +4 -0
- package/react/data-table-cell/index.js +16 -0
- package/react/data-table-cell/index.js.map +1 -0
- package/react/data-table-head/index.cjs.js +40 -0
- package/react/data-table-head/index.cjs.js.map +1 -0
- package/react/data-table-head/index.d.ts +4 -0
- package/react/data-table-head/index.js +16 -0
- package/react/data-table-head/index.js.map +1 -0
- package/react/data-table-row/index.cjs.js +45 -0
- package/react/data-table-row/index.cjs.js.map +1 -0
- package/react/data-table-row/index.d.ts +4 -0
- package/react/data-table-row/index.js +21 -0
- package/react/data-table-row/index.js.map +1 -0
- package/react/index.cjs.js +152 -138
- package/react/index.cjs.js.map +1 -1
- package/react/index.d.ts +9 -2
- package/react/index.js +9 -2
- package/react/index.js.map +1 -1
- package/react/mainnav-profile/index.cjs.js +40 -0
- package/react/mainnav-profile/index.cjs.js.map +1 -0
- package/react/mainnav-profile/index.d.ts +4 -0
- package/react/mainnav-profile/index.js +16 -0
- package/react/mainnav-profile/index.js.map +1 -0
- package/react/styles/form-text-control.cjs.js +1 -1
- package/react/styles/form-text-control.js +1 -1
- package/styles/form-text-control.js +1 -1
- package/themes/blue.css +11 -11
- package/themes/cyan.css +10 -10
- package/themes/gt/blue.css +11 -11
- package/themes/gt/cyan.css +10 -10
- package/themes/gt/magenta.css +11 -11
- package/themes/gt/pink.css +11 -11
- package/themes/gt/purple.css +11 -11
- package/themes/gt/red.css +11 -11
- package/themes/magenta.css +11 -11
- package/themes/pink.css +11 -11
- package/themes/purple.css +11 -11
- package/themes/red.css +11 -11
- package/themes/root.css +5 -0
- package/types/react.d.ts +244 -92
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __decorate } from 'tslib';
|
|
3
|
+
import { html, nothing } from 'lit';
|
|
4
|
+
import { state, queryAssignedElements, 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 './sgds-element.js';
|
|
9
|
+
import { SgdsDropdown } from '../components/Dropdown/sgds-dropdown.js';
|
|
10
|
+
import { SgdsIcon } from '../components/Icon/sgds-icon.js';
|
|
11
|
+
import css_248z from './nav-profile.js';
|
|
12
|
+
import genId from '../utils/generateId.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Base class for navigation profile components (sgds-mainnav-profile and sgds-appnav-profile).
|
|
16
|
+
* Provides the full profile dropdown (desktop) and mobile panel behavior.
|
|
17
|
+
* When no dropdown items are slotted into the default slot, renders as a non-interactive
|
|
18
|
+
* read-only element (no dropdown menu, no caret icon, cursor default, not focusable by keyboard or mouse).
|
|
19
|
+
* Subclasses must consume the appropriate breakpoint context and set `_breakpointReached`.
|
|
20
|
+
*
|
|
21
|
+
* @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)
|
|
22
|
+
* @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.
|
|
23
|
+
*/
|
|
24
|
+
class NavProfileElement extends SgdsElement {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
/** @internal Whether the breakpoint is reached (mobile mode). Subclasses set this via context consumption. */
|
|
28
|
+
this._breakpointReached = true;
|
|
29
|
+
/** @internal Whether the mobile menu is open */
|
|
30
|
+
this._mobileMenuOpen = false;
|
|
31
|
+
/** @internal Whether dropdown items are slotted */
|
|
32
|
+
this._hasDropdownItems = false;
|
|
33
|
+
/** Primary text displayed next to the avatar in desktop (e.g. user name) */
|
|
34
|
+
this.label = "";
|
|
35
|
+
/** Secondary text displayed below the label in desktop (e.g. agency or role) */
|
|
36
|
+
this.secondaryText = "";
|
|
37
|
+
/** When true, disables the profile dropdown */
|
|
38
|
+
this.disabled = false;
|
|
39
|
+
/** Accessible label for the profile toggle button */
|
|
40
|
+
this.ariaLabel = "";
|
|
41
|
+
/** Controls dropdown close behavior. "default" auto-closes on item/outside click, "outside" closes only on outside click, "inside" prevents auto-close. */
|
|
42
|
+
this.close = "default";
|
|
43
|
+
/** @internal */
|
|
44
|
+
this.togglerId = genId("profile", "button");
|
|
45
|
+
this._handleMobileToggle = () => {
|
|
46
|
+
this._mobileMenuOpen = !this._mobileMenuOpen;
|
|
47
|
+
};
|
|
48
|
+
this._handleClickOutside = (e) => {
|
|
49
|
+
if (!this._mobileMenuOpen)
|
|
50
|
+
return;
|
|
51
|
+
if (this.close === "inside")
|
|
52
|
+
return;
|
|
53
|
+
if (!e.composedPath().includes(this)) {
|
|
54
|
+
this._mobileMenuOpen = false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
this._handleSlotChange = () => {
|
|
58
|
+
this._hasDropdownItems = this._defaultSlotElements.length > 0;
|
|
59
|
+
};
|
|
60
|
+
this._handleKeydown = (e) => {
|
|
61
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
this._handleMobileToggle();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
connectedCallback() {
|
|
68
|
+
super.connectedCallback();
|
|
69
|
+
window.addEventListener("click", this._handleClickOutside);
|
|
70
|
+
}
|
|
71
|
+
disconnectedCallback() {
|
|
72
|
+
super.disconnectedCallback();
|
|
73
|
+
window.removeEventListener("click", this._handleClickOutside);
|
|
74
|
+
}
|
|
75
|
+
render() {
|
|
76
|
+
if (!this._breakpointReached) {
|
|
77
|
+
// Desktop: read-only (no dropdown items)
|
|
78
|
+
if (!this._hasDropdownItems) {
|
|
79
|
+
return html `
|
|
80
|
+
<div
|
|
81
|
+
class="${classMap({
|
|
82
|
+
"nav-link": true,
|
|
83
|
+
"read-only": true
|
|
84
|
+
})}"
|
|
85
|
+
aria-label=${ifDefined(this.ariaLabel)}
|
|
86
|
+
>
|
|
87
|
+
<slot name="avatar"></slot>
|
|
88
|
+
${this.label || this.secondaryText
|
|
89
|
+
? html `<div class="profile-text">
|
|
90
|
+
${this.label ? html `<span class="profile-label">${this.label}</span>` : nothing}
|
|
91
|
+
${this.secondaryText
|
|
92
|
+
? html `<span class="profile-secondary-text">${this.secondaryText}</span>`
|
|
93
|
+
: nothing}
|
|
94
|
+
</div>`
|
|
95
|
+
: nothing}
|
|
96
|
+
</div>
|
|
97
|
+
<slot @slotchange=${this._handleSlotChange}></slot>
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
// Desktop: dropdown with avatar + label + secondaryText
|
|
101
|
+
return html `
|
|
102
|
+
<sgds-dropdown .floatingOpts=${{ middleware: [offset(0)] }} ?disabled=${this.disabled} close=${this.close}>
|
|
103
|
+
<button
|
|
104
|
+
class="${classMap({
|
|
105
|
+
"nav-link": true,
|
|
106
|
+
disabled: this.disabled
|
|
107
|
+
})}"
|
|
108
|
+
aria-disabled=${this.disabled ? "true" : "false"}
|
|
109
|
+
aria-label=${ifDefined(this.ariaLabel)}
|
|
110
|
+
id=${this.togglerId}
|
|
111
|
+
tabindex=${this.disabled ? "-1" : "0"}
|
|
112
|
+
slot="toggler"
|
|
113
|
+
>
|
|
114
|
+
<slot name="avatar"></slot>
|
|
115
|
+
${this.label || this.secondaryText
|
|
116
|
+
? html `<div class="profile-text">
|
|
117
|
+
${this.label ? html `<span class="profile-label">${this.label}</span>` : nothing}
|
|
118
|
+
${this.secondaryText
|
|
119
|
+
? html `<span class="profile-secondary-text">${this.secondaryText}</span>`
|
|
120
|
+
: nothing}
|
|
121
|
+
</div>`
|
|
122
|
+
: nothing}
|
|
123
|
+
<sgds-icon name="chevron-down" size="md"></sgds-icon>
|
|
124
|
+
</button>
|
|
125
|
+
<slot @slotchange=${this._handleSlotChange}></slot>
|
|
126
|
+
</sgds-dropdown>
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
// Mobile: read-only (no dropdown items)
|
|
130
|
+
if (!this._hasDropdownItems) {
|
|
131
|
+
return html `
|
|
132
|
+
<div class="profile-avatar-mobile read-only">
|
|
133
|
+
<slot name="avatar"></slot>
|
|
134
|
+
</div>
|
|
135
|
+
<slot @slotchange=${this._handleSlotChange}></slot>
|
|
136
|
+
`;
|
|
137
|
+
}
|
|
138
|
+
// Mobile: avatar toggler + self-contained mobile panel
|
|
139
|
+
return html `
|
|
140
|
+
<button
|
|
141
|
+
class="profile-avatar-mobile"
|
|
142
|
+
aria-label=${this.ariaLabel || "Toggle navigation"}
|
|
143
|
+
aria-expanded=${this._mobileMenuOpen ? "true" : "false"}
|
|
144
|
+
@click=${this._handleMobileToggle}
|
|
145
|
+
@keydown=${this._handleKeydown}
|
|
146
|
+
>
|
|
147
|
+
<slot name="avatar"></slot>
|
|
148
|
+
</button>
|
|
149
|
+
<div class="profile-mobile-panel" ?hidden=${!this._mobileMenuOpen}>
|
|
150
|
+
<div class="profile-mobile-items">
|
|
151
|
+
<slot @slotchange=${this._handleSlotChange}></slot>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
NavProfileElement.styles = [...SgdsElement.styles, css_248z];
|
|
158
|
+
/** @internal */
|
|
159
|
+
NavProfileElement.dependencies = {
|
|
160
|
+
"sgds-dropdown": SgdsDropdown,
|
|
161
|
+
"sgds-icon": SgdsIcon
|
|
162
|
+
};
|
|
163
|
+
__decorate([
|
|
164
|
+
state()
|
|
165
|
+
], NavProfileElement.prototype, "_breakpointReached", void 0);
|
|
166
|
+
__decorate([
|
|
167
|
+
state()
|
|
168
|
+
], NavProfileElement.prototype, "_mobileMenuOpen", void 0);
|
|
169
|
+
__decorate([
|
|
170
|
+
state()
|
|
171
|
+
], NavProfileElement.prototype, "_hasDropdownItems", void 0);
|
|
172
|
+
__decorate([
|
|
173
|
+
queryAssignedElements({ flatten: true })
|
|
174
|
+
], NavProfileElement.prototype, "_defaultSlotElements", void 0);
|
|
175
|
+
__decorate([
|
|
176
|
+
property({ type: String, reflect: true })
|
|
177
|
+
], NavProfileElement.prototype, "label", void 0);
|
|
178
|
+
__decorate([
|
|
179
|
+
property({ type: String, reflect: true })
|
|
180
|
+
], NavProfileElement.prototype, "secondaryText", void 0);
|
|
181
|
+
__decorate([
|
|
182
|
+
property({ type: Boolean })
|
|
183
|
+
], NavProfileElement.prototype, "disabled", void 0);
|
|
184
|
+
__decorate([
|
|
185
|
+
property({ type: String })
|
|
186
|
+
], NavProfileElement.prototype, "ariaLabel", void 0);
|
|
187
|
+
__decorate([
|
|
188
|
+
property({ type: String })
|
|
189
|
+
], NavProfileElement.prototype, "close", void 0);
|
|
190
|
+
|
|
191
|
+
export { NavProfileElement as default };
|
|
192
|
+
//# sourceMappingURL=nav-profile-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-profile-element.js","sources":["../../../src/base/nav-profile-element.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { property, queryAssignedElements, 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 \"./sgds-element\";\nimport SgdsDropdown from \"../components/Dropdown/sgds-dropdown\";\nimport SgdsIcon from \"../components/Icon/sgds-icon\";\nimport navProfileStyle from \"./nav-profile.css\";\nimport genId from \"../utils/generateId\";\n\n/**\n * Base class for navigation profile components (sgds-mainnav-profile and sgds-appnav-profile).\n * Provides the full profile dropdown (desktop) and mobile panel behavior.\n * When no dropdown items are slotted into the default slot, renders as a non-interactive\n * read-only element (no dropdown menu, no caret icon, cursor default, not focusable by keyboard or mouse).\n * Subclasses must consume the appropriate breakpoint context and set `_breakpointReached`.\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 default abstract class NavProfileElement extends SgdsElement {\n static styles = [...SgdsElement.styles, navProfileStyle];\n /** @internal */\n static dependencies = {\n \"sgds-dropdown\": SgdsDropdown,\n \"sgds-icon\": SgdsIcon\n };\n\n /** @internal Whether the breakpoint is reached (mobile mode). Subclasses set this via context consumption. */\n @state()\n protected _breakpointReached = true;\n\n /** @internal Whether the mobile menu is open */\n @state()\n private _mobileMenuOpen = false;\n\n /** @internal Whether dropdown items are slotted */\n @state()\n private _hasDropdownItems = false;\n\n @queryAssignedElements({ flatten: true })\n private _defaultSlotElements!: HTMLElement[];\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 _handleClickOutside = (e: MouseEvent) => {\n if (!this._mobileMenuOpen) return;\n if (this.close === \"inside\") return;\n if (!e.composedPath().includes(this)) {\n this._mobileMenuOpen = false;\n }\n };\n\n connectedCallback() {\n super.connectedCallback();\n window.addEventListener(\"click\", this._handleClickOutside);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"click\", this._handleClickOutside);\n }\n\n private _handleSlotChange = () => {\n this._hasDropdownItems = this._defaultSlotElements.length > 0;\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: read-only (no dropdown items)\n if (!this._hasDropdownItems) {\n return html`\n <div\n class=\"${classMap({\n \"nav-link\": true,\n \"read-only\": true\n })}\"\n aria-label=${ifDefined(this.ariaLabel)}\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 </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n\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 @slotchange=${this._handleSlotChange}></slot>\n </sgds-dropdown>\n `;\n }\n\n // Mobile: read-only (no dropdown items)\n if (!this._hasDropdownItems) {\n return html`\n <div class=\"profile-avatar-mobile read-only\">\n <slot name=\"avatar\"></slot>\n </div>\n <slot @slotchange=${this._handleSlotChange}></slot>\n `;\n }\n\n // Mobile: avatar toggler + self-contained mobile panel\n return html`\n <button\n class=\"profile-avatar-mobile\"\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 </button>\n <div class=\"profile-mobile-panel\" ?hidden=${!this._mobileMenuOpen}>\n <div class=\"profile-mobile-items\">\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n"],"names":["navProfileStyle"],"mappings":";;;;;;;;;;;;;AAWA;;;;;;;;;AASG;AACH,MAA8B,iBAAkB,SAAQ,WAAW,CAAA;AAAnE,IAAA,WAAA,GAAA;;;QAUY,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;;QAI5B,IAAe,CAAA,eAAA,GAAG,KAAK,CAAC;;QAIxB,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;;QAOlC,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;;QAIX,IAAa,CAAA,aAAA,GAAG,EAAE,CAAC;;QAInB,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;;QAIjB,IAAS,CAAA,SAAA,GAAG,EAAE,CAAC;;QAIf,IAAK,CAAA,KAAA,GAAqC,SAAS,CAAC;;AAG5C,QAAA,IAAA,CAAA,SAAS,GAAW,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAmB,CAAA,mBAAA,GAAG,MAAK;AACjC,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;AAC/C,SAAC,CAAC;AAEM,QAAA,IAAA,CAAA,mBAAmB,GAAG,CAAC,CAAa,KAAI;YAC9C,IAAI,CAAC,IAAI,CAAC,eAAe;gBAAE,OAAO;AAClC,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO;YACpC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACpC,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;aAC9B;AACH,SAAC,CAAC;QAYM,IAAiB,CAAA,iBAAA,GAAG,MAAK;YAC/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;AAChE,SAAC,CAAC;AAEM,QAAA,IAAA,CAAA,cAAc,GAAG,CAAC,CAAgB,KAAI;AAC5C,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE;gBACtC,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,mBAAmB,EAAE,CAAC;aAC5B;AACH,SAAC,CAAC;KAsFH;IAzGC,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;KAC5D;IAED,oBAAoB,GAAA;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;KAC/D;IAaD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;;AAE5B,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC3B,gBAAA,OAAO,IAAI,CAAA,CAAA;;AAEE,mBAAA,EAAA,QAAQ,CAAC;AAChB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,WAAW,EAAE,IAAI;iBAClB,CAAC,CAAA;AACW,uBAAA,EAAA,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;;;AAGpC,YAAA,EAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa;sBAC9B,IAAI,CAAA,CAAA;AACA,kBAAA,EAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA,CAA+B,4BAAA,EAAA,IAAI,CAAC,KAAK,CAAA,OAAA,CAAS,GAAG,OAAO,CAAA;AAC7E,kBAAA,EAAA,IAAI,CAAC,aAAa;AAClB,0BAAE,IAAI,CAAA,wCAAwC,IAAI,CAAC,aAAa,CAAS,OAAA,CAAA;AACzE,0BAAE,OAAO,CAAA;AACN,sBAAA,CAAA;AACT,sBAAE,OAAO,CAAA;;AAEO,4BAAA,EAAA,IAAI,CAAC,iBAAiB,CAAA;SAC3C,CAAC;aACH;;AAGD,YAAA,OAAO,IAAI,CAAA,CAAA;AACsB,qCAAA,EAAA,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,CAAU,OAAA,EAAA,IAAI,CAAC,KAAK,CAAA;;AAE5F,mBAAA,EAAA,QAAQ,CAAC;AAChB,gBAAA,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAA;4BACc,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AACnC,uBAAA,EAAA,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACjC,eAAA,EAAA,IAAI,CAAC,SAAS,CAAA;uBACR,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAA;;;;AAInC,YAAA,EAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa;kBAC9B,IAAI,CAAA,CAAA;AACA,kBAAA,EAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA,CAA+B,4BAAA,EAAA,IAAI,CAAC,KAAK,CAAA,OAAA,CAAS,GAAG,OAAO,CAAA;AAC7E,kBAAA,EAAA,IAAI,CAAC,aAAa;AAClB,sBAAE,IAAI,CAAA,wCAAwC,IAAI,CAAC,aAAa,CAAS,OAAA,CAAA;AACzE,sBAAE,OAAO,CAAA;AACN,sBAAA,CAAA;AACT,kBAAE,OAAO,CAAA;;;AAGO,4BAAA,EAAA,IAAI,CAAC,iBAAiB,CAAA;;OAE7C,CAAC;SACH;;AAGD,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAA,CAAA;;;;AAIW,0BAAA,EAAA,IAAI,CAAC,iBAAiB,CAAA;OAC3C,CAAC;SACH;;AAGD,QAAA,OAAO,IAAI,CAAA,CAAA;;;qBAGM,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAA;wBAClC,IAAI,CAAC,eAAe,GAAG,MAAM,GAAG,OAAO,CAAA;AAC9C,eAAA,EAAA,IAAI,CAAC,mBAAmB,CAAA;AACtB,iBAAA,EAAA,IAAI,CAAC,cAAc,CAAA;;;;kDAIY,CAAC,IAAI,CAAC,eAAe,CAAA;;AAEzC,4BAAA,EAAA,IAAI,CAAC,iBAAiB,CAAA;;;KAG/C,CAAC;KACH;;AAjKM,iBAAM,CAAA,MAAA,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAEA,QAAe,CAA1C,CAA4C;AACzD;AACO,iBAAA,CAAA,YAAY,GAAG;AACpB,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,WAAW,EAAE,QAAQ;AACtB,CAHkB,CAGjB;AAIQ,UAAA,CAAA;AADT,IAAA,KAAK,EAAE;AAC4B,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAI5B,UAAA,CAAA;AADP,IAAA,KAAK,EAAE;AACwB,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIxB,UAAA,CAAA;AADP,IAAA,KAAK,EAAE;AAC0B,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,mBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAG1B,UAAA,CAAA;AADP,IAAA,qBAAqB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACI,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,sBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAI7C,UAAA,CAAA;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIX,UAAA,CAAA;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvB,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAInB,UAAA,CAAA;AADC,IAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACX,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIjB,UAAA,CAAA;AADC,IAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACZ,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAIf,UAAA,CAAA;AADC,IAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACyB,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var lit = require('lit');
|
|
7
|
+
|
|
8
|
+
var css_248z = lit.css`:host([expand=always]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}@media (min-width:512px){:host([expand=sm]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:768px){:host([expand=md]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:1024px){:host(:not([expand])) .nav-link,:host([expand=lg]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:1280px){:host([expand=xl]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:1440px){:host([expand=xxl]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}button.nav-link{appearance:none;background:none;border:none;font-family:inherit}.nav-link{align-items:center;box-sizing:border-box;color:var(--sgds-color-default);cursor:pointer;display:flex;font-size:var(--sgds-font-size-label-sm);gap:var(--sgds-gap-xs);line-height:var(--sgds-line-height-2-xs,20px);padding:var(--sgds-padding-sm) var(--sgds-mainnav-mobile-padding-x);text-decoration:none}.nav-link:not(.disabled):hover{color:var(--sgds-primary-color-default)}.nav-link:not(.disabled):focus-visible{color:var(--sgds-primary-color-default);outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.nav-link.disabled{cursor:not-allowed;opacity:var(--sgds-opacity-40)}.nav-link.read-only,.profile-avatar-mobile.read-only{cursor:default;pointer-events:none}:host([tone=brand][expand=always]) .nav-link,:host([tone^=gradient][expand=always]) .nav-link{color:var(--sgds-color-fixed-light)}@media screen and (min-width:512px){:host([tone=brand][expand=sm]) .nav-link,:host([tone^=gradient][expand=sm]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:768px){:host([tone=brand][expand=md]) .nav-link,:host([tone^=gradient][expand=md]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:1024px){:host([tone=brand][expand=lg]) .nav-link,:host([tone^=gradient][expand=lg]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:1280px){:host([tone=brand][expand=xl]) .nav-link,:host([tone^=gradient][expand=xl]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:1440px){:host([tone=brand][expand=xxl]) .nav-link,:host([tone^=gradient][expand=xxl]) .nav-link{color:var(--sgds-color-fixed-light)}}.profile-text{display:flex;flex:1;flex-direction:column;gap:var(--sgds-gap-text-2-xs,2px);text-align:left}.profile-label{font-weight:var(--sgds-font-weight-semibold)}.profile-label,.profile-secondary-text{font-size:var(--sgds-font-size-body-xs);line-height:var(--sgds-line-height-3-xs,16px)}sgds-dropdown{display:block;height:100%}.profile-avatar-mobile{align-items:center;background:none;border:none;border-radius:var(--sgds-border-radius-full);color:inherit;cursor:pointer;display:flex;font:inherit;height:100%;margin:0;padding:0}.profile-avatar-mobile:focus-visible{outline:none}.profile-avatar-mobile:focus-visible ::slotted(*){border-radius:var(--sgds-border-radius-full);outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.profile-mobile-panel{animation:profile-panel-show .2s ease-in-out;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);left:0;padding:var(--sgds-padding-md) 0;position:absolute;top:100%;width:100%;z-index:var(--sgds-z-index-floating)}.profile-mobile-panel[hidden]{display:none}@keyframes profile-panel-show{0%{max-height:0;opacity:0}to{max-height:100dvh;opacity:1}}.profile-mobile-items{display:flex;flex-direction:column;height:100dvh;margin:auto;max-width:var(--sgds-mainnav-max-width,1440px);overflow-y:auto;width:100%}@media screen and (min-width:1024px){.nav-link{padding:var(--sgds-padding-sm) var(--sgds-mainnav-padding-x)}}`;
|
|
9
|
+
|
|
10
|
+
exports["default"] = css_248z;
|
|
11
|
+
//# sourceMappingURL=nav-profile.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-profile.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { css } from 'lit';
|
|
3
|
+
|
|
4
|
+
var css_248z = css`:host([expand=always]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}@media (min-width:512px){:host([expand=sm]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:768px){:host([expand=md]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:1024px){:host(:not([expand])) .nav-link,:host([expand=lg]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:1280px){:host([expand=xl]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}@media (min-width:1440px){:host([expand=xxl]) .nav-link{border-bottom:var(--sgds-border-width-4) solid transparent;min-height:100%;padding:0 var(--sgds-padding-md)}}button.nav-link{appearance:none;background:none;border:none;font-family:inherit}.nav-link{align-items:center;box-sizing:border-box;color:var(--sgds-color-default);cursor:pointer;display:flex;font-size:var(--sgds-font-size-label-sm);gap:var(--sgds-gap-xs);line-height:var(--sgds-line-height-2-xs,20px);padding:var(--sgds-padding-sm) var(--sgds-mainnav-mobile-padding-x);text-decoration:none}.nav-link:not(.disabled):hover{color:var(--sgds-primary-color-default)}.nav-link:not(.disabled):focus-visible{color:var(--sgds-primary-color-default);outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.nav-link.disabled{cursor:not-allowed;opacity:var(--sgds-opacity-40)}.nav-link.read-only,.profile-avatar-mobile.read-only{cursor:default;pointer-events:none}:host([tone=brand][expand=always]) .nav-link,:host([tone^=gradient][expand=always]) .nav-link{color:var(--sgds-color-fixed-light)}@media screen and (min-width:512px){:host([tone=brand][expand=sm]) .nav-link,:host([tone^=gradient][expand=sm]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:768px){:host([tone=brand][expand=md]) .nav-link,:host([tone^=gradient][expand=md]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:1024px){:host([tone=brand][expand=lg]) .nav-link,:host([tone^=gradient][expand=lg]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:1280px){:host([tone=brand][expand=xl]) .nav-link,:host([tone^=gradient][expand=xl]) .nav-link{color:var(--sgds-color-fixed-light)}}@media screen and (min-width:1440px){:host([tone=brand][expand=xxl]) .nav-link,:host([tone^=gradient][expand=xxl]) .nav-link{color:var(--sgds-color-fixed-light)}}.profile-text{display:flex;flex:1;flex-direction:column;gap:var(--sgds-gap-text-2-xs,2px);text-align:left}.profile-label{font-weight:var(--sgds-font-weight-semibold)}.profile-label,.profile-secondary-text{font-size:var(--sgds-font-size-body-xs);line-height:var(--sgds-line-height-3-xs,16px)}sgds-dropdown{display:block;height:100%}.profile-avatar-mobile{align-items:center;background:none;border:none;border-radius:var(--sgds-border-radius-full);color:inherit;cursor:pointer;display:flex;font:inherit;height:100%;margin:0;padding:0}.profile-avatar-mobile:focus-visible{outline:none}.profile-avatar-mobile:focus-visible ::slotted(*){border-radius:var(--sgds-border-radius-full);outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.profile-mobile-panel{animation:profile-panel-show .2s ease-in-out;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);left:0;padding:var(--sgds-padding-md) 0;position:absolute;top:100%;width:100%;z-index:var(--sgds-z-index-floating)}.profile-mobile-panel[hidden]{display:none}@keyframes profile-panel-show{0%{max-height:0;opacity:0}to{max-height:100dvh;opacity:1}}.profile-mobile-items{display:flex;flex-direction:column;height:100dvh;margin:auto;max-width:var(--sgds-mainnav-max-width,1440px);overflow-y:auto;width:100%}@media screen and (min-width:1024px){.nav-link{padding:var(--sgds-padding-sm) var(--sgds-mainnav-padding-x)}}`;
|
|
5
|
+
|
|
6
|
+
export { css_248z as default };
|
|
7
|
+
//# sourceMappingURL=nav-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-profile.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var context = require('@lit/context');
|
|
7
|
+
|
|
8
|
+
const AppnavBreakpointContext = context.createContext("appnav-context");
|
|
9
|
+
const AppnavExpandedContext = context.createContext("appnav-expanded-context");
|
|
10
|
+
|
|
11
|
+
exports.AppnavBreakpointContext = AppnavBreakpointContext;
|
|
12
|
+
exports.AppnavExpandedContext = AppnavExpandedContext;
|
|
13
|
+
//# sourceMappingURL=appnav-context.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appnav-context.cjs.js","sources":["../../../../src/components/Appnav/appnav-context.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\n\nexport const AppnavBreakpointContext = createContext<boolean>(\"appnav-context\");\n\nexport const AppnavExpandedContext = createContext<boolean>(\"appnav-expanded-context\");\n"],"names":["createContext"],"mappings":";;;;;;;MAEa,uBAAuB,GAAGA,qBAAa,CAAU,gBAAgB,EAAE;MAEnE,qBAAqB,GAAGA,qBAAa,CAAU,yBAAyB;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createContext } from '@lit/context';
|
|
3
|
+
|
|
4
|
+
const AppnavBreakpointContext = createContext("appnav-context");
|
|
5
|
+
const AppnavExpandedContext = createContext("appnav-expanded-context");
|
|
6
|
+
|
|
7
|
+
export { AppnavBreakpointContext, AppnavExpandedContext };
|
|
8
|
+
//# sourceMappingURL=appnav-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appnav-context.js","sources":["../../../../src/components/Appnav/appnav-context.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\n\nexport const AppnavBreakpointContext = createContext<boolean>(\"appnav-context\");\n\nexport const AppnavExpandedContext = createContext<boolean>(\"appnav-expanded-context\");\n"],"names":[],"mappings":";;;MAEa,uBAAuB,GAAG,aAAa,CAAU,gBAAgB,EAAE;MAEnE,qBAAqB,GAAG,aAAa,CAAU,yBAAyB;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var lit = require('lit');
|
|
7
|
+
|
|
8
|
+
var css_248z = lit.css`:host{display:block}nav{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;min-height:var(--sgds-mainnav-height,72px);padding:0 var(--sgds-mainnav-mobile-padding-x);width:100%}.navbar-brand{align-items:center;color:var(--sgds-color-fixed-light);display:flex;text-decoration:none;white-space:nowrap}.navbar-brand:focus-visible{outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.navbar-nav{align-items:flex-start;display:flex;flex-direction:column;gap:var(--sgds-gap-xs);height:100%;margin-bottom:0;margin-left:auto;margin-top:0}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}nav>.navbar-body slot::slotted(*){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{align-items:center;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{align-items:center;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{align-items:center;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{align-items:center;flex-direction:row}.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{align-items:center;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{align-items:center;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=start].slot-empty{display:none}slot[name=profile]{align-self:stretch;display:flex}slot[name=start]::slotted(*){color:var(--sgds-color-fixed-light)}.navbar-end.slot-empty,.slot-desktop-only{display:none}.appnav-menu-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;font-size:var(--sgds-font-size-label-sm);line-height:var(--sgds-line-height-2-xs,20px);padding:var(--sgds-padding-sm) var(--sgds-mainnav-mobile-padding-x);text-decoration:none;width:100%}.appnav-menu-item,.appnav-menu-item:hover{color:var(--sgds-color-default)}.appnav-menu-item:focus-visible{color:var(--sgds-primary-color-default);outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}`;
|
|
9
|
+
|
|
10
|
+
exports["default"] = css_248z;
|
|
11
|
+
//# sourceMappingURL=appnav.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appnav.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { css } from 'lit';
|
|
3
|
+
|
|
4
|
+
var css_248z = css`:host{display:block}nav{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;min-height:var(--sgds-mainnav-height,72px);padding:0 var(--sgds-mainnav-mobile-padding-x);width:100%}.navbar-brand{align-items:center;color:var(--sgds-color-fixed-light);display:flex;text-decoration:none;white-space:nowrap}.navbar-brand:focus-visible{outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}.navbar-nav{align-items:flex-start;display:flex;flex-direction:column;gap:var(--sgds-gap-xs);height:100%;margin-bottom:0;margin-left:auto;margin-top:0}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}nav>.navbar-body slot::slotted(*){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{align-items:center;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{align-items:center;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{align-items:center;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{align-items:center;flex-direction:row}.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{align-items:center;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{align-items:center;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=start].slot-empty{display:none}slot[name=profile]{align-self:stretch;display:flex}slot[name=start]::slotted(*){color:var(--sgds-color-fixed-light)}.navbar-end.slot-empty,.slot-desktop-only{display:none}.appnav-menu-item{align-items:center;box-sizing:border-box;cursor:pointer;display:flex;font-size:var(--sgds-font-size-label-sm);line-height:var(--sgds-line-height-2-xs,20px);padding:var(--sgds-padding-sm) var(--sgds-mainnav-mobile-padding-x);text-decoration:none;width:100%}.appnav-menu-item,.appnav-menu-item:hover{color:var(--sgds-color-default)}.appnav-menu-item:focus-visible{color:var(--sgds-primary-color-default);outline:var(--sgds-outline-focus);outline-offset:var(--sgds-outline-offset-focus)}`;
|
|
5
|
+
|
|
6
|
+
export { css_248z as default };
|
|
7
|
+
//# sourceMappingURL=appnav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appnav.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var tslib = require('tslib');
|
|
7
|
+
var context = require('@lit/context');
|
|
8
|
+
var decorators_js = require('lit/decorators.js');
|
|
9
|
+
var navProfileElement = require('../../base/nav-profile-element.cjs.js');
|
|
10
|
+
var appnavContext = require('./appnav-context.cjs.js');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @summary `SgdsAppnavProfile` is a profile component for the appnav that shows a full dropdown in desktop and handles its own mobile menu.
|
|
14
|
+
* In desktop: renders avatar + label + secondaryText with a dropdown.
|
|
15
|
+
* In mobile: renders the avatar as a toggler that opens a self-contained mobile panel with profile items.
|
|
16
|
+
* When no dropdown items are slotted, renders as a non-interactive read-only element (no caret, no pointer cursor, not focusable).
|
|
17
|
+
* When present, it disables the appnav's default hamburger toggler.
|
|
18
|
+
*
|
|
19
|
+
* @storyOrder 2
|
|
20
|
+
*
|
|
21
|
+
* @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)
|
|
22
|
+
* @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.
|
|
23
|
+
*/
|
|
24
|
+
class SgdsAppnavProfile extends navProfileElement["default"] {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
this._breakpointReached = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
tslib.__decorate([
|
|
31
|
+
context.consume({ context: appnavContext.AppnavBreakpointContext, subscribe: true }),
|
|
32
|
+
decorators_js.state()
|
|
33
|
+
], SgdsAppnavProfile.prototype, "_breakpointReached", void 0);
|
|
34
|
+
|
|
35
|
+
exports.SgdsAppnavProfile = SgdsAppnavProfile;
|
|
36
|
+
exports["default"] = SgdsAppnavProfile;
|
|
37
|
+
//# sourceMappingURL=sgds-appnav-profile.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sgds-appnav-profile.cjs.js","sources":["../../../../src/components/Appnav/sgds-appnav-profile.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { state } from \"lit/decorators.js\";\nimport NavProfileElement from \"../../base/nav-profile-element\";\nimport { AppnavBreakpointContext } from \"./appnav-context\";\n\n/**\n * @summary `SgdsAppnavProfile` is a profile component for the appnav 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 appnav's default hamburger toggler.\n *\n * @storyOrder 2\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 SgdsAppnavProfile extends NavProfileElement {\n @consume({ context: AppnavBreakpointContext, subscribe: true })\n @state()\n protected override _breakpointReached = true;\n}\n\nexport default SgdsAppnavProfile;\n"],"names":["NavProfileElement","__decorate","consume","AppnavBreakpointContext","state"],"mappings":";;;;;;;;;;;AAKA;;;;;;;;;;;AAWG;AACG,MAAO,iBAAkB,SAAQA,4BAAiB,CAAA;AAAxD,IAAA,WAAA,GAAA;;QAGqB,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;KAC9C;AAAA,CAAA;AADoBC,gBAAA,CAAA;IAFlBC,eAAO,CAAC,EAAE,OAAO,EAAEC,qCAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9D,IAAAC,mBAAK,EAAE;AACqC,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA;;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { __decorate } from 'tslib';
|
|
3
|
+
import { consume } from '@lit/context';
|
|
4
|
+
import { state } from 'lit/decorators.js';
|
|
5
|
+
import NavProfileElement from '../../base/nav-profile-element.js';
|
|
6
|
+
import { AppnavBreakpointContext } from './appnav-context.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @summary `SgdsAppnavProfile` is a profile component for the appnav that shows a full dropdown in desktop and handles its own mobile menu.
|
|
10
|
+
* In desktop: renders avatar + label + secondaryText with a dropdown.
|
|
11
|
+
* In mobile: renders the avatar as a toggler that opens a self-contained mobile panel with profile items.
|
|
12
|
+
* When no dropdown items are slotted, renders as a non-interactive read-only element (no caret, no pointer cursor, not focusable).
|
|
13
|
+
* When present, it disables the appnav's default hamburger toggler.
|
|
14
|
+
*
|
|
15
|
+
* @storyOrder 2
|
|
16
|
+
*
|
|
17
|
+
* @slot avatar - Avatar element displayed in both desktop (before label) and mobile (as toggler)
|
|
18
|
+
* @slot default - Profile menu items (sgds-dropdown-item elements). When empty, the component becomes read-only.
|
|
19
|
+
*/
|
|
20
|
+
class SgdsAppnavProfile extends NavProfileElement {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this._breakpointReached = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
__decorate([
|
|
27
|
+
consume({ context: AppnavBreakpointContext, subscribe: true }),
|
|
28
|
+
state()
|
|
29
|
+
], SgdsAppnavProfile.prototype, "_breakpointReached", void 0);
|
|
30
|
+
|
|
31
|
+
export { SgdsAppnavProfile, SgdsAppnavProfile as default };
|
|
32
|
+
//# sourceMappingURL=sgds-appnav-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sgds-appnav-profile.js","sources":["../../../../src/components/Appnav/sgds-appnav-profile.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { state } from \"lit/decorators.js\";\nimport NavProfileElement from \"../../base/nav-profile-element\";\nimport { AppnavBreakpointContext } from \"./appnav-context\";\n\n/**\n * @summary `SgdsAppnavProfile` is a profile component for the appnav 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 appnav's default hamburger toggler.\n *\n * @storyOrder 2\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 SgdsAppnavProfile extends NavProfileElement {\n @consume({ context: AppnavBreakpointContext, subscribe: true })\n @state()\n protected override _breakpointReached = true;\n}\n\nexport default SgdsAppnavProfile;\n"],"names":[],"mappings":";;;;;;;AAKA;;;;;;;;;;;AAWG;AACG,MAAO,iBAAkB,SAAQ,iBAAiB,CAAA;AAAxD,IAAA,WAAA,GAAA;;QAGqB,IAAkB,CAAA,kBAAA,GAAG,IAAI,CAAC;KAC9C;AAAA,CAAA;AADoB,UAAA,CAAA;IAFlB,OAAO,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC9D,IAAA,KAAK,EAAE;AACqC,CAAA,EAAA,iBAAA,CAAA,SAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var tslib = require('tslib');
|
|
7
|
+
var context = require('@lit/context');
|
|
8
|
+
var lit = require('lit');
|
|
9
|
+
var decorators_js = require('lit/decorators.js');
|
|
10
|
+
var classMap_js = require('lit/directives/class-map.js');
|
|
11
|
+
var navElement = require('../../base/nav-element.cjs.js');
|
|
12
|
+
var slot = require('../../utils/slot.cjs.js');
|
|
13
|
+
var appnavContext = require('./appnav-context.cjs.js');
|
|
14
|
+
var appnav = require('./appnav.cjs.js');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @summary `SgdsAppnav` is a application navigation bar for operational apps. Accepts icon-buttons and profile in a fluid layout with collapse/expand behavior.
|
|
18
|
+
*
|
|
19
|
+
* @storyOrder 1
|
|
20
|
+
*
|
|
21
|
+
* @event sgds-show - Emitted on show. Only for collapsed menu.
|
|
22
|
+
* @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.
|
|
23
|
+
* @event sgds-hide - Emitted on hide. Only for collapsed menu.
|
|
24
|
+
* @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.
|
|
25
|
+
*
|
|
26
|
+
* @slot default - Elements in this slot collapse into the mobile menu as text items. Accepts sgds-icon-button and other elements. Uses ariaLabel as menu item text.
|
|
27
|
+
* @slot start - Elements in this slot will be positioned to the left of the brand.
|
|
28
|
+
* @slot brand - Brand slot of SgdsAppnav. Pass in brand logo img here
|
|
29
|
+
* @slot profile - Profile slot. sgds-appnav-profile goes here. Positioned to the right of the toggler.
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
32
|
+
class SgdsAppnav extends navElement["default"] {
|
|
33
|
+
constructor() {
|
|
34
|
+
super(...arguments);
|
|
35
|
+
this._breakpointReached = false;
|
|
36
|
+
this._expanded = false;
|
|
37
|
+
/** Sets the visual tone of the navigation bar */
|
|
38
|
+
this.tone = "brand";
|
|
39
|
+
/** Used only for SSR to indicate the presence of the `start` slot. */
|
|
40
|
+
this.hasStartSlot = false;
|
|
41
|
+
this.hasSlotController = new slot.HasSlotController(this, "start");
|
|
42
|
+
/** @internal Whether the default slot has assigned elements */
|
|
43
|
+
this._hasDefaultSlotItems = false;
|
|
44
|
+
/** @internal Whether the profile slot has assigned elements */
|
|
45
|
+
this._hasProfileSlotItems = false;
|
|
46
|
+
/** @internal Stored default slot items for mobile menu rendering */
|
|
47
|
+
this._defaultSlotItems = [];
|
|
48
|
+
}
|
|
49
|
+
updated() {
|
|
50
|
+
if (!this.hasStartSlot)
|
|
51
|
+
this.hasStartSlot = this.hasSlotController.test("start");
|
|
52
|
+
this._expanded = this.expanded;
|
|
53
|
+
}
|
|
54
|
+
_onBreakpointReached(reached) {
|
|
55
|
+
this._breakpointReached = reached;
|
|
56
|
+
}
|
|
57
|
+
_isBreakpointReached() {
|
|
58
|
+
return this._breakpointReached;
|
|
59
|
+
}
|
|
60
|
+
_handleTogglerKeydown(e) {
|
|
61
|
+
var _a;
|
|
62
|
+
if (e.key === "Tab" && !e.shiftKey && this.expanded) {
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
const firstItem = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(".appnav-menu-item");
|
|
65
|
+
firstItem === null || firstItem === void 0 ? void 0 : firstItem.focus();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
_handleDefaultSlotChange(e) {
|
|
69
|
+
const childElements = e.target.assignedElements({ flatten: true });
|
|
70
|
+
this._hasDefaultSlotItems = childElements.length > 0;
|
|
71
|
+
this._defaultSlotItems = childElements
|
|
72
|
+
.filter(el => typeof el.tagName !== "undefined")
|
|
73
|
+
.map(el => {
|
|
74
|
+
var _a;
|
|
75
|
+
return ({
|
|
76
|
+
label: el.getAttribute("ariaLabel") || el.getAttribute("aria-label") || ((_a = el.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || "",
|
|
77
|
+
element: el
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
childElements.forEach(el => {
|
|
81
|
+
el.setAttribute("expand", this.expand);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
_handleMobileItemClick(item) {
|
|
85
|
+
item.element.click();
|
|
86
|
+
this.hide();
|
|
87
|
+
}
|
|
88
|
+
_renderAppnavToggler() {
|
|
89
|
+
return lit.html `<sgds-icon-button
|
|
90
|
+
name="three-dots-vertical"
|
|
91
|
+
variant="ghost"
|
|
92
|
+
size="sm"
|
|
93
|
+
tone="fixed-light"
|
|
94
|
+
class="navbar-toggler"
|
|
95
|
+
@click=${this._handleSummaryClick}
|
|
96
|
+
@keydown=${this._handleTogglerKeydown}
|
|
97
|
+
aria-controls="${this.collapseId}"
|
|
98
|
+
aria-expanded="${this.expanded}"
|
|
99
|
+
.ariaLabel=${"Toggle navigation"}
|
|
100
|
+
></sgds-icon-button>`;
|
|
101
|
+
}
|
|
102
|
+
_handleProfileSlotChange(e) {
|
|
103
|
+
const childElements = e.target.assignedElements({ flatten: true });
|
|
104
|
+
this._hasProfileSlotItems = childElements.length > 0;
|
|
105
|
+
childElements.forEach(el => {
|
|
106
|
+
el.setAttribute("expand", this.expand);
|
|
107
|
+
el.setAttribute("tone", this.tone);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
render() {
|
|
111
|
+
this.breakpointReached =
|
|
112
|
+
window.innerWidth <
|
|
113
|
+
(this.expand === "always"
|
|
114
|
+
? -1
|
|
115
|
+
: this.expand === "never"
|
|
116
|
+
? Infinity
|
|
117
|
+
: { sm: 512, md: 768, lg: 1024, xl: 1280, xxl: 1440 }[this.expand]);
|
|
118
|
+
return lit.html `
|
|
119
|
+
<nav>
|
|
120
|
+
<div class="navbar ${this._expandClass()}">
|
|
121
|
+
<slot name="start" class=${classMap_js.classMap({ "slot-empty": !this.hasStartSlot })}></slot>
|
|
122
|
+
<a class="navbar-brand" href=${this.brandHref} aria-label="brand-link">
|
|
123
|
+
<slot name="brand"></slot>
|
|
124
|
+
</a>
|
|
125
|
+
<div class="navbar-body navbar-collapse" id=${this.collapseId}>
|
|
126
|
+
<div class="navbar-nav navbar-nav-scroll">
|
|
127
|
+
<slot
|
|
128
|
+
class=${classMap_js.classMap({ "slot-desktop-only": this.breakpointReached })}
|
|
129
|
+
@slotchange=${this._handleDefaultSlotChange}
|
|
130
|
+
></slot>
|
|
131
|
+
${this.breakpointReached
|
|
132
|
+
? this._defaultSlotItems.map(item => lit.html `<a
|
|
133
|
+
class="appnav-menu-item"
|
|
134
|
+
role="button"
|
|
135
|
+
tabindex="0"
|
|
136
|
+
@click=${() => this._handleMobileItemClick(item)}
|
|
137
|
+
@keydown=${(e) => {
|
|
138
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
this._handleMobileItemClick(item);
|
|
141
|
+
}
|
|
142
|
+
}}
|
|
143
|
+
>${item.label}</a
|
|
144
|
+
>`)
|
|
145
|
+
: lit.nothing}
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
<div
|
|
149
|
+
class="navbar-end ${this._hasProfileSlotItems || (this._hasDefaultSlotItems && this.breakpointReached)
|
|
150
|
+
? ""
|
|
151
|
+
: "slot-empty"}"
|
|
152
|
+
>
|
|
153
|
+
${this._hasDefaultSlotItems && this.breakpointReached ? this._renderAppnavToggler() : lit.nothing}
|
|
154
|
+
<slot name="profile" @slotchange=${this._handleProfileSlotChange}></slot>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</nav>
|
|
158
|
+
`;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
SgdsAppnav.styles = [...navElement["default"].styles, appnav["default"]];
|
|
162
|
+
tslib.__decorate([
|
|
163
|
+
context.provide({ context: appnavContext.AppnavBreakpointContext }),
|
|
164
|
+
decorators_js.state()
|
|
165
|
+
], SgdsAppnav.prototype, "_breakpointReached", void 0);
|
|
166
|
+
tslib.__decorate([
|
|
167
|
+
context.provide({ context: appnavContext.AppnavExpandedContext }),
|
|
168
|
+
decorators_js.state()
|
|
169
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
170
|
+
], SgdsAppnav.prototype, "_expanded", void 0);
|
|
171
|
+
tslib.__decorate([
|
|
172
|
+
decorators_js.property({ type: String, reflect: true })
|
|
173
|
+
], SgdsAppnav.prototype, "tone", void 0);
|
|
174
|
+
tslib.__decorate([
|
|
175
|
+
decorators_js.property({ type: Boolean })
|
|
176
|
+
], SgdsAppnav.prototype, "hasStartSlot", void 0);
|
|
177
|
+
tslib.__decorate([
|
|
178
|
+
decorators_js.state()
|
|
179
|
+
], SgdsAppnav.prototype, "_hasDefaultSlotItems", void 0);
|
|
180
|
+
tslib.__decorate([
|
|
181
|
+
decorators_js.state()
|
|
182
|
+
], SgdsAppnav.prototype, "_hasProfileSlotItems", void 0);
|
|
183
|
+
tslib.__decorate([
|
|
184
|
+
decorators_js.state()
|
|
185
|
+
], SgdsAppnav.prototype, "_defaultSlotItems", void 0);
|
|
186
|
+
|
|
187
|
+
exports.SgdsAppnav = SgdsAppnav;
|
|
188
|
+
exports["default"] = SgdsAppnav;
|
|
189
|
+
//# sourceMappingURL=sgds-appnav.cjs.js.map
|