@qld-gov-au/qgds-bootstrap5 1.1.39 → 1.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/assets/components/bs5/backToTop/backToTop.hbs +1 -1
  2. package/dist/assets/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
  3. package/dist/assets/components/bs5/button/button.hbs +48 -30
  4. package/dist/assets/components/bs5/containerLayout/containerLayout.hbs +100 -0
  5. package/dist/assets/components/bs5/contentFooter/contentFooter.hbs +15 -4
  6. package/dist/assets/components/bs5/formcheck/formcheck.hbs +1 -1
  7. package/dist/assets/components/bs5/head/head.hbs +1 -1
  8. package/dist/assets/components/bs5/iconLink/iconLink.hbs +41 -0
  9. package/dist/assets/components/bs5/logo/logo.hbs +7 -0
  10. package/dist/assets/components/bs5/logo/logoCOALandscape.hbs +58 -0
  11. package/dist/assets/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
  12. package/dist/assets/components/bs5/navbar/navbar.hbs +65 -245
  13. package/dist/assets/components/bs5/pageLayout/pageLayout.hbs +11 -10
  14. package/dist/assets/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
  15. package/dist/assets/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
  16. package/dist/assets/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
  17. package/dist/assets/components/bs5/searchInput/searchInput.hbs +8 -10
  18. package/dist/assets/css/qld.bootstrap.css +1 -1
  19. package/dist/assets/css/qld.bootstrap.css.map +3 -3
  20. package/dist/assets/js/bootstrap.bundle.js +3 -6
  21. package/dist/assets/js/bootstrap.bundle.js.map +1 -1
  22. package/dist/assets/js/bootstrap.bundle.min.js +2 -2
  23. package/dist/assets/js/bootstrap.bundle.min.js.map +1 -1
  24. package/dist/assets/js/bootstrap.js +3 -6
  25. package/dist/assets/js/bootstrap.min.js +2 -2
  26. package/dist/assets/js/bootstrap.min.js.map +1 -1
  27. package/dist/assets/js/handlebars.helpers.bundle.js +1 -1
  28. package/dist/assets/js/handlebars.helpers.bundle.js.map +3 -3
  29. package/dist/assets/js/handlebars.helpers.js +51 -40
  30. package/dist/assets/js/handlebars.init.min.js +698 -347
  31. package/dist/assets/js/handlebars.init.min.js.map +4 -4
  32. package/dist/assets/js/handlebars.partials.js +16 -0
  33. package/dist/assets/js/qld.bootstrap.min.js +9 -9
  34. package/dist/assets/js/qld.bootstrap.min.js.map +4 -4
  35. package/dist/assets/node/handlebars.init.min.js +359 -72
  36. package/dist/assets/node/handlebars.init.min.js.map +3 -3
  37. package/dist/components/bs5/backToTop/backToTop.hbs +1 -1
  38. package/dist/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
  39. package/dist/components/bs5/button/button.hbs +48 -30
  40. package/dist/components/bs5/containerLayout/containerLayout.hbs +100 -0
  41. package/dist/components/bs5/contentFooter/contentFooter.hbs +15 -4
  42. package/dist/components/bs5/formcheck/formcheck.hbs +1 -1
  43. package/dist/components/bs5/head/head.hbs +1 -1
  44. package/dist/components/bs5/iconLink/iconLink.hbs +41 -0
  45. package/dist/components/bs5/logo/logo.hbs +7 -0
  46. package/dist/components/bs5/logo/logoCOALandscape.hbs +58 -0
  47. package/dist/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
  48. package/dist/components/bs5/navbar/navbar.hbs +65 -245
  49. package/dist/components/bs5/pageLayout/pageLayout.hbs +11 -10
  50. package/dist/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
  51. package/dist/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
  52. package/dist/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
  53. package/dist/components/bs5/searchInput/searchInput.hbs +8 -10
  54. package/dist/components/handlebars.helpers.js +51 -40
  55. package/dist/components/handlebars.partials.js +16 -0
  56. package/dist/package.json +2 -2
  57. package/dist/sample-data/breadcrumbs/breadcrumbs.data.json +113 -49
  58. package/dist/sample-data/button/button.data.json +10 -8
  59. package/dist/sample-data/contentFooter/contentFooter.data.json +9 -1
  60. package/dist/sample-data/formcheck/stories/checkbox/checkbox.data.json +51 -46
  61. package/dist/sample-data/formcheck/stories/radio/radio.data.json +51 -46
  62. package/dist/sample-data/iconLink/iconLink.data.json +77 -0
  63. package/dist/sample-data/logo/logo.data.json +6 -0
  64. package/dist/sample-data/navbar/navbar.data.json +191 -0
  65. package/dist/sample-data/searchInput/searchInput.data.json +2 -3
  66. package/dist/sample-data/tabs/tabs.data.json +45 -44
  67. package/package.json +2 -2
  68. package/src/components/bs5/backToTop/backToTop.hbs +1 -1
  69. package/src/components/bs5/banner/banner.scss +52 -46
  70. package/src/components/bs5/breadcrumbs/__snapshots__/breadcrumbs.test.js.snap +49 -0
  71. package/src/components/bs5/breadcrumbs/breadcrumbs.data.json +113 -49
  72. package/src/components/bs5/breadcrumbs/breadcrumbs.functions.js +169 -0
  73. package/src/components/bs5/breadcrumbs/breadcrumbs.hbs +19 -15
  74. package/src/components/bs5/breadcrumbs/breadcrumbs.scss +164 -43
  75. package/src/components/bs5/breadcrumbs/breadcrumbs.stories.js +16 -2
  76. package/src/components/bs5/breadcrumbs/breadcrumbs.test.js +136 -0
  77. package/src/components/bs5/button/button.data.json +10 -8
  78. package/src/components/bs5/button/button.hbs +48 -30
  79. package/src/components/bs5/button/button.scss +365 -244
  80. package/src/components/bs5/button/button.stories.js +116 -30
  81. package/src/components/bs5/containerLayout/containerLayout.hbs +100 -0
  82. package/src/components/bs5/containerLayout/containerLayout.stories.js +83 -0
  83. package/src/components/bs5/contentFooter/contentFooter.data.json +9 -1
  84. package/src/components/bs5/contentFooter/contentFooter.hbs +15 -4
  85. package/src/components/bs5/formcheck/formcheck.hbs +1 -1
  86. package/src/components/bs5/formcheck/formcheck.scss +161 -139
  87. package/src/components/bs5/formcheck/stories/checkbox/checkbox.data.json +51 -46
  88. package/src/components/bs5/formcheck/stories/radio/radio.data.json +51 -46
  89. package/src/components/bs5/iconLink/iconLink.data.json +77 -0
  90. package/src/components/bs5/iconLink/iconLink.hbs +41 -0
  91. package/src/components/bs5/iconLink/iconLink.js +20 -0
  92. package/src/components/bs5/iconLink/iconLink.mdx +16 -0
  93. package/src/components/bs5/iconLink/iconLink.scss +57 -0
  94. package/src/components/bs5/iconLink/iconLink.stories.js +127 -0
  95. package/src/components/bs5/icons/icons.scss +79 -72
  96. package/src/components/bs5/inpagenav/inpagenav.scss +37 -37
  97. package/src/components/bs5/logo/Logo.js +20 -0
  98. package/src/components/bs5/logo/Logo.mdx +10 -0
  99. package/src/components/bs5/logo/logo.data.json +6 -0
  100. package/src/components/bs5/logo/logo.hbs +7 -0
  101. package/src/components/bs5/logo/logo.stories.js +32 -0
  102. package/src/components/bs5/logo/logoCOALandscape.hbs +58 -0
  103. package/src/components/bs5/logo/logoCOALandscape2Lines.hbs +58 -0
  104. package/src/components/bs5/navbar/Navbar.js +2 -9
  105. package/src/components/bs5/navbar/navbar.data.json +191 -0
  106. package/src/components/bs5/navbar/navbar.functions.js +48 -196
  107. package/src/components/bs5/navbar/navbar.hbs +65 -245
  108. package/src/components/bs5/navbar/navbar.scss +585 -518
  109. package/src/components/bs5/navbar/navbar.stories.js +532 -0
  110. package/src/components/bs5/pageLayout/ContentPageWithForm.js +8 -0
  111. package/src/components/bs5/pageLayout/ContentPageWithSideNavigation.js +8 -0
  112. package/src/components/bs5/pageLayout/FullWidthLandingPage.js +8 -0
  113. package/src/components/bs5/pageLayout/pageLayout.hbs +11 -10
  114. package/src/components/bs5/pageLayout/pageLayout.stories.js +230 -6
  115. package/src/components/bs5/pageLayout/templates/contentPageWithForm.hbs +78 -0
  116. package/src/components/bs5/pageLayout/templates/contentPageWithSideNavigation.hbs +103 -0
  117. package/src/components/bs5/pageLayout/templates/fullWidthLandingPage.hbs +61 -0
  118. package/src/components/bs5/searchInput/__snapshots__/searchInput.test.js.snap +9 -8
  119. package/src/components/bs5/searchInput/search.functions.js +94 -63
  120. package/src/components/bs5/searchInput/searchInput.data.json +2 -3
  121. package/src/components/bs5/searchInput/searchInput.hbs +8 -10
  122. package/src/components/bs5/searchInput/searchInput.scss +296 -255
  123. package/src/components/bs5/searchInput/searchInput.test.js +98 -89
  124. package/src/components/bs5/sidenav/sidenav.stories.js +17 -15
  125. package/src/components/bs5/tabs/tabs.data.json +45 -44
  126. package/src/components/bs5/tabs/tabs.scss +544 -500
  127. package/src/components/bs5/tabs/tabs.stories.js +81 -51
  128. package/src/components/common/footer/footer.scss +137 -140
  129. package/src/components/common/layout/container.scss +22 -0
  130. package/src/components/common/layout/content.scss +11 -4
  131. package/src/components/common/layout/grid.scss +26 -0
  132. package/src/css/main.scss +5 -4
  133. package/src/css/qld-variables.scss +102 -81
  134. package/src/js/handlebars.helpers.js +51 -40
  135. package/src/js/handlebars.partials.js +16 -0
  136. package/src/js/qld.bootstrap.js +17 -9
  137. package/src/components/bs5/backToTop/backToTop.scss +0 -9
  138. package/src/components/bs5/breadcrumbs/breadcrumb.functions.js +0 -95
  139. package/src/components/bs5/breadcumbsWrapper/breadcrumbsWrapper.stories.js +0 -34
  140. package/src/components/bs5/contentFooterWrapper/contentFooterWrapper.stories.js +0 -36
  141. package/src/components/bs5/contentWrapper/contentWrapper.stories.js +0 -65
  142. package/src/components/bs5/fullPageWrapper/fullPage.stories.js +0 -63
  143. package/src/components/bs5/mainContainerWrapper/mainContainerWrapper.stories.js +0 -50
  144. package/src/components/bs5/navbar/_colours.scss +0 -85
  145. package/src/components/bs5/navbar/_icons.scss +0 -64
  146. package/src/components/bs5/sidenavWrapper/SidenavWrapper.mdx +0 -11
  147. package/src/components/bs5/sidenavWrapper/sidenavWrapper.stories.js +0 -65
  148. package/src/stories/integration/MainIntegration.js +0 -28
  149. package/src/stories/integration/MainIntegration.mdx +0 -10
  150. package/src/stories/integration/breadcrumb.data.json +0 -28
  151. package/src/stories/integration/content.data.json +0 -3
  152. package/src/stories/integration/contentFooter.data.json +0 -3
  153. package/src/stories/integration/footer.data.json +0 -111
  154. package/src/stories/integration/globalAlert.data.json +0 -10
  155. package/src/stories/integration/header.data.json +0 -173
  156. package/src/stories/integration/inpagenav.data.json +0 -26
  157. package/src/stories/integration/integration.stories.js +0 -147
  158. package/src/stories/integration/main.hbs +0 -13
  159. package/src/stories/integration/navigation.data.json +0 -22
  160. package/src/stories/integration/search.data.json +0 -20
  161. package/src/stories/integration/sidenav.data.json +0 -88
