@schalkneethling/miyagi-core 4.4.2 → 4.4.3

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 (115) hide show
  1. package/README.md +7 -2
  2. package/api/app.js +16 -16
  3. package/api/index.js +263 -262
  4. package/bin/miyagi.js +1 -1
  5. package/dist/css/iframe.css +6 -30
  6. package/frontend/assets/css/iframe/accordion-tabs.css +39 -39
  7. package/frontend/assets/css/iframe/jsontree.js.css +149 -149
  8. package/frontend/assets/css/iframe/prism.css +45 -45
  9. package/frontend/assets/css/iframe/styleguide/colors.css +27 -27
  10. package/frontend/assets/css/iframe/styleguide/fonts.css +23 -23
  11. package/frontend/assets/css/iframe/styleguide/index.css +58 -58
  12. package/frontend/assets/css/iframe/styleguide/spacings.css +10 -10
  13. package/frontend/assets/css/iframe.css +191 -191
  14. package/frontend/assets/css/main/menu/config-switcher.css +21 -21
  15. package/frontend/assets/css/main/menu/config-switchers.css +34 -34
  16. package/frontend/assets/css/main/menu/goto.css +16 -16
  17. package/frontend/assets/css/main/menu/nav.css +49 -49
  18. package/frontend/assets/css/main/menu/search.css +34 -34
  19. package/frontend/assets/css/main/menu/title.css +18 -18
  20. package/frontend/assets/css/main/menu.css +89 -89
  21. package/frontend/assets/css/main/reset.css +47 -47
  22. package/frontend/assets/css/main.css +41 -41
  23. package/frontend/assets/css/shared.css +16 -16
  24. package/frontend/assets/css/tokens.css +108 -107
  25. package/frontend/assets/js/_accordion-tabs.js +392 -392
  26. package/frontend/assets/js/_goto.js +59 -59
  27. package/frontend/assets/js/_iframe-links.js +14 -14
  28. package/frontend/assets/js/_is-triggered.js +3 -3
  29. package/frontend/assets/js/_main.js +369 -369
  30. package/frontend/assets/js/_mock-data.js +8 -8
  31. package/frontend/assets/js/_prism.js +1082 -1081
  32. package/frontend/assets/js/_search.js +186 -186
  33. package/frontend/assets/js/_socket.js +44 -44
  34. package/frontend/assets/js/config-switcher/development-mode.js +38 -38
  35. package/frontend/assets/js/config-switcher/index.js +55 -55
  36. package/frontend/assets/js/config-switcher/text-direction.js +22 -22
  37. package/frontend/assets/js/config-switcher/theme.js +68 -68
  38. package/frontend/assets/js/iframe.build.js +25 -25
  39. package/frontend/assets/js/iframe.js +38 -38
  40. package/frontend/assets/js/jsontree.js +979 -976
  41. package/frontend/assets/js/main.build.js +29 -29
  42. package/frontend/assets/js/main.js +31 -31
  43. package/frontend/assets/js/styleguide/color-converter.js +652 -652
  44. package/frontend/assets/js/styleguide/index.js +100 -100
  45. package/lib/build/index.js +1014 -1020
  46. package/lib/cli/app.js +16 -16
  47. package/lib/cli/component.js +50 -50
  48. package/lib/cli/doctor.js +130 -121
  49. package/lib/cli/drupal-assets.js +163 -157
  50. package/lib/cli/lint.js +196 -196
  51. package/lib/cli/run.js +150 -146
  52. package/lib/config.js +86 -86
  53. package/lib/constants/lint-log-levels.js +6 -6
  54. package/lib/drupal/load-assets-config.js +59 -60
  55. package/lib/drupal/resolve-library-assets.js +132 -141
  56. package/lib/errors.js +20 -20
  57. package/lib/generator/component.js +124 -124
  58. package/lib/generator/mocks.js +156 -156
  59. package/lib/helpers.js +68 -68
  60. package/lib/i18n/en.js +93 -93
  61. package/lib/i18n/index.js +8 -8
  62. package/lib/index.js +13 -13
  63. package/lib/init/args.js +153 -153
  64. package/lib/init/config.js +452 -438
  65. package/lib/init/engines.js +41 -41
  66. package/lib/init/index.js +83 -83
  67. package/lib/init/rendering.js +3 -3
  68. package/lib/init/static.js +90 -90
  69. package/lib/init/twing/cache.js +27 -27
  70. package/lib/init/twing/functions.js +37 -37
  71. package/lib/init/views.js +5 -5
  72. package/lib/logger.js +72 -72
  73. package/lib/mocks/get.js +88 -88
  74. package/lib/mocks/index.js +2 -2
  75. package/lib/mocks/resolve/ref.js +447 -447
  76. package/lib/mocks/resolve/tpl.js +218 -218
  77. package/lib/mocks/resolve.js +154 -154
  78. package/lib/render/helpers/resolve-assets.js +29 -39
  79. package/lib/render/helpers.js +27 -27
  80. package/lib/render/index.js +18 -18
  81. package/lib/render/views/iframe/component.docs.js +50 -50
  82. package/lib/render/views/iframe/component.js +249 -248
  83. package/lib/render/views/iframe/design-tokens/colors.js +38 -38
  84. package/lib/render/views/iframe/design-tokens/index.js +3 -3
  85. package/lib/render/views/iframe/design-tokens/sizes.js +35 -35
  86. package/lib/render/views/iframe/design-tokens/typography.js +37 -37
  87. package/lib/render/views/iframe/docs.js +42 -42
  88. package/lib/render/views/iframe/index.js +28 -28
  89. package/lib/render/views/iframe/variation.js +89 -89
  90. package/lib/render/views/iframe/variation.standalone.js +69 -68
  91. package/lib/render/views/main/component.docs.js +38 -38
  92. package/lib/render/views/main/component.js +55 -55
  93. package/lib/render/views/main/design-tokens.js +38 -38
  94. package/lib/render/views/main/docs.js +33 -33
  95. package/lib/render/views/main/index.js +33 -33
  96. package/lib/state/components.js +99 -99
  97. package/lib/state/css.js +33 -33
  98. package/lib/state/docs.js +72 -72
  99. package/lib/state/file-contents.js +154 -154
  100. package/lib/state/helpers.js +53 -53
  101. package/lib/state/index.js +39 -39
  102. package/lib/state/menu/index.js +202 -202
  103. package/lib/state/menu/structure.js +84 -84
  104. package/lib/state/partials.js +12 -12
  105. package/lib/state/source-tree.js +51 -51
  106. package/lib/styleguide/color-names.js +148 -148
  107. package/lib/styleguide/colors.js +113 -113
  108. package/lib/styleguide/helpers.js +33 -33
  109. package/lib/styleguide/index.js +4 -4
  110. package/lib/styleguide/media-queries.js +18 -18
  111. package/lib/styleguide/spacings.js +22 -22
  112. package/lib/styleguide/typography.js +46 -46
  113. package/lib/validator/mocks.js +110 -83
  114. package/lib/validator/schemas.js +236 -227
  115. package/package.json +118 -117
