hof 22.12.0 → 22.13.0-frontend-v4-beta.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 (29) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/build/tasks/images/index.js +20 -5
  3. package/build/tasks/watch/index.js +10 -2
  4. package/components/date/templates/date.html +1 -1
  5. package/config/builder-defaults.js +6 -2
  6. package/frontend/govuk-template/build/config.js +1 -0
  7. package/frontend/govuk-template/build/govuk_template.html +58 -42
  8. package/frontend/govuk-template/govuk_template_generated.html +118 -0
  9. package/frontend/template-mixins/mixins/template-mixins.js +5 -4
  10. package/frontend/template-mixins/partials/forms/checkbox.html +5 -1
  11. package/frontend/template-mixins/partials/forms/input-text-date.html +2 -1
  12. package/frontend/template-mixins/partials/forms/input-text-group.html +1 -1
  13. package/frontend/template-mixins/partials/forms/textarea-group.html +1 -1
  14. package/frontend/template-partials/views/layout.html +1 -1
  15. package/frontend/template-partials/views/partials/cookie-banner.html +50 -32
  16. package/frontend/template-partials/views/partials/navigation.html +2 -2
  17. package/frontend/themes/gov-uk/client-js/cookieSettings.js +35 -23
  18. package/frontend/toolkit/assets/rebrand/images/govuk-logo.svg +25 -0
  19. package/index.js +4 -2
  20. package/package.json +2 -6
  21. package/sandbox/apps/sandbox/translations/en/default.json +245 -0
  22. package/sandbox/package.json +1 -1
  23. package/sandbox/public/css/app.css +11708 -0
  24. package/sandbox/public/images/govuk-logo.svg +25 -0
  25. package/sandbox/public/images/icons/icon-caret-left.png +0 -0
  26. package/sandbox/public/images/icons/icon-complete.png +0 -0
  27. package/sandbox/public/images/icons/icon-cross-remove-sign.png +0 -0
  28. package/sandbox/public/js/bundle.js +39258 -0
  29. package/sandbox/yarn.lock +4 -4
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 2025-12-09, Version 23.0.0 (Stable), @Rhodine-orleans-lindsay
2
+ ### Changed
3
+ - Updated cookie banner view to follow GOV.UK design system. Updated cookieSettings.js to allow for different confirmation text based on whether cookies were accepted or rejected
4
+ - Added inputmode='numeric' to date component
5
+ - Added span for checkbox error messages
6
+ - Updated imported javascript
7
+ - Added data-module attribute for govuk-skip-link for screen readers
8
+ - Removed aria-polite=live for character-count and removed pattern attribute for date input
9
+ - Replaced deprecated govuk-header__link--service-name with govuk-header__service-name
10
+ - Added a modifier for phone text input styles that accept sequences of digits
11
+ - Added govuk-template--rebranded class to govuk template html to enable govuk rebrand styles:
12
+ - Updated header and footer to follow GOV.UK design system as part of rebrand
13
+
1
14
  ## 2025-11-20, Version 22.12.0 (Stable), @dk4g @jamiecarterHO
2
15
 
3
16
  ### Infrastructure
@@ -31,7 +44,6 @@ For testing purposes, you can use the following command to generate a random val
31
44
  - For custom session timeout handling that is not linked to the redis session ttl, The following variables must be set: `CUSTOM_SESSION_EXPIRY` to the relevant expiry time e.g.600 and `USE_CUSTOM_SESSION_TIMEOUT` to true.
32
45
  - If a behaviour is required on the '/session-timeout` step, the '/session-timeout' step must be set in the project's index.js, along with any relevant behaviours.
33
46
 
34
-
35
47
  ## 2025-10-10, Version 22.10.4 (Stable), @dk4g
36
48
  ### Security
37
49
  - Upgraded axios version to address a security vulnerability