@@ -0,0 +1,532 @@
1
+ import { Navbar } from "./Navbar.js";
2
+ import defaultdata from "./navbar.data.json";
3
+
4
+ export default {
5
+ tags: ["autodocs"],
6
+ title: "3. Components/Navbar",
7
+ render: (args) => {
8
+ // Create a copy of default data
9
+ const data = JSON.parse(JSON.stringify(defaultdata));
10
+ const addCount = args["Add Navigation Item"] || 0;
11
+ const baseItemCount = defaultdata.navigation?.length || 0;
12
+
13
+ // Rebuild navigation completely
14
+ data.navigation = [];
15
+
16
+ // Add base items
17
+ for (let i = 0; i < baseItemCount; i++) {
18
+ const originalItem = defaultdata.navigation[i];
19
+ const itemName = originalItem.text;
20
+
21
+ data.navigation.push({
22
+ ...originalItem,
23
+ text: args[`${itemName.replace(/\s+/g, "")}_text`] || originalItem.text,
24
+ hideLabel:
25
+ args[`${itemName.replace(/\s+/g, "")}_hideLabel`] !== undefined
26
+ ? args[`${itemName.replace(/\s+/g, "")}_hideLabel`]
27
+ : originalItem.hideLabel,
28
+ mobileOnly:
29
+ args[`${itemName.replace(/\s+/g, "")}_mobileOnly`] !== undefined
30
+ ? args[`${itemName.replace(/\s+/g, "")}_mobileOnly`]
31
+ : originalItem.mobileOnly,
32
+ alternativeColor:
33
+ args[`${itemName.replace(/\s+/g, "")}_alternativeColor`] !== undefined
34
+ ? args[`${itemName.replace(/\s+/g, "")}_alternativeColor`]
35
+ : originalItem.alternativeColor,
36
+ iconName:
37
+ args[`${itemName.replace(/\s+/g, "")}_iconName`] ||
38
+ originalItem.iconName ||
39
+ "",
40
+ });
41
+ }
42
+
43
+ // Add new items
44
+ for (let i = 0; i < addCount; i++) {
45
+ const newItem = {
46
+ text: args[`newItem${i}_text`] || `New Item ${i + 1}`,
47
+ hideLabel: args[`newItem${i}_hideLabel`] || false,
48
+ mobileOnly: args[`newItem${i}_mobileOnly`] || false,
49
+ alternativeColor: args[`newItem${i}_alternativeColor`] || false,
50
+ iconName: args[`newItem${i}_iconName`] || "",
51
+ url: "#",
52
+ cssClass: "",
53
+ target_url: "#",
54
+ dropdown_enabled: false,
55
+ };
56
+
57
+ data.navigation.push(newItem);
58
+ }
59
+
60
+ // Apply metadata
61
+ data.metadata = data.metadata || {};
62
+ data.metadata.alternativeColor = args["Nav alternativeColor"] || false;
63
+ data.metadata.verticalOrientation =
64
+ args["Nav verticalOrientation"] || false;
65
+ data.metadata.navbarBrandName = args["Nav navbarBrandName"] || "";
66
+
67
+ try {
68
+ const navbarInstance = new Navbar(data);
69
+ let html = navbarInstance.html;
70
+
71
+ // Apply modifications with UNIQUE class names
72
+ data.navigation.forEach((item) => {
73
+ if (!item.text) return;
74
+
75
+ const escapedText = item.text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
76
+
77
+ if (item.hideLabel) {
78
+ html = html.replace(
79
+ new RegExp(`(<a[^>]*>)(${escapedText})(</a>)`, "gi"),
80
+ `$1<span class="sr-only">$2</span>$3`,
81
+ );
82
+ }
83
+
84
+ if (item.mobileOnly) {
85
+ // Use unique class names to avoid conflicts
86
+ const textPos = html.indexOf(item.text);
87
+ if (textPos !== -1) {
88
+ let liStart = html.lastIndexOf("<li", textPos);
89
+ if (liStart !== -1) {
90
+ let liEnd = html.indexOf(">", liStart);
91
+ if (liEnd !== -1) {
92
+ const originalLiTag = html.substring(liStart, liEnd + 1);
93
+ let newLiTag;
94
+
95
+ if (originalLiTag.includes('class="')) {
96
+ // Add to existing class with unique names
97
+ newLiTag = originalLiTag.replace(
98
+ 'class="',
99
+ 'class="qgds-mobile-only qgds-hide-desktop ',
100
+ );
101
+ } else {
102
+ // Add new class attribute with unique names
103
+ newLiTag = originalLiTag.replace(
104
+ "<li",
105
+ '<li class="qgds-mobile-only qgds-hide-desktop"',
106
+ );
107
+ }
108
+
109
+ html =
110
+ html.substring(0, liStart) +
111
+ newLiTag +
112
+ html.substring(liEnd + 1);
113
+ }
114
+ }
115
+ }
116
+ }
117
+
118
+ if (item.alternativeColor) {
119
+ const textPos = html.indexOf(item.text);
120
+ if (textPos !== -1) {
121
+ let liStart = html.lastIndexOf("<li", textPos);
122
+ if (liStart !== -1) {
123
+ let liEnd = html.indexOf(">", liStart);
124
+ if (liEnd !== -1) {
125
+ const originalLiTag = html.substring(liStart, liEnd + 1);
126
+ let newLiTag;
127
+
128
+ if (originalLiTag.includes('class="')) {
129
+ newLiTag = originalLiTag.replace(
130
+ 'class="',
131
+ 'class="qgds-alt-color ',
132
+ );
133
+ } else {
134
+ newLiTag = originalLiTag.replace(
135
+ "<li",
136
+ '<li class="qgds-alt-color"',
137
+ );
138
+ }
139
+
140
+ html =
141
+ html.substring(0, liStart) +
142
+ newLiTag +
143
+ html.substring(liEnd + 1);
144
+ }
145
+ }
146
+ }
147
+ }
148
+ });
149
+
150
+ // Add CSS with UNIQUE class names and higher specificity
151
+ const styles = `
152
+ <style>
153
+ .sr-only {
154
+ position: absolute !important;
155
+ width: 1px !important;
156
+ height: 1px !important;
157
+ padding: 0 !important;
158
+ margin: -1px !important;
159
+ overflow: hidden !important;
160
+ clip: rect(0, 0, 0, 0) !important;
161
+ white-space: nowrap !important;
162
+ border: 0 !important;
163
+ }
164
+
165
+ /* Mobile-only items - hide on desktop with unique class names */
166
+ @media (min-width: 992px) {
167
+ .qgds-mobile-only,
168
+ .qgds-hide-desktop,
169
+ .navbar-nav .qgds-mobile-only,
170
+ .navbar-nav .qgds-hide-desktop {
171
+ display: none !important;
172
+ }
173
+ }
174
+
175
+ /* CSS for hiding/showing Storybook controls */
176
+ .hide {
177
+ display: none !important;
178
+ }
179
+ </style>
180
+ `;
181
+
182
+ return styles + html + `<!-- Render: ${Date.now()} -->`;
183
+ } catch (error) {
184
+ console.error("Error:", error);
185
+ return `<div style="color: red; padding: 20px;"><h3>Error</h3><p>${error.message}</p></div>`;
186
+ }
187
+ },
188
+
189
+ // Replace the entire argTypes section with this reordered version:
190
+
191
+ argTypes: {
192
+ // 1. Navbar Body (first)
193
+ "Nav alternativeColor": {
194
+ control: "boolean",
195
+ table: { category: "Navbar Body" },
196
+ },
197
+ "Nav verticalOrientation": {
198
+ control: "boolean",
199
+ table: { category: "Navbar Body" },
200
+ },
201
+ "Nav navbarBrandName": {
202
+ control: "text",
203
+ table: { category: "Navbar Body" },
204
+ },
205
+
206
+ // 2. Base Items (second) - move this BEFORE Navigation
207
+ ...(() => {
208
+ const argTypes = {};
209
+ if (defaultdata.navigation) {
210
+ defaultdata.navigation.forEach((item) => {
211
+ const baseName = item.text.replace(/\s+/g, "");
212
+ argTypes[`${baseName}_iconName`] = {
213
+ name: `${item.text} - Icon Name`,
214
+ control: "text",
215
+ table: { category: "Base Items" },
216
+ };
217
+ argTypes[`${baseName}_text`] = {
218
+ name: `${item.text} - Text`,
219
+ control: "text",
220
+ table: { category: "Base Items" },
221
+ };
222
+ argTypes[`${baseName}_hideLabel`] = {
223
+ name: `${item.text} - Hide Label`,
224
+ control: "boolean",
225
+ table: { category: "Base Items" },
226
+ };
227
+ argTypes[`${baseName}_mobileOnly`] = {
228
+ name: `${item.text} - Mobile Only`,
229
+ control: "boolean",
230
+ table: { category: "Base Items" },
231
+ };
232
+ argTypes[`${baseName}_alternativeColor`] = {
233
+ name: `${item.text} - Alternative Color`,
234
+ control: "boolean",
235
+ table: { category: "Base Items" },
236
+ };
237
+ });
238
+ }
239
+ return argTypes;
240
+ })(),
241
+
242
+ // 3. Navigation (third) - move this AFTER Base Items
243
+ "Add Navigation Item": {
244
+ control: { type: "range", min: 0, max: 3, step: 1 },
245
+ table: { category: "Navigation" },
246
+ },
247
+
248
+ // 4. New Items (fourth) - keep this last
249
+ ...(() => {
250
+ const argTypes = {};
251
+ for (let i = 0; i < 3; i++) {
252
+ const itemNumber = i + 1;
253
+
254
+ argTypes[`newItem${i}_iconName`] = {
255
+ name: `New Item ${itemNumber} - Icon Name`,
256
+ control: "text",
257
+ table: {
258
+ category: "New Items",
259
+ className: (args) =>
260
+ args && args["Add Navigation Item"] >= itemNumber ? "" : "hide",
261
+ },
262
+ };
263
+ argTypes[`newItem${i}_text`] = {
264
+ name: `New Item ${itemNumber} - Text`,
265
+ control: "text",
266
+ table: {
267
+ category: "New Items",
268
+ className: (args) =>
269
+ args && args["Add Navigation Item"] >= itemNumber ? "" : "hide",
270
+ },
271
+ };
272
+ argTypes[`newItem${i}_hideLabel`] = {
273
+ name: `New Item ${itemNumber} - Hide Label`,
274
+ control: "boolean",
275
+ table: {
276
+ category: "New Items",
277
+ className: (args) =>
278
+ args && args["Add Navigation Item"] >= itemNumber ? "" : "hide",
279
+ },
280
+ };
281
+ argTypes[`newItem${i}_mobileOnly`] = {
282
+ name: `New Item ${itemNumber} - Mobile Only`,
283
+ control: "boolean",
284
+ table: {
285
+ category: "New Items",
286
+ className: (args) =>
287
+ args && args["Add Navigation Item"] >= itemNumber ? "" : "hide",
288
+ },
289
+ };
290
+ argTypes[`newItem${i}_alternativeColor`] = {
291
+ name: `New Item ${itemNumber} - Alternative Color`,
292
+ control: "boolean",
293
+ table: {
294
+ category: "New Items",
295
+ className: (args) =>
296
+ args && args["Add Navigation Item"] >= itemNumber ? "" : "hide",
297
+ },
298
+ };
299
+ }
300
+ return argTypes;
301
+ })(),
302
+ },
303
+
304
+ parameters: {
305
+ design: {
306
+ name: "QGDS Figma Reference",
307
+ type: "figma",
308
+ url: "https://www.figma.com/design/qKsxl3ogIlBp7dafgxXuCA/QGDS-UI-kit?node-id=5990-97604&p=f&t=LpEqEay1h4fgTRLl-0",
309
+ },
310
+ },
311
+ };
312
+
313
+ export const Default = {
314
+ args: {
315
+ "Nav alternativeColor": false,
316
+ "Nav verticalOrientation": false,
317
+ "Nav navbarBrandName": "",
318
+ "Add Navigation Item": 0,
319
+ // Initialize base items with iconName
320
+ ...(() => {
321
+ const args = {};
322
+ if (defaultdata.navigation) {
323
+ defaultdata.navigation.forEach((item) => {
324
+ const baseName = item.text.replace(/\s+/g, "");
325
+ args[`${baseName}_iconName`] = item.iconName || "";
326
+ args[`${baseName}_text`] = item.text;
327
+ args[`${baseName}_hideLabel`] = item.hideLabel || false;
328
+ args[`${baseName}_mobileOnly`] = item.mobileOnly || false;
329
+ args[`${baseName}_alternativeColor`] = item.alternativeColor || false;
330
+ });
331
+ }
332
+
333
+ // Initialize new items with iconName
334
+ for (let i = 0; i < 3; i++) {
335
+ args[`newItem${i}_iconName`] = "";
336
+ args[`newItem${i}_text`] = `New Item ${i + 1}`;
337
+ args[`newItem${i}_hideLabel`] = false;
338
+ args[`newItem${i}_mobileOnly`] = false;
339
+ args[`newItem${i}_alternativeColor`] = false;
340
+ }
341
+
342
+ return args;
343
+ })(),
344
+ },
345
+
346
+ // Add custom render function for this story only
347
+ render: (args) => {
348
+ // Create a copy of default data
349
+ const data = JSON.parse(JSON.stringify(defaultdata));
350
+ const addCount = args["Add Navigation Item"] || 0;
351
+ const baseItemCount = defaultdata.navigation?.length || 0;
352
+
353
+ // Rebuild navigation completely
354
+ data.navigation = [];
355
+
356
+ // Add base items
357
+ for (let i = 0; i < baseItemCount; i++) {
358
+ const originalItem = defaultdata.navigation[i];
359
+ const itemName = originalItem.text;
360
+
361
+ data.navigation.push({
362
+ ...originalItem,
363
+ text: args[`${itemName.replace(/\s+/g, "")}_text`] || originalItem.text,
364
+ hideLabel:
365
+ args[`${itemName.replace(/\s+/g, "")}_hideLabel`] !== undefined
366
+ ? args[`${itemName.replace(/\s+/g, "")}_hideLabel`]
367
+ : originalItem.hideLabel,
368
+ mobileOnly:
369
+ args[`${itemName.replace(/\s+/g, "")}_mobileOnly`] !== undefined
370
+ ? args[`${itemName.replace(/\s+/g, "")}_mobileOnly`]
371
+ : originalItem.mobileOnly,
372
+ alternativeColor:
373
+ args[`${itemName.replace(/\s+/g, "")}_alternativeColor`] !== undefined
374
+ ? args[`${itemName.replace(/\s+/g, "")}_alternativeColor`]
375
+ : originalItem.alternativeColor,
376
+ iconName:
377
+ args[`${itemName.replace(/\s+/g, "")}_iconName`] ||
378
+ originalItem.iconName ||
379
+ "",
380
+ });
381
+ }
382
+
383
+ // Add new items
384
+ for (let i = 0; i < addCount; i++) {
385
+ const newItem = {
386
+ text: args[`newItem${i}_text`] || `New Item ${i + 1}`,
387
+ hideLabel: args[`newItem${i}_hideLabel`] || false,
388
+ mobileOnly: args[`newItem${i}_mobileOnly`] || false,
389
+ alternativeColor: args[`newItem${i}_alternativeColor`] || false,
390
+ iconName: args[`newItem${i}_iconName`] || "",
391
+ url: "#",
392
+ cssClass: "",
393
+ target_url: "#",
394
+ dropdown_enabled: false,
395
+ };
396
+
397
+ data.navigation.push(newItem);
398
+ }
399
+
400
+ // Apply metadata
401
+ data.metadata = data.metadata || {};
402
+ data.metadata.alternativeColor = args["Nav alternativeColor"] || false;
403
+ data.metadata.verticalOrientation =
404
+ args["Nav verticalOrientation"] || false;
405
+ data.metadata.navbarBrandName = args["Nav navbarBrandName"] || "";
406
+
407
+ try {
408
+ const navbarInstance = new Navbar(data);
409
+ let html = navbarInstance.html;
410
+
411
+ // Apply modifications with UNIQUE class names
412
+ data.navigation.forEach((item) => {
413
+ if (!item.text) return;
414
+
415
+ const escapedText = item.text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
416
+
417
+ if (item.hideLabel) {
418
+ html = html.replace(
419
+ new RegExp(`(<a[^>]*>)(${escapedText})(</a>)`, "gi"),
420
+ `$1<span class="sr-only">$2</span>$3`,
421
+ );
422
+ }
423
+
424
+ if (item.mobileOnly) {
425
+ const textPos = html.indexOf(item.text);
426
+ if (textPos !== -1) {
427
+ let liStart = html.lastIndexOf("<li", textPos);
428
+ if (liStart !== -1) {
429
+ let liEnd = html.indexOf(">", liStart);
430
+ if (liEnd !== -1) {
431
+ const originalLiTag = html.substring(liStart, liEnd + 1);
432
+ let newLiTag;
433
+
434
+ if (originalLiTag.includes('class="')) {
435
+ newLiTag = originalLiTag.replace(
436
+ 'class="',
437
+ 'class="qgds-mobile-only qgds-hide-desktop ',
438
+ );
439
+ } else {
440
+ newLiTag = originalLiTag.replace(
441
+ "<li",
442
+ '<li class="qgds-mobile-only qgds-hide-desktop"',
443
+ );
444
+ }
445
+
446
+ html =
447
+ html.substring(0, liStart) +
448
+ newLiTag +
449
+ html.substring(liEnd + 1);
450
+ }
451
+ }
452
+ }
453
+ }
454
+
455
+ if (item.alternativeColor) {
456
+ const textPos = html.indexOf(item.text);
457
+ if (textPos !== -1) {
458
+ let liStart = html.lastIndexOf("<li", textPos);
459
+ if (liStart !== -1) {
460
+ let liEnd = html.indexOf(">", liStart);
461
+ if (liEnd !== -1) {
462
+ const originalLiTag = html.substring(liStart, liEnd + 1);
463
+ let newLiTag;
464
+
465
+ if (originalLiTag.includes('class="')) {
466
+ newLiTag = originalLiTag.replace(
467
+ 'class="',
468
+ 'class="qgds-alt-color ',
469
+ );
470
+ } else {
471
+ newLiTag = originalLiTag.replace(
472
+ "<li",
473
+ '<li class="qgds-alt-color"',
474
+ );
475
+ }
476
+
477
+ html =
478
+ html.substring(0, liStart) +
479
+ newLiTag +
480
+ html.substring(liEnd + 1);
481
+ }
482
+ }
483
+ }
484
+ }
485
+ });
486
+
487
+ // Add CSS with UNIQUE class names and higher specificity
488
+ const styles = `
489
+ <style>
490
+ .css-sx1422 { height: auto !important; }
491
+ .sb-show-main.sb-main-padded { padding: 0 !important; }
492
+ #storybook-only-header {
493
+ position: relative;
494
+ z-index: 11;
495
+ background: #f8f9fa;
496
+ border-bottom: 1px solid #ddd;
497
+ display: flex;
498
+ justify-content: flex-end;
499
+ align-items: center;
500
+ }
501
+ @media (width <= 992px) {
502
+ #burgerBtn {
503
+ display: flex !important;
504
+ }
505
+ }
506
+ @media (width >= 992px) {
507
+ #burgerBtn, #storybook-only-header {
508
+ display: none !important;
509
+ }
510
+ }
511
+ </style>
512
+ `;
513
+
514
+ const navbarHTML = styles + html + `<!-- Render: ${Date.now()} -->`;
515
+
516
+ // HTML that appears before the navbar (Storybook only)
517
+ const beforeHTML = `
518
+ <div id="storybook-only-header">
519
+ <button id="burgerBtn" class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#main-nav" aria-expanded="false" aria-controls="collapseExample">
520
+ <span class="qld-icon qld-icon-xl qld-icon-menu"></span>
521
+ Menu
522
+ </button>
523
+ </div>
524
+ `;
525
+
526
+ return beforeHTML + navbarHTML;
527
+ } catch (error) {
528
+ console.error("Error:", error);
529
+ return `<div style="color: red; padding: 20px;"><h3>Error</h3><p>${error.message}</p></div>`;
530
+ }
531
+ },
532
+ };
@@ -0,0 +1,8 @@
1
+ import Component from "../../../js/QGDSComponent.js";
2
+ import template from "./templates/contentPageWithForm.hbs?raw";
3
+
4
+ export class ContentPageWithForm {
5
+ constructor(data = {}) {
6
+ return new Component(template, data);
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ import Component from "../../../js/QGDSComponent.js";
2
+ import template from "./templates/contentPageWithSideNavigation.hbs?raw";
3
+
4
+ export class ContentPageWithSideNavigation {
5
+ constructor(data = {}) {
6
+ return new Component(template, data);
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ import Component from "../../../js/QGDSComponent.js";
2
+ import template from "./templates/fullWidthLandingPage.hbs?raw";
3
+
4
+ export class FullWidthLandingPage {
5
+ constructor(data = {}) {
6
+ return new Component(template, data);
7
+ }
8
+ }
@@ -7,24 +7,25 @@
7
7
  {{> head }}
8
8
  </head>
9
9
  <body>
10
- {{> header header}}
11
- {{> navbar navbar}}
12
10
  {{> globalAlert globalAlert}}
11
+ {{> header header}}
12
+ {{> navbar navbar}}
13
13
  <main>
14
14
  <div class="container-fluid">
15
15
  <div class="container qld-content">
16
16
  <div class="row">
17
+ <!-- Side Nav -->
18
+ {{#> sidenavWrapper}}
19
+ {{> sidenav sidenav}}
20
+ {{/sidenavWrapper}}
17
21
  {{#> contentWrapper}}
18
22
  <p>content goes here dd</p>
19
- {{> table table}}
20
- {{> contentFooter contentFooter }}
23
+ {{> table table}}
21
24
  {{/contentWrapper}}
22
- </div>
23
- <div class="row">
24
- <div class="col-12">
25
- {{> backToTop backToTop}}
26
- </div>
27
- </div>
25
+ </div>
26
+ </div>
27
+ <div class="container">
28
+ {{> contentFooter contentFooter }}
28
29
  </div>
29
30
  </div>
30
31
  </main>