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

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 (53) 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/handlebars.helpers.js +8 -1
  16. package/dist/components/handlebars.init.bundle.js +1 -1
  17. package/dist/components/handlebars.init.bundle.js.map +3 -3
  18. package/dist/sample-data/dateinput/dateinput.data.json +1 -0
  19. package/dist/sample-data/header/header.data.json +245 -31
  20. package/dist/sample-data/select/select.data.json +1 -0
  21. package/dist/sample-data/textarea/textarea.data.json +1 -0
  22. package/dist/sample-data/textbox/textbox.data.json +1 -0
  23. package/package.json +19 -19
  24. package/src/components/bs5/dateinput/Dateinput.stories.js +2 -32
  25. package/src/components/bs5/dateinput/dateinput.data.json +1 -0
  26. package/src/components/bs5/dateinput/dateinput.hbs +12 -12
  27. package/src/components/bs5/header/_colours.scss +31 -15
  28. package/src/components/bs5/header/_icons.scss +1 -1
  29. package/src/components/bs5/header/_search.json +45 -0
  30. package/src/components/bs5/header/header.data.json +245 -31
  31. package/src/components/bs5/header/header.functions.js +143 -8
  32. package/src/components/bs5/header/header.hbs +131 -33
  33. package/src/components/bs5/header/header.scss +178 -35
  34. package/src/components/bs5/navbar/_colours.scss +19 -19
  35. package/src/components/bs5/navbar/navbar.functions.js +59 -52
  36. package/src/components/bs5/navbar/navbar.hbs +65 -3
  37. package/src/components/bs5/navbar/navbar.scss +73 -27
  38. package/src/components/bs5/select/Select.stories.js +4 -4
  39. package/src/components/bs5/select/select.data.json +1 -0
  40. package/src/components/bs5/select/select.hbs +3 -3
  41. package/src/components/bs5/textarea/Textarea.stories.js +2 -32
  42. package/src/components/bs5/textarea/textarea.data.json +1 -0
  43. package/src/components/bs5/textarea/textarea.hbs +8 -8
  44. package/src/components/bs5/textbox/Textbox.stories.js +2 -15
  45. package/src/components/bs5/textbox/textInput.scss +10 -2
  46. package/src/components/bs5/textbox/textbox.data.json +1 -0
  47. package/src/components/bs5/textbox/textbox.hbs +7 -6
  48. package/src/js/handlebars.helpers.js +8 -1
  49. package/src/main.js +26 -2
  50. package/src/stories/templates/ContentPage/ContentPage.mdx +0 -40
  51. package/src/stories/templates/ContentPage/ContentPage.stories.js +0 -36
  52. package/src/stories/templates/LandingPage/LandingPage.mdx +0 -20
  53. package/src/stories/templates/LandingPage/LandingPage.stories.js +0 -25
@@ -1,5 +1,5 @@
1
1
  // ------------------------------------------------------------------------------------------------------------------
2
- // 1. Palette colours
2
+ // 1. Icons in header
3
3
  // ------------------------------------------------------------------------------------------------------------------
