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,60 @@
1
+ /* eslint-disable es-x/no-string-prototype-trim -- Polyfill imported */
2
+
3
+ import '../vendor/polyfills/Element/prototype/dataset.mjs'
4
+ import '../vendor/polyfills/String/prototype/trim.mjs'
5
+
6
+ /**
7
+ * Normalise string
8
+ *
9
+ * 'If it looks like a duck, and it quacks like a duck…' 🦆
10
+ *
11
+ * If the passed value looks like a boolean or a number, convert it to a boolean
12
+ * or number.
13
+ *
14
+ * Designed to be used to convert config passed via data attributes (which are
15
+ * always strings) into something sensible.
16
+ *
17
+ * @param {string} value - The value to normalise
18
+ * @returns {string | boolean | number | undefined} Normalised data
19
+ */
20
+ export function normaliseString (value) {
21
+ if (typeof value !== 'string') {
22
+ return value
23
+ }
24
+
25
+ var trimmedValue = value.trim()
26
+
27
+ if (trimmedValue === 'true') {
28
+ return true
29
+ }
30
+
31
+ if (trimmedValue === 'false') {
32
+ return false
33
+ }
34
+
35
+ // Empty / whitespace-only strings are considered finite so we need to check
36
+ // the length of the trimmed string as well
37
+ if (trimmedValue.length > 0 && isFinite(trimmedValue)) {
38
+ return Number(trimmedValue)
39
+ }
40
+
41
+ return value
42
+ }
43
+
44
+ /**
45
+ * Normalise dataset
46
+ *
47
+ * Loop over an object and normalise each value using normaliseData function
48
+ *
49
+ * @param {DOMStringMap} dataset - HTML element dataset
50
+ * @returns {Object<string, unknown>} Normalised dataset
51
+ */
52
+ export function normaliseDataset (dataset) {
53
+ var out = {}
54
+
55
+ for (var key in dataset) {
56
+ out[key] = normaliseString(dataset[key])
57
+ }
58
+
59
+ return out
60
+ }
@@ -1,28 +1,6 @@
1
- /**
2
- * TODO: Ideally this would be a NodeList.prototype.forEach polyfill
3
- * This seems to fail in IE8, requires more investigation.
4
- * See: https://github.com/imagitama/nodelist-foreach-polyfill
5
- */
6
- export function nodeListForEach (nodes, callback) {
7
- if (window.NodeList.prototype.forEach) {
8
- return nodes.forEach(callback)
9
- }
10
- for (var i = 0; i < nodes.length; i++) {
11
- callback.call(window, nodes[i], i, nodes)
12
- }
13
- }
14
-
15
- // Used to generate a unique string, allows multiple instances of the component without
16
- // Them conflicting with each other.
17
- // https://stackoverflow.com/a/8809472
18
- export function generateUniqueID () {
19
- var d = new Date().getTime()
20
- if (typeof window.performance !== 'undefined' && typeof window.performance.now === 'function') {
21
- d += window.performance.now() // use high-precision timer if available
22
- }
23
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
24
- var r = (d + Math.random() * 16) % 16 | 0
25
- d = Math.floor(d / 16)
26
- return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)
27
- })
28
- }
1
+ // Implementation of common function is gathered in the `common` folder
2
+ // as some are split in their own modules to limit impacts of the polyfills
3
+ // they require.
4
+ // This module exports the non polyfilled methods as they used to be
5
+ // to avoid breaking changes
6
+ export * from './common/index.mjs'
@@ -1,39 +1,71 @@
1
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
2
+ /* eslint-disable es-x/no-string-prototype-trim -- Polyfill imported */
1
3
 