@@ -5,375 +5,375 @@ import TextDirectionConfigSwitcher from "./config-switcher/text-direction.js";
5
5
  import DevelopmentModeConfigSwitcher from "./config-switcher/development-mode.js";
6
6
 
7
7
  class Main {
8
- /**
9
- *
10
- */
11
- constructor() {
12
- this.classes = {
13
- content: "Content",
14
- iframe: "Frame",
15
- frameWrapper: "FrameWrapper",
16
- toggleMenu: "Menu-toggleMobileMenu",
17
- menu: {
18
- rootLink: "Title-link",
19
- list: "Nav-list",
20
- children: "Nav-children",
21
- link: "Nav-item--link",
22
- variant: "Nav-variant",
23
- listItem: "Nav-entry",
24
- toggleComponent: "Nav-toggle",
25
- },
26
- };
27
-
28
- this.elements = {
29
- rootLink: document.querySelector(`.${this.classes.menu.rootLink}`),
30
- content: document.querySelector(`.${this.classes.content}`),
31
- frameWrapper: document.querySelector(`.${this.classes.frameWrapper}`),
32
- iframe: document.querySelector(`.${this.classes.iframe}`),
33
- toggleMenu: document.querySelector(`.${this.classes.toggleMenu}`),
34
- children: Array.from(
35
- document.querySelectorAll(`.${this.classes.menu.children}`),
36
- ),
37
- links: Array.from(
38
- document.querySelectorAll(
39
- `.${this.classes.menu.link}, .${this.classes.menu.variant}`,
40
- ),
41
- ),
42
- componentToggles: Array.from(
43
- document.querySelectorAll(`.${this.classes.menu.toggleComponent}`),
44
- ),
45
- };
46
-
47
- this.addToggleMenuClickListener();
48
- this.addComponentTogglesClickListener();
49
- this.addLinksClickListener();
50
- this.addPopStateLisener();
51
- this.addPageChangedListener();
52
-
53
- new ThemeConfigSwitcher(document.querySelector(".js-ThemeSwitcher"));
54
- new TextDirectionConfigSwitcher(
55
- document.querySelector(".js-TextDirectionSwitcher"),
56
- );
57
- new DevelopmentModeConfigSwitcher(
58
- document.querySelector(".js-DevelopmentModeSwitcher"),
59
- );
60
- }
61
-
62
- /**
63
- * @param {HTMLButtonElement} toggle
64
- */
65
- static toggleExpandedAttribute(toggle) {
66
- const open =
67
- toggle.getAttribute("aria-expanded") === "false" ? true : false;
68
- toggle.setAttribute("aria-expanded", open ? "true" : "false");
69
- document.getElementById(toggle.getAttribute("aria-controls")).hidden =
70
- !open;
71
- }
72
-
73
- /**
74
- * @param {string} src
75
- */
76
- updateIframe(src) {
77
- this.elements.iframe.remove();
78
- this.elements.iframe.src = src;
79
- this.elements.frameWrapper.appendChild(this.elements.iframe);
80
- }
81
-
82
- /**
83
- * @param {string} path
84
- * @returns {string}
85
- */
86
- convertPathToMainPath(path) {
87
- return path
88
- .replace(this.paths.embedded, this.paths.container)
89
- .replace(this.embeddedParam, "");
90
- }
91
-
92
- /**
93
- * @param {HTMLElement} target
94
- */
95
- closeOtherOpenedComponents(target) {
96
- this.elements.componentToggles.forEach((toggle) => {
97
- if (toggle.getAttribute("aria-expanded") === "true") {
98
- if (
99
- !toggle.closest(`.${this.classes.menu.listItem}`).contains(target)
100
- ) {
101
- toggle.setAttribute("aria-expanded", false);
102
- }
103
- }
104
- });
105
- }
106
-
107
- /**
108
- * @param {HTMLElement} listContainer
109
- */
110
- openParentComponent(listContainer) {
111
- if (listContainer) {
112
- const toggle = this.elements.componentToggles.find(
113
- (toggle) => toggle.getAttribute("aria-controls") === listContainer.id,
114
- );
115
-
116
- if (toggle) {
117
- toggle.setAttribute("aria-expanded", true);
118
-
119
- this.openParentComponent(
120
- toggle.closest(`.${this.classes.menu.listContainer}`),
121
- );
122
- }
123
- }
124
- }
125
-
126
- /**
127
- * @param {string} query
128
- * @returns {HTMLElement}
129
- */
130
- setActiveStateInNav(query) {
131
- {
132
- var target = this.elements.links.find(
133
- (link) =>
134
- query == link.getAttribute("href") ||
135
- link.getAttribute("href") ==
136
- query.replace(this.paths.container, this.paths.embedded),
137
- );
138
-
139
- if (target) {
140
- const prevEl = target.previousElementSibling;
141
- var toggle =
142
- prevEl && prevEl.classList.contains(this.classes.menu.toggleComponent)
143
- ? prevEl
144
- : null;
145
- }
146
- }
147
-
148
- const current = this.elements.links.find((link) =>
149
- link.getAttribute("aria-current"),
150
- );
151
-
152
- if (current) {
153
- current.removeAttribute("aria-current");
154
- }
155
-
156
- if (target) {
157
- target.setAttribute("aria-current", "page");
158
- }
159
-
160
- if (toggle) {
161
- toggle.setAttribute("aria-expanded", "true");
162
- document.getElementById(toggle.getAttribute("aria-controls")).hidden =
163
- false;
164
- }
165
-
166
- return target;
167
- }
168
-
169
- /**
170
- * @param {HTMLElement} target
171
- */
172
- openParentComponents(target) {
173
- this.openParentComponent(
174
- target.closest(`.${this.classes.menu.listContainer}`),
175
- );
176
- }
177
-
178
- /**
179
- *
180
- */
181
- closeToggleMenu() {
182
- if (window.innerWidth <= 512) {
183
- this.elements.toggleMenu.setAttribute("aria-expanded", false);
184
- }
185
- }
186
-
187
- /**
188
- * @param {string} src
189
- */
190
- updateUrl(src) {
191
- if (src.startsWith("iframe-")) {
192
- history.pushState(null, src, src.replace("iframe-", ""));
193
- } else if (src.startsWith("/iframe")) {
194
- history.pushState(null, src, src.replace("/iframe", ""));
195
- } else if (src === this.indexPath) {
196
- history.pushState(null, src, document.querySelector("base").href);
197
- } else {
198
- history.pushState(null, src, this.convertPathToMainPath(src));
199
- }
200
- }
201
-
202
- // events
203
-
204
- /**
205
- *
206
- * @param {Event} root0
207
- * @param {object} root0.detail
208
- */
209
- onPageChanged({ detail: query }) {
210
- const target = this.setActiveStateInNav(query);
211
-
212
- if (target) {
213
- this.closeOtherOpenedComponents(target);
214
- this.openParentComponents(target);
215
- }
216
-
217
- history.pushState(null, query, this.convertPathToMainPath(query));
218
- }
219
-
220
- /**
221
- * @param {HTMLButtonElement} toggle
222
- */
223
- onToggleMenuClick(toggle) {
224
- Main.toggleExpandedAttribute(toggle);
225
- }
226
-
227
- /**
228
- * @param {HTMLButtonElement} toggle
229
- */
230
- onComponentToggleClick(toggle) {
231
- Main.toggleExpandedAttribute(toggle);
232
- }
233
-
234
- /**
235
- * @param {HTMLElement} link
236
- */
237
- onRootLinkClick(link) {
238
- const anchor = link.closest("a");
239
- const src = anchor.getAttribute("href");
240
-
241
- anchor.setAttribute("aria-current", "page");
242
-
243
- this.elements.componentToggles.forEach((toggle) => {
244
- toggle.setAttribute(
245
- "aria-expanded",
246
- toggle.closest(".Nav-entry")?.classList.contains("Nav-entry--lvl0"),
247
- );
248
- });
249
-
250
- this.elements.links.forEach((link) => {
251
- link.removeAttribute("aria-current");
252
- });
253
-
254
- this.elements.children.forEach((list) => {
255
- list.hidden = !list
256
- .closest(".Nav-entry")
257
- ?.classList.contains("Nav-entry--lvl0");
258
- });
259
-
260
- this.updateIframe(src);
261
- this.closeToggleMenu();
262
- this.updateUrl(src);
263
- }
264
-
265
- /**
266
- * @param {HTMLElement} link
267
- */
268
- onLinkClick(link) {
269
- const src = link.closest("a").getAttribute("href");
270
-
271
- this.setActiveStateInNav(src);
272
- this.updateIframe(src);
273
- this.closeToggleMenu();
274
- this.updateUrl(src);
275
- }
276
-
277
- /**
278
- * @param {string} path
279
- */
280
- onPopState(path) {
281
- const target = this.setActiveStateInNav(path);
282
-
283
- this.updateIframe(path);
284
-
285
- if (target) {
286
- this.closeOtherOpenedComponents(target);
287
- this.openParentComponents(target);
288
- }
289
- }
290
-
291
- // listeners
292
-
293
- /**
294
- * @returns {void}
295
- */
296
- addToggleMenuClickListener() {
297
- if (this.elements.toggleMenu) {
298
- this.elements.toggleMenu.addEventListener("click", (e) => {
299
- e.preventDefault();
300
-
301
- this.onToggleMenuClick(e.target);
302
- });
303
-
304
- this.elements.toggleMenu.addEventListener("keyup", (e) => {
305
- if (e.keyCode === 23) {
306
- e.preventDefault();
307
-
308
- this.onToggleMenuClick(e.target);
309
- }
310
- });
311
- }
312
- }
313
-
314
- /**
315
- * @returns {void}
316
- */
317
- addComponentTogglesClickListener() {
318
- this.elements.componentToggles.forEach((toggle) => {
319
- toggle.addEventListener("click", (e) => {
320
- e.preventDefault();
321
-
322
- this.onComponentToggleClick(e.target);
323
- });
324
-
325
- toggle.addEventListener("keyup", (e) => {
326
- if (e.keyCode === 32) {
327
- e.preventDefault();
328
-
329
- this.onComponentToggleClick(e.target);
330
- }
331
- });
332
- });
333
- }
334
-
335
- /**
336
- * @returns {void}
337
- */
338
- addLinksClickListener() {
339
- this.elements.rootLink.addEventListener("click", (e) => {
340
- if (!e.metaKey && !e.ctrlKey) {
341
- e.preventDefault();
342
- this.onRootLinkClick(e.target);
343
- }
344
- });
345
-
346
- this.elements.links.forEach((link) => {
347
- link.addEventListener("click", (e) => {
348
- if (!e.metaKey && !e.ctrlKey) {
349
- e.preventDefault();
350
- this.onLinkClick(e.target);
351
- }
352
- });
353
-
354
- link.addEventListener("keyup", (e) => {
355
- if (e.keyCode === 32) {
356
- e.preventDefault();
357
-
358
- this.onLinkClick(e.target);
359
- }
360
- });
361
- });
362
- }
363
-
364
- /**
365
- * @returns {void}
366
- */
367
- addPopStateLisener() {
368
- window.addEventListener("popstate", this.onPopState.bind(this));
369
- }
370
-
371
- /**
372
- * @returns {void}
373
- */
374
- addPageChangedListener() {
375
- window.addEventListener("pageChanged", this.onPageChanged.bind(this));
376
- }
8
+ /**
9
+ *
10
+ */
11
+ constructor() {
12
+ this.classes = {
13
+ content: "Content",
14
+ iframe: "Frame",
15
+ frameWrapper: "FrameWrapper",
16
+ toggleMenu: "Menu-toggleMobileMenu",
17
+ menu: {
18
+ rootLink: "Title-link",
19
+ list: "Nav-list",
20
+ children: "Nav-children",
21
+ link: "Nav-item--link",
22
+ variant: "Nav-variant",
23
+ listItem: "Nav-entry",
24
+ toggleComponent: "Nav-toggle",
25
+ },
26
+ };
27
+
28
+ this.elements = {
29
+ rootLink: document.querySelector(`.${this.classes.menu.rootLink}`),
30
+ content: document.querySelector(`.${this.classes.content}`),
31
+ frameWrapper: document.querySelector(`.${this.classes.frameWrapper}`),
32
+ iframe: document.querySelector(`.${this.classes.iframe}`),
33
+ toggleMenu: document.querySelector(`.${this.classes.toggleMenu}`),
34
+ children: Array.from(
35
+ document.querySelectorAll(`.${this.classes.menu.children}`),
36
+ ),
37
+ links: Array.from(
38
+ document.querySelectorAll(
39
+ `.${this.classes.menu.link}, .${this.classes.menu.variant}`,
40
+ ),
41
+ ),
42
+ componentToggles: Array.from(
43
+ document.querySelectorAll(`.${this.classes.menu.toggleComponent}`),
44
+ ),
45
+ };
46
+
47
+ this.addToggleMenuClickListener();
48
+ this.addComponentTogglesClickListener();
49
+ this.addLinksClickListener();
50
+ this.addPopStateLisener();
51
+ this.addPageChangedListener();
52
+
53
+ new ThemeConfigSwitcher(document.querySelector(".js-ThemeSwitcher"));
54
+ new TextDirectionConfigSwitcher(
55
+ document.querySelector(".js-TextDirectionSwitcher"),
56
+ );
57
+ new DevelopmentModeConfigSwitcher(
58
+ document.querySelector(".js-DevelopmentModeSwitcher"),
59
+ );
60
+ }
61
+
62
+ /**
63
+ * @param {HTMLButtonElement} toggle
64
+ */
65
+ static toggleExpandedAttribute(toggle) {
66
+ const open =
67
+ toggle.getAttribute("aria-expanded") === "false" ? true : false;
68
+ toggle.setAttribute("aria-expanded", open ? "true" : "false");
69
+ document.getElementById(toggle.getAttribute("aria-controls")).hidden =
70
+ !open;
71
+ }
72
+
73
+ /**
74
+ * @param {string} src
75
+ */
76
+ updateIframe(src) {
77
+ this.elements.iframe.remove();
78
+ this.elements.iframe.src = src;
79
+ this.elements.frameWrapper.appendChild(this.elements.iframe);
80
+ }
81
+
82
+ /**
83
+ * @param {string} path
84
+ * @returns {string}
85
+ */
86
+ convertPathToMainPath(path) {
87
+ return path
88
+ .replace(this.paths.embedded, this.paths.container)
89
+ .replace(this.embeddedParam, "");
90
+ }
91
+
92
+ /**
93
+ * @param {HTMLElement} target
94
+ */
95
+ closeOtherOpenedComponents(target) {
96
+ this.elements.componentToggles.forEach((toggle) => {
97
+ if (toggle.getAttribute("aria-expanded") === "true") {
98
+ if (
99
+ !toggle.closest(`.${this.classes.menu.listItem}`).contains(target)
100
+ ) {
101
+ toggle.setAttribute("aria-expanded", false);
102
+ }
103
+ }
104
+ });
105
+ }
106
+
107
+ /**
108
+ * @param {HTMLElement} listContainer
109
+ */
110
+ openParentComponent(listContainer) {
111
+ if (listContainer) {
112
+ const toggle = this.elements.componentToggles.find(
113
+ (toggle) => toggle.getAttribute("aria-controls") === listContainer.id,
114
+ );
115
+
116
+ if (toggle) {
117
+ toggle.setAttribute("aria-expanded", true);
118
+
119
+ this.openParentComponent(
120
+ toggle.closest(`.${this.classes.menu.listContainer}`),
121
+ );
122
+ }
123
+ }
124
+ }
125
+
126
+ /**
127
+ * @param {string} query
128
+ * @returns {HTMLElement}
129
+ */
130
+ setActiveStateInNav(query) {
131
+ {
132
+ var target = this.elements.links.find(
133
+ (link) =>
134
+ query == link.getAttribute("href") ||
135
+ link.getAttribute("href") ==
136
+ query.replace(this.paths.container, this.paths.embedded),
137
+ );
138
+
139
+ if (target) {
140
+ const prevEl = target.previousElementSibling;
141
+ var toggle =
142
+ prevEl && prevEl.classList.contains(this.classes.menu.toggleComponent)
143
+ ? prevEl
144
+ : null;
145
+ }
146
+ }
147
+
148
+ const current = this.elements.links.find((link) =>
149
+ link.getAttribute("aria-current"),
150
+ );
151
+
152
+ if (current) {
153
+ current.removeAttribute("aria-current");
154
+ }
155
+
156
+ if (target) {
157
+ target.setAttribute("aria-current", "page");
158
+ }
159
+
160
+ if (toggle) {
161
+ toggle.setAttribute("aria-expanded", "true");
162
+ document.getElementById(toggle.getAttribute("aria-controls")).hidden =
163
+ false;
164
+ }
165
+
166
+ return target;
167
+ }
168
+
169
+ /**
170
+ * @param {HTMLElement} target
171
+ */
172
+ openParentComponents(target) {
173
+ this.openParentComponent(
174
+ target.closest(`.${this.classes.menu.listContainer}`),
175
+ );
176
+ }
177
+
178
+ /**
179
+ *
180
+ */
181
+ closeToggleMenu() {
182
+ if (window.innerWidth <= 512) {
183
+ this.elements.toggleMenu.setAttribute("aria-expanded", false);
184
+ }
185
+ }
186
+
187
+ /**
188
+ * @param {string} src
189
+ */
190
+ updateUrl(src) {
191
+ if (src.startsWith("iframe-")) {
192
+ history.pushState(null, src, src.replace("iframe-", ""));
193
+ } else if (src.startsWith("/iframe")) {
194
+ history.pushState(null, src, src.replace("/iframe", ""));
195
+ } else if (src === this.indexPath) {
196
+ history.pushState(null, src, document.querySelector("base").href);
197
+ } else {
198
+ history.pushState(null, src, this.convertPathToMainPath(src));
199
+ }
200
+ }
201
+
202
+ // events
203
+
204
+ /**
205
+ *
206
+ * @param {Event} root0
207
+ * @param {object} root0.detail
208
+ */
209
+ onPageChanged({ detail: query }) {
210
+ const target = this.setActiveStateInNav(query);
211
+
212
+ if (target) {
213
+ this.closeOtherOpenedComponents(target);
214
+ this.openParentComponents(target);
215
+ }
216
+
217
+ history.pushState(null, query, this.convertPathToMainPath(query));
218
+ }
219
+
220
+ /**
221
+ * @param {HTMLButtonElement} toggle
222
+ */
223
+ onToggleMenuClick(toggle) {
224
+ Main.toggleExpandedAttribute(toggle);
225
+ }
226
+
227
+ /**
228
+ * @param {HTMLButtonElement} toggle
229
+ */
230
+ onComponentToggleClick(toggle) {
231
+ Main.toggleExpandedAttribute(toggle);
232
+ }
233
+
234
+ /**
235
+ * @param {HTMLElement} link
236
+ */
237
+ onRootLinkClick(link) {
238
+ const anchor = link.closest("a");
239
+ const src = anchor.getAttribute("href");
240
+
241
+ anchor.setAttribute("aria-current", "page");
242
+
243
+ this.elements.componentToggles.forEach((toggle) => {
244
+ toggle.setAttribute(
245
+ "aria-expanded",
246
+ toggle.closest(".Nav-entry")?.classList.contains("Nav-entry--lvl0"),
247
+ );
248
+ });
249
+
250
+ this.elements.links.forEach((link) => {
251
+ link.removeAttribute("aria-current");
252
+ });
253
+
254
+ this.elements.children.forEach((list) => {
255
+ list.hidden = !list
256
+ .closest(".Nav-entry")
257
+ ?.classList.contains("Nav-entry--lvl0");
258
+ });
259
+
260
+ this.updateIframe(src);
261
+ this.closeToggleMenu();
262
+ this.updateUrl(src);
263
+ }
264
+
265
+ /**
266
+ * @param {HTMLElement} link
267
+ */
268
+ onLinkClick(link) {
269
+ const src = link.closest("a").getAttribute("href");
270
+
271
+ this.setActiveStateInNav(src);
272
+ this.updateIframe(src);
273
+ this.closeToggleMenu();
274
+ this.updateUrl(src);
275
+ }
276
+
277
+ /**
278
+ * @param {string} path
279
+ */
280
+ onPopState(path) {
281
+ const target = this.setActiveStateInNav(path);
282
+
283
+ this.updateIframe(path);
284
+
285
+ if (target) {
286
+ this.closeOtherOpenedComponents(target);
287
+ this.openParentComponents(target);
288
+ }
289
+ }
290
+
291
+ // listeners
292
+
293
+ /**
294
+ * @returns {void}
295
+ */
296
+ addToggleMenuClickListener() {
297
+ if (this.elements.toggleMenu) {
298
+ this.elements.toggleMenu.addEventListener("click", (e) => {
299
+ e.preventDefault();
300
+
301
+ this.onToggleMenuClick(e.target);
302
+ });
303
+
304
+ this.elements.toggleMenu.addEventListener("keyup", (e) => {
305
+ if (e.keyCode === 23) {
306
+ e.preventDefault();
307
+
308
+ this.onToggleMenuClick(e.target);
309
+ }
310
+ });
311
+ }
312
+ }
313
+
314
+ /**
315
+ * @returns {void}
316
+ */
317
+ addComponentTogglesClickListener() {
318
+ this.elements.componentToggles.forEach((toggle) => {
319
+ toggle.addEventListener("click", (e) => {
320
+ e.preventDefault();
321
+
322
+ this.onComponentToggleClick(e.target);
323
+ });
324
+
325
+ toggle.addEventListener("keyup", (e) => {
326
+ if (e.keyCode === 32) {
327
+ e.preventDefault();
328
+
329
+ this.onComponentToggleClick(e.target);
330
+ }
331
+ });
332
+ });
333
+ }
334
+
335
+ /**
336
+ * @returns {void}
337
+ */
338
+ addLinksClickListener() {
339
+ this.elements.rootLink.addEventListener("click", (e) => {
340
+ if (!e.metaKey && !e.ctrlKey) {
341
+ e.preventDefault();
342
+ this.onRootLinkClick(e.target);
343
+ }
344
+ });
345
+
346
+ this.elements.links.forEach((link) => {
347
+ link.addEventListener("click", (e) => {
348
+ if (!e.metaKey && !e.ctrlKey) {
349
+ e.preventDefault();
350
+ this.onLinkClick(e.target);
351
+ }
352
+ });
353
+
354
+ link.addEventListener("keyup", (e) => {
355
+ if (e.keyCode === 32) {
356
+ e.preventDefault();
357
+
358
+ this.onLinkClick(e.target);
359
+ }
360
+ });
361
+ });
362
+ }
363
+
364
+ /**
365
+ * @returns {void}
366
+ */
367
+ addPopStateLisener() {
368
+ window.addEventListener("popstate", this.onPopState.bind(this));
369
+ }
370
+
371
+ /**
372
+ * @returns {void}
373
+ */
374
+ addPageChangedListener() {
375
+ window.addEventListener("pageChanged", this.onPageChanged.bind(this));
376
+ }
377
377
  }
378
378
 
379
379
  export default Main;