@qld-gov-au/qgds-bootstrap5 1.0.7 → 1.0.9

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 (70) hide show
  1. package/.storybook/preview.js +2 -1
  2. package/dist/assets/css/qld.bootstrap.css +1 -1
  3. package/dist/assets/css/qld.bootstrap.css.map +2 -2
  4. package/dist/assets/js/handlebars.helpers.bundle.js +1 -1
  5. package/dist/assets/js/handlebars.helpers.bundle.js.map +3 -3
  6. package/dist/assets/js/handlebars.helpers.js +8 -1
  7. package/dist/assets/js/qld.bootstrap.min.js +16 -1
  8. package/dist/assets/js/qld.bootstrap.min.js.map +4 -4
  9. package/dist/components/bs5/dateinput/dateinput.hbs +12 -12
  10. package/dist/components/bs5/header/header.hbs +131 -33
  11. package/dist/components/bs5/navbar/navbar.hbs +65 -3
  12. package/dist/components/bs5/select/select.hbs +3 -3
  13. package/dist/components/bs5/textarea/textarea.hbs +8 -8
  14. package/dist/components/bs5/textbox/textbox.hbs +7 -6
  15. package/dist/components/bs5/video/video.hbs +10 -11
  16. package/dist/components/handlebars.helpers.js +8 -1
  17. package/dist/components/handlebars.init.bundle.js +1 -1
  18. package/dist/components/handlebars.init.bundle.js.map +3 -3
  19. package/dist/sample-data/card/card.data.json +8 -2
  20. package/dist/sample-data/dateinput/dateinput.data.json +1 -0
  21. package/dist/sample-data/header/header.data.json +245 -31
  22. package/dist/sample-data/select/select.data.json +1 -0
  23. package/dist/sample-data/textarea/textarea.data.json +1 -0
  24. package/dist/sample-data/textbox/textbox.data.json +1 -0
  25. package/dist/sample-data/video/video.data.json +20 -11
  26. package/package.json +20 -20
  27. package/src/components/bs5/card/card--multi-action.stories.js +1 -0
  28. package/src/components/bs5/card/card.data.json +8 -2
  29. package/src/components/bs5/card/card.scss +34 -1
  30. package/src/components/bs5/dateinput/Dateinput.stories.js +2 -32
  31. package/src/components/bs5/dateinput/dateinput.data.json +1 -0
  32. package/src/components/bs5/dateinput/dateinput.hbs +12 -12
  33. package/src/components/bs5/header/_colours.scss +31 -15
  34. package/src/components/bs5/header/_icons.scss +1 -1
  35. package/src/components/bs5/header/_search.json +45 -0
  36. package/src/components/bs5/header/header.data.json +245 -31
  37. package/src/components/bs5/header/header.functions.js +143 -8
  38. package/src/components/bs5/header/header.hbs +131 -33
  39. package/src/components/bs5/header/header.scss +178 -35
  40. package/src/components/bs5/navbar/_colours.scss +19 -19
  41. package/src/components/bs5/navbar/navbar.functions.js +59 -52
  42. package/src/components/bs5/navbar/navbar.hbs +65 -3
  43. package/src/components/bs5/navbar/navbar.scss +73 -27
  44. package/src/components/bs5/select/Select.stories.js +4 -4
  45. package/src/components/bs5/select/select.data.json +1 -0
  46. package/src/components/bs5/select/select.hbs +3 -3
  47. package/src/components/bs5/textarea/Textarea.stories.js +2 -32
  48. package/src/components/bs5/textarea/textarea.data.json +1 -0
  49. package/src/components/bs5/textarea/textarea.hbs +8 -8
  50. package/src/components/bs5/textbox/Textbox.stories.js +2 -15
  51. package/src/components/bs5/textbox/textInput.scss +10 -2
  52. package/src/components/bs5/textbox/textbox.data.json +1 -0
  53. package/src/components/bs5/textbox/textbox.hbs +7 -6
  54. package/src/components/bs5/video/video.data.json +20 -11
  55. package/src/components/bs5/video/video.hbs +10 -11
  56. package/src/components/bs5/video/video.scss +42 -5
  57. package/src/components/bs5/video/video.stories.js +9 -0
  58. package/src/js/handlebars.helpers.js +8 -1
  59. package/src/main.js +26 -2
  60. package/dist/components/bs5/card/cardblock.hbs +0 -14
  61. package/dist/sample-data/card/cardblock.data.json +0 -33
  62. package/src/components/bs5/card/Cardblock.js +0 -14
  63. package/src/components/bs5/card/cardblock-hbs-backup.txt +0 -29
  64. package/src/components/bs5/card/cardblock.data.json +0 -33
  65. package/src/components/bs5/card/cardblock.hbs +0 -14
  66. package/src/components/bs5/card/cardblock.stories.js +0 -60
  67. package/src/stories/templates/ContentPage/ContentPage.mdx +0 -40
  68. package/src/stories/templates/ContentPage/ContentPage.stories.js +0 -36
  69. package/src/stories/templates/LandingPage/LandingPage.mdx +0 -20
  70. package/src/stories/templates/LandingPage/LandingPage.stories.js +0 -25