4
4
  .qld__header {
5
5
  .qld__icon {
@@ -0,0 +1,45 @@
1
+ {
2
+ "defaultSuggestions": {
3
+ "popular_services": [
4
+ {
5
+ "title": "Renew vehicle or boat rego",
6
+ "href": "https://www.service.transport.qld.gov.au/renewregistration/public/Welcome.xhtml"
7
+ },
8
+ {
9
+ "title": "Check my license demerit points",
10
+ "href": "https://www.service.transport.qld.gov.au/checkmydemeritpoints/public/Welcome.xhtml"
11
+ },
12
+ {
13
+ "title": "Renew my driving license",
14
+ "href": "https://www.qld.gov.au/transport/licensing/driver-licensing/renew-replace/renew/online"
15
+ },
16
+ {
17
+ "title": "Change my address",
18
+ "href": "https://www.change-of-address.services.qld.gov.au/"
19
+ }
20
+ ],
21
+ "categories": [
22
+ {
23
+ "title": "Transport and motoring",
24
+ "href": "/transport"
25
+ },
26
+ {
27
+ "title": "Employment and jobs",
28
+ "href": "/jobs"
29
+ },
30
+ {
31
+ "title": "Education and training",
32
+ "href": "/education"
33
+ },
34
+ {
35
+ "title": "Queensland and its government",
36
+ "href": "/about"
37
+ }
38
+ ],
39
+ "options": {
40
+ "label": "Browse all categories",
41
+ "view_more": true,
42
+ "href": "/queenslanders"
43
+ }
44
+ }
45
+ }
@@ -8,24 +8,185 @@
8
8
  "text": {
9
9
  "value": "Queensland Government websites"
10
10
  },
11
- "mainNavCtaOne": {
12
- "value": "#",
13
- "icon": {
14
- "value": "ctaIcon"
11
+ "CTA": [
12
+ {
13
+ "id": "CTAone",
14
+ "url": {
15
+ "value": "#"
16
+ },
17
+ "icon": {
18
+ "value": "ctaIcon"
19
+ },
20
+ "text": {
21
+ "value": "For Queenslanders"
22
+ },
23
+ "dropdown_enabled": true,
24
+ "dropdown_options": {
25
+ "dropdown_type": "list",
26
+ "view_more_label": "Browse all information and services",
27
+ "view_more_url": "https://www.qld.gov.au/queenslanders",
28
+ "dropdown_config": {
29
+ "groups": [
30
+ {
31
+ "action": "_blank",
32
+ "url": "#",
33
+ "label": "Transport and motoring"
34
+ },
35
+ {
36
+ "action": "_blank",
37
+ "url": "#",
38
+ "label": "Employment and jobs"
39
+ },
40
+ {
41
+ "action": "_blank",
42
+ "url": "#",
43
+ "label": "Education and training"
44
+ },
45
+ {
46
+ "action": "_blank",
47
+ "url": "#",
48
+ "label": "Queensland and its government"
49
+ },
50
+ {
51
+ "action": "_blank",
52
+ "url": "#",
53
+ "label": "Health and wellbeing"
54
+ },
55
+ {
56
+ "action": "_blank",
57
+ "url": "#",
58
+ "label": "Community support"
59
+ }
60
+ ],
61
+ "view_more": true,
62
+ "view_more_options": {
63
+ "url": "#",
64
+ "label": "View more",
65
+ "target": "_blank"
66
+ }
67
+ }
68
+ }
15
69
  },
16
- "text": {
17
- "value": "Link 1"
18
- }
19
- },
20
- "mainNavCtaTwo": {
21
- "value": "#",
22
- "icon": {
23
- "value": "ctaIcon"
70
+ {
71
+ "id": "CTAtwo",
72
+ "url": {
73
+ "value": "#"
74
+ },
75
+ "icon": {
76
+ "value": "ctaIcon"
77
+ },
78
+ "text": {
79
+ "value": "Business and Industry"
80
+ },
81
+ "dropdown_enabled": true,
82
+ "dropdown_options": {
83
+ "dropdown_type": "list",
84
+ "view_more_label": "All categories",
85
+ "view_more_url": "https://www.business.qld.gov.au/",
86
+ "dropdown_config": {
87
+ "groups": [
88
+ {
89
+ "action": "_blank",
90
+ "url": "#",
91
+ "label": "Starting a business"
92
+ },
93
+ {
94
+ "action": "_blank",
95
+ "url": "#",
96
+ "label": "Running a business"
97
+ },
98
+ {
99
+ "action": "_blank",
100
+ "url": "#",
101
+ "label": "Employing people"
102
+ },
103
+ {
104
+ "action": "_blank",
105
+ "url": "#",
106
+ "label": "Payroll tax"
107
+ },
108
+ {
109
+ "action": "_blank",
110
+ "url": "#",
111
+ "label": "Industries"
112
+ },
113
+ {
114
+ "action": "_blank",
115
+ "url": "#",
116
+ "label": "Investing in Queensland"
117
+ }
118
+ ],
119
+ "view_more": true,
120
+ "view_more_options": {
121
+ "url": "#",
122
+ "label": "View more",
123
+ "target": "_blank"
124
+ }
125
+ }
126
+ }
24
127
  },
25
- "text": {
26
- "value": "Link 2"
128
+ {
129
+ "id": "CTAthree",
130
+ "url": {
131
+ "value": "#"
132
+ },
133
+ "icon": {
134
+ "value": "ctaIcon"
135
+ },
136
+ "text": {
137
+ "value": "Login"
138
+ },
139
+ "dropdown_enabled": true,
140
+ "dropdown_options": {
141
+ "dropdown_type": "form",
142
+ "dropdown_config": {
143
+ "groups": [
144
+ {
145
+ "heading": "Log in to For government",
146
+ "content": "Most employees can log in using single sign on (SSO).",
147
+ "usesButton": "true",
148
+ "actionType": "button",
149
+ "action": {
150
+ "button_action": "#",
151
+ "button_targetAttr": "_blank",
152
+ "button_label": "Login"
153
+ },
154
+ "links": [
155
+ {
156
+ "action": "_blank",
157
+ "label": "If your agency doesn't use SSO.",
158
+ "url": "https://www.forgov.qld.gov.au/user#log-in"
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ "heading": "Select your agency",
164
+ "content": "See information relevant to your agency.",
165
+ "actionType": "select",
166
+ "options": [
167
+ {
168
+ "value": "agency 1"
169
+ }
170
+ ]
171
+ }
172
+ ],
173
+ "examples": [
174
+ {
175
+ "heading": "For employees",
176
+ "actionType": "list",
177
+ "list_items": [
178
+ {
179
+ "action": "_self",
180
+ "label": "Your profile",
181
+ "href": "#"
182
+ }
183
+ ]
184
+ }
185
+ ]
186
+ }
187
+ }
27
188
  }
28
- }
189
+ ]
29
190
  },
30
191
  "siteHeader": {
31
192
  "config": {
@@ -49,13 +210,20 @@
49
210
  },
50
211
  "siteSearchAsset": {
51
212
  "value": "#",
52
- "icons": {
53
- "menu-icon": "qld__icon__mobile-menu",
54
- "search-icon": "qld__icon__search",
55
- "search-close-icon": "qld__icon__close"
213
+ "placeholder": "",
214
+ "label": "",
215
+ "formAction": {
216
+ "url": "https://www.forgov.qld.gov.au/search"
56
217
  },
57
- "siteSearchUrl": {
58
- "value": ""
218
+ "options": {
219
+ "icons": {
220
+ "menu-icon": "qld__icon__mobile-menu",
221
+ "search-icon": "qld__icon__search",
222
+ "search-close-icon": "qld__icon__close"
223
+ },
224
+ "borderStyle": {
225
+ "full": true
226
+ }
59
227
  }
60
228
  }
61
229
  },
@@ -74,7 +242,11 @@
74
242
  "value": "#"
75
243
  },
76
244
  "text": {
77
- "value": "Link 1"
245
+ "value": "List 1"
246
+ },
247
+ "dropdown_enabled": true,
248
+ "dropdown_options": {
249
+ "dropdown_type": "list"
78
250
  }
79
251
  },
80
252
  "mainNavCtaTwo": {
@@ -83,7 +255,43 @@
83
255
  "value": "#"
84
256
  },
85
257
  "text": {
86
- "value": "Link 2"
258
+ "value": "List 2"
259
+ },
260
+ "dropdown_enabled": true,
261
+ "dropdown_options": {
262
+ "dropdown_type": "list"
263
+ }
264
+ },
265
+ "mainNavCtaThree": {
266
+ "value": "#",
267
+ "icon": {
268
+ "value": "ctaIcon"
269
+ },
270
+ "text": {
271
+ "value": "Login"
272
+ },
273
+ "dropdown_enabled": true,
274
+ "dropdown_options": {
275
+ "dropdown_type": "form",
276
+ "dropdown_config": {
277
+ "groups": [
278
+ {
279
+ "heading": "Log in to For government",
280
+ "button_action": "#",
281
+ "button_targetAttr": "_blank",
282
+ "button_label": "Login"
283
+ }
284
+ ],
285
+ "examples": [
286
+ {
287
+ "heading": "For employees",
288
+ "content": "See information relevant to your agency.",
289
+ "button_action": "#",
290
+ "button_targetAttr": "_blank",
291
+ "button_label": "Login"
292
+ }
293
+ ]
294
+ }
87
295
  }
88
296
  }
89
297
  },
@@ -95,8 +303,7 @@
95
303
  "url": {
96
304
  "value": "https://qld.gov.au"
97
305
  },
98
- "logo": {
99
- },
306
+ "logo": {},
100
307
  "secondaryType": {
101
308
  "logo": {
102
309
  "value": ""
@@ -111,13 +318,20 @@
111
318
  },
112
319
  "siteSearchAsset": {
113
320
  "value": "#",
114
- "icons": {
115
- "menu-icon": "qld__icon__mobile-menu",
116
- "search-icon": "qld__icon__search",
117
- "search-close-icon": "qld__icon__close"
321
+ "placeholder": "Placeholder",
322
+ "label": "Label",
323
+ "formAction": {
324
+ "url": "https://www.forgov.qld.gov.au/search"
118
325
  },
119
- "siteSearchUrl": {
120
- "value": ""
326
+ "options": {
327
+ "icons": {
328
+ "menu-icon": "qld__icon__mobile-menu",
329
+ "search-icon": "qld__icon__search",
330
+ "search-close-icon": "qld__icon__close"
331
+ },
332
+ "borderStyle": {
333
+ "full": false
334
+ }
121
335
  }
122
336
  }
123
337
  }
@@ -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
  }