govuk_publishing_components 51.1.1 → 51.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) 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/helpers/_markdown-typography.scss +1 -0
  5. data/app/models/govuk_publishing_components/audit_comparer.rb +3 -3
  6. data/app/views/govuk_publishing_components/components/_title.html.erb +2 -3
  7. data/app/views/govuk_publishing_components/components/docs/add_another.yml +1 -1
  8. data/lib/govuk_publishing_components/presenters/checkboxes_helper.rb +1 -1
  9. data/lib/govuk_publishing_components/presenters/shared_helper.rb +0 -11
  10. data/lib/govuk_publishing_components/version.rb +1 -1
  11. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js +217 -184
  12. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js.map +1 -1
  13. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs +216 -184
  14. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs.map +1 -1
  15. data/node_modules/govuk-frontend/dist/govuk/all.mjs +1 -0
  16. data/node_modules/govuk-frontend/dist/govuk/all.mjs.map +1 -1
  17. data/node_modules/govuk-frontend/dist/govuk/all.scss +6 -0
  18. data/node_modules/govuk-frontend/dist/govuk/all.scss.map +1 -1
  19. data/node_modules/govuk-frontend/dist/govuk/common/configuration.mjs +164 -0
  20. data/node_modules/govuk-frontend/dist/govuk/common/configuration.mjs.map +1 -0
  21. data/node_modules/govuk-frontend/dist/govuk/common/govuk-frontend-version.mjs +1 -1
  22. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs +1 -87
  23. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs.map +1 -1
  24. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js +149 -112
  25. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js.map +1 -1
  26. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs +148 -111
  27. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs.map +1 -1
  28. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs +5 -8
  29. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs.map +1 -1
  30. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js +149 -112
  31. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js.map +1 -1
  32. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs +148 -111
  33. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs.map +1 -1
  34. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs +5 -8
  35. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs.map +1 -1
  36. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js +174 -140
  37. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js.map +1 -1
  38. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs +173 -139
  39. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs.map +1 -1
  40. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs +17 -16
  41. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs.map +1 -1
  42. data/node_modules/govuk-frontend/dist/govuk/components/character-count/macro-options.json +4 -4
  43. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js +1 -24
  44. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js.map +1 -1
  45. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs +0 -23
  46. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs.map +1 -1
  47. data/node_modules/govuk-frontend/dist/govuk/components/date-input/macro-options.json +2 -2
  48. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js +149 -112
  49. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js.map +1 -1
  50. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs +148 -111
  51. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs.map +1 -1
  52. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs +6 -8
  53. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs.map +1 -1
  54. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js +149 -112
  55. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js.map +1 -1
  56. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs +148 -111
  57. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs.map +1 -1
  58. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs +5 -8
  59. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs.map +1 -1
  60. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js +1 -24
  61. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js.map +1 -1
  62. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs +0 -23
  63. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs.map +1 -1
  64. data/node_modules/govuk-frontend/dist/govuk/components/input/macro-options.json +4 -4
  65. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js +149 -112
  66. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js.map +1 -1
  67. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs +148 -111
  68. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs.map +1 -1
  69. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs +6 -8
  70. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs.map +1 -1
  71. data/node_modules/govuk-frontend/dist/govuk/components/password-input/macro-options.json +1 -1
  72. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js +149 -112
  73. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js.map +1 -1
  74. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs +148 -111
  75. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs.map +1 -1
  76. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs +5 -8
  77. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs.map +1 -1
  78. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js +1 -24
  79. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js.map +1 -1
  80. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs +0 -23
  81. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs.map +1 -1
  82. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js +1 -24
  83. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js.map +1 -1
  84. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs +0 -23
  85. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs.map +1 -1
  86. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js +1 -24
  87. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js.map +1 -1
  88. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs +0 -23
  89. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs.map +1 -1
  90. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js +1 -24
  91. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js.map +1 -1
  92. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs +0 -23
  93. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs.map +1 -1
  94. data/node_modules/govuk-frontend/dist/govuk/components/textarea/macro-options.json +1 -1
  95. data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +1 -1
  96. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.css +1 -1
  97. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.css.map +1 -1
  98. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js +1 -1
  99. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js.map +1 -1
  100. data/node_modules/govuk-frontend/dist/govuk/init.mjs +17 -13
  101. data/node_modules/govuk-frontend/dist/govuk/init.mjs.map +1 -1
  102. data/node_modules/govuk-frontend/dist/govuk/settings/_typography-responsive.scss +5 -10
  103. data/node_modules/govuk-frontend/dist/govuk/settings/_typography-responsive.scss.map +1 -1
  104. data/node_modules/govuk-frontend/govuk-prototype-kit.config.json +1 -1
  105. data/node_modules/govuk-frontend/package.json +9 -9
  106. metadata +4 -6
  107. data/node_modules/govuk-frontend/dist/govuk/common/normalise-dataset.mjs +0 -18
  108. data/node_modules/govuk-frontend/dist/govuk/common/normalise-dataset.mjs.map +0 -1
  109. data/node_modules/govuk-frontend/dist/govuk/common/normalise-string.mjs +0 -31
  110. 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';