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,378 @@
1
+ /**
2
+ * Internal support for selecting messages to render, with placeholder
3
+ * interpolation and locale-aware number formatting and pluralisation
4
+ *
5
+ * @class
6
+ * @private
7
+ * @param {Object<string, unknown>} translations - Key-value pairs of the translation strings to use.
8
+ * @param {object} [config] - Configuration options for the function.
9
+ * @param {string} [config.locale] - An overriding locale for the PluralRules functionality.
10
+ */
11
+ export function I18n (translations, config) {
12
+ // Make list of translations available throughout function
13
+ this.translations = translations || {}
14
+
15
+ // The locale to use for PluralRules and NumberFormat
16
+ this.locale = (config && config.locale) || document.documentElement.lang || 'en'
17
+ }
18
+
19
+ /**
20
+ * The most used function - takes the key for a given piece of UI text and
21
+ * returns the appropriate string.
22
+ *
23
+ * @param {string} lookupKey - The lookup key of the string to use.
24
+ * @param {Object<string, unknown>} [options] - Any options passed with the translation string, e.g: for string interpolation.
25
+ * @returns {string} The appropriate translation string.
26
+ * @throws {Error} Lookup key required
27
+ * @throws {Error} Options required for `${}` placeholders
28
+ */
29
+ I18n.prototype.t = function (lookupKey, options) {
30
+ if (!lookupKey) {
31
+ // Print a console error if no lookup key has been provided
32
+ throw new Error('i18n: lookup key missing')
33
+ }
34
+
35
+ // If the `count` option is set, determine which plural suffix is needed and
36
+ // change the lookupKey to match. We check to see if it's undefined instead of
37
+ // falsy, as this could legitimately be 0.
38
+ if (options && typeof options.count !== 'undefined') {
39
+ // Get the plural suffix
40
+ lookupKey = lookupKey + '.' + this.getPluralSuffix(lookupKey, options.count)
41
+ }
42
+
43
+ if (lookupKey in this.translations) {
44
+ // Fetch the translation string for that lookup key
45
+ var translationString = this.translations[lookupKey]
46
+
47
+ // Check for ${} placeholders in the translation string
48
+ if (translationString.match(/%{(.\S+)}/)) {
49
+ if (!options) {
50
+ throw new Error('i18n: cannot replace placeholders in string if no option data provided')
51
+ }
52
+
53
+ return this.replacePlaceholders(translationString, options)
54
+ } else {
55
+ return translationString
56
+ }
57
+ } else {
58
+ // If the key wasn't found in our translations object,
59
+ // return the lookup key itself as the fallback
60
+ return lookupKey
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Takes a translation string with placeholders, and replaces the placeholders
66
+ * with the provided data
67
+ *
68
+ * @param {string} translationString - The translation string
69
+ * @param {Object<string, unknown>} options - Any options passed with the translation string, e.g: for string interpolation.
70
+ * @returns {string} The translation string to output, with ${} placeholders replaced
71
+ */
72
+ I18n.prototype.replacePlaceholders = function (translationString, options) {
73
+ var formatter
74
+
75
+ if (this.hasIntlNumberFormatSupport()) {
76
+ formatter = new Intl.NumberFormat(this.locale)
77
+ }
78
+
79
+ return translationString.replace(/%{(.\S+)}/g, function (placeholderWithBraces, placeholderKey) {
80
+ if (Object.prototype.hasOwnProperty.call(options, placeholderKey)) {
81
+ var placeholderValue = options[placeholderKey]
82
+
83
+ // If a user has passed `false` as the value for the placeholder
84
+ // treat it as though the value should not be displayed
85
+ if (placeholderValue === false) {
86
+ return ''
87
+ }
88
+
89
+ // If the placeholder's value is a number, localise the number formatting
90
+ if (typeof placeholderValue === 'number' && formatter) {
91
+ return formatter.format(placeholderValue)
92
+ }
93
+
94
+ return placeholderValue
95
+ } else {
96
+ throw new Error('i18n: no data found to replace ' + placeholderWithBraces + ' placeholder in string')
97
+ }
98
+ })
99
+ }
100
+
101
+ /**
102
+ * Check to see if the browser supports Intl and Intl.PluralRules.
103
+ *
104
+ * It requires all conditions to be met in order to be supported:
105
+ * - The browser supports the Intl class (true in IE11)
106
+ * - The implementation of Intl supports PluralRules (NOT true in IE11)
107
+ * - The browser/OS has plural rules for the current locale (browser dependent)
108
+ *
109
+ * @returns {boolean} Returns true if all conditions are met. Returns false otherwise.
110
+ */
111
+ I18n.prototype.hasIntlPluralRulesSupport = function () {
112
+ return Boolean(window.Intl && ('PluralRules' in window.Intl && Intl.PluralRules.supportedLocalesOf(this.locale).length))
113
+ }
114
+
115
+ /**
116
+ * Check to see if the browser supports Intl and Intl.NumberFormat.
117
+ *
118
+ * It requires all conditions to be met in order to be supported:
119
+ * - The browser supports the Intl class (true in IE11)
120
+ * - The implementation of Intl supports NumberFormat (also true in IE11)
121
+ * - The browser/OS has number formatting rules for the current locale (browser dependent)
122
+ *
123
+ * @returns {boolean} Returns true if all conditions are met. Returns false otherwise.
124
+ */
125
+ I18n.prototype.hasIntlNumberFormatSupport = function () {
126
+ return Boolean(window.Intl && ('NumberFormat' in window.Intl && Intl.NumberFormat.supportedLocalesOf(this.locale).length))
127
+ }
128
+
129
+ /**
130
+ * Get the appropriate suffix for the plural form.
131
+ *
132
+ * Uses Intl.PluralRules (or our own fallback implementation) to get the
133
+ * 'preferred' form to use for the given count.
134
+ *
135
+ * Checks that a translation has been provided for that plural form – if it
136
+ * hasn't, it'll fall back to the 'other' plural form (unless that doesn't exist
137
+ * either, in which case an error will be thrown)
138
+ *
139
+ * @param {string} lookupKey - The lookup key of the string to use.
140
+ * @param {number} count - Number used to determine which pluralisation to use.
141
+ * @returns {PluralRule} The suffix associated with the correct pluralisation for this locale.
142
+ * @throws {Error} Plural form `.other` required when preferred plural form is missing
143
+ */
144
+ I18n.prototype.getPluralSuffix = function (lookupKey, count) {
145
+ // Validate that the number is actually a number.
146
+ //
147
+ // Number(count) will turn anything that can't be converted to a Number type
148
+ // into 'NaN'. isFinite filters out NaN, as it isn't a finite number.
149
+ count = Number(count)
150
+ if (!isFinite(count)) { return 'other' }
151
+
152
+ var preferredForm
153
+
154
+ // Check to verify that all the requirements for Intl.PluralRules are met.
155
+ // If so, we can use that instead of our custom implementation. Otherwise,
156
+ // use the hardcoded fallback.
157
+ if (this.hasIntlPluralRulesSupport()) {
158
+ preferredForm = new Intl.PluralRules(this.locale).select(count)
159
+ } else {
160
+ preferredForm = this.selectPluralFormUsingFallbackRules(count)
161
+ }
162
+
163
+ // Use the correct plural form if provided
164
+ if (lookupKey + '.' + preferredForm in this.translations) {
165
+ return preferredForm
166
+ // Fall back to `other` if the plural form is missing, but log a warning
167
+ // to the console
168
+ } else if (lookupKey + '.other' in this.translations) {
169
+ if (console && 'warn' in console) {
170
+ console.warn('i18n: Missing plural form ".' + preferredForm + '" for "' +
171
+ this.locale + '" locale. Falling back to ".other".')
172
+ }
173
+
174
+ return 'other'
175
+ // If the required `other` plural form is missing, all we can do is error
176
+ } else {
177
+ throw new Error(
178
+ 'i18n: Plural form ".other" is required for "' + this.locale + '" locale'
179
+ )
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Get the plural form using our fallback implementation
185
+ *
186
+ * This is split out into a separate function to make it easier to test the
187
+ * fallback behaviour in an environment where Intl.PluralRules exists.
188
+ *
189
+ * @param {number} count - Number used to determine which pluralisation to use.
190
+ * @returns {PluralRule} The pluralisation form for count in this locale.
191
+ */
192
+ I18n.prototype.selectPluralFormUsingFallbackRules = function (count) {
193
+ // Currently our custom code can only handle positive integers, so let's
194
+ // make sure our number is one of those.
195
+ count = Math.abs(Math.floor(count))
196
+
197
+ var ruleset = this.getPluralRulesForLocale()
198
+
199
+ if (ruleset) {
200
+ return I18n.pluralRules[ruleset](count)
201
+ }
202
+
203
+ return 'other'
204
+ }
205
+
206
+ /**
207
+ * Work out which pluralisation rules to use for the current locale
208
+ *
209
+ * The locale may include a regional indicator (such as en-GB), but we don't
210
+ * usually care about this part, as pluralisation rules are usually the same
211
+ * regardless of region. There are exceptions, however, (e.g. Portuguese) so
212
+ * this searches by both the full and shortened locale codes, just to be sure.
213
+ *
214
+ * @returns {PluralRuleName | undefined} The name of the pluralisation rule to use (a key for one
215
+ * of the functions in this.pluralRules)
216
+ */
217
+ I18n.prototype.getPluralRulesForLocale = function () {
218
+ var locale = this.locale
219
+ var localeShort = locale.split('-')[0]
220
+
221
+ // Look through the plural rules map to find which `pluralRule` is
222
+ // appropriate for our current `locale`.
223
+ for (var pluralRule in I18n.pluralRulesMap) {
224
+ if (Object.prototype.hasOwnProperty.call(I18n.pluralRulesMap, pluralRule)) {
225
+ var languages = I18n.pluralRulesMap[pluralRule]
226
+ for (var i = 0; i < languages.length; i++) {
227
+ if (languages[i] === locale || languages[i] === localeShort) {
228
+ return pluralRule
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+
235
+ /**
236
+ * Map of plural rules to languages where those rules apply.
237
+ *
238
+ * Note: These groups are named for the most dominant or recognisable language
239
+ * that uses each system. The groupings do not imply that the languages are
240
+ * related to one another. Many languages have evolved the same systems
241
+ * independently of one another.
242
+ *
243
+ * Code to support more languages can be found in the i18n spike:
244
+ * {@link https://github.com/alphagov/govuk-frontend/blob/spike-i18n-support/src/govuk/i18n.mjs}
245
+ *
246
+ * Languages currently supported:
247
+ *
248
+ * Arabic: Arabic (ar)
249
+ * Chinese: Burmese (my), Chinese (zh), Indonesian (id), Japanese (ja),
250
+ * Javanese (jv), Korean (ko), Malay (ms), Thai (th), Vietnamese (vi)
251
+ * French: Armenian (hy), Bangla (bn), French (fr), Gujarati (gu), Hindi (hi),
252
+ * Persian Farsi (fa), Punjabi (pa), Zulu (zu)
253
+ * German: Afrikaans (af), Albanian (sq), Azerbaijani (az), Basque (eu),
254
+ * Bulgarian (bg), Catalan (ca), Danish (da), Dutch (nl), English (en),
255
+ * Estonian (et), Finnish (fi), Georgian (ka), German (de), Greek (el),
256
+ * Hungarian (hu), Luxembourgish (lb), Norwegian (no), Somali (so),
257
+ * Swahili (sw), Swedish (sv), Tamil (ta), Telugu (te), Turkish (tr),
258
+ * Urdu (ur)
259
+ * Irish: Irish Gaelic (ga)
260
+ * Russian: Russian (ru), Ukrainian (uk)
261
+ * Scottish: Scottish Gaelic (gd)
262
+ * Spanish: European Portuguese (pt-PT), Italian (it), Spanish (es)
263
+ * Welsh: Welsh (cy)
264
+ *
265
+ * @type {Object<PluralRuleName, string[]>}
266
+ */
267
+ I18n.pluralRulesMap = {
268
+ arabic: ['ar'],
269
+ chinese: ['my', 'zh', 'id', 'ja', 'jv', 'ko', 'ms', 'th', 'vi'],
270
+ french: ['hy', 'bn', 'fr', 'gu', 'hi', 'fa', 'pa', 'zu'],
271
+ german: [
272
+ 'af', 'sq', 'az', 'eu', 'bg', 'ca', 'da', 'nl', 'en', 'et', 'fi', 'ka',
273
+ 'de', 'el', 'hu', 'lb', 'no', 'so', 'sw', 'sv', 'ta', 'te', 'tr', 'ur'
274
+ ],
275
+ irish: ['ga'],
276
+ russian: ['ru', 'uk'],
277
+ scottish: ['gd'],
278
+ spanish: ['pt-PT', 'it', 'es'],
279
+ welsh: ['cy']
280
+ }
281
+
282
+ /**
283
+ * Different pluralisation rule sets
284
+ *
285
+ * Returns the appropriate suffix for the plural form associated with `n`.
286
+ * Possible suffixes: 'zero', 'one', 'two', 'few', 'many', 'other' (the actual
287
+ * meaning of each differs per locale). 'other' should always exist, even in
288
+ * languages without plurals, such as Chinese.
289
+ * {@link https://cldr.unicode.org/index/cldr-spec/plural-rules}
290
+ *
291
+ * The count must be a positive integer. Negative numbers and decimals aren't accounted for
292
+ *
293
+ * @type {Object<string, function(number): PluralRule>}
294
+ */
295
+ I18n.pluralRules = {
296
+ /* eslint-disable jsdoc/require-jsdoc */
297
+ arabic: function (n) {
298
+ if (n === 0) { return 'zero' }
299
+ if (n === 1) { return 'one' }
300
+ if (n === 2) { return 'two' }
301
+ if (n % 100 >= 3 && n % 100 <= 10) { return 'few' }
302
+ if (n % 100 >= 11 && n % 100 <= 99) { return 'many' }
303
+ return 'other'
304
+ },
305
+ chinese: function () {
306
+ return 'other'
307
+ },
308
+ french: function (n) {
309
+ return n === 0 || n === 1 ? 'one' : 'other'
310
+ },
311
+ german: function (n) {
312
+ return n === 1 ? 'one' : 'other'
313
+ },
314
+ irish: function (n) {
315
+ if (n === 1) { return 'one' }
316
+ if (n === 2) { return 'two' }
317
+ if (n >= 3 && n <= 6) { return 'few' }
318
+ if (n >= 7 && n <= 10) { return 'many' }
319
+ return 'other'
320
+ },
321
+ russian: function (n) {
322
+ var lastTwo = n % 100
323
+ var last = lastTwo % 10
324
+ if (last === 1 && lastTwo !== 11) { return 'one' }
325
+ if (last >= 2 && last <= 4 && !(lastTwo >= 12 && lastTwo <= 14)) { return 'few' }
326
+ if (last === 0 || (last >= 5 && last <= 9) || (lastTwo >= 11 && lastTwo <= 14)) { return 'many' }
327
+ // Note: The 'other' suffix is only used by decimal numbers in Russian.
328
+ // We don't anticipate it being used, but it's here for consistency.
329
+ return 'other'
330
+ },
331
+ scottish: function (n) {
332
+ if (n === 1 || n === 11) { return 'one' }
333
+ if (n === 2 || n === 12) { return 'two' }
334
+ if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) { return 'few' }
335
+ return 'other'
336
+ },
337
+ spanish: function (n) {
338
+ if (n === 1) { return 'one' }
339
+ if (n % 1000000 === 0 && n !== 0) { return 'many' }
340
+ return 'other'
341
+ },
342
+ welsh: function (n) {
343
+ if (n === 0) { return 'zero' }
344
+ if (n === 1) { return 'one' }
345
+ if (n === 2) { return 'two' }
346
+ if (n === 3) { return 'few' }
347
+ if (n === 6) { return 'many' }
348
+ return 'other'
349
+ }
350
+ /* eslint-enable jsdoc/require-jsdoc */
351
+ }
352
+
353
+ /**
354
+ * Supported languages for plural rules
355
+ *
356
+ * @typedef {'arabic' | 'chinese' | 'french' | 'german' | 'irish' | 'russian' | 'scottish' | 'spanish' | 'welsh'} PluralRuleName
357
+ */
358
+
359
+ /**
360
+ * Plural rule category mnemonic tags
361
+ *
362
+ * @typedef {'zero' | 'one' | 'two' | 'few' | 'many' | 'other'} PluralRule
363
+ */
364
+
365
+ /**
366
+ * Translated message by plural rule they correspond to.
367
+ *
368
+ * Allows to group pluralised messages under a single key when passing
369
+ * translations to a component's constructor
370
+ *
371
+ * @typedef {object} TranslationPluralForms
372
+ * @property {string} [other] - General plural form
373
+ * @property {string} [zero] - Plural form used with 0
374
+ * @property {string} [one] - Plural form used with 1
375
+ * @property {string} [two] - Plural form used with 2
376
+ * @property {string} [few] - Plural form used for a few
377
+ * @property {string} [many] - Plural form used for many
378
+ */
@@ -0,0 +1,13 @@
1
+ (function(undefined) {
2
+
3
+ // Detection from https://github.com/Financial-Times/polyfill-library/blob/v3.111.0/polyfills/Date/now/detect.js
4
+ var detect = ('Date' in self && 'now' in self.Date && 'getTime' in self.Date.prototype)
5
+
6
+ if (detect) return
7
+
8
+ // Polyfill from https://polyfill.io/v3/polyfill.js?version=3.111.0&features=Date.now&flags=always
9
+ Date.now = function () {
10
+ return new Date().getTime();
11
+ };
12
+
13
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
@@ -0,0 +1,68 @@
1
+ import '../../Object/defineProperty.mjs'
2
+ import '../../Element.mjs'
3
+
4
+ (function(undefined) {
5
+
6
+ // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
7
+ var detect = (function(){
8
+ if (!document.documentElement.dataset) {
9
+ return false;
10
+ }
11
+ var el = document.createElement('div');
12
+ el.setAttribute("data-a-b", "c");
13
+ return el.dataset && el.dataset.aB == "c";
14
+ }())
15
+
16
+ if (detect) return
17
+
18
+ // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
19
+ Object.defineProperty(Element.prototype, 'dataset', {
20
+ get: function() {
21
+ var element = this;
22
+ var attributes = this.attributes;
23
+ var map = {};
24
+
25
+ for (var i = 0; i < attributes.length; i++) {
26
+ var attribute = attributes[i];
27
+
28
+ // This regex has been edited from the original polyfill, to add
29
+ // support for period (.) separators in data-* attribute names. These
30
+ // are allowed in the HTML spec, but were not covered by the original
31
+ // polyfill's regex. We use periods in our i18n implementation.
32
+ if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
33
+ var name = attribute.name;
34
+ var value = attribute.value;
35
+
36
+ var propName = name.substr(5).replace(/-./g, function (prop) {
37
+ return prop.charAt(1).toUpperCase();
38
+ });
39
+
40
+ // If this browser supports __defineGetter__ and __defineSetter__,
41
+ // continue using defineProperty. If not (like IE 8 and below), we use
42
+ // a hacky fallback which at least gives an object in the right format
43
+ if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
44
+ Object.defineProperty(map, propName, {
45
+ enumerable: true,
46
+ get: function() {
47
+ return this.value;
48
+ }.bind({value: value || ''}),
49
+ set: function setter(name, value) {
50
+ if (typeof value !== 'undefined') {
51
+ this.setAttribute(name, value);
52
+ } else {
53
+ this.removeAttribute(name);
54
+ }
55
+ }.bind(element, name)
56
+ });
57
+ } else {
58
+ map[propName] = value
59
+ }
60
+
61
+ }
62
+ }
63
+
64
+ return map;
65
+ }
66
+ });
67
+
68
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
@@ -0,0 +1,13 @@
1
+ (function(undefined) {
2
+
3
+ // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
4
+ var detect = ('trim' in String.prototype)
5
+
6
+ if (detect) return
7
+
8
+ // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
9
+ String.prototype.trim = function () {
10
+ return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
11
+ };
12
+
13
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
@@ -0,0 +1,7 @@
1
+ if (window.GOVUKPrototypeKit &&
2
+ window.GOVUKPrototypeKit.documentReady &&
3
+ window.GOVUKPrototypeKit.majorVersion >= 13) {
4
+ window.GOVUKPrototypeKit.documentReady(function () {
5
+ window.GOVUKFrontend.initAll()
6
+ })
7
+ }
@@ -0,0 +1,12 @@
1
+ $govuk-prototype-kit-major-version: 0 !default;
2
+
3
+ $govuk-assets-path: if(
4
+ $govuk-prototype-kit-major-version > 12,
5
+ $govuk-extensions-url-context + "/govuk-frontend/govuk/assets/",
6
+ "/govuk/assets/"
7
+ ) !default;
8
+
9
+ $govuk-global-styles: true !default;
10
+ $govuk-new-link-styles: true !default;
11
+
12
+ @import "../govuk/all";
@@ -1,14 +1,145 @@
1
1
  {
2
- "nunjucksPaths": [
3
- "/"
4
- ],
5
- "scripts": [
6
- "/govuk/all.js"
7
- ],
8
2
  "assets": [
9
3
  "/govuk/assets"
10
4
  ],
11
5
  "sass": [
12
- "/govuk/all.scss"
6
+ "/govuk-prototype-kit/init.scss"
7
+ ],
8
+ "scripts": [
9
+ "/govuk/all.js",
10
+ "/govuk-prototype-kit/init.js"
11
+ ],
12
+ "nunjucksMacros": [
13
+ {
14
+ "importFrom": "govuk/components/accordion/macro.njk",
15
+ "macroName": "govukAccordion"
16
+ },
17
+ {
18
+ "importFrom": "govuk/components/back-link/macro.njk",
19
+ "macroName": "govukBackLink"
20
+ },
21
+ {
22
+ "importFrom": "govuk/components/breadcrumbs/macro.njk",
23
+ "macroName": "govukBreadcrumbs"
24
+ },
25
+ {
26
+ "importFrom": "govuk/components/button/macro.njk",
27
+ "macroName": "govukButton"
28
+ },
29
+ {
30
+ "importFrom": "govuk/components/character-count/macro.njk",
31
+ "macroName": "govukCharacterCount"
32
+ },
33
+ {
34
+ "importFrom": "govuk/components/checkboxes/macro.njk",
35
+ "macroName": "govukCheckboxes"
36
+ },
37
+ {
38
+ "importFrom": "govuk/components/cookie-banner/macro.njk",
39
+ "macroName": "govukCookieBanner"
40
+ },
41
+ {
42
+ "importFrom": "govuk/components/date-input/macro.njk",
43
+ "macroName": "govukDateInput"
44
+ },
45
+ {
46
+ "importFrom": "govuk/components/details/macro.njk",
47
+ "macroName": "govukDetails"
48
+ },
49
+ {
50
+ "importFrom": "govuk/components/error-message/macro.njk",
51
+ "macroName": "govukErrorMessage"
52
+ },
53
+ {
54
+ "importFrom": "govuk/components/error-summary/macro.njk",
55
+ "macroName": "govukErrorSummary"
56
+ },
57
+ {
58
+ "importFrom": "govuk/components/fieldset/macro.njk",
59
+ "macroName": "govukFieldset"
60
+ },
61
+ {
62
+ "importFrom": "govuk/components/file-upload/macro.njk",
63
+ "macroName": "govukFileUpload"
64
+ },
65
+ {
66
+ "importFrom": "govuk/components/footer/macro.njk",
67
+ "macroName": "govukFooter"
68
+ },
69
+ {
70
+ "importFrom": "govuk/components/header/macro.njk",
71
+ "macroName": "govukHeader"
72
+ },
73
+ {
74
+ "importFrom": "govuk/components/hint/macro.njk",
75
+ "macroName": "govukHint"
76
+ },
77
+ {
78
+ "importFrom": "govuk/components/input/macro.njk",
79
+ "macroName": "govukInput"
80
+ },
81
+ {
82
+ "importFrom": "govuk/components/inset-text/macro.njk",
83
+ "macroName": "govukInsetText"
84
+ },
85
+ {
86
+ "importFrom": "govuk/components/label/macro.njk",
87
+ "macroName": "govukLabel"
88
+ },
89
+ {
90
+ "importFrom": "govuk/components/notification-banner/macro.njk",
91
+ "macroName": "govukNotificationBanner"
92
+ },
93
+ {
94
+ "importFrom": "govuk/components/pagination/macro.njk",
95
+ "macroName": "govukPagination"
96
+ },
97
+ {
98
+ "importFrom": "govuk/components/panel/macro.njk",
99
+ "macroName": "govukPanel"
100
+ },
101
+ {
102
+ "importFrom": "govuk/components/phase-banner/macro.njk",
103
+ "macroName": "govukPhaseBanner"
104
+ },
105
+ {
106
+ "importFrom": "govuk/components/radios/macro.njk",
107
+ "macroName": "govukRadios"
108
+ },
109
+ {
110
+ "importFrom": "govuk/components/select/macro.njk",
111
+ "macroName": "govukSelect"
112
+ },
113
+ {
114
+ "importFrom": "govuk/components/skip-link/macro.njk",
115
+ "macroName": "govukSkipLink"
116
+ },
117
+ {
118
+ "importFrom": "govuk/components/summary-list/macro.njk",
119
+ "macroName": "govukSummaryList"
120
+ },
121
+ {
122
+ "importFrom": "govuk/components/table/macro.njk",
123
+ "macroName": "govukTable"
124
+ },
125
+ {
126
+ "importFrom": "govuk/components/tabs/macro.njk",
127
+ "macroName": "govukTabs"
128
+ },
129
+ {
130
+ "importFrom": "govuk/components/tag/macro.njk",
131
+ "macroName": "govukTag"
132
+ },
133
+ {
134
+ "importFrom": "govuk/components/textarea/macro.njk",
135
+ "macroName": "govukTextarea"
136
+ },
137
+ {
138
+ "importFrom": "govuk/components/warning-text/macro.njk",
139
+ "macroName": "govukWarningText"
140
+ }
141
+ ],
142
+ "nunjucksPaths": [
143
+ "/"
13
144
  ]
14
145
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "govuk-frontend",
3
3
  "description": "GOV.UK Frontend contains the code you need to start building a user interface for government platforms and services.",
4
- "version": "4.3.1",
4
+ "version": "4.5.0",
5
5
  "main": "govuk/all.js",
6
6
  "module": "govuk-esm/all.mjs",
7
7
  "exports": {