govuk_publishing_components 32.1.0 → 35.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/assets/config/govuk_publishing_components_manifest.js +75 -1
  4. data/app/assets/images/govuk_publishing_components/icon-search.svg +3 -0
  5. data/app/assets/images/govuk_publishing_components/youtube-play-icon.png +0 -0
  6. data/app/assets/images/govuk_publishing_components/youtube-play-icon.svg +4 -0
  7. data/app/assets/javascripts/component_guide/accessibility-test.js +0 -1
  8. data/app/assets/javascripts/govuk_publishing_components/analytics/auto-scroll-tracker.js +2 -1
  9. data/app/assets/javascripts/govuk_publishing_components/analytics/linked-domains.js +135 -0
  10. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-auto-tracker.js +49 -0
  11. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js +341 -27
  12. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-ecommerce-tracker.js +17 -92
  13. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-event-tracker.js +11 -23
  14. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-form-tracker.js +121 -0
  15. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-link-tracker.js +86 -305
  16. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-page-views.js +13 -6
  17. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-schemas.js +31 -1
  18. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-smart-answer-results-tracker.js +57 -0
  19. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-specialist-link-tracker.js +131 -0
  20. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/init-ga4.js +9 -4
  21. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/pii-remover.js +4 -2
  22. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4.js +4 -0
  23. data/app/assets/javascripts/govuk_publishing_components/components/accordion.js +12 -1
  24. data/app/assets/javascripts/govuk_publishing_components/components/cookie-banner.js +2 -2
  25. data/app/assets/javascripts/govuk_publishing_components/components/image-card.js +19 -0
  26. data/app/assets/javascripts/govuk_publishing_components/components/layout-super-navigation-header.js +2 -81
  27. data/app/assets/javascripts/govuk_publishing_components/components/single-page-notification-button.js +24 -8
  28. data/app/assets/javascripts/govuk_publishing_components/components/step-by-step-nav.js +23 -1
  29. data/app/assets/javascripts/govuk_publishing_components/dependencies.js +13 -0
  30. data/app/assets/javascripts/govuk_publishing_components/lib/govspeak/youtube-link-enhancement.js +3 -2
  31. data/app/assets/javascripts/govuk_publishing_components/lib/trigger-event.js +1 -0
  32. data/app/assets/javascripts/govuk_publishing_components/load-analytics.js +116 -0
  33. data/app/assets/javascripts/govuk_publishing_components/modules.js +7 -2
  34. data/app/assets/javascripts/govuk_publishing_components/vendor/lux/lux-reporter.js +140 -191
  35. data/app/assets/stylesheets/govuk_publishing_components/_individual_component_support.scss +10 -0
  36. data/app/assets/stylesheets/govuk_publishing_components/components/_accordion.scss +29 -0
  37. data/app/assets/stylesheets/govuk_publishing_components/components/_action-link.scss +2 -0
  38. data/app/assets/stylesheets/govuk_publishing_components/components/_attachment.scss +2 -0
  39. data/app/assets/stylesheets/govuk_publishing_components/components/_back-link.scss +1 -0
  40. data/app/assets/stylesheets/govuk_publishing_components/components/_big-number.scss +4 -5
  41. data/app/assets/stylesheets/govuk_publishing_components/components/_breadcrumbs.scss +1 -0
  42. data/app/assets/stylesheets/govuk_publishing_components/components/_button.scss +12 -0
  43. data/app/assets/stylesheets/govuk_publishing_components/components/_cards.scss +20 -0
  44. data/app/assets/stylesheets/govuk_publishing_components/components/_character-count.scss +1 -0
  45. data/app/assets/stylesheets/govuk_publishing_components/components/_checkboxes.scss +1 -0
  46. data/app/assets/stylesheets/govuk_publishing_components/components/_contents-list.scss +21 -0
  47. data/app/assets/stylesheets/govuk_publishing_components/components/_contextual-guidance.scss +2 -0
  48. data/app/assets/stylesheets/govuk_publishing_components/components/_contextual-sidebar.scss +2 -0
  49. data/app/assets/stylesheets/govuk_publishing_components/components/_cookie-banner.scss +7 -0
  50. data/app/assets/stylesheets/govuk_publishing_components/components/_date-input.scss +1 -0
  51. data/app/assets/stylesheets/govuk_publishing_components/components/_details.scss +1 -0
  52. data/app/assets/stylesheets/govuk_publishing_components/components/_devolved-nations.scss +2 -0
  53. data/app/assets/stylesheets/govuk_publishing_components/components/_document-list.scss +8 -0
  54. data/app/assets/stylesheets/govuk_publishing_components/components/_emergency-banner.scss +8 -0
  55. data/app/assets/stylesheets/govuk_publishing_components/components/_error-alert.scss +2 -0
  56. data/app/assets/stylesheets/govuk_publishing_components/components/_error-message.scss +1 -0
  57. data/app/assets/stylesheets/govuk_publishing_components/components/_error-summary.scss +1 -0
  58. data/app/assets/stylesheets/govuk_publishing_components/components/_feedback.scss +17 -19
  59. data/app/assets/stylesheets/govuk_publishing_components/components/_fieldset.scss +1 -0
  60. data/app/assets/stylesheets/govuk_publishing_components/components/_file-upload.scss +1 -0
  61. data/app/assets/stylesheets/govuk_publishing_components/components/_govspeak-html-publication.scss +10 -0
  62. data/app/assets/stylesheets/govuk_publishing_components/components/_govspeak.scss +85 -0
  63. data/app/assets/stylesheets/govuk_publishing_components/components/_heading.scss +2 -0
  64. data/app/assets/stylesheets/govuk_publishing_components/components/_hint.scss +1 -0
  65. data/app/assets/stylesheets/govuk_publishing_components/components/_image-card.scss +85 -6
  66. data/app/assets/stylesheets/govuk_publishing_components/components/_input.scss +6 -6
  67. data/app/assets/stylesheets/govuk_publishing_components/components/_inset-text.scss +1 -0
  68. data/app/assets/stylesheets/govuk_publishing_components/components/_intervention.scss +2 -0
  69. data/app/assets/stylesheets/govuk_publishing_components/components/_inverse-header.scss +2 -0
  70. data/app/assets/stylesheets/govuk_publishing_components/components/_label.scss +1 -0
  71. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-footer.scss +1 -0
  72. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-for-public.scss +2 -0
  73. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +253 -483
  74. data/app/assets/stylesheets/govuk_publishing_components/components/_lead-paragraph.scss +2 -0
  75. data/app/assets/stylesheets/govuk_publishing_components/components/_metadata.scss +2 -0
  76. data/app/assets/stylesheets/govuk_publishing_components/components/_modal-dialogue.scss +2 -0
  77. data/app/assets/stylesheets/govuk_publishing_components/components/_notice.scss +1 -0
  78. data/app/assets/stylesheets/govuk_publishing_components/components/_organisation-logo.scss +2 -0
  79. data/app/assets/stylesheets/govuk_publishing_components/components/_panel.scss +1 -0
  80. data/app/assets/stylesheets/govuk_publishing_components/components/_phase-banner.scss +1 -0
  81. data/app/assets/stylesheets/govuk_publishing_components/components/_previous-and-next-navigation.scss +1 -0
  82. data/app/assets/stylesheets/govuk_publishing_components/components/_print-link.scss +2 -0
  83. data/app/assets/stylesheets/govuk_publishing_components/components/_radio.scss +1 -0
  84. data/app/assets/stylesheets/govuk_publishing_components/components/_related-navigation.scss +2 -0
  85. data/app/assets/stylesheets/govuk_publishing_components/components/_reorderable-list.scss +2 -0
  86. data/app/assets/stylesheets/govuk_publishing_components/components/_search.scss +2 -7
  87. data/app/assets/stylesheets/govuk_publishing_components/components/_select.scss +1 -0
  88. data/app/assets/stylesheets/govuk_publishing_components/components/_share-links.scss +2 -0
  89. data/app/assets/stylesheets/govuk_publishing_components/components/_show-password.scss +2 -0
  90. data/app/assets/stylesheets/govuk_publishing_components/components/_signup-link.scss +2 -0
  91. data/app/assets/stylesheets/govuk_publishing_components/components/_single-page-notification-button.scss +2 -0
  92. data/app/assets/stylesheets/govuk_publishing_components/components/_skip-link.scss +1 -0
  93. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav-header.scss +17 -0
  94. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav-related.scss +2 -0
  95. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav.scss +8 -0
  96. data/app/assets/stylesheets/govuk_publishing_components/components/_subscription-links.scss +2 -1
  97. data/app/assets/stylesheets/govuk_publishing_components/components/_success-alert.scss +1 -0
  98. data/app/assets/stylesheets/govuk_publishing_components/components/_summary-list.scss +1 -0
  99. data/app/assets/stylesheets/govuk_publishing_components/components/_table.scss +1 -0
  100. data/app/assets/stylesheets/govuk_publishing_components/components/_tabs.scss +1 -0
  101. data/app/assets/stylesheets/govuk_publishing_components/components/_textarea.scss +17 -0
  102. data/app/assets/stylesheets/govuk_publishing_components/components/_title.scss +12 -0
  103. data/app/assets/stylesheets/govuk_publishing_components/components/_translation-nav.scss +2 -0
  104. data/app/assets/stylesheets/govuk_publishing_components/components/_warning-text.scss +1 -0
  105. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_steps.scss +26 -9
  106. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_tables.scss +12 -0
  107. data/app/assets/stylesheets/govuk_publishing_components/components/helpers/_brand-colours.scss +2 -2
  108. data/app/assets/stylesheets/govuk_publishing_components/components/helpers/_contents-list-helper.scss +0 -1
  109. data/app/controllers/govuk_publishing_components/application_controller.rb +0 -13
  110. data/app/controllers/govuk_publishing_components/audit_controller.rb +1 -1
  111. data/app/controllers/govuk_publishing_components/component_guide_controller.rb +6 -9
  112. data/app/models/govuk_publishing_components/audit_applications.rb +10 -19
  113. data/app/models/govuk_publishing_components/audit_comparer.rb +29 -24
  114. data/app/models/govuk_publishing_components/audit_components.rb +157 -82
  115. data/app/models/govuk_publishing_components/component_doc.rb +14 -0
  116. data/app/models/govuk_publishing_components/component_wrapper_helper_options.rb +15 -0
  117. data/app/views/govuk_publishing_components/audit/_applications.html.erb +3 -3
  118. data/app/views/govuk_publishing_components/audit/_component_contents.html.erb +47 -39
  119. data/app/views/govuk_publishing_components/audit/_components.html.erb +47 -2
  120. data/app/views/govuk_publishing_components/component_guide/_application_stylesheet.html.erb +0 -3
  121. data/app/views/govuk_publishing_components/component_guide/index.html.erb +0 -7
  122. data/app/views/govuk_publishing_components/component_guide/show.html.erb +21 -6
  123. data/app/views/govuk_publishing_components/components/_accordion.html.erb +30 -36
  124. data/app/views/govuk_publishing_components/components/_action_link.html.erb +7 -2
  125. data/app/views/govuk_publishing_components/components/_attachment.html.erb +2 -0
  126. data/app/views/govuk_publishing_components/components/_attachment_link.html.erb +2 -0
  127. data/app/views/govuk_publishing_components/components/_back_link.html.erb +2 -0
  128. data/app/views/govuk_publishing_components/components/_big_number.html.erb +3 -1
  129. data/app/views/govuk_publishing_components/components/_breadcrumbs.html.erb +8 -2
  130. data/app/views/govuk_publishing_components/components/_button.html.erb +2 -0
  131. data/app/views/govuk_publishing_components/components/_cards.html.erb +6 -4
  132. data/app/views/govuk_publishing_components/components/_character_count.html.erb +2 -0
  133. data/app/views/govuk_publishing_components/components/_checkboxes.html.erb +6 -2
  134. data/app/views/govuk_publishing_components/components/_contents_list.html.erb +11 -15
  135. data/app/views/govuk_publishing_components/components/_contextual_breadcrumbs.html.erb +7 -4
  136. data/app/views/govuk_publishing_components/components/_contextual_footer.html.erb +2 -0
  137. data/app/views/govuk_publishing_components/components/_contextual_guidance.html.erb +2 -0
  138. data/app/views/govuk_publishing_components/components/_contextual_sidebar.html.erb +13 -6
  139. data/app/views/govuk_publishing_components/components/_cookie_banner.html.erb +12 -6
  140. data/app/views/govuk_publishing_components/components/_date_input.html.erb +2 -0
  141. data/app/views/govuk_publishing_components/components/_details.html.erb +5 -1
  142. data/app/views/govuk_publishing_components/components/_devolved_nations.html.erb +2 -0
  143. data/app/views/govuk_publishing_components/components/_document_list.html.erb +3 -0
  144. data/app/views/govuk_publishing_components/components/_emergency_banner.html.erb +2 -0
  145. data/app/views/govuk_publishing_components/components/_error_alert.html.erb +2 -0
  146. data/app/views/govuk_publishing_components/components/_error_message.html.erb +4 -1
  147. data/app/views/govuk_publishing_components/components/_error_summary.html.erb +29 -26
  148. data/app/views/govuk_publishing_components/components/_feedback.html.erb +2 -0
  149. data/app/views/govuk_publishing_components/components/_fieldset.html.erb +2 -0
  150. data/app/views/govuk_publishing_components/components/_file_upload.html.erb +2 -0
  151. data/app/views/govuk_publishing_components/components/_google_tag_manager_script.html.erb +2 -2
  152. data/app/views/govuk_publishing_components/components/_govspeak.html.erb +1 -0
  153. data/app/views/govuk_publishing_components/components/_govspeak_html_publication.html.erb +2 -0
  154. data/app/views/govuk_publishing_components/components/_heading.html.erb +2 -0
  155. data/app/views/govuk_publishing_components/components/_hint.html.erb +4 -1
  156. data/app/views/govuk_publishing_components/components/_image_card.html.erb +17 -12
  157. data/app/views/govuk_publishing_components/components/_input.html.erb +10 -2
  158. data/app/views/govuk_publishing_components/components/_inset_text.html.erb +2 -0
  159. data/app/views/govuk_publishing_components/components/_intervention.html.erb +2 -0
  160. data/app/views/govuk_publishing_components/components/_inverse_header.html.erb +2 -0
  161. data/app/views/govuk_publishing_components/components/_label.html.erb +7 -3
  162. data/app/views/govuk_publishing_components/components/_layout_footer.html.erb +2 -0
  163. data/app/views/govuk_publishing_components/components/_layout_for_admin.html.erb +8 -5
  164. data/app/views/govuk_publishing_components/components/_layout_for_public.html.erb +8 -3
  165. data/app/views/govuk_publishing_components/components/_layout_header.html.erb +2 -0
  166. data/app/views/govuk_publishing_components/components/_layout_super_navigation_header.html.erb +238 -267
  167. data/app/views/govuk_publishing_components/components/_lead_paragraph.html.erb +2 -0
  168. data/app/views/govuk_publishing_components/components/_metadata.html.erb +2 -0
  169. data/app/views/govuk_publishing_components/components/_modal_dialogue.html.erb +2 -0
  170. data/app/views/govuk_publishing_components/components/_notice.html.erb +2 -0
  171. data/app/views/govuk_publishing_components/components/_organisation_logo.html.erb +2 -0
  172. data/app/views/govuk_publishing_components/components/_panel.html.erb +2 -0
  173. data/app/views/govuk_publishing_components/components/_phase_banner.html.erb +3 -1
  174. data/app/views/govuk_publishing_components/components/_previous_and_next_navigation.html.erb +6 -1
  175. data/app/views/govuk_publishing_components/components/_print_link.html.erb +2 -0
  176. data/app/views/govuk_publishing_components/components/_radio.html.erb +2 -0
  177. data/app/views/govuk_publishing_components/components/_related_navigation.html.erb +16 -6
  178. data/app/views/govuk_publishing_components/components/_reorderable_list.html.erb +2 -0
  179. data/app/views/govuk_publishing_components/components/_search.html.erb +2 -0
  180. data/app/views/govuk_publishing_components/components/_select.html.erb +2 -0
  181. data/app/views/govuk_publishing_components/components/_share_links.html.erb +13 -13
  182. data/app/views/govuk_publishing_components/components/_show_password.html.erb +2 -0
  183. data/app/views/govuk_publishing_components/components/_signup_link.html.erb +2 -0
  184. data/app/views/govuk_publishing_components/components/_single_page_notification_button.html.erb +8 -2
  185. data/app/views/govuk_publishing_components/components/_skip_link.html.erb +2 -0
  186. data/app/views/govuk_publishing_components/components/_step_by_step_nav.html.erb +8 -1
  187. data/app/views/govuk_publishing_components/components/_step_by_step_nav_header.html.erb +12 -2
  188. data/app/views/govuk_publishing_components/components/_step_by_step_nav_related.html.erb +21 -8
  189. data/app/views/govuk_publishing_components/components/_subscription_links.html.erb +3 -1
  190. data/app/views/govuk_publishing_components/components/_success_alert.html.erb +2 -0
  191. data/app/views/govuk_publishing_components/components/_summary_list.html.erb +2 -0
  192. data/app/views/govuk_publishing_components/components/_table.html.erb +3 -1
  193. data/app/views/govuk_publishing_components/components/_tabs.html.erb +22 -2
  194. data/app/views/govuk_publishing_components/components/_textarea.html.erb +12 -2
  195. data/app/views/govuk_publishing_components/components/_title.html.erb +2 -0
  196. data/app/views/govuk_publishing_components/components/_translation_nav.html.erb +2 -0
  197. data/app/views/govuk_publishing_components/components/_warning_text.html.erb +2 -0
  198. data/app/views/govuk_publishing_components/components/contextual_sidebar/_ukraine_cta.html.erb +16 -6
  199. data/app/views/govuk_publishing_components/components/docs/accordion.yml +16 -3
  200. data/app/views/govuk_publishing_components/components/docs/action_link.yml +1 -0
  201. data/app/views/govuk_publishing_components/components/docs/breadcrumbs.yml +2 -1
  202. data/app/views/govuk_publishing_components/components/docs/button.yml +10 -0
  203. data/app/views/govuk_publishing_components/components/docs/cards.yml +1 -0
  204. data/app/views/govuk_publishing_components/components/docs/checkboxes.yml +1 -0
  205. data/app/views/govuk_publishing_components/components/docs/contents_list.yml +1 -12
  206. data/app/views/govuk_publishing_components/components/docs/contextual_breadcrumbs.yml +13 -0
  207. data/app/views/govuk_publishing_components/components/docs/contextual_footer.yml +43 -0
  208. data/app/views/govuk_publishing_components/components/docs/contextual_sidebar.yml +65 -0
  209. data/app/views/govuk_publishing_components/components/docs/details.yml +17 -0
  210. data/app/views/govuk_publishing_components/components/docs/document_list.yml +18 -1
  211. data/app/views/govuk_publishing_components/components/docs/emergency_banner.yml +3 -1
  212. data/app/views/govuk_publishing_components/components/docs/error_message.yml +13 -0
  213. data/app/views/govuk_publishing_components/components/docs/govspeak.yml +22 -1
  214. data/app/views/govuk_publishing_components/components/docs/hint.yml +6 -0
  215. data/app/views/govuk_publishing_components/components/docs/image_card.yml +24 -1
  216. data/app/views/govuk_publishing_components/components/docs/input.yml +32 -0
  217. data/app/views/govuk_publishing_components/components/docs/intervention.yml +2 -1
  218. data/app/views/govuk_publishing_components/components/docs/label.yml +17 -0
  219. data/app/views/govuk_publishing_components/components/docs/layout_header.yml +1 -0
  220. data/app/views/govuk_publishing_components/components/docs/previous_and_next_navigation.yml +2 -0
  221. data/app/views/govuk_publishing_components/components/docs/related_navigation.yml +47 -0
  222. data/app/views/govuk_publishing_components/components/docs/share_links.yml +59 -30
  223. data/app/views/govuk_publishing_components/components/docs/single_page_notification_button.yml +16 -1
  224. data/app/views/govuk_publishing_components/components/docs/step_by_step_nav.yml +54 -0
  225. data/app/views/govuk_publishing_components/components/docs/step_by_step_nav_header.yml +6 -0
  226. data/app/views/govuk_publishing_components/components/docs/step_by_step_nav_related.yml +10 -0
  227. data/app/views/govuk_publishing_components/components/docs/tabs.yml +15 -0
  228. data/app/views/govuk_publishing_components/components/docs/textarea.yml +31 -0
  229. data/app/views/govuk_publishing_components/components/docs/translation_nav.yml +2 -0
  230. data/app/views/govuk_publishing_components/components/feedback/_problem_form.html.erb +3 -3
  231. data/app/views/govuk_publishing_components/components/feedback/_survey_signup_form.html.erb +1 -1
  232. data/app/views/govuk_publishing_components/components/feedback/_yes_no_banner.html.erb +4 -5
  233. data/app/views/govuk_publishing_components/components/metadata/_sentence.html.erb +4 -2
  234. data/app/views/govuk_publishing_components/components/related_navigation/_section.html.erb +36 -16
  235. data/app/views/layouts/govuk_publishing_components/application.html.erb +3 -4
  236. data/config/locales/ar.yml +14 -14
  237. data/config/locales/az.yml +15 -14
  238. data/config/locales/be.yml +14 -14
  239. data/config/locales/bg.yml +14 -14
  240. data/config/locales/bn.yml +14 -14
  241. data/config/locales/cs.yml +14 -14
  242. data/config/locales/cy.yml +14 -14
  243. data/config/locales/da.yml +14 -14
  244. data/config/locales/de.yml +14 -14
  245. data/config/locales/dr.yml +14 -14
  246. data/config/locales/el.yml +14 -14
  247. data/config/locales/en.yml +21 -28
  248. data/config/locales/es-419.yml +14 -14
  249. data/config/locales/es.yml +14 -14
  250. data/config/locales/et.yml +14 -14
  251. data/config/locales/fa.yml +15 -14
  252. data/config/locales/fi.yml +14 -14
  253. data/config/locales/fr.yml +14 -14
  254. data/config/locales/gd.yml +14 -14
  255. data/config/locales/gu.yml +14 -14
  256. data/config/locales/he.yml +14 -14
  257. data/config/locales/hi.yml +14 -14
  258. data/config/locales/hr.yml +14 -14
  259. data/config/locales/hu.yml +14 -14
  260. data/config/locales/hy.yml +14 -14
  261. data/config/locales/id.yml +14 -14
  262. data/config/locales/is.yml +14 -14
  263. data/config/locales/it.yml +14 -14
  264. data/config/locales/ja.yml +14 -14
  265. data/config/locales/ka.yml +14 -14
  266. data/config/locales/kk.yml +14 -14
  267. data/config/locales/ko.yml +14 -14
  268. data/config/locales/lt.yml +14 -14
  269. data/config/locales/lv.yml +14 -14
  270. data/config/locales/ms.yml +14 -14
  271. data/config/locales/mt.yml +14 -14
  272. data/config/locales/nl.yml +14 -14
  273. data/config/locales/no.yml +14 -14
  274. data/config/locales/pa-pk.yml +14 -14
  275. data/config/locales/pa.yml +14 -14
  276. data/config/locales/pl.yml +14 -14
  277. data/config/locales/ps.yml +14 -14
  278. data/config/locales/pt.yml +14 -14
  279. data/config/locales/ro.yml +14 -14
  280. data/config/locales/ru.yml +14 -14
  281. data/config/locales/si.yml +14 -14
  282. data/config/locales/sk.yml +14 -14
  283. data/config/locales/sl.yml +14 -14
  284. data/config/locales/so.yml +14 -14
  285. data/config/locales/sq.yml +14 -14
  286. data/config/locales/sr.yml +14 -14
  287. data/config/locales/sv.yml +14 -14
  288. data/config/locales/sw.yml +14 -14
  289. data/config/locales/ta.yml +14 -14
  290. data/config/locales/th.yml +14 -14
  291. data/config/locales/tk.yml +14 -14
  292. data/config/locales/tr.yml +14 -14
  293. data/config/locales/uk.yml +14 -14
  294. data/config/locales/ur.yml +14 -14
  295. data/config/locales/uz.yml +14 -14
  296. data/config/locales/vi.yml +14 -14
  297. data/config/locales/zh-hk.yml +14 -14
  298. data/config/locales/zh-tw.yml +14 -14
  299. data/config/locales/zh.yml +14 -14
  300. data/lib/govuk_publishing_components/app_helpers/asset_helper.rb +86 -0
  301. data/lib/govuk_publishing_components/config.rb +3 -3
  302. data/lib/govuk_publishing_components/presenters/accordion_helper.rb +38 -0
  303. data/lib/govuk_publishing_components/presenters/breadcrumb_selector.rb +3 -2
  304. data/lib/govuk_publishing_components/presenters/{breadcrumbs.rb → breadcrumbs_helper.rb} +8 -0
  305. data/lib/govuk_publishing_components/presenters/button_helper.rb +9 -2
  306. data/lib/govuk_publishing_components/presenters/component_wrapper_helper.rb +95 -0
  307. data/lib/govuk_publishing_components/presenters/image_card_helper.rb +65 -2
  308. data/lib/govuk_publishing_components/presenters/page_with_step_by_step_navigation.rb +3 -2
  309. data/lib/govuk_publishing_components/presenters/related_navigation_helper.rb +16 -7
  310. data/lib/govuk_publishing_components/presenters/single_page_notification_button_helper.rb +43 -2
  311. data/lib/govuk_publishing_components/presenters/step_by_step_nav_helper.rb +16 -0
  312. data/lib/govuk_publishing_components/railtie.rb +7 -0
  313. data/lib/govuk_publishing_components/version.rb +1 -1
  314. data/lib/govuk_publishing_components.rb +6 -1
  315. data/node_modules/axe-core/README.md +1 -1
  316. data/node_modules/axe-core/axe.d.ts +76 -24
  317. data/node_modules/axe-core/axe.js +9200 -9059
  318. data/node_modules/axe-core/axe.min.js +3 -3
  319. data/node_modules/axe-core/package.json +29 -29
  320. data/node_modules/axe-core/sri-history.json +20 -0
  321. data/node_modules/govuk-frontend/README.md +1 -2
  322. data/node_modules/govuk-frontend/govuk/all.js +4035 -2673
  323. data/node_modules/govuk-frontend/govuk/all.js.map +1 -0
  324. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js +71 -0
  325. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js.map +1 -0
  326. data/node_modules/govuk-frontend/govuk/common/index.js +180 -0
  327. data/node_modules/govuk-frontend/govuk/common/index.js.map +1 -0
  328. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js +376 -0
  329. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js.map +1 -0
  330. data/node_modules/govuk-frontend/govuk/common.js +173 -30
  331. data/node_modules/govuk-frontend/govuk/common.js.map +1 -0
  332. data/node_modules/govuk-frontend/govuk/components/_all.scss +1 -1
  333. data/node_modules/govuk-frontend/govuk/components/accordion/_index.scss +23 -4
  334. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js +2116 -983
  335. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js.map +1 -0
  336. data/node_modules/govuk-frontend/govuk/components/accordion/fixtures.json +54 -22
  337. data/node_modules/govuk-frontend/govuk/components/accordion/macro-options.json +36 -0
  338. data/node_modules/govuk-frontend/govuk/components/accordion/template.njk +8 -2
  339. data/node_modules/govuk-frontend/govuk/components/back-link/_index.scss +19 -19
  340. data/node_modules/govuk-frontend/govuk/components/back-link/fixtures.json +12 -12
  341. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/_index.scss +21 -10
  342. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/fixtures.json +22 -22
  343. data/node_modules/govuk-frontend/govuk/components/button/_index.scss +23 -5
  344. data/node_modules/govuk-frontend/govuk/components/button/button.js +958 -690
  345. data/node_modules/govuk-frontend/govuk/components/button/button.js.map +1 -0
  346. data/node_modules/govuk-frontend/govuk/components/button/fixtures.json +85 -66
  347. data/node_modules/govuk-frontend/govuk/components/button/template.njk +1 -1
  348. data/node_modules/govuk-frontend/govuk/components/character-count/_index.scss +9 -0
  349. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +2083 -1161
  350. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js.map +1 -0
  351. data/node_modules/govuk-frontend/govuk/components/character-count/fixtures.json +112 -36
  352. data/node_modules/govuk-frontend/govuk/components/character-count/macro-options.json +42 -0
  353. data/node_modules/govuk-frontend/govuk/components/character-count/template.njk +27 -3
  354. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +1155 -1119
  355. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js.map +1 -0
  356. data/node_modules/govuk-frontend/govuk/components/checkboxes/fixtures.json +96 -93
  357. data/node_modules/govuk-frontend/govuk/components/cookie-banner/fixtures.json +46 -46
  358. data/node_modules/govuk-frontend/govuk/components/cookie-banner/template.njk +1 -1
  359. data/node_modules/govuk-frontend/govuk/components/date-input/fixtures.json +50 -50
  360. data/node_modules/govuk-frontend/govuk/components/details/details.js +797 -766
  361. data/node_modules/govuk-frontend/govuk/components/details/details.js.map +1 -0
  362. data/node_modules/govuk-frontend/govuk/components/details/fixtures.json +20 -20
  363. data/node_modules/govuk-frontend/govuk/components/error-message/fixtures.json +20 -20
  364. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js +1089 -814
  365. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js.map +1 -0
  366. data/node_modules/govuk-frontend/govuk/components/error-summary/fixtures.json +44 -35
  367. data/node_modules/govuk-frontend/govuk/components/error-summary/template.njk +25 -21
  368. data/node_modules/govuk-frontend/govuk/components/fieldset/fixtures.json +51 -39
  369. data/node_modules/govuk-frontend/govuk/components/file-upload/fixtures.json +26 -26
  370. data/node_modules/govuk-frontend/govuk/components/footer/_index.scss +1 -1
  371. data/node_modules/govuk-frontend/govuk/components/footer/fixtures.json +46 -46
  372. data/node_modules/govuk-frontend/govuk/components/footer/macro-options.json +2 -2
  373. data/node_modules/govuk-frontend/govuk/components/header/_index.scss +6 -0
  374. data/node_modules/govuk-frontend/govuk/components/header/fixtures.json +93 -38
  375. data/node_modules/govuk-frontend/govuk/components/header/header.js +646 -992
  376. data/node_modules/govuk-frontend/govuk/components/header/header.js.map +1 -0
  377. data/node_modules/govuk-frontend/govuk/components/header/macro-options.json +8 -2
  378. data/node_modules/govuk-frontend/govuk/components/header/template.njk +4 -2
  379. data/node_modules/govuk-frontend/govuk/components/hint/fixtures.json +12 -12
  380. data/node_modules/govuk-frontend/govuk/components/input/fixtures.json +80 -80
  381. data/node_modules/govuk-frontend/govuk/components/inset-text/fixtures.json +12 -12
  382. data/node_modules/govuk-frontend/govuk/components/label/fixtures.json +34 -34
  383. data/node_modules/govuk-frontend/govuk/components/notification-banner/fixtures.json +56 -46
  384. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js +790 -532
  385. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js.map +1 -0
  386. data/node_modules/govuk-frontend/govuk/components/notification-banner/template.njk +1 -1
  387. data/node_modules/govuk-frontend/govuk/components/pagination/_index.scss +10 -7
  388. data/node_modules/govuk-frontend/govuk/components/pagination/fixtures.json +94 -26
  389. data/node_modules/govuk-frontend/govuk/components/pagination/template.njk +1 -1
  390. data/node_modules/govuk-frontend/govuk/components/panel/fixtures.json +18 -18
  391. data/node_modules/govuk-frontend/govuk/components/phase-banner/fixtures.json +14 -14
  392. data/node_modules/govuk-frontend/govuk/components/phase-banner/macro-options.json +1 -1
  393. data/node_modules/govuk-frontend/govuk/components/radios/fixtures.json +94 -91
  394. data/node_modules/govuk-frontend/govuk/components/radios/radios.js +1110 -1079
  395. data/node_modules/govuk-frontend/govuk/components/radios/radios.js.map +1 -0
  396. data/node_modules/govuk-frontend/govuk/components/select/fixtures.json +32 -32
  397. data/node_modules/govuk-frontend/govuk/components/skip-link/fixtures.json +22 -20
  398. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js +1017 -1008
  399. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js.map +1 -0
  400. data/node_modules/govuk-frontend/govuk/components/summary-list/_index.scss +107 -0
  401. data/node_modules/govuk-frontend/govuk/components/summary-list/fixtures.json +345 -50
  402. data/node_modules/govuk-frontend/govuk/components/summary-list/macro-options.json +110 -0
  403. data/node_modules/govuk-frontend/govuk/components/summary-list/template.njk +72 -28
  404. data/node_modules/govuk-frontend/govuk/components/table/_index.scss +1 -1
  405. data/node_modules/govuk-frontend/govuk/components/table/fixtures.json +40 -40
  406. data/node_modules/govuk-frontend/govuk/components/tabs/fixtures.json +29 -29
  407. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js +1389 -1233
  408. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js.map +1 -0
  409. data/node_modules/govuk-frontend/govuk/components/tag/fixtures.json +28 -28
  410. data/node_modules/govuk-frontend/govuk/components/textarea/fixtures.json +34 -34
  411. data/node_modules/govuk-frontend/govuk/components/warning-text/fixtures.json +14 -14
  412. data/node_modules/govuk-frontend/govuk/core/_section-break.scss +1 -1
  413. data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +2 -2
  414. data/node_modules/govuk-frontend/govuk/helpers/_focused.scss +5 -0
  415. data/node_modules/govuk-frontend/govuk/helpers/_links.scss +6 -6
  416. data/node_modules/govuk-frontend/govuk/i18n.js +389 -0
  417. data/node_modules/govuk-frontend/govuk/i18n.js.map +1 -0
  418. data/node_modules/govuk-frontend/govuk/macros/i18n.njk +15 -0
  419. data/node_modules/govuk-frontend/govuk/settings/_all.scss +1 -0
  420. data/node_modules/govuk-frontend/govuk/settings/_colours-palette.scss +12 -0
  421. data/node_modules/govuk-frontend/govuk/settings/_compatibility.scss +26 -0
  422. data/node_modules/govuk-frontend/govuk/settings/_measurements.scss +5 -5
  423. data/node_modules/govuk-frontend/govuk/settings/_typography-font.scss +23 -0
  424. data/node_modules/govuk-frontend/govuk/settings/_typography-responsive.scss +12 -0
  425. data/node_modules/govuk-frontend/govuk/settings/_warnings.scss +53 -0
  426. data/node_modules/govuk-frontend/govuk/tools/_compatibility.scss +20 -6
  427. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js +242 -241
  428. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js.map +1 -0
  429. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js +22 -0
  430. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js.map +1 -0
  431. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js +17 -16
  432. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js.map +1 -0
  433. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js +547 -546
  434. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js.map +1 -0
  435. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js +37 -36
  436. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js.map +1 -0
  437. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js +301 -0
  438. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js.map +1 -0
  439. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js +21 -20
  440. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js.map +1 -0
  441. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js +198 -197
  442. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js.map +1 -0
  443. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js +198 -197
  444. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js.map +1 -0
  445. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js +106 -105
  446. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js.map +1 -0
  447. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js +400 -399
  448. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js.map +1 -0
  449. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js +239 -238
  450. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js.map +1 -0
  451. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js +72 -71
  452. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js.map +1 -0
  453. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js +22 -0
  454. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js.map +1 -0
  455. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js +17 -16
  456. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js.map +1 -0
  457. data/node_modules/govuk-frontend/govuk-esm/all.mjs +52 -29
  458. data/node_modules/govuk-frontend/govuk-esm/common/closest-attribute-value.mjs +15 -0
  459. data/node_modules/govuk-frontend/govuk-esm/common/index.mjs +166 -0
  460. data/node_modules/govuk-frontend/govuk-esm/common/normalise-dataset.mjs +60 -0
  461. data/node_modules/govuk-frontend/govuk-esm/common.mjs +6 -28
  462. data/node_modules/govuk-frontend/govuk-esm/components/accordion/accordion.mjs +238 -85
  463. data/node_modules/govuk-frontend/govuk-esm/components/button/button.mjs +73 -34
  464. data/node_modules/govuk-frontend/govuk-esm/components/character-count/character-count.mjs +329 -124
  465. data/node_modules/govuk-frontend/govuk-esm/components/checkboxes/checkboxes.mjs +32 -20
  466. data/node_modules/govuk-frontend/govuk-esm/components/details/details.mjs +41 -20
  467. data/node_modules/govuk-frontend/govuk-esm/components/error-summary/error-summary.mjs +60 -14
  468. data/node_modules/govuk-frontend/govuk-esm/components/header/header.mjs +9 -2
  469. data/node_modules/govuk-frontend/govuk-esm/components/notification-banner/notification-banner.mjs +33 -4
  470. data/node_modules/govuk-frontend/govuk-esm/components/radios/radios.mjs +18 -11
  471. data/node_modules/govuk-frontend/govuk-esm/components/skip-link/skip-link.mjs +15 -7
  472. data/node_modules/govuk-frontend/govuk-esm/components/tabs/tabs.mjs +171 -38
  473. data/node_modules/govuk-frontend/govuk-esm/i18n.mjs +378 -0
  474. data/node_modules/govuk-frontend/govuk-esm/vendor/polyfills/Date/now.mjs +13 -0
  475. data/node_modules/govuk-frontend/govuk-esm/vendor/polyfills/Element/prototype/dataset.mjs +68 -0
  476. data/node_modules/govuk-frontend/govuk-esm/vendor/polyfills/String/prototype/trim.mjs +13 -0
  477. data/node_modules/govuk-frontend/govuk-prototype-kit/init.js +7 -0
  478. data/node_modules/govuk-frontend/govuk-prototype-kit/init.scss +12 -0
  479. data/node_modules/govuk-frontend/govuk-prototype-kit.config.json +138 -7
  480. data/node_modules/govuk-frontend/package.json +1 -1
  481. metadata +70 -19
  482. data/app/assets/stylesheets/component_guide/print.scss +0 -1
  483. data/app/assets/stylesheets/govuk_publishing_components/_all_components_print.scss +0 -18
  484. data/app/assets/stylesheets/govuk_publishing_components/components/print/_accordion.scss +0 -28
  485. data/app/assets/stylesheets/govuk_publishing_components/components/print/_button.scss +0 -8
  486. data/app/assets/stylesheets/govuk_publishing_components/components/print/_cards.scss +0 -4
  487. data/app/assets/stylesheets/govuk_publishing_components/components/print/_contents-list.scss +0 -19
  488. data/app/assets/stylesheets/govuk_publishing_components/components/print/_emergency-banner.scss +0 -3
  489. data/app/assets/stylesheets/govuk_publishing_components/components/print/_govspeak-html-publication.scss +0 -5
  490. data/app/assets/stylesheets/govuk_publishing_components/components/print/_govspeak.scss +0 -80
  491. data/app/assets/stylesheets/govuk_publishing_components/components/print/_layout-super-navigation-header.scss +0 -3
  492. data/app/assets/stylesheets/govuk_publishing_components/components/print/_organisation-logo.scss +0 -7
  493. data/app/assets/stylesheets/govuk_publishing_components/components/print/_step-by-step-nav-header.scss +0 -7
  494. data/app/assets/stylesheets/govuk_publishing_components/components/print/_step-by-step-nav.scss +0 -116
  495. data/app/assets/stylesheets/govuk_publishing_components/components/print/_textarea.scss +0 -13
  496. data/app/assets/stylesheets/govuk_publishing_components/components/print/_title.scss +0 -7
