@govuk-one-login/frontend-ui 4.1.4 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/build/all.css +1 -0
  2. package/build/cjs/backend/index.cjs +257 -0
  3. package/build/cjs/backend/index.d.cts +39 -0
  4. package/build/cjs/backend/index.d.ts +39 -0
  5. package/build/cjs/backend/index.d.ts.map +1 -0
  6. package/build/cjs/backend/lib/helmet.d.ts +31 -0
  7. package/build/cjs/backend/lib/helmet.d.ts.map +1 -0
  8. package/build/cjs/backend/lib/index.d.ts +4 -0
  9. package/build/cjs/backend/lib/index.d.ts.map +1 -0
  10. package/build/cjs/backend/lib/locals.d.ts +11 -0
  11. package/build/cjs/backend/lib/locals.d.ts.map +1 -0
  12. package/build/cjs/backend/lib/settings.d.ts +21 -0
  13. package/build/cjs/backend/lib/settings.d.ts.map +1 -0
  14. package/build/cjs/backend/utils/logger.d.ts +9 -0
  15. package/build/cjs/backend/utils/logger.d.ts.map +1 -0
  16. package/build/cjs/frontend/index.cjs +443 -0
  17. package/build/cjs/frontend/index.d.cts +4 -0
  18. package/build/cjs/frontend/index.d.ts +4 -0
  19. package/build/cjs/frontend/index.d.ts.map +1 -0
  20. package/build/cjs/frontend/progress-button/progress-button.d.ts +2 -0
  21. package/build/cjs/frontend/progress-button/progress-button.d.ts.map +1 -0
  22. package/build/cjs/frontend/spinner/__tests__/spinner.test.d.ts +2 -0
  23. package/build/cjs/frontend/spinner/__tests__/spinner.test.d.ts.map +1 -0
  24. package/build/cjs/frontend/spinner/spinner.d.ts +64 -0
  25. package/build/cjs/frontend/spinner/spinner.d.ts.map +1 -0
  26. package/build/cjs/frontend/utils/types.d.ts +108 -0
  27. package/build/cjs/frontend/utils/types.d.ts.map +1 -0
  28. package/build/components/_all.scss +6 -0
  29. package/build/components/bases/auth/auth-base.njk +136 -0
  30. package/build/components/bases/home/home-base.njk +133 -0
  31. package/build/components/bases/identity/identity-base-form.njk +123 -0
  32. package/build/components/bases/identity/identity-base-page.njk +123 -0
  33. package/build/components/bases/ipv-core/ipv-core-base.njk +172 -0
  34. package/build/components/bases/mobile/mobile-base.njk +195 -0
  35. package/build/components/cookie-banner/cookie-banner.yaml +6 -0
  36. package/build/components/cookie-banner/macro.njk +1 -0
  37. package/build/components/cookie-banner/template.njk +106 -0
  38. package/build/components/footer/_index.scss +28 -0
  39. package/build/components/footer/footer.yaml +5 -0
  40. package/build/components/footer/macro.njk +1 -0
  41. package/build/components/footer/template.njk +12 -0
  42. package/build/components/header/README.md +34 -0
  43. package/build/components/header/_index.scss +102 -0
  44. package/build/components/header/header.yaml +16 -0
  45. package/build/components/header/macro.njk +3 -0
  46. package/build/components/header/template.njk +39 -0
  47. package/build/components/language-select/_index.scss +35 -0
  48. package/build/components/language-select/language-select.yaml +43 -0
  49. package/build/components/language-select/macro.njk +2 -0
  50. package/build/components/language-select/template.njk +38 -0
  51. package/build/components/macros/logo.njk +75 -0
  52. package/build/components/phase-banner/_index.scss +28 -0
  53. package/build/components/phase-banner/macro.njk +3 -0
  54. package/build/components/phase-banner/phase-banner.yaml +17 -0
  55. package/build/components/phase-banner/tag/macro.njk +3 -0
  56. package/build/components/phase-banner/tag/template.njk +3 -0
  57. package/build/components/phase-banner/template.njk +26 -0
  58. package/build/components/progress-button/_index.scss +51 -0
  59. package/build/components/progress-button/macro.njk +2 -0
  60. package/build/components/progress-button/progress-button.yaml +13 -0
  61. package/build/components/progress-button/template.njk +112 -0
  62. package/build/components/skip-link/README.md +10 -0
  63. package/build/components/skip-link/macro.njk +3 -0
  64. package/build/components/skip-link/skip-link.yaml +5 -0
  65. package/build/components/skip-link/template.njk +14 -0
  66. package/build/components/spinner/README.md +130 -0
  67. package/build/components/spinner/_index.scss +55 -0
  68. package/build/components/spinner/macro.njk +3 -0
  69. package/build/components/spinner/template.njk +18 -0
  70. package/build/esm/backend/index.d.ts +39 -0
  71. package/build/esm/backend/index.d.ts.map +1 -0
  72. package/build/esm/backend/index.js +247 -0
  73. package/build/esm/backend/lib/helmet.d.ts +31 -0
  74. package/build/esm/backend/lib/helmet.d.ts.map +1 -0
  75. package/build/esm/backend/lib/index.d.ts +4 -0
  76. package/build/esm/backend/lib/index.d.ts.map +1 -0
  77. package/build/esm/backend/lib/locals.d.ts +11 -0
  78. package/build/esm/backend/lib/locals.d.ts.map +1 -0
  79. package/build/esm/backend/lib/settings.d.ts +21 -0
  80. package/build/esm/backend/lib/settings.d.ts.map +1 -0
  81. package/build/esm/backend/utils/logger.d.ts +9 -0
  82. package/build/esm/backend/utils/logger.d.ts.map +1 -0
  83. package/build/esm/frontend/index.d.ts +4 -0
  84. package/build/esm/frontend/index.d.ts.map +1 -0
  85. package/build/esm/frontend/index.js +440 -0
  86. package/build/esm/frontend/progress-button/progress-button.d.ts +2 -0
  87. package/build/esm/frontend/progress-button/progress-button.d.ts.map +1 -0
  88. package/build/esm/frontend/spinner/__tests__/spinner.test.d.ts +2 -0
  89. package/build/esm/frontend/spinner/__tests__/spinner.test.d.ts.map +1 -0
  90. package/build/esm/frontend/spinner/spinner.d.ts +64 -0
  91. package/build/esm/frontend/spinner/spinner.d.ts.map +1 -0
  92. package/build/esm/frontend/utils/types.d.ts +108 -0
  93. package/build/esm/frontend/utils/types.d.ts.map +1 -0
  94. package/package.json +1 -2