@@ -1,3 +1,6 @@
1
+ import { createPopper } from '@popperjs/core';
2
+ import { defaultSuggestions } from './_search.json';
3
+
1
4
  /**
2
5
  * Toggles the class on a search div based on button click.
3
6
  *
@@ -7,7 +10,6 @@
7
10
  * @returns {void}
8
11
  */
9
12
  export function toggleSearch(event) {
10
-
11
13
  // Prevent default action and stop event propagation
12
14
  try {
13
15
  event.preventDefault();
@@ -15,16 +17,149 @@ export function toggleSearch(event) {
15
17
  } catch (error) {
16
18
  console.error("Error in event handling:", error);
17
19
  }
18
-
20
+
19
21
  // Get the search div
20
22
  const searchDiv = document.getElementById('qld-header-search');
21
-
22
- // Toggle the class for the open state
23
+ const toggleButton = event.currentTarget;
24
+ const toggleIcon = toggleButton.querySelector('svg use');
25
+ const toggleText = toggleButton.querySelector('.qld__main-nav__toggle-text');
26
+
27
+ // Check current class and swap
23
28
  if (searchDiv) {
24
- searchDiv.classList.toggle('qld__header__site-search--open');
25
-
29
+ if (searchDiv.classList.contains('qld__header__site-search--open')) {
30
+ searchDiv.classList.remove('qld__header__site-search--open');
31
+ searchDiv.classList.add('qld__header__site-search--closed');
32
+
33
+ // Change icon and text back to default
34
+ toggleIcon.setAttribute('href', 'assets/img/svg-icons.svg#qld__icon__search');
35
+ toggleText.textContent = 'Search';
36
+ } else {
37
+ searchDiv.classList.remove('qld__header__site-search--closed');
38
+ searchDiv.classList.add('qld__header__site-search--open');
39
+
40
+ // Change icon and text to active state
41
+ toggleIcon.setAttribute('href', 'assets/img/svg-icons.svg#qld__icon__close');
42
+ toggleText.textContent = 'Close';
43
+ }
44
+
26
45
  // Optional: Update the aria-expanded attribute for accessibility
27
- const isExpanded = event.currentTarget.getAttribute('aria-expanded') === 'true';
28
- event.currentTarget.setAttribute('aria-expanded', !isExpanded);
46
+ const isExpanded = searchDiv.classList.contains('qld__header__site-search--open');
47
+ event.currentTarget.setAttribute('aria-expanded', isExpanded);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Shows suggestions based on the user's input.
53
+ *
54
+ * @param {string} value - The current input value.
55
+ * @param {boolean} isDefault - Whether to show default suggestions or not.
56
+ * @returns {void}
57
+ **/
58
+ export function showSuggestions(value = '', isDefault = false) {
59
+ const suggestions = document.getElementById('suggestions');
60
+ const searchInput = document.getElementById('search-input');
61
+
62
+ if (!suggestions || !searchInput) {
63
+ console.error("Required elements not found.");
64
+ return;
65
+ }
66
+
67
+ const loadedSuggestions = defaultSuggestions;
68
+
69
+ if (isDefault) {
70
+ suggestions.innerHTML = `
71
+ <div class="suggestions-category mt-4 mb-2">
72
+ <strong>Popular Services</strong>
73
+ <ul class="mt-2">${loadedSuggestions.popular_services.map(item => `<li onclick="selectSuggestion('${item.title}')"><a href="${item.href}">${item.title}</a></li>`).join('')}</ul>
74
+ </div>
75
+ <div class="suggestions-category mt-4">
76
+ <strong>Categories</strong>
77
+ <ul class="mt-2">${loadedSuggestions.categories.map(item => `<li onclick="selectSuggestion('${item.title}')"><a href="${item.href}">${item.title}</a></li>`).join('')}</ul>
78
+ </div>
79
+ ${loadedSuggestions.options.view_more ? `<div class="suggestions-category mt-4 mb-4"><a href="${loadedSuggestions.options.href}">${loadedSuggestions.options.label}</a></div>` : ''}
80
+ `;
81
+ suggestions.classList.add('show');
82
+ createPopper(searchInput, suggestions, {
83
+ placement: 'bottom-start',
84
+ });
85
+ suggestions.style.display = 'block';
86
+ return;
29
87
  }
88
+
89
+ if (value.length === 0) {
90
+ suggestions.innerHTML = '';
91
+ suggestions.style.display = 'none';
92
+ return;
93
+ }
94
+
95
+ const allSuggestions = [...loadedSuggestions.popular_services, ...loadedSuggestions.categories];
96
+ const filteredSuggestions = allSuggestions.filter(item => item.title.toLowerCase().includes(value.toLowerCase()));
97
+
98
+ if (filteredSuggestions.length === 0) {
99
+ suggestions.innerHTML = '';
100
+ suggestions.style.display = 'none';
101
+ return;
102
+ }
103
+
104
+ const highlightText = (text, query) => {
105
+ const regex = new RegExp(`(${query})`, 'gi');
106
+ return text.replace(regex, '<strong>$1</strong>');
107
+ };
108
+
109
+ suggestions.innerHTML = `
110
+ <div class="suggestions-category mt-4">
111
+ <strong>Suggestions</strong>
112
+ <ul class="mt-2">${filteredSuggestions.map(item => `<li onclick="selectSuggestion('${item.title}')"><a href="${item.href}">${highlightText(item.title, value)}</a></li>`).join('')}</ul>
113
+ </div>
114
+ `;
115
+ suggestions.classList.add('show');
116
+
117
+ // Initialize Popper.js to manage the dropdown position
118
+ createPopper(searchInput, suggestions, {
119
+ placement: 'bottom-start',
120
+ });
121
+ suggestions.style.display = 'block';
122
+ }
123
+
124
+ /**
125
+ * Sets the selected suggestion into the input field.
126
+ *
127
+ * @param {string} value - The selected suggestion.
128
+ * @returns {void}
129
+ */
130
+ export function selectSuggestion(value) {
131
+ const searchInput = document.getElementById('search-input');
132
+ const suggestions = document.getElementById('suggestions');
133
+
134
+ if (searchInput && suggestions) {
135
+ searchInput.value = value;
136
+ suggestions.style.display = 'none';
137
+ }
138
+ }
139
+
140
+ // Ensure the input exists before adding event listeners
141
+ const searchInput = document.getElementById('search-input');
142
+ if (searchInput) {
143
+
144
+ // Events
145
+ searchInput.addEventListener('keyup', function() {
146
+ showSuggestions(this.value);
147
+ });
148
+
149
+ searchInput.addEventListener('focus', function() {
150
+ showSuggestions('', true);
151
+ });
152
+
153
+ searchInput.addEventListener('click', function() {
154
+ if (this.value === '') {
155
+ showSuggestions('', true);
156
+ }
157
+ });
158
+
159
+ // Close suggestions when clicking outside
160
+ document.addEventListener('click', function(event) {
161
+ if (!searchInput.contains(event.target) && !document.getElementById('suggestions').contains(event.target)) {
162
+ document.getElementById('suggestions').style.display = 'none';
163
+ }
164
+ });
30
165
  }
@@ -175,44 +175,141 @@
175
175
  </svg>
176
176
  </a>
177
177
  <div class="qld__header__cta-wrapper">
178
- {{#if sitePreHeader.mainNavCtaOne.value}}
179
- <a class="qld__header__cta-link" href="{{sitePreHeader.mainNavCtaOne.value}}">
180
- {{#if sitePreHeader.mainNavCtaOne.icon.value}}
181
- <span class="qld__header__cta-link-icon">
182
- <i class="{{icon-root}}#{{sitePreHeader.mainNavCtaOne.icon.value}}"></i>
183
- </span>
184
- {{/if}}
185
- <span class="qld__header__cta-link-text">{{sitePreHeader.mainNavCtaOne.text.value}}</span>
186
- </a>
187
- {{/if}}
188
- {{#if sitePreHeader.mainNavCtaTwo.value}}
189
- <a class="qld__header__cta-link" href="{{sitePreHeader.mainNavCtaTwo.value}}">
190
- {{#if sitePreHeader.mainNavCtaTwo.icon.value}}
191
- <span class="qld__header__cta-link-icon">
192
- <i class="{{icon-root}}#{{sitePreHeader.mainNavCtaTwo.icon.value}}"></i>
193
- </span>
194
- {{/if}}
195
- <span class="qld__header__cta-link-text">{{sitePreHeader.mainNavCtaTwo.text.value}}</span>
196
- </a>
178
+ {{#if sitePreHeader.CTA}}
179
+ {{#each sitePreHeader.CTA}}
180
+ <div {{#if dropdown_enabled}}class="dropdown dropdownCTA"{{/if}}>
181
+ <a
182
+ {{#if dropdown_enabled}}
183
+ id="dropdown{{id}}"
184
+ role="button"
185
+ data-bs-toggle="dropdown"
186
+ aria-expanded="false"
187
+ class="qld__header__cta-link"
188
+ {{else}}
189
+ href="{{url.value}}"
190
+ class="qld__header__cta-link"
191
+ {{/if}}>
192
+ {{#if icon.value}}
193
+ <span class="qld__header__cta-link-icon">
194
+ <i class="{{icon-root}}#{{icon.value}}"></i>
195
+ </span>
196
+ {{/if}}
197
+ <span class="qld__header__cta-link-text">{{text.value}}</span>
198
+ </a>
199
+
200
+ {{#if dropdown_enabled}}
201
+ <ul class="dropdown-menu dark" aria-labelledby="dropdown{{id}}">
202
+
203
+ {{#isType dropdown_options.dropdown_type "list"}}
204
+ {{#if dropdown_options.dropdown_config}}
205
+ {{#each dropdown_options.dropdown_config.groups}}
206
+ <li class="qld__header__cta-list">
207
+ <a href="{{url}}"
208
+ {{#if action}}
209
+ target="{{action}}"
210
+ {{/if}}>
211
+ {{label}}
212
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="cta_arrow">
213
+ <path d="M18.8592 12.6135L13.6659 17.6633C13.5721 17.7781 13.4156 17.8068 13.2905 17.8068C13.1654 17.8068 13.0402 17.7781 12.9464 17.692C12.7274 17.5199 12.7274 17.233 12.9151 17.0608L17.295 12.757H5.50056C5.21899 12.757 5 12.5562 5 12.3266C5 12.0971 5.21899 11.8389 5.50056 11.8389H17.295L12.9151 7.56375C12.7274 7.3916 12.7274 7.10468 12.9464 6.93253C13.1654 6.76038 13.4782 6.76038 13.6659 6.96122L18.8592 12.011C19.0469 12.1832 19.0469 12.4414 18.8592 12.6135Z" fill="#FFE500"/>
214
+ </svg>
215
+ </a>
216
+ </li>
217
+ {{/each}}
218
+ {{#if dropdown_options.dropdown_config.view_more}}
219
+ <li class="qld__header__cta-list">
220
+ <a href="{{dropdown_options.dropdown_config.view_more_options.url}}" href="{{dropdown_options.dropdown_config.view_more_options.target}}" class="border-bottom-0">{{dropdown_options.dropdown_config.view_more_options.label}}
221
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="viewMoreCTA">
222
+ <path d="M8.84375 4.65625C8.65625 4.46875 8.3125 4.46875 8.125 4.65625C7.9375 4.84375 7.9375 5.1875 8.125 5.375L10.2813 7.5H4.5C4.21875 7.5 4 7.75 4 8C4 8.28125 4.21875 8.5 4.5 8.5L10.2813 8.5L8.125 10.6562C7.9375 10.8437 7.9375 11.1875 8.125 11.375C8.3125 11.5625 8.65625 11.5625 8.84375 11.375L11.8438 8.375C11.9375 8.28125 12 8.15625 12 8C12 7.875 11.9375 7.75 11.8438 7.65625L8.84375 4.65625ZM8 0C3.5625 0 0 3.59375 0 8C0 12.4375 3.5625 16 8 16C12.4063 16 16 12.4375 16 8C16 3.59375 12.4062 0 8 0ZM8 15C4.125 15 1 11.875 1 8C1 4.15625 4.125 1 8 1C11.8438 1 15 4.15625 15 8C15 11.875 11.8438 15 8 15Z" fill="#FFE500" />
223
+ </svg>
224
+ </a>
225
+ </li>
226
+ {{/if}}
227
+ {{/if}}
228
+ {{/isType}}
229
+
230
+ {{#isType dropdown_options.dropdown_type "form"}}
231
+ {{#if dropdown_options.dropdown_config.groups}}
232
+ {{#each dropdown_options.dropdown_config.groups}}
233
+
234
+ {{#if heading}}<h4 class="mt-2">{{heading}}</h4>{{/if}}
235
+ {{#if content}}<p>{{content}}</p>{{/if}}
236
+
237
+ {{#isType actionType "button"}}
238
+ <a class="btn btn-primary" href="{{action.button_action}}"
239
+ {{#if action.button_targetAttr }}
240
+ target="{{action.button_targetAttr}}"
241
+ {{/if}}>
242
+ <span class="btn-icon fa-solid fa-arrow-up-right-from-square"></span>
243
+ {{action.button_label}}
244
+ </a>
245
+ {{/isType}}
246
+
247
+ {{#each links}}
248
+ <div class="group">
249
+ <a class="mt-4 qld__header__cta-group-list" href="{{url}}"
250
+ {{#if action}}
251
+ target="{{action}}"
252
+ {{/if}}>
253
+ {{label}}
254
+ </a>
255
+ </div>
256
+ <hr>
257
+ {{/each}}
258
+
259
+ {{#isType actionType "list"}}
260
+ {{#each list_items}}
261
+ <ul>
262
+ <li class="qld__header__cta-group-list group">
263
+ <a href="{{url}}"
264
+ {{#if action }}
265
+ target="{{action}}"
266
+ {{/if}}>
267
+ {{label}}
268
+ </a>
269
+ </li>
270
+ </ul>
271
+ <hr>
272
+ {{/each}}
273
+ {{/isType}}
274
+
275
+ {{#isType actionType "select"}}
276
+ <select class="qld-text-input form-select qld-select" aria-label="" required=""
277
+ aria-required="">
278
+ <option selected="">Please select</option>
279
+ {{#each options}}
280
+ <option value="{{value}}">{{value}}</option>
281
+ {{/each}}
282
+ </select>
283
+ {{/isType}}
284
+
285
+ {{/each}}
286
+ {{/if}}
287
+ {{/isType}}
288
+
289
+ </ul>
290
+ {{/if}}
291
+ </div>
292
+ {{/each}}
197
293
  {{/if}}
198
294
  </div>
199
295
  <div class="qld__header__main-nav-controls">
200
296
  {{#if siteSearchAsset.value}}
201
297
  <button aria-controls="qld-header-search"
202
- class="qld__header__toggle-main-nav qld__main-nav__toggle-search"
203
- aria-expanded="false">
204
- <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" class="qld__icon qld__icon--lg">
205
- <use href="{{icon-root}}#{{siteSearchAsset.icons.search-icon}}"></use>
206
- </svg>
298
+ class="qld__header__toggle-main-nav qld__main-nav__toggle-search" aria-expanded="false">
299
+ <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg"
300
+ class="qld__icon qld__icon--lg">
301
+ <use href="{{icon-root}}#{{siteSearchAsset.options.icons.search-icon}}"></use>
302
+ </svg>
207
303
  <span class="qld__main-nav__toggle-text">Search</span>
208
304
  </button>
209
305
  {{/if}}
210
306
  <button aria-controls="main-nav" class="qld__header__toggle-main-nav qld__main-nav__toggle--open"
211
307
  data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
212
308
  aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
213
- <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" class="qld__icon qld__icon--lg">
214
- <use href="{{icon-root}}#{{siteSearchAsset.icons.menu-icon}}"></use>
215
- </svg>
309
+ <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg"
310
+ class="qld__icon qld__icon--lg">
311
+ <use href="{{icon-root}}#{{siteSearchAsset.options.icons.menu-icon}}"></use>
312
+ </svg>
216
313
  <span class="qld__main-nav__toggle-text">Menu</span>
217
314
  </button>
218
315
  </div>
@@ -227,7 +324,7 @@
227
324
  <div class="qld__header__brand-image">
228
325
  {{#if siteHeader.logo.value}}
229
326
  <img src="{{siteHeader.logo.value}}" width="329.57" height="56">
230
- <title>Queensland Government</title>
327
+ <title>Queensland Government</title>
231
328
  </img>
232
329
  {{else}}
233
330
  <svg width="330" height="56" viewBox="0 0 330 56" fill="none"
@@ -401,7 +498,6 @@
401
498
  </a>
402
499
  </div>
403
500
  {{/if}}
404
-
405
501
  {{#if siteHeader.config.otherbrand_enabled}}
406
502
  <div class="qld__header__brand">
407
503
  <a href="{{siteHeader.url.value}}">
@@ -606,12 +702,14 @@
606
702
  </a>
607
703
  </div>
608
704
  {{/if}}
609
-
610
705
  {{#if siteSearchAsset.value}}
611
706
  <div id="qld-header-search" class="qld__header__site-search qld__header__site-search--closed">
612
- <form id="site-search">
613
- <input type="text" class="form-control" placeholder="Search this site">
614
- <input type="submit" class="btn btn-primary" value="Search">
707
+ <form id="site-search" {{#if siteSearchAsset.formAction.url}}action="{{siteSearchAsset.formAction.url}}"{{/if}}>
708
+ <input type="text" class="form-control{{#if siteSearchAsset.options.borderStyle.full}} border-full{{/if}}"
709
+ placeholder="{{#if siteSearchAsset.placeholder}}{{siteSearchAsset.placeholder}}{{else}}Search this site{{/if}}"
710
+ id="search-input">
711
+ <ul id="suggestions" class="suggestions-dropdown suggestions-dropdown__group"></ul>
712
+ <input type="submit" class="btn btn-primary" value="{{#if siteSearchAsset.label}}{{siteSearchAsset.label}}{{else}}Search{{/if}}">
615
713
  </form>
616
714
  </div>
617
715
  {{/if}}