@qld-gov-au/qgds-bootstrap5 2.0.11 → 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 (78) hide show
  1. package/.storybook/preview.js +5 -2
  2. package/dist/assets/components/bs5/dateinput/dateinput.hbs +27 -27
  3. package/dist/assets/components/bs5/formcheck/formcheck.hbs +10 -2
  4. package/dist/assets/components/bs5/head/head.hbs +1 -1
  5. package/dist/assets/components/bs5/searchInput/searchInput.hbs +31 -29
  6. package/dist/assets/components/bs5/select/select.hbs +19 -19
  7. package/dist/assets/components/bs5/textarea/textarea.hbs +17 -17
  8. package/dist/assets/components/bs5/textbox/textbox.hbs +17 -18
  9. package/dist/assets/css/qld.bootstrap.css +2 -2
  10. package/dist/assets/css/qld.bootstrap.css.map +3 -3
  11. package/dist/assets/css/qld.bootstrap.legacy.css +2 -2
  12. package/dist/assets/css/qld.bootstrap.legacy.css.map +3 -3
  13. package/dist/assets/js/handlebars.helpers.bundle.js +1 -1
  14. package/dist/assets/js/handlebars.init.min.js +134 -125
  15. package/dist/assets/js/handlebars.init.min.js.map +2 -2
  16. package/dist/assets/js/handlebars.partials.js +134 -125
  17. package/dist/assets/js/handlebars.partials.js.map +2 -2
  18. package/dist/assets/js/qld.bootstrap.min.js +9 -10
  19. package/dist/assets/js/qld.bootstrap.min.js.map +3 -3
  20. package/dist/assets/node/handlebars.init.min.js +51 -7
  21. package/dist/assets/node/handlebars.init.min.js.map +2 -2
  22. package/dist/components/bs5/dateinput/dateinput.hbs +27 -27
  23. package/dist/components/bs5/formcheck/formcheck.hbs +10 -2
  24. package/dist/components/bs5/head/head.hbs +1 -1
  25. package/dist/components/bs5/searchInput/searchInput.hbs +31 -29
  26. package/dist/components/bs5/select/select.hbs +19 -19
  27. package/dist/components/bs5/textarea/textarea.hbs +17 -17
  28. package/dist/components/bs5/textbox/textbox.hbs +17 -18
  29. package/dist/package.json +1 -1
  30. package/dist/sample-data/dateinput/dateinput.data.json +14 -12
  31. package/dist/sample-data/formcheck/stories/checkbox/checkbox.data.json +4 -5
  32. package/dist/sample-data/formcheck/stories/radio/radio.data.json +4 -4
  33. package/dist/sample-data/searchInput/searchInput.data.json +19 -10
  34. package/dist/sample-data/select/select.data.json +12 -10
  35. package/dist/sample-data/textarea/textarea.data.json +14 -11
  36. package/dist/sample-data/textbox/textbox.data.json +13 -10
  37. package/package.json +1 -1
  38. package/src/components/bs5/dateinput/Dateinput.js +26 -11
  39. package/src/components/bs5/dateinput/dateinput.data.json +14 -12
  40. package/src/components/bs5/dateinput/dateinput.hbs +27 -27
  41. package/src/components/bs5/formcheck/Formcheck.js +57 -6
  42. package/src/components/bs5/formcheck/_form-variables.scss +131 -0
  43. package/src/components/bs5/formcheck/formcheck.hbs +10 -2
  44. package/src/components/bs5/formcheck/formcheck.scss +229 -66
  45. package/src/components/bs5/formcheck/stories/bootstrap-validation/bootstrap-validation.stories.js +304 -0
  46. package/src/components/bs5/formcheck/stories/checkbox/checkbox.data.json +4 -5
  47. package/src/components/bs5/formcheck/stories/checkbox/checkbox.stories.js +19 -111
  48. package/src/components/bs5/formcheck/stories/radio/radio.data.json +4 -4
  49. package/src/components/bs5/formcheck/stories/radio/radio.stories.js +30 -122
  50. package/src/components/bs5/inpageAlert/inpageAlert.scss +1 -1
  51. package/src/components/bs5/pageLayout/{ThemeShowcase.stories.js → PaletteShowcase.stories.js} +36 -35
  52. package/src/components/bs5/searchInput/__snapshots__/searchInput.test.js.snap +24 -28
  53. package/src/components/bs5/searchInput/search.functions.js +93 -76
  54. package/src/components/bs5/searchInput/searchInput.data.json +19 -10
  55. package/src/components/bs5/searchInput/searchInput.hbs +31 -29
  56. package/src/components/bs5/searchInput/searchInput.scss +140 -196
  57. package/src/components/bs5/searchInput/searchInput.stories.js +35 -13
  58. package/src/components/bs5/searchInput/searchInput.test.js +5 -1
  59. package/src/components/bs5/select/Select.js +13 -5
  60. package/src/components/bs5/select/Select.stories.js +27 -83
  61. package/src/components/bs5/select/select.data.json +12 -10
  62. package/src/components/bs5/select/select.hbs +19 -19
  63. package/src/components/bs5/textarea/Textarea.js +13 -5
  64. package/src/components/bs5/textarea/Textarea.stories.js +29 -55
  65. package/src/components/bs5/textarea/textarea.data.json +14 -11
  66. package/src/components/bs5/textarea/textarea.hbs +17 -17
  67. package/src/components/bs5/textbox/Textbox.js +16 -5
  68. package/src/components/bs5/textbox/Textbox.stories.js +26 -51
  69. package/src/components/bs5/textbox/textInput.scss +12 -232
  70. package/src/components/bs5/textbox/textbox.data.json +13 -10
  71. package/src/components/bs5/textbox/textbox.hbs +17 -18
  72. package/src/css/functions/_index.scss +2 -0
  73. package/src/css/functions/remify.scss +32 -0
  74. package/src/css/functions/snap-line-height.scss +7 -0
  75. package/src/css/main.scss +1 -1
  76. package/src/css/mixins/focusable.scss +3 -0
  77. package/src/css/{qld-theme.scss → qld-palettes.scss} +30 -23
  78. package/src/components/bs5/formcheck/_formcheck.stories.bak.js +0 -432
@@ -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>