@schalkneethling/miyagi-core 4.0.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 (138) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +43 -0
  3. package/api/app.js +39 -0
  4. package/api/index.js +236 -0
  5. package/bin/miyagi.js +2 -0
  6. package/dist/css/iframe.css +31 -0
  7. package/dist/css/main.css +1 -0
  8. package/dist/js/_iframe-links-DdifIr4P.js +1 -0
  9. package/dist/js/_mock-data-Dypo4Bl_.js +1 -0
  10. package/dist/js/_prism-By3NMwUd.js +1 -0
  11. package/dist/js/iframe.build.js +1 -0
  12. package/dist/js/iframe.js +1 -0
  13. package/dist/js/index-BKDKaBC6.js +1 -0
  14. package/dist/js/jsontree.js +1 -0
  15. package/dist/js/main.build.js +1 -0
  16. package/dist/js/main.js +1 -0
  17. package/frontend/assets/css/iframe/accordion-tabs.css +77 -0
  18. package/frontend/assets/css/iframe/jsontree.js.css +325 -0
  19. package/frontend/assets/css/iframe/prism.css +132 -0
  20. package/frontend/assets/css/iframe/styleguide/colors.css +61 -0
  21. package/frontend/assets/css/iframe/styleguide/fonts.css +37 -0
  22. package/frontend/assets/css/iframe/styleguide/index.css +109 -0
  23. package/frontend/assets/css/iframe/styleguide/spacings.css +21 -0
  24. package/frontend/assets/css/iframe.css +410 -0
  25. package/frontend/assets/css/main/menu/config-switcher.css +49 -0
  26. package/frontend/assets/css/main/menu/config-switchers.css +67 -0
  27. package/frontend/assets/css/main/menu/goto.css +24 -0
  28. package/frontend/assets/css/main/menu/nav.css +113 -0
  29. package/frontend/assets/css/main/menu/search.css +64 -0
  30. package/frontend/assets/css/main/menu/title.css +40 -0
  31. package/frontend/assets/css/main/menu.css +114 -0
  32. package/frontend/assets/css/main/reset.css +217 -0
  33. package/frontend/assets/css/main.css +71 -0
  34. package/frontend/assets/css/shared.css +34 -0
  35. package/frontend/assets/css/tokens.css +112 -0
  36. package/frontend/assets/favicon.ico +0 -0
  37. package/frontend/assets/js/_accordion-tabs.js +403 -0
  38. package/frontend/assets/js/_goto.js +63 -0
  39. package/frontend/assets/js/_iframe-links.js +19 -0
  40. package/frontend/assets/js/_is-triggered.js +15 -0
  41. package/frontend/assets/js/_main.js +379 -0
  42. package/frontend/assets/js/_mock-data.js +13 -0
  43. package/frontend/assets/js/_prism.js +1098 -0
  44. package/frontend/assets/js/_search.js +190 -0
  45. package/frontend/assets/js/_socket.js +9 -0
  46. package/frontend/assets/js/config-switcher/development-mode.js +49 -0
  47. package/frontend/assets/js/config-switcher/index.js +63 -0
  48. package/frontend/assets/js/config-switcher/text-direction.js +30 -0
  49. package/frontend/assets/js/config-switcher/theme.js +87 -0
  50. package/frontend/assets/js/iframe.build.js +43 -0
  51. package/frontend/assets/js/iframe.js +52 -0
  52. package/frontend/assets/js/jsontree.js +979 -0
  53. package/frontend/assets/js/main.build.js +40 -0
  54. package/frontend/assets/js/main.js +42 -0
  55. package/frontend/assets/js/styleguide/color-converter.js +741 -0
  56. package/frontend/assets/js/styleguide/index.js +119 -0
  57. package/frontend/views/component_variation.twig.miyagi +57 -0
  58. package/frontend/views/design-tokens/colors.twig.miyagi +43 -0
  59. package/frontend/views/design-tokens/sizes.twig.miyagi +35 -0
  60. package/frontend/views/design-tokens/typography.twig.miyagi +38 -0
  61. package/frontend/views/iframe_component.twig.miyagi +141 -0
  62. package/frontend/views/iframe_component_variation.twig.miyagi +55 -0
  63. package/frontend/views/iframe_index.twig.miyagi +14 -0
  64. package/frontend/views/layouts/iframe_default.twig.miyagi +22 -0
  65. package/frontend/views/main.twig.miyagi +24 -0
  66. package/frontend/views/menu/config-switchers.twig.miyagi +83 -0
  67. package/frontend/views/menu/goto.twig.miyagi +9 -0
  68. package/frontend/views/menu/menu.twig.miyagi +21 -0
  69. package/frontend/views/menu/nav.twig.miyagi +95 -0
  70. package/frontend/views/menu/search.twig.miyagi +13 -0
  71. package/frontend/views/menu/title.twig.miyagi +24 -0
  72. package/index.js +3 -0
  73. package/lib/build/index.js +1020 -0
  74. package/lib/cli/app.js +38 -0
  75. package/lib/cli/component.js +56 -0
  76. package/lib/cli/index.js +5 -0
  77. package/lib/cli/lint.js +180 -0
  78. package/lib/config.js +74 -0
  79. package/lib/default-config.js +105 -0
  80. package/lib/generator/component.js +199 -0
  81. package/lib/generator/mocks.js +201 -0
  82. package/lib/helpers.js +184 -0
  83. package/lib/i18n/en.js +91 -0
  84. package/lib/i18n/index.js +17 -0
  85. package/lib/index.js +166 -0
  86. package/lib/init/args.js +55 -0
  87. package/lib/init/config.js +330 -0
  88. package/lib/init/engines.js +65 -0
  89. package/lib/init/index.js +102 -0
  90. package/lib/init/rendering.js +12 -0
  91. package/lib/init/router.js +249 -0
  92. package/lib/init/static.js +133 -0
  93. package/lib/init/twing/cache.js +34 -0
  94. package/lib/init/twing/functions.js +51 -0
  95. package/lib/init/views.js +19 -0
  96. package/lib/init/watcher.js +402 -0
  97. package/lib/logger.js +94 -0
  98. package/lib/mocks/get.js +111 -0
  99. package/lib/mocks/index.js +9 -0
  100. package/lib/mocks/resolve/ref.js +484 -0
  101. package/lib/mocks/resolve/tpl.js +246 -0
  102. package/lib/mocks/resolve.js +205 -0
  103. package/lib/render/helpers.js +51 -0
  104. package/lib/render/index.js +38 -0
  105. package/lib/render/views/iframe/component.docs.js +77 -0
  106. package/lib/render/views/iframe/component.js +338 -0
  107. package/lib/render/views/iframe/design-tokens/colors.js +52 -0
  108. package/lib/render/views/iframe/design-tokens/index.js +9 -0
  109. package/lib/render/views/iframe/design-tokens/sizes.js +49 -0
  110. package/lib/render/views/iframe/design-tokens/typography.js +52 -0
  111. package/lib/render/views/iframe/docs.js +68 -0
  112. package/lib/render/views/iframe/index.js +44 -0
  113. package/lib/render/views/iframe/variation.js +116 -0
  114. package/lib/render/views/iframe/variation.standalone.js +89 -0
  115. package/lib/render/views/main/component.docs.js +53 -0
  116. package/lib/render/views/main/component.js +74 -0
  117. package/lib/render/views/main/design-tokens.js +53 -0
  118. package/lib/render/views/main/docs.js +47 -0
  119. package/lib/render/views/main/index.js +46 -0
  120. package/lib/state/components.js +132 -0
  121. package/lib/state/css.js +50 -0
  122. package/lib/state/docs.js +111 -0
  123. package/lib/state/file-contents.js +207 -0
  124. package/lib/state/helpers.js +86 -0
  125. package/lib/state/index.js +56 -0
  126. package/lib/state/menu/index.js +275 -0
  127. package/lib/state/menu/structure.js +146 -0
  128. package/lib/state/partials.js +23 -0
  129. package/lib/state/source-tree.js +75 -0
  130. package/lib/styleguide/color-names.js +150 -0
  131. package/lib/styleguide/colors.js +135 -0
  132. package/lib/styleguide/helpers.js +37 -0
  133. package/lib/styleguide/index.js +17 -0
  134. package/lib/styleguide/media-queries.js +26 -0
  135. package/lib/styleguide/spacings.js +35 -0
  136. package/lib/styleguide/typography.js +61 -0
  137. package/lib/validator/mocks.js +105 -0
  138. package/package.json +117 -0
@@ -0,0 +1,379 @@
1
+ import "./_goto.js";
2
+ import "./_search.js";
3
+ import ThemeConfigSwitcher from "./config-switcher/theme.js";
4
+ import TextDirectionConfigSwitcher from "./config-switcher/text-direction.js";
5
+ import DevelopmentModeConfigSwitcher from "./config-switcher/development-mode.js";
6
+
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
+ }
377
+ }
378
+
379
+ export default Main;
@@ -0,0 +1,13 @@
1
+ const openMockData = Array.from(document.querySelectorAll(".js-openMockData"));
2
+
3
+ openMockData.forEach((button) => {
4
+ button.addEventListener("click", (e) => {
5
+ const target = document.getElementById(
6
+ e.target.closest("button").getAttribute("aria-controls"),
7
+ );
8
+
9
+ if (target) {
10
+ target.showModal();
11
+ }
12
+ });
13
+ });