govuk_publishing_components 27.16.0 → 27.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/govuk_publishing_components/image-card-srcset/cop26-170.jpg +0 -0
  3. data/app/assets/images/govuk_publishing_components/image-card-srcset/cop26-240.jpg +0 -0
  4. data/app/assets/images/govuk_publishing_components/image-card-srcset/cop26-320.jpg +0 -0
  5. data/app/assets/images/govuk_publishing_components/image-card-srcset/cop26-480.jpg +0 -0
  6. data/app/assets/images/govuk_publishing_components/image-card-srcset/cop26.jpg +0 -0
  7. data/app/assets/javascripts/govuk_publishing_components/analytics/explicit-cross-domain-links.js +49 -48
  8. data/app/assets/javascripts/govuk_publishing_components/analytics/page-content.js +74 -65
  9. data/app/assets/javascripts/govuk_publishing_components/components/cookie-banner.js +0 -1
  10. data/app/assets/javascripts/govuk_publishing_components/components/single-page-notification-button.js +25 -11
  11. data/app/assets/stylesheets/govuk_publishing_components/_all_components.scss +1 -0
  12. data/app/assets/stylesheets/govuk_publishing_components/components/_big-number.scss +1 -6
  13. data/app/assets/stylesheets/govuk_publishing_components/components/_contextual-sidebar.scss +19 -14
  14. data/app/assets/stylesheets/govuk_publishing_components/components/_image-card.scss +17 -7
  15. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +10 -109
  16. data/app/assets/stylesheets/govuk_publishing_components/components/_search.scss +24 -14
  17. data/app/assets/stylesheets/govuk_publishing_components/components/_signup-link.scss +34 -0
  18. data/app/assets/stylesheets/govuk_publishing_components/components/_single-page-notification-button.scss +8 -0
  19. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_tables.scss +8 -4
  20. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_warning-callout.scss +7 -0
  21. data/app/assets/stylesheets/govuk_publishing_components/components/mixins/_grid-helper.scss +141 -0
  22. data/app/views/govuk_publishing_components/components/_contextual_sidebar.html.erb +5 -1
  23. data/app/views/govuk_publishing_components/components/_cookie_banner.html.erb +1 -1
  24. data/app/views/govuk_publishing_components/components/_image_card.html.erb +1 -0
  25. data/app/views/govuk_publishing_components/components/_intervention.html.erb +10 -1
  26. data/app/views/govuk_publishing_components/components/_search.html.erb +1 -0
  27. data/app/views/govuk_publishing_components/components/_signup_link.html.erb +30 -0
  28. data/app/views/govuk_publishing_components/components/_single_page_notification_button.html.erb +1 -1
  29. data/app/views/govuk_publishing_components/components/contextual_sidebar/_brexit_cta.html.erb +3 -3
  30. data/app/views/govuk_publishing_components/components/contextual_sidebar/_covid_cta.html.erb +27 -0
  31. data/app/views/govuk_publishing_components/components/docs/contextual_sidebar.yml +15 -87
  32. data/app/views/govuk_publishing_components/components/docs/image_card.yml +29 -0
  33. data/app/views/govuk_publishing_components/components/docs/intervention.yml +9 -0
  34. data/app/views/govuk_publishing_components/components/docs/search.yml +3 -0
  35. data/app/views/govuk_publishing_components/components/docs/signup_link.yml +39 -0
  36. data/app/views/govuk_publishing_components/components/layout_header/_header_logo.html.erb +1 -1
  37. data/config/i18n-tasks.yml +8 -0
  38. data/config/locales/ar.yml +134 -131
  39. data/config/locales/az.yml +131 -131
  40. data/config/locales/be.yml +136 -130
  41. data/config/locales/bg.yml +135 -131
  42. data/config/locales/bn.yml +132 -131
  43. data/config/locales/cs.yml +136 -131
  44. data/config/locales/cy.yml +129 -125
  45. data/config/locales/da.yml +132 -131
  46. data/config/locales/de.yml +135 -131
  47. data/config/locales/dr.yml +133 -131
  48. data/config/locales/el.yml +131 -131
  49. data/config/locales/en.yml +19 -14
  50. data/config/locales/es-419.yml +131 -131
  51. data/config/locales/es.yml +131 -131
  52. data/config/locales/et.yml +134 -131
  53. data/config/locales/fa.yml +130 -131
  54. data/config/locales/fi.yml +133 -131
  55. data/config/locales/fr.yml +130 -130
  56. data/config/locales/gd.yml +133 -131
  57. data/config/locales/gu.yml +131 -131
  58. data/config/locales/he.yml +131 -131
  59. data/config/locales/hi.yml +131 -131
  60. data/config/locales/hr.yml +133 -131
  61. data/config/locales/hu.yml +134 -131
  62. data/config/locales/hy.yml +135 -131
  63. data/config/locales/id.yml +132 -131
  64. data/config/locales/is.yml +131 -131
  65. data/config/locales/it.yml +131 -131
  66. data/config/locales/ja.yml +128 -131
  67. data/config/locales/ka.yml +134 -131
  68. data/config/locales/kk.yml +131 -131
  69. data/config/locales/ko.yml +13 -17
  70. data/config/locales/lt.yml +136 -131
  71. data/config/locales/lv.yml +135 -131
  72. data/config/locales/ms.yml +131 -131
  73. data/config/locales/mt.yml +133 -131
  74. data/config/locales/nl.yml +131 -131
  75. data/config/locales/no.yml +131 -131
  76. data/config/locales/pa-pk.yml +128 -132
  77. data/config/locales/pa.yml +131 -131
  78. data/config/locales/pl.yml +135 -131
  79. data/config/locales/ps.yml +128 -131
  80. data/config/locales/pt.yml +131 -131
  81. data/config/locales/ro.yml +132 -131
  82. data/config/locales/ru.yml +135 -131
  83. data/config/locales/si.yml +131 -131
  84. data/config/locales/sk.yml +136 -131
  85. data/config/locales/sl.yml +138 -131
  86. data/config/locales/so.yml +131 -131
  87. data/config/locales/sq.yml +131 -131
  88. data/config/locales/sr.yml +133 -131
  89. data/config/locales/sv.yml +131 -131
  90. data/config/locales/sw.yml +131 -131
  91. data/config/locales/ta.yml +132 -131
  92. data/config/locales/th.yml +130 -131
  93. data/config/locales/tk.yml +132 -131
  94. data/config/locales/tr.yml +132 -131
  95. data/config/locales/uk.yml +138 -131
  96. data/config/locales/ur.yml +128 -131
  97. data/config/locales/uz.yml +133 -131
  98. data/config/locales/vi.yml +131 -131
  99. data/config/locales/zh-hk.yml +130 -131
  100. data/config/locales/zh-tw.yml +130 -131
  101. data/config/locales/zh.yml +130 -131
  102. data/lib/govuk_publishing_components/presenters/contextual_navigation.rb +42 -170
  103. data/lib/govuk_publishing_components/presenters/image_card_helper.rb +11 -1
  104. data/lib/govuk_publishing_components/presenters/single_page_notification_button_helper.rb +3 -1
  105. data/lib/govuk_publishing_components/version.rb +1 -1
  106. metadata +12 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 586ea5662dfd4f3951905b244afc78556dc687bf861a05e11e56ff7d2ee172eb
