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
@@ -1,16 +1,23 @@
1
- import '../../vendor/polyfills/Function/prototype/bind.mjs'
2
- // addEventListener, event.target normalization and DOMContentLoaded
3
- import '../../vendor/polyfills/Event.mjs'
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+
3
+ import { nodeListForEach } from '../../common/index.mjs'
4
4
  import '../../vendor/polyfills/Element/prototype/classList.mjs'
5
- import { nodeListForEach } from '../../common.mjs'
5
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
6
+ import '../../vendor/polyfills/Function/prototype/bind.mjs'
6
7
 
8
+ /**
9
+ * Checkboxes component
10
+ *
11
+ * @class
12
+ * @param {HTMLElement} $module - HTML element to use for checkboxes
13
+ */
7
14
  function Checkboxes ($module) {
8
15
  this.$module = $module
9
16
  this.$inputs = $module.querySelectorAll('input[type="checkbox"]')
10
17
  }
11
18
 
12
19
  /**
13
- * Initialise Checkboxes
20
+ * Initialise component
14
21
  *
15
22
  * Checkboxes can be associated with a 'conditionally revealed' content block –
16
23
  * for example, a checkbox for 'Phone' could reveal an additional form field for
@@ -28,17 +35,17 @@ Checkboxes.prototype.init = function () {
28
35
  var $inputs = this.$inputs
29
36
 
30
37
  nodeListForEach($inputs, function ($input) {
31
- var target = $input.getAttribute('data-aria-controls')
38
+ var targetId = $input.getAttribute('data-aria-controls')
32
39
 
33
40
  // Skip checkboxes without data-aria-controls attributes, or where the
34
41
  // target element does not exist.
35
- if (!target || !document.getElementById(target)) {
42
+ if (!targetId || !document.getElementById(targetId)) {
36
43
  return
37
44
  }
38
45
 
39
46
  // Promote the data-aria-controls attribute to a aria-controls attribute
40
47
  // so that the relationship is exposed in the AOM
41
- $input.setAttribute('aria-controls', target)
48
+ $input.setAttribute('aria-controls', targetId)
42
49
  $input.removeAttribute('data-aria-controls')
43
50
  })
44
51
 
@@ -57,11 +64,12 @@ Checkboxes.prototype.init = function () {
57
64
  // for example if they are added to the page dynamically, so sync now too.
58
65
  this.syncAllConditionalReveals()
59
66
 
67
+ // Handle events
60
68
  $module.addEventListener('click', this.handleClick.bind(this))
61
69
  }
62
70
 
63
71
  /**
64
- * Sync the conditional reveal states for all inputs in this $module.
72
+ * Sync the conditional reveal states for all checkboxes in this $module.
65
73
  */