@@ -1,724 +1,992 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
- typeof define === 'function' && define.amd ? define('GOVUKFrontend.Button', factory) :
4
- (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Button = factory());
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
+ typeof define === 'function' && define.amd ? define('GOVUKFrontend.Button', factory) :
4
+ (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Button = factory());
5
5
  }(this, (function () { 'use strict';
6
6
 
7
- (function(undefined) {
7
+ /**
8
+ * Common helpers which do not require polyfill.
9
+ *
10
+ * IMPORTANT: If a helper require a polyfill, please isolate it in its own module
11
+ * so that the polyfill can be properly tree-shaken and does not burden
12
+ * the components that do not need that helper
13
+ *
14
+ * @module common/index
15
+ */
16
+
17
+ /**
18
+ * Config flattening function
19
+ *
20
+ * Takes any number of objects, flattens them into namespaced key-value pairs,
21
+ * (e.g. {'i18n.showSection': 'Show section'}) and combines them together, with
22
+ * greatest priority on the LAST item passed in.
23
+ *
24
+ * @returns {Object<string, unknown>} A flattened object of key-value pairs.
25
+ */
26
+ function mergeConfigs (/* configObject1, configObject2, ...configObjects */) {
27
+ /**
28
+ * Function to take nested objects and flatten them to a dot-separated keyed
29
+ * object. Doing this means we don't need to do any deep/recursive merging of
30
+ * each of our objects, nor transform our dataset from a flat list into a
31
+ * nested object.
32
+ *
33
+ * @param {Object<string, unknown>} configObject - Deeply nested object
34
+ * @returns {Object<string, unknown>} Flattened object with dot-separated keys
35
+ */
36
+ var flattenObject = function (configObject) {
37
+ // Prepare an empty return object
38
+ var flattenedObject = {};
39
+
40
+ /**
41
+ * Our flattening function, this is called recursively for each level of
42
+ * depth in the object. At each level we prepend the previous level names to
43
+ * the key using `prefix`.
44
+ *
45
+ * @param {Partial<Object<string, unknown>>} obj - Object to flatten
46
+ * @param {string} [prefix] - Optional dot-separated prefix
47
+ */
48
+ var flattenLoop = function (obj, prefix) {
49
+ // Loop through keys...
50
+ for (var key in obj) {
51
+ // Check to see if this is a prototypical key/value,
52
+ // if it is, skip it.
53
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
54
+ continue
55
+ }
56
+ var value = obj[key];
57
+ var prefixedKey = prefix ? prefix + '.' + key : key;
58
+ if (typeof value === 'object') {
59
+ // If the value is a nested object, recurse over that too
60
+ flattenLoop(value, prefixedKey);
61
+ } else {
62
+ // Otherwise, add this value to our return object
63
+ flattenedObject[prefixedKey] = value;
64
+ }
65
+ }
66
+ };
67
+
68
+ // Kick off the recursive loop
69
+ flattenLoop(configObject);
70
+ return flattenedObject
71
+ };
72
+
73
+ // Start with an empty object as our base
74
+ var formattedConfigObject = {};
75
+
76
+ // Loop through each of the remaining passed objects and push their keys
77
+ // one-by-one into configObject. Any duplicate keys will override the existing
78
+ // key with the new value.
79
+ for (var i = 0; i < arguments.length; i++) {
80
+ var obj = flattenObject(arguments[i]);
81
+ for (var key in obj) {
82
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
83
+ formattedConfigObject[key] = obj[key];
84
+ }
85
+ }
86
+ }
87
+
88
+ return formattedConfigObject
89
+ }
90
+
91
+ /**
92
+ * @callback nodeListIterator
93
+ * @param {Element} value - The current node being iterated on
94
+ * @param {number} index - The current index in the iteration
95
+ * @param {NodeListOf<Element>} nodes - NodeList from querySelectorAll()
96
+ * @returns {void}
97
+ */
98
+
99
+ (function(undefined) {
100
+
101
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
102
+ var detect = (
103
+ // In IE8, defineProperty could only act on DOM elements, so full support
104
+ // for the feature requires the ability to set a property on an arbitrary object
105
+ 'defineProperty' in Object && (function() {
106
+ try {
107
+ var a = {};
108
+ Object.defineProperty(a, 'test', {value:42});
109
+ return true;
110
+ } catch(e) {
111
+ return false
112
+ }
113
+ }())
114
+ );
8
115
 
9
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
10
- var detect = ('Window' in this);
116
+ if (detect) return
117
+
118
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
119
+ (function (nativeDefineProperty) {
120
+
121
+ var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
122
+ var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
123
+ var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
124
+
125
+ Object.defineProperty = function defineProperty(object, property, descriptor) {
126
+
127
+ // Where native support exists, assume it
128
+ if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
129
+ return nativeDefineProperty(object, property, descriptor);
130
+ }
131
+
132
+ if (object === null || !(object instanceof Object || typeof object === 'object')) {
133
+ throw new TypeError('Object.defineProperty called on non-object');
134
+ }
135
+
136
+ if (!(descriptor instanceof Object)) {
137
+ throw new TypeError('Property description must be an object');
138
+ }
139
+
140
+ var propertyString = String(property);
141
+ var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
142
+ var getterType = 'get' in descriptor && typeof descriptor.get;
143
+ var setterType = 'set' in descriptor && typeof descriptor.set;
144
+
145
+ // handle descriptor.get
146
+ if (getterType) {
147
+ if (getterType !== 'function') {
148
+ throw new TypeError('Getter must be a function');
149
+ }
150
+ if (!supportsAccessors) {
151
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
152
+ }
153
+ if (hasValueOrWritable) {
154
+ throw new TypeError(ERR_VALUE_ACCESSORS);
155
+ }
156
+ Object.__defineGetter__.call(object, propertyString, descriptor.get);
157
+ } else {
158
+ object[propertyString] = descriptor.value;
159
+ }
160
+
161
+ // handle descriptor.set
162
+ if (setterType) {
163
+ if (setterType !== 'function') {
164
+ throw new TypeError('Setter must be a function');
165
+ }
166
+ if (!supportsAccessors) {
167
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
168
+ }
169
+ if (hasValueOrWritable) {
170
+ throw new TypeError(ERR_VALUE_ACCESSORS);
171
+ }
172
+ Object.__defineSetter__.call(object, propertyString, descriptor.set);
173
+ }
174
+
175
+ // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
176
+ if ('value' in descriptor) {
177
+ object[propertyString] = descriptor.value;
178
+ }
179
+
180
+ return object;
181
+ };
182
+ }(Object.defineProperty));
183
+ })
184
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
185
+
186
+ (function(undefined) {
187
+
188
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
189
+ var detect = ("Document" in this);
11
190
 
12
- if (detect) return
191
+ if (detect) return
13
192
 
14
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
15
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
16
- (function (global) {
17
- if (global.constructor) {
18
- global.Window = global.constructor;
19
- } else {
20
- (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
21
- }
22
- }(this));
23
- }
193
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
194
+ if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
24
195
 
25
- })
26
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
196
+ if (this.HTMLDocument) { // IE8
27
197
 
28
- (function(undefined) {
198
+ // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
199
+ this.Document = this.HTMLDocument;
29
200
 
30
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
31
- var detect = ("Document" in this);
201
+ } else {
32
202
 
33
- if (detect) return
203
+ // Create an empty function to act as the missing constructor for the document object, attach the document object as its prototype. The function needs to be anonymous else it is hoisted and causes the feature detect to prematurely pass, preventing the assignments below being made.
204
+ this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
205
+ this.Document.prototype = document;
206
+ }
207
+ }
34
208
 
35
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
36
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
37
209
 
38
- if (this.HTMLDocument) { // IE8
210
+ })
211
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
39
212
 
40
- // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
41
- this.Document = this.HTMLDocument;
213
+ (function(undefined) {
42
214
 
43
- } else {
215
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
216
+ var detect = ('Element' in this && 'HTMLElement' in this);
44
217
 
45
- // Create an empty function to act as the missing constructor for the document object, attach the document object as its prototype. The function needs to be anonymous else it is hoisted and causes the feature detect to prematurely pass, preventing the assignments below being made.
46
- this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
47
- this.Document.prototype = document;
48
- }
49
- }
50
-
51
-
52
- })
53
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
54
-
55
- (function(undefined) {
56
-
57
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
58
- var detect = ('Element' in this && 'HTMLElement' in this);
59
-
60
- if (detect) return
61
-
62
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
63
- (function () {
64
-
65
- // IE8
66
- if (window.Element && !window.HTMLElement) {
67
- window.HTMLElement = window.Element;
68
- return;
69
- }
70
-
71
- // create Element constructor
72
- window.Element = window.HTMLElement = new Function('return function Element() {}')();
73
-
74
- // generate sandboxed iframe
75
- var vbody = document.appendChild(document.createElement('body'));
76
- var frame = vbody.appendChild(document.createElement('iframe'));
77
-
78
- // use sandboxed iframe to replicate Element functionality
79
- var frameDocument = frame.contentWindow.document;
80
- var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
81
- var cache = {};
82
-
83
- // polyfill Element.prototype on an element
84
- var shiv = function (element, deep) {
85
- var
86
- childNodes = element.childNodes || [],
87
- index = -1,
88
- key, value, childNode;
89
-
90
- if (element.nodeType === 1 && element.constructor !== Element) {
91
- element.constructor = Element;
92
-
93
- for (key in cache) {
94
- value = cache[key];
95
- element[key] = value;
96
- }
97
- }
98
-
99
- while (childNode = deep && childNodes[++index]) {
100
- shiv(childNode, deep);
101
- }
102
-
103
- return element;
104
- };
105
-
106
- var elements = document.getElementsByTagName('*');
107
- var nativeCreateElement = document.createElement;
108
- var interval;
109
- var loopLimit = 100;
110
-
111
- prototype.attachEvent('onpropertychange', function (event) {
112
- var
113
- propertyName = event.propertyName,
114
- nonValue = !cache.hasOwnProperty(propertyName),
115
- newValue = prototype[propertyName],
116
- oldValue = cache[propertyName],
117
- index = -1,
118
- element;
119
-
120
- while (element = elements[++index]) {
121
- if (element.nodeType === 1) {
122
- if (nonValue || element[propertyName] === oldValue) {
123
- element[propertyName] = newValue;
124
- }
125
- }
126
- }
127
-
128
- cache[propertyName] = newValue;
129
- });
130
-
131
- prototype.constructor = Element;
132
-
133
- if (!prototype.hasAttribute) {
134
- // <Element>.hasAttribute
135
- prototype.hasAttribute = function hasAttribute(name) {
136
- return this.getAttribute(name) !== null;
137
- };
138
- }
139
-
140
- // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
141
- function bodyCheck() {
142
- if (!(loopLimit--)) clearTimeout(interval);
143
- if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
144
- shiv(document, true);
145
- if (interval && document.body.prototype) clearTimeout(interval);
146
- return (!!document.body.prototype);
147
- }
148
- return false;
149
- }
150
- if (!bodyCheck()) {
151
- document.onreadystatechange = bodyCheck;
152
- interval = setInterval(bodyCheck, 25);
153
- }
154
-
155
- // Apply to any new elements created after load
156
- document.createElement = function createElement(nodeName) {
157
- var element = nativeCreateElement(String(nodeName).toLowerCase());
158
- return shiv(element);
159
- };
160
-
161
- // remove sandboxed iframe
162
- document.removeChild(vbody);
163
- }());
164
-
165
- })
166
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
167
-
168
- (function(undefined) {
169
-
170
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
171
- var detect = (
172
- // In IE8, defineProperty could only act on DOM elements, so full support
173
- // for the feature requires the ability to set a property on an arbitrary object
174
- 'defineProperty' in Object && (function() {
175
- try {
176
- var a = {};
177
- Object.defineProperty(a, 'test', {value:42});
178
- return true;
179
- } catch(e) {
180
- return false
218
+ if (detect) return
219
+
220
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
221
+ (function () {
222
+
223
+ // IE8
224
+ if (window.Element && !window.HTMLElement) {
225
+ window.HTMLElement = window.Element;
226
+ return;
227
+ }
228
+
229
+ // create Element constructor
230
+ window.Element = window.HTMLElement = new Function('return function Element() {}')();
231
+
232
+ // generate sandboxed iframe
233
+ var vbody = document.appendChild(document.createElement('body'));
234
+ var frame = vbody.appendChild(document.createElement('iframe'));
235
+
236
+ // use sandboxed iframe to replicate Element functionality
237
+ var frameDocument = frame.contentWindow.document;
238
+ var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
239
+ var cache = {};
240
+
241
+ // polyfill Element.prototype on an element
242
+ var shiv = function (element, deep) {
243
+ var
244
+ childNodes = element.childNodes || [],
245
+ index = -1,
246
+ key, value, childNode;
247
+
248
+ if (element.nodeType === 1 && element.constructor !== Element) {
249
+ element.constructor = Element;
250
+
251
+ for (key in cache) {
252
+ value = cache[key];
253
+ element[key] = value;
254
+ }
255
+ }
256
+
257
+ while (childNode = deep && childNodes[++index]) {
258
+ shiv(childNode, deep);
259
+ }
260
+
261
+ return element;
262
+ };
263
+
264
+ var elements = document.getElementsByTagName('*');
265
+ var nativeCreateElement = document.createElement;
266
+ var interval;
267
+ var loopLimit = 100;
268
+
269
+ prototype.attachEvent('onpropertychange', function (event) {
270
+ var
271
+ propertyName = event.propertyName,
272
+ nonValue = !cache.hasOwnProperty(propertyName),
273
+ newValue = prototype[propertyName],
274
+ oldValue = cache[propertyName],
275
+ index = -1,
276
+ element;
277
+
278
+ while (element = elements[++index]) {
279
+ if (element.nodeType === 1) {
280
+ if (nonValue || element[propertyName] === oldValue) {
281
+ element[propertyName] = newValue;
282
+ }
283
+ }
284
+ }
285
+
286
+ cache[propertyName] = newValue;
287
+ });
288
+
289
+ prototype.constructor = Element;
290
+
291
+ if (!prototype.hasAttribute) {
292
+ // <Element>.hasAttribute
293
+ prototype.hasAttribute = function hasAttribute(name) {
294
+ return this.getAttribute(name) !== null;
295
+ };
181
296
  }
182
- }())
183
- );
184
-
185
- if (detect) return
186
-
187
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
188
- (function (nativeDefineProperty) {
189
-
190
- var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
191
- var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
192
- var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
193
-
194
- Object.defineProperty = function defineProperty(object, property, descriptor) {
195
-
196
- // Where native support exists, assume it
197
- if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
198
- return nativeDefineProperty(object, property, descriptor);
199
- }
200
-
201
- if (object === null || !(object instanceof Object || typeof object === 'object')) {
202
- throw new TypeError('Object.defineProperty called on non-object');
203
- }
204
-
205
- if (!(descriptor instanceof Object)) {
206
- throw new TypeError('Property description must be an object');
207
- }
208
-
209
- var propertyString = String(property);
210
- var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
211
- var getterType = 'get' in descriptor && typeof descriptor.get;
212
- var setterType = 'set' in descriptor && typeof descriptor.set;
213
-
214
- // handle descriptor.get
215
- if (getterType) {
216
- if (getterType !== 'function') {
217
- throw new TypeError('Getter must be a function');
218
- }
219
- if (!supportsAccessors) {
220
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
221
- }
222
- if (hasValueOrWritable) {
223
- throw new TypeError(ERR_VALUE_ACCESSORS);
224
- }
225
- Object.__defineGetter__.call(object, propertyString, descriptor.get);
226
- } else {
227
- object[propertyString] = descriptor.value;
228
- }
229
-
230
- // handle descriptor.set
231
- if (setterType) {
232
- if (setterType !== 'function') {
233
- throw new TypeError('Setter must be a function');
234
- }
235
- if (!supportsAccessors) {
236
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
237
- }
238
- if (hasValueOrWritable) {
239
- throw new TypeError(ERR_VALUE_ACCESSORS);
240
- }
241
- Object.__defineSetter__.call(object, propertyString, descriptor.set);
242
- }
243
-
244
- // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
245
- if ('value' in descriptor) {
246
- object[propertyString] = descriptor.value;
247
- }
248
-
249
- return object;
250
- };
251
- }(Object.defineProperty));
252
- })
253
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
254
-
255
- (function(undefined) {
256
-
257
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
258
- var detect = (
259
- (function(global) {
260
-
261
- if (!('Event' in global)) return false;
262
- if (typeof global.Event === 'function') return true;
263
-
264
- try {
265
-
266
- // In IE 9-11, the Event object exists but cannot be instantiated
267
- new Event('click');
268
- return true;
269
- } catch(e) {
297
+
298
+ // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
299
+ function bodyCheck() {
300
+ if (!(loopLimit--)) clearTimeout(interval);
301
+ if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
302
+ shiv(document, true);
303
+ if (interval && document.body.prototype) clearTimeout(interval);
304
+ return (!!document.body.prototype);
305
+ }
270
306
  return false;
271
307
  }
272
- }(this))
273
- );
274
-
275
- if (detect) return
276
-
277
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
278
- (function () {
279
- var unlistenableWindowEvents = {
280
- click: 1,
281
- dblclick: 1,
282
- keyup: 1,
283
- keypress: 1,
284
- keydown: 1,
285
- mousedown: 1,
286
- mouseup: 1,
287
- mousemove: 1,
288
- mouseover: 1,
289
- mouseenter: 1,
290
- mouseleave: 1,
291
- mouseout: 1,
292
- storage: 1,
293
- storagecommit: 1,
294
- textinput: 1
295
- };
296
-
297
- // This polyfill depends on availability of `document` so will not run in a worker
298
- // However, we asssume there are no browsers with worker support that lack proper
299
- // support for `Event` within the worker
300
- if (typeof document === 'undefined' || typeof window === 'undefined') return;
301
-
302
- function indexOf(array, element) {
303
- var
304
- index = -1,
305
- length = array.length;
306
-
307
- while (++index < length) {
308
- if (index in array && array[index] === element) {
309
- return index;
310
- }
311
- }
312
-
313
- return -1;
314
- }
315
-
316
- var existingProto = (window.Event && window.Event.prototype) || null;
317
- window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
318
- if (!type) {
319
- throw new Error('Not enough arguments');
320
- }
321
-
322
- var event;
323
- // Shortcut if browser supports createEvent
324
- if ('createEvent' in document) {
325
- event = document.createEvent('Event');
326
- var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
327
- var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
328
-
329
- event.initEvent(type, bubbles, cancelable);
330
-
331
- return event;
332
- }
333
-
334
- event = document.createEventObject();
335
-
336
- event.type = type;
337
- event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
338
- event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
339
-
340
- return event;
341
- };
342
- if (existingProto) {
343
- Object.defineProperty(window.Event, 'prototype', {
344
- configurable: false,
345
- enumerable: false,
346
- writable: true,
347
- value: existingProto
348
- });
349
- }
350
-
351
- if (!('createEvent' in document)) {
352
- window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
353
- var
354
- element = this,
355
- type = arguments[0],
356
- listener = arguments[1];
357
-
358
- if (element === window && type in unlistenableWindowEvents) {
359
- throw new Error('In IE8 the event: ' + type + ' is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.');
360
- }
361
-
362
- if (!element._events) {
363
- element._events = {};
364
- }
365
-
366
- if (!element._events[type]) {
367
- element._events[type] = function (event) {
368
- var
369
- list = element._events[event.type].list,
370
- events = list.slice(),
371
- index = -1,
372
- length = events.length,
373
- eventElement;
374
-
375
- event.preventDefault = function preventDefault() {
376
- if (event.cancelable !== false) {
377
- event.returnValue = false;
378
- }
379
- };
380
-
381
- event.stopPropagation = function stopPropagation() {
382
- event.cancelBubble = true;
383
- };
384
-
385
- event.stopImmediatePropagation = function stopImmediatePropagation() {
386
- event.cancelBubble = true;
387
- event.cancelImmediate = true;
388
- };
389
-
390
- event.currentTarget = element;
391
- event.relatedTarget = event.fromElement || null;
392
- event.target = event.target || event.srcElement || element;
393
- event.timeStamp = new Date().getTime();
394
-
395
- if (event.clientX) {
396
- event.pageX = event.clientX + document.documentElement.scrollLeft;
397
- event.pageY = event.clientY + document.documentElement.scrollTop;
398
- }
399
-
400
- while (++index < length && !event.cancelImmediate) {
401
- if (index in events) {
402
- eventElement = events[index];
403
-
404
- if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
405
- eventElement.call(element, event);
406
- }
407
- }
408
- }
409
- };
410
-
411
- element._events[type].list = [];
412
-
413
- if (element.attachEvent) {
414
- element.attachEvent('on' + type, element._events[type]);
415
- }
416
- }
417
-
418
- element._events[type].list.push(listener);
419
- };
420
-
421
- window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
422
- var
423
- element = this,
424
- type = arguments[0],
425
- listener = arguments[1],
426
- index;
427
-
428
- if (element._events && element._events[type] && element._events[type].list) {
429
- index = indexOf(element._events[type].list, listener);
430
-
431
- if (index !== -1) {
432
- element._events[type].list.splice(index, 1);
433
-
434
- if (!element._events[type].list.length) {
435
- if (element.detachEvent) {
436
- element.detachEvent('on' + type, element._events[type]);
437
- }
438
- delete element._events[type];
439
- }
440
- }
441
- }
442
- };
443
-
444
- window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
445
- if (!arguments.length) {
446
- throw new Error('Not enough arguments');
447
- }
448
-
449
- if (!event || typeof event.type !== 'string') {
450
- throw new Error('DOM Events Exception 0');
451
- }
452
-
453
- var element = this, type = event.type;
454
-
455
- try {
456
- if (!event.bubbles) {
457
- event.cancelBubble = true;
458
-
459
- var cancelBubbleEvent = function (event) {
460
- event.cancelBubble = true;
461
-
462
- (element || window).detachEvent('on' + type, cancelBubbleEvent);
463
- };
464
-
465
- this.attachEvent('on' + type, cancelBubbleEvent);
466
- }
467
-
468
- this.fireEvent('on' + type, event);
469
- } catch (error) {
470
- event.target = element;
471
-
472
- do {
473
- event.currentTarget = element;
474
-
475
- if ('_events' in element && typeof element._events[type] === 'function') {
476
- element._events[type].call(element, event);
477
- }
478
-
479
- if (typeof element['on' + type] === 'function') {
480
- element['on' + type].call(element, event);
481
- }
482
-
483
- element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
484
- } while (element && !event.cancelBubble);
485
- }
486
-
487
- return true;
488
- };
489
-
490
- // Add the DOMContentLoaded Event
491
- document.attachEvent('onreadystatechange', function() {
492
- if (document.readyState === 'complete') {
493
- document.dispatchEvent(new Event('DOMContentLoaded', {
494
- bubbles: true
495
- }));
496
- }
497
- });
498
- }
499
- }());
500
-
501
- })
502
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
503
-
504
- (function(undefined) {
505
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
506
- var detect = 'bind' in Function.prototype;
308
+ if (!bodyCheck()) {
309
+ document.onreadystatechange = bodyCheck;
310
+ interval = setInterval(bodyCheck, 25);
311
+ }
507
312
 
508
- if (detect) return
313
+ // Apply to any new elements created after load
314
+ document.createElement = function createElement(nodeName) {
315
+ var element = nativeCreateElement(String(nodeName).toLowerCase());
316
+ return shiv(element);
317
+ };
509
318
 
510
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
511
- Object.defineProperty(Function.prototype, 'bind', {
512
- value: function bind(that) { // .length is 1
513
- // add necessary es5-shim utilities
514
- var $Array = Array;
515
- var $Object = Object;
516
- var ObjectPrototype = $Object.prototype;
517
- var ArrayPrototype = $Array.prototype;
518
- var Empty = function Empty() {};
519
- var to_string = ObjectPrototype.toString;
520
- var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
521
- var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
522
- var array_slice = ArrayPrototype.slice;
523
- var array_concat = ArrayPrototype.concat;
524
- var array_push = ArrayPrototype.push;
525
- var max = Math.max;
526
- // /add necessary es5-shim utilities
527
-
528
- // 1. Let Target be the this value.
529
- var target = this;
530
- // 2. If IsCallable(Target) is false, throw a TypeError exception.
531
- if (!isCallable(target)) {
532
- throw new TypeError('Function.prototype.bind called on incompatible ' + target);
533
- }
534
- // 3. Let A be a new (possibly empty) internal list of all of the
535
- // argument values provided after thisArg (arg1, arg2 etc), in order.
536
- // XXX slicedArgs will stand in for "A" if used
537
- var args = array_slice.call(arguments, 1); // for normal call
538
- // 4. Let F be a new native ECMAScript object.
539
- // 11. Set the [[Prototype]] internal property of F to the standard
540
- // built-in Function prototype object as specified in 15.3.3.1.
541
- // 12. Set the [[Call]] internal property of F as described in
542
- // 15.3.4.5.1.
543
- // 13. Set the [[Construct]] internal property of F as described in
544
- // 15.3.4.5.2.
545
- // 14. Set the [[HasInstance]] internal property of F as described in
546
- // 15.3.4.5.3.
547
- var bound;
548
- var binder = function () {
549
-
550
- if (this instanceof bound) {
551
- // 15.3.4.5.2 [[Construct]]
552
- // When the [[Construct]] internal method of a function object,
553
- // F that was created using the bind function is called with a
554
- // list of arguments ExtraArgs, the following steps are taken:
555
- // 1. Let target be the value of F's [[TargetFunction]]
556
- // internal property.
557
- // 2. If target has no [[Construct]] internal method, a
558
- // TypeError exception is thrown.
559
- // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
560
- // property.
561
- // 4. Let args be a new list containing the same values as the
562
- // list boundArgs in the same order followed by the same
563
- // values as the list ExtraArgs in the same order.
564
- // 5. Return the result of calling the [[Construct]] internal
565
- // method of target providing args as the arguments.
566
-
567
- var result = target.apply(
568
- this,
569
- array_concat.call(args, array_slice.call(arguments))
570
- );
571
- if ($Object(result) === result) {
572
- return result;
319
+ // remove sandboxed iframe
320
+ document.removeChild(vbody);
321
+ }());
322
+
323
+ })
324
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
325
+
326
+ (function(undefined) {
327
+
328
+ // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
329
+ var detect = (function(){
330
+ if (!document.documentElement.dataset) {
331
+ return false;
332
+ }
333
+ var el = document.createElement('div');
334
+ el.setAttribute("data-a-b", "c");
335
+ return el.dataset && el.dataset.aB == "c";
336
+ }());
337
+
338
+ if (detect) return
339
+
340
+ // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
341
+ Object.defineProperty(Element.prototype, 'dataset', {
342
+ get: function() {
343
+ var element = this;
344
+ var attributes = this.attributes;
345
+ var map = {};
346
+
347
+ for (var i = 0; i < attributes.length; i++) {
348
+ var attribute = attributes[i];
349
+
350
+ // This regex has been edited from the original polyfill, to add
351
+ // support for period (.) separators in data-* attribute names. These
352
+ // are allowed in the HTML spec, but were not covered by the original
353
+ // polyfill's regex. We use periods in our i18n implementation.
354
+ if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
355
+ var name = attribute.name;
356
+ var value = attribute.value;
357
+
358
+ var propName = name.substr(5).replace(/-./g, function (prop) {
359
+ return prop.charAt(1).toUpperCase();
360
+ });
361
+
362
+ // If this browser supports __defineGetter__ and __defineSetter__,
363
+ // continue using defineProperty. If not (like IE 8 and below), we use
364
+ // a hacky fallback which at least gives an object in the right format
365
+ if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
366
+ Object.defineProperty(map, propName, {
367
+ enumerable: true,
368
+ get: function() {
369
+ return this.value;
370
+ }.bind({value: value || ''}),
371
+ set: function setter(name, value) {
372
+ if (typeof value !== 'undefined') {
373
+ this.setAttribute(name, value);
374
+ } else {
375
+ this.removeAttribute(name);
573
376
  }
574
- return this;
575
-
576
- } else {
577
- // 15.3.4.5.1 [[Call]]
578
- // When the [[Call]] internal method of a function object, F,
579
- // which was created using the bind function is called with a
580
- // this value and a list of arguments ExtraArgs, the following
581
- // steps are taken:
582
- // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
583
- // property.
584
- // 2. Let boundThis be the value of F's [[BoundThis]] internal
585
- // property.
586
- // 3. Let target be the value of F's [[TargetFunction]] internal
587
- // property.
588
- // 4. Let args be a new list containing the same values as the
589
- // list boundArgs in the same order followed by the same
590
- // values as the list ExtraArgs in the same order.
591
- // 5. Return the result of calling the [[Call]] internal method
592
- // of target providing boundThis as the this value and
593
- // providing args as the arguments.
594
-
595
- // equiv: target.call(this, ...boundArgs, ...args)
596
- return target.apply(
597
- that,
598
- array_concat.call(args, array_slice.call(arguments))
599
- );
600
-
601
- }
602
-
603
- };
604
-
605
- // 15. If the [[Class]] internal property of Target is "Function", then
606
- // a. Let L be the length property of Target minus the length of A.
607
- // b. Set the length own property of F to either 0 or L, whichever is
608
- // larger.
609
- // 16. Else set the length own property of F to 0.
610
-
611
- var boundLength = max(0, target.length - args.length);
612
-
613
- // 17. Set the attributes of the length own property of F to the values
614
- // specified in 15.3.5.1.
615
- var boundArgs = [];
616
- for (var i = 0; i < boundLength; i++) {
617
- array_push.call(boundArgs, '$' + i);
618
- }
377
+ }.bind(element, name)
378
+ });
379
+ } else {
380
+ map[propName] = value;
381
+ }
619
382
 
620
- // XXX Build a dynamic function with desired amount of arguments is the only
621
- // way to set the length property of a function.
622
- // In environments where Content Security Policies enabled (Chrome extensions,
623
- // for ex.) all use of eval or Function costructor throws an exception.
624
- // However in all of these environments Function.prototype.bind exists
625
- // and so this code will never be executed.
626
- bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
627
-
628
- if (target.prototype) {
629
- Empty.prototype = target.prototype;
630
- bound.prototype = new Empty();
631
- // Clean up dangling references.
632
- Empty.prototype = null;
633
383
  }
634
-
635
- // TODO
636
- // 18. Set the [[Extensible]] internal property of F to true.
637
-
638
- // TODO
639
- // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
640
- // 20. Call the [[DefineOwnProperty]] internal method of F with
641
- // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
642
- // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
643
- // false.
644
- // 21. Call the [[DefineOwnProperty]] internal method of F with
645
- // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
646
- // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
647
- // and false.
648
-
649
- // TODO
650
- // NOTE Function objects created using Function.prototype.bind do not
651
- // have a prototype property or the [[Code]], [[FormalParameters]], and
652
- // [[Scope]] internal properties.
653
- // XXX can't delete prototype in pure-js.
654
-
655
- // 22. Return F.
656
- return bound;
384
+ }
385
+
386
+ return map;
657
387
  }
658
- });
659
- })
660
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
661
-
662
- var KEY_SPACE = 32;
663
- var DEBOUNCE_TIMEOUT_IN_SECONDS = 1;
664
-
665
- function Button ($module) {
666
- this.$module = $module;
667
- this.debounceFormSubmitTimer = null;
668
- }
669
-
670
- /**
671
- * JavaScript 'shim' to trigger the click event of element(s) when the space key is pressed.
672
- *
673
- * Created since some Assistive Technologies (for example some Screenreaders)
674
- * will tell a user to press space on a 'button', so this functionality needs to be shimmed
675
- * See https://github.com/alphagov/govuk_elements/pull/272#issuecomment-233028270
676
- *
677
- * @param {object} event event
678
- */
679
- Button.prototype.handleKeyDown = function (event) {
680
- // get the target element
681
- var target = event.target;
682
- // if the element has a role='button' and the pressed key is a space, we'll simulate a click
683
- if (target.getAttribute('role') === 'button' && event.keyCode === KEY_SPACE) {
684
- event.preventDefault();
685
- // trigger the target's click event
686
- target.click();
388
+ });
389
+
390
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
391
+
392
+ (function(undefined) {
393
+
394
+ // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
395
+ var detect = ('trim' in String.prototype);
396
+
397
+ if (detect) return
398
+
399
+ // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
400
+ String.prototype.trim = function () {
401
+ return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
402
+ };
403
+
404
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
405
+
406
+ /* eslint-disable es-x/no-string-prototype-trim -- Polyfill imported */
407
+
408
+ /**
409
+ * Normalise string
410
+ *
411
+ * 'If it looks like a duck, and it quacks like a duck…' 🦆
412
+ *
413
+ * If the passed value looks like a boolean or a number, convert it to a boolean
414
+ * or number.
415
+ *
416
+ * Designed to be used to convert config passed via data attributes (which are
417
+ * always strings) into something sensible.
418
+ *
419
+ * @param {string} value - The value to normalise
420
+ * @returns {string | boolean | number | undefined} Normalised data
421
+ */
422
+ function normaliseString (value) {
423
+ if (typeof value !== 'string') {
424
+ return value
425
+ }
426
+
427
+ var trimmedValue = value.trim();
428
+
429
+ if (trimmedValue === 'true') {
430
+ return true
431
+ }
432
+
433
+ if (trimmedValue === 'false') {
434
+ return false
435
+ }
436
+
437
+ // Empty / whitespace-only strings are considered finite so we need to check
438
+ // the length of the trimmed string as well
439
+ if (trimmedValue.length > 0 && isFinite(trimmedValue)) {
440
+ return Number(trimmedValue)
441
+ }
442
+
443
+ return value
687
444
  }
688
- };
689
-
690
- /**
691
- * If the click quickly succeeds a previous click then nothing will happen.
692
- * This stops people accidentally causing multiple form submissions by
693
- * double clicking buttons.
694
- */
695
- Button.prototype.debounce = function (event) {
696
- var target = event.target;
697
- // Check the button that is clicked on has the preventDoubleClick feature enabled
698
- if (target.getAttribute('data-prevent-double-click') !== 'true') {
699
- return
445
+
446
+ /**
447
+ * Normalise dataset
448
+ *
449
+ * Loop over an object and normalise each value using normaliseData function
450
+ *
451
+ * @param {DOMStringMap} dataset - HTML element dataset
452
+ * @returns {Object<string, unknown>} Normalised dataset
453
+ */
454
+ function normaliseDataset (dataset) {
455
+ var out = {};
456
+
457
+ for (var key in dataset) {
458
+ out[key] = normaliseString(dataset[key]);
459
+ }
460
+
461
+ return out
700
462
  }
701
463
 
702
- // If the timer is still running then we want to prevent the click from submitting the form
703
- if (this.debounceFormSubmitTimer) {
704
- event.preventDefault();
705
- return false
464
+ (function(undefined) {
465
+
466
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
467
+ var detect = ('Window' in this);
468
+
469
+ if (detect) return
470
+
471
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
472
+ if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
473
+ (function (global) {
474
+ if (global.constructor) {
475
+ global.Window = global.constructor;
476
+ } else {
477
+ (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
478
+ }
479
+ }(this));
706
480
  }
707
481
 
708
- this.debounceFormSubmitTimer = setTimeout(function () {
482
+ })
483
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
484
+
485
+ (function(undefined) {
486
+
487
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
488
+ var detect = (
489
+ (function(global) {
490
+
491
+ if (!('Event' in global)) return false;
492
+ if (typeof global.Event === 'function') return true;
493
+
494
+ try {
495
+
496
+ // In IE 9-11, the Event object exists but cannot be instantiated
497
+ new Event('click');
498
+ return true;
499
+ } catch(e) {
500
+ return false;
501
+ }
502
+ }(this))
503
+ );
504
+
505
+ if (detect) return
506
+
507
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
508
+ (function () {
509
+ var unlistenableWindowEvents = {
510
+ click: 1,
511
+ dblclick: 1,
512
+ keyup: 1,
513
+ keypress: 1,
514
+ keydown: 1,
515
+ mousedown: 1,
516
+ mouseup: 1,
517
+ mousemove: 1,
518
+ mouseover: 1,
519
+ mouseenter: 1,
520
+ mouseleave: 1,
521
+ mouseout: 1,
522
+ storage: 1,
523
+ storagecommit: 1,
524
+ textinput: 1
525
+ };
526
+
527
+ // This polyfill depends on availability of `document` so will not run in a worker
528
+ // However, we asssume there are no browsers with worker support that lack proper
529
+ // support for `Event` within the worker
530
+ if (typeof document === 'undefined' || typeof window === 'undefined') return;
531
+
532
+ function indexOf(array, element) {
533
+ var
534
+ index = -1,
535
+ length = array.length;
536
+
537
+ while (++index < length) {
538
+ if (index in array && array[index] === element) {
539
+ return index;
540
+ }
541
+ }
542
+
543
+ return -1;
544
+ }
545
+
546
+ var existingProto = (window.Event && window.Event.prototype) || null;
547
+ window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
548
+ if (!type) {
549
+ throw new Error('Not enough arguments');
550
+ }
551
+
552
+ var event;
553
+ // Shortcut if browser supports createEvent
554
+ if ('createEvent' in document) {
555
+ event = document.createEvent('Event');
556
+ var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
557
+ var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
558
+
559
+ event.initEvent(type, bubbles, cancelable);
560
+
561
+ return event;
562
+ }
563
+
564
+ event = document.createEventObject();
565
+
566
+ event.type = type;
567
+ event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
568
+ event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
569
+
570
+ return event;
571
+ };
572
+ if (existingProto) {
573
+ Object.defineProperty(window.Event, 'prototype', {
574
+ configurable: false,
575
+ enumerable: false,
576
+ writable: true,
577
+ value: existingProto
578
+ });
579
+ }
580
+
581
+ if (!('createEvent' in document)) {
582
+ window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
583
+ var
584
+ element = this,
585
+ type = arguments[0],
586
+ listener = arguments[1];
587
+
588
+ if (element === window && type in unlistenableWindowEvents) {
589
+ throw new Error('In IE8 the event: ' + type + ' is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.');
590
+ }
591
+
592
+ if (!element._events) {
593
+ element._events = {};
594
+ }
595
+
596
+ if (!element._events[type]) {
597
+ element._events[type] = function (event) {
598
+ var
599
+ list = element._events[event.type].list,
600
+ events = list.slice(),
601
+ index = -1,
602
+ length = events.length,
603
+ eventElement;
604
+
605
+ event.preventDefault = function preventDefault() {
606
+ if (event.cancelable !== false) {
607
+ event.returnValue = false;
608
+ }
609
+ };
610
+
611
+ event.stopPropagation = function stopPropagation() {
612
+ event.cancelBubble = true;
613
+ };
614
+
615
+ event.stopImmediatePropagation = function stopImmediatePropagation() {
616
+ event.cancelBubble = true;
617
+ event.cancelImmediate = true;
618
+ };
619
+
620
+ event.currentTarget = element;
621
+ event.relatedTarget = event.fromElement || null;
622
+ event.target = event.target || event.srcElement || element;
623
+ event.timeStamp = new Date().getTime();
624
+
625
+ if (event.clientX) {
626
+ event.pageX = event.clientX + document.documentElement.scrollLeft;
627
+ event.pageY = event.clientY + document.documentElement.scrollTop;
628
+ }
629
+
630
+ while (++index < length && !event.cancelImmediate) {
631
+ if (index in events) {
632
+ eventElement = events[index];
633
+
634
+ if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
635
+ eventElement.call(element, event);
636
+ }
637
+ }
638
+ }
639
+ };
640
+
641
+ element._events[type].list = [];
642
+
643
+ if (element.attachEvent) {
644
+ element.attachEvent('on' + type, element._events[type]);
645
+ }
646
+ }
647
+
648
+ element._events[type].list.push(listener);
649
+ };
650
+
651
+ window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
652
+ var
653
+ element = this,
654
+ type = arguments[0],
655
+ listener = arguments[1],
656
+ index;
657
+
658
+ if (element._events && element._events[type] && element._events[type].list) {
659
+ index = indexOf(element._events[type].list, listener);
660
+
661
+ if (index !== -1) {
662
+ element._events[type].list.splice(index, 1);
663
+
664
+ if (!element._events[type].list.length) {
665
+ if (element.detachEvent) {
666
+ element.detachEvent('on' + type, element._events[type]);
667
+ }
668
+ delete element._events[type];
669
+ }
670
+ }
671
+ }
672
+ };
673
+
674
+ window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
675
+ if (!arguments.length) {
676
+ throw new Error('Not enough arguments');
677
+ }
678
+
679
+ if (!event || typeof event.type !== 'string') {
680
+ throw new Error('DOM Events Exception 0');
681
+ }
682
+
683
+ var element = this, type = event.type;
684
+
685
+ try {
686
+ if (!event.bubbles) {
687
+ event.cancelBubble = true;
688
+
689
+ var cancelBubbleEvent = function (event) {
690
+ event.cancelBubble = true;
691
+
692
+ (element || window).detachEvent('on' + type, cancelBubbleEvent);
693
+ };
694
+
695
+ this.attachEvent('on' + type, cancelBubbleEvent);
696
+ }
697
+
698
+ this.fireEvent('on' + type, event);
699
+ } catch (error) {
700
+ event.target = element;
701
+
702
+ do {
703
+ event.currentTarget = element;
704
+
705
+ if ('_events' in element && typeof element._events[type] === 'function') {
706
+ element._events[type].call(element, event);
707
+ }
708
+
709
+ if (typeof element['on' + type] === 'function') {
710
+ element['on' + type].call(element, event);
711
+ }
712
+
713
+ element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
714
+ } while (element && !event.cancelBubble);
715
+ }
716
+
717
+ return true;
718
+ };
719
+
720
+ // Add the DOMContentLoaded Event
721
+ document.attachEvent('onreadystatechange', function() {
722
+ if (document.readyState === 'complete') {
723
+ document.dispatchEvent(new Event('DOMContentLoaded', {
724
+ bubbles: true
725
+ }));
726
+ }
727
+ });
728
+ }
729
+ }());
730
+
731
+ })
732
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
733
+
734
+ (function(undefined) {
735
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
736
+ var detect = 'bind' in Function.prototype;
737
+
738
+ if (detect) return
739
+
740
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
741
+ Object.defineProperty(Function.prototype, 'bind', {
742
+ value: function bind(that) { // .length is 1
743
+ // add necessary es5-shim utilities
744
+ var $Array = Array;
745
+ var $Object = Object;
746
+ var ObjectPrototype = $Object.prototype;
747
+ var ArrayPrototype = $Array.prototype;
748
+ var Empty = function Empty() {};
749
+ var to_string = ObjectPrototype.toString;
750
+ var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
751
+ var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
752
+ var array_slice = ArrayPrototype.slice;
753
+ var array_concat = ArrayPrototype.concat;
754
+ var array_push = ArrayPrototype.push;
755
+ var max = Math.max;
756
+ // /add necessary es5-shim utilities
757
+
758
+ // 1. Let Target be the this value.
759
+ var target = this;
760
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
761
+ if (!isCallable(target)) {
762
+ throw new TypeError('Function.prototype.bind called on incompatible ' + target);
763
+ }
764
+ // 3. Let A be a new (possibly empty) internal list of all of the
765
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
766
+ // XXX slicedArgs will stand in for "A" if used
767
+ var args = array_slice.call(arguments, 1); // for normal call
768
+ // 4. Let F be a new native ECMAScript object.
769
+ // 11. Set the [[Prototype]] internal property of F to the standard
770
+ // built-in Function prototype object as specified in 15.3.3.1.
771
+ // 12. Set the [[Call]] internal property of F as described in
772
+ // 15.3.4.5.1.
773
+ // 13. Set the [[Construct]] internal property of F as described in
774
+ // 15.3.4.5.2.
775
+ // 14. Set the [[HasInstance]] internal property of F as described in
776
+ // 15.3.4.5.3.
777
+ var bound;
778
+ var binder = function () {
779
+
780
+ if (this instanceof bound) {
781
+ // 15.3.4.5.2 [[Construct]]
782
+ // When the [[Construct]] internal method of a function object,
783
+ // F that was created using the bind function is called with a
784
+ // list of arguments ExtraArgs, the following steps are taken:
785
+ // 1. Let target be the value of F's [[TargetFunction]]
786
+ // internal property.
787
+ // 2. If target has no [[Construct]] internal method, a
788
+ // TypeError exception is thrown.
789
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
790
+ // property.
791
+ // 4. Let args be a new list containing the same values as the
792
+ // list boundArgs in the same order followed by the same
793
+ // values as the list ExtraArgs in the same order.
794
+ // 5. Return the result of calling the [[Construct]] internal
795
+ // method of target providing args as the arguments.
796
+
797
+ var result = target.apply(
798
+ this,
799
+ array_concat.call(args, array_slice.call(arguments))
800
+ );
801
+ if ($Object(result) === result) {
802
+ return result;
803
+ }
804
+ return this;
805
+
806
+ } else {
807
+ // 15.3.4.5.1 [[Call]]
808
+ // When the [[Call]] internal method of a function object, F,
809
+ // which was created using the bind function is called with a
810
+ // this value and a list of arguments ExtraArgs, the following
811
+ // steps are taken:
812
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
813
+ // property.
814
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
815
+ // property.
816
+ // 3. Let target be the value of F's [[TargetFunction]] internal
817
+ // property.
818
+ // 4. Let args be a new list containing the same values as the
819
+ // list boundArgs in the same order followed by the same
820
+ // values as the list ExtraArgs in the same order.
821
+ // 5. Return the result of calling the [[Call]] internal method
822
+ // of target providing boundThis as the this value and
823
+ // providing args as the arguments.
824
+
825
+ // equiv: target.call(this, ...boundArgs, ...args)
826
+ return target.apply(
827
+ that,
828
+ array_concat.call(args, array_slice.call(arguments))
829
+ );
830
+
831
+ }
832
+
833
+ };
834
+
835
+ // 15. If the [[Class]] internal property of Target is "Function", then
836
+ // a. Let L be the length property of Target minus the length of A.
837
+ // b. Set the length own property of F to either 0 or L, whichever is
838
+ // larger.
839
+ // 16. Else set the length own property of F to 0.
840
+
841
+ var boundLength = max(0, target.length - args.length);
842
+
843
+ // 17. Set the attributes of the length own property of F to the values
844
+ // specified in 15.3.5.1.
845
+ var boundArgs = [];
846
+ for (var i = 0; i < boundLength; i++) {
847
+ array_push.call(boundArgs, '$' + i);
848
+ }
849
+
850
+ // XXX Build a dynamic function with desired amount of arguments is the only
851
+ // way to set the length property of a function.
852
+ // In environments where Content Security Policies enabled (Chrome extensions,
853
+ // for ex.) all use of eval or Function costructor throws an exception.
854
+ // However in all of these environments Function.prototype.bind exists
855
+ // and so this code will never be executed.
856
+ bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
857
+
858
+ if (target.prototype) {
859
+ Empty.prototype = target.prototype;
860
+ bound.prototype = new Empty();
861
+ // Clean up dangling references.
862
+ Empty.prototype = null;
863
+ }
864
+
865
+ // TODO
866
+ // 18. Set the [[Extensible]] internal property of F to true.
867
+
868
+ // TODO
869
+ // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
870
+ // 20. Call the [[DefineOwnProperty]] internal method of F with
871
+ // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
872
+ // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
873
+ // false.
874
+ // 21. Call the [[DefineOwnProperty]] internal method of F with
875
+ // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
876
+ // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
877
+ // and false.
878
+
879
+ // TODO
880
+ // NOTE Function objects created using Function.prototype.bind do not
881
+ // have a prototype property or the [[Code]], [[FormalParameters]], and
882
+ // [[Scope]] internal properties.
883
+ // XXX can't delete prototype in pure-js.
884
+
885
+ // 22. Return F.
886
+ return bound;
887
+ }
888
+ });
889
+ })
890
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
891
+
892
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
893
+
894
+ var KEY_SPACE = 32;
895
+ var DEBOUNCE_TIMEOUT_IN_SECONDS = 1;
896
+
897
+ /**
898
+ * JavaScript enhancements for the Button component
899
+ *
900
+ * @class
901
+ * @param {HTMLElement} $module - HTML element to use for button
902
+ * @param {ButtonConfig} [config] - Button config
903
+ */
904
+ function Button ($module, config) {
905
+ if (!$module) {
906
+ return this
907
+ }
908
+
909
+ this.$module = $module;
709
910
  this.debounceFormSubmitTimer = null;
710
- }.bind(this), DEBOUNCE_TIMEOUT_IN_SECONDS * 1000);
711
- };
712
911
 