4
- data.tar.gz: eab6ea6544883bc5fa511f29e589d996eabae18a6661f0772ac45356668f5396
3
+ metadata.gz: abe5f80412062a42d0581b1137f85d3c6932cb23e20d840d08a345b642133e65
4
+ data.tar.gz: 6b46ff356ab253ec47fb4ed7d67f4cd8b40c0024bedf4511e03e4416b2ee519d
5
5
  SHA512:
6
- metadata.gz: f513e048959e7e81b753583f923772b590f5c4da1841e666f4131bc79e8dea9b8cd4571cba7bab859e0d1b4683a1b10ebaa17d56cd6d3ab3a4eff68090837a1c
7
- data.tar.gz: 5f2d6aa1171a47b3074ba65b0dc5488b9269dc4f7781580df52d7d1c354559d19270bace849b39342c51e3e4ad9342a966354da39dabb6f52838de4c505f0f03
6
+ metadata.gz: 92c367ffdd7fc084e3b68fac798c1e1e51f3c37b361e6003c877b4c8839c40eaecb98ecbf20e5d65de3fe1aa8926167c557d6ef767516d3d9deacc64f32113c4
7
+ data.tar.gz: 971c347b11fdb3d12302e44deaa3bb77406b6b76d15c78e4af44c415b950aabfa688a1e9708de04eea09bf274b0484c30c27c2917392d862a1af10b013549380
@@ -6,33 +6,57 @@
6
6
 