@@ -0,0 +1,195 @@
1
+ {% if MAY_2025_REBRAND_ENABLED %}
2
+ {% set govukRebrand = true %}
3
+ {% endif %}
4
+
5
+ {% extends "govuk/template.njk" %}
6
+
7
+ {% from "frontend-ui/build/components/phase-banner/macro.njk" import frontendUiPhaseBanner %}
8
+ {% from "frontend-ui/build/components/cookie-banner/macro.njk" import frontendUiCookieBanner %}
9
+ {% from "frontend-ui/build/components/header/macro.njk" import frontendUiHeader %}
10
+ {% from "frontend-ui/build/components/footer/macro.njk" import frontendUiFooter %}
11
+ {% from "frontend-ui/build/components/language-select/macro.njk" import frontendUiLanguageSelect %}
12
+ {% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %}
13
+ {% from "ga4-opl/macro.njk" import ga4OnPageLoad %}
14
+
15
+ {% if makeFullWidth %}
16
+ {% set columnWidth = "full" %}
17
+ {% else %}
18
+ {% set columnWidth = 'two-thirds' %}
19
+ {% endif %}
20
+
21
+ {% block head %}
22
+ <link href="/stylesheets/application.css" rel="stylesheet">
23
+ <link href="/stylesheets/language-toggle.css" rel="stylesheet">
24
+ <meta name="robots" content="noindex">
25
+
26
+ {% endblock %}
27
+
28
+ {% block pageTitle %}
29
+ {% if pageTitleName %}
30
+ {{ pageTitleName }}
31
+ -
32
+ {% endif %}
33
+ {{ 'general.serviceNameTitle' | translate }}
34
+ {% endblock %}
35
+
36
+ {% block bodyStart %}
37
+ {% block frontendUiCookieBanner %}
38
+ {{ frontendUiCookieBanner({
39
+ translations: translations.translation.cookieBanner
40
+ }
41
+ )}}
42
+ {% endblock %}
43
+ {% endblock %}
44
+
45
+ {% block header %}
46
+ {{ frontendUiHeader({
47
+ translations: translations.translation.header,
48
+ homepageUrl: "https://www.gov.uk"
49
+ }) }}
50
+ {% endblock %}
51
+
52
+ {% block main %}
53
+ <div class="govuk-width-container {{ containerClasses }}">
54
+ {% if doNotShowPhaseBanner %}
55
+ {% else %}
56
+ {{ frontendUiPhaseBanner({
57
+ translations: translations.translation.phaseBanner,
58
+ url: currentUrl,
59
+ contactUrl: supportFormLink,
60
+ noAppend: true
61
+ }) }}
62
+ {% endif %}
63
+
64
+ {% if showLanguageToggle %}
65
+ {{ frontendUiLanguageSelect({
66
+ translations: translations.translation.languageSelect,
67
+ url: currentUrl,
68
+ activeLanguage: htmlLang
69
+ }) }}
70
+ {% endif %}
71
+
72
+ {% if showBack %}
73
+ {{ govukBackLink({
74
+ text: "Back",
75
+ href: hrefBack
76
+ }) }}
77
+ {% endif %}
78
+ {% if showBackLinkHtml %}
79
+ <a href="#" id="back-button" class="govuk-back-link">{{'general.buttons.back' | translate}}</a>
80
+ {% endif %}
81
+ <main class="govuk-main-wrapper {{ mainClasses }} govuk-!-padding-top-2" id="main-content" role="main" >
82
+ <div class="govuk-grid-row">
83
+ <div class="govuk-grid-column-{{columnWidth}} {{ rowClasses }}">
84
+ {% if (displayBanner) %}
85
+ {{ govukNotificationBanner({
86
+ html: bannerMessage,
87
+ type: bannerType,
88
+ titleText: bannerTitleText
89
+ }) }}
90
+ {% endif %}
91
+ {% block content %}{% endblock %}
92
+ </div>
93
+ </div>
94
+ </main>
95
+ </div>
96
+ {% endblock %}
97
+
98
+ {% block footer %}
99
+ {{ frontendUiFooter({
100
+ translations: {
101
+ footerNavItems: [
102
+ {
103
+ href: 'general.base.footer.accessibility.link' | translate | safe,
104
+ text: 'general.base.footer.accessibility.linkText' | translate
105
+ },
106
+ {
107
+ href: 'general.cookieBanner.viewCookiesLink' | translate,
108
+ text: 'general.base.footer.cookies' | translate
109
+ },
110
+ {
111
+ href: 'general.base.footer.termsAndConditions.link' | translate,
112
+ text: 'general.base.footer.termsAndConditions.linkText' | translate,
113
+ attributes: { "data-pw": "terms-and-conditions-link" }
114
+ },
115
+ {
116
+ href: 'general.base.footer.privacy.link' | translate | safe,
117
+ text: 'general.base.footer.privacy.linkText' | translate,
118
+ attributes: { "data-pw": "privacy-notice-link" }
119
+ },
120
+ {
121
+ href: supportFormLink,
122
+ text: 'general.base.footer.support.linkText' | translate,
123
+ attributes: {
124
+ target: "_blank",
125
+ rel: "noopener noreferrer",
126
+ "data-pw": "footer-support-form-link"
127
+ }
128
+ }
129
+ ],
130
+ contentLicence: {
131
+ html: 'general.base.footer.contentLicence.linkText' | translate | safe
132
+ },
133
+ copyright: {
134
+ text: 'general.base.footer.copyright.linkText' | translate
135
+ }
136
+ }
137
+ }) }}
138
+ {% endblock %}
139
+
140
+ {% block bodyEnd %}
141
+ <script type="module" nonce='{{ scriptNonce }}' src="/public/scripts/govuk-frontend.min.js"></script>
142
+ <script type="module" nonce='{{ scriptNonce }}'>
143
+ import {initAll} from '/public/scripts/govuk-frontend.min.js'
144
+ initAll()
145
+ </script>
146
+ <script type="text/javascript" src="/public/scripts/application.js"></script>
147
+ <script type="text/javascript" src="/public/scripts/analytics.js" nonce='{{scriptNonce}}'></script>
148
+ <script type="text/javascript" nonce='{{scriptNonce}}'>
149
+ window.DI = window.DI || {};
150
+ window.DI.taxonomy_level2 = '{{taxonomy_level2}}'
151
+ </script>
152
+ <script type="text/javascript" {% if scriptNonce %} nonce="{{ scriptNonce }}"{% endif %}>
153
+ {% if analyticsDataSensitive is defined and isPageDataSensitive is defined %}
154
+ window
155
+ .DI
156
+ .appInit({
157
+ ga4ContainerId: "{{ga4ContainerId}}",
158
+ }, {
159
+ isDataSensitive: {{ analyticsDataSensitive | default(true) }},
160
+ isPageDataSensitive: {{ isPageDataSensitive | default(true) }},
161
+ enableGa4Tracking: {{ isGa4Enabled | default(false) }},
162
+ cookieDomain: "{{analyticsCookieDomain}}"
163
+ });
164
+ {% else %}
165
+ console.log("Using deprecated GA4 v2 config. Please add analyticsDataSensitive and isPageDataSensitive flags to your nunjucks environment to enable GA4 v4. This will be removed in a future version.");
166
+ window
167
+ .DI
168
+ .appInit({
169
+ ga4ContainerId: "{{ga4ContainerId}}",
170
+ uaContainerId: "{{uaContainerId}}"
171
+ }, {
172
+ isDataSensitive: false,
173
+ disableGa4Tracking: {{isGa4Disabled}},
174
+ disableUaTracking: {{isUaDisabled}},
175
+ cookieDomain: "{{analyticsCookieDomain}}"
176
+ });
177
+ {% endif %}
178
+ </script>
179
+ <script type="text/javascript" nonce='{{scriptNonce}}'>
180
+ if (document.getElementById('back-button'))
181
+ document
182
+ .getElementById('back-button')
183
+ .addEventListener('click', (e) => {
184
+ e.preventDefault();
185
+ window
186
+ .history
187
+ .back()
188
+ })
189
+ </script>
190
+
191
+ <script type="module" nonce="{{scriptNonce}}">
192
+ import {setFingerprintCookie} from "/public/scripts/index.js";
193
+ await setFingerprintCookie("{{analyticsCookieDomain}}");
194
+ </script>
195
+ {% endblock %}
@@ -0,0 +1,6 @@
1
+ params:
2
+ - name: translations
3
+ type: string
4
+ required: true
5
+ description: translations from middleware
6
+
@@ -0,0 +1 @@
1
+ {% macro frontendUiCookieBanner(params) %} {%- include "./template.njk" -%} {% endmacro %}
@@ -0,0 +1,106 @@
1
+ {% from "govuk/components/cookie-banner/macro.njk" import govukCookieBanner %}
2
+
3
+ {% set lng = params.activeLanguage %}
4
+ {% set cookieBanner = params.translations %}
5
+
6
+ {% set html %}
7
+ <p class="govuk-body">{{ cookieBanner.body1 }}</p>
8
+ <p class="govuk-body">{{ cookieBanner.body2 }}</p>
9
+ {% endset %}
10
+
11
+ {% set acceptHtml %}
12
+ <p class="govuk-body">
13
+ {{ cookieBanner.cookieBannerAccept.body1 }}
14
+ <a class="govuk-link" href="https://signin.account.gov.uk/cookies">
15
+ {{ cookieBanner.changeCookiePreferencesLink }}
16
+ </a>
17
+ {{ cookieBanner.cookieBannerAccept.body2 }}
18
+ </p>
19
+ {% endset %}
20
+
21
+ {% set rejectedHtml %}
22
+ <p class="govuk-body">
23
+ {{ cookieBanner.cookieBannerReject.body1 }}
24
+ <a class="govuk-link" href="https://signin.account.gov.uk/cookies">
25
+ {{ cookieBanner.changeCookiePreferencesLink }}
26
+ </a>
27
+ {{ cookieBanner.cookieBannerReject.body2 }}
28
+ </p>
29
+ {% endset %}
30
+
31
+ {{ govukCookieBanner({
32
+ ariaLabel: cookieBanner.ariaLabel,
33
+ name: "gov-uk-cookie-banner",
34
+ messages: [
35
+ {
36
+ headingText: cookieBanner.headingText,
37
+ html: html,
38
+ attributes: {
39
+ "id": "cookies-banner-main"
40
+ },
41
+ actions: [
42
+ {
43
+ text: cookieBanner.acceptAdditionalCookies,
44
+ type: "button",
45
+ name: "cookiesAccept",
46
+ value: "accept",
47
+ attributes: {
48
+ "aria-label": cookieBanner.acceptAdditionalCookies
49
+ }
50
+ },
51
+ {
52
+ text: cookieBanner.rejectAdditionalCookies,
53
+ type: "button",
54
+ name: "cookiesReject",
55
+ value: "reject",
56
+ attributes: {
57
+ "aria-label": cookieBanner.rejectAdditionalCookies
58
+ }
59
+ },
60
+ {
61
+ text: cookieBanner.viewCookies,
62
+ href: "https://signin.account.gov.uk/cookies",
63
+ attributes: {
64
+ "aria-label": cookieBanner.viewCookies
65
+ }
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ html: acceptHtml,
71
+ attributes: {
72
+ "id": "cookies-accepted"
73
+ },
74
+ actions: [
75
+ {
76
+ text: cookieBanner.hideCookieMessage,
77
+ href: "#",
78
+ type: "button",
79
+ classes:"cookie-hide-button",
80
+ attributes: {
81
+ "aria-label": cookieBanner.hideCookieMessage
82
+ }
83
+ }
84
+ ],
85
+ hidden: true
86
+ },
87
+ {
88
+ html: rejectedHtml,
89
+ attributes: {
90
+ "id": "cookies-rejected"
91
+ },
92
+ actions: [
93
+ {
94
+ text: cookieBanner.hideCookieMessage,
95
+ href: "#",
96
+ type: "button",
97
+ classes:"cookie-hide-button",
98
+ attributes: {
99
+ "aria-label": cookieBanner.hideCookieMessage
100
+ }
101
+ }
102
+ ],
103
+ hidden: true
104
+ }
105
+ ], hidden: false
106
+ }) }}
@@ -0,0 +1,28 @@
1
+ @media (max-width: 256px) {
2
+
3
+ .govuk-footer__crown{
4
+ max-width: 100%;
5
+ max-height: auto;
6
+ }
7
+ }
8
+
9
+ .govuk-footer{
10
+ padding-top: 25px;
11
+ padding-bottom: 15px;
12
+ border-top: 1px solid #b1b4b6;
13
+ color: #0b0c0c;
14
+ background: #f3f2f1;
15
+ }
16
+
17
+ .govuk-template--rebranded .govuk-footer {
18
+ border-top: 10px solid #1d70b8;
19
+ background: #f4f8fb;
20
+ }
21
+
22
+ .govuk-footer__copyright-logo::before {
23
+ background: rgb(110,119,122,255);
24
+ }
25
+
26
+ .govuk-template--rebranded .govuk-footer__copyright-logo::before{
27
+ background: currentcolor
28
+ }
@@ -0,0 +1,5 @@
1
+ params:
2
+ - name: translations
3
+ type: string
4
+ required: true
5
+ description: translations from middleware
@@ -0,0 +1 @@
1
+ {% macro frontendUiFooter(params) %} {%- include "./template.njk" -%} {% endmacro %}
@@ -0,0 +1,12 @@
1
+ {% set footer = params.translations %}
2
+
3
+ {% from "govuk/components/footer/macro.njk" import govukFooter %}
4
+ {{ govukFooter({
5
+ meta: { items: footer.footerNavItems },
6
+ contentLicence: { html: footer.contentLicence.html },
7
+ copyright: { text: footer.copyright.text },
8
+ rebrand: MAY_2025_REBRAND_ENABLED,
9
+ attributes: {
10
+ "aria-label": "footer"
11
+ }
12
+ }) }}
@@ -0,0 +1,34 @@
1
+ # Header
2
+
3
+ ###### For translations to work you __must__ pass in the `header: translations` varible
4
+ ```html
5
+ {% block header %}
6
+ {{ frontendUiHeader
7
+ ({
8
+ header: translations
9
+ })
10
+ }}
11
+ {% endblock %}
12
+ ```
13
+
14
+ ###### In order to remove the linking capability of the header logo and text include the `isEmbeddedMobileApp = true` variable within your repos basefile when you are calling the header
15
+ ```html
16
+ {% block header %}
17
+ {{ frontendUiHeader
18
+ ({
19
+ isEmbeddedMobileApp = true
20
+ })
21
+ }}
22
+ {% endblock %}
23
+ ```
24
+
25
+ ###### To enable the sign out functionality of the heade include the `signOutLink` variable within your repos basefile when calling the header
26
+ ```html
27
+ {% block header %}
28
+ {{ frontendUiHeader
29
+ ({
30
+ signOutLink: 'https://signin.account.gov.uk/signed-out'
31
+ })
32
+ }}
33
+ {% endblock %}
34
+ ```
@@ -0,0 +1,102 @@
1
+ @media (max-width: 640px) {
2
+ .govuk-header__navigation-item {
3
+ border-left: none !important;
4
+ }
5
+ .govuk-template--rebranded .govuk-header__navigation-list {
6
+ padding-bottom: 0px !important;
7
+ }
8
+
9
+ .govuk-header__navigation-item{
10
+ padding-top: 8px !important;
11
+ }
12
+ }
13
+
14
+ .frontendUi_header_signOut-item {
15
+ padding: 5px 0px 5px 30px;
16
+ border-left: 1px solid #b1b4b6;
17
+ margin-left: auto;
18
+ }
19
+
20
+ .frontendUi_header_signOut-item--rebrand {
21
+ border-left: none;
22
+ padding: 5px 0px 5px 0px;
23
+ margin-left: auto;
24
+ font-weight: 700 !important;
25
+ }
26
+
27
+ .frontendUi_header__signOut {
28
+ display: flex;
29
+ flex-wrap: wrap;
30
+ }
31
+
32
+ .frontendUi-header__content {
33
+ margin-left: auto;
34
+ }
35
+
36
+ .govuk-header__navigation--signOut {
37
+ padding: 15px 0 15px !important;
38
+ }
39
+
40
+ .govuk-template--rebranded .govuk-header__navigation {
41
+ padding: 15px 0 15px !important;
42
+ }
43
+
44
+ @media (max-width: 640px) {
45
+ .govuk-header__navigation--signOut {
46
+ padding: 18px 0 8px !important;
47
+ }
48
+
49
+ .govuk-template--rebranded .govuk-header__navigation {
50
+ padding: 18px 0 8px !important;
51
+ }
52
+ }
53
+
54
+ .govuk-template--rebranded .govuk-header__navigation-item a {
55
+ font-weight: 700 !important;
56
+ }
57
+
58
+ .govuk-template--rebranded .govuk-header__navigation-item {
59
+ padding-top: 5px !important;
60
+ }
61
+
62
+ @media (min-width: 20em) and (max-width: 48.0525em) {
63
+ .govuk-template--rebranded .govuk-header__navigation-list {
64
+ padding-bottom: 0px;
65
+ }
66
+ }
67
+
68
+ @media (max-width: 323px) {
69
+
70
+ .govuk-header__logo{
71
+ padding-right: 5px;
72
+ }
73
+
74
+ .frontendUi_header_signOut-item
75
+ {
76
+ padding-left: 0px;
77
+ }
78
+ }
79
+
80
+ @media (max-width: 261px) {
81
+
82
+ .frontendUi-header__content {
83
+ margin-left: unset;
84
+ }
85
+
86
+
87
+
88
+
89
+ .govuk-template--rebranded .govuk-header__navigation {
90
+ padding: 0px 0 8px !important;
91
+ }
92
+
93
+ .govuk-header__logotype{
94
+ max-width: 100%;
95
+ max-height: auto;
96
+ }
97
+
98
+ .govuk-template--rebranded .govuk-header__logo{
99
+ padding-top: 5% !important;
100
+ padding-bottom: 5% !important;
101
+ }
102
+ }
@@ -0,0 +1,16 @@
1
+ params:
2
+ - name: translations
3
+ type: string
4
+ required: true
5
+ description: translations from middleware
6
+ - name: isEmbeddedMobileApp
7
+ type: boolean
8
+ required: false
9
+ description: disables the gov.uk link in the header
10
+ - name: signOutLink
11
+ type: string
12
+ required: false
13
+ description: where the signout button will direct the user
14
+
15
+
16
+
@@ -0,0 +1,3 @@
1
+ {% macro frontendUiHeader(params) %}
2
+ {%- include "./template.njk" -%}
3
+ {% endmacro %}
@@ -0,0 +1,39 @@
1
+ {% from "../macros/logo.njk" import govukLogo %}
2
+ {% set header = params.translations %}
3
+
4
+ {%if MAY_2025_REBRAND_ENABLED%}
5
+ {%- set _rebrand = params.rebrand | default(govukRebrand() if govukRebrand is callable else govukRebrand) -%}
6
+ {% endif %}
7
+ <header class="govuk-header {%- if params.classes %} {{ params.classes }}{% endif %}" data-module="govuk-header">
8
+ <div class="frontendUi_header__signOut govuk-header__container {{ params.containerClasses | default("govuk-width-container", true) }}">
9
+ <div class="govuk-header__logo">
10
+ {% if params.isEmbeddedMobileApp %}
11
+ <span class="govuk-header__link govuk-header__link--homepage" style="pointer-events: none;">
12
+ {% else %}
13
+ <a href="{{ params.homepageUrl | default('https://www.gov.uk/') }}" class="govuk-header__link govuk-header__link--homepage">
14
+ {% endif %}
15
+ {{ govukLogo({
16
+ classes: "govuk-header__logotype",
17
+ ariaLabelText: "GOV.UK",
18
+ useTudorCrown: params.useTudorCrown,
19
+ rebrand: MAY_2025_REBRAND_ENABLED
20
+ }) | trim | indent(8) }}
21
+ {% if not params.isEmbeddedMobileApp %}
22
+ </a>
23
+ {% endif %}
24
+ </div>
25
+ {% if params.signOutLink %}
26
+ <div class="frontendUi-header__content govuk-header__content">
27
+ <nav aria-label="{{header.ariaLabel}}" class="govuk-header__navigation {{ govuk-header__navigation--signOut if params.MAY_2025_REBRAND_ENABLED }}">
28
+ <ul id="navigation" class="frontendUi_header__signOut govuk-header__navigation-list">
29
+ <li class="{{ 'frontendUi_header_signOut-item--rebrand' if MAY_2025_REBRAND_ENABLED }} {{'frontendUi_header_signOut-item' if not MAY_2025_REBRAND_ENABLED}} govuk-header__navigation-item{{ ' govuk-header__navigation-item--active' if item.active }}">
30
+ <a aria-label="{{header.signOutAriaLabel}}" class="govuk-header__link" href="{{params.signOutLink}}">
31
+ {{header.signOut}}
32
+ </a>
33
+ </li>
34
+ </ul>
35
+ </nav>
36
+ </div>
37
+ {% endif %}
38
+ </div>
39
+ </header>
@@ -0,0 +1,35 @@
1
+ .language-select {
2
+ margin: 15px 0 15px 0;
3
+ }
4
+
5
+ .language-select__list {
6
+ margin-top: 1em;
7
+ text-align: right;
8
+ }
9
+
10
+ .language-select__list-item {
11
+ display: inline-block;
12
+ }
13
+
14
+ .language-select__list-item:first-child::after {
15
+ content: "";
16
+ display: inline-block;
17
+ position: relative;
18
+ top: 0.1875em;
19
+ height: 1em;
20
+ border-right: 0.09375em solid black;
21
+ }
22
+
23
+ .language-select__list-item a,
24
+ .language-select__list-item [aria-current] {
25
+ padding: 0.3125em;
26
+ }
27
+
28
+ @media screen and (max-width: 641px) {
29
+ .language-select__list {
30
+ float: none;
31
+ text-align: left;
32
+ padding-bottom: 10px;
33
+ border-bottom: 1px solid #b1b4b6;
34
+ }
35
+ }
@@ -0,0 +1,43 @@
1
+ params:
2
+ - name: translations
3
+ type: string
4
+ required: true
5
+ description: translations from middleware
6
+ - name: activeLanguage
7
+ type: string
8
+ required: true
9
+ description: currently selected language
10
+ - name: currentUrl
11
+ type: string
12
+ required: true
13
+ description: current url to be used to append langauge variable
14
+ - name: ariaLabel
15
+ type: string
16
+ required: false
17
+ description: aria label for the nav tag
18
+ - name: class
19
+ type: string
20
+ required: false
21
+ description: css class you can add
22
+ - name: languages
23
+ type: array
24
+ required: false
25
+ description: array of languages object
26
+ params:
27
+ - name: language
28
+ type: object
29
+ required: false
30
+ description: language object
31
+ params:
32
+ - name: code
33
+ type: string
34
+ required: true
35
+ description: language code
36
+ - name: text
37
+ type: string
38
+ required: true
39
+ description: language text
40
+ - name: visuallyHidden
41
+ type: string
42
+ required: false
43
+ description: language text
@@ -0,0 +1,2 @@
1
+ {% macro frontendUiLanguageSelect(params) %} {%- include "./template.njk" -%} {% endmacro
2
+ %}
@@ -0,0 +1,38 @@
1
+ {% set languageSelect = params.translations %}
2
+ {% if params.languages %}
3
+ {% set languages = params.languages %}
4
+ {% else %}
5
+ {% set languages = [
6
+ { code: "en", text: "English", visuallyHidden: "Change to English" },
7
+ { code: "cy", text: "Cymraeg", visuallyHidden: "Newid yr iaith ir Gymraeg" }
8
+ ] %}
9
+ {% endif %}
10
+
11
+ <nav
12
+ class="language-select {{params.class}}"
13
+ aria-label="{{languageSelect.ariaLabel}}"
14
+ role="navigation"
15
+ >
16
+ <ul
17
+ class="govuk-list language-select__list govuk-body-s govuk-!-margin-0"
18
+ role="list"
19
+ >
20
+ {% for lang in languages %}
21
+ <li class="language-select__list-item" role="listitem">
22
+ {% if params.activeLanguage == lang.code %}
23
+ <span aria-current="true">{{ lang.text }}</span>
24
+ {% else %}
25
+ <a
26
+ class="govuk-link govuk-link--no-visited-state"
27
+ href="{{ addLanguageParam(lang.code, params.url)}}"
28
+ data-journey-click="link - click:lang-select:{{ lang.code }}"
29
+ rel="alternate"
30
+ hreflang="{{ lang.code }}"
31
+ lang="{{lang.code}}"
32
+ role="link"
33
+ >{{ lang.text }}<div class="govuk-visually-hidden">{{ lang.visuallyHidden }}</div></a>
34
+ {% endif %}
35
+ </li>
36
+ {% endfor %}
37
+ </ul>
38
+ </nav>