@govtechsg/sgds-web-component 3.1.1-rc.3 → 3.1.2
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/components/Badge/index.umd.js +0 -5
- package/components/Badge/index.umd.js.map +1 -1
- package/components/Badge/sgds-badge.js +0 -5
- package/components/Badge/sgds-badge.js.map +1 -1
- package/components/Button/index.umd.js +1 -1
- package/components/ComboBox/index.umd.js +0 -5
- package/components/ComboBox/index.umd.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 +3 -3
- package/components/Mainnav/index.umd.js.map +1 -1
- package/components/Modal/index.umd.js +5 -2
- package/components/Modal/index.umd.js.map +1 -1
- package/components/Modal/modal.js +1 -1
- package/components/Modal/sgds-modal.js +2 -1
- package/components/Modal/sgds-modal.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 +95 -67
- package/components/Subnav/index.umd.js.map +1 -1
- package/components/Subnav/sgds-subnav.d.ts +3 -4
- package/components/Subnav/sgds-subnav.js +95 -66
- 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.umd.js +44 -106
- package/components/Table/index.umd.js.map +1 -1
- package/components/Table/sgds-table.d.ts +5 -31
- package/components/Table/sgds-table.js +42 -104
- package/components/Table/sgds-table.js.map +1 -1
- package/components/Table/table.js +1 -1
- package/components/index.umd.js +144 -182
- package/components/index.umd.js.map +1 -1
- package/index.umd.js +145 -183
- package/index.umd.js.map +1 -1
- package/package.json +2 -2
- package/react/base/button.cjs.js +1 -1
- package/react/base/button.js +1 -1
- package/react/components/Badge/sgds-badge.cjs.js +0 -5
- package/react/components/Badge/sgds-badge.cjs.js.map +1 -1
- package/react/components/Badge/sgds-badge.js +0 -5
- package/react/components/Badge/sgds-badge.js.map +1 -1
- package/react/components/Modal/modal.cjs.js +1 -1
- package/react/components/Modal/modal.js +1 -1
- package/react/components/Modal/sgds-modal.cjs.js +2 -1
- package/react/components/Modal/sgds-modal.cjs.js.map +1 -1
- package/react/components/Modal/sgds-modal.js +2 -1
- package/react/components/Modal/sgds-modal.js.map +1 -1
- package/react/components/Subnav/sgds-subnav.cjs.js +93 -64
- package/react/components/Subnav/sgds-subnav.cjs.js.map +1 -1
- package/react/components/Subnav/sgds-subnav.js +95 -66
- 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.cjs.js +42 -104
- package/react/components/Table/sgds-table.cjs.js.map +1 -1
- package/react/components/Table/sgds-table.js +42 -104
- package/react/components/Table/sgds-table.js.map +1 -1
- package/react/components/Table/table.cjs.js +1 -1
- package/react/components/Table/table.js +1 -1
- package/react/table/index.cjs.js +1 -3
- package/react/table/index.cjs.js.map +1 -1
- package/react/table/index.js +1 -3
- package/react/table/index.js.map +1 -1
- 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 -2
- package/utils/breakpoints.js +2 -2
- package/utils/breakpoints.js.map +1 -1
|
@@ -17,7 +17,6 @@ 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", " "];
|
|
21
20
|
/**
|
|
22
21
|
* @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.
|
|
23
22
|
*
|
|
@@ -34,34 +33,40 @@ const VALID_KEYS = ["Enter", " "];
|
|
|
34
33
|
class SgdsSubnav extends sgdsElement["default"] {
|
|
35
34
|
constructor() {
|
|
36
35
|
super(...arguments);
|
|
37
|
-
this.isCollapsed =
|
|
36
|
+
this.isCollapsed = window.innerWidth < breakpoints.LG_BREAKPOINT;
|
|
38
37
|
this.isMenuOpen = false;
|
|
39
|
-
this._handleResize =
|
|
38
|
+
this._handleResize = () => {
|
|
40
39
|
this.isCollapsed = window.innerWidth < breakpoints.LG_BREAKPOINT;
|
|
41
|
-
await this.updateComplete;
|
|
42
40
|
if (!this.isCollapsed) {
|
|
43
41
|
this.isMenuOpen = false;
|
|
44
42
|
}
|
|
45
43
|
this._updateMobileLayout();
|
|
46
44
|
};
|
|
47
45
|
this._updateMobileLayout = () => {
|
|
48
|
-
|
|
46
|
+
var _a;
|
|
47
|
+
if (!this.nav || !this.subnav || !this.mobileActions || !this.mobileNav)
|
|
49
48
|
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;
|
|
51
52
|
const { top: subnavTop } = this.nav.getBoundingClientRect();
|
|
52
|
-
const headerHeight = this.
|
|
53
|
+
const headerHeight = this.subnav.clientHeight;
|
|
53
54
|
const actionsButtonHeight = this.mobileActions.clientHeight;
|
|
54
|
-
const offset =
|
|
55
|
-
? subnavTop + headerHeight
|
|
56
|
-
: subnavTop + headerHeight + actionsButtonHeight;
|
|
55
|
+
const offset = subnavTop + headerHeight + actionsButtonHeight;
|
|
57
56
|
this.mobileNav.style.maxHeight = `calc(100dvh - ${offset}px)`;
|
|
58
|
-
this.style.minHeight = `${
|
|
59
|
-
|
|
57
|
+
this.style.minHeight = `${subnavHeight}px`;
|
|
58
|
+
if (actionsSlot) {
|
|
59
|
+
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
60
|
+
buttons.forEach(el => el.setAttribute("fullWidth", "true"));
|
|
61
|
+
}
|
|
60
62
|
}
|
|
61
63
|
else {
|
|
62
64
|
this.mobileNav.style.maxHeight = "none";
|
|
63
65
|
this.style.minHeight = "auto";
|
|
64
|
-
|
|
66
|
+
if (actionsSlot) {
|
|
67
|
+
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
68
|
+
buttons.forEach(el => el.removeAttribute("isCollapsed"));
|
|
69
|
+
}
|
|
65
70
|
}
|
|
66
71
|
};
|
|
67
72
|
this._toggleMenu = () => {
|
|
@@ -78,29 +83,38 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
78
83
|
}
|
|
79
84
|
connectedCallback() {
|
|
80
85
|
super.connectedCallback();
|
|
81
|
-
|
|
86
|
+
this._handleResize();
|
|
82
87
|
window.addEventListener("resize", this._handleResize);
|
|
83
|
-
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
88
|
+
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.body));
|
|
84
89
|
}
|
|
85
90
|
disconnectedCallback() {
|
|
86
91
|
super.disconnectedCallback();
|
|
87
92
|
window.removeEventListener("resize", this._handleResize);
|
|
88
|
-
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
93
|
+
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.body));
|
|
89
94
|
}
|
|
90
95
|
firstUpdated() {
|
|
91
|
-
|
|
96
|
+
requestAnimationFrame(() => {
|
|
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
|
+
}
|
|
92
112
|
}
|
|
93
113
|
_handleClickOutOfElement(e, self) {
|
|
94
114
|
if (!e.composedPath().includes(self) && !e.composedPath().includes(this.toggler)) {
|
|
95
115
|
this.hide();
|
|
96
116
|
}
|
|
97
117
|
}
|
|
98
|
-
async _onKeyboardToggle(event) {
|
|
99
|
-
if (!VALID_KEYS.includes(event.key))
|
|
100
|
-
return;
|
|
101
|
-
event.preventDefault();
|
|
102
|
-
this._toggleMenu();
|
|
103
|
-
}
|
|
104
118
|
/** Shows the menu. For when subnav is in the collapsed form */
|
|
105
119
|
async show() {
|
|
106
120
|
if (this.isMenuOpen) {
|
|
@@ -125,11 +139,10 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
125
139
|
return;
|
|
126
140
|
}
|
|
127
141
|
await animate.stopAnimations(this.mobileNav);
|
|
128
|
-
|
|
129
|
-
this.mobileNav.style.display = "flex";
|
|
130
|
-
}
|
|
142
|
+
this.mobileNav.classList.remove("hidden");
|
|
131
143
|
const { keyframes, options } = animationRegistry.getAnimation(this, "subnav.show");
|
|
132
144
|
await animate.animateTo(this.mobileNav, animate.shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
145
|
+
// this.mobileNav.style.height = "auto";
|
|
133
146
|
this.emit("sgds-after-show");
|
|
134
147
|
}
|
|
135
148
|
async _animateToHide() {
|
|
@@ -141,9 +154,8 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
141
154
|
await animate.stopAnimations(this.mobileNav);
|
|
142
155
|
const { keyframes, options } = animationRegistry.getAnimation(this, "subnav.hide");
|
|
143
156
|
await animate.animateTo(this.mobileNav, animate.shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
157
|
+
this.mobileNav.classList.add("hidden");
|
|
158
|
+
// this.mobileNav.style.height = "auto";
|
|
147
159
|
this.emit("sgds-after-hide");
|
|
148
160
|
}
|
|
149
161
|
async handleOpenChange() {
|
|
@@ -156,41 +168,61 @@ class SgdsSubnav extends sgdsElement["default"] {
|
|
|
156
168
|
this._animateToHide();
|
|
157
169
|
}
|
|
158
170
|
}
|
|
159
|
-
async handleCollapsedChange() {
|
|
160
|
-
await this.updateComplete;
|
|
161
|
-
this.mobileNav.style.display = this.isCollapsed ? "none" : "flex";
|
|
162
|
-
}
|
|
163
171
|
render() {
|
|
172
|
+
const isHydrated = this.hasUpdated;
|
|
164
173
|
return lit.html `
|
|
165
|
-
<nav
|
|
174
|
+
<nav
|
|
175
|
+
class=${classMap_js.classMap({
|
|
176
|
+
mobile: this.isCollapsed
|
|
177
|
+
})}
|
|
178
|
+
aria-label="Sub navigation"
|
|
179
|
+
>
|
|
166
180
|
<div
|
|
167
181
|
class=${classMap_js.classMap({
|
|
168
|
-
"sgds-container":
|
|
182
|
+
"sgds-container": !this.isCollapsed,
|
|
169
183
|
subnav: true,
|
|
184
|
+
mobile: this.isCollapsed,
|
|
170
185
|
collapsed: !this.isMenuOpen
|
|
171
186
|
})}
|
|
172
187
|
>
|
|
173
|
-
<
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
188
|
+
<slot name="header"></slot>
|
|
189
|
+
${this.isCollapsed
|
|
190
|
+
? lit.html `
|
|
191
|
+
<sgds-icon
|
|
192
|
+
class="subnav-toggler"
|
|
193
|
+
name="chevron-down"
|
|
194
|
+
@click=${this._toggleMenu}
|
|
195
|
+
aria-label="Toggle sub navigation"
|
|
196
|
+
></sgds-icon>
|
|
197
|
+
`
|
|
198
|
+
: lit.html `
|
|
199
|
+
<div class="subnav-nav-group">
|
|
200
|
+
<div class="subnav-nav">
|
|
201
|
+
<slot @slotchange="${this._handleSlotChange}"></slot>
|
|
202
|
+
</div>
|
|
203
|
+
<div class="subnav-actions">
|
|
204
|
+
<slot name="actions"></slot>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
`}
|
|
193
208
|
</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}
|
|
194
226
|
</nav>
|
|
195
227
|
`;
|
|
196
228
|
}
|
|
@@ -204,19 +236,19 @@ tslib.__decorate([
|
|
|
204
236
|
decorators_js.query("nav")
|
|
205
237
|
], SgdsSubnav.prototype, "nav", void 0);
|
|
206
238
|
tslib.__decorate([
|
|
207
|
-
decorators_js.query(".subnav
|
|
208
|
-
], SgdsSubnav.prototype, "
|
|
239
|
+
decorators_js.query(".subnav")
|
|
240
|
+
], SgdsSubnav.prototype, "subnav", void 0);
|
|
209
241
|
tslib.__decorate([
|
|
210
|
-
decorators_js.query(".
|
|
211
|
-
], SgdsSubnav.prototype, "
|
|
242
|
+
decorators_js.query(".subnav-nav-mobile")
|
|
243
|
+
], SgdsSubnav.prototype, "mobileNav", void 0);
|
|
212
244
|
tslib.__decorate([
|
|
213
245
|
decorators_js.query(".subnav-toggler")
|
|
214
246
|
], SgdsSubnav.prototype, "toggler", void 0);
|
|
215
247
|
tslib.__decorate([
|
|
216
|
-
decorators_js.query(".subnav-
|
|
217
|
-
], SgdsSubnav.prototype, "
|
|
248
|
+
decorators_js.query(".subnav-dropdown")
|
|
249
|
+
], SgdsSubnav.prototype, "body", void 0);
|
|
218
250
|
tslib.__decorate([
|
|
219
|
-
decorators_js.query(".subnav-actions")
|
|
251
|
+
decorators_js.query(".subnav-actions-mobile")
|
|
220
252
|
], SgdsSubnav.prototype, "mobileActions", void 0);
|
|
221
253
|
tslib.__decorate([
|
|
222
254
|
decorators_js.state()
|
|
@@ -227,9 +259,6 @@ tslib.__decorate([
|
|
|
227
259
|
tslib.__decorate([
|
|
228
260
|
watch.watch("isMenuOpen", { waitUntilFirstUpdate: true })
|
|
229
261
|
], SgdsSubnav.prototype, "handleOpenChange", null);
|
|
230
|
-
tslib.__decorate([
|
|
231
|
-
watch.watch("isCollapsed", { waitUntilFirstUpdate: true })
|
|
232
|
-
], SgdsSubnav.prototype, "handleCollapsedChange", null);
|
|
233
262
|
animationRegistry.setDefaultAnimation("subnav.show", {
|
|
234
263
|
keyframes: [
|
|
235
264
|
{ 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 } 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
|
+
{"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,19 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { __decorate } from 'tslib';
|
|
3
3
|
import SgdsElement from '../../base/sgds-element.js';
|
|
4
|
-
import { html } from 'lit';
|
|
4
|
+
import { html, nothing } 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
|
|
11
|
+
import { LG_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", " "];
|
|
17
16
|
/**
|
|
18
17
|
* @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.
|
|
19
18
|
*
|
|
@@ -30,34 +29,40 @@ const VALID_KEYS = ["Enter", " "];
|
|
|
30
29
|
class SgdsSubnav extends SgdsElement {
|
|
31
30
|
constructor() {
|
|
32
31
|
super(...arguments);
|
|
33
|
-
this.isCollapsed =
|
|
32
|
+
this.isCollapsed = window.innerWidth < LG_BREAKPOINT;
|
|
34
33
|
this.isMenuOpen = false;
|
|
35
|
-
this._handleResize =
|
|
34
|
+
this._handleResize = () => {
|
|
36
35
|
this.isCollapsed = window.innerWidth < LG_BREAKPOINT;
|
|
37
|
-
await this.updateComplete;
|
|
38
36
|
if (!this.isCollapsed) {
|
|
39
37
|
this.isMenuOpen = false;
|
|
40
38
|
}
|
|
41
39
|
this._updateMobileLayout();
|
|
42
40
|
};
|
|
43
41
|
this._updateMobileLayout = () => {
|
|
44
|
-
|
|
42
|
+
var _a;
|
|
43
|
+
if (!this.nav || !this.subnav || !this.mobileActions || !this.mobileNav)
|
|
45
44
|
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;
|
|
47
48
|
const { top: subnavTop } = this.nav.getBoundingClientRect();
|
|
48
|
-
const headerHeight = this.
|
|
49
|
+
const headerHeight = this.subnav.clientHeight;
|
|
49
50
|
const actionsButtonHeight = this.mobileActions.clientHeight;
|
|
50
|
-
const offset =
|
|
51
|
-
? subnavTop + headerHeight
|
|
52
|
-
: subnavTop + headerHeight + actionsButtonHeight;
|
|
51
|
+
const offset = subnavTop + headerHeight + actionsButtonHeight;
|
|
53
52
|
this.mobileNav.style.maxHeight = `calc(100dvh - ${offset}px)`;
|
|
54
|
-
this.style.minHeight = `${
|
|
55
|
-
|
|
53
|
+
this.style.minHeight = `${subnavHeight}px`;
|
|
54
|
+
if (actionsSlot) {
|
|
55
|
+
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
56
|
+
buttons.forEach(el => el.setAttribute("fullWidth", "true"));
|
|
57
|
+
}
|
|
56
58
|
}
|
|
57
59
|
else {
|
|
58
60
|
this.mobileNav.style.maxHeight = "none";
|
|
59
61
|
this.style.minHeight = "auto";
|
|
60
|
-
|
|
62
|
+
if (actionsSlot) {
|
|
63
|
+
const buttons = actionsSlot.assignedElements({ flatten: true });
|
|
64
|
+
buttons.forEach(el => el.removeAttribute("isCollapsed"));
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
};
|
|
63
68
|
this._toggleMenu = () => {
|
|
@@ -74,29 +79,38 @@ class SgdsSubnav extends SgdsElement {
|
|
|
74
79
|
}
|
|
75
80
|
connectedCallback() {
|
|
76
81
|
super.connectedCallback();
|
|
77
|
-
|
|
82
|
+
this._handleResize();
|
|
78
83
|
window.addEventListener("resize", this._handleResize);
|
|
79
|
-
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
84
|
+
window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.body));
|
|
80
85
|
}
|
|
81
86
|
disconnectedCallback() {
|
|
82
87
|
super.disconnectedCallback();
|
|
83
88
|
window.removeEventListener("resize", this._handleResize);
|
|
84
|
-
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.
|
|
89
|
+
window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.body));
|
|
85
90
|
}
|
|
86
91
|
firstUpdated() {
|
|
87
|
-
|
|
92
|
+
requestAnimationFrame(() => {
|
|
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
|
+
}
|
|
88
108
|
}
|
|
89
109
|
_handleClickOutOfElement(e, self) {
|
|
90
110
|
if (!e.composedPath().includes(self) && !e.composedPath().includes(this.toggler)) {
|
|
91
111
|
this.hide();
|
|
92
112
|
}
|
|
93
113
|
}
|
|
94
|
-
async _onKeyboardToggle(event) {
|
|
95
|
-
if (!VALID_KEYS.includes(event.key))
|
|
96
|
-
return;
|
|
97
|
-
event.preventDefault();
|
|
98
|
-
this._toggleMenu();
|
|
99
|
-
}
|
|
100
114
|
/** Shows the menu. For when subnav is in the collapsed form */
|
|
101
115
|
async show() {
|
|
102
116
|
if (this.isMenuOpen) {
|
|
@@ -121,11 +135,10 @@ class SgdsSubnav extends SgdsElement {
|
|
|
121
135
|
return;
|
|
122
136
|
}
|
|
123
137
|
await stopAnimations(this.mobileNav);
|
|
124
|
-
|
|
125
|
-
this.mobileNav.style.display = "flex";
|
|
126
|
-
}
|
|
138
|
+
this.mobileNav.classList.remove("hidden");
|
|
127
139
|
const { keyframes, options } = getAnimation(this, "subnav.show");
|
|
128
140
|
await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
141
|
+
// this.mobileNav.style.height = "auto";
|
|
129
142
|
this.emit("sgds-after-show");
|
|
130
143
|
}
|
|
131
144
|
async _animateToHide() {
|
|
@@ -137,9 +150,8 @@ class SgdsSubnav extends SgdsElement {
|
|
|
137
150
|
await stopAnimations(this.mobileNav);
|
|
138
151
|
const { keyframes, options } = getAnimation(this, "subnav.hide");
|
|
139
152
|
await animateTo(this.mobileNav, shimKeyframesHeightAuto(keyframes, this.mobileNav.scrollHeight), options);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}
|
|
153
|
+
this.mobileNav.classList.add("hidden");
|
|
154
|
+
// this.mobileNav.style.height = "auto";
|
|
143
155
|
this.emit("sgds-after-hide");
|
|
144
156
|
}
|
|
145
157
|
async handleOpenChange() {
|
|
@@ -152,41 +164,61 @@ class SgdsSubnav extends SgdsElement {
|
|
|
152
164
|
this._animateToHide();
|
|
153
165
|
}
|
|
154
166
|
}
|
|
155
|
-
async handleCollapsedChange() {
|
|
156
|
-
await this.updateComplete;
|
|
157
|
-
this.mobileNav.style.display = this.isCollapsed ? "none" : "flex";
|
|
158
|
-
}
|
|
159
167
|
render() {
|
|
168
|
+
const isHydrated = this.hasUpdated;
|
|
160
169
|
return html `
|
|
161
|
-
<nav
|
|
170
|
+
<nav
|
|
171
|
+
class=${classMap({
|
|
172
|
+
mobile: this.isCollapsed
|
|
173
|
+
})}
|
|
174
|
+
aria-label="Sub navigation"
|
|
175
|
+
>
|
|
162
176
|
<div
|
|
163
177
|
class=${classMap({
|
|
164
|
-
"sgds-container":
|
|
178
|
+
"sgds-container": !this.isCollapsed,
|
|
165
179
|
subnav: true,
|
|
180
|
+
mobile: this.isCollapsed,
|
|
166
181
|
collapsed: !this.isMenuOpen
|
|
167
182
|
})}
|
|
168
183
|
>
|
|
169
|
-
<
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
184
|
+
<slot name="header"></slot>
|
|
185
|
+
${this.isCollapsed
|
|
186
|
+
? html `
|
|
187
|
+
<sgds-icon
|
|
188
|
+
class="subnav-toggler"
|
|
189
|
+
name="chevron-down"
|
|
190
|
+
@click=${this._toggleMenu}
|
|
191
|
+
aria-label="Toggle sub navigation"
|
|
192
|
+
></sgds-icon>
|
|
193
|
+
`
|
|
194
|
+
: html `
|
|
195
|
+
<div class="subnav-nav-group">
|
|
196
|
+
<div class="subnav-nav">
|
|
197
|
+
<slot @slotchange="${this._handleSlotChange}"></slot>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="subnav-actions">
|
|
200
|
+
<slot name="actions"></slot>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
`}
|
|
189
204
|
</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}
|
|
190
222
|
</nav>
|
|
191
223
|
`;
|
|
192
224
|
}
|
|
@@ -200,19 +232,19 @@ __decorate([
|
|
|
200
232
|
query("nav")
|
|
201
233
|
], SgdsSubnav.prototype, "nav", void 0);
|
|
202
234
|
__decorate([
|
|
203
|
-
query(".subnav
|
|
204
|
-
], SgdsSubnav.prototype, "
|
|
235
|
+
query(".subnav")
|
|
236
|
+
], SgdsSubnav.prototype, "subnav", void 0);
|
|
205
237
|
__decorate([
|
|
206
|
-
query(".
|
|
207
|
-
], SgdsSubnav.prototype, "
|
|
238
|
+
query(".subnav-nav-mobile")
|
|
239
|
+
], SgdsSubnav.prototype, "mobileNav", void 0);
|
|
208
240
|
__decorate([
|
|
209
241
|
query(".subnav-toggler")
|
|
210
242
|
], SgdsSubnav.prototype, "toggler", void 0);
|
|
211
243
|
__decorate([
|
|
212
|
-
query(".subnav-
|
|
213
|
-
], SgdsSubnav.prototype, "
|
|
244
|
+
query(".subnav-dropdown")
|
|
245
|
+
], SgdsSubnav.prototype, "body", void 0);
|
|
214
246
|
__decorate([
|
|
215
|
-
query(".subnav-actions")
|
|
247
|
+
query(".subnav-actions-mobile")
|
|
216
248
|
], SgdsSubnav.prototype, "mobileActions", void 0);
|
|
217
249
|
__decorate([
|
|
218
250
|
state()
|
|
@@ -223,9 +255,6 @@ __decorate([
|
|
|
223
255
|
__decorate([
|
|
224
256
|
watch("isMenuOpen", { waitUntilFirstUpdate: true })
|
|
225
257
|
], SgdsSubnav.prototype, "handleOpenChange", null);
|
|
226
|
-
__decorate([
|
|
227
|
-
watch("isCollapsed", { waitUntilFirstUpdate: true })
|
|
228
|
-
], SgdsSubnav.prototype, "handleCollapsedChange", null);
|
|
229
258
|
setDefaultAnimation("subnav.show", {
|
|
230
259
|
keyframes: [
|
|
231
260
|
{ height: "0", opacity: "0" },
|