7
7
  GOVUK.Modules.ExplicitCrossDomainLinks = function () {
8
8
  this.start = function ($module) {
9
- var element = $module[0]
9
+ this.element = $module[0]
10
+ this.attribute = 'href'
11
+ this.attributeValue = this.element.getAttribute(this.attribute)
12
+ this.eventType = 'click'
13
+ if (!this.attributeValue) {
14
+ this.attribute = 'action'
15
+ this.attributeValue = this.element.getAttribute(this.attribute)
16
+ this.eventType = 'submit'
17
+ }
10
18
 
11
- var cookieBannerEngaged = GOVUK.cookie('cookies_preferences_set')
19
+ this.handleEvent = this.handleEvent.bind(this)
20
+ this.handleCookiesAccepted = this.handleCookiesAccepted.bind(this)
21
+ // Listens for the 'submit' event if the element is a form, and the 'click' event if it is a link
22
+ this.element.addEventListener(this.eventType, this.handleEvent)
23
+ }
12
24
 
13
- // If not engaged, append only ?cookie_consent=not-engaged
14
- // If engaged and rejected, append only ?cookie_consent=reject
15
- // If engaged and accepted usage, append ?_ga=clientid if available and cookie_consent=accept
25
+ this.handleEvent = function (e) {
26
+ // prevent default: we want the link href and/or form action to be decorated before we navigate away
27
+ e.preventDefault()
28
+ var cookieBannerEngaged = GOVUK.cookie('cookies_preferences_set')
29
+ var cookieConsent = GOVUK.getConsentCookie()
16
30
 
17
31
  if (cookieBannerEngaged !== 'true') {
18
- this.decorate(element, 'cookie_consent=not-engaged')
19
- this.start = this.start.bind(this, $module)
20
-
21
- // if the user has not engaged with the cookie banner yet, listen for the cookie consent accept/reject events
22
- // re-start the module if cookies are accepted or rejected on the current page – setting cookie preferences does not reload the page
23
- window.addEventListener('cookie-consent', this.start)
24
- window.addEventListener('cookie-reject', this.start)
25
- return
32
+ // If not engaged, append only ?cookie_consent=not-engaged
33
+ this.decorate(this.element, 'cookie_consent=not-engaged', this.attribute)
34
+ } else if (cookieConsent && cookieConsent.usage === true) {
35
+ this.handleCookiesAccepted()
36
+ } else {
37
+ this.decorate(this.element, 'cookie_consent=reject', this.attribute)
26
38
  }
27
- var cookieConsent = GOVUK.getConsentCookie()
28
- if (cookieConsent && cookieConsent.usage === false) {
29
- this.decorate(element, 'cookie_consent=reject')
30
- return
39
+
40
+ // remove the event listener to avoid an infinite loop
41
+ this.element.removeEventListener(this.eventType, this.handleEvent)
42
+
43
+ // if the element is a form, submit it. If it is a link, click it
44
+ if (this.eventType === 'submit') {
45
+ this.element.submit()
46
+ } else {
47
+ this.element.click()
31
48
  }
49
+ }
32
50
 
33
- this.decorate(element, 'cookie_consent=accept')
51
+ this.handleCookiesAccepted = function () {
52
+ // If the cookie banner was engaged and usage cookie accepted, append ?_ga=clientid if available and cookie_consent=accept
53
+ var element = this.element
54
+ var attribute = this.attribute
55
+ this.decorate(element, 'cookie_consent=accept', attribute)
34
56
 
35
- if (!global.ga) { return }
57
+ if (!global.ga) {
58
+ return
59
+ }
36
60
 
37
61
  global.ga(function () {
38
62
  var trackers = global.ga.getAll()
@@ -40,44 +64,21 @@
40
64
  if (!trackers.length) { return }
41
65
 
42
66
  var linker = new global.gaplugins.Linker(trackers[0])
67
+ var attrValue = element.getAttribute(attribute)
43
68
 
44
- var attrAction = element.getAttribute('action')
45
- if (attrAction) {
46
- element.setAttribute('action', linker.decorate(attrAction))
47
- }
48
-
49
- var attrHref = element.getAttribute('href')
50
- if (attrHref) {
51
- element.href = linker.decorate(attrHref)
52
- }
69
+ element.setAttribute(attribute, linker.decorate(attrValue))
53
70
  })
54
71
  }
55
72
 
56
- this.decorate = function (element, param) {
57
- var attribute = 'href'
73
+ this.decorate = function (element, param, attribute) {
58
74
  var attributeValue = element.getAttribute(attribute)
59
- var cookieConsentParameterPattern = /cookie_consent=[^&]*/
60
- var paramIsCookieConsent = param.match(cookieConsentParameterPattern)
61
-
62
- if (!attributeValue) {
63
- attribute = 'action'
64
- attributeValue = element.getAttribute(attribute)
65
- }
66
75
 
67
76
  if (!attributeValue) { return }
68
77
 
69
- var attributeHasCookieConsent = attributeValue.match(cookieConsentParameterPattern)
70
-
71
- if (attributeHasCookieConsent && paramIsCookieConsent) {
72
- // if the decorate function has received a cookie_consent parameter, but the target element already has a cookie_consent parameter, replace the existing parameter with the new value
73
- attributeValue = attributeValue.replace(cookieConsentParameterPattern, param)
78
+ if (attributeValue.indexOf('?') !== -1) {
79
+ attributeValue += '&' + param
74
80
  } else {
75
- // otherwise, simply append the parameter to the target element href query string
76
- if (attributeValue.includes('?')) {
77
- attributeValue += '&' + param
78
- } else {
79
- attributeValue += '?' + param
80
- }
81
+ attributeValue += '?' + param
81
82
  }
82
83
 
83
84
  element.setAttribute(attribute, attributeValue)
@@ -1,4 +1,4 @@
1
- /* global GOVUK, $ */
1
+ /* global GOVUK */
2
2
 
3
3
  (function () {
4
4
  'use strict'
@@ -8,17 +8,17 @@
8
8
  PageContent.getNumberOfSections = function () {
9
9
  switch (true) {
10
10
  case isNavigationGridPage():
11
- return 1 + $('.parent-topic-contents').length
11
+ return 1 + document.querySelectorAll('.parent-topic-contents').length
12
12
  case isNavigationAccordionPage():
13
- return $('[data-track-count="accordionSection"]').length
13
+ return document.querySelectorAll('[data-track-count="accordionSection"]').length
14
14
  case isDocumentCollectionPage():
15
- return $('.document-collection .group-title').length
15
+ return document.querySelectorAll('.document-collection .group-title').length
16
16
  case isMainstreamBrowsePage():
17
- return $('#subsection ul:visible').length || $('#section ul').length
17
+ return countVisible(document.querySelectorAll('#subsection ul')) || document.querySelectorAll('#section ul').length
18
18
  case isTopicPage():
19
- return $('.topics-page nav.index-list').length
19
+ return document.querySelectorAll('.topics-page nav.index-list').length
20
20
  case isPolicyAreaPage():
21
- return $('.topic section h1.label').length
21
+ return document.querySelectorAll('.topic section h1.label').length
22
22
  case isFinderPage():
23
23
  case isWhitehallFinderPage():
24
24
  case isNavigationLeafPage():
@@ -28,8 +28,8 @@
28
28
  return 1
29
29
  default:
30
30
  // It's a content page, not a "finding" page
31
- var sidebarSections = $('[data-track-count="sidebarRelatedItemSection"]').length
32
- var sidebarTaxons = $('[data-track-count="sidebarTaxonSection"]').length
31
+ var sidebarSections = document.querySelectorAll('[data-track-count="sidebarRelatedItemSection"]').length
32
+ var sidebarTaxons = document.querySelectorAll('[data-track-count="sidebarTaxonSection"]').length
33
33
 
34
34
  return sidebarSections || sidebarTaxons
35
35
  }
@@ -38,92 +38,101 @@
38
38
  PageContent.getNumberOfLinks = function () {
39
39
  switch (true) {
40
40
  case isNavigationGridPage():
41
- return $('a[data-track-category="navGridLinkClicked"]').length +
42
- $('a[data-track-category="navGridLeafLinkClicked"]').length
41
+ return document.querySelectorAll('a[data-track-category="navGridLinkClicked"]').length +
42
+ document.querySelectorAll('a[data-track-category="navGridLeafLinkClicked"]').length
43
43
  case isNavigationAccordionPage():
44
- return $('a[data-track-category="navAccordionLinkClicked"]').length
45
- case isNavigationLeafPage():
46
- return $('a[data-track-category="navLeafLinkClicked"]').length
44
+ return document.querySelectorAll('a[data-track-category="navAccordionLinkClicked"]').length
47
45
  case isDocumentCollectionPage():
48
- return $('.document-collection .group-document-list li a').length
46
+ return document.querySelectorAll('.document-collection .group-document-list li a').length
49
47
  case isMainstreamBrowsePage():
50
- return $('#subsection ul a:visible').length ||
51
- $('#section ul a').length
48
+ return countVisible(document.querySelectorAll('#subsection ul a')) || document.querySelectorAll('#section ul a').length
52
49
  case isTopicPage():
53
- return $('.topics-page .index-list ul a').length ||
54
- $('.topics-page .topics ul a').length
50
+ return document.querySelectorAll('.topics-page .index-list ul a').length ||
51
+ document.querySelectorAll('.topics-page .topics ul a').length
55
52
  case isPolicyAreaPage():
56
- return $('section.document-block a').length +
57
- $('section .collection-list h2 a').length
58
- case isWhitehallFinderPage():
59
- return $('.document-list .document-row h3 a').length
53
+ return document.querySelectorAll('section.document-block a').length +
54
+ document.querySelectorAll('section .collection-list h2 a').length
60
55
  case isFinderPage():
61
- return $('.finder-frontend-content li.document a').length
56
+ return document.querySelectorAll('.finder-frontend-content li.document a').length
57
+ case isWhitehallFinderPage():
58
+ return document.querySelectorAll('.document-list .document-row h3 a').length
59
+ case isNavigationLeafPage():
60
+ return document.querySelectorAll('a[data-track-category="navLeafLinkClicked"]').length
62
61
  default:
63
62
  // It's a content page, not a "finding" page, count related links
64
- return $('a[data-track-category="relatedLinkClicked"]').length
63
+ return document.querySelectorAll('a[data-track-category="relatedLinkClicked"]').length
65
64
  }
66
65
  }
67
66
 
68
- function getRenderingApplication () {
69
- return $('meta[name="govuk:rendering-application"]').attr('content')
70
- };
71
-
72
- function getFormat () {
73
- return $('meta[name="govuk:format"]').attr('content')
74
- };
67
+ var metaApplicationSelector = 'meta[name="govuk:rendering-application"]'
68
+ var metaFormatSelector = 'meta[name="govuk:format"]'
69
+ var metaNavigationTypeSelector = 'meta[name="govuk:navigation-page-type"]'
75
70
 
76
- function getNavigationPageType () {
77
- return $('meta[name="govuk:navigation-page-type"]').attr('content')
78
- };
71
+ function getMetaAttribute (selector) {
72
+ var element = document.querySelector(selector)
73
+ if (element) {
74
+ return element.getAttribute('content')
75
+ }
76
+ }
79
77
 
80
78
  function isNavigationGridPage () {
81
- return getRenderingApplication() === 'collections' &&
82
- getFormat() === 'taxon' &&
83
- getNavigationPageType() === 'grid'
84
- };
79
+ return getMetaAttribute(metaApplicationSelector) === 'collections' &&
80
+ getMetaAttribute(metaFormatSelector) === 'taxon' &&
81
+ getMetaAttribute(metaNavigationTypeSelector) === 'grid'
82
+ }
85
83
 
86
84
  function isNavigationAccordionPage () {
87
- return getRenderingApplication() === 'collections' &&
88
- getFormat() === 'taxon' &&
89
- getNavigationPageType() === 'accordion'
90
- };
85
+ return getMetaAttribute(metaApplicationSelector) === 'collections' &&
86
+ getMetaAttribute(metaFormatSelector) === 'taxon' &&
87
+ getMetaAttribute(metaNavigationTypeSelector) === 'accordion'
88
+ }
91
89
 
92
90
  function isNavigationLeafPage () {
93
- return getRenderingApplication() === 'collections' &&
94
- getFormat() === 'taxon' &&
95
- getNavigationPageType() === 'leaf'
96
- };
91
+ return getMetaAttribute(metaApplicationSelector) === 'collections' &&
92
+ getMetaAttribute(metaFormatSelector) === 'taxon' &&
93
+ getMetaAttribute(metaNavigationTypeSelector) === 'leaf'
94
+ }
97
95
 
98
96
  function isMainstreamBrowsePage () {
99
- return getRenderingApplication() === 'collections' &&
100
- getFormat() === 'mainstream_browse_page'
101
- };
97
+ return getMetaAttribute(metaApplicationSelector) === 'collections' &&
98
+ getMetaAttribute(metaFormatSelector) === 'mainstream_browse_page'
99
+ }
102
100
 
103
101
  function isTopicPage () {
104
- return getRenderingApplication() === 'collections' &&
105
- getFormat() === 'topic'
106
- };
102
+ return getMetaAttribute(metaApplicationSelector) === 'collections' &&
103
+ getMetaAttribute(metaFormatSelector) === 'topic'
104
+ }
107
105
 
108
106
  function isPolicyAreaPage () {
109
- return getRenderingApplication() === 'whitehall' &&
110
- getFormat() === 'placeholder_policy_area'
111
- };
107
+ return getMetaAttribute(metaApplicationSelector) === 'whitehall' &&
108
+ getMetaAttribute(metaFormatSelector) === 'placeholder_policy_area'
109
+ }
112
110
 
113
111
  function isDocumentCollectionPage () {
114
- return getRenderingApplication() === 'government-frontend' &&
115
- getFormat() === 'document_collection'
116
- };
112
+ return getMetaAttribute(metaApplicationSelector) === 'government-frontend' &&
113
+ getMetaAttribute(metaFormatSelector) === 'document_collection'
114
+ }
117
115
 
118
116
  function isFinderPage () {
119
- return getRenderingApplication() === 'finder-frontend' &&
120
- getFormat() === 'finder'
121
- };
117
+ return getMetaAttribute(metaApplicationSelector) === 'finder-frontend' &&
118
+ getMetaAttribute(metaFormatSelector) === 'finder'
119
+ }
122
120
 