2
- /*
3
- Accordion
4
-
5
- This allows a collection of sections to be collapsed by default,
6
- showing only their headers. Sections can be expanded or collapsed
7
- individually by clicking their headers. An "Show all sections" button is
8
- also added to the top of the accordion, which switches to "Hide all sections"
9
- when all the sections are expanded.
4
+ import { nodeListForEach, mergeConfigs, extractConfigByNamespace } from '../../common/index.mjs'
5
+ import { normaliseDataset } from '../../common/normalise-dataset.mjs'
6
+ import { I18n } from '../../i18n.mjs'
7
+ import '../../vendor/polyfills/Element/prototype/classList.mjs'
8
+ import '../../vendor/polyfills/Element/prototype/closest.mjs'
9
+ import '../../vendor/polyfills/Event.mjs' // addEventListener, event.target normalization and DOMContentLoaded
10
+ import '../../vendor/polyfills/Function/prototype/bind.mjs'
11
+ import '../../vendor/polyfills/String/prototype/trim.mjs'
10
12
 
11
- The state of each section is saved to the DOM via the `aria-expanded`
12
- attribute, which also provides accessibility.
13
+ /**
14
+ * @constant
15
+ * @type {AccordionTranslations}
16
+ * @see Default value for {@link AccordionConfig.i18n}
17
+ * @default
18
+ */
19
+ var ACCORDION_TRANSLATIONS = {
20
+ hideAllSections: 'Hide all sections',
21
+ hideSection: 'Hide',
22
+ hideSectionAriaLabel: 'Hide this section',
23
+ showAllSections: 'Show all sections',
24
+ showSection: 'Show',
25
+ showSectionAriaLabel: 'Show this section'
26
+ }
13
27
 