66
74
  Checkboxes.prototype.syncAllConditionalReveals = function () {
67
75
  nodeListForEach(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
@@ -73,7 +81,7 @@ Checkboxes.prototype.syncAllConditionalReveals = function () {
73
81
  * Synchronise the visibility of the conditional reveal, and its accessible
74
82
  * state, with the input's checked state.
75
83
  *
76
- * @param {HTMLInputElement} $input Checkbox input
84
+ * @param {HTMLInputElement} $input - Checkbox input
77
85
  */
78
86
  Checkboxes.prototype.syncConditionalRevealWithInputState = function ($input) {
79
87
  var $target = document.getElementById($input.getAttribute('aria-controls'))
@@ -91,6 +99,8 @@ Checkboxes.prototype.syncConditionalRevealWithInputState = function ($input) {
91
99
  *
92
100
  * Find any other checkbox inputs with the same name value, and uncheck them.
93
101
  * This is useful for when a “None of these" checkbox is checked.
102
+ *
103
+ * @param {HTMLElement} $input - Checkbox input
94
104
  */
95
105
  Checkboxes.prototype.unCheckAllInputsExcept = function ($input) {
96
106
  var allInputsWithSameName = document.querySelectorAll('input[type="checkbox"][name="' + $input.name + '"]')
@@ -105,11 +115,13 @@ Checkboxes.prototype.unCheckAllInputsExcept = function ($input) {
105
115
  }
106
116
 
107
117
  /**
108
- * Uncheck exclusive inputs
118
+ * Uncheck exclusive checkboxes
109
119
  *
110
120
  * Find any checkbox inputs with the same name value and the 'exclusive' behaviour,
111
121
  * and uncheck them. This helps prevent someone checking both a regular checkbox and a
112
122
  * "None of these" checkbox in the same fieldset.
123
+ *
124
+ * @param {HTMLInputElement} $input - Checkbox input
113
125
  */
114
126
  Checkboxes.prototype.unCheckExclusiveInputs = function ($input) {
115
127
  var allInputsWithSameNameAndExclusiveBehaviour = document.querySelectorAll(
@@ -131,33 +143,33 @@ Checkboxes.prototype.unCheckExclusiveInputs = function ($input) {
131
143
  * Handle a click within the $module – if the click occurred on a checkbox, sync
132
144
  * the state of any associated conditional reveal with the checkbox state.
133
145
  *
134
- * @param {MouseEvent} event Click event
146
+ * @param {MouseEvent} event - Click event
135
147
  */
136
148
  Checkboxes.prototype.handleClick = function (event) {
137
- var $target = event.target
149
+ var $clickedInput = event.target
138
150
 
139
151
  // Ignore clicks on things that aren't checkbox inputs
140
- if ($target.type !== 'checkbox') {
152
+ if ($clickedInput.type !== 'checkbox') {
141
153
  return
142
154
  }
143
155
 
144
156
  // If the checkbox conditionally-reveals some content, sync the state
145
- var hasAriaControls = $target.getAttribute('aria-controls')
157
+ var hasAriaControls = $clickedInput.getAttribute('aria-controls')
146
158
  if (hasAriaControls) {
147
- this.syncConditionalRevealWithInputState($target)
159
+ this.syncConditionalRevealWithInputState($clickedInput)
148
160
  }
149
161
 
150
162
  // No further behaviour needed for unchecking
151
- if (!$target.checked) {
163
+ if (!$clickedInput.checked) {
152
164
  return
153
165
  }
154
166
 
155
167
  // Handle 'exclusive' checkbox behaviour (ie "None of these")
156
- var hasBehaviourExclusive = ($target.getAttribute('data-behaviour') === 'exclusive')
168
+ var hasBehaviourExclusive = ($clickedInput.getAttribute('data-behaviour') === 'exclusive')
157
169
  if (hasBehaviourExclusive) {
158
- this.unCheckAllInputsExcept($target)
170
+ this.unCheckAllInputsExcept($clickedInput)
159
171
  } else {
160
- this.unCheckExclusiveInputs($target)
172
+ this.unCheckExclusiveInputs($clickedInput)
161
173
  }
162
174
  }
163
175
 
@@ -1,20 +1,31 @@
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+
1
3
  /**
2
4
  * JavaScript 'polyfill' for HTML5's <details> and <summary> elements
3
5
  * and 'shim' to add accessiblity enhancements for all browsers
4
6
  *
5
7
  * http://caniuse.com/#feat=details
6
8
  */
9
+ import { generateUniqueID } from '../../common/index.mjs'
10
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
7
11
  import '../../vendor/polyfills/Function/prototype/bind.mjs'
8
- import '../../vendor/polyfills/Event.mjs' // addEventListener and event.target normaliziation
9
- import { generateUniqueID } from '../../common.mjs'
10
12
 
11
13
  var KEY_ENTER = 13
12
14
  var KEY_SPACE = 32
13
15
 
16
+ /**
17
+ * Details component
18
+ *
19
+ * @class
20
+ * @param {HTMLElement} $module - HTML element to use for details
21
+ */
14
22
  function Details ($module) {
15
23
  this.$module = $module
16
24
  }
17
25
 
26
+ /**
27
+ * Initialise component
28
+ */
18
29
  Details.prototype.init = function () {
19
30
  if (!this.$module) {
20
31
  return
@@ -30,6 +41,9 @@ Details.prototype.init = function () {
30
41
  this.polyfillDetails()
31
42
  }
32
43
 
44
+ /**
45
+ * Polyfill component in older browsers
46
+ */
33
47
  Details.prototype.polyfillDetails = function () {
34
48
  var $module = this.$module
35
49
 
@@ -73,13 +87,14 @@ Details.prototype.polyfillDetails = function () {
73
87
  }
74
88
 
75
89
  // Bind an event to handle summary elements
76
- this.polyfillHandleInputs($summary, this.polyfillSetAttributes.bind(this))
90
+ this.polyfillHandleInputs(this.polyfillSetAttributes.bind(this))
77
91
  }
78
92
 
79
93
  /**
80
- * Define a statechange function that updates aria-expanded and style.display
81
- * @param {object} summary element
82
- */
94
+ * Define a statechange function that updates aria-expanded and style.display
95
+ *
96
+ * @returns {boolean} Returns true
97
+ */
83
98
  Details.prototype.polyfillSetAttributes = function () {
84
99
  if (this.$module.hasAttribute('open')) {
85
100
  this.$module.removeAttribute('open')
@@ -95,22 +110,22 @@ Details.prototype.polyfillSetAttributes = function () {
95
110
  }
96
111
 
97
112
  /**
98
- * Handle cross-modal click events
99
- * @param {object} node element
100
- * @param {function} callback function
101
- */
102
- Details.prototype.polyfillHandleInputs = function (node, callback) {
103
- node.addEventListener('keypress', function (event) {
104
- var target = event.target
113
+ * Handle cross-modal click events
114
+ *
115
+ * @param {polyfillHandleInputsCallback} callback - function
116
+ */
117
+ Details.prototype.polyfillHandleInputs = function (callback) {
118
+ this.$summary.addEventListener('keypress', function (event) {
119
+ var $target = event.target
105
120
  // When the key gets pressed - check if it is enter or space
106
121
  if (event.keyCode === KEY_ENTER || event.keyCode === KEY_SPACE) {
107
- if (target.nodeName.toLowerCase() === 'summary') {
122
+ if ($target.nodeName.toLowerCase() === 'summary') {
108
123
  // Prevent space from scrolling the page
109
124
  // and enter from submitting a form
110
125
  event.preventDefault()
111
126
  // Click to let the click event do all the necessary action
112
- if (target.click) {
113
- target.click()
127
+ if ($target.click) {
128
+ $target.click()
114
129
  } else {
115
130
  // except Safari 5.1 and under don't support .click() here
116
131
  callback(event)
@@ -120,16 +135,22 @@ Details.prototype.polyfillHandleInputs = function (node, callback) {
120
135
  })
121
136
 
122
137
  // Prevent keyup to prevent clicking twice in Firefox when using space key
123
- node.addEventListener('keyup', function (event) {
124
- var target = event.target
138
+ this.$summary.addEventListener('keyup', function (event) {
139
+ var $target = event.target
125
140
  if (event.keyCode === KEY_SPACE) {
126
- if (target.nodeName.toLowerCase() === 'summary') {
141
+ if ($target.nodeName.toLowerCase() === 'summary') {
127
142
  event.preventDefault()
128
143
  }
129
144
  }
130
145
  })
131
146
 
132
- node.addEventListener('click', callback)
147
+ this.$summary.addEventListener('click', callback)
133
148
  }
134
149
 
135
150
  export default Details
151
+
152
+ /**
153
+ * @callback polyfillHandleInputsCallback
154
+ * @param {UIEvent} event - Keyboard or mouse event
155
+ * @returns {void}
156
+ */
@@ -1,11 +1,49 @@
1
- import '../../vendor/polyfills/Function/prototype/bind.mjs'
2
- import '../../vendor/polyfills/Event.mjs' // addEventListener
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+
3
+ import { mergeConfigs } from '../../common/index.mjs'
4
+ import { normaliseDataset } from '../../common/normalise-dataset.mjs'
3
5
  import '../../vendor/polyfills/Element/prototype/closest.mjs'
6
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
7
+ import '../../vendor/polyfills/Function/prototype/bind.mjs'
8
+
9
+ /**
10
+ * JavaScript enhancements for the ErrorSummary
11
+ *
12
+ * Takes focus on initialisation for accessible announcement, unless disabled in configuration.
13
+ *
14
+ * @class
15
+ * @param {HTMLElement} $module - HTML element to use for error summary
16
+ * @param {ErrorSummaryConfig} [config] - Error summary config
17
+ */
18
+ function ErrorSummary ($module, config) {
19
+ // Some consuming code may not be passing a module,
20
+ // for example if they initialise the component
21
+ // on their own by directly passing the result
22
+ // of `document.querySelector`.
23
+ // To avoid breaking further JavaScript initialisation
24
+ // we need to safeguard against this so things keep
25
+ // working the same now we read the elements data attributes
26
+ if (!$module) {
27
+ // Little safety in case code gets ported as-is
28
+ // into and ES6 class constructor, where the return value matters
29
+ return this
30
+ }
4
31
 
5
- function ErrorSummary ($module) {
6
32
  this.$module = $module
33
+
34
+ var defaultConfig = {
35
+ disableAutoFocus: false
36
+ }
37
+ this.config = mergeConfigs(
38
+ defaultConfig,
39
+ config || {},
40
+ normaliseDataset($module.dataset)
41
+ )
7
42
  }
8
43
 
44
+ /**
45
+ * Initialise component
46
+ */
9
47
  ErrorSummary.prototype.init = function () {
10
48
  var $module = this.$module
11
49
  if (!$module) {
@@ -22,7 +60,7 @@ ErrorSummary.prototype.init = function () {
22
60
  ErrorSummary.prototype.setFocus = function () {
23
61
  var $module = this.$module
24
62
 
25
- if ($module.getAttribute('data-disable-auto-focus') === 'true') {
63
+ if (this.config.disableAutoFocus) {
26
64
  return
27
65
  }
28
66
 
@@ -38,13 +76,13 @@ ErrorSummary.prototype.setFocus = function () {
38
76
  }
39
77
 
40
78
  /**
41
- * Click event handler
42
- *
43
- * @param {MouseEvent} event - Click event
44
- */
79
+ * Click event handler
80
+ *
81
+ * @param {MouseEvent} event - Click event
82
+ */
45
83
  ErrorSummary.prototype.handleClick = function (event) {
46
- var target = event.target
47
- if (this.focusTarget(target)) {
84
+ var $target = event.target
85
+ if (this.focusTarget($target)) {
48
86
  event.preventDefault()
49
87
  }
50
88
  }
@@ -64,7 +102,7 @@ ErrorSummary.prototype.handleClick = function (event) {
64
102
  * NVDA (as tested in 2018.3.2) - without this only the field type is announced
65
103
  * (e.g. "Edit, has autocomplete").
66
104
  *
67
- * @param {HTMLElement} $target - Event target
105
+ * @param {EventTarget} $target - Event target
68
106
  * @returns {boolean} True if the target was able to be focussed
69
107
  */
70
108
  ErrorSummary.prototype.focusTarget = function ($target) {
@@ -129,10 +167,10 @@ ErrorSummary.prototype.getAssociatedLegendOrLabel = function ($input) {
129
167
  var $fieldset = $input.closest('fieldset')
130
168
 
131
169
  if ($fieldset) {
132
- var legends = $fieldset.getElementsByTagName('legend')
170
+ var $legends = $fieldset.getElementsByTagName('legend')
133
171
 
134
- if (legends.length) {
135
- var $candidateLegend = legends[0]
172
+ if ($legends.length) {
173
+ var $candidateLegend = $legends[0]
136
174
 
137
175
  // If the input type is radio or checkbox, always use the legend if there
138
176
  // is one.
@@ -166,3 +204,11 @@ ErrorSummary.prototype.getAssociatedLegendOrLabel = function ($input) {
166
204
  }
167
205
 
168
206
  export default ErrorSummary
207
+
208
+ /**
209
+ * Error summary config
210
+ *
211
+ * @typedef {object} ErrorSummaryConfig
212
+ * @property {boolean} [disableAutoFocus = false] -
213
+ * If set to `true` the error summary will not be focussed when the page loads.
214
+ */
@@ -1,7 +1,14 @@
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+
1
3
  import '../../vendor/polyfills/Event.mjs'
2
- import '../../vendor/polyfills/Element/prototype/classList.mjs'
3
4
  import '../../vendor/polyfills/Function/prototype/bind.mjs'
4
5
 
6
+ /**
7
+ * Header component
8
+ *
9
+ * @class
10
+ * @param {HTMLElement} $module - HTML element to use for header
11
+ */
5
12
  function Header ($module) {
6
13
  this.$module = $module
7
14
  this.$menuButton = $module && $module.querySelector('.govuk-js-header-toggle')
@@ -22,7 +29,7 @@ function Header ($module) {
22
29
  }
23
30
 
24
31
  /**
25
- * Initialise header
32
+ * Initialise component
26
33
  *
27
34
  * Check for the presence of the header, menu and menu button – if any are
28
35
  * missing then there's nothing to do so return early.
@@ -1,11 +1,29 @@
1
- import '../../vendor/polyfills/Event.mjs' // addEventListener
1
+ import { mergeConfigs } from '../../common/index.mjs'
2
+ import { normaliseDataset } from '../../common/normalise-dataset.mjs'
3
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
2
4
 
3
- function NotificationBanner ($module) {
5
+ /**
6
+ * Notification Banner component
7
+ *
8
+ * @class
9
+ * @param {HTMLElement} $module - HTML element to use for notification banner
10
+ * @param {NotificationBannerConfig} [config] - Notification banner config
11
+ */
12
+ function NotificationBanner ($module, config) {
4
13
  this.$module = $module
14
+
15
+ var defaultConfig = {
16
+ disableAutoFocus: false
17
+ }
18
+ this.config = mergeConfigs(
19
+ defaultConfig,
20
+ config || {},
21
+ normaliseDataset($module.dataset)
22
+ )
5
23
  }
6
24
 
7
25
  /**
8
- * Initialise the component
26
+ * Initialise component
9
27
  */
10
28
  NotificationBanner.prototype.init = function () {
11
29
  var $module = this.$module
@@ -30,7 +48,7 @@ NotificationBanner.prototype.init = function () {
30
48
  NotificationBanner.prototype.setFocus = function () {
31
49
  var $module = this.$module
32
50
 
33
- if ($module.getAttribute('data-disable-auto-focus') === 'true') {
51
+ if (this.config.disableAutoFocus) {
34
52
  return
35
53
  }
36
54
 
@@ -53,3 +71,14 @@ NotificationBanner.prototype.setFocus = function () {
53
71
  }
54
72
 
55
73
  export default NotificationBanner
74
+
75
+ /**
76
+ * Notification banner config
77
+ *
78
+ * @typedef {object} NotificationBannerConfig
79
+ * @property {boolean} [disableAutoFocus = false] -
80
+ * If set to `true` the notification banner will not be focussed when the page
81
+ * loads. This only applies if the component has a `role` of `alert` – in
82
+ * other cases the component will not be focused on page load, regardless of
83
+ * this option.
84
+ */
@@ -1,16 +1,23 @@
1
- import '../../vendor/polyfills/Function/prototype/bind.mjs'
2
- // addEventListener, event.target normalization and DOMContentLoaded
3
- import '../../vendor/polyfills/Event.mjs'
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+
3
+ import { nodeListForEach } from '../../common/index.mjs'
4
4
  import '../../vendor/polyfills/Element/prototype/classList.mjs'
5
- import { nodeListForEach } from '../../common.mjs'
5
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
6
+ import '../../vendor/polyfills/Function/prototype/bind.mjs'
6
7
 
8
+ /**
9
+ * Radios component
10
+ *
11
+ * @class
12
+ * @param {HTMLElement} $module - HTML element to use for radios
13
+ */
7
14
  function Radios ($module) {
8
15
  this.$module = $module
9
16
  this.$inputs = $module.querySelectorAll('input[type="radio"]')
10
17
  }
11
18
 
12
19
  /**
13
- * Initialise Radios
20
+ * Initialise component
14
21
  *
15
22
  * Radios can be associated with a 'conditionally revealed' content block – for
16
23
  * example, a radio for 'Phone' could reveal an additional form field for the
@@ -28,17 +35,17 @@ Radios.prototype.init = function () {
28
35
  var $inputs = this.$inputs
29
36
 
30
37
  nodeListForEach($inputs, function ($input) {
31
- var target = $input.getAttribute('data-aria-controls')
38
+ var targetId = $input.getAttribute('data-aria-controls')
32
39
 
33
40
  // Skip radios without data-aria-controls attributes, or where the
34
41
  // target element does not exist.
35
- if (!target || !document.getElementById(target)) {
42
+ if (!targetId || !document.getElementById(targetId)) {
36
43
  return
37
44
  }
38
45
 
39
46
  // Promote the data-aria-controls attribute to a aria-controls attribute
40
47
  // so that the relationship is exposed in the AOM
41
- $input.setAttribute('aria-controls', target)
48
+ $input.setAttribute('aria-controls', targetId)
42
49
  $input.removeAttribute('data-aria-controls')
43
50
  })
44
51
 
@@ -62,7 +69,7 @@ Radios.prototype.init = function () {
62
69
  }
63
70
 
64
71
  /**
65
- * Sync the conditional reveal states for all inputs in this $module.
72
+ * Sync the conditional reveal states for all radio buttons in this $module.
66
73
  */
67
74
  Radios.prototype.syncAllConditionalReveals = function () {
68
75
  nodeListForEach(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
@@ -74,7 +81,7 @@ Radios.prototype.syncAllConditionalReveals = function () {
74
81
  * Synchronise the visibility of the conditional reveal, and its accessible
75
82
  * state, with the input's checked state.
76
83
  *
77
- * @param {HTMLInputElement} $input Radio input
84
+ * @param {HTMLInputElement} $input - Radio input
78
85
  */
79
86
  Radios.prototype.syncConditionalRevealWithInputState = function ($input) {
80
87
  var $target = document.getElementById($input.getAttribute('aria-controls'))
@@ -95,7 +102,7 @@ Radios.prototype.syncConditionalRevealWithInputState = function ($input) {
95
102
  * with the same name (because checking one radio could have un-checked a radio
96
103
  * in another $module)
97
104
  *
98
- * @param {MouseEvent} event Click event
105
+ * @param {MouseEvent} event - Click event
99
106
  */
100
107
  Radios.prototype.handleClick = function (event) {
101
108
  var $clickedInput = event.target
@@ -1,7 +1,15 @@
1
- import '../../vendor/polyfills/Function/prototype/bind.mjs'
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+
2
3
  import '../../vendor/polyfills/Element/prototype/classList.mjs'
3
- import '../../vendor/polyfills/Event.mjs' // addEventListener and event.target normalization
4
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
5
+ import '../../vendor/polyfills/Function/prototype/bind.mjs'
4
6
 
7
+ /**
8
+ * Skip link component
9
+ *
10
+ * @class
11
+ * @param {HTMLElement} $module - HTML element to use for skip link
12
+ */
5
13
  function SkipLink ($module) {
6
14
  this.$module = $module
7
15
  this.$linkedElement = null
@@ -9,7 +17,7 @@ function SkipLink ($module) {
9
17
  }
10
18
 
11
19
  /**
12
- * Initialise the component
20
+ * Initialise component
13
21
  */
14
22
  SkipLink.prototype.init = function () {
15
23
  // Check for module
@@ -27,10 +35,10 @@ SkipLink.prototype.init = function () {
27
35
  }
28
36
 
29
37
  /**
30
- * Get linked element
31
- *
32
- * @returns {HTMLElement} $linkedElement - DOM element linked to from the skip link
33
- */
38
+ * Get linked element
39
+ *
40
+ * @returns {HTMLElement} $linkedElement - DOM element linked to from the skip link
41
+ */
34
42
  SkipLink.prototype.getLinkedElement = function () {
35
43
  var linkedElementId = this.getFragmentFromUrl()
36
44