123
121
  function isWhitehallFinderPage () {
124
- return getRenderingApplication() === 'whitehall' &&
125
- getFormat() === 'finder'
126
- };
122
+ return getMetaAttribute(metaApplicationSelector) === 'whitehall' &&
123
+ getMetaAttribute(metaFormatSelector) === 'finder'
124
+ }
125
+
126
+ function countVisible (elements) {
127
+ var count = 0
128
+ for (var i = 0; i < elements.length; i++) {
129
+ var style = window.getComputedStyle(elements[i])
130
+ if (!(style.display === 'none' || style.visibility === 'hidden')) {
131
+ count++
132
+ }
133
+ }
134
+ return count
135
+ }
127
136
 
128
137
  GOVUK.PageContent = PageContent
129
138
  })()
@@ -97,7 +97,6 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
97
97
  this.$module.cookieBannerConfirmationMessage.focus()
98
98
  window.GOVUK.cookie('cookies_preferences_set', 'true', { days: 365 })
99
99
  window.GOVUK.setDefaultConsentCookie()
100
- window.GOVUK.triggerEvent(window, 'cookie-reject')
101
100
  }
102
101
 
103
102
  CookieBanner.prototype.showConfirmationMessage = function () {
@@ -7,6 +7,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
7
7
  this.$module = $module
8
8
  this.basePath = this.$module.querySelector('input[name="base_path"]').value
9
9
  this.buttonLocation = this.$module.getAttribute('data-button-location')
10
+ this.buttonVisibleClass = 'gem-c-single-page-notification-button--visible'
10
11
 
11
12
  this.personalisationEndpoint = '/api/personalisation/check-email-subscription?base_path=' + this.basePath
12
13
  // This attribute is passed through to the personalisation API to ensure the updated button has the same button_location for analytics
@@ -16,21 +17,30 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
16
17
  SinglePageNotificationButton.prototype.init = function () {
17
18
  var xhr = new XMLHttpRequest()
18
19
  xhr.open('GET', this.personalisationEndpoint, true)
20
+ // if XHR to the personalisation endpoint is taking an incredibly long time to complete, we are better off leaving the button in its default unpersonalised state. Content changing before the user's eyes while they are browsing can be jarring and should be avoided.
21
+ xhr.timeout = 10000
22
+
23
+ xhr.ontimeout = function () {
24
+ this.makeVisible(this.$module)
25
+ }.bind(this)
19
26
 
20
27
  xhr.onreadystatechange = function () {
21
- if (xhr.readyState === 4 && xhr.status === 200) {
22
- var responseText = xhr.responseText
23
- // if response text exists and is JSON parse-able, parse the response and get the button html
24
- if (responseText && this.responseIsJSON(responseText)) {
25
- var newButton = JSON.parse(responseText).button_html
26
- var html = document.createElement('div')
27
- html.innerHTML = newButton
28
- // test that the html returned contains the button component; if yes, swap the button for the updated version
29
- var responseButtonContainer = html.querySelector('form.gem-c-single-page-notification-button')
30
- if (responseButtonContainer) {
31
- this.$module.parentNode.replaceChild(responseButtonContainer, this.$module)
28
+ if (xhr.readyState === 4) {
29
+ if (xhr.status === 200) {
30
+ var responseText = xhr.responseText
31
+ // if response text exists and is JSON parse-able, parse the response and get the button html
32
+ if (responseText && this.responseIsJSON(responseText)) {
33
+ var newButton = JSON.parse(responseText).button_html
34
+ var html = document.createElement('div')
35
+ html.innerHTML = newButton
36
+ // test that the html returned contains the button component; if yes, swap the button for the updated version
37
+ var responseButtonContainer = html.querySelector('form.gem-c-single-page-notification-button')
38
+ if (responseButtonContainer) {
39
+ this.$module.parentNode.replaceChild(responseButtonContainer, this.$module)
40
+ }
32
41
  }
33
42
  }
43
+ this.makeVisible(this.$module)
34
44
  }
35
45
  }.bind(this)
36
46
  xhr.send()
@@ -44,5 +54,9 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
44
54
  }
45
55
  return true
46
56
  }
57
+
58
+ SinglePageNotificationButton.prototype.makeVisible = function (target) {
59
+ target.classList.add(this.buttonVisibleClass)
60
+ }
47
61
  Modules.SinglePageNotificationButton = SinglePageNotificationButton
48
62
  })(window.GOVUK.Modules)
@@ -68,6 +68,7 @@ $govuk-new-link-styles: true;
68
68
  @import "components/select";
69
69
  @import "components/share-links";
70
70
  @import "components/show-password";
71
+ @import "components/signup-link";
71
72
  @import "components/single-page-notification-button";
72
73
  @import "components/skip-link";
73
74
  @import "components/step-by-step-nav-header";
@@ -15,12 +15,7 @@
15
15
  }
