govuk_publishing_components 51.1.1 → 51.2.1

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