katalyst-govuk-formbuilder 1.12.1 → 1.13.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.
- checksums.yaml +4 -4
- data/app/assets/builds/katalyst/govuk/formbuilder.css +1 -1
- data/app/assets/builds/katalyst/govuk/formbuilder.js +117 -103
- data/app/assets/builds/katalyst/govuk/formbuilder.min.js +7 -7
- data/node_modules/govuk-frontend/dist/govuk/components/details/_index.scss +7 -2
- data/node_modules/govuk-frontend/dist/govuk/components/footer/_index.scss +8 -10
- data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_index.scss +7 -1
- data/node_modules/govuk-frontend/dist/govuk/components/warning-text/_index.scss +4 -3
- data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +1 -1
- data/node_modules/govuk-frontend/dist/govuk/settings/_colours-organisations.scss +15 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb7a5f79742efe731b47dcf4f26f797b4d43e7a97593e979be80c4da34e47707
|
4
|
+
data.tar.gz: 334a40fb19dd3362db6532b68fb33ee4ded7134e293db426af65fc7ab33724dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a24b9773c6b0426ac5864fd9bc2d5b71ec145f9759b2b54c45651c92aef1bc639a945db305972c9893fb95b161affd2da2f4c696c38ff9a1e79e04b4c42d188
|
7
|
+
data.tar.gz: 1aacfcaaeaa8dedae0fa8add858555ad677002dada8f6ccf7f64a92be07ee09dd2d42c95258f664299454025fb7b8622a25b3e8452d258cc2259a0b9b1c8fce9
|
@@ -94,6 +94,19 @@ function setFocus($element, options = {}) {
|
|
94
94
|
(_options$onBeforeFocu = options.onBeforeFocus) == null || _options$onBeforeFocu.call($element);
|
95
95
|
$element.focus();
|
96
96
|
}
|
97
|
+
function isInitialised($root, moduleName) {
|
98
|
+
return $root instanceof HTMLElement && $root.hasAttribute(`data-${moduleName}-init`);
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Checks if GOV.UK Frontend is supported on this page
|
103
|
+
*
|
104
|
+
* Some browsers will load and run our JavaScript but GOV.UK Frontend
|
105
|
+
* won't be supported.
|
106
|
+
*
|
107
|
+
* @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support
|
108
|
+
* @returns {boolean} Whether GOV.UK Frontend is supported on this page
|
109
|
+
*/
|
97
110
|
function isSupported($scope = document.body) {
|
98
111
|
if (!$scope) {
|
99
112
|
return false;
|
@@ -126,6 +139,9 @@ function isArray(option) {
|
|
126
139
|
function isObject(option) {
|
127
140
|
return !!option && typeof option === 'object' && !isArray(option);
|
128
141
|
}
|
142
|
+
function formatErrorMessage(Component, message) {
|
143
|
+
return `${Component.moduleName}: ${message}`;
|
144
|
+
}
|
129
145
|
|
130
146
|
function normaliseDataset(Component, dataset) {
|
131
147
|
const out = {};
|
@@ -169,30 +185,82 @@ class ElementError extends GOVUKFrontendError {
|
|
169
185
|
let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';
|
170
186
|
if (typeof messageOrOptions === 'object') {
|
171
187
|
const {
|
172
|
-
|
188
|
+
component,
|
173
189
|
identifier,
|
174
190
|
element,
|
175
191
|
expectedType
|
176
192
|
} = messageOrOptions;
|
177
|
-
message =
|
193
|
+
message = identifier;
|
178
194
|
message += element ? ` is not of type ${expectedType != null ? expectedType : 'HTMLElement'}` : ' not found';
|
195
|
+
message = formatErrorMessage(component, message);
|
179
196
|
}
|
180
197
|
super(message);
|
181
198
|
this.name = 'ElementError';
|
182
199
|
}
|
183
200
|
}
|
201
|
+
class InitError extends GOVUKFrontendError {
|
202
|
+
constructor(componentOrMessage) {
|
203
|
+
const message = typeof componentOrMessage === 'string' ? componentOrMessage : formatErrorMessage(componentOrMessage, `Root element (\`$root\`) already initialised`);
|
204
|
+
super(message);
|
205
|
+
this.name = 'InitError';
|
206
|
+
}
|
207
|
+
}
|
184
208
|
|
185
209
|
class GOVUKFrontendComponent {
|
186
|
-
|
187
|
-
|
210
|
+
/**
|
211
|
+
* Returns the root element of the component
|
212
|
+
*
|
213
|
+
* @protected
|
214
|
+
* @returns {RootElementType} - the root element of component
|
215
|
+
*/
|
216
|
+
get $root() {
|
217
|
+
return this._$root;
|
188
218
|
}
|
189
|
-
|
219
|
+
constructor($root) {
|
220
|
+
this._$root = void 0;
|
221
|
+
const childConstructor = this.constructor;
|
222
|
+
if (typeof childConstructor.moduleName !== 'string') {
|
223
|
+
throw new InitError(`\`moduleName\` not defined in component`);
|
224
|
+
}
|
225
|
+
if (!($root instanceof childConstructor.elementType)) {
|
226
|
+
throw new ElementError({
|
227
|
+
element: $root,
|
228
|
+
component: childConstructor,
|
229
|
+
identifier: 'Root element (`$root`)',
|
230
|
+
expectedType: childConstructor.elementType.name
|
231
|
+
});
|
232
|
+
} else {
|
233
|
+
this._$root = $root;
|
234
|
+
}
|
235
|
+
childConstructor.checkSupport();
|
236
|
+
this.checkInitialised();
|
237
|
+
const moduleName = childConstructor.moduleName;
|
238
|
+
this.$root.setAttribute(`data-${moduleName}-init`, '');
|
239
|
+
}
|
240
|
+
checkInitialised() {
|
241
|
+
const constructor = this.constructor;
|
242
|
+
const moduleName = constructor.moduleName;
|
243
|
+
if (moduleName && isInitialised(this.$root, moduleName)) {
|
244
|
+
throw new InitError(constructor);
|
245
|
+
}
|
246
|
+
}
|
247
|
+
static checkSupport() {
|
190
248
|
if (!isSupported()) {
|
191
249
|
throw new SupportError();
|
192
250
|
}
|
193
251
|
}
|
194
252
|
}
|
195
253
|
|
254
|
+
/**
|
255
|
+
* @typedef ChildClass
|
256
|
+
* @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component
|
257
|
+
*/
|
258
|
+
|
259
|
+
/**
|
260
|
+
* @typedef {typeof GOVUKFrontendComponent & ChildClass} ChildClassConstructor
|
261
|
+
*/
|
262
|
+
GOVUKFrontendComponent.elementType = HTMLElement;
|
263
|
+
|
196
264
|
class I18n {
|
197
265
|
constructor(translations = {}, config = {}) {
|
198
266
|
var _config$locale;
|
@@ -395,25 +463,16 @@ const DEBOUNCE_TIMEOUT_IN_SECONDS = 1;
|
|
395
463
|
*/
|
396
464
|
class Button extends GOVUKFrontendComponent {
|
397
465
|
/**
|
398
|
-
* @param {Element | null} $
|
466
|
+
* @param {Element | null} $root - HTML element to use for button
|
399
467
|
* @param {ButtonConfig} [config] - Button config
|
400
468
|
*/
|
401
|
-
constructor($
|
402
|
-
super();
|
403
|
-
this.$module = void 0;
|
469
|
+
constructor($root, config = {}) {
|
470
|
+
super($root);
|
404
471
|
this.config = void 0;
|
405
472
|
this.debounceFormSubmitTimer = null;
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
element: $module,
|
410
|
-
identifier: 'Root element (`$module`)'
|
411
|
-
});
|
412
|
-
}
|
413
|
-
this.$module = $module;
|
414
|
-
this.config = mergeConfigs(Button.defaults, config, normaliseDataset(Button, $module.dataset));
|
415
|
-
this.$module.addEventListener('keydown', event => this.handleKeyDown(event));
|
416
|
-
this.$module.addEventListener('click', event => this.debounce(event));
|
473
|
+
this.config = mergeConfigs(Button.defaults, config, normaliseDataset(Button, this.$root.dataset));
|
474
|
+
this.$root.addEventListener('keydown', event => this.handleKeyDown(event));
|
475
|
+
this.$root.addEventListener('click', event => this.debounce(event));
|
417
476
|
}
|
418
477
|
handleKeyDown(event) {
|
419
478
|
const $target = event.target;
|
@@ -481,13 +540,12 @@ function closestAttributeValue($element, attributeName) {
|
|
481
540
|
*/
|
482
541
|
class CharacterCount extends GOVUKFrontendComponent {
|
483
542
|
/**
|
484
|
-
* @param {Element | null} $
|
543
|
+
* @param {Element | null} $root - HTML element to use for character count
|
485
544
|
* @param {CharacterCountConfig} [config] - Character count config
|
486
545
|
*/
|
487
|
-
constructor($
|
546
|
+
constructor($root, config = {}) {
|
488
547
|
var _ref, _this$config$maxwords;
|
489
|
-
super();
|
490
|
-
this.$module = void 0;
|
548
|
+
super($root);
|
491
549
|
this.$textarea = void 0;
|
492
550
|
this.$visibleCountMessage = void 0;
|
493
551
|
this.$screenReaderCountMessage = void 0;
|
@@ -497,23 +555,16 @@ class CharacterCount extends GOVUKFrontendComponent {
|
|
497
555
|
this.config = void 0;
|
498
556
|
this.i18n = void 0;
|
499
557
|
this.maxLength = void 0;
|
500
|
-
|
501
|
-
throw new ElementError({
|
502
|
-
componentName: 'Character count',
|
503
|
-
element: $module,
|
504
|
-
identifier: 'Root element (`$module`)'
|
505
|
-
});
|
506
|
-
}
|
507
|
-
const $textarea = $module.querySelector('.govuk-js-character-count');
|
558
|
+
const $textarea = this.$root.querySelector('.govuk-js-character-count');
|
508
559
|
if (!($textarea instanceof HTMLTextAreaElement || $textarea instanceof HTMLInputElement)) {
|
509
560
|
throw new ElementError({
|
510
|
-
|
561
|
+
component: CharacterCount,
|
511
562
|
element: $textarea,
|
512
563
|
expectedType: 'HTMLTextareaElement or HTMLInputElement',
|
513
564
|
identifier: 'Form field (`.govuk-js-character-count`)'
|
514
565
|
});
|
515
566
|
}
|
516
|
-
const datasetConfig = normaliseDataset(CharacterCount,
|
567
|
+
const datasetConfig = normaliseDataset(CharacterCount, this.$root.dataset);
|
517
568
|
let configOverrides = {};
|
518
569
|
if ('maxwords' in datasetConfig || 'maxlength' in datasetConfig) {
|
519
570
|
configOverrides = {
|
@@ -524,19 +575,18 @@ class CharacterCount extends GOVUKFrontendComponent {
|
|
524
575
|
this.config = mergeConfigs(CharacterCount.defaults, config, configOverrides, datasetConfig);
|
525
576
|
const errors = validateConfig(CharacterCount.schema, this.config);
|
526
577
|
if (errors[0]) {
|
527
|
-
throw new ConfigError(
|
578
|
+
throw new ConfigError(formatErrorMessage(CharacterCount, errors[0]));
|
528
579
|
}
|
529
580
|
this.i18n = new I18n(this.config.i18n, {
|
530
|
-
locale: closestAttributeValue(
|
581
|
+
locale: closestAttributeValue(this.$root, 'lang')
|
531
582
|
});
|
532
583
|
this.maxLength = (_ref = (_this$config$maxwords = this.config.maxwords) != null ? _this$config$maxwords : this.config.maxlength) != null ? _ref : Infinity;
|
533
|
-
this.$module = $module;
|
534
584
|
this.$textarea = $textarea;
|
535
585
|
const textareaDescriptionId = `${this.$textarea.id}-info`;
|
536
586
|
const $textareaDescription = document.getElementById(textareaDescriptionId);
|
537
587
|
if (!$textareaDescription) {
|
538
588
|
throw new ElementError({
|
539
|
-
|
589
|
+
component: CharacterCount,
|
540
590
|
element: $textareaDescription,
|
541
591
|
identifier: `Count message (\`id="${textareaDescriptionId}"\`)`
|
542
592
|
});
|
@@ -780,27 +830,18 @@ class Checkboxes extends GOVUKFrontendComponent {
|
|
780
830
|
* (for example if the user has navigated back), and set up event handlers to
|
781
831
|
* keep the reveal in sync with the checkbox state.
|
782
832
|
*
|
783
|
-
* @param {Element | null} $
|
833
|
+
* @param {Element | null} $root - HTML element to use for checkboxes
|
784
834
|
*/
|
785
|
-
constructor($
|
786
|
-
super();
|
787
|
-
this.$module = void 0;
|
835
|
+
constructor($root) {
|
836
|
+
super($root);
|
788
837
|
this.$inputs = void 0;
|
789
|
-
|
790
|
-
throw new ElementError({
|
791
|
-
componentName: 'Checkboxes',
|
792
|
-
element: $module,
|
793
|
-
identifier: 'Root element (`$module`)'
|
794
|
-
});
|
795
|
-
}
|
796
|
-
const $inputs = $module.querySelectorAll('input[type="checkbox"]');
|
838
|
+
const $inputs = this.$root.querySelectorAll('input[type="checkbox"]');
|
797
839
|
if (!$inputs.length) {
|
798
840
|
throw new ElementError({
|
799
|
-
|
841
|
+
component: Checkboxes,
|
800
842
|
identifier: 'Form inputs (`<input type="checkbox">`)'
|
801
843
|
});
|
802
844
|
}
|
803
|
-
this.$module = $module;
|
804
845
|
this.$inputs = $inputs;
|
805
846
|
this.$inputs.forEach($input => {
|
806
847
|
const targetId = $input.getAttribute('data-aria-controls');
|
@@ -809,7 +850,7 @@ class Checkboxes extends GOVUKFrontendComponent {
|
|
809
850
|
}
|
810
851
|
if (!document.getElementById(targetId)) {
|
811
852
|
throw new ElementError({
|
812
|
-
|
853
|
+
component: Checkboxes,
|
813
854
|
identifier: `Conditional reveal (\`id="${targetId}"\`)`
|
814
855
|
});
|
815
856
|
}
|
@@ -818,7 +859,7 @@ class Checkboxes extends GOVUKFrontendComponent {
|
|
818
859
|
});
|
819
860
|
window.addEventListener('pageshow', () => this.syncAllConditionalReveals());
|
820
861
|
this.syncAllConditionalReveals();
|
821
|
-
this.$
|
862
|
+
this.$root.addEventListener('click', event => this.handleClick(event));
|
822
863
|
}
|
823
864
|
syncAllConditionalReveals() {
|
824
865
|
this.$inputs.forEach($input => this.syncConditionalRevealWithInputState($input));
|
@@ -887,26 +928,17 @@ Checkboxes.moduleName = 'govuk-checkboxes';
|
|
887
928
|
*/
|
888
929
|
class ErrorSummary extends GOVUKFrontendComponent {
|
889
930
|
/**
|
890
|
-
* @param {Element | null} $
|
931
|
+
* @param {Element | null} $root - HTML element to use for error summary
|
891
932
|
* @param {ErrorSummaryConfig} [config] - Error summary config
|
892
933
|
*/
|
893
|
-
constructor($
|
894
|
-
super();
|
895
|
-
this.$module = void 0;
|
934
|
+
constructor($root, config = {}) {
|
935
|
+
super($root);
|
896
936
|
this.config = void 0;
|
897
|
-
|
898
|
-
throw new ElementError({
|
899
|
-
componentName: 'Error summary',
|
900
|
-
element: $module,
|
901
|
-
identifier: 'Root element (`$module`)'
|
902
|
-
});
|
903
|
-
}
|
904
|
-
this.$module = $module;
|
905
|
-
this.config = mergeConfigs(ErrorSummary.defaults, config, normaliseDataset(ErrorSummary, $module.dataset));
|
937
|
+
this.config = mergeConfigs(ErrorSummary.defaults, config, normaliseDataset(ErrorSummary, this.$root.dataset));
|
906
938
|
if (!this.config.disableAutoFocus) {
|
907
|
-
setFocus(this.$
|
939
|
+
setFocus(this.$root);
|
908
940
|
}
|
909
|
-
this.$
|
941
|
+
this.$root.addEventListener('click', event => this.handleClick(event));
|
910
942
|
}
|
911
943
|
handleClick(event) {
|
912
944
|
const $target = event.target;
|
@@ -990,28 +1022,20 @@ ErrorSummary.schema = Object.freeze({
|
|
990
1022
|
*/
|
991
1023
|
class PasswordInput extends GOVUKFrontendComponent {
|
992
1024
|
/**
|
993
|
-
* @param {Element | null} $
|
1025
|
+
* @param {Element | null} $root - HTML element to use for password input
|
994
1026
|
* @param {PasswordInputConfig} [config] - Password input config
|
995
1027
|
*/
|
996
|
-
constructor($
|
997
|
-
super();
|
998
|
-
this.$module = void 0;
|
1028
|
+
constructor($root, config = {}) {
|
1029
|
+
super($root);
|
999
1030
|
this.config = void 0;
|
1000
1031
|
this.i18n = void 0;
|
1001
1032
|
this.$input = void 0;
|
1002
1033
|
this.$showHideButton = void 0;
|
1003
1034
|
this.$screenReaderStatusMessage = void 0;
|
1004
|
-
|
1005
|
-
throw new ElementError({
|
1006
|
-
componentName: 'Password input',
|
1007
|
-
element: $module,
|
1008
|
-
identifier: 'Root element (`$module`)'
|
1009
|
-
});
|
1010
|
-
}
|
1011
|
-
const $input = $module.querySelector('.govuk-js-password-input-input');
|
1035
|
+
const $input = this.$root.querySelector('.govuk-js-password-input-input');
|
1012
1036
|
if (!($input instanceof HTMLInputElement)) {
|
1013
1037
|
throw new ElementError({
|
1014
|
-
|
1038
|
+
component: PasswordInput,
|
1015
1039
|
element: $input,
|
1016
1040
|
expectedType: 'HTMLInputElement',
|
1017
1041
|
identifier: 'Form field (`.govuk-js-password-input-input`)'
|
@@ -1020,10 +1044,10 @@ class PasswordInput extends GOVUKFrontendComponent {
|
|
1020
1044
|
if ($input.type !== 'password') {
|
1021
1045
|
throw new ElementError('Password input: Form field (`.govuk-js-password-input-input`) must be of type `password`.');
|
1022
1046
|
}
|
1023
|
-
const $showHideButton =
|
1047
|
+
const $showHideButton = this.$root.querySelector('.govuk-js-password-input-toggle');
|
1024
1048
|
if (!($showHideButton instanceof HTMLButtonElement)) {
|
1025
1049
|
throw new ElementError({
|
1026
|
-
|
1050
|
+
component: PasswordInput,
|
1027
1051
|
element: $showHideButton,
|
1028
1052
|
expectedType: 'HTMLButtonElement',
|
1029
1053
|
identifier: 'Button (`.govuk-js-password-input-toggle`)'
|
@@ -1032,12 +1056,11 @@ class PasswordInput extends GOVUKFrontendComponent {
|
|
1032
1056
|
if ($showHideButton.type !== 'button') {
|
1033
1057
|
throw new ElementError('Password input: Button (`.govuk-js-password-input-toggle`) must be of type `button`.');
|
1034
1058
|
}
|
1035
|
-
this.$module = $module;
|
1036
1059
|
this.$input = $input;
|
1037
1060
|
this.$showHideButton = $showHideButton;
|
1038
|
-
this.config = mergeConfigs(PasswordInput.defaults, config, normaliseDataset(PasswordInput,
|
1061
|
+
this.config = mergeConfigs(PasswordInput.defaults, config, normaliseDataset(PasswordInput, this.$root.dataset));
|
1039
1062
|
this.i18n = new I18n(this.config.i18n, {
|
1040
|
-
locale: closestAttributeValue(
|
1063
|
+
locale: closestAttributeValue(this.$root, 'lang')
|
1041
1064
|
});
|
1042
1065
|
this.$showHideButton.removeAttribute('hidden');
|
1043
1066
|
const $screenReaderStatusMessage = document.createElement('div');
|
@@ -1155,27 +1178,18 @@ class Radios extends GOVUKFrontendComponent {
|
|
1155
1178
|
* (for example if the user has navigated back), and set up event handlers to
|
1156
1179
|
* keep the reveal in sync with the radio state.
|
1157
1180
|
*
|
1158
|
-
* @param {Element | null} $
|
1181
|
+
* @param {Element | null} $root - HTML element to use for radios
|
1159
1182
|
*/
|
1160
|
-
constructor($
|
1161
|
-
super();
|
1162
|
-
this.$module = void 0;
|
1183
|
+
constructor($root) {
|
1184
|
+
super($root);
|
1163
1185
|
this.$inputs = void 0;
|
1164
|
-
|
1165
|
-
throw new ElementError({
|
1166
|
-
componentName: 'Radios',
|
1167
|
-
element: $module,
|
1168
|
-
identifier: 'Root element (`$module`)'
|
1169
|
-
});
|
1170
|
-
}
|
1171
|
-
const $inputs = $module.querySelectorAll('input[type="radio"]');
|
1186
|
+
const $inputs = this.$root.querySelectorAll('input[type="radio"]');
|
1172
1187
|
if (!$inputs.length) {
|
1173
1188
|
throw new ElementError({
|
1174
|
-
|
1189
|
+
component: Radios,
|
1175
1190
|
identifier: 'Form inputs (`<input type="radio">`)'
|
1176
1191
|
});
|
1177
1192
|
}
|
1178
|
-
this.$module = $module;
|
1179
1193
|
this.$inputs = $inputs;
|
1180
1194
|
this.$inputs.forEach($input => {
|
1181
1195
|
const targetId = $input.getAttribute('data-aria-controls');
|
@@ -1184,7 +1198,7 @@ class Radios extends GOVUKFrontendComponent {
|
|
1184
1198
|
}
|
1185
1199
|
if (!document.getElementById(targetId)) {
|
1186
1200
|
throw new ElementError({
|
1187
|
-
|
1201
|
+
component: Radios,
|
1188
1202
|
identifier: `Conditional reveal (\`id="${targetId}"\`)`
|
1189
1203
|
});
|
1190
1204
|
}
|
@@ -1193,7 +1207,7 @@ class Radios extends GOVUKFrontendComponent {
|
|
1193
1207
|
});
|
1194
1208
|
window.addEventListener('pageshow', () => this.syncAllConditionalReveals());
|
1195
1209
|
this.syncAllConditionalReveals();
|
1196
|
-
this.$
|
1210
|
+
this.$root.addEventListener('click', event => this.handleClick(event));
|
1197
1211
|
}
|
1198
1212
|
syncAllConditionalReveals() {
|
1199
1213
|
this.$inputs.forEach($input => this.syncConditionalRevealWithInputState($input));
|
@@ -1,10 +1,10 @@
|
|
1
|
-
function e(e,t){const n=e?e.trim():"";let o,s=null==t?void 0:t.type;switch(s||(["true","false"].includes(n)&&(s="boolean"),n.length>0&&isFinite(Number(n))&&(s="number")),s){case"boolean":o="true"===n;break;case"number":o=Number(n);break;default:o=e}return o}function t(...e){const n={};for(const o of e)for(const e of Object.keys(o)){const i=n[e],r=o[e];s(i)&&s(r)?n[e]=t(i,r):n[e]=r}return n}function n(t,n,o){const i=t.schema.properties[o];if("object"!==(null==i?void 0:i.type))return;const r={[o]:{}};for(const[t,i]of Object.entries(n)){let n=r;const a=t.split(".");for(const[r,
|
1
|
+
function e(e,t){const n=e?e.trim():"";let o,s=null==t?void 0:t.type;switch(s||(["true","false"].includes(n)&&(s="boolean"),n.length>0&&isFinite(Number(n))&&(s="number")),s){case"boolean":o="true"===n;break;case"number":o=Number(n);break;default:o=e}return o}function t(...e){const n={};for(const o of e)for(const e of Object.keys(o)){const i=n[e],r=o[e];s(i)&&s(r)?n[e]=t(i,r):n[e]=r}return n}function n(t,n,o){const i=t.schema.properties[o];if("object"!==(null==i?void 0:i.type))return;const r={[o]:{}};for(const[t,i]of Object.entries(n)){let n=r;const a=t.split(".");for(const[r,u]of a.entries())"object"==typeof n&&(r<a.length-1?(s(n[u])||(n[u]={}),n=n[u]):t!==o&&(n[u]=e(i)))}return r[o]}function o(e=document.body){return!!e&&e.classList.contains("govuk-frontend-supported")}function s(e){return!!e&&"object"==typeof e&&!function(e){return Array.isArray(e)}(e)}function i(e,t){return`${e.moduleName}: ${t}`}function r(t,o){const s={};for(const[i,r]of Object.entries(t.schema.properties))i in o&&(s[i]=e(o[i],r)),"object"===(null==r?void 0:r.type)&&(s[i]=n(t,o,i));return s}class a extends Error{constructor(...e){super(...e),this.name="GOVUKFrontendError"}}class u extends a{constructor(e=document.body){const t="noModule"in HTMLScriptElement.prototype?'GOV.UK Frontend initialised without `<body class="govuk-frontend-supported">` from template `<script>` snippet':"GOV.UK Frontend is not supported in this browser";super(e?t:'GOV.UK Frontend initialised without `<script type="module">`'),this.name="SupportError"}}class l extends a{constructor(...e){super(...e),this.name="ConfigError"}}class c extends a{constructor(e){let t="string"==typeof e?e:"";if("object"==typeof e){const{component:n,identifier:o,element:s,expectedType:r}=e;t=o,t+=s?` is not of type ${null!=r?r:"HTMLElement"}`:" not found",t=i(n,t)}super(t),this.name="ElementError"}}class h extends a{constructor(e){super("string"==typeof e?e:i(e,"Root element (`$root`) already initialised")),this.name="InitError"}}class d{get $root(){return this._$root}constructor(e){this._$root=void 0;const t=this.constructor;if("string"!=typeof t.moduleName)throw new h("`moduleName` not defined in component");if(!(e instanceof t.elementType))throw new c({element:e,component:t,identifier:"Root element (`$root`)",expectedType:t.elementType.name});this._$root=e,t.checkSupport(),this.checkInitialised();const n=t.moduleName;this.$root.setAttribute(`data-${n}-init`,"")}checkInitialised(){const e=this.constructor,t=e.moduleName;if(t&&function(e,t){return e instanceof HTMLElement&&e.hasAttribute(`data-${t}-init`)}(this.$root,t))throw new h(e)}static checkSupport(){if(!o())throw new u}}d.elementType=HTMLElement;class p{constructor(e={},t={}){var n;this.translations=void 0,this.locale=void 0,this.translations=e,this.locale=null!=(n=t.locale)?n:document.documentElement.lang||"en"}t(e,t){if(!e)throw new Error("i18n: lookup key missing");let n=this.translations[e];if("number"==typeof(null==t?void 0:t.count)&&"object"==typeof n){const o=n[this.getPluralSuffix(e,t.count)];o&&(n=o)}if("string"==typeof n){if(n.match(/%{(.\S+)}/)){if(!t)throw new Error("i18n: cannot replace placeholders in string if no option data provided");return this.replacePlaceholders(n,t)}return n}return e}replacePlaceholders(e,t){const n=Intl.NumberFormat.supportedLocalesOf(this.locale).length?new Intl.NumberFormat(this.locale):void 0;return e.replace(/%{(.\S+)}/g,(function(e,o){if(Object.prototype.hasOwnProperty.call(t,o)){const e=t[o];return!1===e||"number"!=typeof e&&"string"!=typeof e?"":"number"==typeof e?n?n.format(e):`${e}`:e}throw new Error(`i18n: no data found to replace ${e} placeholder in string`)}))}hasIntlPluralRulesSupport(){return Boolean("PluralRules"in window.Intl&&Intl.PluralRules.supportedLocalesOf(this.locale).length)}getPluralSuffix(e,t){if(t=Number(t),!isFinite(t))return"other";const n=this.translations[e],o=this.hasIntlPluralRulesSupport()?new Intl.PluralRules(this.locale).select(t):this.selectPluralFormUsingFallbackRules(t);if("object"==typeof n){if(o in n)return o;if("other"in n)return console.warn(`i18n: Missing plural form ".${o}" for "${this.locale}" locale. Falling back to ".other".`),"other"}throw new Error(`i18n: Plural form ".other" is required for "${this.locale}" locale`)}selectPluralFormUsingFallbackRules(e){e=Math.abs(Math.floor(e));const t=this.getPluralRulesForLocale();return t?p.pluralRules[t](e):"other"}getPluralRulesForLocale(){const e=this.locale.split("-")[0];for(const t in p.pluralRulesMap){const n=p.pluralRulesMap[t];if(n.includes(this.locale)||n.includes(e))return t}}}p.pluralRulesMap={arabic:["ar"],chinese:["my","zh","id","ja","jv","ko","ms","th","vi"],french:["hy","bn","fr","gu","hi","fa","pa","zu"],german:["af","sq","az","eu","bg","ca","da","nl","en","et","fi","ka","de","el","hu","lb","no","so","sw","sv","ta","te","tr","ur"],irish:["ga"],russian:["ru","uk"],scottish:["gd"],spanish:["pt-PT","it","es"],welsh:["cy"]},p.pluralRules={arabic:e=>0===e?"zero":1===e?"one":2===e?"two":e%100>=3&&e%100<=10?"few":e%100>=11&&e%100<=99?"many":"other",chinese:()=>"other",french:e=>0===e||1===e?"one":"other",german:e=>1===e?"one":"other",irish:e=>1===e?"one":2===e?"two":e>=3&&e<=6?"few":e>=7&&e<=10?"many":"other",russian(e){const t=e%100,n=t%10;return 1===n&&11!==t?"one":n>=2&&n<=4&&!(t>=12&&t<=14)?"few":0===n||n>=5&&n<=9||t>=11&&t<=14?"many":"other"},scottish:e=>1===e||11===e?"one":2===e||12===e?"two":e>=3&&e<=10||e>=13&&e<=19?"few":"other",spanish:e=>1===e?"one":e%1e6==0&&0!==e?"many":"other",welsh:e=>0===e?"zero":1===e?"one":2===e?"two":3===e?"few":6===e?"many":"other"};
|
2
2
|
/**
|
3
3
|
* JavaScript enhancements for the Button component
|
4
4
|
*
|
5
5
|
* @preserve
|
6
6
|
*/
|
7
|
-
class
|
7
|
+
class m extends d{constructor(e,n={}){super(e),this.config=void 0,this.debounceFormSubmitTimer=null,this.config=t(m.defaults,n,r(m,this.$root.dataset)),this.$root.addEventListener("keydown",(e=>this.handleKeyDown(e))),this.$root.addEventListener("click",(e=>this.debounce(e)))}handleKeyDown(e){const t=e.target;" "===e.key&&t instanceof HTMLElement&&"button"===t.getAttribute("role")&&(e.preventDefault(),t.click())}debounce(e){if(this.config.preventDoubleClick)return this.debounceFormSubmitTimer?(e.preventDefault(),!1):void(this.debounceFormSubmitTimer=window.setTimeout((()=>{this.debounceFormSubmitTimer=null}),1e3))}}function f(e,t){const n=e.closest(`[${t}]`);return n?n.getAttribute(t):null}
|
8
8
|
/**
|
9
9
|
* Character count component
|
10
10
|
*
|
@@ -16,13 +16,13 @@ class d extends c{constructor(e,n={}){if(super(),this.$module=void 0,this.config
|
|
16
16
|
* of the available characters/words has been entered.
|
17
17
|
*
|
18
18
|
* @preserve
|
19
|
-
*/
|
19
|
+
*/m.moduleName="govuk-button",m.defaults=Object.freeze({preventDoubleClick:!1}),m.schema=Object.freeze({properties:{preventDoubleClick:{type:"boolean"}}});class g extends d{constructor(e,n={}){var o,s;super(e),this.$textarea=void 0,this.$visibleCountMessage=void 0,this.$screenReaderCountMessage=void 0,this.lastInputTimestamp=null,this.lastInputValue="",this.valueChecker=null,this.config=void 0,this.i18n=void 0,this.maxLength=void 0;const a=this.$root.querySelector(".govuk-js-character-count");if(!(a instanceof HTMLTextAreaElement||a instanceof HTMLInputElement))throw new c({component:g,element:a,expectedType:"HTMLTextareaElement or HTMLInputElement",identifier:"Form field (`.govuk-js-character-count`)"});const u=r(g,this.$root.dataset);let h={};("maxwords"in u||"maxlength"in u)&&(h={maxlength:void 0,maxwords:void 0}),this.config=t(g.defaults,n,h,u);const d=function(e,t){const n=[];for(const[o,s]of Object.entries(e)){const e=[];if(Array.isArray(s)){for(const{required:n,errorMessage:o}of s)n.every((e=>!!t[e]))||e.push(o);"anyOf"!==o||s.length-e.length>=1||n.push(...e)}}return n}(g.schema,this.config);if(d[0])throw new l(i(g,d[0]));this.i18n=new p(this.config.i18n,{locale:f(this.$root,"lang")}),this.maxLength=null!=(o=null!=(s=this.config.maxwords)?s:this.config.maxlength)?o:1/0,this.$textarea=a;const m=`${this.$textarea.id}-info`,v=document.getElementById(m);if(!v)throw new c({component:g,element:v,identifier:`Count message (\`id="${m}"\`)`});`${v.textContent}`.match(/^\s*$/)&&(v.textContent=this.i18n.t("textareaDescription",{count:this.maxLength})),this.$textarea.insertAdjacentElement("afterend",v);const w=document.createElement("div");w.className="govuk-character-count__sr-status govuk-visually-hidden",w.setAttribute("aria-live","polite"),this.$screenReaderCountMessage=w,v.insertAdjacentElement("afterend",w);const b=document.createElement("div");b.className=v.className,b.classList.add("govuk-character-count__status"),b.setAttribute("aria-hidden","true"),this.$visibleCountMessage=b,v.insertAdjacentElement("afterend",b),v.classList.add("govuk-visually-hidden"),this.$textarea.removeAttribute("maxlength"),this.bindChangeEvents(),window.addEventListener("pageshow",(()=>this.updateCountMessage())),this.updateCountMessage()}bindChangeEvents(){this.$textarea.addEventListener("keyup",(()=>this.handleKeyUp())),this.$textarea.addEventListener("focus",(()=>this.handleFocus())),this.$textarea.addEventListener("blur",(()=>this.handleBlur()))}handleKeyUp(){this.updateVisibleCountMessage(),this.lastInputTimestamp=Date.now()}handleFocus(){this.valueChecker=window.setInterval((()=>{(!this.lastInputTimestamp||Date.now()-500>=this.lastInputTimestamp)&&this.updateIfValueChanged()}),1e3)}handleBlur(){this.valueChecker&&window.clearInterval(this.valueChecker)}updateIfValueChanged(){this.$textarea.value!==this.lastInputValue&&(this.lastInputValue=this.$textarea.value,this.updateCountMessage())}updateCountMessage(){this.updateVisibleCountMessage(),this.updateScreenReaderCountMessage()}updateVisibleCountMessage(){const e=this.maxLength-this.count(this.$textarea.value)<0;this.$visibleCountMessage.classList.toggle("govuk-character-count__message--disabled",!this.isOverThreshold()),this.$textarea.classList.toggle("govuk-textarea--error",e),this.$visibleCountMessage.classList.toggle("govuk-error-message",e),this.$visibleCountMessage.classList.toggle("govuk-hint",!e),this.$visibleCountMessage.textContent=this.getCountMessage()}updateScreenReaderCountMessage(){this.isOverThreshold()?this.$screenReaderCountMessage.removeAttribute("aria-hidden"):this.$screenReaderCountMessage.setAttribute("aria-hidden","true"),this.$screenReaderCountMessage.textContent=this.getCountMessage()}count(e){if(this.config.maxwords){var t;return(null!=(t=e.match(/\S+/g))?t:[]).length}return e.length}getCountMessage(){const e=this.maxLength-this.count(this.$textarea.value),t=this.config.maxwords?"words":"characters";return this.formatCountMessage(e,t)}formatCountMessage(e,t){if(0===e)return this.i18n.t(`${t}AtLimit`);const n=e<0?"OverLimit":"UnderLimit";return this.i18n.t(`${t}${n}`,{count:Math.abs(e)})}isOverThreshold(){if(!this.config.threshold)return!0;const e=this.count(this.$textarea.value);return this.maxLength*this.config.threshold/100<=e}}g.moduleName="govuk-character-count",g.defaults=Object.freeze({threshold:0,i18n:{charactersUnderLimit:{one:"You have %{count} character remaining",other:"You have %{count} characters remaining"},charactersAtLimit:"You have 0 characters remaining",charactersOverLimit:{one:"You have %{count} character too many",other:"You have %{count} characters too many"},wordsUnderLimit:{one:"You have %{count} word remaining",other:"You have %{count} words remaining"},wordsAtLimit:"You have 0 words remaining",wordsOverLimit:{one:"You have %{count} word too many",other:"You have %{count} words too many"},textareaDescription:{other:""}}}),g.schema=Object.freeze({properties:{i18n:{type:"object"},maxwords:{type:"number"},maxlength:{type:"number"},threshold:{type:"number"}},anyOf:[{required:["maxwords"],errorMessage:'Either "maxlength" or "maxwords" must be provided'},{required:["maxlength"],errorMessage:'Either "maxlength" or "maxwords" must be provided'}]});
|
20
20
|
/**
|
21
21
|
* Checkboxes component
|
22
22
|
*
|
23
23
|
* @preserve
|
24
24
|
*/
|
25
|
-
class
|
25
|
+
class v extends d{constructor(e){super(e),this.$inputs=void 0;const t=this.$root.querySelectorAll('input[type="checkbox"]');if(!t.length)throw new c({component:v,identifier:'Form inputs (`<input type="checkbox">`)'});this.$inputs=t,this.$inputs.forEach((e=>{const t=e.getAttribute("data-aria-controls");if(t){if(!document.getElementById(t))throw new c({component:v,identifier:`Conditional reveal (\`id="${t}"\`)`});e.setAttribute("aria-controls",t),e.removeAttribute("data-aria-controls")}})),window.addEventListener("pageshow",(()=>this.syncAllConditionalReveals())),this.syncAllConditionalReveals(),this.$root.addEventListener("click",(e=>this.handleClick(e)))}syncAllConditionalReveals(){this.$inputs.forEach((e=>this.syncConditionalRevealWithInputState(e)))}syncConditionalRevealWithInputState(e){const t=e.getAttribute("aria-controls");if(!t)return;const n=document.getElementById(t);if(null!=n&&n.classList.contains("govuk-checkboxes__conditional")){const t=e.checked;e.setAttribute("aria-expanded",t.toString()),n.classList.toggle("govuk-checkboxes__conditional--hidden",!t)}}unCheckAllInputsExcept(e){document.querySelectorAll(`input[type="checkbox"][name="${e.name}"]`).forEach((t=>{e.form===t.form&&t!==e&&(t.checked=!1,this.syncConditionalRevealWithInputState(t))}))}unCheckExclusiveInputs(e){document.querySelectorAll(`input[data-behaviour="exclusive"][type="checkbox"][name="${e.name}"]`).forEach((t=>{e.form===t.form&&(t.checked=!1,this.syncConditionalRevealWithInputState(t))}))}handleClick(e){const t=e.target;if(!(t instanceof HTMLInputElement)||"checkbox"!==t.type)return;if(t.getAttribute("aria-controls")&&this.syncConditionalRevealWithInputState(t),!t.checked)return;"exclusive"===t.getAttribute("data-behaviour")?this.unCheckAllInputsExcept(t):this.unCheckExclusiveInputs(t)}}v.moduleName="govuk-checkboxes";
|
26
26
|
/**
|
27
27
|
* Error summary component
|
28
28
|
*
|
@@ -31,16 +31,16 @@ class f extends c{constructor(e){if(super(),this.$module=void 0,this.$inputs=voi
|
|
31
31
|
*
|
32
32
|
* @preserve
|
33
33
|
*/
|
34
|
-
class
|
34
|
+
class w extends d{constructor(e,n={}){super(e),this.config=void 0,this.config=t(w.defaults,n,r(w,this.$root.dataset)),this.config.disableAutoFocus||function(e,t={}){var n;const o=e.getAttribute("tabindex");function s(){var n;null==(n=t.onBlur)||n.call(e),o||e.removeAttribute("tabindex")}o||e.setAttribute("tabindex","-1"),e.addEventListener("focus",(function(){e.addEventListener("blur",s,{once:!0})}),{once:!0}),null==(n=t.onBeforeFocus)||n.call(e),e.focus()}(this.$root),this.$root.addEventListener("click",(e=>this.handleClick(e)))}handleClick(e){const t=e.target;t&&this.focusTarget(t)&&e.preventDefault()}focusTarget(e){if(!(e instanceof HTMLAnchorElement))return!1;const t=function(e){if(e.includes("#"))return e.split("#").pop()}(e.href);if(!t)return!1;const n=document.getElementById(t);if(!n)return!1;const o=this.getAssociatedLegendOrLabel(n);return!!o&&(o.scrollIntoView(),n.focus({preventScroll:!0}),!0)}getAssociatedLegendOrLabel(e){var t;const n=e.closest("fieldset");if(n){const t=n.getElementsByTagName("legend");if(t.length){const n=t[0];if(e instanceof HTMLInputElement&&("checkbox"===e.type||"radio"===e.type))return n;const o=n.getBoundingClientRect().top,s=e.getBoundingClientRect();if(s.height&&window.innerHeight){if(s.top+s.height-o<window.innerHeight/2)return n}}}return null!=(t=document.querySelector(`label[for='${e.getAttribute("id")}']`))?t:e.closest("label")}}w.moduleName="govuk-error-summary",w.defaults=Object.freeze({disableAutoFocus:!1}),w.schema=Object.freeze({properties:{disableAutoFocus:{type:"boolean"}}});
|
35
35
|
/**
|
36
36
|
* Password input component
|
37
37
|
*
|
38
38
|
* @preserve
|
39
39
|
*/
|
40
|
-
class
|
40
|
+
class b extends d{constructor(e,n={}){super(e),this.config=void 0,this.i18n=void 0,this.$input=void 0,this.$showHideButton=void 0,this.$screenReaderStatusMessage=void 0;const o=this.$root.querySelector(".govuk-js-password-input-input");if(!(o instanceof HTMLInputElement))throw new c({component:b,element:o,expectedType:"HTMLInputElement",identifier:"Form field (`.govuk-js-password-input-input`)"});if("password"!==o.type)throw new c("Password input: Form field (`.govuk-js-password-input-input`) must be of type `password`.");const s=this.$root.querySelector(".govuk-js-password-input-toggle");if(!(s instanceof HTMLButtonElement))throw new c({component:b,element:s,expectedType:"HTMLButtonElement",identifier:"Button (`.govuk-js-password-input-toggle`)"});if("button"!==s.type)throw new c("Password input: Button (`.govuk-js-password-input-toggle`) must be of type `button`.");this.$input=o,this.$showHideButton=s,this.config=t(b.defaults,n,r(b,this.$root.dataset)),this.i18n=new p(this.config.i18n,{locale:f(this.$root,"lang")}),this.$showHideButton.removeAttribute("hidden");const i=document.createElement("div");i.className="govuk-password-input__sr-status govuk-visually-hidden",i.setAttribute("aria-live","polite"),this.$screenReaderStatusMessage=i,this.$input.insertAdjacentElement("afterend",i),this.$showHideButton.addEventListener("click",this.toggle.bind(this)),this.$input.form&&this.$input.form.addEventListener("submit",(()=>this.hide())),window.addEventListener("pageshow",(e=>{e.persisted&&"password"!==this.$input.type&&this.hide()})),this.hide()}toggle(e){e.preventDefault(),"password"!==this.$input.type?this.hide():this.show()}show(){this.setType("text")}hide(){this.setType("password")}setType(e){if(e===this.$input.type)return;this.$input.setAttribute("type",e);const t="password"===e,n=t?"show":"hide",o=t?"passwordHidden":"passwordShown";this.$showHideButton.innerText=this.i18n.t(`${n}Password`),this.$showHideButton.setAttribute("aria-label",this.i18n.t(`${n}PasswordAriaLabel`)),this.$screenReaderStatusMessage.innerText=this.i18n.t(`${o}Announcement`)}}b.moduleName="govuk-password-input",b.defaults=Object.freeze({i18n:{showPassword:"Show",hidePassword:"Hide",showPasswordAriaLabel:"Show password",hidePasswordAriaLabel:"Hide password",passwordShownAnnouncement:"Your password is visible",passwordHiddenAnnouncement:"Your password is hidden"}}),b.schema=Object.freeze({properties:{i18n:{type:"object"}}});
|
41
41
|
/**
|
42
42
|
* Radios component
|
43
43
|
*
|
44
44
|
* @preserve
|
45
45
|
*/
|
46
|
-
class
|
46
|
+
class y extends d{constructor(e){super(e),this.$inputs=void 0;const t=this.$root.querySelectorAll('input[type="radio"]');if(!t.length)throw new c({component:y,identifier:'Form inputs (`<input type="radio">`)'});this.$inputs=t,this.$inputs.forEach((e=>{const t=e.getAttribute("data-aria-controls");if(t){if(!document.getElementById(t))throw new c({component:y,identifier:`Conditional reveal (\`id="${t}"\`)`});e.setAttribute("aria-controls",t),e.removeAttribute("data-aria-controls")}})),window.addEventListener("pageshow",(()=>this.syncAllConditionalReveals())),this.syncAllConditionalReveals(),this.$root.addEventListener("click",(e=>this.handleClick(e)))}syncAllConditionalReveals(){this.$inputs.forEach((e=>this.syncConditionalRevealWithInputState(e)))}syncConditionalRevealWithInputState(e){const t=e.getAttribute("aria-controls");if(!t)return;const n=document.getElementById(t);if(null!=n&&n.classList.contains("govuk-radios__conditional")){const t=e.checked;e.setAttribute("aria-expanded",t.toString()),n.classList.toggle("govuk-radios__conditional--hidden",!t)}}handleClick(e){const t=e.target;if(!(t instanceof HTMLInputElement)||"radio"!==t.type)return;const n=document.querySelectorAll('input[type="radio"][aria-controls]'),o=t.form,s=t.name;n.forEach((e=>{const t=e.form===o;e.name===s&&t&&this.syncConditionalRevealWithInputState(e)}))}}function $(e){let t;if(e=void 0!==e?e:{},!o())return void console.log(new u);const n=[[m,e.button],[g,e.characterCount],[v],[w,e.errorSummary],[y],[b,e.passwordInput]],s=null!=(t=e.scope)?t:document;n.forEach((([e,t])=>{s.querySelectorAll(`[data-module="${e.moduleName}"]`).forEach((n=>{try{"defaults"in e?new e(n,t):new e(n)}catch(e){console.log(e)}}))}))}y.moduleName="govuk-radios";export{m as Button,g as CharacterCount,v as Checkboxes,w as ErrorSummary,b as PasswordInput,y as Radios,$ as initAll};
|
@@ -8,9 +8,10 @@
|
|
8
8
|
}
|
9
9
|
|
10
10
|
.govuk-details__summary {
|
11
|
-
|
12
|
-
|
11
|
+
display: block;
|
12
|
+
}
|
13
13
|
|
14
|
+
.govuk-details[open] .govuk-details__summary {
|
14
15
|
margin-bottom: govuk-spacing(1);
|
15
16
|
}
|
16
17
|
|
@@ -72,6 +73,10 @@
|
|
72
73
|
// Absolutely position the marker against this element
|
73
74
|
position: relative;
|
74
75
|
|
76
|
+
// Make the focus outline shrink-wrap the text content of the summary
|
77
|
+
width: -webkit-fit-content;
|
78
|
+
width: fit-content;
|
79
|
+
|
75
80
|
// Allow for absolutely positioned marker and align with disclosed text
|
76
81
|
padding-left: govuk-spacing(4) + $govuk-border-width;
|
77
82
|
|
@@ -3,12 +3,9 @@
|
|
3
3
|
$govuk-footer-border: $govuk-border-colour;
|
4
4
|
$govuk-footer-text: $govuk-text-colour;
|
5
5
|
|
6
|
-
//
|
7
|
-
$govuk-footer-crest-image-width
|
8
|
-
$govuk-footer-crest-image-height
|
9
|
-
// Half the 2x image so that it fits the regular 1x size.
|
10
|
-
$govuk-footer-crest-image-width: ($govuk-footer-crest-image-width-2x / 2);
|
11
|
-
$govuk-footer-crest-image-height: ($govuk-footer-crest-image-height-2x / 2);
|
6
|
+
// Royal Arms image dimensions
|
7
|
+
$govuk-footer-crest-image-width: 125px;
|
8
|
+
$govuk-footer-crest-image-height: 102px;
|
12
9
|
|
13
10
|
.govuk-footer {
|
14
11
|
@include govuk-font($size: if($govuk-new-typography-scale, 19, 16));
|
@@ -67,17 +64,18 @@
|
|
67
64
|
}
|
68
65
|
|
69
66
|
.govuk-footer__licence-description {
|
67
|
+
// This makes the license description reflow under the logo when space gets too narrow
|
70
68
|
display: inline-block;
|
69
|
+
// This prevents the description from having orphans when space is narrow enough
|
70
|
+
// and makes the text reflow more nicely
|
71
|
+
text-wrap: balance;
|
71
72
|
}
|
72
73
|
|
73
74
|
.govuk-footer__copyright-logo {
|
74
75
|
display: inline-block;
|
75
76
|
min-width: $govuk-footer-crest-image-width;
|
76
77
|
padding-top: ($govuk-footer-crest-image-height + govuk-spacing(2));
|
77
|
-
background-image: govuk-image-url("govuk-crest.
|
78
|
-
@include govuk-device-pixel-ratio {
|
79
|
-
background-image: govuk-image-url("govuk-crest-2x.png");
|
80
|
-
}
|
78
|
+
background-image: govuk-image-url("govuk-crest.svg");
|
81
79
|
background-repeat: no-repeat;
|
82
80
|
background-position: 50% 0%;
|
83
81
|
background-size: $govuk-footer-crest-image-width $govuk-footer-crest-image-height;
|
@@ -90,7 +90,7 @@
|
|
90
90
|
.govuk-service-navigation__toggle {
|
91
91
|
@include govuk-font($size: 19, $weight: bold);
|
92
92
|
display: inline-flex;
|
93
|
-
margin:
|
93
|
+
margin: govuk-spacing(2) 0;
|
94
94
|
padding: 0;
|
95
95
|
border: 0;
|
96
96
|
color: $govuk-service-navigation-link-colour;
|
@@ -117,6 +117,12 @@
|
|
117
117
|
&[hidden] {
|
118
118
|
display: none;
|
119
119
|
}
|
120
|
+
|
121
|
+
// If we have both a service name and navigation toggle, remove the
|
122
|
+
// margin-top so that there isn't a bunch of space between them
|
123
|
+
.govuk-service-navigation__service-name + .govuk-service-navigation__wrapper & {
|
124
|
+
margin-top: 0;
|
125
|
+
}
|
120
126
|
}
|
121
127
|
|
122
128
|
.govuk-service-navigation__list {
|
@@ -2,14 +2,12 @@
|
|
2
2
|
.govuk-warning-text {
|
3
3
|
@include govuk-font($size: 19);
|
4
4
|
@include govuk-responsive-margin(6, "bottom");
|
5
|
+
@include govuk-typography-weight-bold;
|
5
6
|
position: relative;
|
6
7
|
padding: govuk-spacing(2) 0;
|
7
8
|
}
|
8
9
|
|
9
10
|
.govuk-warning-text__icon {
|
10
|
-
// We apply this here and not at the parent level because the actual text is
|
11
|
-
// a <strong> and so will always be bold
|
12
|
-
@include govuk-typography-weight-bold;
|
13
11
|
box-sizing: border-box;
|
14
12
|
|
15
13
|
display: inline-block;
|
@@ -59,6 +57,9 @@
|
|
59
57
|
@include govuk-text-colour;
|
60
58
|
display: block;
|
61
59
|
padding-left: 45px;
|
60
|
+
// While `<strong>` is styled `bold` or `bolder` by user-agents
|
61
|
+
// this can be reset by the app's stylesheet
|
62
|
+
font-weight: inherit;
|
62
63
|
}
|
63
64
|
}
|
64
65
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
:root {
|
2
2
|
// This variable is automatically overwritten during builds and releases.
|
3
3
|
// It doesn't need to be updated manually.
|
4
|
-
--govuk-frontend-version: "5.
|
4
|
+
--govuk-frontend-version: "5.7.1";
|
5
5
|
|
6
6
|
// CSS custom property for each breakpoint
|
7
7
|
@each $name, $value in $govuk-breakpoints {
|
@@ -60,7 +60,8 @@ $_govuk-organisation-colours: (
|
|
60
60
|
"`department-for-communities-local-government` became `ministry-of-housing-communities-local-government` in 2018."
|
61
61
|
),
|
62
62
|
"department-for-culture-media-sport": (
|
63
|
-
colour: #
|
63
|
+
colour: #ed1588,
|
64
|
+
contrast-safe: #d6177a
|
64
65
|
),
|
65
66
|
"department-for-digital-culture-media-sport": (
|
66
67
|
colour: #d40072,
|
@@ -75,8 +76,8 @@ $_govuk-organisation-colours: (
|
|
75
76
|
contrast-safe: #00852f
|
76
77
|
),
|
77
78
|
"department-for-environment-food-rural-affairs": (
|
78
|
-
colour: #
|
79
|
-
contrast-safe: #
|
79
|
+
colour: #00a33b,
|
80
|
+
contrast-safe: #008531
|
80
81
|
),
|
81
82
|
"department-for-exiting-the-european-union": (
|
82
83
|
colour: #009fe3,
|
@@ -98,7 +99,7 @@ $_govuk-organisation-colours: (
|
|
98
99
|
"`department-for-levelling-up-housing-communities` was renamed to `ministry-of-housing-communities-local-government` in 2024."
|
99
100
|
),
|
100
101
|
"department-for-science-innovation-technology": (
|
101
|
-
colour: #
|
102
|
+
colour: #00f8f8,
|
102
103
|
contrast-safe: #008180
|
103
104
|
),
|
104
105
|
"department-for-transport": (
|
@@ -128,7 +129,7 @@ $_govuk-organisation-colours: (
|
|
128
129
|
deprecation-message: "`foreign-commonwealth-office` became `foreign-commonwealth-development-office` in 2018."
|
129
130
|
),
|
130
131
|
"foreign-commonwealth-development-office": (
|
131
|
-
colour: #
|
132
|
+
colour: #012069
|
132
133
|
),
|
133
134
|
"government-equalities-office": (
|
134
135
|
colour: #0056b8,
|
@@ -168,17 +169,21 @@ $_govuk-organisation-colours: (
|
|
168
169
|
colour: #9c182f
|
169
170
|
),
|
170
171
|
"office-of-the-secretary-of-state-for-scotland": (
|
171
|
-
colour: #00205c
|
172
|
+
colour: #00205c,
|
173
|
+
deprecation-message: "`office-of-the-secretary-of-state-for-scotland` was renamed to `scotland-office` in 2024."
|
172
174
|
),
|
173
175
|
"office-of-the-secretary-of-state-for-wales": (
|
174
|
-
colour: #a8353a
|
176
|
+
colour: #a8353a,
|
177
|
+
deprecation-message: "`office-of-the-secretary-of-state-for-wales` was renamed to `wales-office` in 2024."
|
175
178
|
),
|
176
179
|
"prime-ministers-office-10-downing-street": (
|
177
180
|
colour: #0b0c0c
|
178
181
|
),
|
179
182
|
"scotland-office": (
|
180
|
-
colour: #
|
181
|
-
|
183
|
+
colour: #00205c
|
184
|
+
),
|
185
|
+
"serious-fraud-office": (
|
186
|
+
colour: #82368c
|
182
187
|
),
|
183
188
|
"uk-export-finance": (
|
184
189
|
colour: #cf102d
|
@@ -189,8 +194,7 @@ $_govuk-organisation-colours: (
|
|
189
194
|
"`uk-trade-investment` became `department-for-international-trade` in 2016. As of 2023, it is equivalent to `department-for-business-trade`."
|
190
195
|
),
|
191
196
|
"wales-office": (
|
192
|
-
colour: #a33038
|
193
|
-
deprecation-message: "`wales-office` became `office-of-the-secretary-of-state-for-wales` in 2018."
|
197
|
+
colour: #a33038
|
194
198
|
)
|
195
199
|
);
|
196
200
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: katalyst-govuk-formbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katalyst Interactive
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_design_system_formbuilder
|