@qld-gov-au/qgds-bootstrap5 2.0.10 → 2.0.12

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 (113) hide show
  1. package/.storybook/main.mjs +2 -2
  2. package/.storybook/preview.js +5 -2
  3. package/dist/assets/components/bs5/banner/banner.hbs +3 -6
  4. package/dist/assets/components/bs5/card/card.hbs +2 -2
  5. package/dist/assets/components/bs5/dateinput/dateinput.hbs +27 -27
  6. package/dist/assets/components/bs5/formcheck/formcheck.hbs +10 -2
  7. package/dist/assets/components/bs5/head/head.hbs +1 -1
  8. package/dist/assets/components/bs5/searchInput/searchInput.hbs +31 -29
  9. package/dist/assets/components/bs5/select/select.hbs +19 -19
  10. package/dist/assets/components/bs5/tag/tag.hbs +1 -1
  11. package/dist/assets/components/bs5/textarea/textarea.hbs +17 -17
  12. package/dist/assets/components/bs5/textbox/textbox.hbs +17 -18
  13. package/dist/assets/css/qld.bootstrap.css +2 -2
  14. package/dist/assets/css/qld.bootstrap.css.map +3 -3
  15. package/dist/assets/css/qld.bootstrap.legacy.css +2 -2
  16. package/dist/assets/css/qld.bootstrap.legacy.css.map +3 -3
  17. package/dist/assets/js/handlebars.helpers.bundle.js +2 -2
  18. package/dist/assets/js/handlebars.helpers.bundle.js.map +2 -2
  19. package/dist/assets/js/handlebars.init.min.js +141 -135
  20. package/dist/assets/js/handlebars.init.min.js.map +2 -2
  21. package/dist/assets/js/handlebars.partials.js +141 -135
  22. package/dist/assets/js/handlebars.partials.js.map +2 -2
  23. package/dist/assets/js/qld.bootstrap.min.js +9 -10
  24. package/dist/assets/js/qld.bootstrap.min.js.map +4 -4
  25. package/dist/assets/node/handlebars.init.min.js +59 -11
  26. package/dist/assets/node/handlebars.init.min.js.map +2 -2
  27. package/dist/components/bs5/banner/banner.hbs +3 -6
  28. package/dist/components/bs5/card/card.hbs +2 -2
  29. package/dist/components/bs5/dateinput/dateinput.hbs +27 -27
  30. package/dist/components/bs5/formcheck/formcheck.hbs +10 -2
  31. package/dist/components/bs5/head/head.hbs +1 -1
  32. package/dist/components/bs5/searchInput/searchInput.hbs +31 -29
  33. package/dist/components/bs5/select/select.hbs +19 -19
  34. package/dist/components/bs5/tag/tag.hbs +1 -1
  35. package/dist/components/bs5/textarea/textarea.hbs +17 -17
  36. package/dist/components/bs5/textbox/textbox.hbs +17 -18
  37. package/dist/package.json +1 -1
  38. package/dist/sample-data/card/card.data.json +4 -1
  39. package/dist/sample-data/dateinput/dateinput.data.json +14 -12
  40. package/dist/sample-data/formcheck/stories/checkbox/checkbox.data.json +4 -5
  41. package/dist/sample-data/formcheck/stories/radio/radio.data.json +4 -4
  42. package/dist/sample-data/searchInput/searchInput.data.json +19 -10
  43. package/dist/sample-data/select/select.data.json +12 -10
  44. package/dist/sample-data/tag/tag.data.json +149 -143
  45. package/dist/sample-data/textarea/textarea.data.json +14 -11
  46. package/dist/sample-data/textbox/textbox.data.json +13 -10
  47. package/package.json +1 -1
  48. package/src/components/bs5/banner/banner.hbs +3 -6
  49. package/src/components/bs5/banner/banner.scss +10 -7
  50. package/src/components/bs5/banner/banner.stories.js +2 -5
  51. package/src/components/bs5/button/button.scss +4 -11
  52. package/src/components/bs5/button/button.stories.js +17 -15
  53. package/src/components/bs5/card/Card.js +31 -2
  54. package/src/components/bs5/card/Card.mdx +4 -0
  55. package/src/components/bs5/card/card--icon-list-footer.stories.js +2 -24
  56. package/src/components/bs5/card/card--multi-action.stories.js +9 -28
  57. package/src/components/bs5/card/card--no-action.stories.js +5 -27
  58. package/src/components/bs5/card/card--single-action.stories.js +4 -33
  59. package/src/components/bs5/card/card.data.json +4 -1
  60. package/src/components/bs5/card/card.hbs +2 -2
  61. package/src/components/bs5/dateinput/Dateinput.js +26 -11
  62. package/src/components/bs5/dateinput/dateinput.data.json +14 -12
  63. package/src/components/bs5/dateinput/dateinput.hbs +27 -27
  64. package/src/components/bs5/footer/footer_formio.scss +5 -5
  65. package/src/components/bs5/formcheck/Formcheck.js +57 -6
  66. package/src/components/bs5/formcheck/_form-variables.scss +131 -0
  67. package/src/components/bs5/formcheck/formcheck.hbs +10 -2
  68. package/src/components/bs5/formcheck/formcheck.scss +229 -66
  69. package/src/components/bs5/formcheck/stories/bootstrap-validation/bootstrap-validation.stories.js +304 -0
  70. package/src/components/bs5/formcheck/stories/checkbox/checkbox.data.json +4 -5
  71. package/src/components/bs5/formcheck/stories/checkbox/checkbox.stories.js +19 -111
  72. package/src/components/bs5/formcheck/stories/radio/radio.data.json +4 -4
  73. package/src/components/bs5/formcheck/stories/radio/radio.stories.js +30 -122
  74. package/src/components/bs5/inpageAlert/inpageAlert.scss +1 -1
  75. package/src/components/bs5/modal/modal.scss +106 -99
  76. package/src/components/bs5/navbar/navbar.functions.js +122 -19
  77. package/src/components/bs5/pageLayout/{ThemeShowcase.stories.js → PaletteShowcase.stories.js} +36 -35
  78. package/src/components/bs5/searchInput/__snapshots__/searchInput.test.js.snap +24 -28
  79. package/src/components/bs5/searchInput/search.functions.js +93 -76
  80. package/src/components/bs5/searchInput/searchInput.data.json +19 -10
  81. package/src/components/bs5/searchInput/searchInput.hbs +31 -29
  82. package/src/components/bs5/searchInput/searchInput.scss +140 -196
  83. package/src/components/bs5/searchInput/searchInput.stories.js +35 -13
  84. package/src/components/bs5/searchInput/searchInput.test.js +5 -1
  85. package/src/components/bs5/select/Select.js +13 -5
  86. package/src/components/bs5/select/Select.stories.js +27 -83
  87. package/src/components/bs5/select/select.data.json +12 -10
  88. package/src/components/bs5/select/select.hbs +19 -19
  89. package/src/components/bs5/tag/tag--status.stories.js +1 -0
  90. package/src/components/bs5/tag/tag.data.json +149 -143
  91. package/src/components/bs5/tag/tag.hbs +1 -1
  92. package/src/components/bs5/tag/tag.scss +2 -5
  93. package/src/components/bs5/tag/tag.stories.js +1 -0
  94. package/src/components/bs5/textarea/Textarea.js +13 -5
  95. package/src/components/bs5/textarea/Textarea.stories.js +29 -55
  96. package/src/components/bs5/textarea/textarea.data.json +14 -11
  97. package/src/components/bs5/textarea/textarea.hbs +17 -17
  98. package/src/components/bs5/textbox/Textbox.js +16 -5
  99. package/src/components/bs5/textbox/Textbox.stories.js +26 -51
  100. package/src/components/bs5/textbox/textInput.scss +12 -232
  101. package/src/components/bs5/textbox/textbox.data.json +13 -10
  102. package/src/components/bs5/textbox/textbox.hbs +17 -18
  103. package/src/components/bs5/typography/typography.stories.js +1 -1
  104. package/src/css/functions/_index.scss +2 -0
  105. package/src/css/functions/remify.scss +32 -0
  106. package/src/css/functions/snap-line-height.scss +7 -0
  107. package/src/css/main.scss +1 -1
  108. package/src/css/mixins/focusable.scss +4 -1
  109. package/src/css/mixins/make-icon.scss +1 -1
  110. package/src/css/{qld-theme.scss → qld-palettes.scss} +30 -23
  111. package/src/js/handlebars.helpers.js +9 -1
  112. package/src/js/utils.js +142 -0
  113. package/src/components/bs5/formcheck/_formcheck.stories.bak.js +0 -432