@@ -10,12 +10,27 @@ module.exports = config => {
10
10
  if (!config.images) {
11
11
  return Promise.resolve();
12
12
  }
13
+ const imagesOutput = config.images.out;
13
14
 
14
- return new Promise((resolve, reject) => {
15
- fs.stat(config.images.src, err => err ? reject(err) : resolve());
16
- })
17
- .then(() => mkdir(config.images.out))
18
- .then(() => spawn('cp', ['-r', config.images.src, config.images.out]))
15
+ // Due to govuk rebrand logo, images are copied from multiple sources & mapping can cause 'File exists' error.
16
+ // Remove if exists as a file
17
+ if (fs.existsSync(imagesOutput) && !fs.lstatSync(imagesOutput).isDirectory()) {
18
+ fs.unlinkSync(imagesOutput);
19
+ }
20
+ // Ensure directory exists
21
+ if (!fs.existsSync(imagesOutput)) {
22
+ fs.mkdirSync(imagesOutput, { recursive: true });
23
+ }
24
+ const srcs = Array.isArray(config.images.src) ? config.images.src : [config.images.src];
25
+
26
+ return Promise.all(srcs.map(src => {
27
+ if (!fs.existsSync(src)) {
28
+ console.log(`${chalk.yellow('warning')}: Skipping missing images folder: ${src}`);
29
+ return Promise.resolve();
30
+ }
31
+ return mkdir(imagesOutput)
32
+ .then(() => spawn('cp', ['-r', `${src}/.`, imagesOutput]));
33
+ }))
19
34
  .catch(e => {
20
35
  if (e.code !== 'ENOENT') {
21
36
  throw e;
@@ -32,7 +32,14 @@ module.exports = config => {
32
32
  }, {});
33
33
 
34
34
  function triggersTask(file) {
35
- return Object.keys(matchers).filter(key => match(file, matchers[key]));
35
+ return Object.keys(matchers).filter(key => {
36
+ const pattern = matchers[key];
37
+ // Only call minimatch if pattern is a non-empty string or array of strings
38
+ if (Array.isArray(pattern)) {
39
+ return pattern.some(p => typeof p === 'string' && p.length > 0 && match(file, p));
40
+ }
41
+ return typeof pattern === 'string' && pattern.length > 0 && match(file, pattern);
42
+ });
36
43
  }
37
44
 
38
45
  function restart() {
@@ -94,7 +101,7 @@ module.exports = config => {
94
101
  process.stdin.setEncoding('utf8');
95
102
  process.stdin.on('data', data => {
96
103
  const dataType = (data + '').trim().toLowerCase();
97
- if (dataType === config.watch.restart) {
104
+ if (dataType === config.watch.restart) {
98
105
  restart();
99
106
  }
100
107
  });
@@ -118,6 +125,7 @@ module.exports = config => {
118
125
  const rootDir = require('path').resolve(__dirname, '../../../');
119
126
  ignored.push(`${rootDir}/frontend/govuk-template/govuk_template_generated.html`);
120
127
  watchLocation = [rootDir, '.'];
128
+ process.env.SESSION_SECRET = require('crypto').randomBytes(16).toString('hex');
121
129
  }
122
130
 
123
131
  const watcher = chokidar.watch(watchLocation, { ignored });
@@ -6,7 +6,7 @@
6
6
  {{#isPageHeading}}</h1>{{/isPageHeading}}
7
7
  </legend>
8
8
  {{#hint}}
9
- <span id="{{key}}-hint" class="govuk-hint">{{{hint}}}</span>
9
+ <div id="{{key}}-hint" class="govuk-hint">{{{hint}}}</div>
10
10
  {{/hint}}
11
11
  {{#error}}
12
12
  <p id="{{key}}-error" class="govuk-error-message">
@@ -1,4 +1,8 @@
1
1
  'use strict';
2
+ const toolkitImages =
3
+ process.env.HOF_SANDBOX === 'true'
4
+ ? '../frontend/toolkit/assets/rebrand/images'
5
+ : 'node_modules/hof/frontend/toolkit/assets/rebrand/images';
2
6
 
3
7
  module.exports = {
4
8
  browserify: {
@@ -24,8 +28,8 @@ module.exports = {
24
28
  shared: 'apps/common/translations/src'
25
29
  },
26
30
  images: {
27
- src: 'assets/images',
28
- out: 'public',
31
+ src: ['assets/rebrand/images', 'assets/images', toolkitImages],
32
+ out: 'public/images',
29
33
  match: 'assets/images/**/*',
30
34
  restart: false
31
35
  },
@@ -3,6 +3,7 @@
3
3
  module.exports = {
4
4
  htmlLang: '{{htmlLang}}',
5
5
  assetPath: '{{govukAssetPath}}',
6
+ assetRebrandPath: '{{govukAssetPath}}rebrand/',
6
7
  afterHeader: '{{$afterHeader}}{{/afterHeader}}',
7
8
  bodyClasses: '{{$bodyClasses}}{{/bodyClasses}}',
8
9
  bodyStart: '{{$bodyStart}}{{/bodyStart}}',
@@ -1,31 +1,24 @@
1
1
 
2
2
  <!DOCTYPE html>
3
3
  <!--[if lt IE 9]><html class="lte-ie8" lang="{{ htmlLang }}"><![endif]-->
4
- <!--[if gt IE 8]><!--><html lang="{{ htmlLang }}" class="govuk-template"><!--<![endif]-->
4
+ <!--[if gt IE 8]><!--><html lang="{{ htmlLang }}" class="govuk-template--rebranded"><!--<![endif]-->
5
5
  <head>
6
6
  <meta charset="utf-8" />
7
7
  <title>{{ pageTitle }}</title>
8
8
  {{{ head }}}
9
9
 
10
- <link rel="shortcut icon" sizes="16x16 32x32 48x48" href="{{assetPath}}images/favicon.ico" type="image/x-icon">
11
- <link rel="mask-icon" href="{{assetPath}}images/govuk-mask-icon.svg" color="#0b0c0c">
12
- <link rel="apple-touch-icon" sizes="180x180" href="{{assetPath}}images/govuk-apple-touch-icon-180x180.png">
13
- <link rel="apple-touch-icon" sizes="167x167" href="{{assetPath}}images/govuk-apple-touch-icon-167x167.png">
14
- <link rel="apple-touch-icon" sizes="152x152" href="{{assetPath}}images/govuk-apple-touch-icon-152x152.png">
15
- <link rel="apple-touch-icon" href="{{assetPath}}images/govuk-apple-touch-icon.png">
16
-
17
-
18
- <meta name="theme-color" content="#0b0c0c" />
19
-
20
- <meta name="viewport" content="width=device-width, initial-scale=1">
21
-
22
-
23
- <meta property="og:image" content="{{assetPath}}images/opengraph-image.png">
10
+ <meta name="theme-color" content="#1d70b8">
11
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
12
+ <link rel="icon" sizes="48x48" href="{{assetRebrandPath}}images/favicon.ico">
13
+ <link rel="icon" sizes="any" href="{{assetRebrandPath}}images/favicon.svg" type="image/svg+xml">
14
+ <link rel="mask-icon" href="{{assetRebrandPath}}images/govuk-icon-mask.svg" color="#1d70b8">
15
+ <link rel="apple-touch-icon" href="{{assetRebrandPath}}images/govuk-icon-180.png">
16
+ <link rel="manifest" href="{{assetRebrandPath}}manifest.json">
17
+ <meta property="og:image" content="{{assetRebrandPath}}images/govuk-opengraph-image.png">
24
18
  </head>
25
19
 
26
20
  <body class="{{ bodyClasses }} govuk-template__body js-enabled" >
27
- <script>document.body.className = ((document.body.className) ? document.body.className + ' js-enabled' : 'js-enabled');</script>
28
-
21
+ <script>document.body.className += ' js-enabled' + ('noModule' in HTMLScriptElement.prototype ? ' govuk-frontend-supported' : '');</script>
29
22
 
30
23
 
31
24
  <div id="global-cookie-message" class="gem-c-cookie-banner govuk-clearfix" data-module="cookie-banner" role="region" aria-label="cookie banner" data-nosnippet="">
@@ -39,19 +32,13 @@
39
32
 
40
33
  <div class="govuk-header__logo">
41
34
  <a href="{{{ homepageUrl }}}" title="{{ logoLinkTitle }}" id="logo" class="govuk-header__link govuk-header__link--homepage" target="_blank" data-module="track-click" data-track-category="homeLinkClicked" data-track-action="homeHeader">
42
- <span class="govuk-header__logotype">
43
- <!--[if gt IE 8]><!-->
44
- <svg aria-hidden="true" focusable="false" class="govuk-header__logotype-crown" xmlns="http://www.w3.org/2000/svg\" viewBox="0 0 32 30" height="30" width="32">
45
- <path fill="currentColor" fill-rule="evenodd" d="M22.6 10.4c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4m-5.9 6.7c-.9.4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4m10.8-3.7c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s0 2-1 2.4m3.3 4.8c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4M17 4.7l2.3 1.2V2.5l-2.3.7-.2-.2.9-3h-3.4l.9 3-.2.2c-.1.1-2.3-.7-2.3-.7v3.4L15 4.7c.1.1.1.2.2.2l-1.3 4c-.1.2-.1.4-.1.6 0 1.1.8 2 1.9 2.2h.7c1-.2 1.9-1.1 1.9-2.1 0-.2 0-.4-.1-.6l-1.3-4c-.1-.2 0-.2.1-.3m-7.6 5.7c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s0 2 1 2.4m-5 3c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s.1 2 1 2.4m-3.2 4.8c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s0 2 1 2.4m14.8 11c4.4 0 8.6.3 12.3.8 1.1-4.5 2.4-7 3.7-8.8l-2.5-.9c.2 1.3.3 1.9 0 2.7-.4-.4-.8-1.1-1.1-2.3l-1.2 4c.7-.5 1.3-.8 2-.9-1.1 2.5-2.6 3.1-3.5 3-1.1-.2-1.7-1.2-1.5-2.1.3-1.2 1.5-1.5 2.1-.1 1.1-2.3-.8-3-2-2.3 1.9-1.9 2.1-3.5.6-5.6-2.1 1.6-2.1 3.2-1.2 5.5-1.2-1.4-3.2-.6-2.5 1.6.9-1.4 2.1-.5 1.9.8-.2 1.1-1.7 2.1-3.5 1.9-2.7-.2-2.9-2.1-2.9-3.6.7-.1 1.9.5 2.9 1.9l.4-4.3c-1.1 1.1-2.1 1.4-3.2 1.4.4-1.2 2.1-3 2.1-3h-5.4s1.7 1.9 2.1 3c-1.1 0-2.1-.2-3.2-1.4l.4 4.3c1-1.4 2.2-2 2.9-1.9-.1 1.5-.2 3.4-2.9 3.6-1.9.2-3.4-.8-3.5-1.9-.2-1.3 1-2.2 1.9-.8.7-2.3-1.2-3-2.5-1.6.9-2.2.9-3.9-1.2-5.5-1.5 2-1.3 3.7.6 5.6-1.2-.7-3.1 0-2 2.3.6-1.4 1.8-1.1 2.1.1.2.9-.3 1.9-1.5 2.1-.9.2-2.4-.5-3.5-3 .6 0 1.2.3 2 .9l-1.2-4c-.3 1.1-.7 1.9-1.1 2.3-.3-.8-.2-1.4 0-2.7l-2.9.9C1.3 23 2.6 25.5 3.7 30c3.7-.5 7.9-.8 12.3-.8"></path>
46
- </svg>
47
- <!--<![endif]-->
48
- <!--[if IE 8]>
49
- <img src="{{ assetPath }}images/govuk-logotype-tudor-crown.png" class="govuk-header__logotype-crown-fallback-image" width="32" height="30" alt="">
50
- <![endif]-->
51
- </span>
52
- <span class="govuk-header__logotype-text">
53
- {{{ globalHeaderText }}}
54
- </span>
35
+ <!--[if gt IE 8]><!-->
36
+ <div id="govuk-header__logo"></div>
37
+ <img src="/public/images/govuk-logo.svg" id="govuk-header__logo" alt="Logo" loading="lazy" />
38
+ <!--<![endif]-->
39
+ <!--[if IE 8]>
40
+ <img src="{{ assetRebrandPath }}images/govuk-logotype-tudor-crown.png" class="govuk-header__logotype-crown-fallback-image" width="32" height="30" alt="">
41
+ <![endif]-->
55
42
  </a>
56
43
  </div>
57
44
  {{{ insideHeader }}}
@@ -66,25 +53,54 @@
66
53
 
67
54
  {{{ content }}}
68
55
 
69
- <footer class="govuk-footer" id="footer" role="contentinfo">
70
-
56
+ <footer class="govuk-footer">
71
57
  <div class="govuk-width-container">
72
- {{{ footerTop }}}
73
-
58
+ <svg
59
+ focusable="false"
60
+ role="presentation"
61
+ xmlns="http://www.w3.org/2000/svg"
62
+ viewBox="0 0 64 60"
63
+ height="30"
64
+ width="32"
65
+ fill="currentcolor" class="govuk-footer__crown">
66
+ <g>
67
+ <circle cx="20" cy="17.6" r="3.7" />
68
+ <circle cx="10.2" cy="23.5" r="3.7" />
69
+ <circle cx="3.7" cy="33.2" r="3.7" />
70
+ <circle cx="31.7" cy="30.6" r="3.7" />
71
+ <circle cx="43.3" cy="17.6" r="3.7" />
72
+ <circle cx="53.2" cy="23.5" r="3.7" />
73
+ <circle cx="59.7" cy="33.2" r="3.7" />
74
+ <circle cx="31.7" cy="30.6" r="3.7" />
75
+ <path d="M33.1,9.8c.2-.1.3-.3.5-.5l4.6,2.4v-6.8l-4.6,1.5c-.1-.2-.3-.3-.5-.5l1.9-5.9h-6.7l1.9,5.9c-.2.1-.3.3-.5.5l-4.6-1.5v6.8l4.6-2.4c.1.2.3.3.5.5l-2.6,8c-.9,2.8,1.2,5.7,4.1,5.7h0c3,0,5.1-2.9,4.1-5.7l-2.6-8ZM37,37.9s-3.4,3.8-4.1,6.1c2.2,0,4.2-.5,6.4-2.8l-.7,8.5c-2-2.8-4.4-4.1-5.7-3.8.1,3.1.5,6.7,5.8,7.2,3.7.3,6.7-1.5,7-3.8.4-2.6-2-4.3-3.7-1.6-1.4-4.5,2.4-6.1,4.9-3.2-1.9-4.5-1.8-7.7,2.4-10.9,3,4,2.6,7.3-1.2,11.1,2.4-1.3,6.2,0,4,4.6-1.2-2.8-3.7-2.2-4.2.2-.3,1.7.7,3.7,3,4.2,1.9.3,4.7-.9,7-5.9-1.3,0-2.4.7-3.9,1.7l2.4-8c.6,2.3,1.4,3.7,2.2,4.5.6-1.6.5-2.8,0-5.3l5,1.8c-2.6,3.6-5.2,8.7-7.3,17.5-7.4-1.1-15.7-1.7-24.5-1.7h0c-8.8,0-17.1.6-24.5,1.7-2.1-8.9-4.7-13.9-7.3-17.5l5-1.8c-.5,2.5-.6,3.7,0,5.3.8-.8,1.6-2.3,2.2-4.5l2.4,8c-1.5-1-2.6-1.7-3.9-1.7,2.3,5,5.2,6.2,7,5.9,2.3-.4,3.3-2.4,3-4.2-.5-2.4-3-3.1-4.2-.2-2.2-4.6,1.6-6,4-4.6-3.7-3.7-4.2-7.1-1.2-11.1,4.2,3.2,4.3,6.4,2.4,10.9,2.5-2.8,6.3-1.3,4.9,3.2-1.8-2.7-4.1-1-3.7,1.6.3,2.3,3.3,4.1,7,3.8,5.4-.5,5.7-4.2,5.8-7.2-1.3-.2-3.7,1-5.7,3.8l-.7-8.5c2.2,2.3,4.2,2.7,6.4,2.8-.7-2.3-4.1-6.1-4.1-6.1h10.6,0Z" />
76
+ </g>
77
+ </svg>
74
78
  <div class="govuk-footer__meta">
75
79
  <div class="govuk-footer__meta-item govuk-footer__meta-item--grow">
76
- <h2 class="govuk-visually-hidden">Support links</h2>
80
+ <h2 class="govuk-visually-hidden">Support links</h2>
77
81
  {{{ footerSupportLinks }}}
78
-
79
- <svg aria-hidden="true" focusable="false" class="govuk-footer__licence-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 483.2 195.7" height="17" width="41">
80
- <path fill="currentColor" d="M421.5 142.8V.1l-50.7 32.3v161.1h112.4v-50.7zm-122.3-9.6A47.12 47.12 0 0 1 221 97.8c0-26 21.1-47.1 47.1-47.1 16.7 0 31.4 8.7 39.7 21.8l42.7-27.2A97.63 97.63 0 0 0 268.1 0c-36.5 0-68.3 20.1-85.1 49.7A98 98 0 0 0 97.8 0C43.9 0 0 43.9 0 97.8s43.9 97.8 97.8 97.8c36.5 0 68.3-20.1 85.1-49.7a97.76 97.76 0 0 0 149.6 25.4l19.4 22.2h3v-87.8h-80l24.3 27.5zM97.8 145c-26 0-47.1-21.1-47.1-47.1s21.1-47.1 47.1-47.1 47.2 21 47.2 47S123.8 145 97.8 145"></path>
82
+ <svg
83
+ aria-hidden="true"
84
+ focusable="false"
85
+ class="govuk-footer__licence-logo"
86
+ xmlns="http://www.w3.org/2000/svg"
87
+ viewBox="0 0 483.2 195.7"
88
+ height="17"
89
+ width="41">
90
+ <path
91
+ fill="currentColor"
92
+ d="M421.5 142.8V.1l-50.7 32.3v161.1h112.4v-50.7zm-122.3-9.6A47.12 47.12 0 0 1 221 97.8c0-26 21.1-47.1 47.1-47.1 16.7 0 31.4 8.7 39.7 21.8l42.7-27.2A97.63 97.63 0 0 0 268.1 0c-36.5 0-68.3 20.1-85.1 49.7A98 98 0 0 0 97.8 0C43.9 0 0 43.9 0 97.8s43.9 97.8 97.8 97.8c36.5 0 68.3-20.1 85.1-49.7a97.76 97.76 0 0 0 149.6 25.4l19.4 22.2h3v-87.8h-80l24.3 27.5zM97.8 145c-26 0-47.1-21.1-47.1-47.1s21.1-47.1 47.1-47.1 47.2 21 47.2 47S123.8 145 97.8 145" />
81
93
  </svg>
82
-
83
- <span class="govuk-footer__licence-description">{{{ licenceMessage }}}</span>
94
+ <span class="govuk-footer__licence-description">
95
+ {{{ licenceMessage }}}
96
+ </span>
84
97
  </div>
85
-
86
98
  <div class="govuk-footer__meta-item">
87
- <a class="govuk-footer__link govuk-footer__copyright-logo" id="copyright-logo" target="_blank" href="https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/">{{{ crownCopyrightMessage }}}</a>
99
+ <a
100
+ class="govuk-footer__link govuk-footer__copyright-logo"
101
+ href="https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/">
102
+ {{{ crownCopyrightMessage }}}
103
+ </a>
88
104
  </div>
89
105
  </div>
90
106
  </div>
@@ -0,0 +1,118 @@
1
+
2
+ <!DOCTYPE html>
3
+ <!--[if lt IE 9]><html class="lte-ie8" lang="{{htmlLang}}"><![endif]-->
4
+ <!--[if gt IE 8]><!--><html lang="{{htmlLang}}" class="govuk-template--rebranded"><!--<![endif]-->
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <title>{{$pageTitle}}{{/pageTitle}}</title>
8
+ {{$head}}{{/head}}
9
+
10
+ <meta name="theme-color" content="#1d70b8">
11
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
12
+ <link rel="icon" sizes="48x48" href="{{govukAssetPath}}rebrand/images/favicon.ico">
13
+ <link rel="icon" sizes="any" href="{{govukAssetPath}}rebrand/images/favicon.svg" type="image/svg+xml">
14
+ <link rel="mask-icon" href="{{govukAssetPath}}rebrand/images/govuk-icon-mask.svg" color="#1d70b8">
15
+ <link rel="apple-touch-icon" href="{{govukAssetPath}}rebrand/images/govuk-icon-180.png">
16
+ <link rel="manifest" href="{{govukAssetPath}}rebrand/manifest.json">
17
+ <meta property="og:image" content="{{govukAssetPath}}rebrand/images/govuk-opengraph-image.png">
18
+ </head>
19
+
20
+ <body class="{{$bodyClasses}}{{/bodyClasses}} govuk-template__body js-enabled" >
21
+ <script {{#nonce}}nonce="{{nonce}}"{{/nonce}}>document.body.className += ' js-enabled' + ('noModule' in HTMLScriptElement.prototype ? ' govuk-frontend-supported' : '');</script>
22
+
23
+
24
+ <div id="global-cookie-message" class="gem-c-cookie-banner govuk-clearfix" data-module="cookie-banner" role="region" aria-label="cookie banner" data-nosnippet="">
25
+ {{$cookieMessage}}{{/cookieMessage}}
26
+ </div>
27
+
28
+ {{$bodyStart}}{{/bodyStart}}
29
+
30
+ <header role="banner" id="govuk-header" class="{{$headerClass}}{{/headerClass}}">
31
+ <div class="govuk-header__container govuk-width-container">
32
+
33
+ <div class="govuk-header__logo">
34
+ <a href="{{$homepageUrl}}https://www.gov.uk{{/homepageUrl}}" title="{{$logoLinkTitle}}Go to the GOV.UK homepage{{/logoLinkTitle}}" id="logo" class="govuk-header__link govuk-header__link--homepage" target="_blank" data-module="track-click" data-track-category="homeLinkClicked" data-track-action="homeHeader">
35
+ <!--[if gt IE 8]><!-->
36
+ <div id="govuk-header__logo"></div>
37
+ <img src="/public/images/govuk-logo.svg" id="govuk-header__logo" alt="Logo" loading="lazy" />
38
+ <!--<![endif]-->
39
+ <!--[if IE 8]>
40
+ <img src="{{govukAssetPath}}rebrand/images/govuk-logotype-tudor-crown.png" class="govuk-header__logotype-crown-fallback-image" width="32" height="30" alt="">
41
+ <![endif]-->
42
+ </a>
43
+ </div>
44
+ {{$insideHeader}}{{/insideHeader}}
45
+
46
+ {{$propositionHeader}}{{/propositionHeader}}
47
+ </div>
48
+ </header>
49
+
50
+
51
+ {{$afterHeader}}{{/afterHeader}}
52
+
53
+
54
+ {{$main}}{{/main}}
55
+
56
+ <footer class="govuk-footer">
57
+ <div class="govuk-width-container">
58
+ <svg
59
+ focusable="false"
60
+ role="presentation"
61
+ xmlns="http://www.w3.org/2000/svg"
62
+ viewBox="0 0 64 60"
63
+ height="30"
64
+ width="32"
65
+ fill="currentcolor" class="govuk-footer__crown">
66
+ <g>
67
+ <circle cx="20" cy="17.6" r="3.7" />
68
+ <circle cx="10.2" cy="23.5" r="3.7" />
69
+ <circle cx="3.7" cy="33.2" r="3.7" />
70
+ <circle cx="31.7" cy="30.6" r="3.7" />
71
+ <circle cx="43.3" cy="17.6" r="3.7" />
72
+ <circle cx="53.2" cy="23.5" r="3.7" />
73
+ <circle cx="59.7" cy="33.2" r="3.7" />
74
+ <circle cx="31.7" cy="30.6" r="3.7" />
75
+ <path d="M33.1,9.8c.2-.1.3-.3.5-.5l4.6,2.4v-6.8l-4.6,1.5c-.1-.2-.3-.3-.5-.5l1.9-5.9h-6.7l1.9,5.9c-.2.1-.3.3-.5.5l-4.6-1.5v6.8l4.6-2.4c.1.2.3.3.5.5l-2.6,8c-.9,2.8,1.2,5.7,4.1,5.7h0c3,0,5.1-2.9,4.1-5.7l-2.6-8ZM37,37.9s-3.4,3.8-4.1,6.1c2.2,0,4.2-.5,6.4-2.8l-.7,8.5c-2-2.8-4.4-4.1-5.7-3.8.1,3.1.5,6.7,5.8,7.2,3.7.3,6.7-1.5,7-3.8.4-2.6-2-4.3-3.7-1.6-1.4-4.5,2.4-6.1,4.9-3.2-1.9-4.5-1.8-7.7,2.4-10.9,3,4,2.6,7.3-1.2,11.1,2.4-1.3,6.2,0,4,4.6-1.2-2.8-3.7-2.2-4.2.2-.3,1.7.7,3.7,3,4.2,1.9.3,4.7-.9,7-5.9-1.3,0-2.4.7-3.9,1.7l2.4-8c.6,2.3,1.4,3.7,2.2,4.5.6-1.6.5-2.8,0-5.3l5,1.8c-2.6,3.6-5.2,8.7-7.3,17.5-7.4-1.1-15.7-1.7-24.5-1.7h0c-8.8,0-17.1.6-24.5,1.7-2.1-8.9-4.7-13.9-7.3-17.5l5-1.8c-.5,2.5-.6,3.7,0,5.3.8-.8,1.6-2.3,2.2-4.5l2.4,8c-1.5-1-2.6-1.7-3.9-1.7,2.3,5,5.2,6.2,7,5.9,2.3-.4,3.3-2.4,3-4.2-.5-2.4-3-3.1-4.2-.2-2.2-4.6,1.6-6,4-4.6-3.7-3.7-4.2-7.1-1.2-11.1,4.2,3.2,4.3,6.4,2.4,10.9,2.5-2.8,6.3-1.3,4.9,3.2-1.8-2.7-4.1-1-3.7,1.6.3,2.3,3.3,4.1,7,3.8,5.4-.5,5.7-4.2,5.8-7.2-1.3-.2-3.7,1-5.7,3.8l-.7-8.5c2.2,2.3,4.2,2.7,6.4,2.8-.7-2.3-4.1-6.1-4.1-6.1h10.6,0Z" />
76
+ </g>
77
+ </svg>
78
+ <div class="govuk-footer__meta">
79
+ <div class="govuk-footer__meta-item govuk-footer__meta-item--grow">
80
+ <h2 class="govuk-visually-hidden">Support links</h2>
81
+ {{$footerSupportLinks}}{{/footerSupportLinks}}
82
+ <svg
83
+ aria-hidden="true"
84
+ focusable="false"
85
+ class="govuk-footer__licence-logo"
86
+ xmlns="http://www.w3.org/2000/svg"
87
+ viewBox="0 0 483.2 195.7"
88
+ height="17"
89
+ width="41">
90
+ <path
91
+ fill="currentColor"
92
+ d="M421.5 142.8V.1l-50.7 32.3v161.1h112.4v-50.7zm-122.3-9.6A47.12 47.12 0 0 1 221 97.8c0-26 21.1-47.1 47.1-47.1 16.7 0 31.4 8.7 39.7 21.8l42.7-27.2A97.63 97.63 0 0 0 268.1 0c-36.5 0-68.3 20.1-85.1 49.7A98 98 0 0 0 97.8 0C43.9 0 0 43.9 0 97.8s43.9 97.8 97.8 97.8c36.5 0 68.3-20.1 85.1-49.7a97.76 97.76 0 0 0 149.6 25.4l19.4 22.2h3v-87.8h-80l24.3 27.5zM97.8 145c-26 0-47.1-21.1-47.1-47.1s21.1-47.1 47.1-47.1 47.2 21 47.2 47S123.8 145 97.8 145" />
93
+ </svg>
94
+ <span class="govuk-footer__licence-description">
95
+ {{$licenceMessage}}All content is available under the <a href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" id="open-government-licence" class="govuk-footer__link" target="_blank" rel="license">Open Government Licence v3.0</a>, except where otherwise stated{{/licenceMessage}}
96
+ </span>
97
+ </div>
98
+ <div class="govuk-footer__meta-item">
99
+ <a
100
+ class="govuk-footer__link govuk-footer__copyright-logo"
101
+ href="https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/">
102
+ {{$crownCopyrightMessage}}© Crown copyright{{/crownCopyrightMessage}}
103
+ </a>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </footer>
108
+
109
+ <div id="global-app-error" class="app-error hidden"></div>
110
+
111
+
112
+ {{$bodyEnd}}{{/bodyEnd}}
113
+
114
+
115
+ <script {{#nonce}}nonce="{{nonce}}"{{/nonce}}>if (typeof window.GOVUK === 'undefined') document.body.className = document.body.className.replace('js-enabled', '');</script>
116
+
117
+ </body>
118
+ </html>
@@ -358,7 +358,8 @@ module.exports = function (options) {
358
358
  path: 'partials/forms/input-text-group',
359
359
  renderWith: inputText,
360
360
  options: {
361
- maxlength: 18
361
+ maxlength: 18,
362
+ className: 'govuk-input govuk-input--extra-letter-spacing'
362
363
  }
363
364
  },
364
365
  'input-file': {
@@ -459,12 +460,12 @@ module.exports = function (options) {
459
460
  const parts = [];
460
461
 
461
462
  if (isExact) {
462
- const dayPart = compiled['partials/forms/input-text-date'].render(inputText.call(this, key + '-day', { pattern: '[0-9]*', min: 1, max: 31, maxlength: 2, hintId: key + '-hint', date: true, autocomplete: autocomplete.day, formGroupClassName, className: classNameDay, isThisRequired }));
463
+ const dayPart = compiled['partials/forms/input-text-date'].render(inputText.call(this, key + '-day', { inputmode: 'numeric', min: 1, max: 31, maxlength: 2, hintId: key + '-hint', date: true, autocomplete: autocomplete.day, formGroupClassName, className: classNameDay, isThisRequired }));
463
464
  parts.push(dayPart);
464
465
  }
465
466
 
466
- const monthPart = compiled['partials/forms/input-text-date'].render(inputText.call(this, key + '-month', { pattern: '[0-9]*', min: 1, max: 12, maxlength: 2, hintId: key + '-hint', date: true, autocomplete: autocomplete.month, formGroupClassName, className: classNameMonth, isThisRequired }));
467
- const yearPart = compiled['partials/forms/input-text-date'].render(inputText.call(this, key + '-year', { pattern: '[0-9]*', maxlength: 4, hintId: key + '-hint', date: true, autocomplete: autocomplete.year, formGroupClassName, className: classNameYear, isThisRequired }));
467
+ const monthPart = compiled['partials/forms/input-text-date'].render(inputText.call(this, key + '-month', { inputmode: 'numeric', min: 1, max: 12, maxlength: 2, hintId: key + '-hint', date: true, autocomplete: autocomplete.month, formGroupClassName, className: classNameMonth, isThisRequired }));
468
+ const yearPart = compiled['partials/forms/input-text-date'].render(inputText.call(this, key + '-year', { inputmode: 'numeric', maxlength: 4, hintId: key + '-hint', date: true, autocomplete: autocomplete.year, formGroupClassName, className: classNameYear, isThisRequired }));
468
469
 
469
470
  return parts.concat(monthPart, yearPart).join('\n');
470
471
  };
@@ -1,5 +1,9 @@
1
1
  <div id="{{key}}-group" class="govuk-form-group {{#compound}} form-group-compound{{/compound}}{{#formGroupClassName}} {{formGroupClassName}}{{/formGroupClassName}}{{#error}} govuk-form-group--error{{/error}}">
2
- {{#error}}<p class="govuk-error-message" aria-hidden="true">{{error.message}}</p>{{/error}}
2
+ {{#error}}
3
+ <p class="govuk-error-message" aria-hidden="true">
4
+ <span class="govuk-visually-hidden">Error:</span> {{error.message}}
5
+ </p>
6
+ {{/error}}
3
7
  <div class="govuk-checkboxes__item">
4
8
  <input class="govuk-checkboxes__input" type="checkbox" id="{{key}}" name="{{key}}" value="true" aria-required="{{required}}"{{#error}} aria-invalid="true"{{/error}}{{^error}}{{#toggle}} data-toggle="{{toggle}}"{{/toggle}}{{#selected}} checked="checked"{{/selected}}{{/error}}>
5
9
  <label for="{{key}}" class="{{#className}}{{className}} {{/className}}{{#invalid}}invalid-input{{/invalid}}">
@@ -3,7 +3,7 @@
3
3
  <label for="{{id}}" class="{{labelClassName}}">
4
4
  <span class="label-text">{{{label}}}</span>
5
5
  </label>
6
- {{#hint}}<span {{$hintId}}id="{{hintId}}" {{/hintId}}class="govuk-hint">{{{hint}}}</span>{{/hint}}
6
+ {{#hint}}<div {{$hintId}}id="{{hintId}}" {{/hintId}}class="govuk-hint">{{{hint}}}</div>{{/hint}}
7
7
  {{#renderChild}}{{/renderChild}}
8
8
  {{#attributes}}
9
9
  {{#prefix}}
@@ -21,6 +21,7 @@
21
21
  {{#max}} max="{{max}}"{{/max}}
22
22
  {{#maxlength}} maxlength="{{maxlength}}"{{/maxlength}}
23
23
  {{#pattern}} pattern="{{pattern}}"{{/pattern}}
24
+ {{#inputmode}}inputmode="{{inputmode}}"{{/inputmode}}
24
25
  {{#hintId}} aria-describedby="{{hintId}}"{{/hintId}}
25
26
  {{#error}} aria-invalid="true"{{/error}}
26
27
  {{#autocomplete}} autocomplete="{{autocomplete}}"{{/autocomplete}}
@@ -3,7 +3,7 @@
3
3
  {{{label}}}
4
4
  </label>
5
5
  {{#isPageHeading}}</h1>{{/isPageHeading}}
6
- {{#hint}}<span {{$hintId}}id="{{hintId}}" {{/hintId}}class="govuk-hint">{{{hint}}}</span>{{/hint}}
6
+ {{#hint}}<div {{$hintId}}id="{{hintId}}" {{/hintId}}class="govuk-hint">{{{hint}}}</div>{{/hint}}
7
7
  {{#error}}
8
8
  <p class="govuk-error-message">
9
9
  <span class="govuk-visually-hidden">Error:</span> {{error.message}}
@@ -29,7 +29,7 @@
29
29
  {{#error}} aria-invalid="true" aria-describedby="{{id}}-error" {{/error}}
30
30
  >{{value}}</textarea>
31
31
  {{#isMaxlengthOrMaxword}}
32
- <div id="{{id}}-info" class=" govuk-hint govuk-character-count__message" aria-live="polite">You have {{#maxlength}}{{maxlength}} characters{{/maxlength}}{{#maxword}}{{maxword}}
32
+ <div id="{{id}}-info" class=" govuk-hint govuk-character-count__message">You have {{#maxlength}}{{maxlength}} characters{{/maxlength}}{{#maxword}}{{maxword}}
33
33
  words{{/maxword}} remaining
34
34
  </div>
35
35
  {{/isMaxlengthOrMaxword}}
@@ -6,7 +6,7 @@
6
6
  {{#errorlist.length}}{{#t}}errorlist.prefix{{/t}}{{/errorlist.length}}{{#title}}{{title}}{{/title}}{{^title}}{{$header}}{{/header}}{{/title}}{{#serviceName}} &ndash; {{serviceName}}{{/serviceName}} &ndash; GOV.UK
7
7
  {{/pageTitle}}
8
8
  {{$bodyStart}}
9
- <a href="#{{#skipToMain}}{{skipToMain}}{{/skipToMain}}{{^skipToMain}}main-content{{/skipToMain}}" class="govuk-skip-link" id="skip-to-main">Skip to main content</a>
9
+ <a href="#{{#skipToMain}}{{skipToMain}}{{/skipToMain}}{{^skipToMain}}main-content{{/skipToMain}}" class="govuk-skip-link" data-module="govuk-skip-link" id="skip-to-main">Skip to main content</a>
10
10
  {{/bodyStart}}
11
11
  {{$headerClass}}govuk-header{{/headerClass}}
12
12
  {{$insideHeader}}{{/insideHeader}}
@@ -1,33 +1,51 @@
1
- <div id="cookie-banner" class="govuk-cookie-banner gem-c-cookie-banner govuk-clearfix">
2
- <div class="gem-c-cookie-banner__message govuk-cookie-banner__message govuk-width-container">
3
- <div id="cookie-banner-info" class="govuk-grid-row">
4
- <div class="govuk-grid-column-two-thirds">
5
- <h2 class="govuk-cookie-banner__heading govuk-heading-m">Cookies on {{#appName}}{{appName}}{{/appName}}{{^appName}}this service{{/appName}}</h2>
6
- <div class="govuk-cookie-banner__content">
7
- <p class="govuk-body">{{#t}}cookies.banner.message{{/t}}</p>
8
- {{#hasGoogleAnalytics}}
9
- <p class="govuk-body">We'd like to set additional cookies to understand how you use GOV.UK, remember your settings and improve government services.</p>
10
- <p class="govuk-body">We also use cookies set by other sites to help us deliver content from their services.</p>
11
- {{/hasGoogleAnalytics}}
12
- </div>
13
- </div>
14
- </div>
15
- <div id="cookie-banner-actions" class="govuk-button-group">
16
- {{#hasGoogleAnalytics}}
17
- <button id="accept-cookies-button" class="gem-c-button govuk-button" type="submit" data-module="gem-track-click" data-accept-cookies="true" data-track-category="cookieBanner" data-track-action="Cookie banner accepted" data-cookie-types="all">Accept additional cookies</button>
18
-
19
- <button id="reject-cookies-button" class="gem-c-button govuk-button" type="submit" data-module="gem-track-click" data-reject-cookies="true" data-track-category="cookieBanner" data-track-action="Cookie banner rejected">Reject additional cookies</button>
20
- {{/hasGoogleAnalytics}}
21
- <a class="govuk-link" href="/cookies">{{#t}}cookies.banner.link{{/t}}</a>
22
- </div>
23
- </div>
24
-
25
- <div class="gem-c-cookie-banner__confirmation govuk-width-container" hidden="" id="cookie-banner-submitted" >
26
- <p class="gem-c-cookie-banner__confirmation-message" role="alert">
27
- Your cookie preferences have been saved. You can <a class="govuk-link" data-module="gem-track-click" data-track-category="cookieBanner" data-track-action="Cookie banner settings clicked from confirmation" href="/cookies">change your cookie settings</a> at any time.
28
- </p>
29
- <div class="govuk-button-group">
30
- <button class="gem-c-cookie-banner__hide-button govuk-button" id="hide-cookie-banner">Hide this message</button>
31
- </div>
32
- </div>
1
+ <div id="cookie-banner" class="govuk-cookie-banner" data-nosnippet="" role="region" aria-label="Cookies on {{#appName}}{{appName}}{{/appName}}{{^appName}}this service{{/appName}}">
2
+ <div class="govuk-cookie-banner__message govuk-width-container">
3
+ <div id="cookie-banner-info" class="govuk-grid-row">
4
+ <div class="govuk-grid-column-two-thirds">
5
+ <h2 class="govuk-cookie-banner__heading govuk-heading-m">Cookies on {{#appName}}{{appName}}{{/appName}}{{^appName}}this service{{/appName}}</h2>
6
+ <div class="govuk-cookie-banner__content">
7
+ <p class="govuk-body">{{#t}}cookies.banner.message{{/t}}</p>
8
+ {{#hasGoogleAnalytics}}
9
+ <p class="govuk-body">We'd like to set additional cookies to understand how you use GOV.UK, remember your settings and improve government services.</p>
10
+ <p class="govuk-body">We also use cookies set by other sites to help us deliver content from their services.</p>
11
+ {{/hasGoogleAnalytics}}
12
+ </div>
13
+ </div>
14
+ </div>
15
+ <div id="cookie-banner-actions" class="govuk-button-group">
16
+ {{#hasGoogleAnalytics}}
17
+ <button id="accept-cookies-button" value="yes" type="submit" name="cookies[additional]" class="govuk-button" data-module="govuk-button" data-accept-cookies="true" data-track-category="cookieBanner" data-track-action="Cookie banner accepted" data-cookie-types="all">Accept additional cookies</button>
18
+ <button id="reject-cookies-button" value="no" type="submit" name="cookies[additional]" class="govuk-button" data-module="govuk-button" data-reject-cookies="true" data-track-category="cookieBanner" data-track-action="Cookie banner rejected">Reject additional cookies</button>
19
+ {{/hasGoogleAnalytics}}
20
+ <a class="govuk-link" href="/cookies">{{#t}}cookies.banner.link{{/t}}</a>
21
+ </div>
22
+ </div>
23
+ <div id="cookie-banner-submitted-accepted" data-accept-cookies="true" class="govuk-cookie-banner__message govuk-width-container" role="alert" hidden >
24
+ <div class="govuk-grid-row">
25
+ <div class="govuk-grid-column-two-thirds">
26
+ <div class="govuk-cookie-banner__content">
27
+ <p class="govuk-body">You've accepted additional cookies. You can <a class="govuk-link" href="/cookies">change your cookie settings</a> at any time.</p>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <div class="govuk-button-group">
32
+ <button id="hide-accept-cookie-banner" value="yes" type="submit" name="cookies[hide]" class="govuk-button" data-module="govuk-button">
33
+ Hide cookie message
34
+ </button>
35
+ </div>
36
+ </div>
37
+ <div id="cookie-banner-submitted-rejected" class="govuk-cookie-banner__message govuk-width-container" role="alert" hidden>
38
+ <div class="govuk-grid-row">
39
+ <div class="govuk-grid-column-two-thirds">
40
+ <div class="govuk-cookie-banner__content">
41
+ <p class="govuk-body">You've rejected additional cookies. You can <a class="govuk-link" href="/cookies">change your cookie settings</a> at any time.</p>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ <div class="govuk-button-group">
46
+ <button id="hide-reject-cookie-banner" value="yes" type="submit" name="cookies[hide]" class="govuk-button" data-module="govuk-button">
47
+ Hide cookie message
48
+ </button>
49
+ </div>
50
+ </div>
33
51
  </div>
@@ -1,8 +1,8 @@
1
1
  <div class="govuk-header__content">
2
2
  {{#startPageRedirectUrl}}
3
- <a href="{{startPageRedirectUrl}}" class="govuk-header__link govuk-header__link--service-name" id="proposition-name">{{$journeyHeader}}{{/journeyHeader}}</a>
3
+ <a href="{{startPageRedirectUrl}}" class="govuk-header__link govuk-header__service-name" id="proposition-name">{{$journeyHeader}}{{/journeyHeader}}</a>
4
4
  {{/startPageRedirectUrl}}
5
5
  {{^startPageRedirectUrl}}
6
- <a href="{{journeyHeaderURL}}" class="govuk-header__link govuk-header__link--service-name" id="proposition-name">{{$journeyHeader}}{{/journeyHeader}}</a>
6
+ <a href="{{journeyHeaderURL}}" class="govuk-header__link govuk-header__service-name" id="proposition-name">{{$journeyHeader}}{{/journeyHeader}}</a>
7
7
  {{/startPageRedirectUrl}}
8
8
  </div>