@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.
- package/dist/assets/components/bs5/backToTop/backToTop.hbs +1 -1
- package/dist/assets/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
- package/dist/assets/components/bs5/button/button.hbs +48 -30
- package/dist/assets/components/bs5/containerLayout/containerLayout.hbs +100 -0
- package/dist/assets/components/bs5/contentFooter/contentFooter.hbs +15 -4
- package/dist/assets/components/bs5/formcheck/formcheck.hbs +1 -1
- package/dist/assets/components/bs5/head/head.hbs +1 -1
- package/dist/assets/components/bs5/iconLink/iconLink.hbs +41 -0
- package/dist/assets/components/bs5/logo/logo.hbs +7 -0
- package/dist/assets/components/bs5/logo/logoCOALandscape.hbs +58 -0
- package/dist/assets/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
- package/dist/assets/components/bs5/navbar/navbar.hbs +65 -245
- package/dist/assets/components/bs5/pageLayout/pageLayout.hbs +11 -10
- package/dist/assets/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
- package/dist/assets/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
- package/dist/assets/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
- package/dist/assets/components/bs5/searchInput/searchInput.hbs +8 -10
- package/dist/assets/css/qld.bootstrap.css +1 -1
- package/dist/assets/css/qld.bootstrap.css.map +3 -3
- package/dist/assets/js/bootstrap.bundle.js +3 -6
- package/dist/assets/js/bootstrap.bundle.js.map +1 -1
- package/dist/assets/js/bootstrap.bundle.min.js +2 -2
- package/dist/assets/js/bootstrap.bundle.min.js.map +1 -1
- package/dist/assets/js/bootstrap.js +3 -6
- package/dist/assets/js/bootstrap.min.js +2 -2
- package/dist/assets/js/bootstrap.min.js.map +1 -1
- package/dist/assets/js/handlebars.helpers.bundle.js +1 -1
- package/dist/assets/js/handlebars.helpers.bundle.js.map +3 -3
- package/dist/assets/js/handlebars.helpers.js +51 -40
- package/dist/assets/js/handlebars.init.min.js +698 -347
- package/dist/assets/js/handlebars.init.min.js.map +4 -4
- package/dist/assets/js/handlebars.partials.js +16 -0
- package/dist/assets/js/qld.bootstrap.min.js +9 -9
- package/dist/assets/js/qld.bootstrap.min.js.map +4 -4
- package/dist/assets/node/handlebars.init.min.js +359 -72
- package/dist/assets/node/handlebars.init.min.js.map +3 -3
- package/dist/components/bs5/backToTop/backToTop.hbs +1 -1
- package/dist/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
- package/dist/components/bs5/button/button.hbs +48 -30
- package/dist/components/bs5/containerLayout/containerLayout.hbs +100 -0
- package/dist/components/bs5/contentFooter/contentFooter.hbs +15 -4
- package/dist/components/bs5/formcheck/formcheck.hbs +1 -1
- package/dist/components/bs5/head/head.hbs +1 -1
- package/dist/components/bs5/iconLink/iconLink.hbs +41 -0
- package/dist/components/bs5/logo/logo.hbs +7 -0
- package/dist/components/bs5/logo/logoCOALandscape.hbs +58 -0
- package/dist/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
- package/dist/components/bs5/navbar/navbar.hbs +65 -245
- package/dist/components/bs5/pageLayout/pageLayout.hbs +11 -10
- package/dist/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
- package/dist/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
- package/dist/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
- package/dist/components/bs5/searchInput/searchInput.hbs +8 -10
- package/dist/components/handlebars.helpers.js +51 -40
- package/dist/components/handlebars.partials.js +16 -0
- package/dist/package.json +2 -2
- package/dist/sample-data/breadcrumbs/breadcrumbs.data.json +113 -49
- package/dist/sample-data/button/button.data.json +10 -8
- package/dist/sample-data/contentFooter/contentFooter.data.json +9 -1
- package/dist/sample-data/formcheck/stories/checkbox/checkbox.data.json +51 -46
- package/dist/sample-data/formcheck/stories/radio/radio.data.json +51 -46
- package/dist/sample-data/iconLink/iconLink.data.json +77 -0
- package/dist/sample-data/logo/logo.data.json +6 -0
- package/dist/sample-data/navbar/navbar.data.json +191 -0
- package/dist/sample-data/searchInput/searchInput.data.json +2 -3
- package/dist/sample-data/tabs/tabs.data.json +45 -44
- package/package.json +2 -2
- package/src/components/bs5/backToTop/backToTop.hbs +1 -1
- package/src/components/bs5/banner/banner.scss +52 -46
- package/src/components/bs5/breadcrumbs/__snapshots__/breadcrumbs.test.js.snap +49 -0
- package/src/components/bs5/breadcrumbs/breadcrumbs.data.json +113 -49
- package/src/components/bs5/breadcrumbs/breadcrumbs.functions.js +169 -0
- package/src/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
- package/src/components/bs5/breadcrumbs/breadcrumbs.scss +164 -43
- package/src/components/bs5/breadcrumbs/breadcrumbs.stories.js +16 -2
- package/src/components/bs5/breadcrumbs/breadcrumbs.test.js +136 -0
- package/src/components/bs5/button/button.data.json +10 -8
- package/src/components/bs5/button/button.hbs +48 -30
- package/src/components/bs5/button/button.scss +365 -244
- package/src/components/bs5/button/button.stories.js +116 -30
- package/src/components/bs5/containerLayout/containerLayout.hbs +100 -0
- package/src/components/bs5/containerLayout/containerLayout.stories.js +83 -0
- package/src/components/bs5/contentFooter/contentFooter.data.json +9 -1
- package/src/components/bs5/contentFooter/contentFooter.hbs +15 -4
- package/src/components/bs5/formcheck/formcheck.hbs +1 -1
- package/src/components/bs5/formcheck/formcheck.scss +161 -139
- package/src/components/bs5/formcheck/stories/checkbox/checkbox.data.json +51 -46
- package/src/components/bs5/formcheck/stories/radio/radio.data.json +51 -46
- package/src/components/bs5/iconLink/iconLink.data.json +77 -0
- package/src/components/bs5/iconLink/iconLink.hbs +41 -0
- package/src/components/bs5/iconLink/iconLink.js +20 -0
- package/src/components/bs5/iconLink/iconLink.mdx +16 -0
- package/src/components/bs5/iconLink/iconLink.scss +57 -0
- package/src/components/bs5/iconLink/iconLink.stories.js +127 -0
- package/src/components/bs5/icons/icons.scss +79 -72
- package/src/components/bs5/inpagenav/inpagenav.scss +37 -37
- package/src/components/bs5/logo/Logo.js +20 -0
- package/src/components/bs5/logo/Logo.mdx +10 -0
- package/src/components/bs5/logo/logo.data.json +6 -0
- package/src/components/bs5/logo/logo.hbs +7 -0
- package/src/components/bs5/logo/logo.stories.js +32 -0
- package/src/components/bs5/logo/logoCOALandscape.hbs +58 -0
- package/src/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
- package/src/components/bs5/navbar/Navbar.js +2 -9
- package/src/components/bs5/navbar/navbar.data.json +191 -0
- package/src/components/bs5/navbar/navbar.functions.js +48 -196
- package/src/components/bs5/navbar/navbar.hbs +65 -245
- package/src/components/bs5/navbar/navbar.scss +585 -518
- package/src/components/bs5/navbar/navbar.stories.js +532 -0
- package/src/components/bs5/pageLayout/ContentPageWithForm.js +8 -0
- package/src/components/bs5/pageLayout/ContentPageWithSideNavigation.js +8 -0
- package/src/components/bs5/pageLayout/FullWidthLandingPage.js +8 -0
- package/src/components/bs5/pageLayout/pageLayout.hbs +11 -10
- package/src/components/bs5/pageLayout/pageLayout.stories.js +230 -6
- package/src/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
- package/src/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
- package/src/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
- package/src/components/bs5/searchInput/__snapshots__/searchInput.test.js.snap +9 -8
- package/src/components/bs5/searchInput/search.functions.js +94 -63
- package/src/components/bs5/searchInput/searchInput.data.json +2 -3
- package/src/components/bs5/searchInput/searchInput.hbs +8 -10
- package/src/components/bs5/searchInput/searchInput.scss +296 -255
- package/src/components/bs5/searchInput/searchInput.test.js +98 -89
- package/src/components/bs5/sidenav/sidenav.stories.js +17 -15
- package/src/components/bs5/tabs/tabs.data.json +45 -44
- package/src/components/bs5/tabs/tabs.scss +544 -500
- package/src/components/bs5/tabs/tabs.stories.js +81 -51
- package/src/components/common/footer/footer.scss +137 -140
- package/src/components/common/layout/container.scss +22 -0
- package/src/components/common/layout/content.scss +11 -4
- package/src/components/common/layout/grid.scss +26 -0
- package/src/css/main.scss +5 -4
- package/src/css/qld-variables.scss +102 -81
- package/src/js/handlebars.helpers.js +51 -40
- package/src/js/handlebars.partials.js +16 -0
- package/src/js/qld.bootstrap.js +17 -9
- package/src/components/bs5/backToTop/backToTop.scss +0 -9
- package/src/components/bs5/breadcrumbs/breadcrumb.functions.js +0 -95
- package/src/components/bs5/breadcumbsWrapper/breadcrumbsWrapper.stories.js +0 -34
- package/src/components/bs5/contentFooterWrapper/contentFooterWrapper.stories.js +0 -36
- package/src/components/bs5/contentWrapper/contentWrapper.stories.js +0 -65
- package/src/components/bs5/fullPageWrapper/fullPage.stories.js +0 -63
- package/src/components/bs5/mainContainerWrapper/mainContainerWrapper.stories.js +0 -50
- package/src/components/bs5/navbar/_colours.scss +0 -85
- package/src/components/bs5/navbar/_icons.scss +0 -64
- package/src/components/bs5/sidenavWrapper/SidenavWrapper.mdx +0 -11
- package/src/components/bs5/sidenavWrapper/sidenavWrapper.stories.js +0 -65
- package/src/stories/integration/MainIntegration.js +0 -28
- package/src/stories/integration/MainIntegration.mdx +0 -10
- package/src/stories/integration/breadcrumb.data.json +0 -28
- package/src/stories/integration/content.data.json +0 -3
- package/src/stories/integration/contentFooter.data.json +0 -3
- package/src/stories/integration/footer.data.json +0 -111
- package/src/stories/integration/globalAlert.data.json +0 -10
- package/src/stories/integration/header.data.json +0 -173
- package/src/stories/integration/inpagenav.data.json +0 -26
- package/src/stories/integration/integration.stories.js +0 -147
- package/src/stories/integration/main.hbs +0 -13
- package/src/stories/integration/navigation.data.json +0 -22
- package/src/stories/integration/search.data.json +0 -20
- 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(
|
|
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)(
|
|
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(
|
|
109
|
-
const dynamicSuggestions = form.querySelector(
|
|
110
|
-
|
|
111
|
+
const defaultSuggestions = form.querySelector(".default-suggestions");
|
|
112
|
+
const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
|
|
113
|
+
|
|
111
114
|
if (defaultSuggestions) {
|
|
112
|
-
defaultSuggestions.classList.remove(
|
|
115
|
+
defaultSuggestions.classList.remove("d-none");
|
|
113
116
|
}
|
|
114
117
|
if (dynamicSuggestions) {
|
|
115
|
-
dynamicSuggestions.innerHTML =
|
|
116
|
-
dynamicSuggestions.classList.add(
|
|
118
|
+
dynamicSuggestions.innerHTML = "";
|
|
119
|
+
dynamicSuggestions.classList.add("d-none");
|
|
117
120
|
}
|
|
118
|
-
suggestions.classList.remove(
|
|
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(
|
|
136
|
-
const dynamicSuggestions = form.querySelector(
|
|
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(
|
|
142
|
+
defaultSuggestions.classList.remove("d-none");
|
|
140
143
|
}
|
|
141
144
|
if (dynamicSuggestions) {
|
|
142
|
-
dynamicSuggestions.innerHTML =
|
|
143
|
-
dynamicSuggestions.classList.add(
|
|
145
|
+
dynamicSuggestions.innerHTML = "";
|
|
146
|
+
dynamicSuggestions.classList.add("d-none");
|
|
144
147
|
}
|
|
145
|
-
suggestions.classList.remove(
|
|
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(
|
|
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(
|
|
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(
|
|
196
|
+
const defaultSuggestions = form.querySelector(".default-suggestions");
|
|
190
197
|
if (defaultSuggestions) {
|
|
191
|
-
defaultSuggestions.classList.remove(
|
|
198
|
+
defaultSuggestions.classList.remove("d-none");
|
|
192
199
|
}
|
|
193
200
|
if (dynamicSuggestionsContainer) {
|
|
194
|
-
dynamicSuggestionsContainer.innerHTML =
|
|
195
|
-
dynamicSuggestionsContainer.classList.add(
|
|
201
|
+
dynamicSuggestionsContainer.innerHTML = "";
|
|
202
|
+
dynamicSuggestionsContainer.classList.add("d-none");
|
|
196
203
|
}
|
|
197
|
-
suggestions.classList.remove(
|
|
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(
|
|
226
|
+
dynamicSuggestionsContainer.classList.remove("d-none");
|
|
220
227
|
}
|
|
221
|
-
suggestions.classList.remove(
|
|
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(
|
|
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(
|
|
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(
|
|
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,
|
|
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(
|
|
293
|
-
const dynamicSuggestions = form.querySelector(
|
|
294
|
-
|
|
301
|
+
const defaultSuggestions = form.querySelector(".default-suggestions");
|
|
302
|
+
const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
|
|
303
|
+
|
|
295
304
|
if (defaultSuggestions) {
|
|
296
|
-
defaultSuggestions.classList.remove(
|
|
305
|
+
defaultSuggestions.classList.remove("d-none");
|
|
297
306
|
}
|
|
298
307
|
if (dynamicSuggestions) {
|
|
299
|
-
dynamicSuggestions.innerHTML =
|
|
300
|
-
dynamicSuggestions.classList.add(
|
|
308
|
+
dynamicSuggestions.innerHTML = "";
|
|
309
|
+
dynamicSuggestions.classList.add("d-none");
|
|
301
310
|
}
|
|
302
|
-
suggestions.classList.remove(
|
|
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(
|
|
339
|
-
const dynamicSuggestions = form.querySelector(
|
|
340
|
-
|
|
347
|
+
const defaultSuggestions = form.querySelector(".default-suggestions");
|
|
348
|
+
const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
|
|
349
|
+
|
|
341
350
|
if (defaultSuggestions) {
|
|
342
|
-
defaultSuggestions.classList.remove(
|
|
351
|
+
defaultSuggestions.classList.remove("d-none");
|
|
343
352
|
}
|
|
344
353
|
if (dynamicSuggestions) {
|
|
345
|
-
dynamicSuggestions.innerHTML =
|
|
346
|
-
dynamicSuggestions.classList.add(
|
|
354
|
+
dynamicSuggestions.innerHTML = "";
|
|
355
|
+
dynamicSuggestions.classList.add("d-none");
|
|
347
356
|
}
|
|
348
|
-
suggestions.classList.remove(
|
|
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(
|
|
379
|
-
const dynamicSuggestions = form.querySelector(
|
|
380
|
-
|
|
387
|
+
const defaultSuggestions = form.querySelector(".default-suggestions");
|
|
388
|
+
const dynamicSuggestions = form.querySelector(".dynamic-suggestions");
|
|
389
|
+
|
|
381
390
|
if (defaultSuggestions) {
|
|
382
|
-
defaultSuggestions.classList.remove(
|
|
391
|
+
defaultSuggestions.classList.remove("d-none");
|
|
383
392
|
}
|
|
384
393
|
if (dynamicSuggestions) {
|
|
385
|
-
dynamicSuggestions.innerHTML =
|
|
386
|
-
dynamicSuggestions.classList.add(
|
|
394
|
+
dynamicSuggestions.innerHTML = "";
|
|
395
|
+
dynamicSuggestions.classList.add("d-none");
|
|
387
396
|
}
|
|
388
|
-
suggestions.classList.remove(
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
+
}
|