@govtechsg/sgds-web-component 3.1.2 → 3.2.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/button.js +1 -1
- package/base/card.js +1 -1
- package/components/Button/index.umd.js +1 -1
- package/components/Card/index.umd.js +53 -12
- package/components/Card/index.umd.js.map +1 -1
- package/components/Card/sgds-card.js +5 -3
- package/components/Card/sgds-card.js.map +1 -1
- package/components/Datepicker/index.umd.js +1 -1
- package/components/FileUpload/index.umd.js +1 -1
- package/components/IconButton/index.umd.js +1 -1
- package/components/Mainnav/index.umd.js +5 -5
- package/components/Mainnav/index.umd.js.map +1 -1
- package/components/Mainnav/sgds-mainnav-item.d.ts +1 -1
- package/components/Mainnav/sgds-mainnav-item.js +2 -2
- package/components/Mainnav/sgds-mainnav-item.js.map +1 -1
- package/components/Modal/index.umd.js +1 -1
- package/components/Modal/index.umd.js.map +1 -1
- package/components/Pagination/index.umd.js +1 -1
- package/components/QuantityToggle/index.umd.js +1 -1
- package/components/Subnav/index.umd.js +69 -97
- package/components/Subnav/index.umd.js.map +1 -1
- package/components/Subnav/sgds-subnav-item.d.ts +1 -1
- package/components/Subnav/sgds-subnav-item.js +2 -2
- package/components/Subnav/sgds-subnav-item.js.map +1 -1
- package/components/Subnav/sgds-subnav.d.ts +4 -3
- package/components/Subnav/sgds-subnav.js +66 -95
- package/components/Subnav/sgds-subnav.js.map +1 -1
- package/components/Subnav/subnav-item.js +1 -1
- package/components/Subnav/subnav.js +1 -1
- package/components/Table/index.d.ts +7 -1
- package/components/Table/index.js +6 -0
- package/components/Table/index.js.map +1 -1
- package/components/Table/index.umd.js +182 -16
- package/components/Table/index.umd.js.map +1 -1
- package/components/Table/sgds-table-cell.d.ts +13 -0
- package/components/Table/sgds-table-cell.js +22 -0
- package/components/Table/sgds-table-cell.js.map +1 -0
- package/components/Table/sgds-table-head.d.ts +18 -0
- package/components/Table/sgds-table-head.js +43 -0
- package/components/Table/sgds-table-head.js.map +1 -0
- package/components/Table/sgds-table-row.d.ts +13 -0
- package/components/Table/sgds-table-row.js +22 -0
- package/components/Table/sgds-table-row.js.map +1 -0
- package/components/Table/sgds-table.d.ts +5 -2
- package/components/Table/sgds-table.js +18 -13
- package/components/Table/sgds-table.js.map +1 -1
- package/components/Table/table-cell.js +6 -0
- package/components/Table/table-cell.js.map +1 -0
- package/components/Table/table-head.js +6 -0
- package/components/Table/table-head.js.map +1 -0
- package/components/Table/table-row.js +6 -0
- package/components/Table/table-row.js.map +1 -0
- package/components/Table/table.js +1 -1
- package/components/Toast/index.umd.js +1 -1
- package/components/Toast/toast.js +1 -1
- package/components/index.umd.js +95 -119
- package/components/index.umd.js.map +1 -1
- package/index.umd.js +297 -246
- package/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/react/base/button.cjs.js +1 -1
- package/react/base/button.js +1 -1
- package/react/base/card.cjs.js +1 -1
- package/react/base/card.js +1 -1
- package/react/components/Card/sgds-card.cjs.js +5 -3
- package/react/components/Card/sgds-card.cjs.js.map +1 -1
- package/react/components/Card/sgds-card.js +5 -3
- package/react/components/Card/sgds-card.js.map +1 -1
- package/react/components/Mainnav/sgds-mainnav-item.cjs.js +2 -2
- package/react/components/Mainnav/sgds-mainnav-item.cjs.js.map +1 -1
- package/react/components/Mainnav/sgds-mainnav-item.js +2 -2
- package/react/components/Mainnav/sgds-mainnav-item.js.map +1 -1
- package/react/components/Subnav/sgds-subnav-item.cjs.js +2 -2
- package/react/components/Subnav/sgds-subnav-item.cjs.js.map +1 -1
- package/react/components/Subnav/sgds-subnav-item.js +2 -2
- package/react/components/Subnav/sgds-subnav-item.js.map +1 -1
- package/react/components/Subnav/sgds-subnav.cjs.js +64 -93
- package/react/components/Subnav/sgds-subnav.cjs.js.map +1 -1
- package/react/components/Subnav/sgds-subnav.js +66 -95
- package/react/components/Subnav/sgds-subnav.js.map +1 -1
- package/react/components/Subnav/subnav-item.cjs.js +1 -1
- package/react/components/Subnav/subnav-item.js +1 -1
- package/react/components/Subnav/subnav.cjs.js +1 -1
- package/react/components/Subnav/subnav.js +1 -1
- package/react/components/Table/sgds-table-cell.cjs.js +28 -0
- package/react/components/Table/sgds-table-cell.cjs.js.map +1 -0
- package/react/components/Table/sgds-table-cell.js +23 -0
- package/react/components/Table/sgds-table-cell.js.map +1 -0
- package/react/components/Table/sgds-table-head.cjs.js +49 -0
- package/react/components/Table/sgds-table-head.cjs.js.map +1 -0
- package/react/components/Table/sgds-table-head.js +44 -0
- package/react/components/Table/sgds-table-head.js.map +1 -0
- package/react/components/Table/sgds-table-row.cjs.js +28 -0
- package/react/components/Table/sgds-table-row.cjs.js.map +1 -0
- package/react/components/Table/sgds-table-row.js +23 -0
- package/react/components/Table/sgds-table-row.js.map +1 -0
- package/react/components/Table/sgds-table.cjs.js +17 -12
- package/react/components/Table/sgds-table.cjs.js.map +1 -1
- package/react/components/Table/sgds-table.js +18 -13
- package/react/components/Table/sgds-table.js.map +1 -1
- package/react/components/Table/table-cell.cjs.js +11 -0
- package/react/components/Table/table-cell.cjs.js.map +1 -0
- package/react/components/Table/table-cell.js +7 -0
- package/react/components/Table/table-cell.js.map +1 -0
- package/react/components/Table/table-head.cjs.js +11 -0
- package/react/components/Table/table-head.cjs.js.map +1 -0
- package/react/components/Table/table-head.js +7 -0
- package/react/components/Table/table-head.js.map +1 -0
- package/react/components/Table/table-row.cjs.js +11 -0
- package/react/components/Table/table-row.cjs.js.map +1 -0
- package/react/components/Table/table-row.js +7 -0
- package/react/components/Table/table-row.js.map +1 -0
- package/react/components/Table/table.cjs.js +1 -1
- package/react/components/Table/table.js +1 -1
- package/react/components/Toast/toast.cjs.js +1 -1
- package/react/components/Toast/toast.js +1 -1
- package/react/index.cjs.js +26 -20
- package/react/index.cjs.js.map +1 -1
- package/react/index.d.ts +4 -1
- package/react/index.js +4 -1
- package/react/index.js.map +1 -1
- package/react/table-cell/index.cjs.js +40 -0
- package/react/table-cell/index.cjs.js.map +1 -0
- package/react/table-cell/index.d.ts +2 -0
- package/react/table-cell/index.js +16 -0
- package/react/table-cell/index.js.map +1 -0
- package/react/table-head/index.cjs.js +40 -0
- package/react/table-head/index.cjs.js.map +1 -0
- package/react/table-head/index.d.ts +2 -0
- package/react/table-head/index.js +16 -0
- package/react/table-head/index.js.map +1 -0
- package/react/table-row/index.cjs.js +40 -0
- package/react/table-row/index.cjs.js.map +1 -0
- package/react/table-row/index.d.ts +2 -0
- package/react/table-row/index.js +16 -0
- package/react/table-row/index.js.map +1 -0
- package/react/utils/breakpoints.cjs.js +2 -2
- package/react/utils/breakpoints.cjs.js.map +1 -1
- package/react/utils/breakpoints.js +2 -2
- package/react/utils/breakpoints.js.map +1 -1
- package/utils/breakpoints.d.ts +3 -3
- package/utils/breakpoints.js +2 -2
- package/utils/breakpoints.js.map +1 -1
|
@@ -17,6 +17,7 @@ var sgdsIcon = require('../Icon/sgds-icon.cjs.js');
|
|
|
17
17
|
var subnav = require('./subnav.cjs.js');
|
|
18
18
|
var grid = require('../../css/grid.cjs.js');
|
|
19
19
|
|
|
20
|
+
const VALID_KEYS = ["Enter", " "];
|
|
20
21
|
/**
|
|
21
22
|
* @summary This component provides secondary navigation within a specific section or page. It typically appears below the main navigation and offers context-specific links or actions to help users explore related content.
|
|
22
23
|
*
|
|
@@ -33,40 +34,34 @@ var grid = require('../../css/grid.cjs.js');
|
|
|
33
34
|
class SgdsSubnav extends sgdsElement["default"] {
|
|
34
35
|
constructor() {
|
|
35
36
|
super(...arguments);
|
|
36
|
-
this.isCollapsed =
|
|
37
|
+
this.isCollapsed = false;
|
|
37
38
|
this.isMenuOpen = false;
|
|
38
|
-
this._handleResize = () => {
|
|
39
|
+
this._handleResize = async () => {
|
|
39
40
|
this.isCollapsed = window.innerWidth < breakpoints.LG_BREAKPOINT;
|
|
41
|
+
await this.updateComplete;
|
|
40
42
|
if (!this.isCollapsed) {
|
|
41
43
|
this.isMenuOpen = false;
|
|
42
44
|
}
|
|
43
45
|
this._updateMobileLayout();
|
|
44
46
|
};
|
|
45
47
|
this._updateMobileLayout = () => {
|
|
46
|
-
|
|
47
|
-
if (!this.nav || !this.subnav || !this.mobileActions || !this.mobileNav)
|
|
48
|
+
if (!this.nav || !this.headerContainer || !this.mobileActions || !this.mobileNav)
|
|
48
49
|
return;
|
|
49
|
-
const actionsSlot = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot[name="actions"]');
|
|
50
50
|
if (this.isCollapsed) {
|
|
51
|
-
const subnavHeight = this.nav.clientHeight;
|
|
52
51
|
const { top: subnavTop } = this.nav.getBoundingClientRect();
|
|
53
|
-
const headerHeight = this.
|
|
52
|
+
const headerHeight = this.headerContainer.clientHeight;
|
|
54
53
|
const actionsButtonHeight = this.mobileActions.clientHeight;
|
|
55
|
-
const offset =
|
|
54
|
+
const offset = window.innerWidth >= breakpoints.MD_BREAKPOINT && window.innerWidth < breakpoints.LG_BREAKPOINT
|
|
55
|
+
? subnavTop + headerHeight
|
|
56
|
+
: subnavTop + headerHeight + actionsButtonHeight;
|
|
56
57
|
this.mobileNav.style.maxHeight = `calc(100dvh - ${offset}px)`;
|
|
57
|
-
this.style.minHeight = `${
|
|
58
|
-
|
|
59
|
-
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
60
|
-
buttons.forEach(el => el.setAttribute("fullWidth", "true"));
|
|
61
|
-
}
|
|
58
|
+
this.style.minHeight = `${this.nav.clientHeight}px`;
|
|
59
|
+
this.nav.style.position = "absolute";
|
|
62
60
|
}
|
|
63
61
|
else {
|
|
64
62
|
this.mobileNav.style.maxHeight = "none";
|
|
65
63
|
this.style.minHeight = "auto";
|
|
66
|
-
|
|
67
|
-
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
68
|
-
buttons.forEach(el => el.removeAttribute("isCollapsed"));
|
|
69
|
-
}
|
|
64
|
+
this.nav.style.position = "relative";
|
|
70
65
|
}
|
|
71
66
|
};
|
|
72
67
|
this._toggleMenu = () => {
|
|
@@ -83,38 +78,29 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
83
78
|
}
|
|
84
79
|
connectedCallback() {
|
|
85
80
|
super.connectedCallback();
|
|
86
|
-
this._handleResize();
|
|
81
|
+
// this._handleResize();
|
|
87
82
|
window.addEventListener("resize", this._handleResize);
|
|
88
|
-
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
83
|
+
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.navGroup));
|
|
89
84
|
}
|
|
90
85
|
disconnectedCallback() {
|
|
91
86
|
super.disconnectedCallback();
|
|
92
87
|
window.removeEventListener("resize", this._handleResize);
|
|
93
|
-
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
88
|
+
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.navGroup));
|
|
94
89
|
}
|
|
95
90
|
firstUpdated() {
|
|
96
|
-
|
|
97
|
-
this._updateMobileLayout();
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
_handleSlotChange(e) {
|
|
101
|
-
const childElements = e.target.assignedElements({ flatten: true });
|
|
102
|
-
if (this.isCollapsed) {
|
|
103
|
-
childElements.forEach(element => {
|
|
104
|
-
element.setAttribute("isCollapsed", `${this.isCollapsed}`);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
childElements.forEach(element => {
|
|
109
|
-
element.removeAttribute("isCollapsed");
|
|
110
|
-
});
|
|
111
|
-
}
|
|
91
|
+
this._handleResize();
|
|
112
92
|
}
|
|
113
93
|
_handleClickOutOfElement(e, self) {
|
|
114
94
|
if (!e.composedPath().includes(self) && !e.composedPath().includes(this.toggler)) {
|
|
115
95
|
this.hide();
|
|
116
96
|
}
|
|
117
97
|
}
|
|
98
|
+
async _onKeyboardToggle(event) {
|
|
99
|
+
if (!VALID_KEYS.includes(event.key))
|
|
100
|
+
return;
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
this._toggleMenu();
|
|
103
|
+
}
|
|
118
104
|
/** Shows the menu. For when subnav is in the collapsed form */
|
|
119
105
|
async show() {
|
|
120
106
|
if (this.isMenuOpen) {
|
|
@@ -139,10 +125,11 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
139
125
|
return;
|
|
140
126
|
}
|
|
141
127
|
await animate.stopAnimations(this.mobileNav);
|
|
142
|
-
this.
|
|
128
|
+
if (this.isCollapsed) {
|
|
129
|
+
this.mobileNav.style.display = "flex";
|
|
130
|
+
}
|
|
143
131
|
const { keyframes, options } = animationRegistry.getAnimation(this, "subnav.show");
|
|
144
132
|
await animate.animateTo(this.mobileNav, animate.shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
145
|
-
// this.mobileNav.style.height = "auto";
|
|
146
133
|
this.emit("sgds-after-show");
|
|
147
134
|
}
|
|
148
135
|
async _animateToHide() {
|
|
@@ -154,8 +141,9 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
154
141
|
await animate.stopAnimations(this.mobileNav);
|
|
155
142
|
const { keyframes, options } = animationRegistry.getAnimation(this, "subnav.hide");
|
|
156
143
|
await animate.animateTo(this.mobileNav, animate.shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
157
|
-
this.
|
|
158
|
-
|
|
144
|
+
if (this.isCollapsed) {
|
|
145
|
+
this.mobileNav.style.display = "none";
|
|
146
|
+
}
|
|
159
147
|
this.emit("sgds-after-hide");
|
|
160
148
|
}
|
|
161
149
|
async handleOpenChange() {
|
|
@@ -168,61 +156,41 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
168
156
|
this._animateToHide();
|
|
169
157
|
}
|
|
170
158
|
}
|
|
159
|
+
async handleCollapsedChange() {
|
|
160
|
+
await this.updateComplete;
|
|
161
|
+
this.mobileNav.style.display = this.isCollapsed ? "none" : "flex";
|
|
162
|
+
}
|
|
171
163
|
render() {
|
|
172
|
-
const isHydrated = this.hasUpdated;
|
|
173
164
|
return lit.html `
|
|
174
|
-
<nav
|
|
175
|
-
class=${classMap_js.classMap({
|
|
176
|
-
mobile: this.isCollapsed
|
|
177
|
-
})}
|
|
178
|
-
aria-label="Sub navigation"
|
|
179
|
-
>
|
|
165
|
+
<nav aria-label="Sub navigation">
|
|
180
166
|
<div
|
|
181
167
|
class=${classMap_js.classMap({
|
|
182
|
-
"sgds-container":
|
|
168
|
+
"sgds-container": true,
|
|
183
169
|
subnav: true,
|
|
184
|
-
mobile: this.isCollapsed,
|
|
185
170
|
collapsed: !this.isMenuOpen
|
|
186
171
|
})}
|
|
187
172
|
>
|
|
188
|
-
<
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
173
|
+
<div class="header-container">
|
|
174
|
+
<slot name="header"></slot>
|
|
175
|
+
<sgds-icon
|
|
176
|
+
class="subnav-toggler"
|
|
177
|
+
name="chevron-down"
|
|
178
|
+
tabindex="0"
|
|
179
|
+
@click=${this._toggleMenu}
|
|
180
|
+
@keydown=${this._onKeyboardToggle}
|
|
181
|
+
aria-label="Toggle sub navigation"
|
|
182
|
+
aria-expanded=${this.isMenuOpen}
|
|
183
|
+
></sgds-icon>
|
|
184
|
+
</div>
|
|
185
|
+
<div class="subnav-nav-group">
|
|
186
|
+
<div class="subnav-nav">
|
|
187
|
+
<slot></slot>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="subnav-actions">
|
|
190
|
+
<slot name="actions"></slot>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
208
193
|
</div>
|
|
209
|
-
${this.isCollapsed
|
|
210
|
-
? lit.html `
|
|
211
|
-
<div class="subnav-dropdown">
|
|
212
|
-
<div
|
|
213
|
-
class=${classMap_js.classMap({
|
|
214
|
-
"subnav-nav-mobile": true,
|
|
215
|
-
hidden: !this.isMenuOpen && !isHydrated
|
|
216
|
-
})}
|
|
217
|
-
>
|
|
218
|
-
<slot @slotchange="${this._handleSlotChange}"></slot>
|
|
219
|
-
</div>
|
|
220
|
-
<div class="subnav-actions-mobile">
|
|
221
|
-
<slot name="actions"></slot>
|
|
222
|
-
</div>
|
|
223
|
-
</div>
|
|
224
|
-
`
|
|
225
|
-
: lit.nothing}
|
|
226
194
|
</nav>
|
|
227
195
|
`;
|
|
228
196
|
}
|
|
@@ -236,19 +204,19 @@ tslib.__decorate([
|
|
|
236
204
|
decorators_js.query("nav")
|
|
237
205
|
], SgdsSubnav.prototype, "nav", void 0);
|
|
238
206
|
tslib.__decorate([
|
|
239
|
-
decorators_js.query(".subnav")
|
|
240
|
-
], SgdsSubnav.prototype, "subnav", void 0);
|
|
241
|
-
tslib.__decorate([
|
|
242
|
-
decorators_js.query(".subnav-nav-mobile")
|
|
207
|
+
decorators_js.query(".subnav-nav")
|
|
243
208
|
], SgdsSubnav.prototype, "mobileNav", void 0);
|
|
209
|
+
tslib.__decorate([
|
|
210
|
+
decorators_js.query(".header-container")
|
|
211
|
+
], SgdsSubnav.prototype, "headerContainer", void 0);
|
|
244
212
|
tslib.__decorate([
|
|
245
213
|
decorators_js.query(".subnav-toggler")
|
|
246
214
|
], SgdsSubnav.prototype, "toggler", void 0);
|
|
247
215
|
tslib.__decorate([
|
|
248
|
-
decorators_js.query(".subnav-
|
|
249
|
-
], SgdsSubnav.prototype, "
|
|
216
|
+
decorators_js.query(".subnav-nav-group")
|
|
217
|
+
], SgdsSubnav.prototype, "navGroup", void 0);
|
|
250
218
|
tslib.__decorate([
|
|
251
|
-
decorators_js.query(".subnav-actions
|
|
219
|
+
decorators_js.query(".subnav-actions")
|
|
252
220
|
], SgdsSubnav.prototype, "mobileActions", void 0);
|
|
253
221
|
tslib.__decorate([
|
|
254
222
|
decorators_js.state()
|
|
@@ -259,6 +227,9 @@ tslib.__decorate([
|
|
|
259
227
|
tslib.__decorate([
|
|
260
228
|
watch.watch("isMenuOpen", { waitUntilFirstUpdate: true })
|
|
261
229
|
], SgdsSubnav.prototype, "handleOpenChange", null);
|
|
230
|
+
tslib.__decorate([
|
|
231
|
+
watch.watch("isCollapsed", { waitUntilFirstUpdate: true })
|
|
232
|
+
], SgdsSubnav.prototype, "handleCollapsedChange", null);
|
|
262
233
|
animationRegistry.setDefaultAnimation("subnav.show", {
|
|
263
234
|
keyframes: [
|
|
264
235
|
{ height: "0", opacity: "0" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sgds-subnav.cjs.js","sources":["../../../../src/components/Subnav/sgds-subnav.ts"],"sourcesContent":["import SgdsElement from \"../../base/sgds-element\";\nimport { html, nothing } from \"lit\";\nimport { query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { watch } from \"../../utils/watch\";\nimport { waitForEvent } from \"../../utils/event\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { LG_BREAKPOINT } from \"../../utils/breakpoints\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport subnavStyle from \"./subnav.css\";\nimport gridStyle from \"../../css/grid.css\";\n\n/**\n * @summary This component provides secondary navigation within a specific section or page. It typically appears below the main navigation and offers context-specific links or actions to help users explore related content.\n *\n * @event sgds-show - Emitted on show. Only for collapsed menu.\n * @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.\n * @event sgds-hide - Emitted on hide. Only for collapsed menu.\n * @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.\n *\n * @slot default - Default slot of SgdsSubnav. Pass in SgdsSubnavItem elements here.\n * @slot header - Slot for rendering the sub-navigation header or section title.\n * @slot actions - Slot for inserting contextual action elements such as buttons, filters, or other controls aligned with the sub-navigation.\n *\n */\n\nexport class SgdsSubnav extends SgdsElement {\n static styles = [...SgdsElement.styles, subnavStyle, gridStyle];\n /** @internal */\n static dependencies = {\n \"sgds-icon\": SgdsIcon\n };\n\n @query(\"nav\")\n private nav: HTMLElement;\n\n @query(\".subnav\")\n private subnav: HTMLElement;\n\n @query(\".subnav-nav-mobile\")\n private mobileNav: HTMLElement;\n\n @query(\".subnav-toggler\")\n private toggler: HTMLElement;\n\n @query(\".subnav-dropdown\")\n private body: HTMLElement;\n\n @query(\".subnav-actions-mobile\")\n private mobileActions: HTMLElement;\n\n @state()\n private isCollapsed = window.innerWidth < LG_BREAKPOINT;\n\n @state()\n private isMenuOpen = false;\n\n connectedCallback() {\n super.connectedCallback();\n this._handleResize();\n window.addEventListener(\"resize\", this._handleResize);\n window.addEventListener(\"click\", (event: MouseEvent) => this._handleClickOutOfElement(event, this.body));\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener(\"resize\", this._handleResize);\n window.removeEventListener(\"click\", (event: MouseEvent) => this._handleClickOutOfElement(event, this.body));\n }\n\n firstUpdated() {\n requestAnimationFrame(() => {\n this._updateMobileLayout();\n });\n }\n\n private _handleResize = () => {\n this.isCollapsed = window.innerWidth < LG_BREAKPOINT;\n\n if (!this.isCollapsed) {\n this.isMenuOpen = false;\n }\n\n this._updateMobileLayout();\n };\n\n private _updateMobileLayout = () => {\n if (!this.nav || !this.subnav || !this.mobileActions || !this.mobileNav) return;\n\n const actionsSlot = this.shadowRoot?.querySelector('slot[name=\"actions\"]') as HTMLSlotElement;\n\n if (this.isCollapsed) {\n const subnavHeight = this.nav.clientHeight;\n const { top: subnavTop } = this.nav.getBoundingClientRect();\n const headerHeight = this.subnav.clientHeight;\n const actionsButtonHeight = this.mobileActions.clientHeight;\n const offset = subnavTop + headerHeight + actionsButtonHeight;\n this.mobileNav.style.maxHeight = `calc(100dvh - ${offset}px)`;\n this.style.minHeight = `${subnavHeight}px`;\n\n if (actionsSlot) {\n const buttons = actionsSlot.assignedElements({ flatten: true });\n buttons.forEach(el => el.setAttribute(\"fullWidth\", \"true\"));\n }\n } else {\n this.mobileNav.style.maxHeight = \"none\";\n this.style.minHeight = \"auto\";\n\n if (actionsSlot) {\n const buttons = actionsSlot.assignedElements({ flatten: true });\n buttons.forEach(el => el.removeAttribute(\"isCollapsed\"));\n }\n }\n };\n\n private _handleSlotChange(e: Event) {\n const childElements = (e.target as HTMLSlotElement).assignedElements({ flatten: true });\n\n if (this.isCollapsed) {\n childElements.forEach(element => {\n element.setAttribute(\"isCollapsed\", `${this.isCollapsed}`);\n });\n } else {\n childElements.forEach(element => {\n element.removeAttribute(\"isCollapsed\");\n });\n }\n }\n\n private _handleClickOutOfElement(e: MouseEvent, self: HTMLElement) {\n if (!e.composedPath().includes(self) && !e.composedPath().includes(this.toggler)) {\n this.hide();\n }\n }\n\n private _toggleMenu = () => {\n if (this.isMenuOpen) {\n this.hide();\n } else {\n document.querySelector(\"body\").style.overflow = \"hidden\";\n this.show();\n }\n\n this.toggler?.focus();\n };\n\n /** Shows the menu. For when subnav is in the collapsed form */\n public async show() {\n if (this.isMenuOpen) {\n return;\n }\n\n this.isMenuOpen = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hide the menu. For when subnav is in the collapsed form */\n public async hide() {\n if (!this.isMenuOpen) {\n return;\n }\n\n this.isMenuOpen = false;\n document.querySelector(\"body\").style.removeProperty(\"overflow\");\n\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n private async _animateToShow() {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.isMenuOpen = false;\n return;\n }\n\n await stopAnimations(this.mobileNav);\n this.mobileNav.classList.remove(\"hidden\");\n\n const { keyframes, options } = getAnimation(this, \"subnav.show\");\n await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);\n // this.mobileNav.style.height = \"auto\";\n\n this.emit(\"sgds-after-show\");\n }\n\n private async _animateToHide() {\n const slHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (slHide.defaultPrevented) {\n this.isMenuOpen = true;\n return;\n }\n\n await stopAnimations(this.mobileNav);\n\n const { keyframes, options } = getAnimation(this, \"subnav.hide\");\n await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);\n this.mobileNav.classList.add(\"hidden\");\n // this.mobileNav.style.height = \"auto\";\n\n this.emit(\"sgds-after-hide\");\n }\n\n @watch(\"isMenuOpen\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.isMenuOpen) {\n // Show\n this._animateToShow();\n } else {\n // Hide\n this._animateToHide();\n }\n }\n\n render() {\n const isHydrated = this.hasUpdated;\n\n return html`\n <nav\n class=${classMap({\n mobile: this.isCollapsed\n })}\n aria-label=\"Sub navigation\"\n >\n <div\n class=${classMap({\n \"sgds-container\": !this.isCollapsed,\n subnav: true,\n mobile: this.isCollapsed,\n collapsed: !this.isMenuOpen\n })}\n >\n <slot name=\"header\"></slot>\n ${this.isCollapsed\n ? html`\n <sgds-icon\n class=\"subnav-toggler\"\n name=\"chevron-down\"\n @click=${this._toggleMenu}\n aria-label=\"Toggle sub navigation\"\n ></sgds-icon>\n `\n : html`\n <div class=\"subnav-nav-group\">\n <div class=\"subnav-nav\">\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n <div class=\"subnav-actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n `}\n </div>\n ${this.isCollapsed\n ? html`\n <div class=\"subnav-dropdown\">\n <div\n class=${classMap({\n \"subnav-nav-mobile\": true,\n hidden: !this.isMenuOpen && !isHydrated\n })}\n >\n <slot @slotchange=\"${this._handleSlotChange}\"></slot>\n </div>\n <div class=\"subnav-actions-mobile\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n `\n : nothing}\n </nav>\n `;\n }\n}\n\nsetDefaultAnimation(\"subnav.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"subnav.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n\nexport default SgdsSubnav;\n"],"names":["SgdsElement","LG_BREAKPOINT","waitForEvent","stopAnimations","getAnimation","animateTo","shimKeyframesHeightAuto","html","classMap","nothing","subnavStyle","gridStyle","SgdsIcon","__decorate","query","state","watch","setDefaultAnimation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sgds-subnav.cjs.js","sources":["../../../../src/components/Subnav/sgds-subnav.ts"],"sourcesContent":["import SgdsElement from \"../../base/sgds-element\";\nimport { html } from \"lit\";\nimport { query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { watch } from \"../../utils/watch\";\nimport { waitForEvent } from \"../../utils/event\";\nimport { animateTo, shimKeyframesHeightAuto, stopAnimations } from \"../../utils/animate\";\nimport { getAnimation, setDefaultAnimation } from \"../../utils/animation-registry\";\nimport { LG_BREAKPOINT, MD_BREAKPOINT } from \"../../utils/breakpoints\";\nimport SgdsIcon from \"../Icon/sgds-icon\";\nimport subnavStyle from \"./subnav.css\";\nimport gridStyle from \"../../css/grid.css\";\n\nconst VALID_KEYS = [\"Enter\", \" \"];\n\n/**\n * @summary This component provides secondary navigation within a specific section or page. It typically appears below the main navigation and offers context-specific links or actions to help users explore related content.\n *\n * @event sgds-show - Emitted on show. Only for collapsed menu.\n * @event sgds-after-show - Emitted on show after animation has completed. Only for collapsed menu.\n * @event sgds-hide - Emitted on hide. Only for collapsed menu.\n * @event sgds-after-hide - Emitted on hide after animation has completed. Only for collapsed menu.\n *\n * @slot default - Default slot of SgdsSubnav. Pass in SgdsSubnavItem elements here.\n * @slot header - Slot for rendering the sub-navigation header or section title.\n * @slot actions - Slot for inserting contextual action elements such as buttons, filters, or other controls aligned with the sub-navigation.\n *\n */\n\nexport class SgdsSubnav extends SgdsElement {\n static styles = [...SgdsElement.styles, subnavStyle, gridStyle];\n /** @internal */\n static dependencies = {\n \"sgds-icon\": SgdsIcon\n };\n\n @query(\"nav\")\n private nav: HTMLElement;\n\n @query(\".subnav-nav\")\n private mobileNav: HTMLElement;\n\n @query(\".header-container\")\n private headerContainer: HTMLElement;\n\n @query(\".subnav-toggler\")\n private toggler: HTMLElement;\n\n @query(\".subnav-nav-group\")\n private navGroup: HTMLElement;\n\n @query(\".subnav-actions\")\n private mobileActions: HTMLElement;\n\n @state()\n private isCollapsed = false;\n\n @state()\n private isMenuOpen = false;\n\n connectedCallback() {\n super.connectedCallback();\n\n // this._handleResize();\n window.addEventListener(\"resize\", this._handleResize);\n window.addEventListener(\"click\", (event: MouseEvent) => this._handleClickOutOfElement(event, this.navGroup));\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n\n window.removeEventListener(\"resize\", this._handleResize);\n window.removeEventListener(\"click\", (event: MouseEvent) => this._handleClickOutOfElement(event, this.navGroup));\n }\n\n firstUpdated() {\n this._handleResize();\n }\n\n private _handleResize = async () => {\n this.isCollapsed = window.innerWidth < LG_BREAKPOINT;\n\n await this.updateComplete;\n\n if (!this.isCollapsed) {\n this.isMenuOpen = false;\n }\n\n this._updateMobileLayout();\n };\n\n private _updateMobileLayout = () => {\n if (!this.nav || !this.headerContainer || !this.mobileActions || !this.mobileNav) return;\n\n if (this.isCollapsed) {\n const { top: subnavTop } = this.nav.getBoundingClientRect();\n const headerHeight = this.headerContainer.clientHeight;\n const actionsButtonHeight = this.mobileActions.clientHeight;\n const offset =\n window.innerWidth >= MD_BREAKPOINT && window.innerWidth < LG_BREAKPOINT\n ? subnavTop + headerHeight\n : subnavTop + headerHeight + actionsButtonHeight;\n\n this.mobileNav.style.maxHeight = `calc(100dvh - ${offset}px)`;\n this.style.minHeight = `${this.nav.clientHeight}px`;\n this.nav.style.position = \"absolute\";\n } else {\n this.mobileNav.style.maxHeight = \"none\";\n this.style.minHeight = \"auto\";\n this.nav.style.position = \"relative\";\n }\n };\n\n private _handleClickOutOfElement(e: MouseEvent, self: HTMLElement) {\n if (!e.composedPath().includes(self) && !e.composedPath().includes(this.toggler)) {\n this.hide();\n }\n }\n\n private _toggleMenu = () => {\n if (this.isMenuOpen) {\n this.hide();\n } else {\n document.querySelector(\"body\").style.overflow = \"hidden\";\n this.show();\n }\n\n this.toggler?.focus();\n };\n\n private async _onKeyboardToggle(event: KeyboardEvent) {\n if (!VALID_KEYS.includes(event.key)) return;\n\n event.preventDefault();\n this._toggleMenu();\n }\n\n /** Shows the menu. For when subnav is in the collapsed form */\n public async show() {\n if (this.isMenuOpen) {\n return;\n }\n\n this.isMenuOpen = true;\n return waitForEvent(this, \"sgds-after-show\");\n }\n\n /** Hide the menu. For when subnav is in the collapsed form */\n public async hide() {\n if (!this.isMenuOpen) {\n return;\n }\n\n this.isMenuOpen = false;\n document.querySelector(\"body\").style.removeProperty(\"overflow\");\n\n return waitForEvent(this, \"sgds-after-hide\");\n }\n\n private async _animateToShow() {\n const sgdsShow = this.emit(\"sgds-show\", { cancelable: true });\n if (sgdsShow.defaultPrevented) {\n this.isMenuOpen = false;\n return;\n }\n\n await stopAnimations(this.mobileNav);\n if (this.isCollapsed) {\n this.mobileNav.style.display = \"flex\";\n }\n\n const { keyframes, options } = getAnimation(this, \"subnav.show\");\n await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);\n\n this.emit(\"sgds-after-show\");\n }\n\n private async _animateToHide() {\n const slHide = this.emit(\"sgds-hide\", { cancelable: true });\n if (slHide.defaultPrevented) {\n this.isMenuOpen = true;\n return;\n }\n\n await stopAnimations(this.mobileNav);\n\n const { keyframes, options } = getAnimation(this, \"subnav.hide\");\n await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);\n if (this.isCollapsed) {\n this.mobileNav.style.display = \"none\";\n }\n\n this.emit(\"sgds-after-hide\");\n }\n\n @watch(\"isMenuOpen\", { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.isMenuOpen) {\n // Show\n this._animateToShow();\n } else {\n // Hide\n this._animateToHide();\n }\n }\n\n @watch(\"isCollapsed\", { waitUntilFirstUpdate: true })\n async handleCollapsedChange() {\n await this.updateComplete;\n this.mobileNav.style.display = this.isCollapsed ? \"none\" : \"flex\";\n }\n\n render() {\n return html`\n <nav aria-label=\"Sub navigation\">\n <div\n class=${classMap({\n \"sgds-container\": true,\n subnav: true,\n collapsed: !this.isMenuOpen\n })}\n >\n <div class=\"header-container\">\n <slot name=\"header\"></slot>\n <sgds-icon\n class=\"subnav-toggler\"\n name=\"chevron-down\"\n tabindex=\"0\"\n @click=${this._toggleMenu}\n @keydown=${this._onKeyboardToggle}\n aria-label=\"Toggle sub navigation\"\n aria-expanded=${this.isMenuOpen}\n ></sgds-icon>\n </div>\n <div class=\"subnav-nav-group\">\n <div class=\"subnav-nav\">\n <slot></slot>\n </div>\n <div class=\"subnav-actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </div>\n </nav>\n `;\n }\n}\n\nsetDefaultAnimation(\"subnav.show\", {\n keyframes: [\n { height: \"0\", opacity: \"0\" },\n { height: \"auto\", opacity: \"1\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n\nsetDefaultAnimation(\"subnav.hide\", {\n keyframes: [\n { height: \"auto\", opacity: \"1\" },\n { height: \"0\", opacity: \"0\" }\n ],\n options: { duration: 200, easing: \"ease-in-out\" }\n});\n\nexport default SgdsSubnav;\n"],"names":["SgdsElement","LG_BREAKPOINT","MD_BREAKPOINT","waitForEvent","stopAnimations","getAnimation","animateTo","shimKeyframesHeightAuto","html","classMap","subnavStyle","gridStyle","SgdsIcon","__decorate","query","state","watch","setDefaultAnimation"],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { __decorate } from 'tslib';
|
|
3
3
|
import SgdsElement from '../../base/sgds-element.js';
|
|
4
|
-
import { html
|
|
4
|
+
import { html } from 'lit';
|
|
5
5
|
import { query, state } from 'lit/decorators.js';
|
|
6
6
|
import { classMap } from 'lit/directives/class-map.js';
|
|
7
7
|
import { watch } from '../../utils/watch.js';
|
|
8
8
|
import { waitForEvent } from '../../utils/event.js';
|
|
9
9
|
import { stopAnimations, animateTo, shimKeyframesHeightAuto } from '../../utils/animate.js';
|
|
10
10
|
import { setDefaultAnimation, getAnimation } from '../../utils/animation-registry.js';
|
|
11
|
-
import { LG_BREAKPOINT } from '../../utils/breakpoints.js';
|
|
11
|
+
import { LG_BREAKPOINT, MD_BREAKPOINT } from '../../utils/breakpoints.js';
|
|
12
12
|
import { SgdsIcon } from '../Icon/sgds-icon.js';
|
|
13
13
|
import css_248z from './subnav.js';
|
|
14
14
|
import css_248z$1 from '../../css/grid.js';
|
|
15
15
|
|
|
16
|
+
const VALID_KEYS = ["Enter", " "];
|
|
16
17
|
/**
|
|
17
18
|
* @summary This component provides secondary navigation within a specific section or page. It typically appears below the main navigation and offers context-specific links or actions to help users explore related content.
|
|
18
19
|
*
|
|
@@ -29,40 +30,34 @@ import css_248z$1 from '../../css/grid.js';
|
|
|
29
30
|
class SgdsSubnav extends SgdsElement {
|
|
30
31
|
constructor() {
|
|
31
32
|
super(...arguments);
|
|
32
|
-
this.isCollapsed =
|
|
33
|
+
this.isCollapsed = false;
|
|
33
34
|
this.isMenuOpen = false;
|
|
34
|
-
this._handleResize = () => {
|
|
35
|
+
this._handleResize = async () => {
|
|
35
36
|
this.isCollapsed = window.innerWidth < LG_BREAKPOINT;
|
|
37
|
+
await this.updateComplete;
|
|
36
38
|
if (!this.isCollapsed) {
|
|
37
39
|
this.isMenuOpen = false;
|
|
38
40
|
}
|
|
39
41
|
this._updateMobileLayout();
|
|
40
42
|
};
|
|
41
43
|
this._updateMobileLayout = () => {
|
|
42
|
-
|
|
43
|
-
if (!this.nav || !this.subnav || !this.mobileActions || !this.mobileNav)
|
|
44
|
+
if (!this.nav || !this.headerContainer || !this.mobileActions || !this.mobileNav)
|
|
44
45
|
return;
|
|
45
|
-
const actionsSlot = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot[name="actions"]');
|
|
46
46
|
if (this.isCollapsed) {
|
|
47
|
-
const subnavHeight = this.nav.clientHeight;
|
|
48
47
|
const { top: subnavTop } = this.nav.getBoundingClientRect();
|
|
49
|
-
const headerHeight = this.
|
|
48
|
+
const headerHeight = this.headerContainer.clientHeight;
|
|
50
49
|
const actionsButtonHeight = this.mobileActions.clientHeight;
|
|
51
|
-
const offset =
|
|
50
|
+
const offset = window.innerWidth >= MD_BREAKPOINT && window.innerWidth < LG_BREAKPOINT
|
|
51
|
+
? subnavTop + headerHeight
|
|
52
|
+
: subnavTop + headerHeight + actionsButtonHeight;
|
|
52
53
|
this.mobileNav.style.maxHeight = `calc(100dvh - ${offset}px)`;
|
|
53
|
-
this.style.minHeight = `${
|
|
54
|
-
|
|
55
|
-
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
56
|
-
buttons.forEach(el => el.setAttribute("fullWidth", "true"));
|
|
57
|
-
}
|
|
54
|
+
this.style.minHeight = `${this.nav.clientHeight}px`;
|
|
55
|
+
this.nav.style.position = "absolute";
|
|
58
56
|
}
|
|
59
57
|
else {
|
|
60
58
|
this.mobileNav.style.maxHeight = "none";
|
|
61
59
|
this.style.minHeight = "auto";
|
|
62
|
-
|
|
63
|
-
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
64
|
-
buttons.forEach(el => el.removeAttribute("isCollapsed"));
|
|
65
|
-
}
|
|
60
|
+
this.nav.style.position = "relative";
|
|
66
61
|
}
|
|
67
62
|
};
|
|
68
63
|
this._toggleMenu = () => {
|
|
@@ -79,38 +74,29 @@ class SgdsSubnav extends SgdsElement {
|
|
|
79
74
|
}
|
|
80
75
|
connectedCallback() {
|
|
81
76
|
super.connectedCallback();
|
|
82
|
-
this._handleResize();
|
|
77
|
+
// this._handleResize();
|
|
83
78
|
window.addEventListener("resize", this._handleResize);
|
|
84
|
-
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
79
|
+
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.navGroup));
|
|
85
80
|
}
|
|
86
81
|
disconnectedCallback() {
|
|
87
82
|
super.disconnectedCallback();
|
|
88
83
|
window.removeEventListener("resize", this._handleResize);
|
|
89
|
-
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
84
|
+
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.navGroup));
|
|
90
85
|
}
|
|
91
86
|
firstUpdated() {
|
|
92
|
-
|
|
93
|
-
this._updateMobileLayout();
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
_handleSlotChange(e) {
|
|
97
|
-
const childElements = e.target.assignedElements({ flatten: true });
|
|
98
|
-
if (this.isCollapsed) {
|
|
99
|
-
childElements.forEach(element => {
|
|
100
|
-
element.setAttribute("isCollapsed", `${this.isCollapsed}`);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
childElements.forEach(element => {
|
|
105
|
-
element.removeAttribute("isCollapsed");
|
|
106
|
-
});
|
|
107
|
-
}
|
|
87
|
+
this._handleResize();
|
|
108
88
|
}
|
|
109
89
|
_handleClickOutOfElement(e, self) {
|
|
110
90
|
if (!e.composedPath().includes(self) && !e.composedPath().includes(this.toggler)) {
|
|
111
91
|
this.hide();
|
|
112
92
|
}
|
|
113
93
|
}
|
|
94
|
+
async _onKeyboardToggle(event) {
|
|
95
|
+
if (!VALID_KEYS.includes(event.key))
|
|
96
|
+
return;
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
this._toggleMenu();
|
|
99
|
+
}
|
|
114
100
|
/** Shows the menu. For when subnav is in the collapsed form */
|
|
115
101
|
async show() {
|
|
116
102
|
if (this.isMenuOpen) {
|
|
@@ -135,10 +121,11 @@ class SgdsSubnav extends SgdsElement {
|
|
|
135
121
|
return;
|
|
136
122
|
}
|
|
137
123
|
await stopAnimations(this.mobileNav);
|
|
138
|
-
this.
|
|
124
|
+
if (this.isCollapsed) {
|
|
125
|
+
this.mobileNav.style.display = "flex";
|
|
126
|
+
}
|
|
139
127
|
const { keyframes, options } = getAnimation(this, "subnav.show");
|
|
140
128
|
await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
141
|
-
// this.mobileNav.style.height = "auto";
|
|
142
129
|
this.emit("sgds-after-show");
|
|
143
130
|
}
|
|
144
131
|
async _animateToHide() {
|
|
@@ -150,8 +137,9 @@ class SgdsSubnav extends SgdsElement {
|
|
|
150
137
|
await stopAnimations(this.mobileNav);
|
|
151
138
|
const { keyframes, options } = getAnimation(this, "subnav.hide");
|
|
152
139
|
await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
153
|
-
this.
|
|
154
|
-
|
|
140
|
+
if (this.isCollapsed) {
|
|
141
|
+
this.mobileNav.style.display = "none";
|
|
142
|
+
}
|
|
155
143
|
this.emit("sgds-after-hide");
|
|
156
144
|
}
|
|
157
145
|
async handleOpenChange() {
|
|
@@ -164,61 +152,41 @@ class SgdsSubnav extends SgdsElement {
|
|
|
164
152
|
this._animateToHide();
|
|
165
153
|
}
|
|
166
154
|
}
|
|
155
|
+
async handleCollapsedChange() {
|
|
156
|
+
await this.updateComplete;
|
|
157
|
+
this.mobileNav.style.display = this.isCollapsed ? "none" : "flex";
|
|
158
|
+
}
|
|
167
159
|
render() {
|
|
168
|
-
const isHydrated = this.hasUpdated;
|
|
169
160
|
return html `
|
|
170
|
-
<nav
|
|
171
|
-
class=${classMap({
|
|
172
|
-
mobile: this.isCollapsed
|
|
173
|
-
})}
|
|
174
|
-
aria-label="Sub navigation"
|
|
175
|
-
>
|
|
161
|
+
<nav aria-label="Sub navigation">
|
|
176
162
|
<div
|
|
177
163
|
class=${classMap({
|
|
178
|
-
"sgds-container":
|
|
164
|
+
"sgds-container": true,
|
|
179
165
|
subnav: true,
|
|
180
|
-
mobile: this.isCollapsed,
|
|
181
166
|
collapsed: !this.isMenuOpen
|
|
182
167
|
})}
|
|
183
168
|
>
|
|
184
|
-
<
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
169
|
+
<div class="header-container">
|
|
170
|
+
<slot name="header"></slot>
|
|
171
|
+
<sgds-icon
|
|
172
|
+
class="subnav-toggler"
|
|
173
|
+
name="chevron-down"
|
|
174
|
+
tabindex="0"
|
|
175
|
+
@click=${this._toggleMenu}
|
|
176
|
+
@keydown=${this._onKeyboardToggle}
|
|
177
|
+
aria-label="Toggle sub navigation"
|
|
178
|
+
aria-expanded=${this.isMenuOpen}
|
|
179
|
+
></sgds-icon>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="subnav-nav-group">
|
|
182
|
+
<div class="subnav-nav">
|
|
183
|
+
<slot></slot>
|
|
184
|
+
</div>
|
|
185
|
+
<div class="subnav-actions">
|
|
186
|
+
<slot name="actions"></slot>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
204
189
|
</div>
|
|
205
|
-
${this.isCollapsed
|
|
206
|
-
? html `
|
|
207
|
-
<div class="subnav-dropdown">
|
|
208
|
-
<div
|
|
209
|
-
class=${classMap({
|
|
210
|
-
"subnav-nav-mobile": true,
|
|
211
|
-
hidden: !this.isMenuOpen && !isHydrated
|
|
212
|
-
})}
|
|
213
|
-
>
|
|
214
|
-
<slot @slotchange="${this._handleSlotChange}"></slot>
|
|
215
|
-
</div>
|
|
216
|
-
<div class="subnav-actions-mobile">
|
|
217
|
-
<slot name="actions"></slot>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
`
|
|
221
|
-
: nothing}
|
|
222
190
|
</nav>
|
|
223
191
|
`;
|
|
224
192
|
}
|
|
@@ -232,19 +200,19 @@ __decorate([
|
|
|
232
200
|
query("nav")
|
|
233
201
|
], SgdsSubnav.prototype, "nav", void 0);
|
|
234
202
|
__decorate([
|
|
235
|
-
query(".subnav")
|
|
236
|
-
], SgdsSubnav.prototype, "subnav", void 0);
|
|
237
|
-
__decorate([
|
|
238
|
-
query(".subnav-nav-mobile")
|
|
203
|
+
query(".subnav-nav")
|
|
239
204
|
], SgdsSubnav.prototype, "mobileNav", void 0);
|
|
205
|
+
__decorate([
|
|
206
|
+
query(".header-container")
|
|
207
|
+
], SgdsSubnav.prototype, "headerContainer", void 0);
|
|
240
208
|
__decorate([
|
|
241
209
|
query(".subnav-toggler")
|
|
242
210
|
], SgdsSubnav.prototype, "toggler", void 0);
|
|
243
211
|
__decorate([
|
|
244
|
-
query(".subnav-
|
|
245
|
-
], SgdsSubnav.prototype, "
|
|
212
|
+
query(".subnav-nav-group")
|
|
213
|
+
], SgdsSubnav.prototype, "navGroup", void 0);
|
|
246
214
|
__decorate([
|
|
247
|
-
query(".subnav-actions
|
|
215
|
+
query(".subnav-actions")
|
|
248
216
|
], SgdsSubnav.prototype, "mobileActions", void 0);
|
|
249
217
|
__decorate([
|
|
250
218
|
state()
|
|
@@ -255,6 +223,9 @@ __decorate([
|
|
|
255
223
|
__decorate([
|
|
256
224
|
watch("isMenuOpen", { waitUntilFirstUpdate: true })
|
|
257
225
|
], SgdsSubnav.prototype, "handleOpenChange", null);
|
|
226
|
+
__decorate([
|
|
227
|
+
watch("isCollapsed", { waitUntilFirstUpdate: true })
|
|
228
|
+
], SgdsSubnav.prototype, "handleCollapsedChange", null);
|
|
258
229
|
setDefaultAnimation("subnav.show", {
|
|
259
230
|
keyframes: [
|
|
260
231
|
{ height: "0", opacity: "0" },
|