govuk_publishing_components 51.1.0 → 51.2.0

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/component_guide/application.scss +1 -1
  3. data/app/assets/stylesheets/govuk_publishing_components/_all_components.scss +1 -0
  4. data/app/assets/stylesheets/govuk_publishing_components/components/_metadata.scss +3 -19
  5. data/app/assets/stylesheets/govuk_publishing_components/components/helpers/_markdown-typography.scss +1 -0
  6. data/app/models/govuk_publishing_components/audit_comparer.rb +3 -3
  7. data/app/views/govuk_publishing_components/components/_title.html.erb +2 -3
  8. data/app/views/govuk_publishing_components/components/docs/add_another.yml +1 -1
  9. data/app/views/govuk_publishing_components/components/docs/big_number.yml +1 -0
  10. data/lib/govuk_publishing_components/presenters/checkboxes_helper.rb +1 -1
  11. data/lib/govuk_publishing_components/presenters/shared_helper.rb +0 -11
  12. data/lib/govuk_publishing_components/version.rb +1 -1
  13. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js +217 -184
  14. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js.map +1 -1
  15. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs +216 -184
  16. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs.map +1 -1
  17. data/node_modules/govuk-frontend/dist/govuk/all.mjs +1 -0
  18. data/node_modules/govuk-frontend/dist/govuk/all.mjs.map +1 -1
  19. data/node_modules/govuk-frontend/dist/govuk/all.scss +6 -0
  20. data/node_modules/govuk-frontend/dist/govuk/all.scss.map +1 -1
  21. data/node_modules/govuk-frontend/dist/govuk/common/configuration.mjs +164 -0
  22. data/node_modules/govuk-frontend/dist/govuk/common/configuration.mjs.map +1 -0
  23. data/node_modules/govuk-frontend/dist/govuk/common/govuk-frontend-version.mjs +1 -1
  24. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs +1 -87
  25. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs.map +1 -1
  26. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js +149 -112
  27. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js.map +1 -1
  28. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs +148 -111
  29. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs.map +1 -1
  30. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs +5 -8
  31. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs.map +1 -1
  32. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js +149 -112
  33. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js.map +1 -1
  34. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs +148 -111
  35. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs.map +1 -1
  36. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs +5 -8
  37. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs.map +1 -1
  38. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js +174 -140
  39. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js.map +1 -1
  40. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs +173 -139
  41. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs.map +1 -1
  42. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs +17 -16
  43. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs.map +1 -1
  44. data/node_modules/govuk-frontend/dist/govuk/components/character-count/macro-options.json +4 -4
  45. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js +1 -24
  46. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js.map +1 -1
  47. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs +0 -23
  48. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs.map +1 -1
  49. data/node_modules/govuk-frontend/dist/govuk/components/date-input/macro-options.json +2 -2
  50. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js +149 -112
  51. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js.map +1 -1
  52. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs +148 -111
  53. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs.map +1 -1
  54. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs +6 -8
  55. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs.map +1 -1
  56. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js +149 -112
  57. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js.map +1 -1
  58. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs +148 -111
  59. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs.map +1 -1
  60. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs +5 -8
  61. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs.map +1 -1
  62. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js +1 -24
  63. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js.map +1 -1
  64. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs +0 -23
  65. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs.map +1 -1
  66. data/node_modules/govuk-frontend/dist/govuk/components/input/macro-options.json +4 -4
  67. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js +149 -112
  68. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js.map +1 -1
  69. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs +148 -111
  70. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs.map +1 -1
  71. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs +6 -8
  72. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs.map +1 -1
  73. data/node_modules/govuk-frontend/dist/govuk/components/password-input/macro-options.json +1 -1
  74. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js +149 -112
  75. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js.map +1 -1
  76. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs +148 -111
  77. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs.map +1 -1
  78. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs +5 -8
  79. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs.map +1 -1
  80. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js +1 -24
  81. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js.map +1 -1
  82. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs +0 -23
  83. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs.map +1 -1
  84. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js +1 -24
  85. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js.map +1 -1
  86. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs +0 -23
  87. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs.map +1 -1
  88. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js +1 -24
  89. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js.map +1 -1
  90. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs +0 -23
  91. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs.map +1 -1
  92. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js +1 -24
  93. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js.map +1 -1
  94. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs +0 -23
  95. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs.map +1 -1
  96. data/node_modules/govuk-frontend/dist/govuk/components/textarea/macro-options.json +1 -1
  97. data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +1 -1
  98. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.css +1 -1
  99. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.css.map +1 -1
  100. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js +1 -1
  101. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js.map +1 -1
  102. data/node_modules/govuk-frontend/dist/govuk/init.mjs +17 -13
  103. data/node_modules/govuk-frontend/dist/govuk/init.mjs.map +1 -1
  104. data/node_modules/govuk-frontend/dist/govuk/settings/_typography-responsive.scss +5 -10
  105. data/node_modules/govuk-frontend/dist/govuk/settings/_typography-responsive.scss.map +1 -1
  106. data/node_modules/govuk-frontend/govuk-prototype-kit.config.json +1 -1
  107. data/node_modules/govuk-frontend/package.json +9 -9
  108. metadata +4 -6
  109. data/node_modules/govuk-frontend/dist/govuk/common/normalise-dataset.mjs +0 -18
  110. data/node_modules/govuk-frontend/dist/govuk/common/normalise-dataset.mjs.map +0 -1
  111. data/node_modules/govuk-frontend/dist/govuk/common/normalise-string.mjs +0 -31
  112. data/node_modules/govuk-frontend/dist/govuk/common/normalise-string.mjs.map +0 -1
