govuk_publishing_components 32.1.0 → 35.0.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 (496) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/assets/config/govuk_publishing_components_manifest.js +75 -1
  4. data/app/assets/images/govuk_publishing_components/icon-search.svg +3 -0
  5. data/app/assets/images/govuk_publishing_components/youtube-play-icon.png +0 -0
  6. data/app/assets/images/govuk_publishing_components/youtube-play-icon.svg +4 -0
  7. data/app/assets/javascripts/component_guide/accessibility-test.js +0 -1
  8. data/app/assets/javascripts/govuk_publishing_components/analytics/auto-scroll-tracker.js +2 -1
  9. data/app/assets/javascripts/govuk_publishing_components/analytics/linked-domains.js +135 -0
  10. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-auto-tracker.js +49 -0
  11. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js +341 -27
  12. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-ecommerce-tracker.js +17 -92
  13. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-event-tracker.js +11 -23
  14. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-form-tracker.js +121 -0
  15. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-link-tracker.js +86 -305
  16. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-page-views.js +13 -6
  17. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-schemas.js +31 -1
  18. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-smart-answer-results-tracker.js +57 -0
  19. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-specialist-link-tracker.js +131 -0
  20. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/init-ga4.js +9 -4
  21. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/pii-remover.js +4 -2
  22. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4.js +4 -0
  23. data/app/assets/javascripts/govuk_publishing_components/components/accordion.js +12 -1
  24. data/app/assets/javascripts/govuk_publishing_components/components/cookie-banner.js +2 -2
  25. data/app/assets/javascripts/govuk_publishing_components/components/image-card.js +19 -0
  26. data/app/assets/javascripts/govuk_publishing_components/components/layout-super-navigation-header.js +2 -81
  27. data/app/assets/javascripts/govuk_publishing_components/components/single-page-notification-button.js +24 -8
  28. data/app/assets/javascripts/govuk_publishing_components/components/step-by-step-nav.js +23 -1
  29. data/app/assets/javascripts/govuk_publishing_components/dependencies.js +13 -0
  30. data/app/assets/javascripts/govuk_publishing_components/lib/govspeak/youtube-link-enhancement.js +3 -2
  31. data/app/assets/javascripts/govuk_publishing_components/lib/trigger-event.js +1 -0
  32. data/app/assets/javascripts/govuk_publishing_components/load-analytics.js +116 -0
  33. data/app/assets/javascripts/govuk_publishing_components/modules.js +7 -2
  34. data/app/assets/javascripts/govuk_publishing_components/vendor/lux/lux-reporter.js +140 -191
  35. data/app/assets/stylesheets/govuk_publishing_components/_individual_component_support.scss +10 -0
  36. data/app/assets/stylesheets/govuk_publishing_components/components/_accordion.scss +29 -0
  37. data/app/assets/stylesheets/govuk_publishing_components/components/_action-link.scss +2 -0
  38. data/app/assets/stylesheets/govuk_publishing_components/components/_attachment.scss +2 -0
  39. data/app/assets/stylesheets/govuk_publishing_components/components/_back-link.scss +1 -0
  40. data/app/assets/stylesheets/govuk_publishing_components/components/_big-number.scss +4 -5
  41. data/app/assets/stylesheets/govuk_publishing_components/components/_breadcrumbs.scss +1 -0
  42. data/app/assets/stylesheets/govuk_publishing_components/components/_button.scss +12 -0
  43. data/app/assets/stylesheets/govuk_publishing_components/components/_cards.scss +20 -0
  44. data/app/assets/stylesheets/govuk_publishing_components/components/_character-count.scss +1 -0
  45. data/app/assets/stylesheets/govuk_publishing_components/components/_checkboxes.scss +1 -0
  46. data/app/assets/stylesheets/govuk_publishing_components/components/_contents-list.scss +21 -0
  47. data/app/assets/stylesheets/govuk_publishing_components/components/_contextual-guidance.scss +2 -0
  48. data/app/assets/stylesheets/govuk_publishing_components/components/_contextual-sidebar.scss +2 -0
  49. data/app/assets/stylesheets/govuk_publishing_components/components/_cookie-banner.scss +7 -0
  50. data/app/assets/stylesheets/govuk_publishing_components/components/_date-input.scss +1 -0
  51. data/app/assets/stylesheets/govuk_publishing_components/components/_details.scss +1 -0
  52. data/app/assets/stylesheets/govuk_publishing_components/components/_devolved-nations.scss +2 -0
  53. data/app/assets/stylesheets/govuk_publishing_components/components/_document-list.scss +8 -0
  54. data/app/assets/stylesheets/govuk_publishing_components/components/_emergency-banner.scss +8 -0
  55. data/app/assets/stylesheets/govuk_publishing_components/components/_error-alert.scss +2 -0
  56. data/app/assets/stylesheets/govuk_publishing_components/components/_error-message.scss +1 -0
  57. data/app/assets/stylesheets/govuk_publishing_components/components/_error-summary.scss +1 -0
  58. data/app/assets/stylesheets/govuk_publishing_components/components/_feedback.scss +17 -19
  59. data/app/assets/stylesheets/govuk_publishing_components/components/_fieldset.scss +1 -0
  60. data/app/assets/stylesheets/govuk_publishing_components/components/_file-upload.scss +1 -0
  61. data/app/assets/stylesheets/govuk_publishing_components/components/_govspeak-html-publication.scss +10 -0
  62. data/app/assets/stylesheets/govuk_publishing_components/components/_govspeak.scss +85 -0
  63. data/app/assets/stylesheets/govuk_publishing_components/components/_heading.scss +2 -0
  64. data/app/assets/stylesheets/govuk_publishing_components/components/_hint.scss +1 -0
  65. data/app/assets/stylesheets/govuk_publishing_components/components/_image-card.scss +85 -6
  66. data/app/assets/stylesheets/govuk_publishing_components/components/_input.scss +6 -6
  67. data/app/assets/stylesheets/govuk_publishing_components/components/_inset-text.scss +1 -0
  68. data/app/assets/stylesheets/govuk_publishing_components/components/_intervention.scss +2 -0
  69. data/app/assets/stylesheets/govuk_publishing_components/components/_inverse-header.scss +2 -0
  70. data/app/assets/stylesheets/govuk_publishing_components/components/_label.scss +1 -0
  71. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-footer.scss +1 -0
  72. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-for-public.scss +2 -0
  73. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +253 -483
  74. data/app/assets/stylesheets/govuk_publishing_components/components/_lead-paragraph.scss +2 -0
  75. data/app/assets/stylesheets/govuk_publishing_components/components/_metadata.scss +2 -0
  76. data/app/assets/stylesheets/govuk_publishing_components/components/_modal-dialogue.scss +2 -0
  77. data/app/assets/stylesheets/govuk_publishing_components/components/_notice.scss +1 -0
  78. data/app/assets/stylesheets/govuk_publishing_components/components/_organisation-logo.scss +2 -0
  79. data/app/assets/stylesheets/govuk_publishing_components/components/_panel.scss +1 -0
  80. data/app/assets/stylesheets/govuk_publishing_components/components/_phase-banner.scss +1 -0
  81. data/app/assets/stylesheets/govuk_publishing_components/components/_previous-and-next-navigation.scss +1 -0
  82. data/app/assets/stylesheets/govuk_publishing_components/components/_print-link.scss +2 -0
  83. data/app/assets/stylesheets/govuk_publishing_components/components/_radio.scss +1 -0
  84. data/app/assets/stylesheets/govuk_publishing_components/components/_related-navigation.scss +2 -0
  85. data/app/assets/stylesheets/govuk_publishing_components/components/_reorderable-list.scss +2 -0
  86. data/app/assets/stylesheets/govuk_publishing_components/components/_search.scss +2 -7
  87. data/app/assets/stylesheets/govuk_publishing_components/components/_select.scss +1 -0
  88. data/app/assets/stylesheets/govuk_publishing_components/components/_share-links.scss +2 -0
  89. data/app/assets/stylesheets/govuk_publishing_components/components/_show-password.scss +2 -0
  90. data/app/assets/stylesheets/govuk_publishing_components/components/_signup-link.scss +2 -0
  91. data/app/assets/stylesheets/govuk_publishing_components/components/_single-page-notification-button.scss +2 -0
  92. data/app/assets/stylesheets/govuk_publishing_components/components/_skip-link.scss +1 -0
  93. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav-header.scss +17 -0
  94. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav-related.scss +2 -0
  95. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav.scss +8 -0
  96. data/app/assets/stylesheets/govuk_publishing_components/components/_subscription-links.scss +2 -1
  97. data/app/assets/stylesheets/govuk_publishing_components/components/_success-alert.scss +1 -0
  98. data/app/assets/stylesheets/govuk_publishing_components/components/_summary-list.scss +1 -0
  99. data/app/assets/stylesheets/govuk_publishing_components/components/_table.scss +1 -0
  100. data/app/assets/stylesheets/govuk_publishing_components/components/_tabs.scss +1 -0
  101. data/app/assets/stylesheets/govuk_publishing_components/components/_textarea.scss +17 -0
  102. data/app/assets/stylesheets/govuk_publishing_components/components/_title.scss +12 -0
  103. data/app/assets/stylesheets/govuk_publishing_components/components/_translation-nav.scss +2 -0
  104. data/app/assets/stylesheets/govuk_publishing_components/components/_warning-text.scss +1 -0
  105. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_steps.scss +26 -9
  106. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_tables.scss +12 -0
  107. data/app/assets/stylesheets/govuk_publishing_components/components/helpers/_brand-colours.scss +2 -2
  108. data/app/assets/stylesheets/govuk_publishing_components/components/helpers/_contents-list-helper.scss +0 -1
  109. data/app/controllers/govuk_publishing_components/application_controller.rb +0 -13
  110. data/app/controllers/govuk_publishing_components/audit_controller.rb +1 -1
  111. data/app/controllers/govuk_publishing_components/component_guide_controller.rb +6 -9
  112. data/app/models/govuk_publishing_components/audit_applications.rb +10 -19
  113. data/app/models/govuk_publishing_components/audit_comparer.rb +29 -24
  114. data/app/models/govuk_publishing_components/audit_components.rb +157 -82
  115. data/app/models/govuk_publishing_components/component_doc.rb +14 -0
  116. data/app/models/govuk_publishing_components/component_wrapper_helper_options.rb +15 -0
  117. data/app/views/govuk_publishing_components/audit/_applications.html.erb +3 -3
  118. data/app/views/govuk_publishing_components/audit/_component_contents.html.erb +47 -39
  119. data/app/views/govuk_publishing_components/audit/_components.html.erb +47 -2
  120. data/app/views/govuk_publishing_components/component_guide/_application_stylesheet.html.erb +0 -3
  121. data/app/views/govuk_publishing_components/component_guide/index.html.erb +0 -7
  122. data/app/views/govuk_publishing_components/component_guide/show.html.erb +21 -6
  123. data/app/views/govuk_publishing_components/components/_accordion.html.erb +30 -36
  124. data/app/views/govuk_publishing_components/components/_action_link.html.erb +7 -2
  125. data/app/views/govuk_publishing_components/components/_attachment.html.erb +2 -0
  126. data/app/views/govuk_publishing_components/components/_attachment_link.html.erb +2 -0
  127. data/app/views/govuk_publishing_components/components/_back_link.html.erb +2 -0
  128. data/app/views/govuk_publishing_components/components/_big_number.html.erb +3 -1
  129. data/app/views/govuk_publishing_components/components/_breadcrumbs.html.erb +8 -2
  130. data/app/views/govuk_publishing_components/components/_button.html.erb +2 -0
  131. data/app/views/govuk_publishing_components/components/_cards.html.erb +6 -4
  132. data/app/views/govuk_publishing_components/components/_character_count.html.erb +2 -0
  133. data/app/views/govuk_publishing_components/components/_checkboxes.html.erb +6 -2
  134. data/app/views/govuk_publishing_components/components/_contents_list.html.erb +11 -15
  135. data/app/views/govuk_publishing_components/components/_contextual_breadcrumbs.html.erb +7 -4
  136. data/app/views/govuk_publishing_components/components/_contextual_footer.html.erb +2 -0
  137. data/app/views/govuk_publishing_components/components/_contextual_guidance.html.erb +2 -0
  138. data/app/views/govuk_publishing_components/components/_contextual_sidebar.html.erb +13 -6
  139. data/app/views/govuk_publishing_components/components/_cookie_banner.html.erb +12 -6
  140. data/app/views/govuk_publishing_components/components/_date_input.html.erb +2 -0
  141. data/app/views/govuk_publishing_components/components/_details.html.erb +5 -1
  142. data/app/views/govuk_publishing_components/components/_devolved_nations.html.erb +2 -0
  143. data/app/views/govuk_publishing_components/components/_document_list.html.erb +3 -0
  144. data/app/views/govuk_publishing_components/components/_emergency_banner.html.erb +2 -0
  145. data/app/views/govuk_publishing_components/components/_error_alert.html.erb +2 -0
  146. data/app/views/govuk_publishing_components/components/_error_message.html.erb +4 -1
  147. data/app/views/govuk_publishing_components/components/_error_summary.html.erb +29 -26
  148. data/app/views/govuk_publishing_components/components/_feedback.html.erb +2 -0
  149. data/app/views/govuk_publishing_components/components/_fieldset.html.erb +2 -0
  150. data/app/views/govuk_publishing_components/components/_file_upload.html.erb +2 -0
  151. data/app/views/govuk_publishing_components/components/_google_tag_manager_script.html.erb +2 -2
  152. data/app/views/govuk_publishing_components/components/_govspeak.html.erb +1 -0
  153. data/app/views/govuk_publishing_components/components/_govspeak_html_publication.html.erb +2 -0
  154. data/app/views/govuk_publishing_components/components/_heading.html.erb +2 -0
  155. data/app/views/govuk_publishing_components/components/_hint.html.erb +4 -1
  156. data/app/views/govuk_publishing_components/components/_image_card.html.erb +17 -12
  157. data/app/views/govuk_publishing_components/components/_input.html.erb +10 -2
  158. data/app/views/govuk_publishing_components/components/_inset_text.html.erb +2 -0
  159. data/app/views/govuk_publishing_components/components/_intervention.html.erb +2 -0
  160. data/app/views/govuk_publishing_components/components/_inverse_header.html.erb +2 -0
  161. data/app/views/govuk_publishing_components/components/_label.html.erb +7 -3
  162. data/app/views/govuk_publishing_components/components/_layout_footer.html.erb +2 -0
  163. data/app/views/govuk_publishing_components/components/_layout_for_admin.html.erb +8 -5
  164. data/app/views/govuk_publishing_components/components/_layout_for_public.html.erb +8 -3
  165. data/app/views/govuk_publishing_components/components/_layout_header.html.erb +2 -0
  166. data/app/views/govuk_publishing_components/components/_layout_super_navigation_header.html.erb +238 -267
  167. data/app/views/govuk_publishing_components/components/_lead_paragraph.html.erb +2 -0
  168. data/app/views/govuk_publishing_components/components/_metadata.html.erb +2 -0
  169. data/app/views/govuk_publishing_components/components/_modal_dialogue.html.erb +2 -0
  170. data/app/views/govuk_publishing_components/components/_notice.html.erb +2 -0
  171. data/app/views/govuk_publishing_components/components/_organisation_logo.html.erb +2 -0
  172. data/app/views/govuk_publishing_components/components/_panel.html.erb +2 -0
  173. data/app/views/govuk_publishing_components/components/_phase_banner.html.erb +3 -1
  174. data/app/views/govuk_publishing_components/components/_previous_and_next_navigation.html.erb +6 -1
  175. data/app/views/govuk_publishing_components/components/_print_link.html.erb +2 -0
  176. data/app/views/govuk_publishing_components/components/_radio.html.erb +2 -0
  177. data/app/views/govuk_publishing_components/components/_related_navigation.html.erb +16 -6
  178. data/app/views/govuk_publishing_components/components/_reorderable_list.html.erb +2 -0
  179. data/app/views/govuk_publishing_components/components/_search.html.erb +2 -0
  180. data/app/views/govuk_publishing_components/components/_select.html.erb +2 -0
  181. data/app/views/govuk_publishing_components/components/_share_links.html.erb +13 -13
  182. data/app/views/govuk_publishing_components/components/_show_password.html.erb +2 -0
  183. data/app/views/govuk_publishing_components/components/_signup_link.html.erb +2 -0
  184. data/app/views/govuk_publishing_components/components/_single_page_notification_button.html.erb +8 -2
  185. data/app/views/govuk_publishing_components/components/_skip_link.html.erb +2 -0
  186. data/app/views/govuk_publishing_components/components/_step_by_step_nav.html.erb +8 -1
  187. data/app/views/govuk_publishing_components/components/_step_by_step_nav_header.html.erb +12 -2
  188. data/app/views/govuk_publishing_components/components/_step_by_step_nav_related.html.erb +21 -8
  189. data/app/views/govuk_publishing_components/components/_subscription_links.html.erb +3 -1
  190. data/app/views/govuk_publishing_components/components/_success_alert.html.erb +2 -0
  191. data/app/views/govuk_publishing_components/components/_summary_list.html.erb +2 -0
  192. data/app/views/govuk_publishing_components/components/_table.html.erb +3 -1
  193. data/app/views/govuk_publishing_components/components/_tabs.html.erb +22 -2
  194. data/app/views/govuk_publishing_components/components/_textarea.html.erb +12 -2
  195. data/app/views/govuk_publishing_components/components/_title.html.erb +2 -0
  196. data/app/views/govuk_publishing_components/components/_translation_nav.html.erb +2 -0
  197. data/app/views/govuk_publishing_components/components/_warning_text.html.erb +2 -0
  198. data/app/views/govuk_publishing_components/components/contextual_sidebar/_ukraine_cta.html.erb +16 -6
  199. data/app/views/govuk_publishing_components/components/docs/accordion.yml +16 -3
  200. data/app/views/govuk_publishing_components/components/docs/action_link.yml +1 -0
  201. data/app/views/govuk_publishing_components/components/docs/breadcrumbs.yml +2 -1
  202. data/app/views/govuk_publishing_components/components/docs/button.yml +10 -0
  203. data/app/views/govuk_publishing_components/components/docs/cards.yml +1 -0
  204. data/app/views/govuk_publishing_components/components/docs/checkboxes.yml +1 -0
  205. data/app/views/govuk_publishing_components/components/docs/contents_list.yml +1 -12
  206. data/app/views/govuk_publishing_components/components/docs/contextual_breadcrumbs.yml +13 -0
  207. data/app/views/govuk_publishing_components/components/docs/contextual_footer.yml +43 -0
  208. data/app/views/govuk_publishing_components/components/docs/contextual_sidebar.yml +65 -0
  209. data/app/views/govuk_publishing_components/components/docs/details.yml +17 -0
  210. data/app/views/govuk_publishing_components/components/docs/document_list.yml +18 -1
  211. data/app/views/govuk_publishing_components/components/docs/emergency_banner.yml +3 -1
  212. data/app/views/govuk_publishing_components/components/docs/error_message.yml +13 -0
  213. data/app/views/govuk_publishing_components/components/docs/govspeak.yml +22 -1
  214. data/app/views/govuk_publishing_components/components/docs/hint.yml +6 -0
  215. data/app/views/govuk_publishing_components/components/docs/image_card.yml +24 -1
  216. data/app/views/govuk_publishing_components/components/docs/input.yml +32 -0
  217. data/app/views/govuk_publishing_components/components/docs/intervention.yml +2 -1
  218. data/app/views/govuk_publishing_components/components/docs/label.yml +17 -0
  219. data/app/views/govuk_publishing_components/components/docs/layout_header.yml +1 -0
  220. data/app/views/govuk_publishing_components/components/docs/previous_and_next_navigation.yml +2 -0
  221. data/app/views/govuk_publishing_components/components/docs/related_navigation.yml +47 -0
  222. data/app/views/govuk_publishing_components/components/docs/share_links.yml +59 -30
  223. data/app/views/govuk_publishing_components/components/docs/single_page_notification_button.yml +16 -1
  224. data/app/views/govuk_publishing_components/components/docs/step_by_step_nav.yml +54 -0
  225. data/app/views/govuk_publishing_components/components/docs/step_by_step_nav_header.yml +6 -0
  226. data/app/views/govuk_publishing_components/components/docs/step_by_step_nav_related.yml +10 -0
  227. data/app/views/govuk_publishing_components/components/docs/tabs.yml +15 -0
  228. data/app/views/govuk_publishing_components/components/docs/textarea.yml +31 -0
  229. data/app/views/govuk_publishing_components/components/docs/translation_nav.yml +2 -0
  230. data/app/views/govuk_publishing_components/components/feedback/_problem_form.html.erb +3 -3
  231. data/app/views/govuk_publishing_components/components/feedback/_survey_signup_form.html.erb +1 -1
  232. data/app/views/govuk_publishing_components/components/feedback/_yes_no_banner.html.erb +4 -5
  233. data/app/views/govuk_publishing_components/components/metadata/_sentence.html.erb +4 -2
  234. data/app/views/govuk_publishing_components/components/related_navigation/_section.html.erb +36 -16
  235. data/app/views/layouts/govuk_publishing_components/application.html.erb +3 -4
  236. data/config/locales/ar.yml +14 -14
  237. data/config/locales/az.yml +15 -14
  238. data/config/locales/be.yml +14 -14
  239. data/config/locales/bg.yml +14 -14
  240. data/config/locales/bn.yml +14 -14
  241. data/config/locales/cs.yml +14 -14
  242. data/config/locales/cy.yml +14 -14
  243. data/config/locales/da.yml +14 -14
  244. data/config/locales/de.yml +14 -14
  245. data/config/locales/dr.yml +14 -14
  246. data/config/locales/el.yml +14 -14
  247. data/config/locales/en.yml +21 -28
  248. data/config/locales/es-419.yml +14 -14
  249. data/config/locales/es.yml +14 -14
  250. data/config/locales/et.yml +14 -14
  251. data/config/locales/fa.yml +15 -14
  252. data/config/locales/fi.yml +14 -14
  253. data/config/locales/fr.yml +14 -14
  254. data/config/locales/gd.yml +14 -14
  255. data/config/locales/gu.yml +14 -14
  256. data/config/locales/he.yml +14 -14
  257. data/config/locales/hi.yml +14 -14
  258. data/config/locales/hr.yml +14 -14
  259. data/config/locales/hu.yml +14 -14
  260. data/config/locales/hy.yml +14 -14
  261. data/config/locales/id.yml +14 -14
  262. data/config/locales/is.yml +14 -14
  263. data/config/locales/it.yml +14 -14
  264. data/config/locales/ja.yml +14 -14
  265. data/config/locales/ka.yml +14 -14
  266. data/config/locales/kk.yml +14 -14
  267. data/config/locales/ko.yml +14 -14
  268. data/config/locales/lt.yml +14 -14
  269. data/config/locales/lv.yml +14 -14
  270. data/config/locales/ms.yml +14 -14
  271. data/config/locales/mt.yml +14 -14
  272. data/config/locales/nl.yml +14 -14
  273. data/config/locales/no.yml +14 -14
  274. data/config/locales/pa-pk.yml +14 -14
  275. data/config/locales/pa.yml +14 -14
  276. data/config/locales/pl.yml +14 -14
  277. data/config/locales/ps.yml +14 -14
  278. data/config/locales/pt.yml +14 -14
  279. data/config/locales/ro.yml +14 -14
  280. data/config/locales/ru.yml +14 -14
  281. data/config/locales/si.yml +14 -14
  282. data/config/locales/sk.yml +14 -14
  283. data/config/locales/sl.yml +14 -14
  284. data/config/locales/so.yml +14 -14
  285. data/config/locales/sq.yml +14 -14
  286. data/config/locales/sr.yml +14 -14
  287. data/config/locales/sv.yml +14 -14
  288. data/config/locales/sw.yml +14 -14
  289. data/config/locales/ta.yml +14 -14
  290. data/config/locales/th.yml +14 -14
  291. data/config/locales/tk.yml +14 -14
  292. data/config/locales/tr.yml +14 -14
  293. data/config/locales/uk.yml +14 -14
  294. data/config/locales/ur.yml +14 -14
  295. data/config/locales/uz.yml +14 -14
  296. data/config/locales/vi.yml +14 -14
  297. data/config/locales/zh-hk.yml +14 -14
  298. data/config/locales/zh-tw.yml +14 -14
  299. data/config/locales/zh.yml +14 -14
  300. data/lib/govuk_publishing_components/app_helpers/asset_helper.rb +86 -0
  301. data/lib/govuk_publishing_components/config.rb +3 -3
  302. data/lib/govuk_publishing_components/presenters/accordion_helper.rb +38 -0
  303. data/lib/govuk_publishing_components/presenters/breadcrumb_selector.rb +3 -2
  304. data/lib/govuk_publishing_components/presenters/{breadcrumbs.rb → breadcrumbs_helper.rb} +8 -0
  305. data/lib/govuk_publishing_components/presenters/button_helper.rb +9 -2
  306. data/lib/govuk_publishing_components/presenters/component_wrapper_helper.rb +95 -0
  307. data/lib/govuk_publishing_components/presenters/image_card_helper.rb +65 -2
  308. data/lib/govuk_publishing_components/presenters/page_with_step_by_step_navigation.rb +3 -2
  309. data/lib/govuk_publishing_components/presenters/related_navigation_helper.rb +16 -7
  310. data/lib/govuk_publishing_components/presenters/single_page_notification_button_helper.rb +43 -2
  311. data/lib/govuk_publishing_components/presenters/step_by_step_nav_helper.rb +16 -0
  312. data/lib/govuk_publishing_components/railtie.rb +7 -0
  313. data/lib/govuk_publishing_components/version.rb +1 -1
  314. data/lib/govuk_publishing_components.rb +6 -1
  315. data/node_modules/axe-core/README.md +1 -1
  316. data/node_modules/axe-core/axe.d.ts +76 -24
  317. data/node_modules/axe-core/axe.js +9200 -9059
  318. data/node_modules/axe-core/axe.min.js +3 -3
  319. data/node_modules/axe-core/package.json +29 -29
  320. data/node_modules/axe-core/sri-history.json +20 -0
  321. data/node_modules/govuk-frontend/README.md +1 -2
  322. data/node_modules/govuk-frontend/govuk/all.js +4035 -2673
  323. data/node_modules/govuk-frontend/govuk/all.js.map +1 -0
  324. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js +71 -0
  325. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js.map +1 -0
  326. data/node_modules/govuk-frontend/govuk/common/index.js +180 -0
  327. data/node_modules/govuk-frontend/govuk/common/index.js.map +1 -0
  328. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js +376 -0
  329. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js.map +1 -0
  330. data/node_modules/govuk-frontend/govuk/common.js +173 -30
  331. data/node_modules/govuk-frontend/govuk/common.js.map +1 -0
  332. data/node_modules/govuk-frontend/govuk/components/_all.scss +1 -1
  333. data/node_modules/govuk-frontend/govuk/components/accordion/_index.scss +23 -4
  334. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js +2116 -983
  335. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js.map +1 -0
  336. data/node_modules/govuk-frontend/govuk/components/accordion/fixtures.json +54 -22
  337. data/node_modules/govuk-frontend/govuk/components/accordion/macro-options.json +36 -0
  338. data/node_modules/govuk-frontend/govuk/components/accordion/template.njk +8 -2
  339. data/node_modules/govuk-frontend/govuk/components/back-link/_index.scss +19 -19
  340. data/node_modules/govuk-frontend/govuk/components/back-link/fixtures.json +12 -12
  341. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/_index.scss +21 -10
  342. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/fixtures.json +22 -22
  343. data/node_modules/govuk-frontend/govuk/components/button/_index.scss +23 -5
  344. data/node_modules/govuk-frontend/govuk/components/button/button.js +958 -690
  345. data/node_modules/govuk-frontend/govuk/components/button/button.js.map +1 -0
  346. data/node_modules/govuk-frontend/govuk/components/button/fixtures.json +85 -66
  347. data/node_modules/govuk-frontend/govuk/components/button/template.njk +1 -1
  348. data/node_modules/govuk-frontend/govuk/components/character-count/_index.scss +9 -0
  349. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +2083 -1161
  350. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js.map +1 -0
  351. data/node_modules/govuk-frontend/govuk/components/character-count/fixtures.json +112 -36
  352. data/node_modules/govuk-frontend/govuk/components/character-count/macro-options.json +42 -0
  353. data/node_modules/govuk-frontend/govuk/components/character-count/template.njk +27 -3
  354. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +1155 -1119
  355. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js.map +1 -0
  356. data/node_modules/govuk-frontend/govuk/components/checkboxes/fixtures.json +96 -93
  357. data/node_modules/govuk-frontend/govuk/components/cookie-banner/fixtures.json +46 -46
  358. data/node_modules/govuk-frontend/govuk/components/cookie-banner/template.njk +1 -1
  359. data/node_modules/govuk-frontend/govuk/components/date-input/fixtures.json +50 -50
  360. data/node_modules/govuk-frontend/govuk/components/details/details.js +797 -766
  361. data/node_modules/govuk-frontend/govuk/components/details/details.js.map +1 -0
  362. data/node_modules/govuk-frontend/govuk/components/details/fixtures.json +20 -20
  363. data/node_modules/govuk-frontend/govuk/components/error-message/fixtures.json +20 -20
  364. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js +1089 -814
  365. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js.map +1 -0
  366. data/node_modules/govuk-frontend/govuk/components/error-summary/fixtures.json +44 -35
  367. data/node_modules/govuk-frontend/govuk/components/error-summary/template.njk +25 -21
  368. data/node_modules/govuk-frontend/govuk/components/fieldset/fixtures.json +51 -39
  369. data/node_modules/govuk-frontend/govuk/components/file-upload/fixtures.json +26 -26
  370. data/node_modules/govuk-frontend/govuk/components/footer/_index.scss +1 -1
  371. data/node_modules/govuk-frontend/govuk/components/footer/fixtures.json +46 -46
  372. data/node_modules/govuk-frontend/govuk/components/footer/macro-options.json +2 -2
  373. data/node_modules/govuk-frontend/govuk/components/header/_index.scss +6 -0
  374. data/node_modules/govuk-frontend/govuk/components/header/fixtures.json +93 -38
  375. data/node_modules/govuk-frontend/govuk/components/header/header.js +646 -992
  376. data/node_modules/govuk-frontend/govuk/components/header/header.js.map +1 -0
  377. data/node_modules/govuk-frontend/govuk/components/header/macro-options.json +8 -2
  378. data/node_modules/govuk-frontend/govuk/components/header/template.njk +4 -2
  379. data/node_modules/govuk-frontend/govuk/components/hint/fixtures.json +12 -12
  380. data/node_modules/govuk-frontend/govuk/components/input/fixtures.json +80 -80
  381. data/node_modules/govuk-frontend/govuk/components/inset-text/fixtures.json +12 -12
  382. data/node_modules/govuk-frontend/govuk/components/label/fixtures.json +34 -34
  383. data/node_modules/govuk-frontend/govuk/components/notification-banner/fixtures.json +56 -46
  384. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js +790 -532
  385. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js.map +1 -0
  386. data/node_modules/govuk-frontend/govuk/components/notification-banner/template.njk +1 -1
  387. data/node_modules/govuk-frontend/govuk/components/pagination/_index.scss +10 -7
  388. data/node_modules/govuk-frontend/govuk/components/pagination/fixtures.json +94 -26
  389. data/node_modules/govuk-frontend/govuk/components/pagination/template.njk +1 -1
  390. data/node_modules/govuk-frontend/govuk/components/panel/fixtures.json +18 -18
  391. data/node_modules/govuk-frontend/govuk/components/phase-banner/fixtures.json +14 -14
  392. data/node_modules/govuk-frontend/govuk/components/phase-banner/macro-options.json +1 -1
  393. data/node_modules/govuk-frontend/govuk/components/radios/fixtures.json +94 -91
  394. data/node_modules/govuk-frontend/govuk/components/radios/radios.js +1110 -1079
  395. data/node_modules/govuk-frontend/govuk/components/radios/radios.js.map +1 -0
  396. data/node_modules/govuk-frontend/govuk/components/select/fixtures.json +32 -32
  397. data/node_modules/govuk-frontend/govuk/components/skip-link/fixtures.json +22 -20
  398. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js +1017 -1008
  399. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js.map +1 -0
  400. data/node_modules/govuk-frontend/govuk/components/summary-list/_index.scss +107 -0
  401. data/node_modules/govuk-frontend/govuk/components/summary-list/fixtures.json +345 -50
  402. data/node_modules/govuk-frontend/govuk/components/summary-list/macro-options.json +110 -0
  403. data/node_modules/govuk-frontend/govuk/components/summary-list/template.njk +72 -28
  404. data/node_modules/govuk-frontend/govuk/components/table/_index.scss +1 -1
  405. data/node_modules/govuk-frontend/govuk/components/table/fixtures.json +40 -40
  406. data/node_modules/govuk-frontend/govuk/components/tabs/fixtures.json +29 -29
  407. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js +1389 -1233
  408. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js.map +1 -0
  409. data/node_modules/govuk-frontend/govuk/components/tag/fixtures.json +28 -28
  410. data/node_modules/govuk-frontend/govuk/components/textarea/fixtures.json +34 -34
  411. data/node_modules/govuk-frontend/govuk/components/warning-text/fixtures.json +14 -14
  412. data/node_modules/govuk-frontend/govuk/core/_section-break.scss +1 -1
  413. data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +2 -2
  414. data/node_modules/govuk-frontend/govuk/helpers/_focused.scss +5 -0
  415. data/node_modules/govuk-frontend/govuk/helpers/_links.scss +6 -6
  416. data/node_modules/govuk-frontend/govuk/i18n.js +389 -0
  417. data/node_modules/govuk-frontend/govuk/i18n.js.map +1 -0
  418. data/node_modules/govuk-frontend/govuk/macros/i18n.njk +15 -0
  419. data/node_modules/govuk-frontend/govuk/settings/_all.scss +1 -0
  420. data/node_modules/govuk-frontend/govuk/settings/_colours-palette.scss +12 -0
  421. data/node_modules/govuk-frontend/govuk/settings/_compatibility.scss +26 -0
  422. data/node_modules/govuk-frontend/govuk/settings/_measurements.scss +5 -5
  423. data/node_modules/govuk-frontend/govuk/settings/_typography-font.scss +23 -0
  424. data/node_modules/govuk-frontend/govuk/settings/_typography-responsive.scss +12 -0
  425. data/node_modules/govuk-frontend/govuk/settings/_warnings.scss +53 -0
  426. data/node_modules/govuk-frontend/govuk/tools/_compatibility.scss +20 -6
  427. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js +242 -241
  428. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js.map +1 -0
  429. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js +22 -0
  430. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js.map +1 -0
  431. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js +17 -16
  432. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js.map +1 -0
  433. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js +547 -546
  434. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js.map +1 -0
  435. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js +37 -36
  436. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js.map +1 -0
  437. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js +301 -0
  438. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js.map +1 -0
  439. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js +21 -20
  440. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js.map +1 -0
  441. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js +198 -197
  442. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js.map +1 -0
  443. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js +198 -197
  444. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js.map +1 -0
  445. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js +106 -105
  446. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js.map +1 -0
  447. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js +400 -399
  448. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js.map +1 -0
  449. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js +239 -238
  450. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js.map +1 -0
  451. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js +72 -71
  452. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js.map +1 -0
  453. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js +22 -0
  454. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js.map +1 -0
  455. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js +17 -16
  456. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js.map +1 -0
  457. data/node_modules/govuk-frontend/govuk-esm/all.mjs +52 -29
  458. data/node_modules/govuk-frontend/govuk-esm/common/closest-attribute-value.mjs +15 -0
  459. data/node_modules/govuk-frontend/govuk-esm/common/index.mjs +166 -0
  460. data/node_modules/govuk-frontend/govuk-esm/common/normalise-dataset.mjs +60 -0
  461. data/node_modules/govuk-frontend/govuk-esm/common.mjs +6 -28
  462. data/node_modules/govuk-frontend/govuk-esm/components/accordion/accordion.mjs +238 -85
  463. data/node_modules/govuk-frontend/govuk-esm/components/button/button.mjs +73 -34
  464. data/node_modules/govuk-frontend/govuk-esm/components/character-count/character-count.mjs +329 -124
  465. data/node_modules/govuk-frontend/govuk-esm/components/checkboxes/checkboxes.mjs +32 -20
  466. data/node_modules/govuk-frontend/govuk-esm/components/details/details.mjs +41 -20
  467. data/node_modules/govuk-frontend/govuk-esm/components/error-summary/error-summary.mjs +60 -14
  468. data/node_modules/govuk-frontend/govuk-esm/components/header/header.mjs +9 -2
  469. data/node_modules/govuk-frontend/govuk-esm/components/notification-banner/notification-banner.mjs +33 -4
  470. data/node_modules/govuk-frontend/govuk-esm/components/radios/radios.mjs +18 -11
  471. data/node_modules/govuk-frontend/govuk-esm/components/skip-link/skip-link.mjs +15 -7
  472. data/node_modules/govuk-frontend/govuk-esm/components/tabs/tabs.mjs +171 -38
  473. data/node_modules/govuk-frontend/govuk-esm/i18n.mjs +378 -0
  474. data/node_modules/govuk-frontend/govuk-esm/vendor/polyfills/Date/now.mjs +13 -0
  475. data/node_modules/govuk-frontend/govuk-esm/vendor/polyfills/Element/prototype/dataset.mjs +68 -0
  476. data/node_modules/govuk-frontend/govuk-esm/vendor/polyfills/String/prototype/trim.mjs +13 -0
  477. data/node_modules/govuk-frontend/govuk-prototype-kit/init.js +7 -0
  478. data/node_modules/govuk-frontend/govuk-prototype-kit/init.scss +12 -0
  479. data/node_modules/govuk-frontend/govuk-prototype-kit.config.json +138 -7
  480. data/node_modules/govuk-frontend/package.json +1 -1
  481. metadata +70 -19
  482. data/app/assets/stylesheets/component_guide/print.scss +0 -1
  483. data/app/assets/stylesheets/govuk_publishing_components/_all_components_print.scss +0 -18
  484. data/app/assets/stylesheets/govuk_publishing_components/components/print/_accordion.scss +0 -28
  485. data/app/assets/stylesheets/govuk_publishing_components/components/print/_button.scss +0 -8
  486. data/app/assets/stylesheets/govuk_publishing_components/components/print/_cards.scss +0 -4
  487. data/app/assets/stylesheets/govuk_publishing_components/components/print/_contents-list.scss +0 -19
  488. data/app/assets/stylesheets/govuk_publishing_components/components/print/_emergency-banner.scss +0 -3
  489. data/app/assets/stylesheets/govuk_publishing_components/components/print/_govspeak-html-publication.scss +0 -5
  490. data/app/assets/stylesheets/govuk_publishing_components/components/print/_govspeak.scss +0 -80
  491. data/app/assets/stylesheets/govuk_publishing_components/components/print/_layout-super-navigation-header.scss +0 -3
  492. data/app/assets/stylesheets/govuk_publishing_components/components/print/_organisation-logo.scss +0 -7
  493. data/app/assets/stylesheets/govuk_publishing_components/components/print/_step-by-step-nav-header.scss +0 -7
  494. data/app/assets/stylesheets/govuk_publishing_components/components/print/_step-by-step-nav.scss +0 -116
  495. data/app/assets/stylesheets/govuk_publishing_components/components/print/_textarea.scss +0 -13
  496. data/app/assets/stylesheets/govuk_publishing_components/components/print/_title.scss +0 -7
