govuk_tech_docs 3.5.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (327) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/publish.yaml +8 -4
  3. data/.github/workflows/test.yaml +11 -4
  4. data/.rubocop.yml +1 -1
  5. data/CHANGELOG.md +21 -2
  6. data/example/.ruby-version +1 -1
  7. data/example/source/javascripts/govuk_frontend.js +1 -0
  8. data/govuk_tech_docs.gemspec +17 -11
  9. data/lib/assets/javascripts/_modules/page-expiry.js +2 -2
  10. data/lib/assets/javascripts/_modules/table-of-contents.js +48 -2
  11. data/lib/assets/javascripts/govuk_frontend_all.js +3 -0
  12. data/lib/assets/javascripts/govuk_tech_docs.js +0 -2
  13. data/lib/assets/stylesheets/_govuk_tech_docs.scss +4 -10
  14. data/lib/assets/stylesheets/modules/_page-review.scss +0 -2
  15. data/lib/assets/stylesheets/modules/_search.scss +0 -4
  16. data/lib/govuk_tech_docs/meta_tags.rb +1 -1
  17. data/lib/govuk_tech_docs/redirects.rb +1 -1
  18. data/lib/govuk_tech_docs/table_of_contents/heading_tree_builder.rb +1 -1
  19. data/lib/govuk_tech_docs/table_of_contents/helpers.rb +2 -2
  20. data/lib/govuk_tech_docs/tech_docs_html_renderer.rb +6 -2
  21. data/lib/govuk_tech_docs/version.rb +1 -1
  22. data/lib/govuk_tech_docs.rb +20 -3
  23. data/lib/source/layouts/_header.erb +8 -12
  24. data/lib/source/layouts/_page_review.erb +1 -1
  25. data/lib/source/layouts/_search.erb +2 -2
  26. data/lib/source/layouts/core.erb +8 -2
  27. data/lib/source/stylesheets/manifest.css +1 -1
  28. data/node_modules/govuk-frontend/dist/govuk/_base.scss +5 -0
  29. data/node_modules/govuk-frontend/dist/govuk/all.bundle.js +2554 -0
  30. data/node_modules/govuk-frontend/dist/govuk/all.bundle.mjs +2529 -0
  31. data/node_modules/govuk-frontend/dist/govuk/all.mjs +18 -0
  32. data/node_modules/govuk-frontend/dist/govuk/all.scss +3 -0
  33. data/node_modules/govuk-frontend/dist/govuk/assets/images/favicon.svg +1 -0
  34. data/node_modules/govuk-frontend/dist/govuk/assets/images/govuk-crest.svg +1 -0
  35. data/node_modules/govuk-frontend/dist/govuk/assets/images/govuk-icon-180.png +0 -0
  36. data/node_modules/govuk-frontend/dist/govuk/assets/images/govuk-icon-192.png +0 -0
  37. data/node_modules/govuk-frontend/dist/govuk/assets/images/govuk-icon-512.png +0 -0
  38. data/node_modules/govuk-frontend/dist/govuk/assets/images/govuk-icon-mask.svg +1 -0
  39. data/node_modules/govuk-frontend/dist/govuk/assets/images/govuk-opengraph-image.png +0 -0
  40. data/node_modules/govuk-frontend/dist/govuk/common/closest-attribute-value.mjs +7 -0
  41. data/node_modules/govuk-frontend/dist/govuk/common/govuk-frontend-version.mjs +4 -0
  42. data/node_modules/govuk-frontend/dist/govuk/common/index.mjs +159 -0
  43. data/node_modules/govuk-frontend/dist/govuk/common/normalise-dataset.mjs +18 -0
  44. data/node_modules/govuk-frontend/dist/govuk/common/normalise-string.mjs +31 -0
  45. data/node_modules/govuk-frontend/dist/govuk/components/_all.scss +10 -0
  46. data/node_modules/govuk-frontend/{govuk/components/_all.scss → dist/govuk/components/_index.scss} +8 -3
  47. data/node_modules/govuk-frontend/dist/govuk/components/accordion/_accordion.scss +4 -0
  48. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/accordion/_index.scss +55 -77
  49. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.js +785 -0
  50. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.bundle.mjs +777 -0
  51. data/node_modules/govuk-frontend/dist/govuk/components/accordion/accordion.mjs +349 -0
  52. data/node_modules/govuk-frontend/dist/govuk/components/back-link/_back-link.scss +4 -0
  53. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/back-link/_index.scss +12 -36
  54. data/node_modules/govuk-frontend/dist/govuk/components/breadcrumbs/_breadcrumbs.scss +4 -0
  55. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/breadcrumbs/_index.scss +11 -36
  56. data/node_modules/govuk-frontend/dist/govuk/components/button/_button.scss +4 -0
  57. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/button/_index.scss +30 -103
  58. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.js +318 -0
  59. data/node_modules/govuk-frontend/dist/govuk/components/button/button.bundle.mjs +310 -0
  60. data/node_modules/govuk-frontend/dist/govuk/components/button/button.mjs +73 -0
  61. data/node_modules/govuk-frontend/dist/govuk/components/character-count/_character-count.scss +4 -0
  62. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/character-count/_index.scss +8 -6
  63. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.js +761 -0
  64. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.bundle.mjs +753 -0
  65. data/node_modules/govuk-frontend/dist/govuk/components/character-count/character-count.mjs +295 -0
  66. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/_checkboxes.scss +4 -0
  67. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/checkboxes/_index.scss +108 -132
  68. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.js +268 -0
  69. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.bundle.mjs +260 -0
  70. data/node_modules/govuk-frontend/dist/govuk/components/checkboxes/checkboxes.mjs +111 -0
  71. data/node_modules/govuk-frontend/dist/govuk/components/cookie-banner/_cookie-banner.scss +4 -0
  72. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/cookie-banner/_index.scss +19 -15
  73. data/node_modules/govuk-frontend/dist/govuk/components/date-input/_date-input.scss +4 -0
  74. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/date-input/_index.scss +3 -2
  75. data/node_modules/govuk-frontend/dist/govuk/components/details/_details.scss +4 -0
  76. data/node_modules/govuk-frontend/dist/govuk/components/details/_index.scss +139 -0
  77. data/node_modules/govuk-frontend/dist/govuk/components/error-message/_error-message.scss +4 -0
  78. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/error-message/_index.scss +2 -0
  79. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/_error-summary.scss +4 -0
  80. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/error-summary/_index.scss +19 -6
  81. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.js +378 -0
  82. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.bundle.mjs +370 -0
  83. data/node_modules/govuk-frontend/dist/govuk/components/error-summary/error-summary.mjs +103 -0
  84. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/_exit-this-page.scss +4 -0
  85. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/exit-this-page/_index.scss +5 -10
  86. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.js +662 -0
  87. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.bundle.mjs +654 -0
  88. data/node_modules/govuk-frontend/dist/govuk/components/exit-this-page/exit-this-page.mjs +226 -0
  89. data/node_modules/govuk-frontend/dist/govuk/components/fieldset/_fieldset.scss +4 -0
  90. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/fieldset/_index.scss +20 -15
  91. data/node_modules/govuk-frontend/dist/govuk/components/file-upload/_file-upload.scss +4 -0
  92. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/file-upload/_index.scss +11 -15
  93. data/node_modules/govuk-frontend/dist/govuk/components/footer/_footer.scss +4 -0
  94. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/footer/_index.scss +25 -68
  95. data/node_modules/govuk-frontend/dist/govuk/components/header/_header.scss +4 -0
  96. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/header/_index.scss +84 -79
  97. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.js +252 -0
  98. data/node_modules/govuk-frontend/dist/govuk/components/header/header.bundle.mjs +244 -0
  99. data/node_modules/govuk-frontend/dist/govuk/components/header/header.mjs +88 -0
  100. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/hint/_hint.scss +2 -0
  101. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/hint/_index.scss +3 -0
  102. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/input/_index.scss +24 -49
  103. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/input/_input.scss +2 -0
  104. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/inset-text/_index.scss +2 -0
  105. data/node_modules/govuk-frontend/dist/govuk/components/inset-text/_inset-text.scss +4 -0
  106. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/label/_index.scss +12 -7
  107. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/label/_label.scss +2 -0
  108. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/notification-banner/_index.scss +11 -7
  109. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/_notification-banner.scss +4 -0
  110. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.js +320 -0
  111. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.bundle.mjs +312 -0
  112. data/node_modules/govuk-frontend/dist/govuk/components/notification-banner/notification-banner.mjs +51 -0
  113. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/pagination/_index.scss +36 -55
  114. data/node_modules/govuk-frontend/dist/govuk/components/pagination/_pagination.scss +4 -0
  115. data/node_modules/govuk-frontend/dist/govuk/components/panel/_index.scss +58 -0
  116. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/panel/_panel.scss +2 -0
  117. data/node_modules/govuk-frontend/dist/govuk/components/password-input/_index.scss +57 -0
  118. data/node_modules/govuk-frontend/dist/govuk/components/password-input/_password-input.scss +4 -0
  119. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.js +594 -0
  120. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.bundle.mjs +586 -0
  121. data/node_modules/govuk-frontend/dist/govuk/components/password-input/password-input.mjs +154 -0
  122. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/phase-banner/_index.scss +10 -1
  123. data/node_modules/govuk-frontend/dist/govuk/components/phase-banner/_phase-banner.scss +4 -0
  124. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/radios/_index.scss +92 -113
  125. data/node_modules/govuk-frontend/dist/govuk/components/radios/_radios.scss +4 -0
  126. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.js +245 -0
  127. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.bundle.mjs +237 -0
  128. data/node_modules/govuk-frontend/dist/govuk/components/radios/radios.mjs +88 -0
  129. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/select/_index.scss +9 -16
  130. data/node_modules/govuk-frontend/dist/govuk/components/select/_select.scss +4 -0
  131. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_index.scss +168 -0
  132. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/_service-navigation.scss +4 -0
  133. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.js +249 -0
  134. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.bundle.mjs +241 -0
  135. data/node_modules/govuk-frontend/dist/govuk/components/service-navigation/service-navigation.mjs +85 -0
  136. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/skip-link/_index.scss +10 -5
  137. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/_skip-link.scss +4 -0
  138. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.js +244 -0
  139. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.bundle.mjs +236 -0
  140. data/node_modules/govuk-frontend/dist/govuk/components/skip-link/skip-link.mjs +58 -0
  141. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/summary-list/_index.scss +22 -20
  142. data/node_modules/govuk-frontend/dist/govuk/components/summary-list/_summary-list.scss +4 -0
  143. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/table/_index.scss +21 -17
  144. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/table/_table.scss +2 -0
  145. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/tabs/_index.scss +13 -9
  146. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/tabs/_tabs.scss +2 -0
  147. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.js +453 -0
  148. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.bundle.mjs +445 -0
  149. data/node_modules/govuk-frontend/dist/govuk/components/tabs/tabs.mjs +283 -0
  150. data/node_modules/govuk-frontend/dist/govuk/components/tag/_index.scss +97 -0
  151. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/tag/_tag.scss +2 -0
  152. data/node_modules/govuk-frontend/dist/govuk/components/task-list/_index.scss +79 -0
  153. data/node_modules/govuk-frontend/dist/govuk/components/task-list/_task-list.scss +4 -0
  154. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/textarea/_index.scss +6 -10
  155. data/node_modules/govuk-frontend/dist/govuk/components/textarea/_textarea.scss +4 -0
  156. data/node_modules/govuk-frontend/{govuk → dist/govuk}/components/warning-text/_index.scss +13 -13
  157. data/node_modules/govuk-frontend/dist/govuk/components/warning-text/_warning-text.scss +4 -0
  158. data/node_modules/govuk-frontend/dist/govuk/core/_all.scss +10 -0
  159. data/node_modules/govuk-frontend/{govuk → dist/govuk}/core/_global-styles.scss +2 -1
  160. data/node_modules/govuk-frontend/dist/govuk/core/_govuk-frontend-properties.scss +12 -0
  161. data/node_modules/govuk-frontend/{govuk/core/_all.scss → dist/govuk/core/_index.scss} +3 -1
  162. data/node_modules/govuk-frontend/{govuk → dist/govuk}/core/_links.scss +8 -1
  163. data/node_modules/govuk-frontend/{govuk → dist/govuk}/core/_lists.scss +2 -1
  164. data/node_modules/govuk-frontend/{govuk → dist/govuk}/core/_section-break.scss +2 -7
  165. data/node_modules/govuk-frontend/{govuk → dist/govuk}/core/_typography.scss +8 -5
  166. data/node_modules/govuk-frontend/dist/govuk/errors/index.mjs +57 -0
  167. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend-component.mjs +60 -0
  168. data/node_modules/govuk-frontend/dist/govuk/govuk-frontend.min.js +1 -0
  169. data/node_modules/govuk-frontend/dist/govuk/helpers/_all.scss +10 -0
  170. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_clearfix.scss +3 -1
  171. data/node_modules/govuk-frontend/dist/govuk/helpers/_colour.scss +127 -0
  172. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_device-pixels.scss +4 -3
  173. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_focused.scss +22 -6
  174. data/node_modules/govuk-frontend/dist/govuk/helpers/_font-faces.scss +41 -0
  175. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_grid.scss +3 -1
  176. data/node_modules/govuk-frontend/{govuk/helpers/_all.scss → dist/govuk/helpers/_index.scss} +2 -0
  177. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_links.scss +38 -76
  178. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_media-queries.scss +3 -12
  179. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_shape-arrow.scss +3 -1
  180. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_spacing.scss +12 -10
  181. data/node_modules/govuk-frontend/dist/govuk/helpers/_typography.scss +288 -0
  182. data/node_modules/govuk-frontend/{govuk → dist/govuk}/helpers/_visually-hidden.scss +39 -50
  183. data/node_modules/govuk-frontend/dist/govuk/i18n.mjs +195 -0
  184. data/node_modules/govuk-frontend/dist/govuk/index.scss +11 -0
  185. data/node_modules/govuk-frontend/dist/govuk/init.mjs +162 -0
  186. data/node_modules/govuk-frontend/dist/govuk/objects/_all.scss +10 -0
  187. data/node_modules/govuk-frontend/{govuk → dist/govuk}/objects/_button-group.scss +7 -12
  188. data/node_modules/govuk-frontend/{govuk → dist/govuk}/objects/_form-group.scss +2 -0
  189. data/node_modules/govuk-frontend/{govuk → dist/govuk}/objects/_grid.scss +4 -2
  190. data/node_modules/govuk-frontend/{govuk/objects/_all.scss → dist/govuk/objects/_index.scss} +2 -0
  191. data/node_modules/govuk-frontend/{govuk → dist/govuk}/objects/_main-wrapper.scss +2 -0
  192. data/node_modules/govuk-frontend/{govuk → dist/govuk}/objects/_template.scss +2 -1
  193. data/node_modules/govuk-frontend/{govuk → dist/govuk}/objects/_width-container.scss +2 -9
  194. data/node_modules/govuk-frontend/dist/govuk/overrides/_all.scss +9 -0
  195. data/node_modules/govuk-frontend/{govuk → dist/govuk}/overrides/_display.scss +2 -0
  196. data/node_modules/govuk-frontend/{govuk/overrides/_all.scss → dist/govuk/overrides/_index.scss} +2 -0
  197. data/node_modules/govuk-frontend/{govuk → dist/govuk}/overrides/_spacing.scss +3 -19
  198. data/node_modules/govuk-frontend/{govuk → dist/govuk}/overrides/_text-align.scss +2 -0
  199. data/node_modules/govuk-frontend/dist/govuk/overrides/_typography.scss +42 -0
  200. data/node_modules/govuk-frontend/{govuk → dist/govuk}/overrides/_width.scss +2 -0
  201. data/node_modules/govuk-frontend/dist/govuk/settings/_all.scss +10 -0
  202. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_assets.scss +2 -0
  203. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_colours-applied.scss +9 -7
  204. data/node_modules/govuk-frontend/dist/govuk/settings/_colours-organisations.scss +378 -0
  205. data/node_modules/govuk-frontend/dist/govuk/settings/_colours-palette.scss +37 -0
  206. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_global-styles.scss +2 -0
  207. data/node_modules/govuk-frontend/{govuk/settings/_all.scss → dist/govuk/settings/_index.scss} +2 -3
  208. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_links.scss +3 -20
  209. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_measurements.scss +18 -6
  210. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_media-queries.scss +5 -3
  211. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_spacing.scss +2 -0
  212. data/node_modules/govuk-frontend/dist/govuk/settings/_typography-font.scss +52 -0
  213. data/node_modules/govuk-frontend/dist/govuk/settings/_typography-responsive.scss +322 -0
  214. data/node_modules/govuk-frontend/{govuk → dist/govuk}/settings/_warnings.scss +33 -8
  215. data/node_modules/govuk-frontend/dist/govuk/tools/_all.scss +10 -0
  216. data/node_modules/govuk-frontend/{govuk → dist/govuk}/tools/_exports.scss +2 -0
  217. data/node_modules/govuk-frontend/{govuk → dist/govuk}/tools/_font-url.scss +3 -0
  218. data/node_modules/govuk-frontend/{govuk → dist/govuk}/tools/_image-url.scss +3 -0
  219. data/node_modules/govuk-frontend/{govuk/tools/_all.scss → dist/govuk/tools/_index.scss} +2 -2
  220. data/node_modules/govuk-frontend/{govuk → dist/govuk}/tools/_px-to-em.scss +2 -0
  221. data/node_modules/govuk-frontend/{govuk → dist/govuk}/tools/_px-to-rem.scss +2 -0
  222. data/node_modules/govuk-frontend/dist/govuk/utilities/_all.scss +10 -0
  223. data/node_modules/govuk-frontend/{govuk → dist/govuk}/utilities/_clearfix.scss +2 -0
  224. data/node_modules/govuk-frontend/{govuk/utilities/_all.scss → dist/govuk/utilities/_index.scss} +2 -0
  225. data/node_modules/govuk-frontend/{govuk → dist/govuk}/utilities/_visually-hidden.scss +2 -0
  226. data/node_modules/govuk-frontend/{govuk → dist/govuk}/vendor/_sass-mq.scss +3 -1
  227. data/node_modules/govuk-frontend/dist/govuk-prototype-kit/init.js +15 -0
  228. data/node_modules/govuk-frontend/{govuk-prototype-kit → dist/govuk-prototype-kit}/init.scss +3 -2
  229. data/package-lock.json +37 -37
  230. data/package.json +6 -1
  231. metadata +316 -206
  232. data/node_modules/govuk-frontend/govuk/_base.scss +0 -3
  233. data/node_modules/govuk-frontend/govuk/all-ie8.scss +0 -14
  234. data/node_modules/govuk-frontend/govuk/all.js +0 -5172
  235. data/node_modules/govuk-frontend/govuk/all.scss +0 -9
  236. data/node_modules/govuk-frontend/govuk/assets/images/favicon.ico +0 -0
  237. data/node_modules/govuk-frontend/govuk/assets/images/govuk-apple-touch-icon-152x152.png +0 -0
  238. data/node_modules/govuk-frontend/govuk/assets/images/govuk-apple-touch-icon-167x167.png +0 -0
  239. data/node_modules/govuk-frontend/govuk/assets/images/govuk-apple-touch-icon-180x180.png +0 -0
  240. data/node_modules/govuk-frontend/govuk/assets/images/govuk-apple-touch-icon.png +0 -0
  241. data/node_modules/govuk-frontend/govuk/assets/images/govuk-crest-2x.png +0 -0
  242. data/node_modules/govuk-frontend/govuk/assets/images/govuk-crest.png +0 -0
  243. data/node_modules/govuk-frontend/govuk/assets/images/govuk-logotype-crown.png +0 -0
  244. data/node_modules/govuk-frontend/govuk/assets/images/govuk-mask-icon.svg +0 -7
  245. data/node_modules/govuk-frontend/govuk/assets/images/govuk-opengraph-image.png +0 -0
  246. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js +0 -75
  247. data/node_modules/govuk-frontend/govuk/common/govuk-frontend-version.js +0 -17
  248. data/node_modules/govuk-frontend/govuk/common/index.js +0 -192
  249. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js +0 -386
  250. data/node_modules/govuk-frontend/govuk/common.js +0 -194
  251. data/node_modules/govuk-frontend/govuk/components/accordion/_accordion.scss +0 -2
  252. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js +0 -2386
  253. data/node_modules/govuk-frontend/govuk/components/back-link/_back-link.scss +0 -2
  254. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/_breadcrumbs.scss +0 -2
  255. data/node_modules/govuk-frontend/govuk/components/button/_button.scss +0 -2
  256. data/node_modules/govuk-frontend/govuk/components/button/button.js +0 -1027
  257. data/node_modules/govuk-frontend/govuk/components/character-count/_character-count.scss +0 -2
  258. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +0 -2281
  259. data/node_modules/govuk-frontend/govuk/components/checkboxes/_checkboxes.scss +0 -2
  260. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +0 -1277
  261. data/node_modules/govuk-frontend/govuk/components/cookie-banner/_cookie-banner.scss +0 -2
  262. data/node_modules/govuk-frontend/govuk/components/date-input/_date-input.scss +0 -2
  263. data/node_modules/govuk-frontend/govuk/components/details/_details.scss +0 -2
  264. data/node_modules/govuk-frontend/govuk/components/details/_index.scss +0 -88
  265. data/node_modules/govuk-frontend/govuk/components/details/details.js +0 -873
  266. data/node_modules/govuk-frontend/govuk/components/error-message/_error-message.scss +0 -2
  267. data/node_modules/govuk-frontend/govuk/components/error-summary/_error-summary.scss +0 -2
  268. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js +0 -1189
  269. data/node_modules/govuk-frontend/govuk/components/exit-this-page/_exit-this-page.scss +0 -2
  270. data/node_modules/govuk-frontend/govuk/components/exit-this-page/exit-this-page.js +0 -2120
  271. data/node_modules/govuk-frontend/govuk/components/fieldset/_fieldset.scss +0 -2
  272. data/node_modules/govuk-frontend/govuk/components/file-upload/_file-upload.scss +0 -2
  273. data/node_modules/govuk-frontend/govuk/components/footer/_footer.scss +0 -2
  274. data/node_modules/govuk-frontend/govuk/components/header/_header.scss +0 -2
  275. data/node_modules/govuk-frontend/govuk/components/header/header.js +0 -794
  276. data/node_modules/govuk-frontend/govuk/components/inset-text/_inset-text.scss +0 -2
  277. data/node_modules/govuk-frontend/govuk/components/notification-banner/_notification-banner.scss +0 -2
  278. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js +0 -843
  279. data/node_modules/govuk-frontend/govuk/components/pagination/_pagination.scss +0 -2
  280. data/node_modules/govuk-frontend/govuk/components/panel/_index.scss +0 -56
  281. data/node_modules/govuk-frontend/govuk/components/phase-banner/_phase-banner.scss +0 -2
  282. data/node_modules/govuk-frontend/govuk/components/radios/_radios.scss +0 -2
  283. data/node_modules/govuk-frontend/govuk/components/radios/radios.js +0 -1222
  284. data/node_modules/govuk-frontend/govuk/components/select/_select.scss +0 -2
  285. data/node_modules/govuk-frontend/govuk/components/skip-link/_skip-link.scss +0 -2
  286. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js +0 -1145
  287. data/node_modules/govuk-frontend/govuk/components/summary-list/_summary-list.scss +0 -2
  288. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js +0 -1621
  289. data/node_modules/govuk-frontend/govuk/components/tag/_index.scss +0 -81
  290. data/node_modules/govuk-frontend/govuk/components/textarea/_textarea.scss +0 -2
  291. data/node_modules/govuk-frontend/govuk/components/warning-text/_warning-text.scss +0 -2
  292. data/node_modules/govuk-frontend/govuk/core/_govuk-frontend-version.scss +0 -5
  293. data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +0 -98
  294. data/node_modules/govuk-frontend/govuk/helpers/_font-faces.scss +0 -41
  295. data/node_modules/govuk-frontend/govuk/helpers/_typography.scss +0 -214
  296. data/node_modules/govuk-frontend/govuk/i18n.js +0 -397
  297. data/node_modules/govuk-frontend/govuk/overrides/_typography.scss +0 -21
  298. data/node_modules/govuk-frontend/govuk/settings/_colours-organisations.scss +0 -146
  299. data/node_modules/govuk-frontend/govuk/settings/_colours-palette.scss +0 -120
  300. data/node_modules/govuk-frontend/govuk/settings/_compatibility.scss +0 -100
  301. data/node_modules/govuk-frontend/govuk/settings/_ie8.scss +0 -34
  302. data/node_modules/govuk-frontend/govuk/settings/_typography-font-families.scss +0 -32
  303. data/node_modules/govuk-frontend/govuk/settings/_typography-font.scss +0 -112
  304. data/node_modules/govuk-frontend/govuk/settings/_typography-responsive.scss +0 -195
  305. data/node_modules/govuk-frontend/govuk/tools/_compatibility.scss +0 -50
  306. data/node_modules/govuk-frontend/govuk/tools/_ie8.scss +0 -87
  307. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js +0 -274
  308. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js +0 -23
  309. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js +0 -36
  310. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js +0 -597
  311. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js +0 -58
  312. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js +0 -307
  313. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js +0 -33
  314. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js +0 -261
  315. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js +0 -261
  316. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js +0 -151
  317. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js +0 -512
  318. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js +0 -256
  319. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js +0 -96
  320. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js +0 -23
  321. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js +0 -30
  322. data/node_modules/govuk-frontend/govuk-prototype-kit/init.js +0 -8
  323. /data/node_modules/govuk-frontend/{govuk → dist/govuk}/assets/fonts/bold-affa96571d-v2.woff +0 -0
  324. /data/node_modules/govuk-frontend/{govuk → dist/govuk}/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  325. /data/node_modules/govuk-frontend/{govuk → dist/govuk}/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  326. /data/node_modules/govuk-frontend/{govuk → dist/govuk}/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  327. /data/{lib/source → node_modules/govuk-frontend/dist/govuk/assets/images}/favicon.ico +0 -0