14
- A Chevron icon has been added for extra affordance that this is an interactive element.
28
+ /**
29
+ * Accordion component
30
+ *
31
+ * This allows a collection of sections to be collapsed by default, showing only
32
+ * their headers. Sections can be expanded or collapsed individually by clicking
33
+ * their headers. A "Show all sections" button is also added to the top of the
34
+ * accordion, which switches to "Hide all sections" when all the sections are
35
+ * expanded.
36
+ *
37
+ * The state of each section is saved to the DOM via the `aria-expanded`
38
+ * attribute, which also provides accessibility.
39
+ *
40
+ * @class
41
+ * @param {HTMLElement} $module - HTML element to use for accordion
42
+ * @param {AccordionConfig} [config] - Accordion config
43
+ */
44
+ function Accordion ($module, config) {
45
+ this.$module = $module
15
46
 
16
- */
47
+ var defaultConfig = {
48
+ i18n: ACCORDION_TRANSLATIONS
49
+ }
17
50
 
18
- import { nodeListForEach } from '../../common.mjs'
19
- import '../../vendor/polyfills/Function/prototype/bind.mjs'
20
- import '../../vendor/polyfills/Element/prototype/classList.mjs'
51
+ this.config = mergeConfigs(
52
+ defaultConfig,
53
+ config || {},
54
+ normaliseDataset($module.dataset)
55
+ )
21
56
 
22
- function Accordion ($module) {
23
- this.$module = $module
24
- this.moduleId = $module.getAttribute('id')
25
- this.$sections = $module.querySelectorAll('.govuk-accordion__section')
26
- this.$showAllButton = ''
27
- this.browserSupportsSessionStorage = helper.checkForSessionStorage()
57
+ this.i18n = new I18n(extractConfigByNamespace(this.config, 'i18n'))
28
58
 
29
59
  this.controlsClass = 'govuk-accordion__controls'
30
60
  this.showAllClass = 'govuk-accordion__show-all'
31
61
  this.showAllTextClass = 'govuk-accordion__show-all-text'
32
62
 
63
+ this.sectionClass = 'govuk-accordion__section'
33
64
  this.sectionExpandedClass = 'govuk-accordion__section--expanded'
34
65
  this.sectionButtonClass = 'govuk-accordion__section-button'
35
66
  this.sectionHeaderClass = 'govuk-accordion__section-header'
36
67
  this.sectionHeadingClass = 'govuk-accordion__section-heading'
68
+ this.sectionHeadingDividerClass = 'govuk-accordion__section-heading-divider'
37
69
  this.sectionHeadingTextClass = 'govuk-accordion__section-heading-text'
38
70
  this.sectionHeadingTextFocusClass = 'govuk-accordion__section-heading-text-focus'
39
71
 
@@ -45,9 +77,15 @@ function Accordion ($module) {
45
77
 
46
78
  this.sectionSummaryClass = 'govuk-accordion__section-summary'
47
79
  this.sectionSummaryFocusClass = 'govuk-accordion__section-summary-focus'
80
+ this.sectionContentClass = 'govuk-accordion__section-content'
81
+
82
+ this.$sections = this.$module.querySelectorAll('.' + this.sectionClass)
83
+ this.browserSupportsSessionStorage = helper.checkForSessionStorage()
48
84
  }
49
85
 
50
- // Initialize component
86
+ /**
87
+ * Initialise component
88
+ */
51
89
  Accordion.prototype.init = function () {
52
90
  // Check for module
53
91
  if (!this.$module) {
@@ -62,7 +100,9 @@ Accordion.prototype.init = function () {
62
100
  this.updateShowAllButton(areAllSectionsOpen)
63
101
  }
64
102
 
65
- // Initialise controls and set attributes
103
+ /**
104
+ * Initialise controls and set attributes
105
+ */
66
106
  Accordion.prototype.initControls = function () {
67
107
  // Create "Show all" button and set attributes
68
108
  this.$showAllButton = document.createElement('button')
@@ -71,9 +111,9 @@ Accordion.prototype.initControls = function () {
71
111
  this.$showAllButton.setAttribute('aria-expanded', 'false')
72
112
 
73
113
  // Create icon, add to element
74
- var $icon = document.createElement('span')
75
- $icon.classList.add(this.upChevronIconClass)
76
- this.$showAllButton.appendChild($icon)
114
+ this.$showAllIcon = document.createElement('span')
115
+ this.$showAllIcon.classList.add(this.upChevronIconClass)
116
+ this.$showAllButton.appendChild(this.$showAllIcon)
77
117
 
78
118
  // Create control wrapper and add controls to it
79
119
  var $accordionControls = document.createElement('div')
@@ -82,15 +122,22 @@ Accordion.prototype.initControls = function () {
82
122
  this.$module.insertBefore($accordionControls, this.$module.firstChild)
83
123
 
84
124
  // Build additional wrapper for Show all toggle text and place after icon
85
- var $wrappershowAllText = document.createElement('span')
86
- $wrappershowAllText.classList.add(this.showAllTextClass)
87
- this.$showAllButton.appendChild($wrappershowAllText)
125
+ this.$showAllText = document.createElement('span')
126
+ this.$showAllText.classList.add(this.showAllTextClass)
127
+ this.$showAllButton.appendChild(this.$showAllText)
88
128
 
89
129
  // Handle click events on the show/hide all button
90
130
  this.$showAllButton.addEventListener('click', this.onShowOrHideAllToggle.bind(this))
131
+
132
+ // Handle 'beforematch' events, if the user agent supports them
133
+ if ('onbeforematch' in document) {
134
+ document.addEventListener('beforematch', this.onBeforeMatch.bind(this))
135
+ }
91
136
  }
92
137
 
93
- // Initialise section headers
138
+ /**
139
+ * Initialise section headers
140
+ */
94
141
  Accordion.prototype.initSectionHeaders = function () {
95
142
  // Loop through section headers
96
143
  nodeListForEach(this.$sections, function ($section, i) {
@@ -108,15 +155,21 @@ Accordion.prototype.initSectionHeaders = function () {
108
155
  }.bind(this))
109
156
  }
110
157
 
111
- Accordion.prototype.constructHeaderMarkup = function ($headerWrapper, index) {
112
- var $span = $headerWrapper.querySelector('.' + this.sectionButtonClass)
113
- var $heading = $headerWrapper.querySelector('.' + this.sectionHeadingClass)
114
- var $summary = $headerWrapper.querySelector('.' + this.sectionSummaryClass)
158
+ /**
159
+ * Construct section header
160
+ *
161
+ * @param {HTMLDivElement} $header - Section header
162
+ * @param {number} index - Section index
163
+ */
164
+ Accordion.prototype.constructHeaderMarkup = function ($header, index) {
165
+ var $span = $header.querySelector('.' + this.sectionButtonClass)
166
+ var $heading = $header.querySelector('.' + this.sectionHeadingClass)
167
+ var $summary = $header.querySelector('.' + this.sectionSummaryClass)
115
168
 
116
169
  // Create a button element that will replace the '.govuk-accordion__section-button' span
117
170
  var $button = document.createElement('button')
118
171
  $button.setAttribute('type', 'button')
119
- $button.setAttribute('aria-controls', this.moduleId + '-content-' + (index + 1))
172
+ $button.setAttribute('aria-controls', this.$module.id + '-content-' + (index + 1))
120
173
 
121
174
  // Copy all attributes (https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes) from $span to $button
122
175
  for (var i = 0; i < $span.attributes.length; i++) {
@@ -143,23 +196,23 @@ Accordion.prototype.constructHeaderMarkup = function ($headerWrapper, index) {
143
196
  $headingTextFocus.innerHTML = $span.innerHTML
144
197
 
145
198
  // Create container for show / hide icons and text.
146
- var $showToggle = document.createElement('span')
147
- $showToggle.classList.add(this.sectionShowHideToggleClass)
199
+ var $showHideToggle = document.createElement('span')
200
+ $showHideToggle.classList.add(this.sectionShowHideToggleClass)
148
201
  // Tell Google not to index the 'show' text as part of the heading
149
202
  // For the snippet to work with JavaScript, it must be added before adding the page element to the
150
203
  // page's DOM. See https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#data-nosnippet-attr
151
- $showToggle.setAttribute('data-nosnippet', '')
204
+ $showHideToggle.setAttribute('data-nosnippet', '')
152
205
  // Create an inner container to limit the width of the focus state
153
- var $showToggleFocus = document.createElement('span')
154
- $showToggleFocus.classList.add(this.sectionShowHideToggleFocusClass)
155
- $showToggle.appendChild($showToggleFocus)
206
+ var $showHideToggleFocus = document.createElement('span')
207
+ $showHideToggleFocus.classList.add(this.sectionShowHideToggleFocusClass)
208
+ $showHideToggle.appendChild($showHideToggleFocus)
156
209
  // Create wrapper for the show / hide text. Append text after the show/hide icon
157
- var $showToggleText = document.createElement('span')
158
- var $icon = document.createElement('span')
159
- $icon.classList.add(this.upChevronIconClass)
160
- $showToggleFocus.appendChild($icon)
161
- $showToggleText.classList.add(this.sectionShowHideTextClass)
162
- $showToggleFocus.appendChild($showToggleText)
210
+ var $showHideText = document.createElement('span')
211
+ var $showHideIcon = document.createElement('span')
212
+ $showHideIcon.classList.add(this.upChevronIconClass)
213
+ $showHideToggleFocus.appendChild($showHideIcon)
214
+ $showHideText.classList.add(this.sectionShowHideTextClass)
215
+ $showHideToggleFocus.appendChild($showHideText)
163
216
 
164
217
  // Append elements to the button:
165
218
  // 1. Heading text
@@ -198,13 +251,29 @@ Accordion.prototype.constructHeaderMarkup = function ($headerWrapper, index) {
198
251
  $button.appendChild(this.getButtonPunctuationEl())
199
252
  }
200
253
 
201
- $button.appendChild($showToggle)
254
+ $button.appendChild($showHideToggle)
202
255
 
203
256
  $heading.removeChild($span)
204
257
  $heading.appendChild($button)
205
258
  }
206
259
 
207
- // When section toggled, set and store state
260
+ /**
261
+ * When a section is opened by the user agent via the 'beforematch' event
262
+ *
263
+ * @param {Event} event - Generic event
264
+ */
265
+ Accordion.prototype.onBeforeMatch = function (event) {
266
+ var $section = event.target.closest('.' + this.sectionClass)
267
+ if ($section) {
268
+ this.setExpanded(true, $section)
269
+ }
270
+ }
271
+
272
+ /**
273
+ * When section toggled, set and store state
274
+ *
275
+ * @param {HTMLElement} $section - Section element
276
+ */
208
277
  Accordion.prototype.onSectionToggle = function ($section) {
209
278
  var expanded = this.isExpanded($section)
210
279
  this.setExpanded(!expanded, $section)
@@ -213,7 +282,9 @@ Accordion.prototype.onSectionToggle = function ($section) {
213
282
  this.storeState($section)
214
283
  }
215
284
 
216
- // When Open/Close All toggled, set and store state
285
+ /**
286
+ * When Open/Close All toggled, set and store state
287
+ */
217
288
  Accordion.prototype.onShowOrHideAllToggle = function () {
218
289
  var $module = this
219
290
  var $sections = this.$sections
@@ -228,29 +299,59 @@ Accordion.prototype.onShowOrHideAllToggle = function () {
228
299
  $module.updateShowAllButton(nowExpanded)
229
300
  }
230
301
 
231
- // Set section attributes when opened/closed
302
+ /**
303
+ * Set section attributes when opened/closed
304
+ *
305
+ * @param {boolean} expanded - Section expanded
306
+ * @param {HTMLElement} $section - Section element
307
+ */
232
308
  Accordion.prototype.setExpanded = function (expanded, $section) {
233
- var $icon = $section.querySelector('.' + this.upChevronIconClass)
309
+ var $showHideIcon = $section.querySelector('.' + this.upChevronIconClass)
234
310
  var $showHideText = $section.querySelector('.' + this.sectionShowHideTextClass)
235
311
  var $button = $section.querySelector('.' + this.sectionButtonClass)
236
- var newButtonText = expanded ? 'Hide' : 'Show'
312
+ var $content = $section.querySelector('.' + this.sectionContentClass)
237
313
 
238
- // Build additional copy of "this section" for assistive technology and place inside toggle link
239
- var $visuallyHiddenText = document.createElement('span')
240
- $visuallyHiddenText.classList.add('govuk-visually-hidden')
241
- $visuallyHiddenText.innerHTML = ' this section'
314
+ var newButtonText = expanded
315
+ ? this.i18n.t('hideSection')
316
+ : this.i18n.t('showSection')
242
317
 
243
- $showHideText.innerHTML = newButtonText
244
- $showHideText.appendChild($visuallyHiddenText)
318
+ $showHideText.innerText = newButtonText
245
319
  $button.setAttribute('aria-expanded', expanded)
246
320
 
321
+ // Update aria-label combining
322
+ var ariaLabelParts = []
323
+
324
+ var $headingText = $section.querySelector('.' + this.sectionHeadingTextClass)
325
+ if ($headingText) {
326
+ ariaLabelParts.push($headingText.innerText.trim())
327
+ }
328
+
329
+ var $summary = $section.querySelector('.' + this.sectionSummaryClass)
330
+ if ($summary) {
331
+ ariaLabelParts.push($summary.innerText.trim())
332
+ }
333
+
334
+ var ariaLabelMessage = expanded
335
+ ? this.i18n.t('hideSectionAriaLabel')
336
+ : this.i18n.t('showSectionAriaLabel')
337
+ ariaLabelParts.push(ariaLabelMessage)
338
+
339
+ /*
340
+ * Join with a comma to add pause for assistive technology.
341
+ * Example: [heading]Section A ,[pause] Show this section.
342
+ * https://accessibility.blog.gov.uk/2017/12/18/what-working-on-gov-uk-navigation-taught-us-about-accessibility/
343
+ */
344
+ $button.setAttribute('aria-label', ariaLabelParts.join(' , '))
345
+
247
346
  // Swap icon, change class
248
347
  if (expanded) {
348
+ $content.removeAttribute('hidden')
249
349
  $section.classList.add(this.sectionExpandedClass)
250
- $icon.classList.remove(this.downChevronIconClass)
350
+ $showHideIcon.classList.remove(this.downChevronIconClass)
251
351
  } else {
352
+ $content.setAttribute('hidden', 'until-found')
252
353
  $section.classList.remove(this.sectionExpandedClass)
253
- $icon.classList.add(this.downChevronIconClass)
354
+ $showHideIcon.classList.add(this.downChevronIconClass)
254
355
  }
255
356
 
256
357
  // See if "Show all sections" button text should be updated
@@ -258,12 +359,21 @@ Accordion.prototype.setExpanded = function (expanded, $section) {
258
359
  this.updateShowAllButton(areAllSectionsOpen)
259
360
  }
260
361
 
261
- // Get state of section
362
+ /**
363
+ * Get state of section
364
+ *
365
+ * @param {HTMLElement} $section - Section element
366
+ * @returns {boolean} True if expanded
367
+ */
262
368
  Accordion.prototype.isExpanded = function ($section) {
263
369
  return $section.classList.contains(this.sectionExpandedClass)
264
370
  }
265
371
 
266
- // Check if all sections are open
372
+ /**
373
+ * Check if all sections are open
374
+ *
375
+ * @returns {boolean} True if all sections are open
376
+ */
267
377
  Accordion.prototype.checkIfAllSectionsOpen = function () {
268
378
  // Get a count of all the Accordion sections
269
379
  var sectionsCount = this.$sections.length
@@ -274,24 +384,33 @@ Accordion.prototype.checkIfAllSectionsOpen = function () {
274
384
  return areAllSectionsOpen
275
385
  }
276
386
 
277
- // Update "Show all sections" button
387
+ /**
388
+ * Update "Show all sections" button
389
+ *
390
+ * @param {boolean} expanded - Section expanded
391
+ */
278
392
  Accordion.prototype.updateShowAllButton = function (expanded) {
279
- var $showAllIcon = this.$showAllButton.querySelector('.' + this.upChevronIconClass)
280
- var $showAllText = this.$showAllButton.querySelector('.' + this.showAllTextClass)
281
- var newButtonText = expanded ? 'Hide all sections' : 'Show all sections'
393
+ var newButtonText = expanded
394
+ ? this.i18n.t('hideAllSections')
395
+ : this.i18n.t('showAllSections')
396
+
282
397
  this.$showAllButton.setAttribute('aria-expanded', expanded)
283
- $showAllText.innerHTML = newButtonText
398
+ this.$showAllText.innerText = newButtonText
284
399
 
285
400
  // Swap icon, toggle class
286
401
  if (expanded) {
287
- $showAllIcon.classList.remove(this.downChevronIconClass)
402
+ this.$showAllIcon.classList.remove(this.downChevronIconClass)
288
403
  } else {
289
- $showAllIcon.classList.add(this.downChevronIconClass)
404
+ this.$showAllIcon.classList.add(this.downChevronIconClass)
290
405
  }
291
406
  }
292
407
 
293
- // Check for `window.sessionStorage`, and that it actually works.
294
408
  var helper = {
409
+ /**
410
+ * Check for `window.sessionStorage`, and that it actually works.
411
+ *
412
+ * @returns {boolean} True if session storage is available
413
+ */
295
414
  checkForSessionStorage: function () {
296
415
  var testString = 'this is the test string'
297
416
  var result
@@ -306,7 +425,11 @@ var helper = {
306
425
  }
307
426
  }
308
427
 
309
- // Set the state of the accordions in sessionStorage
428
+ /**
429
+ * Set the state of the accordions in sessionStorage
430
+ *
431
+ * @param {HTMLElement} $section - Section element
432
+ */
310
433
  Accordion.prototype.storeState = function ($section) {
311
434
  if (this.browserSupportsSessionStorage) {
312
435
  // We need a unique way of identifying each content in the Accordion. Since
@@ -326,7 +449,11 @@ Accordion.prototype.storeState = function ($section) {
326
449
  }
327
450
  }
328
451
 
329
- // Read the state of the accordions from sessionStorage
452
+ /**
453
+ * Read the state of the accordions from sessionStorage
454
+ *
455
+ * @param {HTMLElement} $section - Section element
456
+ */
330
457
  Accordion.prototype.setInitialState = function ($section) {
331
458
  if (this.browserSupportsSessionStorage) {
332
459
  var $button = $section.querySelector('.' + this.sectionButtonClass)
@@ -343,22 +470,48 @@ Accordion.prototype.setInitialState = function ($section) {
343
470
  }
344
471
 
345
472
  /**
346
- * Create an element to improve semantics of the section button with punctuation
347
- * @return {object} DOM element
348
- *
349
- * Used to add pause (with a comma) for assistive technology.
350
- * Example: [heading]Section A ,[pause] Show this section.
351
- * https://accessibility.blog.gov.uk/2017/12/18/what-working-on-gov-uk-navigation-taught-us-about-accessibility/
352
- *
353
- * Adding punctuation to the button can also improve its general semantics by dividing its contents
354
- * into thematic chunks.
355
- * See https://github.com/alphagov/govuk-frontend/issues/2327#issuecomment-922957442
356
- */
473
+ * Create an element to improve semantics of the section button with punctuation
474
+ *
475
+ * Adding punctuation to the button can also improve its general semantics by dividing its contents
476
+ * into thematic chunks.
477
+ * See https://github.com/alphagov/govuk-frontend/issues/2327#issuecomment-922957442
478
+ *
479
+ * @returns {HTMLElement} DOM element
480
+ */
357
481
  Accordion.prototype.getButtonPunctuationEl = function () {
358
482
  var $punctuationEl = document.createElement('span')
359
- $punctuationEl.classList.add('govuk-visually-hidden', 'govuk-accordion__section-heading-divider')
483
+ $punctuationEl.classList.add('govuk-visually-hidden', this.sectionHeadingDividerClass)
360
484
  $punctuationEl.innerHTML = ', '
361
485
  return $punctuationEl
362
486
  }
363
487
 
364
488
  export default Accordion
489
+
490
+ /**
491
+ * Accordion config
492
+ *
493
+ * @typedef {object} AccordionConfig
494
+ * @property {AccordionTranslations} [i18n = ACCORDION_TRANSLATIONS] - See constant {@link ACCORDION_TRANSLATIONS}
495
+ */
496
+
497
+ /**
498
+ * Accordion translations
499
+ *
500
+ * @typedef {object} AccordionTranslations
501
+ *
502
+ * Messages used by the component for the labels of its buttons. This includes
503
+ * the visible text shown on screen, and text to help assistive technology users
504
+ * for the buttons toggling each section.
505
+ * @property {string} [hideAllSections] - The text content for the 'Hide all
506
+ * sections' button, used when at least one section is expanded.
507
+ * @property {string} [hideSection] - The text content for the 'Hide'
508
+ * button, used when a section is expanded.
509
+ * @property {string} [hideSectionAriaLabel] - The text content appended to the
510
+ * 'Hide' button's accessible name when a section is expanded.
511
+ * @property {string} [showAllSections] - The text content for the 'Show all
512
+ * sections' button, used when all sections are collapsed.
513
+ * @property {string} [showSection] - The text content for the 'Show'
514
+ * button, used when a section is collapsed.
515
+ * @property {string} [showSectionAriaLabel] - The text content appended to the
516
+ * 'Show' button's accessible name when a section is expanded.
517
+ */