16
16
 
17
17
  .gem-c-big-number__label {
18
- font-size: 16px;
19
- @include govuk-typography-weight-bold;
20
-
21
- @if $govuk-typography-use-rem {
22
- font-size: govuk-px-to-rem(16px);
23
- }
18
+ @include govuk-font($size: 19, $weight: bold);
24
19
 
25
20
  // This pseudo element is to bypass an issue with NVDA where block level elements are dictated separately.
26
21
  // What's happening here is that the label and the number technically have an inline relationship but appear to have a block relationship thanks to this element
@@ -1,31 +1,36 @@
1
1
  $transition-campaign-red: #ff003b;
2
+ $covid-colour: $govuk-link-colour;
2
3
 
3
- .gem-c-contextual-sidebar__brexit-related-links {
4
+ .gem-c-contextual-sidebar__related-links {
4
5
  border-top: 2px solid $govuk-brand-colour;
5
6
  }
6
7
 
7
- .gem-c-contextual-sidebar__brexit-heading {
8
+ .gem-c-contextual-sidebar__heading {
8
9
  margin-top: govuk-spacing(3);
9
10
  margin-bottom: govuk-spacing(2);
11
+ color: $govuk-text-colour;
10
12
  }
11
13
 
12
- .gem-c-contextual-sidebar__brexit-cta {
14
+ .gem-c-contextual-sidebar__text {
15
+ @include govuk-font(16);
16
+ margin-bottom: govuk-spacing(1);
17
+ @include govuk-media-query($from: tablet) {
18
+ margin-bottom: govuk-spacing(2);
19
+ }
20
+ }
21
+
22
+ .gem-c-contextual-sidebar__cta {
13
23
  margin-bottom: govuk-spacing(6);
14
24
  background-color: govuk-colour('light-grey', $legacy: 'grey-4');
15
- border-top: 2px solid $transition-campaign-red;
16
25
  display: block;
17
26
  padding: 0 govuk-spacing(3) govuk-spacing(3);
18
27
  text-decoration: none;
28
+ }
19
29
 
20
- .gem-c-contextual-sidebar__brexit-heading {
21
- color: $govuk-text-colour;
22
- }
30
+ .gem-c-contextual-sidebar__cta--brexit {
31
+ border-top: 2px solid $transition-campaign-red;
32
+ }
23
33
 
24
- .gem-c-contextual-sidebar__brexit-text {
25
- @include govuk-font(16);
26
- margin-bottom: govuk-spacing(1);
27
- @include govuk-media-query($from: tablet) {
28
- margin-bottom: govuk-spacing(2);
29
- }
30
- }
34
+ .gem-c-contextual-sidebar__cta--covid {
35
+ border-top: 2px solid $covid-colour;
31
36
  }
@@ -45,17 +45,21 @@
45
45
  }
46
46
 
47
47
  .gem-c-image-card__image-wrapper {
48
- @include govuk-grid-column($width: one-third, $at: mobile);
48
+ @include govuk-grid-column($width: one-half, $at: mobile);
49
49
  }
50
50
 
51
51
  .gem-c-image-card__text-wrapper {
52
- @include govuk-grid-column($width: two-thirds, $at: mobile);
52
+ @include govuk-grid-column($width: one-half, $at: mobile);
53
53
  }
54
54
  }
55
55
 
56
56
  .gem-c-image-card__image {
57
57
  display: block;
58
58
  max-width: 100%;
59
+ border-top: 1px solid $govuk-border-colour;
60
+ border-left: none;
61
+ border-right: none;
62
+ border-bottom: none;
59
63
  }
60
64
 
61
65
  .gem-c-image-card__title {
@@ -100,7 +104,13 @@
100
104
 
101
105
  .gem-c-image-card__context,
102
106
  .gem-c-image-card__metadata {
103
- @include govuk-font(14);
107
+ @include govuk-font($size: false);
108
+ font-size: 16px;
109
+
110
+ @if $govuk-typography-use-rem {
111
+ font-size: govuk-px-to-rem(16px);
112
+ }
113
+
104
114
  margin: 0 0 (govuk-spacing(3) / 2);
105
115
  color: govuk-colour("dark-grey", $legacy: "grey-1");
106
116
 
@@ -110,13 +120,13 @@
110
120
  }
111
121
 
112
122
  .gem-c-image-card__description {
113
- @include govuk-font($size: 16);
123
+ @include govuk-font($size: 19);
114
124
  padding-top: (govuk-spacing(3) / 2);
115
125
  word-wrap: break-word;
116
126
  }
117
127
 
118
128
  .gem-c-image-card__list {
119
- @include govuk-font($size: 16);
129
+ @include govuk-font($size: 19);
120
130
  position: relative;
121
131
  z-index: 2;
122
132
  padding: (govuk-spacing(3) / 2) 0 0 0;
@@ -160,7 +170,7 @@
160
170
 
161
171
  .gem-c-image-card--large {
162
172
  .gem-c-image-card__image-wrapper {
163
- @include govuk-grid-column($width: two-thirds, $at: tablet);
173
+ @include govuk-grid-column($width: one-half, $at: tablet);
164
174
 
165
175
  margin-bottom: govuk-spacing(2);
166
176
  float: none;
@@ -175,7 +185,7 @@
175
185
  }
176
186
 
177
187
  .gem-c-image-card__text-wrapper {
178
- @include govuk-grid-column($width: one-third, $at: tablet);
188
+ @include govuk-grid-column($width: one-half, $at: tablet);
179
189
 
180
190
  padding: 0;
181
191
  overflow: hidden;