@@ -1,2281 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
- typeof define === 'function' && define.amd ? define('GOVUKFrontend.CharacterCount', factory) :
4
- (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.CharacterCount = factory());
5
- }(this, (function () { 'use strict';
6
-
7
- // @ts-nocheck
8
- (function (undefined) {
9
-
10
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/matches/detect.js
11
- var detect = (
12
- 'document' in this && "matches" in document.documentElement
13
- );
14
-
15
- if (detect) return
16
-
17
- // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/matches/polyfill.js
18
- Element.prototype.matches = Element.prototype.webkitMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.mozMatchesSelector || function matches(selector) {
19
- var element = this;
20
- var elements = (element.document || element.ownerDocument).querySelectorAll(selector);
21
- var index = 0;
22
-
23
- while (elements[index] && elements[index] !== element) {
24
- ++index;
25
- }
26
-
27
- return !!elements[index];
28
- };
29
-
30
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
31
-
32
- // @ts-nocheck
33
-
34
- (function(undefined) {
35
-
36
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/closest/detect.js
37
- var detect = (
38
- 'document' in this && "closest" in document.documentElement
39
- );
40
-
41
- if (detect) return
42
-
43
- // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/closest/polyfill.js
44
- Element.prototype.closest = function closest(selector) {
45
- var node = this;
46
-
47
- while (node) {
48
- if (node.matches(selector)) return node;
49
- else node = 'SVGElement' in window && node instanceof SVGElement ? node.parentNode : node.parentElement;
50
- }
51
-
52
- return null;
53
- };
54
-
55
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
56
-
57
- /**
58
- * Returns the value of the given attribute closest to the given element (including itself)
59
- *
60
- * @deprecated Will be made private in v5.0
61
- * @param {Element} $element - The element to start walking the DOM tree up
62
- * @param {string} attributeName - The name of the attribute
63
- * @returns {string | null} Attribute value
64
- */
65
- function closestAttributeValue ($element, attributeName) {
66
- var $closestElementWithAttribute = $element.closest('[' + attributeName + ']');
67
- return $closestElementWithAttribute
68
- ? $closestElementWithAttribute.getAttribute(attributeName)
69
- : null
70
- }
71
-
72
- /**
73
- * Common helpers which do not require polyfill.
74
- *
75
- * IMPORTANT: If a helper require a polyfill, please isolate it in its own module
76
- * so that the polyfill can be properly tree-shaken and does not burden
77
- * the components that do not need that helper
78
- *
79
- * @module common/index
80
- */
81
-
82
- /**
83
- * Config flattening function
84
- *
85
- * Takes any number of objects, flattens them into namespaced key-value pairs,
86
- * (e.g. {'i18n.showSection': 'Show section'}) and combines them together, with
87
- * greatest priority on the LAST item passed in.
88
- *
89
- * @deprecated Will be made private in v5.0
90
- * @returns {Object<string, unknown>} A flattened object of key-value pairs.
91
- */
92
- function mergeConfigs (/* configObject1, configObject2, ...configObjects */) {
93
- /**
94
- * Function to take nested objects and flatten them to a dot-separated keyed
95
- * object. Doing this means we don't need to do any deep/recursive merging of
96
- * each of our objects, nor transform our dataset from a flat list into a
97
- * nested object.
98
- *
99
- * @param {Object<string, unknown>} configObject - Deeply nested object
100
- * @returns {Object<string, unknown>} Flattened object with dot-separated keys
101
- */
102
- var flattenObject = function (configObject) {
103
- // Prepare an empty return object
104
- /** @type {Object<string, unknown>} */
105
- var flattenedObject = {};
106
-
107
- /**
108
- * Our flattening function, this is called recursively for each level of
109
- * depth in the object. At each level we prepend the previous level names to
110
- * the key using `prefix`.
111
- *
112
- * @param {Partial<Object<string, unknown>>} obj - Object to flatten
113
- * @param {string} [prefix] - Optional dot-separated prefix
114
- */
115
- var flattenLoop = function (obj, prefix) {
116
- // Loop through keys...
117
- for (var key in obj) {
118
- // Check to see if this is a prototypical key/value,
119
- // if it is, skip it.
120
- if (!Object.prototype.hasOwnProperty.call(obj, key)) {
121
- continue
122
- }
123
- var value = obj[key];
124
- var prefixedKey = prefix ? prefix + '.' + key : key;
125
- if (typeof value === 'object') {
126
- // If the value is a nested object, recurse over that too
127
- flattenLoop(value, prefixedKey);
128
- } else {
129
- // Otherwise, add this value to our return object
130
- flattenedObject[prefixedKey] = value;
131
- }
132
- }
133
- };
134
-
135
- // Kick off the recursive loop
136
- flattenLoop(configObject);
137
- return flattenedObject
138
- };
139
-
140
- // Start with an empty object as our base
141
- /** @type {Object<string, unknown>} */
142
- var formattedConfigObject = {};
143
-
144
- // Loop through each of the remaining passed objects and push their keys
145
- // one-by-one into configObject. Any duplicate keys will override the existing
146
- // key with the new value.
147
- for (var i = 0; i < arguments.length; i++) {
148
- var obj = flattenObject(arguments[i]);
149
- for (var key in obj) {
150
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
151
- formattedConfigObject[key] = obj[key];
152
- }
153
- }
154
- }
155
-
156
- return formattedConfigObject
157
- }
158
-
159
- /**
160
- * Extracts keys starting with a particular namespace from a flattened config
161
- * object, removing the namespace in the process.
162
- *
163
- * @deprecated Will be made private in v5.0
164
- * @param {Object<string, unknown>} configObject - The object to extract key-value pairs from.
165
- * @param {string} namespace - The namespace to filter keys with.
166
- * @returns {Object<string, unknown>} Flattened object with dot-separated key namespace removed
167
- * @throws {Error} Config object required
168
- * @throws {Error} Namespace string required
169
- */
170
- function extractConfigByNamespace (configObject, namespace) {
171
- // Check we have what we need
172
- if (!configObject || typeof configObject !== 'object') {
173
- throw new Error('Provide a `configObject` of type "object".')
174
- }
175
-
176
- if (!namespace || typeof namespace !== 'string') {
177
- throw new Error('Provide a `namespace` of type "string" to filter the `configObject` by.')
178
- }
179
-
180
- /** @type {Object<string, unknown>} */
181
- var newObject = {};
182
-
183
- for (var key in configObject) {
184
- // Split the key into parts, using . as our namespace separator
185
- var keyParts = key.split('.');
186
- // Check if the first namespace matches the configured namespace
187
- if (Object.prototype.hasOwnProperty.call(configObject, key) && keyParts[0] === namespace) {
188
- // Remove the first item (the namespace) from the parts array,
189
- // but only if there is more than one part (we don't want blank keys!)
190
- if (keyParts.length > 1) {
191
- keyParts.shift();
192
- }
193
- // Join the remaining parts back together
194
- var newKey = keyParts.join('.');
195
- // Add them to our new object
196
- newObject[newKey] = configObject[key];
197
- }
198
- }
199
- return newObject
200
- }
201
-
202
- /**
203
- * @template {Node} ElementType
204
- * @callback nodeListIterator
205
- * @param {ElementType} value - The current node being iterated on
206
- * @param {number} index - The current index in the iteration
207
- * @param {NodeListOf<ElementType>} nodes - NodeList from querySelectorAll()
208
- * @returns {void}
209
- */
210
-
211
- // @ts-nocheck
212
- (function (undefined) {
213
-
214
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
215
- var detect = (
216
- // In IE8, defineProperty could only act on DOM elements, so full support
217
- // for the feature requires the ability to set a property on an arbitrary object
218
- 'defineProperty' in Object && (function() {
219
- try {
220
- var a = {};
221
- Object.defineProperty(a, 'test', {value:42});
222
- return true;
223
- } catch(e) {
224
- return false
225
- }
226
- }())
227
- );
228
-
229
- if (detect) return
230
-
231
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
232
- (function (nativeDefineProperty) {
233
-
234
- var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
235
- var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
236
- var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
237
-
238
- Object.defineProperty = function defineProperty(object, property, descriptor) {
239
-
240
- // Where native support exists, assume it
241
- if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
242
- return nativeDefineProperty(object, property, descriptor);
243
- }
244
-
245
- if (object === null || !(object instanceof Object || typeof object === 'object')) {
246
- throw new TypeError('Object.defineProperty called on non-object');
247
- }
248
-
249
- if (!(descriptor instanceof Object)) {
250
- throw new TypeError('Property description must be an object');
251
- }
252
-
253
- var propertyString = String(property);
254
- var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
255
- var getterType = 'get' in descriptor && typeof descriptor.get;
256
- var setterType = 'set' in descriptor && typeof descriptor.set;
257
-
258
- // handle descriptor.get
259
- if (getterType) {
260
- if (getterType !== 'function') {
261
- throw new TypeError('Getter must be a function');
262
- }
263
- if (!supportsAccessors) {
264
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
265
- }
266
- if (hasValueOrWritable) {
267
- throw new TypeError(ERR_VALUE_ACCESSORS);
268
- }
269
- Object.__defineGetter__.call(object, propertyString, descriptor.get);
270
- } else {
271
- object[propertyString] = descriptor.value;
272
- }
273
-
274
- // handle descriptor.set
275
- if (setterType) {
276
- if (setterType !== 'function') {
277
- throw new TypeError('Setter must be a function');
278
- }
279
- if (!supportsAccessors) {
280
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
281
- }
282
- if (hasValueOrWritable) {
283
- throw new TypeError(ERR_VALUE_ACCESSORS);
284
- }
285
- Object.__defineSetter__.call(object, propertyString, descriptor.set);
286
- }
287
-
288
- // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
289
- if ('value' in descriptor) {
290
- object[propertyString] = descriptor.value;
291
- }
292
-
293
- return object;
294
- };
295
- }(Object.defineProperty));
296
- })
297
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
298
-
299
- // @ts-nocheck
300
- (function (undefined) {
301
-
302
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
303
- var detect = ("Document" in this);
304
-
305
- if (detect) return
306
-
307
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
308
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
309
-
310
- if (this.HTMLDocument) { // IE8
311
-
312
- // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
313
- this.Document = this.HTMLDocument;
314
-
315
- } else {
316
-
317
- // 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.
318
- this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
319
- this.Document.prototype = document;
320
- }
321
- }
322
-
323
-
324
- })
325
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
326
-
327
- // @ts-nocheck
328
-
329
- (function(undefined) {
330
-
331
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
332
- var detect = ('Element' in this && 'HTMLElement' in this);
333
-
334
- if (detect) return
335
-
336
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
337
- (function () {
338
-
339
- // IE8
340
- if (window.Element && !window.HTMLElement) {
341
- window.HTMLElement = window.Element;
342
- return;
343
- }
344
-
345
- // create Element constructor
346
- window.Element = window.HTMLElement = new Function('return function Element() {}')();
347
-
348
- // generate sandboxed iframe
349
- var vbody = document.appendChild(document.createElement('body'));
350
- var frame = vbody.appendChild(document.createElement('iframe'));
351
-
352
- // use sandboxed iframe to replicate Element functionality
353
- var frameDocument = frame.contentWindow.document;
354
- var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
355
- var cache = {};
356
-
357
- // polyfill Element.prototype on an element
358
- var shiv = function (element, deep) {
359
- var
360
- childNodes = element.childNodes || [],
361
- index = -1,
362
- key, value, childNode;
363
-
364
- if (element.nodeType === 1 && element.constructor !== Element) {
365
- element.constructor = Element;
366
-
367
- for (key in cache) {
368
- value = cache[key];
369
- element[key] = value;
370
- }
371
- }
372
-
373
- while (childNode = deep && childNodes[++index]) {
374
- shiv(childNode, deep);
375
- }
376
-
377
- return element;
378
- };
379
-
380
- var elements = document.getElementsByTagName('*');
381
- var nativeCreateElement = document.createElement;
382
- var interval;
383
- var loopLimit = 100;
384
-
385
- prototype.attachEvent('onpropertychange', function (event) {
386
- var
387
- propertyName = event.propertyName,
388
- nonValue = !cache.hasOwnProperty(propertyName),
389
- newValue = prototype[propertyName],
390
- oldValue = cache[propertyName],
391
- index = -1,
392
- element;
393
-
394
- while (element = elements[++index]) {
395
- if (element.nodeType === 1) {
396
- if (nonValue || element[propertyName] === oldValue) {
397
- element[propertyName] = newValue;
398
- }
399
- }
400
- }
401
-
402
- cache[propertyName] = newValue;
403
- });
404
-
405
- prototype.constructor = Element;
406
-
407
- if (!prototype.hasAttribute) {
408
- // <Element>.hasAttribute
409
- prototype.hasAttribute = function hasAttribute(name) {
410
- return this.getAttribute(name) !== null;
411
- };
412
- }
413
-
414
- // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
415
- function bodyCheck() {
416
- if (!(loopLimit--)) clearTimeout(interval);
417
- if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
418
- shiv(document, true);
419
- if (interval && document.body.prototype) clearTimeout(interval);
420
- return (!!document.body.prototype);
421
- }
422
- return false;
423
- }
424
- if (!bodyCheck()) {
425
- document.onreadystatechange = bodyCheck;
426
- interval = setInterval(bodyCheck, 25);
427
- }
428
-
429
- // Apply to any new elements created after load
430
- document.createElement = function createElement(nodeName) {
431
- var element = nativeCreateElement(String(nodeName).toLowerCase());
432
- return shiv(element);
433
- };
434
-
435
- // remove sandboxed iframe
436
- document.removeChild(vbody);
437
- }());
438
-
439
- })
440
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
441
-
442
- // @ts-nocheck
443
-
444
- (function(undefined) {
445
-
446
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
447
- var detect = (function(){
448
- if (!document.documentElement.dataset) {
449
- return false;
450
- }
451
- var el = document.createElement('div');
452
- el.setAttribute("data-a-b", "c");
453
- return el.dataset && el.dataset.aB == "c";
454
- }());
455
-
456
- if (detect) return
457
-
458
- // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
459
- Object.defineProperty(Element.prototype, 'dataset', {
460
- get: function() {
461
- var element = this;
462
- var attributes = this.attributes;
463
- var map = {};
464
-
465
- for (var i = 0; i < attributes.length; i++) {
466
- var attribute = attributes[i];
467
-
468
- // This regex has been edited from the original polyfill, to add
469
- // support for period (.) separators in data-* attribute names. These
470
- // are allowed in the HTML spec, but were not covered by the original
471
- // polyfill's regex. We use periods in our i18n implementation.
472
- if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
473
- var name = attribute.name;
474
- var value = attribute.value;
475
-
476
- var propName = name.substr(5).replace(/-./g, function (prop) {
477
- return prop.charAt(1).toUpperCase();
478
- });
479
-
480
- // If this browser supports __defineGetter__ and __defineSetter__,
481
- // continue using defineProperty. If not (like IE 8 and below), we use
482
- // a hacky fallback which at least gives an object in the right format
483
- if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
484
- Object.defineProperty(map, propName, {
485
- enumerable: true,
486
- get: function() {
487
- return this.value;
488
- }.bind({value: value || ''}),
489
- set: function setter(name, value) {
490
- if (typeof value !== 'undefined') {
491
- this.setAttribute(name, value);
492
- } else {
493
- this.removeAttribute(name);
494
- }
495
- }.bind(element, name)
496
- });
497
- } else {
498
- map[propName] = value;
499
- }
500
-
501
- }
502
- }
503
-
504
- return map;
505
- }
506
- });
507
-
508
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
509
-
510
- // @ts-nocheck
511
- (function (undefined) {
512
-
513
- // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
514
- var detect = ('trim' in String.prototype);
515
-
516
- if (detect) return
517
-
518
- // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
519
- String.prototype.trim = function () {
520
- return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
521
- };
522
-
523
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
524
-
525
- /* eslint-disable es-x/no-string-prototype-trim -- Polyfill imported */
526
-
527
- /**
528
- * Normalise string
529
- *
530
- * 'If it looks like a duck, and it quacks like a duck…' 🦆
531
- *
532
- * If the passed value looks like a boolean or a number, convert it to a boolean
533
- * or number.
534
- *
535
- * Designed to be used to convert config passed via data attributes (which are
536
- * always strings) into something sensible.
537
- *
538
- * @deprecated Will be made private in v5.0
539
- * @param {string} value - The value to normalise
540
- * @returns {string | boolean | number | undefined} Normalised data
541
- */
542
- function normaliseString (value) {
543
- if (typeof value !== 'string') {
544
- return value
545
- }
546
-
547
- var trimmedValue = value.trim();
548
-
549
- if (trimmedValue === 'true') {
550
- return true
551
- }
552
-
553
- if (trimmedValue === 'false') {
554
- return false
555
- }
556
-
557
- // Empty / whitespace-only strings are considered finite so we need to check
558
- // the length of the trimmed string as well
559
- if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
560
- return Number(trimmedValue)
561
- }
562
-
563
- return value
564
- }
565
-
566
- /**
567
- * Normalise dataset
568
- *
569
- * Loop over an object and normalise each value using normaliseData function
570
- *
571
- * @deprecated Will be made private in v5.0
572
- * @param {DOMStringMap} dataset - HTML element dataset
573
- * @returns {Object<string, unknown>} Normalised dataset
574
- */
575
- function normaliseDataset (dataset) {
576
- /** @type {Object<string, unknown>} */
577
- var out = {};
578
-
579
- for (var key in dataset) {
580
- out[key] = normaliseString(dataset[key]);
581
- }
582
-
583
- return out
584
- }
585
-
586
- /**
587
- * Internal support for selecting messages to render, with placeholder
588
- * interpolation and locale-aware number formatting and pluralisation
589
- *
590
- * @class
591
- * @private
592
- * @param {Object<string, unknown>} translations - Key-value pairs of the translation strings to use.
593
- * @param {object} [config] - Configuration options for the function.
594
- * @param {string} [config.locale] - An overriding locale for the PluralRules functionality.
595
- */
596
- function I18n (translations, config) {
597
- // Make list of translations available throughout function
598
- this.translations = translations || {};
599
-
600
- // The locale to use for PluralRules and NumberFormat
601
- this.locale = (config && config.locale) || document.documentElement.lang || 'en';
602
- }
603
-
604
- /**
605
- * The most used function - takes the key for a given piece of UI text and
606
- * returns the appropriate string.
607
- *
608
- * @param {string} lookupKey - The lookup key of the string to use.
609
- * @param {Object<string, unknown>} [options] - Any options passed with the translation string, e.g: for string interpolation.
610
- * @returns {string} The appropriate translation string.
611
- * @throws {Error} Lookup key required
612
- * @throws {Error} Options required for `${}` placeholders
613
- */
614
- I18n.prototype.t = function (lookupKey, options) {
615
- if (!lookupKey) {
616
- // Print a console error if no lookup key has been provided
617
- throw new Error('i18n: lookup key missing')
618
- }
619
-
620
- // If the `count` option is set, determine which plural suffix is needed and
621
- // change the lookupKey to match. We check to see if it's numeric instead of
622
- // falsy, as this could legitimately be 0.
623
- if (options && typeof options.count === 'number') {
624
- // Get the plural suffix
625
- lookupKey = lookupKey + '.' + this.getPluralSuffix(lookupKey, options.count);
626
- }
627
-
628
- // Fetch the translation string for that lookup key
629
- var translationString = this.translations[lookupKey];
630
-
631
- if (typeof translationString === 'string') {
632
- // Check for ${} placeholders in the translation string
633
- if (translationString.match(/%{(.\S+)}/)) {
634
- if (!options) {
635
- throw new Error('i18n: cannot replace placeholders in string if no option data provided')
636
- }
637
-
638
- return this.replacePlaceholders(translationString, options)
639
- } else {
640
- return translationString
641
- }
642
- } else {
643
- // If the key wasn't found in our translations object,
644
- // return the lookup key itself as the fallback
645
- return lookupKey
646
- }
647
- };
648
-
649
- /**
650
- * Takes a translation string with placeholders, and replaces the placeholders
651
- * with the provided data
652
- *
653
- * @param {string} translationString - The translation string
654
- * @param {Object<string, unknown>} options - Any options passed with the translation string, e.g: for string interpolation.
655
- * @returns {string} The translation string to output, with ${} placeholders replaced
656
- */
657
- I18n.prototype.replacePlaceholders = function (translationString, options) {
658
- /** @type {Intl.NumberFormat | undefined} */
659
- var formatter;
660
-
661
- if (this.hasIntlNumberFormatSupport()) {
662
- formatter = new Intl.NumberFormat(this.locale);
663
- }
664
-
665
- return translationString.replace(
666
- /%{(.\S+)}/g,
667
-
668
- /**
669
- * Replace translation string placeholders
670
- *
671
- * @param {string} placeholderWithBraces - Placeholder with braces
672
- * @param {string} placeholderKey - Placeholder key
673
- * @returns {string} Placeholder value
674
- */
675
- function (placeholderWithBraces, placeholderKey) {
676
- if (Object.prototype.hasOwnProperty.call(options, placeholderKey)) {
677
- var placeholderValue = options[placeholderKey];
678
-
679
- // If a user has passed `false` as the value for the placeholder
680
- // treat it as though the value should not be displayed
681
- if (placeholderValue === false || (
682
- typeof placeholderValue !== 'number' &&
683
- typeof placeholderValue !== 'string')
684
- ) {
685
- return ''
686
- }
687
-
688
- // If the placeholder's value is a number, localise the number formatting
689
- if (typeof placeholderValue === 'number') {
690
- return formatter ? formatter.format(placeholderValue) : placeholderValue.toString()
691
- }
692
-
693
- return placeholderValue
694
- } else {
695
- throw new Error('i18n: no data found to replace ' + placeholderWithBraces + ' placeholder in string')
696
- }
697
- })
698
- };
699
-
700
- /**
701
- * Check to see if the browser supports Intl and Intl.PluralRules.
702
- *
703
- * It requires all conditions to be met in order to be supported:
704
- * - The browser supports the Intl class (true in IE11)
705
- * - The implementation of Intl supports PluralRules (NOT true in IE11)
706
- * - The browser/OS has plural rules for the current locale (browser dependent)
707
- *
708
- * @returns {boolean} Returns true if all conditions are met. Returns false otherwise.
709
- */
710
- I18n.prototype.hasIntlPluralRulesSupport = function () {
711
- return Boolean(window.Intl && ('PluralRules' in window.Intl && Intl.PluralRules.supportedLocalesOf(this.locale).length))
712
- };
713
-
714
- /**
715
- * Check to see if the browser supports Intl and Intl.NumberFormat.
716
- *
717
- * It requires all conditions to be met in order to be supported:
718
- * - The browser supports the Intl class (true in IE11)
719
- * - The implementation of Intl supports NumberFormat (also true in IE11)
720
- * - The browser/OS has number formatting rules for the current locale (browser dependent)
721
- *
722
- * @returns {boolean} Returns true if all conditions are met. Returns false otherwise.
723
- */
724
- I18n.prototype.hasIntlNumberFormatSupport = function () {
725
- return Boolean(window.Intl && ('NumberFormat' in window.Intl && Intl.NumberFormat.supportedLocalesOf(this.locale).length))
726
- };
727
-
728
- /**
729
- * Get the appropriate suffix for the plural form.
730
- *
731
- * Uses Intl.PluralRules (or our own fallback implementation) to get the
732
- * 'preferred' form to use for the given count.
733
- *
734
- * Checks that a translation has been provided for that plural form – if it
735
- * hasn't, it'll fall back to the 'other' plural form (unless that doesn't exist
736
- * either, in which case an error will be thrown)
737
- *
738
- * @param {string} lookupKey - The lookup key of the string to use.
739
- * @param {number} count - Number used to determine which pluralisation to use.
740
- * @returns {PluralRule} The suffix associated with the correct pluralisation for this locale.
741
- * @throws {Error} Plural form `.other` required when preferred plural form is missing
742
- */
743
- I18n.prototype.getPluralSuffix = function (lookupKey, count) {
744
- // Validate that the number is actually a number.
745
- //
746
- // Number(count) will turn anything that can't be converted to a Number type
747
- // into 'NaN'. isFinite filters out NaN, as it isn't a finite number.
748
- count = Number(count);
749
- if (!isFinite(count)) { return 'other' }
750
-
751
- var preferredForm;
752
-
753
- // Check to verify that all the requirements for Intl.PluralRules are met.
754
- // If so, we can use that instead of our custom implementation. Otherwise,
755
- // use the hardcoded fallback.
756
- if (this.hasIntlPluralRulesSupport()) {
757
- preferredForm = new Intl.PluralRules(this.locale).select(count);
758
- } else {
759
- preferredForm = this.selectPluralFormUsingFallbackRules(count);
760
- }
761
-
762
- // Use the correct plural form if provided
763
- if (lookupKey + '.' + preferredForm in this.translations) {
764
- return preferredForm
765
- // Fall back to `other` if the plural form is missing, but log a warning
766
- // to the console
767
- } else if (lookupKey + '.other' in this.translations) {
768
- if (console && 'warn' in console) {
769
- console.warn('i18n: Missing plural form ".' + preferredForm + '" for "' +
770
- this.locale + '" locale. Falling back to ".other".');
771
- }
772
-
773
- return 'other'
774
- // If the required `other` plural form is missing, all we can do is error
775
- } else {
776
- throw new Error(
777
- 'i18n: Plural form ".other" is required for "' + this.locale + '" locale'
778
- )
779
- }
780
- };
781
-
782
- /**
783
- * Get the plural form using our fallback implementation
784
- *
785
- * This is split out into a separate function to make it easier to test the
786
- * fallback behaviour in an environment where Intl.PluralRules exists.
787
- *
788
- * @param {number} count - Number used to determine which pluralisation to use.
789
- * @returns {PluralRule} The pluralisation form for count in this locale.
790
- */
791
- I18n.prototype.selectPluralFormUsingFallbackRules = function (count) {
792
- // Currently our custom code can only handle positive integers, so let's
793
- // make sure our number is one of those.
794
- count = Math.abs(Math.floor(count));
795
-
796
- var ruleset = this.getPluralRulesForLocale();
797
-
798
- if (ruleset) {
799
- return I18n.pluralRules[ruleset](count)
800
- }
801
-
802
- return 'other'
803
- };
804
-
805
- /**
806
- * Work out which pluralisation rules to use for the current locale
807
- *
808
- * The locale may include a regional indicator (such as en-GB), but we don't
809
- * usually care about this part, as pluralisation rules are usually the same
810
- * regardless of region. There are exceptions, however, (e.g. Portuguese) so
811
- * this searches by both the full and shortened locale codes, just to be sure.
812
- *
813
- * @returns {string | undefined} The name of the pluralisation rule to use (a key for one
814
- * of the functions in this.pluralRules)
815
- */
816
- I18n.prototype.getPluralRulesForLocale = function () {
817
- var locale = this.locale;
818
- var localeShort = locale.split('-')[0];
819
-
820
- // Look through the plural rules map to find which `pluralRule` is
821
- // appropriate for our current `locale`.
822
- for (var pluralRule in I18n.pluralRulesMap) {
823
- if (Object.prototype.hasOwnProperty.call(I18n.pluralRulesMap, pluralRule)) {
824
- var languages = I18n.pluralRulesMap[pluralRule];
825
- for (var i = 0; i < languages.length; i++) {
826
- if (languages[i] === locale || languages[i] === localeShort) {
827
- return pluralRule
828
- }
829
- }
830
- }
831
- }
832
- };
833
-
834
- /**
835
- * Map of plural rules to languages where those rules apply.
836
- *
837
- * Note: These groups are named for the most dominant or recognisable language
838
- * that uses each system. The groupings do not imply that the languages are
839
- * related to one another. Many languages have evolved the same systems
840
- * independently of one another.
841
- *
842
- * Code to support more languages can be found in the i18n spike:
843
- * {@link https://github.com/alphagov/govuk-frontend/blob/spike-i18n-support/src/govuk/i18n.mjs}
844
- *
845
- * Languages currently supported:
846
- *
847
- * Arabic: Arabic (ar)
848
- * Chinese: Burmese (my), Chinese (zh), Indonesian (id), Japanese (ja),
849
- * Javanese (jv), Korean (ko), Malay (ms), Thai (th), Vietnamese (vi)
850
- * French: Armenian (hy), Bangla (bn), French (fr), Gujarati (gu), Hindi (hi),
851
- * Persian Farsi (fa), Punjabi (pa), Zulu (zu)
852
- * German: Afrikaans (af), Albanian (sq), Azerbaijani (az), Basque (eu),
853
- * Bulgarian (bg), Catalan (ca), Danish (da), Dutch (nl), English (en),
854
- * Estonian (et), Finnish (fi), Georgian (ka), German (de), Greek (el),
855
- * Hungarian (hu), Luxembourgish (lb), Norwegian (no), Somali (so),
856
- * Swahili (sw), Swedish (sv), Tamil (ta), Telugu (te), Turkish (tr),
857
- * Urdu (ur)
858
- * Irish: Irish Gaelic (ga)
859
- * Russian: Russian (ru), Ukrainian (uk)
860
- * Scottish: Scottish Gaelic (gd)
861
- * Spanish: European Portuguese (pt-PT), Italian (it), Spanish (es)
862
- * Welsh: Welsh (cy)
863
- *
864
- * @type {Object<string, string[]>}
865
- */
866
- I18n.pluralRulesMap = {
867
- arabic: ['ar'],
868
- chinese: ['my', 'zh', 'id', 'ja', 'jv', 'ko', 'ms', 'th', 'vi'],
869
- french: ['hy', 'bn', 'fr', 'gu', 'hi', 'fa', 'pa', 'zu'],
870
- german: [
871
- 'af', 'sq', 'az', 'eu', 'bg', 'ca', 'da', 'nl', 'en', 'et', 'fi', 'ka',
872
- 'de', 'el', 'hu', 'lb', 'no', 'so', 'sw', 'sv', 'ta', 'te', 'tr', 'ur'
873
- ],
874
- irish: ['ga'],
875
- russian: ['ru', 'uk'],
876
- scottish: ['gd'],
877
- spanish: ['pt-PT', 'it', 'es'],
878
- welsh: ['cy']
879
- };
880
-
881
- /**
882
- * Different pluralisation rule sets
883
- *
884
- * Returns the appropriate suffix for the plural form associated with `n`.
885
- * Possible suffixes: 'zero', 'one', 'two', 'few', 'many', 'other' (the actual
886
- * meaning of each differs per locale). 'other' should always exist, even in
887
- * languages without plurals, such as Chinese.
888
- * {@link https://cldr.unicode.org/index/cldr-spec/plural-rules}
889
- *
890
- * The count must be a positive integer. Negative numbers and decimals aren't accounted for
891
- *
892
- * @type {Object<string, function(number): PluralRule>}
893
- */
894
- I18n.pluralRules = {
895
- /* eslint-disable jsdoc/require-jsdoc */
896
- arabic: function (n) {
897
- if (n === 0) { return 'zero' }
898
- if (n === 1) { return 'one' }
899
- if (n === 2) { return 'two' }
900
- if (n % 100 >= 3 && n % 100 <= 10) { return 'few' }
901
- if (n % 100 >= 11 && n % 100 <= 99) { return 'many' }
902
- return 'other'
903
- },
904
- chinese: function () {
905
- return 'other'
906
- },
907
- french: function (n) {
908
- return n === 0 || n === 1 ? 'one' : 'other'
909
- },
910
- german: function (n) {
911
- return n === 1 ? 'one' : 'other'
912
- },
913
- irish: function (n) {
914
- if (n === 1) { return 'one' }
915
- if (n === 2) { return 'two' }
916
- if (n >= 3 && n <= 6) { return 'few' }
917
- if (n >= 7 && n <= 10) { return 'many' }
918
- return 'other'
919
- },
920
- russian: function (n) {
921
- var lastTwo = n % 100;
922
- var last = lastTwo % 10;
923
- if (last === 1 && lastTwo !== 11) { return 'one' }
924
- if (last >= 2 && last <= 4 && !(lastTwo >= 12 && lastTwo <= 14)) { return 'few' }
925
- if (last === 0 || (last >= 5 && last <= 9) || (lastTwo >= 11 && lastTwo <= 14)) { return 'many' }
926
- // Note: The 'other' suffix is only used by decimal numbers in Russian.
927
- // We don't anticipate it being used, but it's here for consistency.
928
- return 'other'
929
- },
930
- scottish: function (n) {
931
- if (n === 1 || n === 11) { return 'one' }
932
- if (n === 2 || n === 12) { return 'two' }
933
- if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) { return 'few' }
934
- return 'other'
935
- },
936
- spanish: function (n) {
937
- if (n === 1) { return 'one' }
938
- if (n % 1000000 === 0 && n !== 0) { return 'many' }
939
- return 'other'
940
- },
941
- welsh: function (n) {
942
- if (n === 0) { return 'zero' }
943
- if (n === 1) { return 'one' }
944
- if (n === 2) { return 'two' }
945
- if (n === 3) { return 'few' }
946
- if (n === 6) { return 'many' }
947
- return 'other'
948
- }
949
- /* eslint-enable jsdoc/require-jsdoc */
950
- };
951
-
952
- /**
953
- * Plural rule category mnemonic tags
954
- *
955
- * @typedef {'zero' | 'one' | 'two' | 'few' | 'many' | 'other'} PluralRule
956
- */
957
-
958
- /**
959
- * Translated message by plural rule they correspond to.
960
- *
961
- * Allows to group pluralised messages under a single key when passing
962
- * translations to a component's constructor
963
- *
964
- * @typedef {object} TranslationPluralForms
965
- * @property {string} [other] - General plural form
966
- * @property {string} [zero] - Plural form used with 0
967
- * @property {string} [one] - Plural form used with 1
968
- * @property {string} [two] - Plural form used with 2
969
- * @property {string} [few] - Plural form used for a few
970
- * @property {string} [many] - Plural form used for many
971
- */
972
-
973
- // @ts-nocheck
974
- (function (undefined) {
975
-
976
- // Detection from https://github.com/Financial-Times/polyfill-library/blob/v3.111.0/polyfills/Date/now/detect.js
977
- var detect = ('Date' in self && 'now' in self.Date && 'getTime' in self.Date.prototype);
978
-
979
- if (detect) return
980
-
981
- // Polyfill from https://polyfill.io/v3/polyfill.js?version=3.111.0&features=Date.now&flags=always
982
- Date.now = function () {
983
- return new Date().getTime();
984
- };
985
-
986
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
987
-
988
- // @ts-nocheck
989
- (function (undefined) {
990
-
991
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/master/packages/polyfill-library/polyfills/DOMTokenList/detect.js
992
- var detect = (
993
- 'DOMTokenList' in this && (function (x) {
994
- return 'classList' in x ? !x.classList.toggle('x', false) && !x.className : true;
995
- })(document.createElement('x'))
996
- );
997
-
998
- if (detect) return
999
-
1000
- // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/master/packages/polyfill-library/polyfills/DOMTokenList/polyfill.js
1001
- (function (global) {
1002
- var nativeImpl = "DOMTokenList" in global && global.DOMTokenList;
1003
-
1004
- if (
1005
- !nativeImpl ||
1006
- (
1007
- !!document.createElementNS &&
1008
- !!document.createElementNS('http://www.w3.org/2000/svg', 'svg') &&
1009
- !(document.createElementNS("http://www.w3.org/2000/svg", "svg").classList instanceof DOMTokenList)
1010
- )
1011
- ) {
1012
- global.DOMTokenList = (function() { // eslint-disable-line no-unused-vars
1013
- var dpSupport = true;
1014
- var defineGetter = function (object, name, fn, configurable) {
1015
- if (Object.defineProperty)
1016
- Object.defineProperty(object, name, {
1017
- configurable: false === dpSupport ? true : !!configurable,
1018
- get: fn
1019
- });
1020
-
1021
- else object.__defineGetter__(name, fn);
1022
- };
1023
-
1024
- /** Ensure the browser allows Object.defineProperty to be used on native JavaScript objects. */
1025
- try {
1026
- defineGetter({}, "support");
1027
- }
1028
- catch (e) {
1029
- dpSupport = false;
1030
- }
1031
-
1032
-
1033
- var _DOMTokenList = function (el, prop) {
1034
- var that = this;
1035
- var tokens = [];
1036
- var tokenMap = {};
1037
- var length = 0;
1038
- var maxLength = 0;
1039
- var addIndexGetter = function (i) {
1040
- defineGetter(that, i, function () {
1041
- preop();
1042
- return tokens[i];
1043
- }, false);
1044
-
1045
- };
1046
- var reindex = function () {
1047
-
1048
- /** Define getter functions for array-like access to the tokenList's contents. */
1049
- if (length >= maxLength)
1050
- for (; maxLength < length; ++maxLength) {
1051
- addIndexGetter(maxLength);
1052
- }
1053
- };
1054
-
1055
- /** Helper function called at the start of each class method. Internal use only. */
1056
- var preop = function () {
1057
- var error;
1058
- var i;
1059
- var args = arguments;
1060
- var rSpace = /\s+/;
1061
-
1062
- /** Validate the token/s passed to an instance method, if any. */
1063
- if (args.length)
1064
- for (i = 0; i < args.length; ++i)
1065
- if (rSpace.test(args[i])) {
1066
- error = new SyntaxError('String "' + args[i] + '" ' + "contains" + ' an invalid character');
1067
- error.code = 5;
1068
- error.name = "InvalidCharacterError";
1069
- throw error;
1070
- }
1071
-
1072
-
1073
- /** Split the new value apart by whitespace*/
1074
- if (typeof el[prop] === "object") {
1075
- tokens = ("" + el[prop].baseVal).replace(/^\s+|\s+$/g, "").split(rSpace);
1076
- } else {
1077
- tokens = ("" + el[prop]).replace(/^\s+|\s+$/g, "").split(rSpace);
1078
- }
1079
-
1080
- /** Avoid treating blank strings as single-item token lists */
1081
- if ("" === tokens[0]) tokens = [];
1082
-
1083
- /** Repopulate the internal token lists */
1084
- tokenMap = {};
1085
- for (i = 0; i < tokens.length; ++i)
1086
- tokenMap[tokens[i]] = true;
1087
- length = tokens.length;
1088
- reindex();
1089
- };
1090
-
1091
- /** Populate our internal token list if the targeted attribute of the subject element isn't empty. */
1092
- preop();
1093
-
1094
- /** Return the number of tokens in the underlying string. Read-only. */
1095
- defineGetter(that, "length", function () {
1096
- preop();
1097
- return length;
1098
- });
1099
-
1100
- /** Override the default toString/toLocaleString methods to return a space-delimited list of tokens when typecast. */
1101
- that.toLocaleString =
1102
- that.toString = function () {
1103
- preop();
1104
- return tokens.join(" ");
1105
- };
1106
-
1107
- that.item = function (idx) {
1108
- preop();
1109
- return tokens[idx];
1110
- };
1111
-
1112
- that.contains = function (token) {
1113
- preop();
1114
- return !!tokenMap[token];
1115
- };
1116
-
1117
- that.add = function () {
1118
- preop.apply(that, args = arguments);
1119
-
1120
- for (var args, token, i = 0, l = args.length; i < l; ++i) {
1121
- token = args[i];
1122
- if (!tokenMap[token]) {
1123
- tokens.push(token);
1124
- tokenMap[token] = true;
1125
- }
1126
- }
1127
-
1128
- /** Update the targeted attribute of the attached element if the token list's changed. */
1129
- if (length !== tokens.length) {
1130
- length = tokens.length >>> 0;
1131
- if (typeof el[prop] === "object") {
1132
- el[prop].baseVal = tokens.join(" ");
1133
- } else {
1134
- el[prop] = tokens.join(" ");
1135
- }
1136
- reindex();
1137
- }
1138
- };
1139
-
1140
- that.remove = function () {
1141
- preop.apply(that, args = arguments);
1142
-
1143
- /** Build a hash of token names to compare against when recollecting our token list. */
1144
- for (var args, ignore = {}, i = 0, t = []; i < args.length; ++i) {
1145
- ignore[args[i]] = true;
1146
- delete tokenMap[args[i]];
1147
- }
1148
-
1149
- /** Run through our tokens list and reassign only those that aren't defined in the hash declared above. */
1150
- for (i = 0; i < tokens.length; ++i)
1151
- if (!ignore[tokens[i]]) t.push(tokens[i]);
1152
-
1153
- tokens = t;
1154
- length = t.length >>> 0;
1155
-
1156
- /** Update the targeted attribute of the attached element. */
1157
- if (typeof el[prop] === "object") {
1158
- el[prop].baseVal = tokens.join(" ");
1159
- } else {
1160
- el[prop] = tokens.join(" ");
1161
- }
1162
- reindex();
1163
- };
1164
-
1165
- that.toggle = function (token, force) {
1166
- preop.apply(that, [token]);
1167
-
1168
- /** Token state's being forced. */
1169
- if (undefined !== force) {
1170
- if (force) {
1171
- that.add(token);
1172
- return true;
1173
- } else {
1174
- that.remove(token);
1175
- return false;
1176
- }
1177
- }
1178
-
1179
- /** Token already exists in tokenList. Remove it, and return FALSE. */
1180
- if (tokenMap[token]) {
1181
- that.remove(token);
1182
- return false;
1183
- }
1184
-
1185
- /** Otherwise, add the token and return TRUE. */
1186
- that.add(token);
1187
- return true;
1188
- };
1189
-
1190
- return that;
1191
- };
1192
-
1193
- return _DOMTokenList;
1194
- }());
1195
- }
1196
-
1197
- // Add second argument to native DOMTokenList.toggle() if necessary
1198
- (function () {
1199
- var e = document.createElement('span');
1200
- if (!('classList' in e)) return;
1201
- e.classList.toggle('x', false);
1202
- if (!e.classList.contains('x')) return;
1203
- e.classList.constructor.prototype.toggle = function toggle(token /*, force*/) {
1204
- var force = arguments[1];
1205
- if (force === undefined) {
1206
- var add = !this.contains(token);
1207
- this[add ? 'add' : 'remove'](token);
1208
- return add;
1209
- }
1210
- force = !!force;
1211
- this[force ? 'add' : 'remove'](token);
1212
- return force;
1213
- };
1214
- }());
1215
-
1216
- // Add multiple arguments to native DOMTokenList.add() if necessary
1217
- (function () {
1218
- var e = document.createElement('span');
1219
- if (!('classList' in e)) return;
1220
- e.classList.add('a', 'b');
1221
- if (e.classList.contains('b')) return;
1222
- var native = e.classList.constructor.prototype.add;
1223
- e.classList.constructor.prototype.add = function () {
1224
- var args = arguments;
1225
- var l = arguments.length;
1226
- for (var i = 0; i < l; i++) {
1227
- native.call(this, args[i]);
1228
- }
1229
- };
1230
- }());
1231
-
1232
- // Add multiple arguments to native DOMTokenList.remove() if necessary
1233
- (function () {
1234
- var e = document.createElement('span');
1235
- if (!('classList' in e)) return;
1236
- e.classList.add('a');
1237
- e.classList.add('b');
1238
- e.classList.remove('a', 'b');
1239
- if (!e.classList.contains('b')) return;
1240
- var native = e.classList.constructor.prototype.remove;
1241
- e.classList.constructor.prototype.remove = function () {
1242
- var args = arguments;
1243
- var l = arguments.length;
1244
- for (var i = 0; i < l; i++) {
1245
- native.call(this, args[i]);
1246
- }
1247
- };
1248
- }());
1249
-
1250
- }(this));
1251
-
1252
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
1253
-
1254
- // @ts-nocheck
1255
-
1256
- (function(undefined) {
1257
-
1258
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/8717a9e04ac7aff99b4980fbedead98036b0929a/packages/polyfill-library/polyfills/Element/prototype/classList/detect.js
1259
- var detect = (
1260
- 'document' in this && "classList" in document.documentElement && 'Element' in this && 'classList' in Element.prototype && (function () {
1261
- var e = document.createElement('span');
1262
- e.classList.add('a', 'b');
1263
- return e.classList.contains('b');
1264
- }())
1265
- );
1266
-
1267
- if (detect) return
1268
-
1269
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.classList&flags=always
1270
- (function (global) {
1271
- var dpSupport = true;
1272
- var defineGetter = function (object, name, fn, configurable) {
1273
- if (Object.defineProperty)
1274
- Object.defineProperty(object, name, {
1275
- configurable: false === dpSupport ? true : !!configurable,
1276
- get: fn
1277
- });
1278
-
1279
- else object.__defineGetter__(name, fn);
1280
- };
1281
- /** Ensure the browser allows Object.defineProperty to be used on native JavaScript objects. */
1282
- try {
1283
- defineGetter({}, "support");
1284
- }
1285
- catch (e) {
1286
- dpSupport = false;
1287
- }
1288
- /** Polyfills a property with a DOMTokenList */
1289
- var addProp = function (o, name, attr) {
1290
-
1291
- defineGetter(o.prototype, name, function () {
1292
- var tokenList;
1293
-
1294
- var THIS = this,
1295
-
1296
- /** Prevent this from firing twice for some reason. What the hell, IE. */
1297
- gibberishProperty = "__defineGetter__" + "DEFINE_PROPERTY" + name;
1298
- if(THIS[gibberishProperty]) return tokenList;
1299
- THIS[gibberishProperty] = true;
1300
-
1301
- /**
1302
- * IE8 can't define properties on native JavaScript objects, so we'll use a dumb hack instead.
1303
- *
1304
- * What this is doing is creating a dummy element ("reflection") inside a detached phantom node ("mirror")
1305
- * that serves as the target of Object.defineProperty instead. While we could simply use the subject HTML
1306
- * element instead, this would conflict with element types which use indexed properties (such as forms and
1307
- * select lists).
1308
- */
1309
- if (false === dpSupport) {
1310
-
1311
- var visage;
1312
- var mirror = addProp.mirror || document.createElement("div");
1313
- var reflections = mirror.childNodes;
1314
- var l = reflections.length;
1315
-
1316
- for (var i = 0; i < l; ++i)
1317
- if (reflections[i]._R === THIS) {
1318
- visage = reflections[i];
1319
- break;
1320
- }
1321
-
1322
- /** Couldn't find an element's reflection inside the mirror. Materialise one. */
1323
- visage || (visage = mirror.appendChild(document.createElement("div")));
1324
-
1325
- tokenList = DOMTokenList.call(visage, THIS, attr);
1326
- } else tokenList = new DOMTokenList(THIS, attr);
1327
-
1328
- defineGetter(THIS, name, function () {
1329
- return tokenList;
1330
- });
1331
- delete THIS[gibberishProperty];
1332
-
1333
- return tokenList;
1334
- }, true);
1335
- };
1336
-
1337
- addProp(global.Element, "classList", "className");
1338
- addProp(global.HTMLElement, "classList", "className");
1339
- addProp(global.HTMLLinkElement, "relList", "rel");
1340
- addProp(global.HTMLAnchorElement, "relList", "rel");
1341
- addProp(global.HTMLAreaElement, "relList", "rel");
1342
- }(this));
1343
-
1344
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
1345
-
1346
- // @ts-nocheck
1347
- (function (undefined) {
1348
-
1349
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
1350
- var detect = ('Window' in this);
1351
-
1352
- if (detect) return
1353
-
1354
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
1355
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
1356
- (function (global) {
1357
- if (global.constructor) {
1358
- global.Window = global.constructor;
1359
- } else {
1360
- (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
1361
- }
1362
- }(this));
1363
- }
1364
-
1365
- })
1366
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
1367
-
1368
- // @ts-nocheck
1369
-
1370
- (function(undefined) {
1371
-
1372
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
1373
- var detect = (
1374
- (function(global) {
1375
-
1376
- if (!('Event' in global)) return false;
1377
- if (typeof global.Event === 'function') return true;
1378
-
1379
- try {
1380
-
1381
- // In IE 9-11, the Event object exists but cannot be instantiated
1382
- new Event('click');
1383
- return true;
1384
- } catch(e) {
1385
- return false;
1386
- }
1387
- }(this))
1388
- );
1389
-
1390
- if (detect) return
1391
-
1392
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
1393
- (function () {
1394
- var unlistenableWindowEvents = {
1395
- click: 1,
1396
- dblclick: 1,
1397
- keyup: 1,
1398
- keypress: 1,
1399
- keydown: 1,
1400
- mousedown: 1,
1401
- mouseup: 1,
1402
- mousemove: 1,
1403
- mouseover: 1,
1404
- mouseenter: 1,
1405
- mouseleave: 1,
1406
- mouseout: 1,
1407
- storage: 1,
1408
- storagecommit: 1,
1409
- textinput: 1
1410
- };
1411
-
1412
- // This polyfill depends on availability of `document` so will not run in a worker
1413
- // However, we asssume there are no browsers with worker support that lack proper
1414
- // support for `Event` within the worker
1415
- if (typeof document === 'undefined' || typeof window === 'undefined') return;
1416
-
1417
- function indexOf(array, element) {
1418
- var
1419
- index = -1,
1420
- length = array.length;
1421
-
1422
- while (++index < length) {
1423
- if (index in array && array[index] === element) {
1424
- return index;
1425
- }
1426
- }
1427
-
1428
- return -1;
1429
- }
1430
-
1431
- var existingProto = (window.Event && window.Event.prototype) || null;
1432
- window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
1433
- if (!type) {
1434
- throw new Error('Not enough arguments');
1435
- }
1436
-
1437
- var event;
1438
- // Shortcut if browser supports createEvent
1439
- if ('createEvent' in document) {
1440
- event = document.createEvent('Event');
1441
- var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
1442
- var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
1443
-
1444
- event.initEvent(type, bubbles, cancelable);
1445
-
1446
- return event;
1447
- }
1448
-
1449
- event = document.createEventObject();
1450
-
1451
- event.type = type;
1452
- event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
1453
- event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
1454
-
1455
- return event;
1456
- };
1457
- if (existingProto) {
1458
- Object.defineProperty(window.Event, 'prototype', {
1459
- configurable: false,
1460
- enumerable: false,
1461
- writable: true,
1462
- value: existingProto
1463
- });
1464
- }
1465
-
1466
- if (!('createEvent' in document)) {
1467
- window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
1468
- var
1469
- element = this,
1470
- type = arguments[0],
1471
- listener = arguments[1];
1472
-
1473
- if (element === window && type in unlistenableWindowEvents) {
1474
- 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.');
1475
- }
1476
-
1477
- if (!element._events) {
1478
- element._events = {};
1479
- }
1480
-
1481
- if (!element._events[type]) {
1482
- element._events[type] = function (event) {
1483
- var
1484
- list = element._events[event.type].list,
1485
- events = list.slice(),
1486
- index = -1,
1487
- length = events.length,
1488
- eventElement;
1489
-
1490
- event.preventDefault = function preventDefault() {
1491
- if (event.cancelable !== false) {
1492
- event.returnValue = false;
1493
- }
1494
- };
1495
-
1496
- event.stopPropagation = function stopPropagation() {
1497
- event.cancelBubble = true;
1498
- };
1499
-
1500
- event.stopImmediatePropagation = function stopImmediatePropagation() {
1501
- event.cancelBubble = true;
1502
- event.cancelImmediate = true;
1503
- };
1504
-
1505
- event.currentTarget = element;
1506
- event.relatedTarget = event.fromElement || null;
1507
- event.target = event.target || event.srcElement || element;
1508
- event.timeStamp = new Date().getTime();
1509
-
1510
- if (event.clientX) {
1511
- event.pageX = event.clientX + document.documentElement.scrollLeft;
1512
- event.pageY = event.clientY + document.documentElement.scrollTop;
1513
- }
1514
-
1515
- while (++index < length && !event.cancelImmediate) {
1516
- if (index in events) {
1517
- eventElement = events[index];
1518
-
1519
- if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
1520
- eventElement.call(element, event);
1521
- }
1522
- }
1523
- }
1524
- };
1525
-
1526
- element._events[type].list = [];
1527
-
1528
- if (element.attachEvent) {
1529
- element.attachEvent('on' + type, element._events[type]);
1530
- }
1531
- }
1532
-
1533
- element._events[type].list.push(listener);
1534
- };
1535
-
1536
- window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
1537
- var
1538
- element = this,
1539
- type = arguments[0],
1540
- listener = arguments[1],
1541
- index;
1542
-
1543
- if (element._events && element._events[type] && element._events[type].list) {
1544
- index = indexOf(element._events[type].list, listener);
1545
-
1546
- if (index !== -1) {
1547
- element._events[type].list.splice(index, 1);
1548
-
1549
- if (!element._events[type].list.length) {
1550
- if (element.detachEvent) {
1551
- element.detachEvent('on' + type, element._events[type]);
1552
- }
1553
- delete element._events[type];
1554
- }
1555
- }
1556
- }
1557
- };
1558
-
1559
- window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
1560
- if (!arguments.length) {
1561
- throw new Error('Not enough arguments');
1562
- }
1563
-
1564
- if (!event || typeof event.type !== 'string') {
1565
- throw new Error('DOM Events Exception 0');
1566
- }
1567
-
1568
- var element = this, type = event.type;
1569
-
1570
- try {
1571
- if (!event.bubbles) {
1572
- event.cancelBubble = true;
1573
-
1574
- var cancelBubbleEvent = function (event) {
1575
- event.cancelBubble = true;
1576
-
1577
- (element || window).detachEvent('on' + type, cancelBubbleEvent);
1578
- };
1579
-
1580
- this.attachEvent('on' + type, cancelBubbleEvent);
1581
- }
1582
-
1583
- this.fireEvent('on' + type, event);
1584
- } catch (error) {
1585
- event.target = element;
1586
-
1587
- do {
1588
- event.currentTarget = element;
1589
-
1590
- if ('_events' in element && typeof element._events[type] === 'function') {
1591
- element._events[type].call(element, event);
1592
- }
1593
-
1594
- if (typeof element['on' + type] === 'function') {
1595
- element['on' + type].call(element, event);
1596
- }
1597
-
1598
- element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
1599
- } while (element && !event.cancelBubble);
1600
- }
1601
-
1602
- return true;
1603
- };
1604
-
1605
- // Add the DOMContentLoaded Event
1606
- document.attachEvent('onreadystatechange', function() {
1607
- if (document.readyState === 'complete') {
1608
- document.dispatchEvent(new Event('DOMContentLoaded', {
1609
- bubbles: true
1610
- }));
1611
- }
1612
- });
1613
- }
1614
- }());
1615
-
1616
- })
1617
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
1618
-
1619
- // @ts-nocheck
1620
-
1621
- (function(undefined) {
1622
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
1623
- var detect = 'bind' in Function.prototype;
1624
-
1625
- if (detect) return
1626
-
1627
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
1628
- Object.defineProperty(Function.prototype, 'bind', {
1629
- value: function bind(that) { // .length is 1
1630
- // add necessary es5-shim utilities
1631
- var $Array = Array;
1632
- var $Object = Object;
1633
- var ObjectPrototype = $Object.prototype;
1634
- var ArrayPrototype = $Array.prototype;
1635
- var Empty = function Empty() {};
1636
- var to_string = ObjectPrototype.toString;
1637
- var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1638
- 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; };
1639
- var array_slice = ArrayPrototype.slice;
1640
- var array_concat = ArrayPrototype.concat;
1641
- var array_push = ArrayPrototype.push;
1642
- var max = Math.max;
1643
- // /add necessary es5-shim utilities
1644
-
1645
- // 1. Let Target be the this value.
1646
- var target = this;
1647
- // 2. If IsCallable(Target) is false, throw a TypeError exception.
1648
- if (!isCallable(target)) {
1649
- throw new TypeError('Function.prototype.bind called on incompatible ' + target);
1650
- }
1651
- // 3. Let A be a new (possibly empty) internal list of all of the
1652
- // argument values provided after thisArg (arg1, arg2 etc), in order.
1653
- // XXX slicedArgs will stand in for "A" if used
1654
- var args = array_slice.call(arguments, 1); // for normal call
1655
- // 4. Let F be a new native ECMAScript object.
1656
- // 11. Set the [[Prototype]] internal property of F to the standard
1657
- // built-in Function prototype object as specified in 15.3.3.1.
1658
- // 12. Set the [[Call]] internal property of F as described in
1659
- // 15.3.4.5.1.
1660
- // 13. Set the [[Construct]] internal property of F as described in
1661
- // 15.3.4.5.2.
1662
- // 14. Set the [[HasInstance]] internal property of F as described in
1663
- // 15.3.4.5.3.
1664
- var bound;
1665
- var binder = function () {
1666
-
1667
- if (this instanceof bound) {
1668
- // 15.3.4.5.2 [[Construct]]
1669
- // When the [[Construct]] internal method of a function object,
1670
- // F that was created using the bind function is called with a
1671
- // list of arguments ExtraArgs, the following steps are taken:
1672
- // 1. Let target be the value of F's [[TargetFunction]]
1673
- // internal property.
1674
- // 2. If target has no [[Construct]] internal method, a
1675
- // TypeError exception is thrown.
1676
- // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
1677
- // property.
1678
- // 4. Let args be a new list containing the same values as the
1679
- // list boundArgs in the same order followed by the same
1680
- // values as the list ExtraArgs in the same order.
1681
- // 5. Return the result of calling the [[Construct]] internal
1682
- // method of target providing args as the arguments.
1683
-
1684
- var result = target.apply(
1685
- this,
1686
- array_concat.call(args, array_slice.call(arguments))
1687
- );
1688
- if ($Object(result) === result) {
1689
- return result;
1690
- }
1691
- return this;
1692
-
1693
- } else {
1694
- // 15.3.4.5.1 [[Call]]
1695
- // When the [[Call]] internal method of a function object, F,
1696
- // which was created using the bind function is called with a
1697
- // this value and a list of arguments ExtraArgs, the following
1698
- // steps are taken:
1699
- // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
1700
- // property.
1701
- // 2. Let boundThis be the value of F's [[BoundThis]] internal
1702
- // property.
1703
- // 3. Let target be the value of F's [[TargetFunction]] internal
1704
- // property.
1705
- // 4. Let args be a new list containing the same values as the
1706
- // list boundArgs in the same order followed by the same
1707
- // values as the list ExtraArgs in the same order.
1708
- // 5. Return the result of calling the [[Call]] internal method
1709
- // of target providing boundThis as the this value and
1710
- // providing args as the arguments.
1711
-
1712
- // equiv: target.call(this, ...boundArgs, ...args)
1713
- return target.apply(
1714
- that,
1715
- array_concat.call(args, array_slice.call(arguments))
1716
- );
1717
-
1718
- }
1719
-
1720
- };
1721
-
1722
- // 15. If the [[Class]] internal property of Target is "Function", then
1723
- // a. Let L be the length property of Target minus the length of A.
1724
- // b. Set the length own property of F to either 0 or L, whichever is
1725
- // larger.
1726
- // 16. Else set the length own property of F to 0.
1727
-
1728
- var boundLength = max(0, target.length - args.length);
1729
-
1730
- // 17. Set the attributes of the length own property of F to the values
1731
- // specified in 15.3.5.1.
1732
- var boundArgs = [];
1733
- for (var i = 0; i < boundLength; i++) {
1734
- array_push.call(boundArgs, '$' + i);
1735
- }
1736
-
1737
- // XXX Build a dynamic function with desired amount of arguments is the only
1738
- // way to set the length property of a function.
1739
- // In environments where Content Security Policies enabled (Chrome extensions,
1740
- // for ex.) all use of eval or Function costructor throws an exception.
1741
- // However in all of these environments Function.prototype.bind exists
1742
- // and so this code will never be executed.
1743
- bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
1744
-
1745
- if (target.prototype) {
1746
- Empty.prototype = target.prototype;
1747
- bound.prototype = new Empty();
1748
- // Clean up dangling references.
1749
- Empty.prototype = null;
1750
- }
1751
-
1752
- // TODO
1753
- // 18. Set the [[Extensible]] internal property of F to true.
1754
-
1755
- // TODO
1756
- // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
1757
- // 20. Call the [[DefineOwnProperty]] internal method of F with
1758
- // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
1759
- // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
1760
- // false.
1761
- // 21. Call the [[DefineOwnProperty]] internal method of F with
1762
- // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
1763
- // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
1764
- // and false.
1765
-
1766
- // TODO
1767
- // NOTE Function objects created using Function.prototype.bind do not
1768
- // have a prototype property or the [[Code]], [[FormalParameters]], and
1769
- // [[Scope]] internal properties.
1770
- // XXX can't delete prototype in pure-js.
1771
-
1772
- // 22. Return F.
1773
- return bound;
1774
- }
1775
- });
1776
- })
1777
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
1778
-
1779
- /* eslint-disable es-x/no-date-now -- Polyfill imported */
1780
-
1781
- /**
1782
- * @constant
1783
- * @type {CharacterCountTranslations}
1784
- * @see Default value for {@link CharacterCountConfig.i18n}
1785
- * @default
1786
- */
1787
- var CHARACTER_COUNT_TRANSLATIONS = {
1788
- // Characters
1789
- charactersUnderLimit: {
1790
- one: 'You have %{count} character remaining',
1791
- other: 'You have %{count} characters remaining'
1792
- },
1793
- charactersAtLimit: 'You have 0 characters remaining',
1794
- charactersOverLimit: {
1795
- one: 'You have %{count} character too many',
1796
- other: 'You have %{count} characters too many'
1797
- },
1798
- // Words
1799
- wordsUnderLimit: {
1800
- one: 'You have %{count} word remaining',
1801
- other: 'You have %{count} words remaining'
1802
- },
1803
- wordsAtLimit: 'You have 0 words remaining',
1804
- wordsOverLimit: {
1805
- one: 'You have %{count} word too many',
1806
- other: 'You have %{count} words too many'
1807
- },
1808
- textareaDescription: {
1809
- other: ''
1810
- }
1811
- };
1812
-
1813
- /**
1814
- * JavaScript enhancements for the CharacterCount component
1815
- *
1816
- * Tracks the number of characters or words in the `.govuk-js-character-count`
1817
- * `<textarea>` inside the element. Displays a message with the remaining number
1818
- * of characters/words available, or the number of characters/words in excess.
1819
- *
1820
- * You can configure the message to only appear after a certain percentage
1821
- * of the available characters/words has been entered.
1822
- *
1823
- * @class
1824
- * @param {Element} $module - HTML element to use for character count
1825
- * @param {CharacterCountConfig} [config] - Character count config
1826
- */
1827
- function CharacterCount ($module, config) {
1828
- if (!($module instanceof HTMLElement)) {
1829
- return this
1830
- }
1831
-
1832
- var $textarea = $module.querySelector('.govuk-js-character-count');
1833
- if (
1834
- !(
1835
- $textarea instanceof HTMLTextAreaElement ||
1836
- $textarea instanceof HTMLInputElement
1837
- )
1838
- ) {
1839
- return this
1840
- }
1841
-
1842
- var defaultConfig = {
1843
- threshold: 0,
1844
- i18n: CHARACTER_COUNT_TRANSLATIONS
1845
- };
1846
-
1847
- // Read config set using dataset ('data-' values)
1848
- var datasetConfig = normaliseDataset($module.dataset);
1849
-
1850
- // To ensure data-attributes take complete precedence, even if they change the
1851
- // type of count, we need to reset the `maxlength` and `maxwords` from the
1852
- // JavaScript config.
1853
- //
1854
- // We can't mutate `config`, though, as it may be shared across multiple
1855
- // components inside `initAll`.
1856
- var configOverrides = {};
1857
- if ('maxwords' in datasetConfig || 'maxlength' in datasetConfig) {
1858
- configOverrides = {
1859
- maxlength: false,
1860
- maxwords: false
1861
- };
1862
- }
1863
-
1864
- /**
1865
- * @deprecated Will be made private in v5.0
1866
- * @type {CharacterCountConfig}
1867
- */
1868
- this.config = mergeConfigs(
1869
- defaultConfig,
1870
- config || {},
1871
- configOverrides,
1872
- datasetConfig
1873
- );
1874
-
1875
- /** @deprecated Will be made private in v5.0 */
1876
- this.i18n = new I18n(extractConfigByNamespace(this.config, 'i18n'), {
1877
- // Read the fallback if necessary rather than have it set in the defaults
1878
- locale: closestAttributeValue($module, 'lang')
1879
- });
1880
-
1881
- /** @deprecated Will be made private in v5.0 */
1882
- this.maxLength = Infinity;
1883
- // Determine the limit attribute (characters or words)
1884
- if ('maxwords' in this.config && this.config.maxwords) {
1885
- this.maxLength = this.config.maxwords;
1886
- } else if ('maxlength' in this.config && this.config.maxlength) {
1887
- this.maxLength = this.config.maxlength;
1888
- } else {
1889
- return
1890
- }
1891
-
1892
- /** @deprecated Will be made private in v5.0 */
1893
- this.$module = $module;
1894
-
1895
- /** @deprecated Will be made private in v5.0 */
1896
- this.$textarea = $textarea;
1897
-
1898
- /** @deprecated Will be made private in v5.0 */
1899
- this.$visibleCountMessage = null;
1900
-
1901
- /** @deprecated Will be made private in v5.0 */
1902
- this.$screenReaderCountMessage = null;
1903
-
1904
- /** @deprecated Will be made private in v5.0 */
1905
- this.lastInputTimestamp = null;
1906
-
1907
- /** @deprecated Will be made private in v5.0 */
1908
- this.lastInputValue = '';
1909
-
1910
- /** @deprecated Will be made private in v5.0 */
1911
- this.valueChecker = null;
1912
- }
1913
-
1914
- /**
1915
- * Initialise component
1916
- */
1917
- CharacterCount.prototype.init = function () {
1918
- // Check that required elements are present
1919
- if (!this.$module || !this.$textarea) {
1920
- return
1921
- }
1922
-
1923
- var $textarea = this.$textarea;
1924
- var $textareaDescription = document.getElementById($textarea.id + '-info');
1925
- if (!$textareaDescription) {
1926
- return
1927
- }
1928
-
1929
- // Inject a description for the textarea if none is present already
1930
- // for when the component was rendered with no maxlength, maxwords
1931
- // nor custom textareaDescriptionText
1932
- if ($textareaDescription.innerText.match(/^\s*$/)) {
1933
- $textareaDescription.innerText = this.i18n.t('textareaDescription', { count: this.maxLength });
1934
- }
1935
-
1936
- // Move the textarea description to be immediately after the textarea
1937
- // Kept for backwards compatibility
1938
- $textarea.insertAdjacentElement('afterend', $textareaDescription);
1939
-
1940
- // Create the *screen reader* specific live-updating counter
1941
- // This doesn't need any styling classes, as it is never visible
1942
- var $screenReaderCountMessage = document.createElement('div');
1943
- $screenReaderCountMessage.className = 'govuk-character-count__sr-status govuk-visually-hidden';
1944
- $screenReaderCountMessage.setAttribute('aria-live', 'polite');
1945
- this.$screenReaderCountMessage = $screenReaderCountMessage;
1946
- $textareaDescription.insertAdjacentElement('afterend', $screenReaderCountMessage);
1947
-
1948
- // Create our live-updating counter element, copying the classes from the
1949
- // textarea description for backwards compatibility as these may have been
1950
- // configured
1951
- var $visibleCountMessage = document.createElement('div');
1952
- $visibleCountMessage.className = $textareaDescription.className;
1953
- $visibleCountMessage.classList.add('govuk-character-count__status');
1954
- $visibleCountMessage.setAttribute('aria-hidden', 'true');
1955
- this.$visibleCountMessage = $visibleCountMessage;
1956
- $textareaDescription.insertAdjacentElement('afterend', $visibleCountMessage);
1957
-
1958
- // Hide the textarea description
1959
- $textareaDescription.classList.add('govuk-visually-hidden');
1960
-
1961
- // Remove hard limit if set
1962
- $textarea.removeAttribute('maxlength');
1963
-
1964
- this.bindChangeEvents();
1965
-
1966
- // When the page is restored after navigating 'back' in some browsers the
1967
- // state of the character count is not restored until *after* the
1968
- // DOMContentLoaded event is fired, so we need to manually update it after the
1969
- // pageshow event in browsers that support it.
1970
- window.addEventListener(
1971
- 'onpageshow' in window ? 'pageshow' : 'DOMContentLoaded',
1972
- this.updateCountMessage.bind(this)
1973
- );
1974
-
1975
- this.updateCountMessage();
1976
- };
1977
-
1978
- /**
1979
- * Bind change events
1980
- *
1981
- * Set up event listeners on the $textarea so that the count messages update
1982
- * when the user types.
1983
- *
1984
- * @deprecated Will be made private in v5.0
1985
- */
1986
- CharacterCount.prototype.bindChangeEvents = function () {
1987
- var $textarea = this.$textarea;
1988
- $textarea.addEventListener('keyup', this.handleKeyUp.bind(this));
1989
-
1990
- // Bind focus/blur events to start/stop polling
1991
- $textarea.addEventListener('focus', this.handleFocus.bind(this));
1992
- $textarea.addEventListener('blur', this.handleBlur.bind(this));
1993
- };
1994
-
1995
- /**
1996
- * Handle key up event
1997
- *
1998
- * Update the visible character counter and keep track of when the last update
1999
- * happened for each keypress
2000
- *
2001
- * @deprecated Will be made private in v5.0
2002
- */
2003
- CharacterCount.prototype.handleKeyUp = function () {
2004
- this.updateVisibleCountMessage();
2005
- this.lastInputTimestamp = Date.now();
2006
- };
2007
-
2008
- /**
2009
- * Handle focus event
2010
- *
2011
- * Speech recognition software such as Dragon NaturallySpeaking will modify the
2012
- * fields by directly changing its `value`. These changes don't trigger events
2013
- * in JavaScript, so we need to poll to handle when and if they occur.
2014
- *
2015
- * Once the keyup event hasn't been detected for at least 1000 ms (1s), check if
2016
- * the textarea value has changed and update the count message if it has.
2017
- *
2018
- * This is so that the update triggered by the manual comparison doesn't
2019
- * conflict with debounced KeyboardEvent updates.
2020
- *
2021
- * @deprecated Will be made private in v5.0
2022
- */
2023
- CharacterCount.prototype.handleFocus = function () {
2024
- this.valueChecker = setInterval(function () {
2025
- if (!this.lastInputTimestamp || (Date.now() - 500) >= this.lastInputTimestamp) {
2026
- this.updateIfValueChanged();
2027
- }
2028
- }.bind(this), 1000);
2029
- };
2030
-
2031
- /**
2032
- * Handle blur event
2033
- *
2034
- * Stop checking the textarea value once the textarea no longer has focus
2035
- *
2036
- * @deprecated Will be made private in v5.0
2037
- */
2038
- CharacterCount.prototype.handleBlur = function () {
2039
- // Cancel value checking on blur
2040
- clearInterval(this.valueChecker);
2041
- };
2042
-
2043
- /**
2044
- * Update count message if textarea value has changed
2045
- *
2046
- * @deprecated Will be made private in v5.0
2047
- */
2048
- CharacterCount.prototype.updateIfValueChanged = function () {
2049
- if (this.$textarea.value !== this.lastInputValue) {
2050
- this.lastInputValue = this.$textarea.value;
2051
- this.updateCountMessage();
2052
- }
2053
- };
2054
-
2055
- /**
2056
- * Update count message
2057
- *
2058
- * Helper function to update both the visible and screen reader-specific
2059
- * counters simultaneously (e.g. on init)
2060
- *
2061
- * @deprecated Will be made private in v5.0
2062
- */
2063
- CharacterCount.prototype.updateCountMessage = function () {
2064
- this.updateVisibleCountMessage();
2065
- this.updateScreenReaderCountMessage();
2066
- };
2067
-
2068
- /**
2069
- * Update visible count message
2070
- *
2071
- * @deprecated Will be made private in v5.0
2072
- */
2073
- CharacterCount.prototype.updateVisibleCountMessage = function () {
2074
- var $textarea = this.$textarea;
2075
- var $visibleCountMessage = this.$visibleCountMessage;
2076
- var remainingNumber = this.maxLength - this.count($textarea.value);
2077
-
2078
- // If input is over the threshold, remove the disabled class which renders the
2079
- // counter invisible.
2080
- if (this.isOverThreshold()) {
2081
- $visibleCountMessage.classList.remove('govuk-character-count__message--disabled');
2082
- } else {
2083
- $visibleCountMessage.classList.add('govuk-character-count__message--disabled');
2084
- }
2085
-
2086
- // Update styles
2087
- if (remainingNumber < 0) {
2088
- $textarea.classList.add('govuk-textarea--error');
2089
- $visibleCountMessage.classList.remove('govuk-hint');
2090
- $visibleCountMessage.classList.add('govuk-error-message');
2091
- } else {
2092
- $textarea.classList.remove('govuk-textarea--error');
2093
- $visibleCountMessage.classList.remove('govuk-error-message');
2094
- $visibleCountMessage.classList.add('govuk-hint');
2095
- }
2096
-
2097
- // Update message
2098
- $visibleCountMessage.innerText = this.getCountMessage();
2099
- };
2100
-
2101
- /**
2102
- * Update screen reader count message
2103
- *
2104
- * @deprecated Will be made private in v5.0
2105
- */
2106
- CharacterCount.prototype.updateScreenReaderCountMessage = function () {
2107
- var $screenReaderCountMessage = this.$screenReaderCountMessage;
2108
-
2109
- // If over the threshold, remove the aria-hidden attribute, allowing screen
2110
- // readers to announce the content of the element.
2111
- if (this.isOverThreshold()) {
2112
- $screenReaderCountMessage.removeAttribute('aria-hidden');
2113
- } else {
2114
- $screenReaderCountMessage.setAttribute('aria-hidden', 'true');
2115
- }
2116
-
2117
- // Update message
2118
- $screenReaderCountMessage.innerText = this.getCountMessage();
2119
- };
2120
-
2121
- /**
2122
- * Count the number of characters (or words, if `config.maxwords` is set)
2123
- * in the given text
2124
- *
2125
- * @deprecated Will be made private in v5.0
2126
- * @param {string} text - The text to count the characters of
2127
- * @returns {number} the number of characters (or words) in the text
2128
- */
2129
- CharacterCount.prototype.count = function (text) {
2130
- if ('maxwords' in this.config && this.config.maxwords) {
2131
- var tokens = text.match(/\S+/g) || []; // Matches consecutive non-whitespace chars
2132
- return tokens.length
2133
- } else {
2134
- return text.length
2135
- }
2136
- };
2137
-
2138
- /**
2139
- * Get count message
2140
- *
2141
- * @deprecated Will be made private in v5.0
2142
- * @returns {string} Status message
2143
- */
2144
- CharacterCount.prototype.getCountMessage = function () {
2145
- var remainingNumber = this.maxLength - this.count(this.$textarea.value);
2146
-
2147
- var countType = 'maxwords' in this.config && this.config.maxwords ? 'words' : 'characters';
2148
- return this.formatCountMessage(remainingNumber, countType)
2149
- };
2150
-
2151
- /**
2152
- * Formats the message shown to users according to what's counted
2153
- * and how many remain
2154
- *
2155
- * @deprecated Will be made private in v5.0
2156
- * @param {number} remainingNumber - The number of words/characaters remaining
2157
- * @param {string} countType - "words" or "characters"
2158
- * @returns {string} Status message
2159
- */
2160
- CharacterCount.prototype.formatCountMessage = function (remainingNumber, countType) {
2161
- if (remainingNumber === 0) {
2162
- return this.i18n.t(countType + 'AtLimit')
2163
- }
2164
-
2165
- var translationKeySuffix = remainingNumber < 0 ? 'OverLimit' : 'UnderLimit';
2166
-
2167
- return this.i18n.t(countType + translationKeySuffix, { count: Math.abs(remainingNumber) })
2168
- };
2169
-
2170
- /**
2171
- * Check if count is over threshold
2172
- *
2173
- * Checks whether the value is over the configured threshold for the input.
2174
- * If there is no configured threshold, it is set to 0 and this function will
2175
- * always return true.
2176
- *
2177
- * @deprecated Will be made private in v5.0
2178
- * @returns {boolean} true if the current count is over the config.threshold
2179
- * (or no threshold is set)
2180
- */
2181
- CharacterCount.prototype.isOverThreshold = function () {
2182
- // No threshold means we're always above threshold so save some computation
2183
- if (!this.config.threshold) {
2184
- return true
2185
- }
2186
-
2187
- var $textarea = this.$textarea;
2188
-
2189
- // Determine the remaining number of characters/words
2190
- var currentLength = this.count($textarea.value);
2191
- var maxLength = this.maxLength;
2192
-
2193
- var thresholdValue = maxLength * this.config.threshold / 100;
2194
-
2195
- return (thresholdValue <= currentLength)
2196
- };
2197
-
2198
- /**
2199
- * Character count config
2200
- *
2201
- * @typedef {CharacterCountConfigWithMaxLength | CharacterCountConfigWithMaxWords} CharacterCountConfig
2202
- */
2203
-
2204
- /**
2205
- * Character count config (with maximum number of characters)
2206
- *
2207
- * @typedef {object} CharacterCountConfigWithMaxLength
2208
- * @property {number} [maxlength] - The maximum number of characters.
2209
- * If maxwords is provided, the maxlength option will be ignored.
2210
- * @property {number} [threshold = 0] - The percentage value of the limit at
2211
- * which point the count message is displayed. If this attribute is set, the
2212
- * count message will be hidden by default.
2213
- * @property {CharacterCountTranslations} [i18n = CHARACTER_COUNT_TRANSLATIONS] - See constant {@link CHARACTER_COUNT_TRANSLATIONS}
2214
- */
2215
-
2216
- /**
2217
- * Character count config (with maximum number of words)
2218
- *
2219
- * @typedef {object} CharacterCountConfigWithMaxWords
2220
- * @property {number} [maxwords] - The maximum number of words. If maxwords is
2221
- * provided, the maxlength option will be ignored.
2222
- * @property {number} [threshold = 0] - The percentage value of the limit at
2223
- * which point the count message is displayed. If this attribute is set, the
2224
- * count message will be hidden by default.
2225
- * @property {CharacterCountTranslations} [i18n = CHARACTER_COUNT_TRANSLATIONS] - See constant {@link CHARACTER_COUNT_TRANSLATIONS}
2226
- */
2227
-
2228
- /**
2229
- * Character count translations
2230
- *
2231
- * @typedef {object} CharacterCountTranslations
2232
- *
2233
- * Messages shown to users as they type. It provides feedback on how many words
2234
- * or characters they have remaining or if they are over the limit. This also
2235
- * includes a message used as an accessible description for the textarea.
2236
- * @property {TranslationPluralForms} [charactersUnderLimit] - Message displayed
2237
- * when the number of characters is under the configured maximum, `maxlength`.
2238
- * This message is displayed visually and through assistive technologies. The
2239
- * component will replace the `%{count}` placeholder with the number of
2240
- * remaining characters. This is a [pluralised list of
2241
- * messages](https://frontend.design-system.service.gov.uk/localise-govuk-frontend).
2242
- * @property {string} [charactersAtLimit] - Message displayed when the number of
2243
- * characters reaches the configured maximum, `maxlength`. This message is
2244
- * displayed visually and through assistive technologies.
2245
- * @property {TranslationPluralForms} [charactersOverLimit] - Message displayed
2246
- * when the number of characters is over the configured maximum, `maxlength`.
2247
- * This message is displayed visually and through assistive technologies. The
2248
- * component will replace the `%{count}` placeholder with the number of
2249
- * remaining characters. This is a [pluralised list of
2250
- * messages](https://frontend.design-system.service.gov.uk/localise-govuk-frontend).
2251
- * @property {TranslationPluralForms} [wordsUnderLimit] - Message displayed when
2252
- * the number of words is under the configured maximum, `maxlength`. This
2253
- * message is displayed visually and through assistive technologies. The
2254
- * component will replace the `%{count}` placeholder with the number of
2255
- * remaining words. This is a [pluralised list of
2256
- * messages](https://frontend.design-system.service.gov.uk/localise-govuk-frontend).
2257
- * @property {string} [wordsAtLimit] - Message displayed when the number of
2258
- * words reaches the configured maximum, `maxlength`. This message is
2259
- * displayed visually and through assistive technologies.
2260
- * @property {TranslationPluralForms} [wordsOverLimit] - Message displayed when
2261
- * the number of words is over the configured maximum, `maxlength`. This
2262
- * message is displayed visually and through assistive technologies. The
2263
- * component will replace the `%{count}` placeholder with the number of
2264
- * remaining words. This is a [pluralised list of
2265
- * messages](https://frontend.design-system.service.gov.uk/localise-govuk-frontend).
2266
- * @property {TranslationPluralForms} [textareaDescription] - Message made
2267
- * available to assistive technologies, if none is already present in the
2268
- * HTML, to describe that the component accepts only a limited amount of
2269
- * content. It is visible on the page when JavaScript is unavailable. The
2270
- * component will replace the `%{count}` placeholder with the value of the
2271
- * `maxlength` or `maxwords` parameter.
2272
- */
2273
-
2274
- /**
2275
- * @typedef {import('../../i18n.mjs').TranslationPluralForms} TranslationPluralForms
2276
- */
2277
-
2278
- return CharacterCount;
2279
-
2280
- })));
2281
- //# sourceMappingURL=character-count.js.map