@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.
Files changed (75) hide show
  1. package/base/button.js +1 -1
  2. package/components/Badge/index.umd.js +0 -5
  3. package/components/Badge/index.umd.js.map +1 -1
  4. package/components/Badge/sgds-badge.js +0 -5
  5. package/components/Badge/sgds-badge.js.map +1 -1
  6. package/components/Button/index.umd.js +1 -1
  7. package/components/ComboBox/index.umd.js +0 -5
  8. package/components/ComboBox/index.umd.js.map +1 -1
  9. package/components/Datepicker/index.umd.js +1 -1
  10. package/components/FileUpload/index.umd.js +1 -1
  11. package/components/IconButton/index.umd.js +1 -1
  12. package/components/Mainnav/index.umd.js +3 -3
  13. package/components/Mainnav/index.umd.js.map +1 -1
  14. package/components/Modal/index.umd.js +5 -2
  15. package/components/Modal/index.umd.js.map +1 -1
  16. package/components/Modal/modal.js +1 -1
  17. package/components/Modal/sgds-modal.js +2 -1
  18. package/components/Modal/sgds-modal.js.map +1 -1
  19. package/components/Pagination/index.umd.js +1 -1
  20. package/components/QuantityToggle/index.umd.js +1 -1
  21. package/components/Subnav/index.umd.js +95 -67
  22. package/components/Subnav/index.umd.js.map +1 -1
  23. package/components/Subnav/sgds-subnav.d.ts +3 -4
  24. package/components/Subnav/sgds-subnav.js +95 -66
  25. package/components/Subnav/sgds-subnav.js.map +1 -1
  26. package/components/Subnav/subnav-item.js +1 -1
  27. package/components/Subnav/subnav.js +1 -1
  28. package/components/Table/index.umd.js +44 -106
  29. package/components/Table/index.umd.js.map +1 -1
  30. package/components/Table/sgds-table.d.ts +5 -31
  31. package/components/Table/sgds-table.js +42 -104
  32. package/components/Table/sgds-table.js.map +1 -1
  33. package/components/Table/table.js +1 -1
  34. package/components/index.umd.js +144 -182
  35. package/components/index.umd.js.map +1 -1
  36. package/index.umd.js +145 -183
  37. package/index.umd.js.map +1 -1
  38. package/package.json +2 -2
  39. package/react/base/button.cjs.js +1 -1
  40. package/react/base/button.js +1 -1
  41. package/react/components/Badge/sgds-badge.cjs.js +0 -5
  42. package/react/components/Badge/sgds-badge.cjs.js.map +1 -1
  43. package/react/components/Badge/sgds-badge.js +0 -5
  44. package/react/components/Badge/sgds-badge.js.map +1 -1
  45. package/react/components/Modal/modal.cjs.js +1 -1
  46. package/react/components/Modal/modal.js +1 -1
  47. package/react/components/Modal/sgds-modal.cjs.js +2 -1
  48. package/react/components/Modal/sgds-modal.cjs.js.map +1 -1
  49. package/react/components/Modal/sgds-modal.js +2 -1
  50. package/react/components/Modal/sgds-modal.js.map +1 -1
  51. package/react/components/Subnav/sgds-subnav.cjs.js +93 -64
  52. package/react/components/Subnav/sgds-subnav.cjs.js.map +1 -1
  53. package/react/components/Subnav/sgds-subnav.js +95 -66
  54. package/react/components/Subnav/sgds-subnav.js.map +1 -1
  55. package/react/components/Subnav/subnav-item.cjs.js +1 -1
  56. package/react/components/Subnav/subnav-item.js +1 -1
  57. package/react/components/Subnav/subnav.cjs.js +1 -1
  58. package/react/components/Subnav/subnav.js +1 -1
  59. package/react/components/Table/sgds-table.cjs.js +42 -104
  60. package/react/components/Table/sgds-table.cjs.js.map +1 -1
  61. package/react/components/Table/sgds-table.js +42 -104
  62. package/react/components/Table/sgds-table.js.map +1 -1
  63. package/react/components/Table/table.cjs.js +1 -1
  64. package/react/components/Table/table.js +1 -1
  65. package/react/table/index.cjs.js +1 -3
  66. package/react/table/index.cjs.js.map +1 -1
  67. package/react/table/index.js +1 -3
  68. package/react/table/index.js.map +1 -1
  69. package/react/utils/breakpoints.cjs.js +2 -2
  70. package/react/utils/breakpoints.cjs.js.map +1 -1
  71. package/react/utils/breakpoints.js +2 -2
  72. package/react/utils/breakpoints.js.map +1 -1
  73. package/utils/breakpoints.d.ts +3 -2
  74. package/utils/breakpoints.js +2 -2
  75. 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 = false;