@@ -0,0 +1,131 @@
1
+ // = require govuk/vendor/polyfills/Element/prototype/closest.js
2
+ window.GOVUK = window.GOVUK || {}
3
+ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {}
4
+ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analyticsModules || {};
5
+
6
+ (function (analyticsModules) {
7
+ 'use strict'
8
+
9
+ var Ga4SpecialistLinkTracker = {
10
+ init: function (config) {
11
+ if (window.dataLayer) {
12
+ config = config || {}
13
+ this.internalDownloadPaths = config.internalDownloadPaths || ['/government/uploads/']
14
+ this.dedicatedDownloadDomains = config.dedicatedDownloadDomains || ['assets.publishing.service.gov.uk']
15
+ window.GOVUK.analyticsGa4.core.trackFunctions.appendDomainsWithoutWWW(this.dedicatedDownloadDomains)
16
+ this.handleClick = this.handleClick.bind(this)
17
+ this.handleMousedown = this.handleMousedown.bind(this)
18
+
19
+ document.querySelector('body').addEventListener('click', this.handleClick)
20
+ document.querySelector('body').addEventListener('contextmenu', this.handleClick)
21
+ document.querySelector('body').addEventListener('mousedown', this.handleMousedown)
22
+ }
23
+ },
24
+
25
+ stopTracking: function () {
26
+ document.querySelector('body').removeEventListener('click', this.handleClick)
27
+ document.querySelector('body').removeEventListener('contextmenu', this.handleClick)
28
+ document.querySelector('body').removeEventListener('mousedown', this.handleMousedown)
29
+ },
30
+
31
+ handleClick: function (event) {
32
+ var element = event.target
33
+
34
+ if (element.tagName !== 'A') {
35
+ element = element.closest('a')
36
+ }
37
+
38
+ if (!element) {
39
+ return
40
+ }
41
+
42
+ // don't track this link if it's already being tracked by the another tracker (e.g. the link tracker or ecommerce tracker)
43
+ if (element.closest('[data-ga4-link]') || element.closest('[data-ga4-ecommerce-path]')) {
44
+ return
45
+ }
46
+
47
+ var href = element.getAttribute('href')
48
+
49
+ if (!href) {
50
+ return
51
+ }
52
+ var data = {}
53
+ if (window.GOVUK.analyticsGa4.core.trackFunctions.isMailToLink(href)) {
54
+ data.event_name = 'navigation'
55
+ data.type = 'email'
56
+ data.external = 'true'
57
+ } else if (this.isDownloadLink(href)) {
58
+ data.event_name = 'file_download'
59
+ data.type = this.isPreviewLink(href) ? 'preview' : 'generic download'
60
+ data.external = window.GOVUK.analyticsGa4.core.trackFunctions.isExternalLink(href) ? 'true' : 'false'
61
+ } else if (window.GOVUK.analyticsGa4.core.trackFunctions.isExternalLink(href)) {
62
+ data.event_name = 'navigation'
63
+ data.type = 'generic link'
64
+ data.external = 'true'
65
+ }
66
+
67
+ if (Object.keys(data).length > 0) {
68
+ data.url = href
69
+ if (data.url) {
70
+ data.url = window.GOVUK.analyticsGa4.core.trackFunctions.removeCrossDomainParams(data.url)
71
+ data.link_domain = window.GOVUK.analyticsGa4.core.trackFunctions.populateLinkDomain(data.url)
72
+ data.link_path_parts = window.GOVUK.analyticsGa4.core.trackFunctions.populateLinkPathParts(data.url)
73
+ }
74
+
75
+ data.text = window.GOVUK.analyticsGa4.core.trackFunctions.removeLinesAndExtraSpaces(element.textContent)
76
+ data.method = window.GOVUK.analyticsGa4.core.trackFunctions.getClickType(event)
77
+
78
+ var schemas = new window.GOVUK.analyticsGa4.Schemas()
79
+ var schema = schemas.mergeProperties(data, 'event_data')
80
+ window.GOVUK.analyticsGa4.core.sendData(schema)
81
+ }
82
+ },
83
+
84
+ handleMousedown: function (event) {
85
+ // 1 = middle mouse button
86
+ if (event.button === 1) {
87
+ this.handleClick(event)
88
+ }
89
+ },
90
+
91
+ isDownloadLink: function (href) {
92
+ if (window.GOVUK.analyticsGa4.core.trackFunctions.isInternalLink(href) && this.hrefPointsToDownloadPath(href)) {
93
+ return true
94
+ }
95
+
96
+ var result = false
97
+ for (var i = 0; i < this.dedicatedDownloadDomains.length; i++) {
98
+ var downloadDomain = this.dedicatedDownloadDomains[i]
99
+ if (window.GOVUK.analyticsGa4.core.trackFunctions.hrefPointsToDomain(href, downloadDomain)) {
100
+ result = true
101
+ }
102
+ }
103
+ return result
104
+ },
105
+
106
+ isPreviewLink: function (href) {
107
+ /* Regex looks for:
108
+ 1. The file extension period (the character '.')
109
+ 2. any alphanumeric characters (so we can match any file type such as jpg, pdf, mp4.)
110
+ 3. the presence of '/preview'.
111
+ For example, .csv/preview or .mp4/preview will be matched.
112
+ Regex is used over JS string methods as this should work with anchor links, query string parameters and files that may have 'preview' in their name.
113
+ */
114
+ var previewRegex = /\.\w+\/preview/i
115
+ return previewRegex.test(href)
116
+ },
117
+
118
+ hrefPointsToDownloadPath: function (href) {
119
+ var result = false
120
+ for (var i = 0; i < this.internalDownloadPaths.length; i++) {
121
+ var internalDownloadPath = this.internalDownloadPaths[i]
122
+ if (href.indexOf(internalDownloadPath) !== -1) {
123
+ result = true
124
+ }
125
+ }
126
+ return result
127
+ }
128
+ }
129
+
130
+ analyticsModules.Ga4SpecialistLinkTracker = Ga4SpecialistLinkTracker
131
+ })(window.GOVUK.analyticsGa4.analyticsModules)
@@ -2,21 +2,26 @@ window.GOVUK = window.GOVUK || {}
2
2
  window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {}