@@ -1,34 +1,35 @@
1
1
  export default {
2
- title: "5. Templates/Theme Showcase",
2
+ title: "5. Templates/Palette Showcase",
3
3
  render: (args) => {
4
4
  return args.content;
5
5
  },
6
6
  argTypes: {
7
- themeClass: {
8
- control: { type: 'select' },
9
- options: ['', 'default', 'light', 'alt', 'dark', 'dark-alt'],
10
- description: 'Theme class to apply to the content area',
7
+ paletteClass: {
8
+ control: { type: "select" },
9
+ options: ["", "default", "light", "alt", "dark", "dark-alt"],
10
+ description: "Palette class to apply to the content area",
11
11
  },
12
12
  },
13
13
  parameters: {
14
14
  layout: "padded",
15
15
  docs: {
16
16
  description: {
17
- story: 'This showcase demonstrates the theme palette classes (.default, .light, .alt, .dark, .dark-alt) that automatically apply color and background-color styling.',
17
+ story:
18
+ "This showcase demonstrates the theme palette classes (.default, .light, .alt, .dark, .dark-alt) that automatically apply color and background-color styling.",
18
19
  },
19
20
  },
20
21
  },
21
22
  };
22
23
 
23
24
  /**
24
- * Default Theme
25
- * The default theme uses the base color scheme without additional background styling
25
+ * Default Palette
26
+ * The default palette uses the base color scheme without additional background styling
26
27
  */
27
- export const DefaultTheme = {
28
+ export const DefaultPalette = {
28
29
  args: {
29
30
  content: `
30
31
  <div class="default p-4 mb-4 border">
31
- <h2>Default Theme</h2>
32
+ <h2>Default Palette</h2>
32
33
  <p>This demonstrates the default theme palette. It provides a clean, neutral appearance suitable for most content.</p>
33
34
  <a href="#" class="btn btn-primary me-2">Primary Button</a>
34
35
  <a href="#" class="btn btn-secondary">Secondary Button</a>
@@ -60,19 +61,19 @@ export const DefaultTheme = {
60
61
  };
61
62
 
62
63
  /**
63
- * Light Theme
64
- * The light theme provides a bright, clean appearance
64
+ * Light Palette
65
+ * The light palette provides a bright, clean appearance
65
66
  */
66
- export const LightTheme = {
67
+ export const LightPalette = {
67
68
  args: {
68
69
  content: `
69
70
  <div class="light p-4 mb-4 border">
70
- <h2>Light Theme</h2>
71
+ <h2>Light Palette</h2>
71
72
  <p>This demonstrates the light theme palette. It provides enhanced readability with a light background.</p>
72
73
  <a href="#" class="btn btn-primary me-2">Primary Button</a>
73
74
  <a href="#" class="btn btn-secondary">Secondary Button</a>
74
75
 
75
- <h3 class="mt-4">Theme Features</h3>
76
+ <h3 class="mt-4">Palette Features</h3>
76
77
  <ul>
77
78
  <li>Automatic color and background-color application</li>
78
79
  <li>Optimized contrast ratios</li>
@@ -84,14 +85,14 @@ export const LightTheme = {
84
85
  };
85
86
 
86
87
  /**
87
- * Alt Theme
88
+ * Alt Palette
88
89
  * The alt theme provides an alternative light styling
89
90
  */
90
- export const AltTheme = {
91
+ export const AltPalette = {
91
92
  args: {
92
93
  content: `
93
94
  <div class="alt p-4 mb-4 border">
94
- <h2>Alt Theme</h2>
95
+ <h2>Alt Palette</h2>
95
96
  <p>This demonstrates the alt theme palette. It provides a subtle alternative to the standard light theme.</p>
96
97
  <a href="#" class="btn btn-primary me-2">Primary Button</a>
97
98
  <a href="#" class="btn btn-secondary">Secondary Button</a>
@@ -106,14 +107,14 @@ export const AltTheme = {
106
107
  };
107
108
 
108
109
  /**
109
- * Dark Theme
110
+ * Dark Palette
110
111
  * The dark theme provides a bold, high-contrast appearance
111
112
  */
112
- export const DarkTheme = {
113
+ export const DarkPalette = {
113
114
  args: {
114
115
  content: `
115
116
  <div class="dark p-4 mb-4 border">
116
- <h2>Dark Theme</h2>
117
+ <h2>Dark Palette</h2>
117
118
  <p>This demonstrates the dark theme palette. It provides excellent contrast and a modern appearance.</p>
118
119
  <a href="#" class="btn btn-primary me-2">Primary Button</a>
119
120
  <a href="#" class="btn btn-secondary">Secondary Button</a>
@@ -128,14 +129,14 @@ export const DarkTheme = {
128
129
  };
129
130
 
130
131
  /**
131
- * Dark Alt Theme
132
+ * Dark Alt Palette
132
133
  * The dark alt theme provides an alternative dark styling
133
134
  */
134
- export const DarkAltTheme = {
135
+ export const DarkAltPalette = {
135
136
  args: {
136
137
  content: `
137
138
  <div class="dark-alt p-4 mb-4 border">
138
- <h2>Dark Alt Theme</h2>
139
+ <h2>Dark Alt Palette</h2>
139
140
  <p>This demonstrates the dark alt theme palette. It provides a variation of the dark theme with different background styling.</p>
140
141
  <a href="#" class="btn btn-primary me-2">Primary Button</a>
141
142
  <a href="#" class="btn btn-secondary">Secondary Button</a>
@@ -161,21 +162,21 @@ export const DarkAltTheme = {
161
162
  };
162
163
 
163
164
  /**
164
- * Theme Comparison
165
- * Shows all themes in a single view for comparison
165
+ * Palette Comparison
166
+ * Shows all palettes in a single view for comparison
166
167
  */
167
- export const ThemeComparison = {
168
+ export const PaletteComparison = {
168
169
  args: {
169
170
  content: `
170
171
  <div class="mb-4">
171
- <h2>Theme Palette Comparison</h2>
172
- <p>Compare all available theme classes side by side. Each theme automatically applies appropriate color and background-color styling.</p>
172
+ <h2>Palette Comparison</h2>
173
+ <p>Compare all available palette classes side by side. Each theme automatically applies appropriate color and background-color styling.</p>
173
174
  </div>
174
175
 
175
176
  <div class="row g-4">
176
177
  <div class="col-lg-6">
177
178
  <div class="default p-3 border">
178
- <h3>Default Theme</h3>
179
+ <h3>Default Palette</h3>
179
180
  <p>Base theme with neutral styling.</p>
180
181
  <a href="#" class="btn btn-sm btn-primary">Button</a>
181
182
  </div>
@@ -183,7 +184,7 @@ export const ThemeComparison = {
183
184
 
184
185
  <div class="col-lg-6">
185
186
  <div class="light p-3 border">
186
- <h3>Light Theme</h3>
187
+ <h3>Light Palette</h3>
187
188
  <p>Clean, bright appearance.</p>
188
189
  <a href="#" class="btn btn-sm btn-primary">Button</a>
189
190
  </div>
@@ -191,7 +192,7 @@ export const ThemeComparison = {
191
192
 
192
193
  <div class="col-lg-6">
193
194
  <div class="alt p-3 border">
194
- <h3>Alt Theme</h3>
195
+ <h3>Alt Palette</h3>
195
196
  <p>Alternative light styling.</p>
196
197
  <a href="#" class="btn btn-sm btn-primary">Button</a>
197
198
  </div>
@@ -199,7 +200,7 @@ export const ThemeComparison = {
199
200
 
200
201
  <div class="col-lg-6">
201
202
  <div class="dark p-3 border">
202
- <h3>Dark Theme</h3>
203
+ <h3>Dark Palette</h3>
203
204
  <p>High contrast, modern look.</p>
204
205
  <a href="#" class="btn btn-sm btn-primary">Button</a>
205
206
  </div>
@@ -207,7 +208,7 @@ export const ThemeComparison = {
207
208
 
208
209
  <div class="col-12">
209
210
  <div class="dark-alt p-3 border">
210
- <h3>Dark Alt Theme</h3>
211
+ <h3>Dark Alt Palette</h3>
211
212
  <p>Alternative dark styling with different background treatment.</p>
212
213
  <a href="#" class="btn btn-sm btn-primary">Button</a>
213
214
  </div>
@@ -216,7 +217,7 @@ export const ThemeComparison = {
216
217
 
217
218
  <div class="mt-5">
218
219
  <h3>Background Utility Classes</h3>
219
- <p>These utilities can be used independently of theme classes for specific background styling:</p>
220
+ <p>These utilities can be used independently of palette classes for specific background styling:</p>
220
221
  <div class="row g-3">
221
222
  <div class="col-md-3">
222
223
  <div class="bg-default p-2 text-center rounded">.bg-default</div>
@@ -1,4 +1,4 @@
1
- // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
3
  exports[`SearchInput > Renders as expected 1`] = `
4
4
  "<!--
@@ -11,35 +11,31 @@ exports[`SearchInput > Renders as expected 1`] = `
11
11
  <span class="btn-icon"></span>
12
12
  <span class="btn-label">Search</span>
13
13
  </button>
14
- <div class="suggestions suggestions__group d-none">
15
- <div class="default-suggestions">
16
- <div class="suggestions-category mt-16">
17
- <strong class="suggestions-category-label d-block">Popular services</strong>
18
- <ul class="mt-2">
19
- <li><a href="https://www.forgov.qld.gov.au/pay-benefits-and-policy/leave/submit-a-leave-application">Apply for leave</a></li>
20
- <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/starting-a-new-job/apply-for-higher-duties-or-relieving-at-level">Apply for higher duties or relieving at level</a></li>
21
- <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/recruitment/extending-my-job/extend-a-temporary-or-casual-employee">Extend a temporary or casual employee</a></li>
22
- <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/recruitment">Hire a staff member (recruitment)</a></li>
23
- </ul>
24
- </div>
25
-
26
- <div class="suggestions-category mt-16">
27
- <strong class="suggestions-category-label d-block">Browse by category</strong>
28
- <ul class="mt-12 mb-0">
29
- <li><a href="https://www.forgov.qld.gov.au/pay-benefits-and-policy/directives-policies-circulars-and-guidelines">Search for directives, policies, circulars, and guidelines</a></li>
30
- <li><a href="https://www.forgov.qld.gov.au/pay-benefits-and-policy/benefits/employee-pay-and-benefits">Employee pay and benefits</a></li>
31
- <li><a href="https://www.forgov.qld.gov.au/sandbox/archive/queensland-shared-services">Queensland Shared Services</a></li>
32
- <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/career-development">Career development</a></li>
33
- </ul>
34
- </div>
14
+ <div class="suggestions suggestions__group d-none default">
15
+ <div class="default-suggestions">
16
+ <div class="suggestions-category">
17
+ <strong class="suggestions-category-label d-block">Popular</strong>
18
+ <ul>
19
+ <li><a href="https://www.forgov.qld.gov.au/pay-benefits-and-policy/leave/submit-a-leave-application">Apply for leave now</a></li>
20
+ <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/starting-a-new-job/apply-for-higher-duties-or-relieving-at-level">Apply for higher duties or relieving at level</a></li>
21
+ <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/recruitment/extending-my-job/extend-a-temporary-or-casual-employee">Extend a temporary or casual employee</a></li>
22
+ <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/recruitment">Hire a staff member (recruitment)</a></li>
23
+ <li><a href="/queenslanders" class="view-more">View more</a></li>
24
+ </ul>
25
+ </div>
35
26
 
36
- <div class="suggestions-category">
37
- <a class="px-16 pt-12 pb-16 d-block suggestions-category-view-more"
38
- href="/queenslanders">Browse all categories</a>
27
+ <div class="suggestions-category">
28
+ <strong class="suggestions-category-label d-block">Collection</strong>
29
+ <ul>
30
+ <li><a href="https://www.forgov.qld.gov.au/pay-benefits-and-policy/directives-policies-circulars-and-guidelines">Search for directives, policies, circulars, and guidelines</a></li>
31
+ <li><a href="https://www.forgov.qld.gov.au/pay-benefits-and-policy/benefits/employee-pay-and-benefits">Employee pay and benefits</a></li>
32
+ <li><a href="https://www.forgov.qld.gov.au/sandbox/archive/queensland-shared-services">Queensland Shared Services</a></li>
33
+ <li><a href="https://www.forgov.qld.gov.au/recruitment-performance-and-career/career-development">Career development</a></li>
34
+ <li><a href="/queenslanders" class="view-more">View all</a></li>
35
+ </ul>
36
+ </div>
39
37
  </div>
40
- </div>
41
- <div class="dynamic-suggestions"></div>
38
+ <div class="dynamic-suggestions" data-view-more="/queenslanders"></div>
42
39
  </div>
43
-
44
40
  </div>"
45
41
  `;
@@ -34,7 +34,7 @@ export function selectSuggestion(value, form) {
34
34
 
35
35
  if (searchInput && suggestions) {
36
36
  searchInput.value = value.trim();
37
- suggestions.classList.add("d-none");
37
+ // suggestions.classList.add("d-none");
38
38
 
39
39
  // Retrieve additional params
40
40
  const collection =
@@ -87,9 +87,13 @@ export async function showSuggestions(value = "", isDefault = false, form) {
87
87
 
88
88
  // Hide/show default suggestions
89
89
  if (isDefault) {
90
- defaultSuggestionsContainer.classList.remove("d-none");
91
- dynamicSuggestionsContainer.innerHTML = "";
92
- dynamicSuggestionsContainer.classList.add("d-none");
90
+ if (defaultSuggestionsContainer) {
91
+ defaultSuggestionsContainer.classList.remove("d-none");
92
+ }
93
+ if (dynamicSuggestionsContainer) {
94
+ dynamicSuggestionsContainer.innerHTML = "";
95
+ dynamicSuggestionsContainer.classList.add("d-none");
96
+ }
93
97
  createPopper(searchInput, suggestions, {
94
98
  placement: "bottom-start",
95
99
  });
@@ -97,30 +101,34 @@ export async function showSuggestions(value = "", isDefault = false, form) {
97
101
  return;
98
102
  }
99
103
 
100
- if (value.length === 0) {
101
- dynamicSuggestionsContainer.innerHTML = "";
102
- dynamicSuggestionsContainer.classList.add("d-none");
103
- return;
104
+ if (dynamicSuggestionsContainer) {
105
+ if (value.length === 0) {
106
+ dynamicSuggestionsContainer.innerHTML = "";
107
+ dynamicSuggestionsContainer.classList.add("d-none");
108
+ return;
109
+ }
104
110
  }
105
111
 
106
- defaultSuggestionsContainer.classList.add("d-none");
112
+ if (defaultSuggestionsContainer) {
113
+ defaultSuggestionsContainer.classList.add("d-none");
114
+ }
107
115
 
108
116
  // Fetch dynamic suggestions if available
109
- const suggestUrl = searchInput.getAttribute("data-suggestions");
110
- if (suggestUrl) {
111
- const collection =
112
- searchInput.getAttribute("data-collection") || "qgov~sp-search";
113
- const profile = searchInput.getAttribute("data-profile") || "qld";
114
- const fetchedSuggestions = await fetchData(
115
- `${suggestUrl}?collection=${collection}&profile=${profile}&fmt=json&alpha=0.5&partial_query=${encodeURIComponent(value)}`,
116
- "suggestions",
117
- );
118
-
119
- if (fetchedSuggestions.length > 0) {
120
- dynamicSuggestionsContainer.innerHTML = `
121
- <div class="suggestions-category mt-16">
122
- <strong class="suggestions-category-label d-block">Suggestions</strong>
123
- <ul class="mt-2">${fetchedSuggestions
117
+ if (dynamicSuggestionsContainer) {
118
+ const suggestUrl = searchInput.getAttribute("data-suggestions");
119
+ if (suggestUrl) {
120
+ const collection =
121
+ searchInput.getAttribute("data-collection") || "qgov~sp-search";
122
+ const profile = searchInput.getAttribute("data-profile") || "qld";
123
+ const fetchedSuggestions = await fetchData(
124
+ `${suggestUrl}?collection=${collection}&profile=${profile}&fmt=json&alpha=0.5&partial_query=${encodeURIComponent(value)}`,
125
+ "suggestions",
126
+ );
127
+
128
+ if (fetchedSuggestions.length > 0) {
129
+ dynamicSuggestionsContainer.innerHTML = `
130
+ <div class="suggestions-category">
131
+ <ul>${fetchedSuggestions
124
132
  .slice(0, 4)
125
133
  .map((item) => {
126
134
  const highlightedText = item.replace(
@@ -131,61 +139,70 @@ export async function showSuggestions(value = "", isDefault = false, form) {
131
139
  })
132
140
  .join("")}</ul>
133
141
  </div>`;
134
- dynamicSuggestionsContainer.classList.remove("d-none");
135
- createPopper(searchInput, suggestions, {
136
- placement: "bottom-start",
137
- });
138
- suggestions.classList.remove("d-none");
139
-
140
- // Attach click event listeners to each suggestion item
141
- form.querySelectorAll(".suggestions li").forEach((item) => {
142
- item.addEventListener("click", () =>
143
- selectSuggestion(item.innerText, form),
144
- );
145
- });
146
- } else {
147
- dynamicSuggestionsContainer.innerHTML = "";
148
- dynamicSuggestionsContainer.classList.add("d-none");
149
- suggestions.classList.add("d-none");
142
+ dynamicSuggestionsContainer.classList.remove("d-none");
143
+ createPopper(searchInput, suggestions, {
144
+ placement: "bottom-start",
145
+ });
146
+ suggestions.classList.remove("d-none");
147
+
148
+ // Attach click event listeners to each suggestion item
149
+ form.querySelectorAll(".suggestions li").forEach((item) => {
150
+ item.addEventListener("click", () =>
151
+ selectSuggestion(item.innerText, form),
152
+ );
153
+ });
154
+ } else {
155
+ dynamicSuggestionsContainer.innerHTML = "";
156
+ dynamicSuggestionsContainer.classList.add("d-none");
157
+ suggestions.classList.add("d-none");
158
+ }
150
159
  }
151
- }
152
160
 
153
- const resultsUrl = searchInput.getAttribute("data-results-url");
154
- if (resultsUrl) {
155
- const collection =
156
- searchInput.getAttribute("data-collection") || "qgov~sp-search";
157
- const profile = searchInput.getAttribute("data-profile") || "qld";
158
- const fetchedServices = await fetchData(
159
- `${resultsUrl}?collection=${collection}&profile=${profile}&smeta_sfinder_sand=yes&query=${encodeURIComponent(value)}`,
160
- "services",
161
- );
162
-
163
- if (
164
- fetchedServices.response.resultPacket &&
165
- fetchedServices.response.resultPacket.results.length > 0
166
- ) {
167
- dynamicSuggestionsContainer.innerHTML += `
168
- <div class="suggestions-category feature pt-16">
169
- <strong class="suggestions-category-label d-block">Services</strong>
170
- <ul class="mt-2">${fetchedServices.response.resultPacket.results
171
- .slice(0, 4)
172
- .map(
173
- (item) => `<li><a href="${item.liveUrl}">${item.title}</a></li>`,
174
- )
175
- .join("")}</ul>
161
+ const resultsUrl = searchInput.getAttribute("data-results-url");
162
+ if (resultsUrl) {
163
+ const collection =
164
+ searchInput.getAttribute("data-collection") || "qgov~sp-search";
165
+ const profile = searchInput.getAttribute("data-profile") || "qld";
166
+ const fetchedServices = await fetchData(
167
+ `${resultsUrl}?collection=${collection}&profile=${profile}&smeta_sfinder_sand=yes&query=${encodeURIComponent(value)}`,
168
+ "services",
169
+ );
170
+
171
+ if (
172
+ fetchedServices.response.resultPacket &&
173
+ fetchedServices.response.resultPacket.results.length > 0
174
+ ) {
175
+ const viewMoreUrl =
176
+ dynamicSuggestionsContainer.getAttribute("data-view-more");
177
+
178
+ // Build the services HTML safely
179
+ const servicesItems = fetchedServices.response.resultPacket.results
180
+ .slice(0, 4)
181
+ .map((item) => `<li><a href="${item.liveUrl}">${item.title}</a></li>`)
182
+ .join("");
183
+
184
+ const viewMoreItem = viewMoreUrl
185
+ ? `<li><a href="${viewMoreUrl}" class="view-more">View more</a></li>`
186
+ : "";
187
+
188
+ dynamicSuggestionsContainer.innerHTML += `
189
+ <div class="suggestions-category feature">
190
+ <strong class="suggestions-category-label d-block">Related services</strong>
191
+ <ul>${servicesItems}${viewMoreItem}</ul>
176
192
  </div>`;
177
- dynamicSuggestionsContainer.classList.remove("d-none");
178
- createPopper(searchInput, suggestions, {
179
- placement: "bottom-start",
180
- });
181
- suggestions.classList.remove("d-none");
182
-
183
- // Attach click event listeners to each suggestion item
184
- form.querySelectorAll(".suggestions li").forEach((item) => {
185
- item.addEventListener("click", () =>
186
- selectSuggestion(item.innerText, form),
187
- );
188
- });
193
+ dynamicSuggestionsContainer.classList.remove("d-none");
194
+ createPopper(searchInput, suggestions, {
195
+ placement: "bottom-start",
196
+ });
197
+ suggestions.classList.remove("d-none");
198
+
199
+ // Attach click event listeners to each suggestion item
200
+ form.querySelectorAll(".suggestions li").forEach((item) => {
201
+ item.addEventListener("click", () =>
202
+ selectSuggestion(item.innerText, form),
203
+ );
204
+ });
205
+ }
189
206
  }
190
207
  }
191
208
  }
@@ -6,7 +6,6 @@
6
6
  "buttonType": "submit",
7
7
  "buttonLabel": "Search",
8
8
  "ariaLabel": "Search website",
9
- "suggestions": true,
10
9
  "tags": {
11
10
  "collection": "qgov~sp-search",
12
11
  "profile": "qld",
@@ -15,10 +14,20 @@
15
14
  "suggestions": "https://discover.search.qld.gov.au/s/suggest.json",
16
15
  "results-url": "https://discover.search.qld.gov.au/s/search.json"
17
16
  },
18
- "default_suggestions": {
19
- "popular_services": [
17
+ "hasDynamicSuggestions": true,
18
+ "hasDefaultSuggestions": true,
19
+ "dynamicSuggestionsServiceLink": {
20
+ "href": "/queenslanders"
21
+ },
22
+ "defaultSuggestions": {
23
+ "popularServicesTitle": "Popular",
24
+ "popularServicesLink": {
25
+ "label": "View more",
26
+ "href": "/queenslanders"
27
+ },
28
+ "popularServices": [
20
29
  {
21
- "title": "Apply for leave",
30
+ "title": "Apply for leave now",
22
31
  "link": "https://www.forgov.qld.gov.au/pay-benefits-and-policy/leave/submit-a-leave-application"
23
32
  },
24
33
  {
@@ -34,6 +43,11 @@
34
43
  "link": "https://www.forgov.qld.gov.au/recruitment-performance-and-career/recruitment"
35
44
  }
36
45
  ],
46
+ "categoriesTitle": "Collection",
47
+ "categoriesLink": {
48
+ "label": "View all",
49
+ "href": "/queenslanders"
50
+ },
37
51
  "categories": [
38
52
  {
39
53
  "title": "Search for directives, policies, circulars, and guidelines",
@@ -51,11 +65,6 @@
51
65
  "title": "Career development",
52
66
  "link": "https://www.forgov.qld.gov.au/recruitment-performance-and-career/career-development"
53
67
  }
54
- ],
55
- "options": {
56
- "label": "Browse all categories",
57
- "view_more": true,
58
- "href": "/queenslanders"
59
- }
68
+ ]
60
69
  }
61
70
  }
@@ -8,36 +8,38 @@
8
8
  <span class="btn-icon"></span>
9
9
  <span class="btn-label">{{ buttonLabel }}</span>
10
10
  </button>
11
- {{#if suggestions}}
12
- <div class="suggestions suggestions__group d-none">
13
- <div class="default-suggestions">
14
- <div class="suggestions-category mt-16">
15
- <strong class="suggestions-category-label d-block">Popular services</strong>
16
- <ul class="mt-2">
17
- {{#each default_suggestions.popular_services}}
18
- <li><a href="{{link}}">{{title}}</a></li>
19
- {{/each}}
20
- </ul>
21
- </div>
22
-
23
- <div class="suggestions-category mt-16">
24
- <strong class="suggestions-category-label d-block">Browse by category</strong>
25
- <ul class="mt-12 mb-0">
26
- {{#each default_suggestions.categories}}
27
- <li><a href="{{link}}">{{title}}</a></li>
28
- {{/each}}
29
- </ul>
30
- </div>
11
+ {{#ifCond hasDynamicSuggestions '||' hasDefaultSuggestions}}
12
+ <div class="suggestions suggestions__group d-none default">
13
+ {{#if hasDefaultSuggestions}}
14
+ <div class="default-suggestions">
15
+ <div class="suggestions-category">
16
+ <strong class="suggestions-category-label d-block">{{defaultSuggestions.popularServicesTitle}}</strong>
17
+ <ul>
18
+ {{#each defaultSuggestions.popularServices}}
19
+ <li><a href="{{link}}">{{title}}</a></li>
20
+ {{/each}}
21
+ {{#if defaultSuggestions.popularServicesLink}}
22
+ <li><a href="{{defaultSuggestions.popularServicesLink.href}}" class="view-more">{{#if defaultSuggestions.popularServicesLink.label}}{{defaultSuggestions.popularServicesLink.label}}{{else}}View More{{/if}}</a></li>
23
+ {{/if}}
24
+ </ul>
25
+ </div>
31
26
 
32
- {{#if default_suggestions.options.view_more}}
33
- <div class="suggestions-category">
34
- <a class="px-16 pt-12 pb-16 d-block suggestions-category-view-more"
35
- href="{{default_suggestions.options.href}}">{{default_suggestions.options.label}}</a>
27
+ <div class="suggestions-category">
28
+ <strong class="suggestions-category-label d-block">{{defaultSuggestions.categoriesTitle}}</strong>
29
+ <ul>
30
+ {{#each defaultSuggestions.categories}}
31
+ <li><a href="{{link}}">{{title}}</a></li>
32
+ {{/each}}
33
+ {{#if defaultSuggestions.categoriesLink}}
34
+ <li><a href="{{defaultSuggestions.categoriesLink.href}}" class="view-more">{{#if defaultSuggestions.categoriesLink.label}}{{defaultSuggestions.categoriesLink.label}}{{else}}View More{{/if}}</a></li>
35
+ {{/if}}
36
+ </ul>
37
+ </div>
36
38
  </div>
37
- {{/if}}
38
- </div>
39
- <div class="dynamic-suggestions"></div>
39
+ {{/if}}
40
+ {{#if hasDynamicSuggestions}}
41
+ <div class="dynamic-suggestions" {{#if dynamicSuggestionsServiceLink.href}}data-view-more="{{dynamicSuggestionsServiceLink.href}}"{{/if}}></div>
42
+ {{/if}}
40
43
  </div>
41
- {{/if}}
42
-
44
+ {{/ifCond}}
43
45
  </div>