@qld-gov-au/qgds-bootstrap5 1.1.39 → 1.1.41

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 (161) hide show
  1. package/dist/assets/components/bs5/backToTop/backToTop.hbs +1 -1
  2. package/dist/assets/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
  3. package/dist/assets/components/bs5/button/button.hbs +48 -30
  4. package/dist/assets/components/bs5/containerLayout/containerLayout.hbs +100 -0
  5. package/dist/assets/components/bs5/contentFooter/contentFooter.hbs +15 -4
  6. package/dist/assets/components/bs5/formcheck/formcheck.hbs +1 -1
  7. package/dist/assets/components/bs5/head/head.hbs +1 -1
  8. package/dist/assets/components/bs5/iconLink/iconLink.hbs +41 -0
  9. package/dist/assets/components/bs5/logo/logo.hbs +7 -0
  10. package/dist/assets/components/bs5/logo/logoCOALandscape.hbs +58 -0
  11. package/dist/assets/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
  12. package/dist/assets/components/bs5/navbar/navbar.hbs +65 -245
  13. package/dist/assets/components/bs5/pageLayout/pageLayout.hbs +11 -10
  14. package/dist/assets/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
  15. package/dist/assets/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
  16. package/dist/assets/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
  17. package/dist/assets/components/bs5/searchInput/searchInput.hbs +8 -10
  18. package/dist/assets/css/qld.bootstrap.css +1 -1
  19. package/dist/assets/css/qld.bootstrap.css.map +3 -3
  20. package/dist/assets/js/bootstrap.bundle.js +3 -6
  21. package/dist/assets/js/bootstrap.bundle.js.map +1 -1
  22. package/dist/assets/js/bootstrap.bundle.min.js +2 -2
  23. package/dist/assets/js/bootstrap.bundle.min.js.map +1 -1
  24. package/dist/assets/js/bootstrap.js +3 -6
  25. package/dist/assets/js/bootstrap.min.js +2 -2
  26. package/dist/assets/js/bootstrap.min.js.map +1 -1
  27. package/dist/assets/js/handlebars.helpers.bundle.js +1 -1
  28. package/dist/assets/js/handlebars.helpers.bundle.js.map +3 -3
  29. package/dist/assets/js/handlebars.helpers.js +51 -40
  30. package/dist/assets/js/handlebars.init.min.js +698 -347
  31. package/dist/assets/js/handlebars.init.min.js.map +4 -4
  32. package/dist/assets/js/handlebars.partials.js +16 -0
  33. package/dist/assets/js/qld.bootstrap.min.js +9 -9
  34. package/dist/assets/js/qld.bootstrap.min.js.map +4 -4
  35. package/dist/assets/node/handlebars.init.min.js +359 -72
  36. package/dist/assets/node/handlebars.init.min.js.map +3 -3
  37. package/dist/components/bs5/backToTop/backToTop.hbs +1 -1
  38. package/dist/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
  39. package/dist/components/bs5/button/button.hbs +48 -30
  40. package/dist/components/bs5/containerLayout/containerLayout.hbs +100 -0
  41. package/dist/components/bs5/contentFooter/contentFooter.hbs +15 -4
  42. package/dist/components/bs5/formcheck/formcheck.hbs +1 -1
  43. package/dist/components/bs5/head/head.hbs +1 -1
  44. package/dist/components/bs5/iconLink/iconLink.hbs +41 -0
  45. package/dist/components/bs5/logo/logo.hbs +7 -0
  46. package/dist/components/bs5/logo/logoCOALandscape.hbs +58 -0
  47. package/dist/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
  48. package/dist/components/bs5/navbar/navbar.hbs +65 -245
  49. package/dist/components/bs5/pageLayout/pageLayout.hbs +11 -10
  50. package/dist/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
  51. package/dist/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
  52. package/dist/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
  53. package/dist/components/bs5/searchInput/searchInput.hbs +8 -10
  54. package/dist/components/handlebars.helpers.js +51 -40
  55. package/dist/components/handlebars.partials.js +16 -0
  56. package/dist/package.json +2 -2
  57. package/dist/sample-data/breadcrumbs/breadcrumbs.data.json +113 -49
  58. package/dist/sample-data/button/button.data.json +10 -8
  59. package/dist/sample-data/contentFooter/contentFooter.data.json +9 -1
  60. package/dist/sample-data/formcheck/stories/checkbox/checkbox.data.json +51 -46
  61. package/dist/sample-data/formcheck/stories/radio/radio.data.json +51 -46
  62. package/dist/sample-data/iconLink/iconLink.data.json +77 -0
  63. package/dist/sample-data/logo/logo.data.json +6 -0
  64. package/dist/sample-data/navbar/navbar.data.json +191 -0
  65. package/dist/sample-data/searchInput/searchInput.data.json +2 -3
  66. package/dist/sample-data/tabs/tabs.data.json +45 -44
  67. package/package.json +2 -2
  68. package/src/components/bs5/backToTop/backToTop.hbs +1 -1
  69. package/src/components/bs5/banner/banner.scss +52 -46
  70. package/src/components/bs5/breadcrumbs/__snapshots__/breadcrumbs.test.js.snap +49 -0
  71. package/src/components/bs5/breadcrumbs/breadcrumbs.data.json +113 -49
  72. package/src/components/bs5/breadcrumbs/breadcrumbs.functions.js +169 -0
  73. package/src/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
  74. package/src/components/bs5/breadcrumbs/breadcrumbs.scss +164 -43
  75. package/src/components/bs5/breadcrumbs/breadcrumbs.stories.js +16 -2
  76. package/src/components/bs5/breadcrumbs/breadcrumbs.test.js +136 -0
  77. package/src/components/bs5/button/button.data.json +10 -8
  78. package/src/components/bs5/button/button.hbs +48 -30
  79. package/src/components/bs5/button/button.scss +365 -244
  80. package/src/components/bs5/button/button.stories.js +116 -30
  81. package/src/components/bs5/containerLayout/containerLayout.hbs +100 -0
  82. package/src/components/bs5/containerLayout/containerLayout.stories.js +83 -0
  83. package/src/components/bs5/contentFooter/contentFooter.data.json +9 -1
  84. package/src/components/bs5/contentFooter/contentFooter.hbs +15 -4
  85. package/src/components/bs5/formcheck/formcheck.hbs +1 -1
  86. package/src/components/bs5/formcheck/formcheck.scss +161 -139
  87. package/src/components/bs5/formcheck/stories/checkbox/checkbox.data.json +51 -46
  88. package/src/components/bs5/formcheck/stories/radio/radio.data.json +51 -46
  89. package/src/components/bs5/iconLink/iconLink.data.json +77 -0
  90. package/src/components/bs5/iconLink/iconLink.hbs +41 -0
  91. package/src/components/bs5/iconLink/iconLink.js +20 -0
  92. package/src/components/bs5/iconLink/iconLink.mdx +16 -0
  93. package/src/components/bs5/iconLink/iconLink.scss +57 -0
  94. package/src/components/bs5/iconLink/iconLink.stories.js +127 -0
  95. package/src/components/bs5/icons/icons.scss +79 -72
  96. package/src/components/bs5/inpagenav/inpagenav.scss +37 -37
  97. package/src/components/bs5/logo/Logo.js +20 -0
  98. package/src/components/bs5/logo/Logo.mdx +10 -0
  99. package/src/components/bs5/logo/logo.data.json +6 -0
  100. package/src/components/bs5/logo/logo.hbs +7 -0
  101. package/src/components/bs5/logo/logo.stories.js +32 -0
  102. package/src/components/bs5/logo/logoCOALandscape.hbs +58 -0
  103. package/src/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
  104. package/src/components/bs5/navbar/Navbar.js +2 -9
  105. package/src/components/bs5/navbar/navbar.data.json +191 -0
  106. package/src/components/bs5/navbar/navbar.functions.js +48 -196
  107. package/src/components/bs5/navbar/navbar.hbs +65 -245
  108. package/src/components/bs5/navbar/navbar.scss +585 -518
  109. package/src/components/bs5/navbar/navbar.stories.js +532 -0
  110. package/src/components/bs5/pageLayout/ContentPageWithForm.js +8 -0
  111. package/src/components/bs5/pageLayout/ContentPageWithSideNavigation.js +8 -0
  112. package/src/components/bs5/pageLayout/FullWidthLandingPage.js +8 -0
  113. package/src/components/bs5/pageLayout/pageLayout.hbs +11 -10
  114. package/src/components/bs5/pageLayout/pageLayout.stories.js +230 -6
  115. package/src/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
  116. package/src/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
  117. package/src/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
  118. package/src/components/bs5/searchInput/__snapshots__/searchInput.test.js.snap +9 -8
  119. package/src/components/bs5/searchInput/search.functions.js +94 -63
  120. package/src/components/bs5/searchInput/searchInput.data.json +2 -3
  121. package/src/components/bs5/searchInput/searchInput.hbs +8 -10
  122. package/src/components/bs5/searchInput/searchInput.scss +296 -255
  123. package/src/components/bs5/searchInput/searchInput.test.js +98 -89
  124. package/src/components/bs5/sidenav/sidenav.stories.js +17 -15
  125. package/src/components/bs5/tabs/tabs.data.json +45 -44
  126. package/src/components/bs5/tabs/tabs.scss +544 -500
  127. package/src/components/bs5/tabs/tabs.stories.js +81 -51
  128. package/src/components/common/footer/footer.scss +137 -140
  129. package/src/components/common/layout/container.scss +22 -0
  130. package/src/components/common/layout/content.scss +11 -4
  131. package/src/components/common/layout/grid.scss +26 -0
  132. package/src/css/main.scss +5 -4
  133. package/src/css/qld-variables.scss +102 -81
  134. package/src/js/handlebars.helpers.js +51 -40
  135. package/src/js/handlebars.partials.js +16 -0
  136. package/src/js/qld.bootstrap.js +17 -9
  137. package/src/components/bs5/backToTop/backToTop.scss +0 -9
  138. package/src/components/bs5/breadcrumbs/breadcrumb.functions.js +0 -95
  139. package/src/components/bs5/breadcumbsWrapper/breadcrumbsWrapper.stories.js +0 -34
  140. package/src/components/bs5/contentFooterWrapper/contentFooterWrapper.stories.js +0 -36
  141. package/src/components/bs5/contentWrapper/contentWrapper.stories.js +0 -65
  142. package/src/components/bs5/fullPageWrapper/fullPage.stories.js +0 -63
  143. package/src/components/bs5/mainContainerWrapper/mainContainerWrapper.stories.js +0 -50
  144. package/src/components/bs5/navbar/_colours.scss +0 -85
  145. package/src/components/bs5/navbar/_icons.scss +0 -64
  146. package/src/components/bs5/sidenavWrapper/SidenavWrapper.mdx +0 -11
  147. package/src/components/bs5/sidenavWrapper/sidenavWrapper.stories.js +0 -65
  148. package/src/stories/integration/MainIntegration.js +0 -28
  149. package/src/stories/integration/MainIntegration.mdx +0 -10
  150. package/src/stories/integration/breadcrumb.data.json +0 -28
  151. package/src/stories/integration/content.data.json +0 -3
  152. package/src/stories/integration/contentFooter.data.json +0 -3
  153. package/src/stories/integration/footer.data.json +0 -111
  154. package/src/stories/integration/globalAlert.data.json +0 -10
  155. package/src/stories/integration/header.data.json +0 -173
  156. package/src/stories/integration/inpagenav.data.json +0 -26
  157. package/src/stories/integration/integration.stories.js +0 -147
  158. package/src/stories/integration/main.hbs +0 -13
  159. package/src/stories/integration/navigation.data.json +0 -22
  160. package/src/stories/integration/search.data.json +0 -20
  161. package/src/stories/integration/sidenav.data.json +0 -88