3
3
 
4
4
  var initFunction = function () {
5
- // to be added: digital identity consent mechanism
6
-
7
5
  var consentCookie = window.GOVUK.getConsentCookie()
8
6
 
9
7
  if (consentCookie && consentCookie.usage) {
8
+ window.GOVUK.analyticsGa4.vars.internalDomains = []
9
+ window.GOVUK.analyticsGa4.vars.internalDomains.push(window.GOVUK.analyticsGa4.core.trackFunctions.getHostname())
10
+ window.GOVUK.analyticsGa4.core.trackFunctions.appendDomainsWithoutWWW(window.GOVUK.analyticsGa4.vars.internalDomains)
10
11
  window.GOVUK.analyticsGa4.core.load()
11
12
 
12
13
  var analyticsModules = window.GOVUK.analyticsGa4.analyticsModules
13
14
  for (var property in analyticsModules) {
14
15
  var module = analyticsModules[property]
15
16
  if (typeof module.init === 'function') {
16
- module.init()
17
+ try {
18
+ module.init()
19
+ } catch (e) {
20
+ // if there's a problem with the module, catch the error to allow other modules to start
21
+ console.warn('Error starting analytics module ' + property + ': ' + e.message, window.location)
22
+ }
17
23
  }
18
24
  }
19
- // to be added: cross domain tracking code
20
25
  } else {
21
26
  window.addEventListener('cookie-consent', window.GOVUK.analyticsGa4.init)
22
27
  }
@@ -4,7 +4,8 @@
4
4
  var GOVUK = global.GOVUK || {}
5
5
  var EMAIL_PATTERN = /[^\s=/?&#]+(?:@|%40)[^\s=/?&]+/g
6
6
  var POSTCODE_PATTERN = /\b[A-PR-UWYZ][A-HJ-Z]?[0-9][0-9A-HJKMNPR-Y]?(?:[\s+]|%20)*[0-9](?!refund)[ABD-HJLNPQ-Z]{2,3}\b/gi
7
- var DATE_PATTERN = /\d{4}(-?)\d{2}(-?)\d{2}/g
7
+ var DATE_PATTERN_NUMERIC = /\d{4}(-?)\d{2}(-?)\d{2}/g
8
+ var DATE_PATTERN_STRING = /\d{1,2}\s(January|February|March|April|May|June|July|August|September|October|November|December)\s\d{4}/g
8
9
  var ESCAPE_REGEX_PATTERN = /[|\\{}()[\]^$+*?.]/g
9
10
 
10
11
  // specific URL parameters to be redacted from accounts URLs
@@ -85,7 +86,8 @@
85
86
  stripped = this.stripQueryStringParameters(stripped)
86
87
 
87
88
  if (this.stripDatePII === true) {
88
- stripped = stripped.replace(DATE_PATTERN, '[date]')
89
+ stripped = stripped.replace(DATE_PATTERN_NUMERIC, '[date]')
90
+ stripped = stripped.replace(DATE_PATTERN_STRING, '[date]')
89
91
  }
90
92
  if (this.stripPostcodePII === true) {
91
93
  stripped = stripped.replace(POSTCODE_PATTERN, '[postcode]')
@@ -3,7 +3,11 @@
3
3
  //= require ./analytics-ga4/ga4-schemas
4
4
  //= require ./analytics-ga4/pii-remover
5
5
  //= require ./analytics-ga4/ga4-page-views
6
+ //= require ./analytics-ga4/ga4-specialist-link-tracker
6
7
  //= require ./analytics-ga4/ga4-link-tracker
7
8
  //= require ./analytics-ga4/ga4-event-tracker
8
9
  //= require ./analytics-ga4/ga4-ecommerce-tracker
10
+ //= require ./analytics-ga4/ga4-form-tracker
11
+ //= require ./analytics-ga4/ga4-auto-tracker
12
+ //= require ./analytics-ga4/ga4-smart-answer-results-tracker
9
13
  //= require ./analytics-ga4/init-ga4
@@ -43,9 +43,10 @@ window.GOVUK.Modules.GovukAccordion = window.GOVUKFrontend.Accordion;
43
43
 
44
44
  // look for data attributes to put onto the 'show/hide all' link
45
45
  var showAllAttributes = this.$module.getAttribute('data-show-all-attributes')
46
+ var showAll
46
47
  if (showAllAttributes) {
47
48
  try {
48
- var showAll = this.$module.querySelector(this.showAllControls)
49
+ showAll = this.$module.querySelector(this.showAllControls)
49
50
  var values = JSON.parse(showAllAttributes)
50
51
  var keys = Object.keys(values)
51
52
  for (var i = 0; i < keys.length; i++) {
@@ -55,6 +56,16 @@ window.GOVUK.Modules.GovukAccordion = window.GOVUKFrontend.Accordion;
55
56
  console.error('Could not read accordion data attributes error: ' + e.message, window.location)
56
57
  }
57
58
  }
59
+
60
+ // if GA4 is enabled, set attributes on 'show all sections' for tracking using ga4-event-tracker
61
+ var dataModule = this.$module.getAttribute('data-module')
62
+ var isGa4Enabled = dataModule ? dataModule.indexOf('ga4-event-tracker') !== -1 : false
63
+ if (isGa4Enabled) {
64
+ var indexTotal = this.$module.querySelectorAll('.govuk-accordion__section').length
65
+ var showAllAttributesGa4 = { event_name: 'select_content', type: 'accordion', index: { index_section: 0, index_section_count: indexTotal } }
66
+ showAll = this.$module.querySelector(this.showAllControls)
67
+ showAll.setAttribute('data-ga4-event', JSON.stringify(showAllAttributesGa4))
68
+ }
58
69
  }
59
70
 
60
71
  // Navigate to and open accordions with anchored content on page load if a hash is present
@@ -76,7 +76,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
76
76
 
77
77
  CookieBanner.prototype.setCookieConsent = function () {
78
78
  if (this.$acceptCookiesButton.getAttribute('data-cookie-types') === 'all') {
79
- this.$module.cookieBannerConfirmationMessageText.insertAdjacentHTML('afterbegin', 'You have accepted additional cookies. ')
79
+ this.$module.querySelector('.gem-c-cookie-banner__confirmation-message__accepted').hidden = false
80
80
  }
81
81
  window.GOVUK.approveAllCookieTypes()
82
82
  this.$module.showConfirmationMessage()
@@ -92,7 +92,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
92
92
  }
93
93
 
94
94
  CookieBanner.prototype.rejectCookieConsent = function () {
95
- this.$module.cookieBannerConfirmationMessageText.insertAdjacentHTML('afterbegin', 'You have rejected additional cookies. ')
95
+ this.$module.querySelector('.gem-c-cookie-banner__confirmation-message__rejected').hidden = false
96
96
  this.$module.showConfirmationMessage()
97
97
  this.$module.cookieBannerConfirmationMessage.focus()
98
98
  window.GOVUK.cookie('cookies_preferences_set', 'true', { days: 365 })
@@ -0,0 +1,19 @@
1
+ window.GOVUK = window.GOVUK || {}
2
+ window.GOVUK.Modules = window.GOVUK.Modules || {};
3
+
4
+ (function (Modules) {
5
+ function ImageCard ($module) {
6
+ this.$module = $module
7
+ this.$module.youtubeLink = this.$module.querySelector('.gem-c-image-card__image-wrapper div')
8
+ }
9
+
10
+ ImageCard.prototype.init = function () {
11
+ var ytLink = new window.GOVUK.GovspeakYoutubeLinkEnhancement(
12
+ this.$module.youtubeLink,
13
+ 'gem-c-govspeak__youtube-video gem-c-image-card__youtube-video-embed'
14
+ )
15
+ ytLink.init()
16
+ }
17
+
18
+ Modules.ImageCard = ImageCard
19
+ })(window.GOVUK.Modules)
@@ -5,9 +5,6 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
5
5
 
6
6
  (function (Modules) {
7
7
  var SETTINGS = {
8
- breakpoint: {
9
- desktop: 769
10
- },
11
8
  label: {
12
9
  hide: 'data-text-for-hide',
13
10
  show: 'data-text-for-show'
@@ -92,32 +89,8 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
92
89
  return closestPrevious(previousElement, elementType)
93
90
  }
94
91
 
95
- // When moving from one screen size to another (eg mobile to desktop) we need
96
- // to find out whether a submenu is open so the parent menu can be kept open.
97
- var hasSubMenusOpen = function ($menu) {
98
- return $menu.querySelectorAll('button[aria-expanded="true"]').length > 0
99
- }
100
-
101
- // Detect the current viewport width. Return the string `desktop` or `mobile` so it can be interpolated to access the
102
- // `data-toggle-{desktop|mobile}-group` attribute.
103
- //
104
- // Use `matchedia` which mitigates issues in modern browsers when scrollbars are forced in MacOS (using `document.documentElement.clientWidth`
105
- // for viewport width detection has issues in Chrome and Firefox, and `window.innerWidth` has issues in Safari).
106
- //
107
- // Fall back to `document.documentElement.clientWidth` for legacy browsers.
108
- var windowSize = function () {
109
- var viewport = false
110
- if (typeof window.matchMedia === 'function') {
111
- viewport = window.matchMedia('(min-width:' + SETTINGS.breakpoint.desktop + 'px)').matches
112
- } else {
113
- viewport = document.documentElement.clientWidth >= SETTINGS.breakpoint.desktop
114
- }
115
- return viewport ? 'desktop' : 'mobile'
116
- }
117
92
  function SuperNavigationMegaMenu ($module) {
118
93
  this.$module = $module
119
- this.$navigationToggle = this.$module.querySelector('#super-navigation-menu-toggle')
120
- this.$navigationMenu = this.$module.querySelector('#super-navigation-menu')
121
94
  this.$searchToggle = this.$module.querySelector('#super-search-menu-toggle')
122
95
  this.$searchMenu = this.$module.querySelector('#super-search-menu')
123
96
 
@@ -132,55 +105,13 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
132
105
  )
133
106
 
134
107
  this.hiddenButtons = this.$module.querySelectorAll('button[hidden]')
135
-
136
- this.lastWindowSize = null
137
- }
138
-
139
- SuperNavigationMegaMenu.prototype.windowSize = windowSize
140
-
141
- SuperNavigationMegaMenu.prototype.updateStates = function () {
142
- if (this.windowSize() === 'mobile' && this.lastWindowSize !== 'mobile') {
143
- this.$navigationToggle.removeAttribute('hidden')
144
-
145
- // Hides navigation menu unless a submenu is open - this could be common
146
- // as the desktop view has the navigation submenu as top level in the
147
- // menu.
148
- if (!hasSubMenusOpen(this.$navigationMenu)) {
149
- hide(this.$navigationToggle, this.$navigationMenu)
150
- }
151
-
152
- this.$module.style.marginBottom = '0'
153
- }
154
-
155
- // Hide the navigation toggle button and show the navigation submenu:
156
- if (this.windowSize() === 'desktop' && this.lastWindowSize !== 'desktop') {
157
- this.$navigationToggle.setAttribute('hidden', 'hidden')
158
- this.$navigationMenu.removeAttribute('hidden')
159
- }
160
-
161
- // The dropdown menu height is only needed when in desktop mode as this is
162
- // when the dropdown menu is using `absolute` positioning. This requires
163
- // JavaScript to work out the height and make space for the dropdown menu.
164
- if (windowSize() === 'desktop') {
165
- // Check whether any of the dropdown menus are open.
166
- var $openButton = this.$module.querySelector('[aria-expanded="true"][data-toggle-desktop-group="top"]')
167
- // Gets the open dropdown menu
168
- var $openMenu = $openButton ? this.$module.querySelector('#' + $openButton.getAttribute('aria-controls')) : null
169
- // If there is an open dropdown menu, get the height of the dropdown menu.
170
- var margin = $openMenu ? $openMenu.offsetHeight : 0
171
-
172
- // Make space for the dropdown menu.
173
- this.$module.style.marginBottom = margin + 'px'
174
- }
175
-
176
- this.lastWindowSize = this.windowSize()
177
108
  }
178
109
 
179
110
  SuperNavigationMegaMenu.prototype.buttonHandler = function (event) {
180
111
  var $target = closestParentIncluding(event.target, 'button')
181
112
  var $targetMenu = this.$module.querySelector('#' + $target.getAttribute('aria-controls'))
182
113
 
183
- var toggleGroupAttribute = 'data-toggle-' + this.windowSize() + '-group'
114
+ var toggleGroupAttribute = 'data-toggle-desktop-group'
184
115
  var toggleGroupName = $target.getAttribute(toggleGroupAttribute)
185
116
  var toggleGroupList = this.$module.querySelectorAll('[' + toggleGroupAttribute + '="' + toggleGroupName + '"]')
186
117
 
@@ -193,10 +124,6 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
193
124
  }
194
125
 
195
126
  toggle($target, $targetMenu)
196
-
197
- if (this.windowSize() === 'desktop') {
198
- this.$module.style.marginBottom = $targetMenu.offsetHeight + 'px'
199
- }
200
127
  }
201
128
 
202
129
  SuperNavigationMegaMenu.prototype.init = function () {
@@ -217,6 +144,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
217
144
  $element.removeAttribute('hidden')
218
145
 
219
146
  var closestSiblingLink = closestPrevious($element, 'a')
147
+
220
148
  if (closestSiblingLink) {
221
149
  closestSiblingLink.setAttribute('hidden', 'hidden')
222
150
  }
@@ -235,13 +163,6 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
235
163
  // - On desktop, this means hiding the navigation button, showing the
236
164
  // second level navigation menu
237
165
  hide(this.$searchToggle, this.$searchMenu)
238
- this.updateStates()
239
-
240
- this.lastWindowSize = this.windowSize()
241
-
242
- // The menu needs to be updated when the window is resized to make sure that
243
- // the space needed for the dropdown menu is correct.
244
- window.addEventListener('resize', this.updateStates.bind(this), { passive: true })
245
166
 
246
167
  this.$module.classList.add('js-module-initialised')
247
168
  }
@@ -28,15 +28,31 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
28
28
  if (xhr.readyState === 4) {
29
29
  if (xhr.status === 200) {
30
30
  var responseText = xhr.responseText
31
- // if response text exists and is JSON parse-able, parse the response and get the button html
31
+ // if response text exists and is JSON parse-able, parse the response and update the button html
32
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)
33
+ var active = JSON.parse(responseText).active
34
+
35
+ var customSubscribeText = this.$module.getAttribute('data-button-text-subscribe')
36
+ var customUnsubscribeText = this.$module.getAttribute('data-button-text-unsubscribe')
37
+ // Only set custom button text if both text items are provided
38
+ var customText = customSubscribeText && customUnsubscribeText
39
+
40
+ // Append '-[button-location]' to the tracking data attribute value if data-button-location is set
41
+ var optionalButtonLocation = this.$module.getAttribute('data-button-location') ? '-' + this.$module.getAttribute('data-button-location') : ''
42
+
43
+ // If response returns active, user has subscribed to notifications
44
+ if (active === true) {
45
+ this.$module.setAttribute('data-track-action', 'Unsubscribe-button' + optionalButtonLocation)
46
+
47
+ if (customText) {
48
+ this.$module.querySelector('.gem-c-single-page-notication-button__text').textContent = customUnsubscribeText
49
+ }
50
+ } else {
51
+ this.$module.setAttribute('data-track-action', 'Subscribe-button' + optionalButtonLocation)
52
+
53
+ if (customText) {
54
+ this.$module.querySelector('.gem-c-single-page-notication-button__text').textContent = customSubscribeText
55
+ }
40
56
  }
41
57
  }
42
58
  }
@@ -36,6 +36,9 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
36
36
 
37
37
  this.$module.uniqueId = this.$module.getAttribute('data-id') || false
38
38
 
39
+ this.$module.dataModule = this.$module.getAttribute('data-module')
40
+ this.$module.isGa4Enabled = this.$module.dataModule ? this.$module.dataModule.indexOf('ga4-event-tracker') !== -1 : false
41
+
39
42
  if (this.$module.uniqueId) {
40
43
  this.$module.sessionStoreLink = this.$module.sessionStoreLink + '_' + this.$module.uniqueId
41
44
  }
@@ -78,6 +81,12 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
78
81
 
79
82
  this.$module.insertBefore(showAll, steps)
80
83
  this.$module.showOrHideAllButton = this.$module.querySelectorAll('.js-step-controls-button')[0]
84
+
85
+ // if GA4 is enabled, set attributes on 'show all sections' for tracking using ga4-event-tracker
86
+ if (this.$module.isGa4Enabled) {
87
+ var showAllAttributesGa4 = { event_name: 'select_content', type: 'step by step', index: 0, index_total: this.$module.totalSteps }
88
+ this.$module.showOrHideAllButton.setAttribute('data-ga4-event', JSON.stringify(showAllAttributesGa4))
89
+ }
81
90
  }
82
91
 
83
92
  Gemstepnav.prototype.addShowHideToggle = function () {
@@ -174,13 +183,26 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
174
183
  '<span class="js-step-title">' +
175
184
  '<button ' +
176
185
  'class="gem-c-step-nav__button gem-c-step-nav__button--title js-step-title-button" ' +
177
- 'aria-expanded="false" aria-controls="' + contentId + '">' +
186
+ 'aria-expanded="false" aria-controls="' + contentId + '"' + '>' +
178
187
  '<span class="gem-c-step-nav____title-text-focus">' +
179
188
  '<span class="gem-c-step-nav__title-text js-step-title-text">' + titleText + '</span>' +
180
189
  '<span class="govuk-visually-hidden gem-c-step-nav__section-heading-divider">, </span>' +
181
190
  '</span>' +
182
191
  '</button>' +
183
192
  '</span>'
193
+
194
+ if (this.$module.isGa4Enabled) {
195
+ var ga4JSON = {
196
+ event_name: 'select_content',
197
+ type: 'step by step',
198
+ text: titleText.trim(),
199
+ index: i + 1,
200
+ index_total: this.$module.totalSteps
201
+ }
202
+
203
+ var button = thisel.querySelector('.js-step-title-button')
204
+ button.setAttribute('data-ga4-event', JSON.stringify(ga4JSON))
205
+ }
184
206
  }
185
207
  }
186
208
 
@@ -5,5 +5,18 @@
5
5
  // = require ./modules.js
6
6
 
7
7
  document.addEventListener('DOMContentLoaded', function () {
8
+ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {}
9
+ window.GOVUK.analyticsVars = window.GOVUK.analyticsVars || {}
10
+
11
+ // if statements ensure these functions don't execute during testing
12
+ if (typeof window.GOVUK.loadAnalytics !== 'undefined') {
13
+ if (typeof window.GOVUK.analyticsGa4.vars === 'undefined') {
14
+ window.GOVUK.loadAnalytics.loadGa4()
15
+ }
16
+ if (typeof window.GOVUK.analyticsVars.gaProperty === 'undefined') {
17
+ window.GOVUK.loadAnalytics.loadUa()
18
+ }
19
+ }
20
+
8
21
  window.GOVUK.modules.start()
9
22
  })
@@ -3,8 +3,9 @@
3
3
  window.GOVUK = window.GOVUK || {}
4
4
  var GOVUK = window.GOVUK || {}
5
5
 
6
- var YoutubeLinkEnhancement = function ($element) {
6
+ var YoutubeLinkEnhancement = function ($element, $classOverride) {
7
7
  this.$element = $element
8
+ this.$classOverride = typeof $classOverride !== 'undefined' ? $classOverride : 'gem-c-govspeak__youtube-video'
8
9
  }
9
10
 
10
11
  YoutubeLinkEnhancement.prototype.init = function () {
@@ -70,7 +71,7 @@
70
71
  var parentContainer = parentPara.parentNode
71
72
 
72
73
  var youtubeVideoContainer = document.createElement('div')
73
- youtubeVideoContainer.className += 'gem-c-govspeak__youtube-video'
74
+ youtubeVideoContainer.className += this.$classOverride
74
75
  youtubeVideoContainer.innerHTML = '<span id="' + elementId + '" data-video-id="' + id + '"></span>'
75
76
 
76
77
  options.title = $link.textContent
@@ -1,3 +1,4 @@
1
+ // see https://github.com/alphagov/govuk_publishing_components/blob/main/docs/lib/trigger_event.md
1
2
  (function (root) {
2
3
  'use strict'
3
4
  window.GOVUK = window.GOVUK || {}
@@ -0,0 +1,116 @@
1
+ //= require govuk_publishing_components/analytics
2
+ //= require govuk_publishing_components/analytics-ga4
3
+ //= require govuk_publishing_components/analytics/linked-domains
4
+
5
+ window.GOVUK.loadAnalytics = {
6
+ productionDomains: [
7
+ 'www.gov.uk',
8
+ 'www-origin.publishing.service.gov.uk',
9
+ 'assets.publishing.service.gov.uk'
10
+ ],
11
+ stagingDomains: [
12
+ 'www.staging.publishing.service.gov.uk',
13
+ 'www-origin.staging.publishing.service.gov.uk',
14
+ 'assets.staging.publishing.service.gov.uk'
15
+ ],
16
+ integrationDomains: [
17
+ 'www.integration.publishing.service.gov.uk',
18
+ 'www-origin.integration.publishing.service.gov.uk',
19
+ 'assets.integration.publishing.service.gov.uk'
20
+ ],
21
+ developmentDomains: [
22
+ 'localhost', '127.0.0.1', '0.0.0.0'
23
+ ],
24
+
25
+ // For Universal Analytics' cross domain tracking. linkedDomains is defined by the require statement at the top of the file.
26
+ linkedDomains: window.GOVUK.analytics.linkedDomains,
27
+
28
+ ga4EnvironmentVariables: {
29
+ // initialiseGA4 is used to enable/disable GA4 on specific environments
30
+ production: {
31
+ initialiseGA4: true
32
+ },
33
+ staging: {
34
+ initialiseGA4: true,
35
+ auth: 'oJWs562CxSIjZKn_GlB5Bw',
36
+ preview: 'env-5'
37
+ },
38
+ integration: {
39
+ initialiseGA4: true,
40
+ auth: 'C7iYdcsOlYgGmiUJjZKrHQ',
41
+ preview: 'env-4'
42
+ },
43
+ development: {
44
+ initialiseGA4: true,
45
+ auth: 'bRiZ-jiEHtw6hHpGd6dF9w',
46
+ preview: 'env-3'
47
+ }
48
+ },
49
+
50
+ loadUa: function (currentDomain) {
51
+ currentDomain = currentDomain || window.location.hostname
52
+
53
+ // Universal Analytics variables
54
+ window.GOVUK.analyticsVars = window.GOVUK.analyticsVars || {}
55
+ window.GOVUK.analyticsVars.primaryLinkedDomains = ['account.gov.uk']
56
+ window.GOVUK.analyticsVars.linkedDomains = this.linkedDomains
57
+ window.GOVUK.analyticsVars.gaProperty = 'UA-UNSET'
58
+ window.GOVUK.analyticsVars.gaPropertyCrossDomain = 'UA-UNSET'
59
+
60
+ if (this.arrayContains(currentDomain, this.productionDomains)) {
61
+ window.GOVUK.analyticsVars.gaProperty = 'UA-26179049-1'
62
+ window.GOVUK.analyticsVars.gaPropertyCrossDomain = 'UA-145652997-1'
63
+ } else if (this.arrayContains(currentDomain, this.stagingDomains)) {
64
+ window.GOVUK.analyticsVars.gaProperty = 'UA-26179049-20'
65
+ window.GOVUK.analyticsVars.gaPropertyCrossDomain = 'UA-145652997-1'
66
+ } else if (this.arrayContains(currentDomain, this.integrationDomains)) {
67
+ window.GOVUK.analyticsVars.gaProperty = 'UA-26179049-22'
68
+ window.GOVUK.analyticsVars.gaPropertyCrossDomain = 'UA-145652997-1'
69
+ }
70
+
71
+ // Load universal analytics
72
+ if (typeof window.GOVUK.analyticsInit !== 'undefined') {
73
+ window.GOVUK.analyticsInit()
74
+ }
75
+ },
76
+
77
+ loadGa4: function (currentDomain) {
78
+ currentDomain = currentDomain || window.location.hostname
79
+ var environment = ''
80
+
81
+ // Categorise current environment
82
+ if (this.arrayContains(currentDomain, this.productionDomains)) {
83
+ environment = 'production'
84
+ } else if (this.arrayContains(currentDomain, this.stagingDomains)) {
85
+ environment = 'staging'
86
+ } else if (this.arrayContains(currentDomain, this.integrationDomains)) {
87
+ environment = 'integration'
88
+ } else if (this.arrayContains(currentDomain, this.developmentDomains) || currentDomain.indexOf('.dev.gov.uk') !== -1) {
89
+ environment = 'development'
90
+ }
91
+
92
+ // If we recognise the environment (i.e. the string isn't empty), load in GA4
93
+ if (environment) {
94
+ // If analytics-ga4.js exists and our detected environment has 'initialiseGA4' set to true, load GA4.
95
+ if (typeof window.GOVUK.analyticsGa4.init !== 'undefined' && this.ga4EnvironmentVariables[environment].initialiseGA4) {
96
+ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {}
97
+ window.GOVUK.analyticsGa4.vars = window.GOVUK.analyticsGa4.vars || {}
98
+ window.GOVUK.analyticsGa4.vars.id = 'GTM-MG7HG5W'
99
+ window.GOVUK.analyticsGa4.vars.auth = this.ga4EnvironmentVariables[environment].auth
100
+ window.GOVUK.analyticsGa4.vars.preview = this.ga4EnvironmentVariables[environment].preview
101
+ window.GOVUK.analyticsGa4.vars.environment = environment // Used for testing and debugging
102
+
103
+ window.GOVUK.analyticsGa4.vars.gem_version = 'not found'
104
+ var gemMeta = document.querySelector('meta[name="govuk:components_gem_version"]')
105
+ if (gemMeta) {
106
+ window.GOVUK.analyticsGa4.vars.gem_version = gemMeta.getAttribute('content')
107
+ }
108
+ window.GOVUK.analyticsGa4.init()
109
+ }
110
+ }
111
+ },
112
+
113
+ arrayContains: function (valueToFind, array) {
114
+ return array.indexOf(valueToFind) !== -1
115
+ }
116
+ }