@@ -1,79 +1,9 @@
1
1
  (function (global, factory) {
2
2
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
3
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.GOVUKFrontend = {}));
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.GOVUKFrontend = global.GOVUKFrontend || {}));
5
5
  })(this, (function (exports) { 'use strict';
6
6
 
7
- function normaliseString(value, property) {
8
- const trimmedValue = value ? value.trim() : '';
9
- let output;
10
- let outputType = property == null ? void 0 : property.type;
11
- if (!outputType) {
12
- if (['true', 'false'].includes(trimmedValue)) {
13
- outputType = 'boolean';
14
- }
15
- if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
16
- outputType = 'number';
17
- }
18
- }
19
- switch (outputType) {
20
- case 'boolean':
21
- output = trimmedValue === 'true';
22
- break;
23
- case 'number':
24
- output = Number(trimmedValue);
25
- break;
26
- default:
27
- output = value;
28
- }
29
- return output;
30
- }
31
-
32
- /**
33
- * @typedef {import('./index.mjs').SchemaProperty} SchemaProperty
34
- */
35
-
36
- function mergeConfigs(...configObjects) {
37
- const formattedConfigObject = {};
38
- for (const configObject of configObjects) {
39
- for (const key of Object.keys(configObject)) {
40
- const option = formattedConfigObject[key];
41
- const override = configObject[key];
42
- if (isObject(option) && isObject(override)) {
43
- formattedConfigObject[key] = mergeConfigs(option, override);
44
- } else {
45
- formattedConfigObject[key] = override;
46
- }
47
- }
48
- }
49
- return formattedConfigObject;
50
- }
51
- function extractConfigByNamespace(Component, dataset, namespace) {
52
- const property = Component.schema.properties[namespace];
53
- if ((property == null ? void 0 : property.type) !== 'object') {
54
- return;
55
- }
56
- const newObject = {
57
- [namespace]: ({})
58
- };
59
- for (const [key, value] of Object.entries(dataset)) {
60
- let current = newObject;
61
- const keyParts = key.split('.');
62
- for (const [index, name] of keyParts.entries()) {
63
- if (typeof current === 'object') {
64
- if (index < keyParts.length - 1) {
65
- if (!isObject(current[name])) {
66
- current[name] = {};
67
- }
68
- current = current[name];
69
- } else if (key !== namespace) {
70
- current[name] = normaliseString(value);
71
- }
72
- }
73
- }
74
- }
75
- return newObject[namespace];
76
- }
77
7
  function isInitialised($root, moduleName) {
78
8
  return $root instanceof HTMLElement && $root.hasAttribute(`data-${moduleName}-init`);
79
9
  }
@@ -102,47 +32,11 @@
102
32
  function formatErrorMessage(Component, message) {
103
33
  return `${Component.moduleName}: ${message}`;
104
34
  }
105
-
106
- /**
107
- * Schema for component config
108
- *
109
- * @typedef {object} Schema
110
- * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
111
- * @property {SchemaCondition[]} [anyOf] - List of schema conditions
112
- */
113
-
114
- /**
115
- * Schema property for component config
116
- *
117
- * @typedef {object} SchemaProperty
118
- * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type
119
- */
120
-
121
- /**
122
- * Schema condition for component config
123
- *
124
- * @typedef {object} SchemaCondition
125
- * @property {string[]} required - List of required config fields
126
- * @property {string} errorMessage - Error message when required config fields not provided
127
- */
128
35
  /**
129
36
  * @typedef ComponentWithModuleName
130
37
  * @property {string} moduleName - Name of the component
131
38
  */
132
39
 
133
- function normaliseDataset(Component, dataset) {
134
- const out = {};
135
- for (const [field, property] of Object.entries(Component.schema.properties)) {
136
- if (field in dataset) {
137
- out[field] = normaliseString(dataset[field], property);
138
- }
139
- if ((property == null ? void 0 : property.type) === 'object') {
140
- out[field] = extractConfigByNamespace(Component, dataset, field);
141
- }
142
- }
143
- return out;
144
- }
145
-
146
40
  class GOVUKFrontendError extends Error {
147
41
  constructor(...args) {
148
42
  super(...args);
@@ -161,6 +55,12 @@
161
55
  this.name = 'SupportError';
162
56
  }
163
57
  }
58
+ class ConfigError extends GOVUKFrontendError {
59
+ constructor(...args) {
60
+ super(...args);
61
+ this.name = 'ConfigError';
62
+ }
63
+ }
164
64
  class ElementError extends GOVUKFrontendError {
165
65
  constructor(messageOrOptions) {
166
66
  let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';
@@ -245,6 +145,144 @@
245
145
  */
246
146
  GOVUKFrontendComponent.elementType = HTMLElement;
247
147
 
148
+ const configOverride = Symbol.for('configOverride');
149
+ class ConfigurableComponent extends GOVUKFrontendComponent {
150
+ [configOverride](param) {
151
+ return {};
152
+ }
153
+
154
+ /**
155
+ * Returns the root element of the component
156
+ *
157
+ * @protected
158
+ * @returns {ConfigurationType} - the root element of component
159
+ */
160
+ get config() {
161
+ return this._config;
162
+ }
163
+ constructor($root, config) {
164
+ super($root);
165
+ this._config = void 0;
166
+ const childConstructor = this.constructor;
167
+ if (typeof childConstructor.defaults === 'undefined') {
168
+ throw new ConfigError(formatErrorMessage(childConstructor, 'Config passed as parameter into constructor but no defaults defined'));
169
+ }
170
+ const datasetConfig = normaliseDataset(childConstructor, this._$root.dataset);
171
+ this._config = mergeConfigs(childConstructor.defaults, config != null ? config : {}, this[configOverride](datasetConfig), datasetConfig);
172
+ }
173
+ }
174
+ function normaliseString(value, property) {
175
+ const trimmedValue = value ? value.trim() : '';
176
+ let output;
177
+ let outputType = property == null ? void 0 : property.type;
178
+ if (!outputType) {
179
+ if (['true', 'false'].includes(trimmedValue)) {
180
+ outputType = 'boolean';
181
+ }
182
+ if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
183
+ outputType = 'number';
184
+ }
185
+ }
186
+ switch (outputType) {
187
+ case 'boolean':
188
+ output = trimmedValue === 'true';
189
+ break;
190
+ case 'number':
191
+ output = Number(trimmedValue);
192
+ break;
193
+ default:
194
+ output = value;
195
+ }
196
+ return output;
197
+ }
198
+ function normaliseDataset(Component, dataset) {
199
+ if (typeof Component.schema === 'undefined') {
200
+ throw new ConfigError(formatErrorMessage(Component, 'Config passed as parameter into constructor but no schema defined'));
201
+ }
202
+ const out = {};
203
+ for (const [field, property] of Object.entries(Component.schema.properties)) {
204
+ if (field in dataset) {
205
+ out[field] = normaliseString(dataset[field], property);
206
+ }
207
+ if ((property == null ? void 0 : property.type) === 'object') {
208
+ out[field] = extractConfigByNamespace(Component.schema, dataset, field);
209
+ }
210
+ }
211
+ return out;
212
+ }
213
+ function mergeConfigs(...configObjects) {
214
+ const formattedConfigObject = {};
215
+ for (const configObject of configObjects) {
216
+ for (const key of Object.keys(configObject)) {
217
+ const option = formattedConfigObject[key];
218
+ const override = configObject[key];
219
+ if (isObject(option) && isObject(override)) {
220
+ formattedConfigObject[key] = mergeConfigs(option, override);
221
+ } else {
222
+ formattedConfigObject[key] = override;
223
+ }
224
+ }
225
+ }
226
+ return formattedConfigObject;
227
+ }
228
+ function extractConfigByNamespace(schema, dataset, namespace) {
229
+ const property = schema.properties[namespace];
230
+ if ((property == null ? void 0 : property.type) !== 'object') {
231
+ return;
232
+ }
233
+ const newObject = {
234
+ [namespace]: ({})
235
+ };
236
+ for (const [key, value] of Object.entries(dataset)) {
237
+ let current = newObject;
238
+ const keyParts = key.split('.');
239
+ for (const [index, name] of keyParts.entries()) {
240
+ if (typeof current === 'object') {
241
+ if (index < keyParts.length - 1) {
242
+ if (!isObject(current[name])) {
243
+ current[name] = {};
244
+ }
245
+ current = current[name];
246
+ } else if (key !== namespace) {
247
+ current[name] = normaliseString(value);
248
+ }
249
+ }
250
+ }
251
+ }
252
+ return newObject[namespace];
253
+ }
254
+ /**
255
+ * Schema for component config
256
+ *
257
+ * @typedef {object} Schema
258
+ * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
259
+ * @property {SchemaCondition[]} [anyOf] - List of schema conditions
260
+ */
261
+ /**
262
+ * Schema property for component config
263
+ *
264
+ * @typedef {object} SchemaProperty
265
+ * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type
266
+ */
267
+ /**
268
+ * Schema condition for component config
269
+ *
270
+ * @typedef {object} SchemaCondition
271
+ * @property {string[]} required - List of required config fields
272
+ * @property {string} errorMessage - Error message when required config fields not provided
273
+ */
274
+ /**
275
+ * @template {ObjectNested} [ConfigurationType={}]
276
+ * @typedef ChildClass
277
+ * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component
278
+ * @property {Schema} [schema] - The schema of the component configuration
279
+ * @property {ConfigurationType} [defaults] - The default values of the configuration of the component
280
+ */
281
+ /**
282
+ * @template {ObjectNested} [ConfigurationType={}]
283
+ * @typedef {typeof GOVUKFrontendComponent & ChildClass<ConfigurationType>} ChildClassConstructor<ConfigurationType>
284
+ */
285
+
248
286
  class I18n {
249
287
  constructor(translations = {}, config = {}) {
250
288
  var _config$locale;
@@ -442,15 +480,15 @@
442
480
  * Exit this page component
443
481
  *
444
482
  * @preserve
483
+ * @augments ConfigurableComponent<ExitThisPageConfig>
445
484
  */
446
- class ExitThisPage extends GOVUKFrontendComponent {
485
+ class ExitThisPage extends ConfigurableComponent {
447
486
  /**
448
487
  * @param {Element | null} $root - HTML element that wraps the Exit This Page button
449
488
  * @param {ExitThisPageConfig} [config] - Exit This Page config
450
489
  */
451
490
  constructor($root, config = {}) {
452
- super($root);
453
- this.config = void 0;
491
+ super($root, config);
454
492
  this.i18n = void 0;
455
493
  this.$button = void 0;
456
494
  this.$skiplinkButton = null;
@@ -471,7 +509,6 @@
471
509
  identifier: 'Button (`.govuk-exit-this-page__button`)'
472
510
  });
473
511
  }
474
- this.config = mergeConfigs(ExitThisPage.defaults, config, normaliseDataset(ExitThisPage, this.$root.dataset));
475
512
  this.i18n = new I18n(this.config.i18n);
476
513
  this.$button = $button;
477
514
  const $skiplinkButton = document.querySelector('.govuk-js-exit-this-page-skiplink');
@@ -637,7 +674,7 @@
637
674
  */
638
675
 
639
676
  /**
640
- * @typedef {import('../../common/index.mjs').Schema} Schema
677
+ * @typedef {import('../../common/configuration.mjs').Schema} Schema
641
678
  */
642
679
  ExitThisPage.moduleName = 'govuk-exit-this-page';
643
680
  ExitThisPage.defaults = Object.freeze({