36
+ this.isCollapsed = window.innerWidth < breakpoints.LG_BREAKPOINT;
38
37
  this.isMenuOpen = false;
39
- this._handleResize = async () => {
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
- if (!this.nav || !this.headerContainer || !this.mobileActions || !this.mobileNav)
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.headerContainer.clientHeight;
53
+ const headerHeight = this.subnav.clientHeight;
53
54
  const actionsButtonHeight = this.mobileActions.clientHeight;
54
- const offset = window.innerWidth >= breakpoints.MD_BREAKPOINT && window.innerWidth < breakpoints.LG_BREAKPOINT
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 = `${this.nav.clientHeight}px`;
59
- this.nav.style.position = "absolute";
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
- this.nav.style.position = "relative";
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
- // this._handleResize();
86
+ this._handleResize();
82
87
  window.addEventListener("resize", this._handleResize);
83
- window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.navGroup));
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.navGroup));
93
+ window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.body));
89
94
  }
90
95
  firstUpdated() {
91
- this._handleResize();
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
- if (this.isCollapsed) {
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
- if (this.isCollapsed) {
145
- this.mobileNav.style.display = "none";
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 aria-label="Sub navigation">
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": true,
182
+ "sgds-container": !this.isCollapsed,
169
183
  subnav: true,
184
+ mobile: this.isCollapsed,
170
185
  collapsed: !this.isMenuOpen
171
186
  })}
172
187
  >
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>
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-nav")
208
- ], SgdsSubnav.prototype, "mobileNav", void 0);
239
+ decorators_js.query(".subnav")
240
+ ], SgdsSubnav.prototype, "subnav", void 0);
209
241
  tslib.__decorate([
210
- decorators_js.query(".header-container")
211
- ], SgdsSubnav.prototype, "headerContainer", void 0);
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-nav-group")
217
- ], SgdsSubnav.prototype, "navGroup", void 0);
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, MD_BREAKPOINT } from '../../utils/breakpoints.js';
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 = false;
32
+ this.isCollapsed = window.innerWidth < LG_BREAKPOINT;
34
33
  this.isMenuOpen = false;
35
- this._handleResize = async () => {
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
- if (!this.nav || !this.headerContainer || !this.mobileActions || !this.mobileNav)
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.headerContainer.clientHeight;
49
+ const headerHeight = this.subnav.clientHeight;
49
50
  const actionsButtonHeight = this.mobileActions.clientHeight;
50
- const offset = window.innerWidth >= MD_BREAKPOINT && window.innerWidth < LG_BREAKPOINT
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 = `${this.nav.clientHeight}px`;
55
- this.nav.style.position = "absolute";
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
- this.nav.style.position = "relative";
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
- // this._handleResize();
82
+ this._handleResize();
78
83
  window.addEventListener("resize", this._handleResize);
79
- window.addEventListener("click", (event) => this._handleClickOutOfElement(event, this.navGroup));
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.navGroup));
89
+ window.removeEventListener("click", (event) => this._handleClickOutOfElement(event, this.body));
85
90
  }
86
91
  firstUpdated() {
87
- this._handleResize();
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
- if (this.isCollapsed) {
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
- if (this.isCollapsed) {
141
- this.mobileNav.style.display = "none";
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 aria-label="Sub navigation">
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": true,
178
+ "sgds-container": !this.isCollapsed,
165
179
  subnav: true,
180
+ mobile: this.isCollapsed,
166
181
  collapsed: !this.isMenuOpen
167
182
  })}
168
183
  >
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>
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-nav")
204
- ], SgdsSubnav.prototype, "mobileNav", void 0);
235
+ query(".subnav")
236
+ ], SgdsSubnav.prototype, "subnav", void 0);
205
237
  __decorate([
206
- query(".header-container")
207
- ], SgdsSubnav.prototype, "headerContainer", void 0);
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-nav-group")
213
- ], SgdsSubnav.prototype, "navGroup", void 0);
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" },