713
- /**
714
- * Initialise an event listener for keydown at document level
715
- * this will help listening for later inserted elements with a role="button"
716
- */
717
- Button.prototype.init = function () {
718
- this.$module.addEventListener('keydown', this.handleKeyDown);
719
- this.$module.addEventListener('click', this.debounce);
720
- };
912
+ var defaultConfig = {
913
+ preventDoubleClick: false
914
+ };
915
+ this.config = mergeConfigs(
916
+ defaultConfig,
917
+ config || {},
918
+ normaliseDataset($module.dataset)
919
+ );
920
+ }
721
921
 
722
- return Button;
922
+ /**
923
+ * Initialise component
924
+ */
925
+ Button.prototype.init = function () {
926
+ if (!this.$module) {
927
+ return
928
+ }
929
+
930
+ this.$module.addEventListener('keydown', this.handleKeyDown);
931
+ this.$module.addEventListener('click', this.debounce.bind(this));
932
+ };
933
+
934
+ /**
935
+ * Trigger a click event when the space key is pressed
936
+ *
937
+ * Some screen readers tell users they can activate things with the 'button'
938
+ * role, so we need to match the functionality of native HTML buttons
939
+ *
940
+ * See https://github.com/alphagov/govuk_elements/pull/272#issuecomment-233028270
941
+ *
942
+ * @param {KeyboardEvent} event - Keydown event
943
+ */
944
+ Button.prototype.handleKeyDown = function (event) {
945
+ var $target = event.target;
946
+
947
+ if ($target.getAttribute('role') === 'button' && event.keyCode === KEY_SPACE) {
948
+ event.preventDefault(); // prevent the page from scrolling
949
+ $target.click();
950
+ }
951
+ };
952
+
953
+ /**
954
+ * Debounce double-clicks
955
+ *
956
+ * If the click quickly succeeds a previous click then nothing will happen. This
957
+ * stops people accidentally causing multiple form submissions by double
958
+ * clicking buttons.
959
+ *
960
+ * @param {MouseEvent} event - Mouse click event
961
+ * @returns {undefined | false} Returns undefined, or false when debounced
962
+ */
963
+ Button.prototype.debounce = function (event) {
964
+ // Check the button that was clicked has preventDoubleClick enabled
965
+ if (!this.config.preventDoubleClick) {
966
+ return
967
+ }
968
+
969
+ // If the timer is still running, prevent the click from submitting the form
970
+ if (this.debounceFormSubmitTimer) {
971
+ event.preventDefault();
972
+ return false
973
+ }
974
+
975
+ this.debounceFormSubmitTimer = setTimeout(function () {
976
+ this.debounceFormSubmitTimer = null;
977
+ }.bind(this), DEBOUNCE_TIMEOUT_IN_SECONDS * 1000);
978
+ };
979
+
980
+ /**
981
+ * Button config
982
+ *
983
+ * @typedef {object} ButtonConfig
984
+ * @property {boolean} [preventDoubleClick = false] -
985
+ * Prevent accidental double clicks on submit buttons from submitting forms
986
+ * multiple times.
987
+ */
988
+
989
+ return Button;
723
990
 
724
991
  })));
992
+ //# sourceMappingURL=button.js.map