@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,190 @@
1
+ import { search as searchIsTriggered } from "./_is-triggered.js";
2
+
3
+ document.addEventListener("DOMContentLoaded", () => {
4
+ const SEARCH_INPUT = document.querySelector(".Search-input");
5
+ const SEARCH_CLEAR = document.querySelector(".Search-clear");
6
+
7
+ const COMPONENTS = Array.from(document.querySelectorAll(".Nav-item")).map(
8
+ (node) => {
9
+ return {
10
+ node,
11
+ listItem: node.closest(".Nav-entry"),
12
+ label: node.textContent,
13
+ lowercaseLabel: node.textContent.toLowerCase(),
14
+ matchesQuery: false,
15
+ toggle: node.previousElementSibling || null,
16
+ parentToggles: getParentToggles(node),
17
+ initiallyOpened: node.previousElementSibling
18
+ ? node.previousElementSibling.getAttribute("aria-expanded") === "true"
19
+ ? true
20
+ : false
21
+ : false,
22
+ };
23
+ },
24
+ );
25
+
26
+ if (SEARCH_INPUT) {
27
+ if (SEARCH_CLEAR) {
28
+ SEARCH_CLEAR.addEventListener("click", onClearSearch);
29
+ }
30
+
31
+ SEARCH_INPUT.addEventListener("input", onInputSearch);
32
+ SEARCH_INPUT.addEventListener("keyup", onInputKeyup);
33
+
34
+ window.addEventListener("keyup", (e) => {
35
+ const { path, originalTarget, target, key } = e;
36
+ const el = path ? path[0] : originalTarget || target;
37
+
38
+ if (searchIsTriggered(el, key)) {
39
+ SEARCH_INPUT.focus();
40
+ }
41
+ });
42
+ window.addEventListener("searchTriggered", () => {
43
+ SEARCH_INPUT.focus();
44
+ });
45
+ }
46
+
47
+ /**
48
+ * @returns {void}
49
+ */
50
+ function onClearSearch() {
51
+ SEARCH_INPUT.value = "";
52
+ resetMenu();
53
+ }
54
+
55
+ /**
56
+ * @param {object} event
57
+ * @param {HTMLInputElement} event.target
58
+ */
59
+ function onInputSearch({ target }) {
60
+ const QUERY = target.value.toLowerCase();
61
+
62
+ if (QUERY.length > 0) {
63
+ updateMenu(QUERY);
64
+ } else {
65
+ resetMenu();
66
+ }
67
+ }
68
+
69
+ /**
70
+ * @param {object} root0
71
+ * @param {HTMLInputElement} root0.target
72
+ * @param {string} root0.key
73
+ */
74
+ function onInputKeyup({ target, key }) {
75
+ if (key.toLowerCase() === "escape") {
76
+ target.value = "";
77
+ target.blur();
78
+ resetMenu();
79
+ }
80
+ }
81
+
82
+ /**
83
+ * @param {string} query
84
+ */
85
+ function updateMenu(query) {
86
+ SEARCH_CLEAR.hidden = false;
87
+
88
+ COMPONENTS.forEach((component) => {
89
+ if (component.toggle) {
90
+ document.getElementById(
91
+ component.toggle.getAttribute("aria-controls"),
92
+ ).hidden = true;
93
+ component.toggle.setAttribute("aria-expanded", "false");
94
+ }
95
+ component.parentToggles.forEach((toggle) => {
96
+ toggle.parentNode.classList.remove("has-match");
97
+ });
98
+ });
99
+
100
+ COMPONENTS.forEach((component) => {
101
+ component.matchesQuery = component.lowercaseLabel.includes(query);
102
+ component.listItem.classList.toggle("is-match", component.matchesQuery);
103
+ component.listItem.classList.toggle(
104
+ "is-no-match",
105
+ !component.matchesQuery,
106
+ );
107
+
108
+ if (component.matchesQuery) {
109
+ component.node.innerHTML = component.label.replace(
110
+ new RegExp(query, "g"),
111
+ `<mark>${query}</mark>`,
112
+ );
113
+ component.parentToggles.forEach((toggle) => {
114
+ toggle.parentNode.classList.add("has-match");
115
+ toggle.parentNode.classList.remove("has-no-match");
116
+ document.getElementById(toggle.getAttribute("aria-controls")).hidden =
117
+ false;
118
+ toggle.setAttribute("aria-expanded", "true");
119
+ });
120
+ } else {
121
+ component.node.textContent = component.label;
122
+ }
123
+ });
124
+
125
+ COMPONENTS.forEach((component) => {
126
+ if (!component.listItem.classList.contains("has-match")) {
127
+ component.listItem.classList.add("has-no-match");
128
+ }
129
+ });
130
+ }
131
+
132
+ /**
133
+ * @returns {void}
134
+ */
135
+ function resetMenu() {
136
+ SEARCH_CLEAR.hidden = true;
137
+
138
+ COMPONENTS.forEach((component) => {
139
+ if (component.matchesQuery) {
140
+ component.node.textContent = component.label;
141
+ }
142
+
143
+ component.matchesQuery = false;
144
+
145
+ if (component.toggle) {
146
+ document.getElementById(
147
+ component.toggle.getAttribute("aria-controls"),
148
+ ).hidden = !component.initiallyOpened;
149
+ component.toggle.setAttribute(
150
+ "aria-expanded",
151
+ component.initiallyOpened ? "true" : "false",
152
+ );
153
+ }
154
+ });
155
+
156
+ document
157
+ .querySelectorAll(".is-match, .is-no-match, .has-match, .has-no-match")
158
+ .forEach((el) =>
159
+ el.classList.remove(
160
+ "is-match",
161
+ "is-no-match",
162
+ "has-match",
163
+ "has-no-match",
164
+ ),
165
+ );
166
+ }
167
+
168
+ /**
169
+ * @param {HTMLElement} node
170
+ * @returns {Array}
171
+ */
172
+ function getParentToggles(node) {
173
+ const parentToggles = [];
174
+ let element = node;
175
+
176
+ while (element.closest(".Nav-entry").parentNode.closest(".Nav-entry")) {
177
+ const toggle = element
178
+ .closest(".Nav-entry")
179
+ .parentNode.closest(".Nav-entry")
180
+ .querySelector(".Nav-toggle");
181
+
182
+ if (toggle) {
183
+ parentToggles.push(toggle);
184
+ }
185
+ element = element.closest(".Nav-entry").parentNode.closest(".Nav-entry");
186
+ }
187
+
188
+ return parentToggles;
189
+ }
190
+ });
@@ -0,0 +1,9 @@
1
+ const ws = new WebSocket(`ws://${document.location.host}`);
2
+
3
+ ws.onmessage = async (message) => {
4
+ if (message.data === "reloadParent") {
5
+ parent.window.location.reload();
6
+ } else {
7
+ window.location.reload();
8
+ }
9
+ };
@@ -0,0 +1,49 @@
1
+ import ConfigSwitcher from "./index.js";
2
+
3
+ class DevelopmentModeConfigSwitcher extends ConfigSwitcher {
4
+ /**
5
+ * @param {HTMLFormElement} form
6
+ * @memberof DevelopmentModeConfigSwitcher
7
+ */
8
+ constructor(form) {
9
+ super(form);
10
+
11
+ if (window.frames.iframe) {
12
+ window.frames.iframe.addEventListener("load", () => {
13
+ if (this.cookieValue) {
14
+ this.renderTheme(this.cookieValue);
15
+ }
16
+ });
17
+ }
18
+ }
19
+
20
+ /**
21
+ * @param {Event} event
22
+ * @param {HTMLInputElement} event.target
23
+ */
24
+ onThemeChange({ target }) {
25
+ const value = target.checked ? "dev" : "presentation";
26
+
27
+ this.saveTheme(value);
28
+ this.renderTheme(value);
29
+ }
30
+
31
+ /**
32
+ * @param {string} value
33
+ */
34
+ renderSwitcher() {
35
+ if (this.cookieValue) {
36
+ this.form.querySelector('[type="checkbox"]').checked =
37
+ this.cookieValue == "dev";
38
+ }
39
+ }
40
+
41
+ /**
42
+ * @param {string} value
43
+ */
44
+ renderTheme(value) {
45
+ window.frames.iframe.document.documentElement.dataset.mode = value;
46
+ }
47
+ }
48
+
49
+ export default DevelopmentModeConfigSwitcher;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @typedef {"auto" | "light" | "dark"} Theme
3
+ */
4
+
5
+ class ConfigSwitcher {
6
+ /**
7
+ * @param {HTMLElement} form
8
+ */
9
+ constructor(form) {
10
+ this.form = form;
11
+ this.inputs = Array.from(
12
+ this.form.querySelectorAll('[type="radio"], [type="checkbox"]'),
13
+ );
14
+ this.options = this.inputs.map((el) => el.value);
15
+ this.name = this.inputs[0].name;
16
+ this.cookieName = `miyagi_${document.title.replaceAll(" ", "-")}_${this.name}`;
17
+ this.cookieValue = this.#getCookie(this.cookieName);
18
+
19
+ this.inputs.forEach((input) => {
20
+ input.addEventListener("change", this.onThemeChange.bind(this));
21
+ });
22
+
23
+ this.renderSwitcher();
24
+ }
25
+
26
+ /**
27
+ * @param {Event} event
28
+ * @param {HTMLInputElement} event.target
29
+ */
30
+ onThemeChange({ target }) {
31
+ const { value } = target;
32
+
33
+ this.saveTheme(value);
34
+ this.renderTheme(value);
35
+ }
36
+
37
+ /**
38
+ * @param {string} value
39
+ */
40
+ saveTheme(value) {
41
+ document.cookie = `${this.cookieName}=${value};`;
42
+ }
43
+
44
+ /**
45
+ * @param {Theme} value
46
+ */
47
+ renderSwitcher() {
48
+ const input = this.form.querySelector(`[value="${this.cookieValue}"]`);
49
+
50
+ if (input) {
51
+ input.checked = true;
52
+ }
53
+ }
54
+
55
+ #getCookie(name) {
56
+ return document.cookie.split("; ").reduce((r, v) => {
57
+ const parts = v.split("=");
58
+ return parts[0] === name ? decodeURIComponent(parts[1]) : r;
59
+ }, "");
60
+ }
61
+ }
62
+
63
+ export default ConfigSwitcher;
@@ -0,0 +1,30 @@
1
+ import ConfigSwitcher from "./index.js";
2
+
3
+ class TextDirectionConfigSwitcher extends ConfigSwitcher {
4
+ /**
5
+ * @param {HTMLFormElement} form
6
+ * @memberof TextDirectionConfigSwitcher
7
+ */
8
+ constructor(form) {
9
+ super(form);
10
+
11
+ if (window.frames.iframe) {
12
+ window.frames.iframe.addEventListener("load", () => {
13
+ if (this.cookieValue) {
14
+ this.renderTheme(this.cookieValue);
15
+ }
16
+ });
17
+ }
18
+ }
19
+
20
+ /**
21
+ * @param {string} value
22
+ */
23
+ renderTheme(value) {
24
+ Array.from(window.frames.iframe.frames).forEach((frame) => {
25
+ frame.document.documentElement.setAttribute("dir", value);
26
+ });
27
+ }
28
+ }
29
+
30
+ export default TextDirectionConfigSwitcher;
@@ -0,0 +1,87 @@
1
+ import ConfigSwitcher from "./index.js";
2
+
3
+ class ThemeConfigSwitcher extends ConfigSwitcher {
4
+ /**
5
+ * @param {HTMLFormElement} form
6
+ * @memberof ThemeConfigSwitcher
7
+ */
8
+ constructor(form) {
9
+ super(form);
10
+
11
+ this.logoWrapper = document.querySelector(".Title-logo");
12
+ if (this.logoWrapper) {
13
+ this.logoImage = this.logoWrapper.querySelector("img");
14
+ }
15
+
16
+ if (window.frames.iframe) {
17
+ if (this.cookieValue) {
18
+ this.render(this.cookieValue);
19
+ }
20
+
21
+ window.frames.iframe.addEventListener("load", () => {
22
+ if (this.cookieValue) {
23
+ this.renderTheme(this.cookieValue);
24
+ }
25
+ });
26
+ }
27
+ }
28
+
29
+ onThemeChange({ target }) {
30
+ super.onThemeChange({ target });
31
+
32
+ this.render(target.value);
33
+ }
34
+
35
+ /**
36
+ * @param {string} value
37
+ */
38
+ renderTheme(value) {
39
+ this.options.forEach((option) => {
40
+ if (window.frames.iframe.document.documentElement) {
41
+ window.frames.iframe.document.documentElement.classList.remove(
42
+ `theme-${option}`,
43
+ );
44
+ }
45
+
46
+ Array.from(window.frames.iframe.frames).forEach((frame) => {
47
+ frame.document.documentElement.classList.remove(`theme-${option}`);
48
+ });
49
+ });
50
+
51
+ window.frames.iframe.document.documentElement.classList.add(
52
+ `theme-${value}`,
53
+ );
54
+ Array.from(window.frames.iframe.frames).forEach((frame) => {
55
+ frame.document.documentElement.classList.add(`theme-${value}`);
56
+ });
57
+ }
58
+
59
+ render(value) {
60
+ this.options.forEach((option) => {
61
+ document.documentElement.classList.remove(`${this.name}-${option}`);
62
+ });
63
+
64
+ document.documentElement.classList.add(`${this.name}-${value}`);
65
+
66
+ if (this.logoWrapper) {
67
+ if (value === "auto") {
68
+ this.options.forEach((option) => {
69
+ if (option === "auto") return;
70
+
71
+ const source = document.createElement("source");
72
+ source.srcset = this.logoImage.dataset[option];
73
+ source.media = `(prefers-color-scheme: ${option})`;
74
+
75
+ this.logoWrapper.prepend(source);
76
+ });
77
+ } else {
78
+ this.logoWrapper
79
+ .querySelectorAll("source")
80
+ .forEach((source) => source.remove());
81
+ this.logoImage.src = this.logoImage.dataset[value];
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ export default ThemeConfigSwitcher;
@@ -0,0 +1,43 @@
1
+ import "./_accordion-tabs.js";
2
+ import "./_prism.js";
3
+ import "./_iframe-links.js";
4
+ import {
5
+ goto as gotoIsTriggered,
6
+ search as searchIsTriggered,
7
+ } from "./_is-triggered.js";
8
+
9
+ if (
10
+ window.location.pathname.startsWith("/component-") &&
11
+ window.location.href.endsWith("-embedded.html") &&
12
+ window.self === window.top
13
+ ) {
14
+ window.location = new URL(window.location).replace(
15
+ /-embedded\.html$/,
16
+ ".html",
17
+ );
18
+ }
19
+
20
+ document.addEventListener("DOMContentLoaded", function () {
21
+ const styleguide = document.querySelector(".Styleguide");
22
+
23
+ if (styleguide) {
24
+ import("./styleguide/index.js")
25
+ .then((Styleguide) => new Styleguide.default(styleguide))
26
+ .catch((err) => console.error(err));
27
+ }
28
+
29
+ if (document.querySelector(".js-openMockData")) {
30
+ import("./_mock-data.js");
31
+ }
32
+ });
33
+
34
+ document.addEventListener("keyup", (e) => {
35
+ const { path, originalTarget, target, key } = e;
36
+ const el = path ? path[0] : originalTarget || target;
37
+
38
+ if (searchIsTriggered(el, key)) {
39
+ parent.window.dispatchEvent(new CustomEvent("searchTriggered"));
40
+ } else if (gotoIsTriggered(el, key)) {
41
+ parent.window.dispatchEvent(new CustomEvent("gotoTriggered"));
42
+ }
43
+ });
@@ -0,0 +1,52 @@
1
+ import "./_accordion-tabs.js";
2
+ import "./_socket.js";
3
+ import {
4
+ goto as gotoIsTriggered,
5
+ search as searchIsTriggered,
6
+ } from "./_is-triggered.js";
7
+
8
+ if (
9
+ window.location.pathname.startsWith("/component?") &&
10
+ window.location.href.indexOf("&embedded=true") >= 0 &&
11
+ window.self === window.top
12
+ ) {
13
+ window.location = new URL(window.location).replace("&embedded=true", "");
14
+ }
15
+
16
+ document.addEventListener("DOMContentLoaded", function () {
17
+ const links = Array.from(document.querySelectorAll(".Component-file"));
18
+ const styleguide = document.querySelector(".Styleguide");
19
+
20
+ if (links.length > 0) {
21
+ import("./_iframe-links.js")
22
+ .then((module) => {
23
+ module.default(links);
24
+ })
25
+ .catch((err) => console.error(err));
26
+ }
27
+
28
+ if (document.querySelector(".Code")) {
29
+ import("./_prism.js");
30
+ }
31
+
32
+ if (styleguide) {
33
+ import("./styleguide/index.js")
34
+ .then((Styleguide) => new Styleguide.default(styleguide))
35
+ .catch((err) => console.error(err));
36
+ }
37
+
38
+ if (document.querySelector(".js-openMockData")) {
39
+ import("./_mock-data.js");
40
+ }
41
+ });
42
+
43
+ document.addEventListener("keyup", (e) => {
44
+ const { path, originalTarget, target, key } = e;
45
+ const el = path ? path[0] : originalTarget || target;
46
+
47
+ if (searchIsTriggered(el, key)) {
48
+ parent.window.dispatchEvent(new CustomEvent("searchTriggered"));
49
+ } else if (gotoIsTriggered(el, key)) {
50
+ parent.window.dispatchEvent(new CustomEvent("gotoTriggered"));
51
+ }
52
+ });