@@ -73,7 +73,7 @@ describe("SearchInput", () => {
73
73
 
74
74
  // Ensure elements exist
75
75
  if (!form || !searchInput || !suggestions) {
76
- throw new Error('Required elements not found in DOM');
76
+ throw new Error("Required elements not found in DOM");
77
77
  }
78
78
  });
79
79
 
@@ -84,7 +84,6 @@ describe("SearchInput", () => {
84
84
 
85
85
  test("Search input element and Suggestions container exists and has correct attributes", () => {
86
86
  expect(searchInput).toBeTruthy();
87
- expect(searchInput.getAttribute("placeholder")).toBe(mockData.placeholder);
88
87
  expect(searchInput.getAttribute("id")).toBe(mockData.inputID);
89
88
  expect(searchInput.getAttribute("name").trim()).toBe(mockData.inputName);
90
89
  expect(suggestions).toBeTruthy();
@@ -94,28 +93,32 @@ describe("SearchInput", () => {
94
93
  test("Focus event shows suggestions", async () => {
95
94
  // Initially suggestions are hidden
96
95
  expect(isElementVisible(suggestions)).toBe(false);
97
-
96
+
98
97
  // Ensure input is empty to trigger default suggestions display
99
98
  searchInput.value = "";
100
-
99
+
101
100
  // Instead of relying on event dispatching, directly call the showSuggestions function
102
101
  // that should be available in the window scope after bootstrap loads
103
102
  if (window.showSuggestions || dom.window.showSuggestions) {
104
- await (window.showSuggestions || dom.window.showSuggestions)("", true, form);
103
+ await (window.showSuggestions || dom.window.showSuggestions)(
104
+ "",
105
+ true,
106
+ form,
107
+ );
105
108
  } else {
106
109
  // If showSuggestions is not available globally, manually show suggestions
107
110
  // as the focus event handler would do
108
- const defaultSuggestions = form.querySelector('.default-suggestions');
109
- const dynamicSuggestions = form.querySelector('.dynamic-suggestions');
110
-
111
+ const defaultSuggestions = form.querySelector(".default-suggestions");
112
+ const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
113
+
111
114
  if (defaultSuggestions) {
112
- defaultSuggestions.classList.remove('d-none');
115
+ defaultSuggestions.classList.remove("d-none");
113
116
  }
114
117
  if (dynamicSuggestions) {
115
- dynamicSuggestions.innerHTML = '';
116
- dynamicSuggestions.classList.add('d-none');
118
+ dynamicSuggestions.innerHTML = "";
119
+ dynamicSuggestions.classList.add("d-none");
117
120
  }
118
- suggestions.classList.remove('d-none');
121
+ suggestions.classList.remove("d-none");
119
122
  }
120
123
 
121
124
  // Wait for any asynchronous operations
@@ -131,18 +134,18 @@ describe("SearchInput", () => {
131
134
 
132
135
  // Initially suggestions should be hidden using the d-none class
133
136
 
134
- // Directly simulate the focus event behavior
135
- const defaultSuggestions = form.querySelector('.default-suggestions');
136
- const dynamicSuggestions = form.querySelector('.dynamic-suggestions');
137
-
137
+ // Directly simulate the focus event behavior
138
+ const defaultSuggestions = form.querySelector(".default-suggestions");
139
+ const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
140
+
138
141
  if (defaultSuggestions) {
139
- defaultSuggestions.classList.remove('d-none');
142
+ defaultSuggestions.classList.remove("d-none");
140
143
  }
141
144
  if (dynamicSuggestions) {
142
- dynamicSuggestions.innerHTML = '';
143
- dynamicSuggestions.classList.add('d-none');
145
+ dynamicSuggestions.innerHTML = "";
146
+ dynamicSuggestions.classList.add("d-none");
144
147
  }
145
- suggestions.classList.remove('d-none');
148
+ suggestions.classList.remove("d-none");
146
149
 
147
150
  // Wait for any asynchronous operations
148
151
  await waitFor();
@@ -156,9 +159,11 @@ describe("SearchInput", () => {
156
159
  searchInput.value = "test query";
157
160
 
158
161
  // Initially suggestions should be hidden
159
-
162
+
160
163
  // Ensure no dynamic suggestions exist initially
161
- const dynamicSuggestionsContainer = form.querySelector('.dynamic-suggestions');
164
+ const dynamicSuggestionsContainer = form.querySelector(
165
+ ".dynamic-suggestions",
166
+ );
162
167
  if (dynamicSuggestionsContainer) {
163
168
  dynamicSuggestionsContainer.innerHTML = "";
164
169
  }
@@ -168,43 +173,45 @@ describe("SearchInput", () => {
168
173
  bubbles: true,
169
174
  cancelable: true,
170
175
  });
171
-
176
+
172
177
  searchInput.dispatchEvent(focusEvent);
173
178
 
174
179
  // Wait for any asynchronous operations
175
180
  await waitFor();
176
181
 
177
- // Suggestions should remain hidden because
182
+ // Suggestions should remain hidden because
178
183
  // input has value but no dynamic suggestions exist
179
184
  expect(isElementVisible(suggestions)).toBe(false);
180
185
  });
181
186
 
182
187
  test("Focus back to UI should show dynamic suggestions if input is not empty", async () => {
183
- const dynamicSuggestionsContainer = form.querySelector('.dynamic-suggestions');
184
-
188
+ const dynamicSuggestionsContainer = form.querySelector(
189
+ ".dynamic-suggestions",
190
+ );
191
+
185
192
  // Step 1: Focus on empty input - should show default suggestions
186
193
  searchInput.value = "";
187
-
194
+
188
195
  // Directly simulate showing default suggestions
189
- const defaultSuggestions = form.querySelector('.default-suggestions');
196
+ const defaultSuggestions = form.querySelector(".default-suggestions");
190
197
  if (defaultSuggestions) {
191
- defaultSuggestions.classList.remove('d-none');
198
+ defaultSuggestions.classList.remove("d-none");
192
199
  }
193
200
  if (dynamicSuggestionsContainer) {
194
- dynamicSuggestionsContainer.innerHTML = '';
195
- dynamicSuggestionsContainer.classList.add('d-none');
201
+ dynamicSuggestionsContainer.innerHTML = "";
202
+ dynamicSuggestionsContainer.classList.add("d-none");
196
203
  }
197
- suggestions.classList.remove('d-none');
198
-
204
+ suggestions.classList.remove("d-none");
205
+
199
206
  await waitFor();
200
-
207
+
201
208
  // Verify default suggestions are shown
202
209
  expect(isElementVisible(suggestions)).toBe(true);
203
-
210
+
204
211
  // Step 2: Simulate having typed text and having suggestions populated
205
212
  // (Skip the actual input/fetch process and directly simulate the end state)
206
213
  searchInput.value = "test query";
207
-
214
+
208
215
  // Manually simulate what would happen after successful fetch
209
216
  if (dynamicSuggestionsContainer) {
210
217
  dynamicSuggestionsContainer.innerHTML = `
@@ -216,10 +223,10 @@ describe("SearchInput", () => {
216
223
  </ul>
217
224
  </div>
218
225
  `;
219
- dynamicSuggestionsContainer.classList.remove('d-none');
226
+ dynamicSuggestionsContainer.classList.remove("d-none");
220
227
  }
221
- suggestions.classList.remove('d-none');
222
-
228
+ suggestions.classList.remove("d-none");
229
+
223
230
  // Step 3: Simulate focusout event to hide suggestions
224
231
  const focusoutEvent = new window.FocusEvent("focusout", {
225
232
  relatedTarget: null,
@@ -227,27 +234,29 @@ describe("SearchInput", () => {
227
234
  cancelable: true,
228
235
  });
229
236
  searchInput.dispatchEvent(focusoutEvent);
230
-
237
+
231
238
  // Manually ensure suggestions are hidden (simulating the focusout behavior)
232
- suggestions.classList.add('d-none');
233
-
239
+ suggestions.classList.add("d-none");
240
+
234
241
  // Verify suggestions are hidden after focusout
235
242
  expect(isElementVisible(suggestions)).toBe(false);
236
-
243
+
237
244
  // Step 4: Focus back into input with existing text
238
245
  // This should trigger the focus event listener which checks if input has value
239
246
  // Since we have non-empty input and existing dynamic suggestions, just show them again
240
- suggestions.classList.remove('d-none');
241
-
247
+ suggestions.classList.remove("d-none");
248
+
242
249
  await waitFor();
243
-
250
+
244
251
  // Verify that suggestions are shown again without refetching
245
252
  expect(searchInput.value).toBe("test query"); // Input still has the text
246
-
253
+
247
254
  // The key assertion: existing dynamic suggestions content should still be there
248
255
  // (not refetched, just made visible again)
249
256
  if (dynamicSuggestionsContainer) {
250
- expect(dynamicSuggestionsContainer.innerHTML).toContain("test <strong>query</strong> result 1");
257
+ expect(dynamicSuggestionsContainer.innerHTML).toContain(
258
+ "test <strong>query</strong> result 1",
259
+ );
251
260
  expect(isElementVisible(suggestions)).toBe(true);
252
261
  }
253
262
  });
@@ -257,24 +266,24 @@ describe("SearchInput", () => {
257
266
 
258
267
  // Simulate typing in input
259
268
  searchInput.value = "test";
260
-
261
- const inputEvent = new window.InputEvent("input", {
269
+
270
+ const inputEvent = new window.InputEvent("input", {
262
271
  data: "t",
263
272
  bubbles: true,
264
- cancelable: true
273
+ cancelable: true,
265
274
  });
266
-
275
+
267
276
  // Set the target property correctly for the event
268
- Object.defineProperty(inputEvent, 'target', {
277
+ Object.defineProperty(inputEvent, "target", {
269
278
  value: searchInput,
270
- enumerable: true
279
+ enumerable: true,
271
280
  });
272
-
281
+
273
282
  searchInput.dispatchEvent(inputEvent);
274
283
 
275
284
  // Suggestions should not show immediately due to 300ms debounce
276
285
  expect(isElementVisible(suggestions)).toBe(false);
277
-
286
+
278
287
  // Wait and confirm it's still hidden (debounce should prevent immediate display)
279
288
  await waitFor();
280
289
  expect(isElementVisible(suggestions)).toBe(false);
@@ -287,22 +296,22 @@ describe("SearchInput", () => {
287
296
 
288
297
  // Show suggestions first by simulating focus on empty input
289
298
  searchInput.value = "";
290
-
299
+
291
300
  // Directly simulate showing default suggestions
292
- const defaultSuggestions = form.querySelector('.default-suggestions');
293
- const dynamicSuggestions = form.querySelector('.dynamic-suggestions');
294
-
301
+ const defaultSuggestions = form.querySelector(".default-suggestions");
302
+ const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
303
+
295
304
  if (defaultSuggestions) {
296
- defaultSuggestions.classList.remove('d-none');
305
+ defaultSuggestions.classList.remove("d-none");
297
306
  }
298
307
  if (dynamicSuggestions) {
299
- dynamicSuggestions.innerHTML = '';
300
- dynamicSuggestions.classList.add('d-none');
308
+ dynamicSuggestions.innerHTML = "";
309
+ dynamicSuggestions.classList.add("d-none");
301
310
  }
302
- suggestions.classList.remove('d-none');
303
-
311
+ suggestions.classList.remove("d-none");
312
+
304
313
  await waitFor();
305
-
314
+
306
315
  expect(isElementVisible(suggestions)).toBe(true);
307
316
 
308
317
  // Test that focusout events can be dispatched without throwing errors
@@ -332,23 +341,23 @@ describe("SearchInput", () => {
332
341
  test("Document click outside hides suggestions", async () => {
333
342
  // Ensure input is empty so focus will show default suggestions
334
343
  searchInput.value = "";
335
-
344
+
336
345
  // First show suggestions by simulating focus on empty input
337
346
  // Directly simulate showing default suggestions
338
- const defaultSuggestions = form.querySelector('.default-suggestions');
339
- const dynamicSuggestions = form.querySelector('.dynamic-suggestions');
340
-
347
+ const defaultSuggestions = form.querySelector(".default-suggestions");
348
+ const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
349
+
341
350
  if (defaultSuggestions) {
342
- defaultSuggestions.classList.remove('d-none');
351
+ defaultSuggestions.classList.remove("d-none");
343
352
  }
344
353
  if (dynamicSuggestions) {
345
- dynamicSuggestions.innerHTML = '';
346
- dynamicSuggestions.classList.add('d-none');
354
+ dynamicSuggestions.innerHTML = "";
355
+ dynamicSuggestions.classList.add("d-none");
347
356
  }
348
- suggestions.classList.remove('d-none');
349
-
357
+ suggestions.classList.remove("d-none");
358
+
350
359
  await waitFor();
351
-
360
+
352
361
  expect(isElementVisible(suggestions)).toBe(true);
353
362
 
354
363
  // Simulate clicking outside by dispatching focusout event
@@ -357,12 +366,12 @@ describe("SearchInput", () => {
357
366
  bubbles: true,
358
367
  cancelable: true,
359
368
  });
360
-
369
+
361
370
  searchInput.dispatchEvent(focusoutEvent);
362
-
371
+
363
372
  // Wait for event processing
364
373
  await waitFor();
365
-
374
+
366
375
  // Manually simulate the focusout behavior since JSDOM might not handle it exactly like browsers
367
376
  suggestions.classList.add("d-none");
368
377
 
@@ -373,22 +382,22 @@ describe("SearchInput", () => {
373
382
  test("Document click inside suggestions keeps them visible", async () => {
374
383
  // First show suggestions by simulating focus on empty input
375
384
  searchInput.value = "";
376
-
385
+
377
386
  // Directly simulate showing default suggestions
378
- const defaultSuggestions = form.querySelector('.default-suggestions');
379
- const dynamicSuggestions = form.querySelector('.dynamic-suggestions');
380
-
387
+ const defaultSuggestions = form.querySelector(".default-suggestions");
388
+ const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
389
+
381
390
  if (defaultSuggestions) {
382
- defaultSuggestions.classList.remove('d-none');
391
+ defaultSuggestions.classList.remove("d-none");
383
392
  }
384
393
  if (dynamicSuggestions) {
385
- dynamicSuggestions.innerHTML = '';
386
- dynamicSuggestions.classList.add('d-none');
394
+ dynamicSuggestions.innerHTML = "";
395
+ dynamicSuggestions.classList.add("d-none");
387
396
  }
388
- suggestions.classList.remove('d-none');
389
-
397
+ suggestions.classList.remove("d-none");
398
+
390
399
  await waitFor();
391
-
400
+
392
401
  expect(isElementVisible(suggestions)).toBe(true);
393
402
 
394
403
  // Click inside suggestions
@@ -6,11 +6,10 @@ export default {
6
6
  tags: ["autodocs"],
7
7
  title: "2. Layout/Side navigation",
8
8
  render: (args) => {
9
- return new Sidenav(args).html;
9
+ return new Sidenav(args).html;
10
10
  },
11
11
 
12
- argTypes: {
13
- },
12
+ argTypes: {},
14
13
 
15
14
  parameters: {
16
15
  docs: {
@@ -23,7 +22,7 @@ export default {
23
22
 
24
23
  /**
25
24
  * Default side navigation
26
- *
25
+ *
27
26
  */
28
27
  export const Default = {
29
28
  args: defaultdata,
@@ -32,9 +31,9 @@ export const Default = {
32
31
  return `
33
32
  <div class="container-fluid">
34
33
  <div class="row">
35
- <div class="col-lg-4 col-md-5">
36
- ${Story()}
37
- </div>
34
+ <div class="col-lg-4 col-md-5">
35
+ ${Story()}
36
+ </div>
38
37
  </div>
39
38
  </div>
40
39
  `;
@@ -42,23 +41,26 @@ export const Default = {
42
41
  ],
43
42
  };
44
43
 
45
-
46
44
  /**
47
45
  * Dark side navigation
48
- *
46
+ *
49
47
  */
50
48
  export const Dark = {
49
+ parameters: {
50
+ backgrounds: {
51
+ default: "Dark",
52
+ values: [{ name: "Dark", value: "var(--qld-dark-background)" }],
53
+ },
54
+ },
51
55
  args: defaultdata,
52
56
  decorators: [
53
57
  (Story) => {
54
58
  return `
55
- <div class="container-fluid">
59
+ <div class="container-fluid dark">
56
60
  <div class="row">
57
- <div class="col-lg-4 col-md-5">
58
- <div class="dark">
59
- ${Story()}
60
- </div>
61
- </div>
61
+ <div class="col-lg-4 col-md-5">
62
+ ${Story()}
63
+ </div>
62
64
  </div>
63
65
  </div>
64
66
  `;
@@ -1,45 +1,46 @@
1
1
  {
2
- "type_variant": "section-tabs",
3
- "variant": "dark",
4
- "tab_variant": "default",
5
- "unique_id": "1234",
6
- "sibiling_section_title": "Heading (H2)",
7
- "sibling_section_content":"<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>",
8
- "data": {
9
- "items": [
10
- {
11
- "tab_text": "Tab label 1",
12
- "title": "Section Heading (H2)",
13
- "icon": "btn-icon fa-solid fa-arrow-up-right-from-square",
14
- "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p><a class=\"qld-cta-link\" href=\"#\" target=\"_blank\" aria-label=\"Call to action\">Call to action<span class=\"icon\" aria-hidden=\"true\"></span></a>"
15
- },
16
- {
17
- "tab_text":"Tab label 2",
18
- "title": "Section Heading Item 2",
19
- "icon": "btn-icon fa-solid fa-arrow-up-right-from-square",
20
- "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
21
- },
22
- {
23
- "tab_text": "Tab label 3",
24
- "title": "Section Heading Item 3",
25
- "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
26
- },
27
- {
28
- "tab_text": "Tab label 4",
29
- "title": "Section Heading Item 4",
30
- "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>",
31
- "disabled": true
32
- },
33
- {
34
- "tab_text": "Tab label 5",
35
- "title": "Section Heading Item 5",
36
- "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
37
- },
38
- {
39
- "tab_text": "Tab label 6",
40
- "title": "Section Heading Item 6",
41
- "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
42
- }
43
- ]
44
- }
45
- }
2
+ "type_variant": "section-tabs",
3
+ "variant": "dark",
4
+ "tab_variant": "default",
5
+ "unique_id": "1234",
6
+ "sibiling_section_title": "Heading (H2)",
7
+ "sibling_section_content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>",
8
+ "data": {
9
+ "items": [
10
+ {
11
+ "tab_text": "Tab label 1",
12
+ "title": "Section Heading (H2)",
13
+ "icon": "qld-icon qld-icon-md qld-icon-calendar",
14
+ "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p><a class=\"qld-cta-link\" href=\"#\" target=\"_blank\" aria-label=\"Call to action\">Call to action<span class=\"icon\" aria-hidden=\"true\"></span></a>"
15
+ },
16
+ {
17
+ "tab_text": "Tab label 2",
18
+ "title": "Section Heading Item 2",
19
+ "icon": "qld-icon qld-icon-md qld-icon-calendar",
20
+ "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
21
+ },
22
+ {
23
+ "tab_text": "Tab label 3",
24
+ "title": "Section Heading Item 3",
25
+ "icon": "qld-icon qld-icon-md qld-icon-calendar",
26
+ "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
27
+ },
28
+ {
29
+ "tab_text": "Tab label 4",
30
+ "title": "Section Heading Item 4",
31
+ "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>",
32
+ "disabled": true
33
+ },
34
+ {
35
+ "tab_text": "Tab label 5",
36
+ "title": "Section Heading Item 5",
37
+ "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
38
+ },
39
+ {
40
+ "tab_text": "Tab label 6",
41
+ "title": "Section Heading Item 6",
42
+ "content": "<p>Lorem ipsum dolor sit amet consectetur. Viverra eu pulvinar a eu mauris ac at ultricies est. Tincidunt ultrices commodo vestibulum non netus. Mauris maecenas lacus hendrerit urna ultricies auctor. Sed tristique nascetur sapien condimentum adipiscing augue quisque eu. Facilisi ligula quam faucibus feugiat. Sapien at at eget malesuada senectus donec pellentesque pellentesque odio.</p>"
43
+ }
44
+ ]
45
+ }
46
+ }