govuk_tech_docs 3.4.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +22 -1
  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
@@ -0,0 +1,785 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.GOVUKFrontend = {}));
5
+ })(this, (function (exports) { 'use strict';
6
+
7
+ function normaliseString(value, property) {
8
+ const trimmedValue = value ? value.trim() : '';
9
+ let output;
10
+ let outputType = property == null ? void 0 : property.type;
11
+ if (!outputType) {
12
+ if (['true', 'false'].includes(trimmedValue)) {
13
+ outputType = 'boolean';
14
+ }
15
+ if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
16
+ outputType = 'number';
17
+ }
18
+ }
19
+ switch (outputType) {
20
+ case 'boolean':
21
+ output = trimmedValue === 'true';
22
+ break;
23
+ case 'number':
24
+ output = Number(trimmedValue);
25
+ break;
26
+ default:
27
+ output = value;
28
+ }
29
+ return output;
30
+ }
31
+
32
+ /**
33
+ * @typedef {import('./index.mjs').SchemaProperty} SchemaProperty
34
+ */
35
+
36
+ function mergeConfigs(...configObjects) {
37
+ const formattedConfigObject = {};
38
+ for (const configObject of configObjects) {
39
+ for (const key of Object.keys(configObject)) {
40
+ const option = formattedConfigObject[key];
41
+ const override = configObject[key];
42
+ if (isObject(option) && isObject(override)) {
43
+ formattedConfigObject[key] = mergeConfigs(option, override);
44
+ } else {
45
+ formattedConfigObject[key] = override;
46
+ }
47
+ }
48
+ }
49
+ return formattedConfigObject;
50
+ }
51
+ function extractConfigByNamespace(Component, dataset, namespace) {
52
+ const property = Component.schema.properties[namespace];
53
+ if ((property == null ? void 0 : property.type) !== 'object') {
54
+ return;
55
+ }
56
+ const newObject = {
57
+ [namespace]: ({})
58
+ };
59
+ for (const [key, value] of Object.entries(dataset)) {
60
+ let current = newObject;
61
+ const keyParts = key.split('.');
62
+ for (const [index, name] of keyParts.entries()) {
63
+ if (typeof current === 'object') {
64
+ if (index < keyParts.length - 1) {
65
+ if (!isObject(current[name])) {
66
+ current[name] = {};
67
+ }
68
+ current = current[name];
69
+ } else if (key !== namespace) {
70
+ current[name] = normaliseString(value);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ return newObject[namespace];
76
+ }
77
+ function isInitialised($root, moduleName) {
78
+ return $root instanceof HTMLElement && $root.hasAttribute(`data-${moduleName}-init`);
79
+ }
80
+
81
+ /**
82
+ * Checks if GOV.UK Frontend is supported on this page
83
+ *
84
+ * Some browsers will load and run our JavaScript but GOV.UK Frontend
85
+ * won't be supported.
86
+ *
87
+ * @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support
88
+ * @returns {boolean} Whether GOV.UK Frontend is supported on this page
89
+ */
90
+ function isSupported($scope = document.body) {
91
+ if (!$scope) {
92
+ return false;
93
+ }
94
+ return $scope.classList.contains('govuk-frontend-supported');
95
+ }
96
+ function isArray(option) {
97
+ return Array.isArray(option);
98
+ }
99
+ function isObject(option) {
100
+ return !!option && typeof option === 'object' && !isArray(option);
101
+ }
102
+ function formatErrorMessage(Component, message) {
103
+ return `${Component.moduleName}: ${message}`;
104
+ }
105
+
106
+ /**
107
+ * Schema for component config
108
+ *
109
+ * @typedef {object} Schema
110
+ * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
111
+ * @property {SchemaCondition[]} [anyOf] - List of schema conditions
112
+ */
113
+
114
+ /**
115
+ * Schema property for component config
116
+ *
117
+ * @typedef {object} SchemaProperty
118
+ * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type
119
+ */
120
+
121
+ /**
122
+ * Schema condition for component config
123
+ *
124
+ * @typedef {object} SchemaCondition
125
+ * @property {string[]} required - List of required config fields
126
+ * @property {string} errorMessage - Error message when required config fields not provided
127
+ */
128
+ /**
129
+ * @typedef ComponentWithModuleName
130
+ * @property {string} moduleName - Name of the component
131
+ */
132
+
133
+ function normaliseDataset(Component, dataset) {
134
+ const out = {};
135
+ for (const [field, property] of Object.entries(Component.schema.properties)) {
136
+ if (field in dataset) {
137
+ out[field] = normaliseString(dataset[field], property);
138
+ }
139
+ if ((property == null ? void 0 : property.type) === 'object') {
140
+ out[field] = extractConfigByNamespace(Component, dataset, field);
141
+ }
142
+ }
143
+ return out;
144
+ }
145
+
146
+ class GOVUKFrontendError extends Error {
147
+ constructor(...args) {
148
+ super(...args);
149
+ this.name = 'GOVUKFrontendError';
150
+ }
151
+ }
152
+ class SupportError extends GOVUKFrontendError {
153
+ /**
154
+ * Checks if GOV.UK Frontend is supported on this page
155
+ *
156
+ * @param {HTMLElement | null} [$scope] - HTML element `<body>` checked for browser support
157
+ */
158
+ constructor($scope = document.body) {
159
+ const supportMessage = 'noModule' in HTMLScriptElement.prototype ? 'GOV.UK Frontend initialised without `<body class="govuk-frontend-supported">` from template `<script>` snippet' : 'GOV.UK Frontend is not supported in this browser';
160
+ super($scope ? supportMessage : 'GOV.UK Frontend initialised without `<script type="module">`');
161
+ this.name = 'SupportError';
162
+ }
163
+ }
164
+ class ElementError extends GOVUKFrontendError {
165
+ constructor(messageOrOptions) {
166
+ let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';
167
+ if (typeof messageOrOptions === 'object') {
168
+ const {
169
+ component,
170
+ identifier,
171
+ element,
172
+ expectedType
173
+ } = messageOrOptions;
174
+ message = identifier;
175
+ message += element ? ` is not of type ${expectedType != null ? expectedType : 'HTMLElement'}` : ' not found';
176
+ message = formatErrorMessage(component, message);
177
+ }
178
+ super(message);
179
+ this.name = 'ElementError';
180
+ }
181
+ }
182
+ class InitError extends GOVUKFrontendError {
183
+ constructor(componentOrMessage) {
184
+ const message = typeof componentOrMessage === 'string' ? componentOrMessage : formatErrorMessage(componentOrMessage, `Root element (\`$root\`) already initialised`);
185
+ super(message);
186
+ this.name = 'InitError';
187
+ }
188
+ }
189
+ /**
190
+ * @typedef {import('../common/index.mjs').ComponentWithModuleName} ComponentWithModuleName
191
+ */
192
+
193
+ class GOVUKFrontendComponent {
194
+ /**
195
+ * Returns the root element of the component
196
+ *
197
+ * @protected
198
+ * @returns {RootElementType} - the root element of component
199
+ */
200
+ get $root() {
201
+ return this._$root;
202
+ }
203
+ constructor($root) {
204
+ this._$root = void 0;
205
+ const childConstructor = this.constructor;
206
+ if (typeof childConstructor.moduleName !== 'string') {
207
+ throw new InitError(`\`moduleName\` not defined in component`);
208
+ }
209
+ if (!($root instanceof childConstructor.elementType)) {
210
+ throw new ElementError({
211
+ element: $root,
212
+ component: childConstructor,
213
+ identifier: 'Root element (`$root`)',
214
+ expectedType: childConstructor.elementType.name
215
+ });
216
+ } else {
217
+ this._$root = $root;
218
+ }
219
+ childConstructor.checkSupport();
220
+ this.checkInitialised();
221
+ const moduleName = childConstructor.moduleName;
222
+ this.$root.setAttribute(`data-${moduleName}-init`, '');
223
+ }
224
+ checkInitialised() {
225
+ const constructor = this.constructor;
226
+ const moduleName = constructor.moduleName;
227
+ if (moduleName && isInitialised(this.$root, moduleName)) {
228
+ throw new InitError(constructor);
229
+ }
230
+ }
231
+ static checkSupport() {
232
+ if (!isSupported()) {
233
+ throw new SupportError();
234
+ }
235
+ }
236
+ }
237
+
238
+ /**
239
+ * @typedef ChildClass
240
+ * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component
241
+ */
242
+
243
+ /**
244
+ * @typedef {typeof GOVUKFrontendComponent & ChildClass} ChildClassConstructor
245
+ */
246
+ GOVUKFrontendComponent.elementType = HTMLElement;
247
+
248
+ class I18n {
249
+ constructor(translations = {}, config = {}) {
250
+ var _config$locale;
251
+ this.translations = void 0;
252
+ this.locale = void 0;
253
+ this.translations = translations;
254
+ this.locale = (_config$locale = config.locale) != null ? _config$locale : document.documentElement.lang || 'en';
255
+ }
256
+ t(lookupKey, options) {
257
+ if (!lookupKey) {
258
+ throw new Error('i18n: lookup key missing');
259
+ }
260
+ let translation = this.translations[lookupKey];
261
+ if (typeof (options == null ? void 0 : options.count) === 'number' && typeof translation === 'object') {
262
+ const translationPluralForm = translation[this.getPluralSuffix(lookupKey, options.count)];
263
+ if (translationPluralForm) {
264
+ translation = translationPluralForm;
265
+ }
266
+ }
267
+ if (typeof translation === 'string') {
268
+ if (translation.match(/%{(.\S+)}/)) {
269
+ if (!options) {
270
+ throw new Error('i18n: cannot replace placeholders in string if no option data provided');
271
+ }
272
+ return this.replacePlaceholders(translation, options);
273
+ }
274
+ return translation;
275
+ }
276
+ return lookupKey;
277
+ }
278
+ replacePlaceholders(translationString, options) {
279
+ const formatter = Intl.NumberFormat.supportedLocalesOf(this.locale).length ? new Intl.NumberFormat(this.locale) : undefined;
280
+ return translationString.replace(/%{(.\S+)}/g, function (placeholderWithBraces, placeholderKey) {
281
+ if (Object.prototype.hasOwnProperty.call(options, placeholderKey)) {
282
+ const placeholderValue = options[placeholderKey];
283
+ if (placeholderValue === false || typeof placeholderValue !== 'number' && typeof placeholderValue !== 'string') {
284
+ return '';
285
+ }
286
+ if (typeof placeholderValue === 'number') {
287
+ return formatter ? formatter.format(placeholderValue) : `${placeholderValue}`;
288
+ }
289
+ return placeholderValue;
290
+ }
291
+ throw new Error(`i18n: no data found to replace ${placeholderWithBraces} placeholder in string`);
292
+ });
293
+ }
294
+ hasIntlPluralRulesSupport() {
295
+ return Boolean('PluralRules' in window.Intl && Intl.PluralRules.supportedLocalesOf(this.locale).length);
296
+ }
297
+ getPluralSuffix(lookupKey, count) {
298
+ count = Number(count);
299
+ if (!isFinite(count)) {
300
+ return 'other';
301
+ }
302
+ const translation = this.translations[lookupKey];
303
+ const preferredForm = this.hasIntlPluralRulesSupport() ? new Intl.PluralRules(this.locale).select(count) : this.selectPluralFormUsingFallbackRules(count);
304
+ if (typeof translation === 'object') {
305
+ if (preferredForm in translation) {
306
+ return preferredForm;
307
+ } else if ('other' in translation) {
308
+ console.warn(`i18n: Missing plural form ".${preferredForm}" for "${this.locale}" locale. Falling back to ".other".`);
309
+ return 'other';
310
+ }
311
+ }
312
+ throw new Error(`i18n: Plural form ".other" is required for "${this.locale}" locale`);
313
+ }
314
+ selectPluralFormUsingFallbackRules(count) {
315
+ count = Math.abs(Math.floor(count));
316
+ const ruleset = this.getPluralRulesForLocale();
317
+ if (ruleset) {
318
+ return I18n.pluralRules[ruleset](count);
319
+ }
320
+ return 'other';
321
+ }
322
+ getPluralRulesForLocale() {
323
+ const localeShort = this.locale.split('-')[0];
324
+ for (const pluralRule in I18n.pluralRulesMap) {
325
+ const languages = I18n.pluralRulesMap[pluralRule];
326
+ if (languages.includes(this.locale) || languages.includes(localeShort)) {
327
+ return pluralRule;
328
+ }
329
+ }
330
+ }
331
+ }
332
+ I18n.pluralRulesMap = {
333
+ arabic: ['ar'],
334
+ chinese: ['my', 'zh', 'id', 'ja', 'jv', 'ko', 'ms', 'th', 'vi'],
335
+ french: ['hy', 'bn', 'fr', 'gu', 'hi', 'fa', 'pa', 'zu'],
336
+ german: ['af', 'sq', 'az', 'eu', 'bg', 'ca', 'da', 'nl', 'en', 'et', 'fi', 'ka', 'de', 'el', 'hu', 'lb', 'no', 'so', 'sw', 'sv', 'ta', 'te', 'tr', 'ur'],
337
+ irish: ['ga'],
338
+ russian: ['ru', 'uk'],
339
+ scottish: ['gd'],
340
+ spanish: ['pt-PT', 'it', 'es'],
341
+ welsh: ['cy']
342
+ };
343
+ I18n.pluralRules = {
344
+ arabic(n) {
345
+ if (n === 0) {
346
+ return 'zero';
347
+ }
348
+ if (n === 1) {
349
+ return 'one';
350
+ }
351
+ if (n === 2) {
352
+ return 'two';
353
+ }
354
+ if (n % 100 >= 3 && n % 100 <= 10) {
355
+ return 'few';
356
+ }
357
+ if (n % 100 >= 11 && n % 100 <= 99) {
358
+ return 'many';
359
+ }
360
+ return 'other';
361
+ },
362
+ chinese() {
363
+ return 'other';
364
+ },
365
+ french(n) {
366
+ return n === 0 || n === 1 ? 'one' : 'other';
367
+ },
368
+ german(n) {
369
+ return n === 1 ? 'one' : 'other';
370
+ },
371
+ irish(n) {
372
+ if (n === 1) {
373
+ return 'one';
374
+ }
375
+ if (n === 2) {
376
+ return 'two';
377
+ }
378
+ if (n >= 3 && n <= 6) {
379
+ return 'few';
380
+ }
381
+ if (n >= 7 && n <= 10) {
382
+ return 'many';
383
+ }
384
+ return 'other';
385
+ },
386
+ russian(n) {
387
+ const lastTwo = n % 100;
388
+ const last = lastTwo % 10;
389
+ if (last === 1 && lastTwo !== 11) {
390
+ return 'one';
391
+ }
392
+ if (last >= 2 && last <= 4 && !(lastTwo >= 12 && lastTwo <= 14)) {
393
+ return 'few';
394
+ }
395
+ if (last === 0 || last >= 5 && last <= 9 || lastTwo >= 11 && lastTwo <= 14) {
396
+ return 'many';
397
+ }
398
+ return 'other';
399
+ },
400
+ scottish(n) {
401
+ if (n === 1 || n === 11) {
402
+ return 'one';
403
+ }
404
+ if (n === 2 || n === 12) {
405
+ return 'two';
406
+ }
407
+ if (n >= 3 && n <= 10 || n >= 13 && n <= 19) {
408
+ return 'few';
409
+ }
410
+ return 'other';
411
+ },
412
+ spanish(n) {
413
+ if (n === 1) {
414
+ return 'one';
415
+ }
416
+ if (n % 1000000 === 0 && n !== 0) {
417
+ return 'many';
418
+ }
419
+ return 'other';
420
+ },
421
+ welsh(n) {
422
+ if (n === 0) {
423
+ return 'zero';
424
+ }
425
+ if (n === 1) {
426
+ return 'one';
427
+ }
428
+ if (n === 2) {
429
+ return 'two';
430
+ }
431
+ if (n === 3) {
432
+ return 'few';
433
+ }
434
+ if (n === 6) {
435
+ return 'many';
436
+ }
437
+ return 'other';
438
+ }
439
+ };
440
+
441
+ /**
442
+ * Accordion component
443
+ *
444
+ * This allows a collection of sections to be collapsed by default, showing only
445
+ * their headers. Sections can be expanded or collapsed individually by clicking
446
+ * their headers. A "Show all sections" button is also added to the top of the
447
+ * accordion, which switches to "Hide all sections" when all the sections are
448
+ * expanded.
449
+ *
450
+ * The state of each section is saved to the DOM via the `aria-expanded`
451
+ * attribute, which also provides accessibility.
452
+ *
453
+ * @preserve
454
+ */
455
+ class Accordion extends GOVUKFrontendComponent {
456
+ /**
457
+ * @param {Element | null} $root - HTML element to use for accordion
458
+ * @param {AccordionConfig} [config] - Accordion config
459
+ */
460
+ constructor($root, config = {}) {
461
+ super($root);
462
+ this.config = void 0;
463
+ this.i18n = void 0;
464
+ this.controlsClass = 'govuk-accordion__controls';
465
+ this.showAllClass = 'govuk-accordion__show-all';
466
+ this.showAllTextClass = 'govuk-accordion__show-all-text';
467
+ this.sectionClass = 'govuk-accordion__section';
468
+ this.sectionExpandedClass = 'govuk-accordion__section--expanded';
469
+ this.sectionButtonClass = 'govuk-accordion__section-button';
470
+ this.sectionHeaderClass = 'govuk-accordion__section-header';
471
+ this.sectionHeadingClass = 'govuk-accordion__section-heading';
472
+ this.sectionHeadingDividerClass = 'govuk-accordion__section-heading-divider';
473
+ this.sectionHeadingTextClass = 'govuk-accordion__section-heading-text';
474
+ this.sectionHeadingTextFocusClass = 'govuk-accordion__section-heading-text-focus';
475
+ this.sectionShowHideToggleClass = 'govuk-accordion__section-toggle';
476
+ this.sectionShowHideToggleFocusClass = 'govuk-accordion__section-toggle-focus';
477
+ this.sectionShowHideTextClass = 'govuk-accordion__section-toggle-text';
478
+ this.upChevronIconClass = 'govuk-accordion-nav__chevron';
479
+ this.downChevronIconClass = 'govuk-accordion-nav__chevron--down';
480
+ this.sectionSummaryClass = 'govuk-accordion__section-summary';
481
+ this.sectionSummaryFocusClass = 'govuk-accordion__section-summary-focus';
482
+ this.sectionContentClass = 'govuk-accordion__section-content';
483
+ this.$sections = void 0;
484
+ this.$showAllButton = null;
485
+ this.$showAllIcon = null;
486
+ this.$showAllText = null;
487
+ this.config = mergeConfigs(Accordion.defaults, config, normaliseDataset(Accordion, this.$root.dataset));
488
+ this.i18n = new I18n(this.config.i18n);
489
+ const $sections = this.$root.querySelectorAll(`.${this.sectionClass}`);
490
+ if (!$sections.length) {
491
+ throw new ElementError({
492
+ component: Accordion,
493
+ identifier: `Sections (\`<div class="${this.sectionClass}">\`)`
494
+ });
495
+ }
496
+ this.$sections = $sections;
497
+ this.initControls();
498
+ this.initSectionHeaders();
499
+ this.updateShowAllButton(this.areAllSectionsOpen());
500
+ }
501
+ initControls() {
502
+ this.$showAllButton = document.createElement('button');
503
+ this.$showAllButton.setAttribute('type', 'button');
504
+ this.$showAllButton.setAttribute('class', this.showAllClass);
505
+ this.$showAllButton.setAttribute('aria-expanded', 'false');
506
+ this.$showAllIcon = document.createElement('span');
507
+ this.$showAllIcon.classList.add(this.upChevronIconClass);
508
+ this.$showAllButton.appendChild(this.$showAllIcon);
509
+ const $accordionControls = document.createElement('div');
510
+ $accordionControls.setAttribute('class', this.controlsClass);
511
+ $accordionControls.appendChild(this.$showAllButton);
512
+ this.$root.insertBefore($accordionControls, this.$root.firstChild);
513
+ this.$showAllText = document.createElement('span');
514
+ this.$showAllText.classList.add(this.showAllTextClass);
515
+ this.$showAllButton.appendChild(this.$showAllText);
516
+ this.$showAllButton.addEventListener('click', () => this.onShowOrHideAllToggle());
517
+ if ('onbeforematch' in document) {
518
+ document.addEventListener('beforematch', event => this.onBeforeMatch(event));
519
+ }
520
+ }
521
+ initSectionHeaders() {
522
+ this.$sections.forEach(($section, i) => {
523
+ const $header = $section.querySelector(`.${this.sectionHeaderClass}`);
524
+ if (!$header) {
525
+ throw new ElementError({
526
+ component: Accordion,
527
+ identifier: `Section headers (\`<div class="${this.sectionHeaderClass}">\`)`
528
+ });
529
+ }
530
+ this.constructHeaderMarkup($header, i);
531
+ this.setExpanded(this.isExpanded($section), $section);
532
+ $header.addEventListener('click', () => this.onSectionToggle($section));
533
+ this.setInitialState($section);
534
+ });
535
+ }
536
+ constructHeaderMarkup($header, index) {
537
+ const $span = $header.querySelector(`.${this.sectionButtonClass}`);
538
+ const $heading = $header.querySelector(`.${this.sectionHeadingClass}`);
539
+ const $summary = $header.querySelector(`.${this.sectionSummaryClass}`);
540
+ if (!$heading) {
541
+ throw new ElementError({
542
+ component: Accordion,
543
+ identifier: `Section heading (\`.${this.sectionHeadingClass}\`)`
544
+ });
545
+ }
546
+ if (!$span) {
547
+ throw new ElementError({
548
+ component: Accordion,
549
+ identifier: `Section button placeholder (\`<span class="${this.sectionButtonClass}">\`)`
550
+ });
551
+ }
552
+ const $button = document.createElement('button');
553
+ $button.setAttribute('type', 'button');
554
+ $button.setAttribute('aria-controls', `${this.$root.id}-content-${index + 1}`);
555
+ for (const attr of Array.from($span.attributes)) {
556
+ if (attr.name !== 'id') {
557
+ $button.setAttribute(attr.name, attr.value);
558
+ }
559
+ }
560
+ const $headingText = document.createElement('span');
561
+ $headingText.classList.add(this.sectionHeadingTextClass);
562
+ $headingText.id = $span.id;
563
+ const $headingTextFocus = document.createElement('span');
564
+ $headingTextFocus.classList.add(this.sectionHeadingTextFocusClass);
565
+ $headingText.appendChild($headingTextFocus);
566
+ Array.from($span.childNodes).forEach($child => $headingTextFocus.appendChild($child));
567
+ const $showHideToggle = document.createElement('span');
568
+ $showHideToggle.classList.add(this.sectionShowHideToggleClass);
569
+ $showHideToggle.setAttribute('data-nosnippet', '');
570
+ const $showHideToggleFocus = document.createElement('span');
571
+ $showHideToggleFocus.classList.add(this.sectionShowHideToggleFocusClass);
572
+ $showHideToggle.appendChild($showHideToggleFocus);
573
+ const $showHideText = document.createElement('span');
574
+ const $showHideIcon = document.createElement('span');
575
+ $showHideIcon.classList.add(this.upChevronIconClass);
576
+ $showHideToggleFocus.appendChild($showHideIcon);
577
+ $showHideText.classList.add(this.sectionShowHideTextClass);
578
+ $showHideToggleFocus.appendChild($showHideText);
579
+ $button.appendChild($headingText);
580
+ $button.appendChild(this.getButtonPunctuationEl());
581
+ if ($summary) {
582
+ const $summarySpan = document.createElement('span');
583
+ const $summarySpanFocus = document.createElement('span');
584
+ $summarySpanFocus.classList.add(this.sectionSummaryFocusClass);
585
+ $summarySpan.appendChild($summarySpanFocus);
586
+ for (const attr of Array.from($summary.attributes)) {
587
+ $summarySpan.setAttribute(attr.name, attr.value);
588
+ }
589
+ Array.from($summary.childNodes).forEach($child => $summarySpanFocus.appendChild($child));
590
+ $summary.remove();
591
+ $button.appendChild($summarySpan);
592
+ $button.appendChild(this.getButtonPunctuationEl());
593
+ }
594
+ $button.appendChild($showHideToggle);
595
+ $heading.removeChild($span);
596
+ $heading.appendChild($button);
597
+ }
598
+ onBeforeMatch(event) {
599
+ const $fragment = event.target;
600
+ if (!($fragment instanceof Element)) {
601
+ return;
602
+ }
603
+ const $section = $fragment.closest(`.${this.sectionClass}`);
604
+ if ($section) {
605
+ this.setExpanded(true, $section);
606
+ }
607
+ }
608
+ onSectionToggle($section) {
609
+ const nowExpanded = !this.isExpanded($section);
610
+ this.setExpanded(nowExpanded, $section);
611
+ this.storeState($section, nowExpanded);
612
+ }
613
+ onShowOrHideAllToggle() {
614
+ const nowExpanded = !this.areAllSectionsOpen();
615
+ this.$sections.forEach($section => {
616
+ this.setExpanded(nowExpanded, $section);
617
+ this.storeState($section, nowExpanded);
618
+ });
619
+ this.updateShowAllButton(nowExpanded);
620
+ }
621
+ setExpanded(expanded, $section) {
622
+ const $showHideIcon = $section.querySelector(`.${this.upChevronIconClass}`);
623
+ const $showHideText = $section.querySelector(`.${this.sectionShowHideTextClass}`);
624
+ const $button = $section.querySelector(`.${this.sectionButtonClass}`);
625
+ const $content = $section.querySelector(`.${this.sectionContentClass}`);
626
+ if (!$content) {
627
+ throw new ElementError({
628
+ component: Accordion,
629
+ identifier: `Section content (\`<div class="${this.sectionContentClass}">\`)`
630
+ });
631
+ }
632
+ if (!$showHideIcon || !$showHideText || !$button) {
633
+ return;
634
+ }
635
+ const newButtonText = expanded ? this.i18n.t('hideSection') : this.i18n.t('showSection');
636
+ $showHideText.textContent = newButtonText;
637
+ $button.setAttribute('aria-expanded', `${expanded}`);
638
+ const ariaLabelParts = [];
639
+ const $headingText = $section.querySelector(`.${this.sectionHeadingTextClass}`);
640
+ if ($headingText) {
641
+ ariaLabelParts.push(`${$headingText.textContent}`.trim());
642
+ }
643
+ const $summary = $section.querySelector(`.${this.sectionSummaryClass}`);
644
+ if ($summary) {
645
+ ariaLabelParts.push(`${$summary.textContent}`.trim());
646
+ }
647
+ const ariaLabelMessage = expanded ? this.i18n.t('hideSectionAriaLabel') : this.i18n.t('showSectionAriaLabel');
648
+ ariaLabelParts.push(ariaLabelMessage);
649
+ $button.setAttribute('aria-label', ariaLabelParts.join(' , '));
650
+ if (expanded) {
651
+ $content.removeAttribute('hidden');
652
+ $section.classList.add(this.sectionExpandedClass);
653
+ $showHideIcon.classList.remove(this.downChevronIconClass);
654
+ } else {
655
+ $content.setAttribute('hidden', 'until-found');
656
+ $section.classList.remove(this.sectionExpandedClass);
657
+ $showHideIcon.classList.add(this.downChevronIconClass);
658
+ }
659
+ this.updateShowAllButton(this.areAllSectionsOpen());
660
+ }
661
+ isExpanded($section) {
662
+ return $section.classList.contains(this.sectionExpandedClass);
663
+ }
664
+ areAllSectionsOpen() {
665
+ return Array.from(this.$sections).every($section => this.isExpanded($section));
666
+ }
667
+ updateShowAllButton(expanded) {
668
+ if (!this.$showAllButton || !this.$showAllText || !this.$showAllIcon) {
669
+ return;
670
+ }
671
+ this.$showAllButton.setAttribute('aria-expanded', expanded.toString());
672
+ this.$showAllText.textContent = expanded ? this.i18n.t('hideAllSections') : this.i18n.t('showAllSections');
673
+ this.$showAllIcon.classList.toggle(this.downChevronIconClass, !expanded);
674
+ }
675
+
676
+ /**
677
+ * Get the identifier for a section
678
+ *
679
+ * We need a unique way of identifying each content in the Accordion.
680
+ * Since an `#id` should be unique and an `id` is required for `aria-`
681
+ * attributes `id` can be safely used.
682
+ *
683
+ * @param {Element} $section - Section element
684
+ * @returns {string | undefined | null} Identifier for section
685
+ */
686
+ getIdentifier($section) {
687
+ const $button = $section.querySelector(`.${this.sectionButtonClass}`);
688
+ return $button == null ? void 0 : $button.getAttribute('aria-controls');
689
+ }
690
+ storeState($section, isExpanded) {
691
+ if (!this.config.rememberExpanded) {
692
+ return;
693
+ }
694
+ const id = this.getIdentifier($section);
695
+ if (id) {
696
+ try {
697
+ window.sessionStorage.setItem(id, isExpanded.toString());
698
+ } catch (exception) {}
699
+ }
700
+ }
701
+ setInitialState($section) {
702
+ if (!this.config.rememberExpanded) {
703
+ return;
704
+ }
705
+ const id = this.getIdentifier($section);
706
+ if (id) {
707
+ try {
708
+ const state = window.sessionStorage.getItem(id);
709
+ if (state !== null) {
710
+ this.setExpanded(state === 'true', $section);
711
+ }
712
+ } catch (exception) {}
713
+ }
714
+ }
715
+ getButtonPunctuationEl() {
716
+ const $punctuationEl = document.createElement('span');
717
+ $punctuationEl.classList.add('govuk-visually-hidden', this.sectionHeadingDividerClass);
718
+ $punctuationEl.textContent = ', ';
719
+ return $punctuationEl;
720
+ }
721
+ }
722
+
723
+ /**
724
+ * Accordion config
725
+ *
726
+ * @see {@link Accordion.defaults}
727
+ * @typedef {object} AccordionConfig
728
+ * @property {AccordionTranslations} [i18n=Accordion.defaults.i18n] - Accordion translations
729
+ * @property {boolean} [rememberExpanded] - Whether the expanded and collapsed
730
+ * state of each section is remembered and restored when navigating.
731
+ */
732
+
733
+ /**
734
+ * Accordion translations
735
+ *
736
+ * @see {@link Accordion.defaults.i18n}
737
+ * @typedef {object} AccordionTranslations
738
+ *
739
+ * Messages used by the component for the labels of its buttons. This includes
740
+ * the visible text shown on screen, and text to help assistive technology users
741
+ * for the buttons toggling each section.
742
+ * @property {string} [hideAllSections] - The text content for the 'Hide all
743
+ * sections' button, used when at least one section is expanded.
744
+ * @property {string} [hideSection] - The text content for the 'Hide'
745
+ * button, used when a section is expanded.
746
+ * @property {string} [hideSectionAriaLabel] - The text content appended to the
747
+ * 'Hide' button's accessible name when a section is expanded.
748
+ * @property {string} [showAllSections] - The text content for the 'Show all
749
+ * sections' button, used when all sections are collapsed.
750
+ * @property {string} [showSection] - The text content for the 'Show'
751
+ * button, used when a section is collapsed.
752
+ * @property {string} [showSectionAriaLabel] - The text content appended to the
753
+ * 'Show' button's accessible name when a section is expanded.
754
+ */
755
+
756
+ /**
757
+ * @typedef {import('../../common/index.mjs').Schema} Schema
758
+ */
759
+ Accordion.moduleName = 'govuk-accordion';
760
+ Accordion.defaults = Object.freeze({
761
+ i18n: {
762
+ hideAllSections: 'Hide all sections',
763
+ hideSection: 'Hide',
764
+ hideSectionAriaLabel: 'Hide this section',
765
+ showAllSections: 'Show all sections',
766
+ showSection: 'Show',
767
+ showSectionAriaLabel: 'Show this section'
768
+ },
769
+ rememberExpanded: true
770
+ });
771
+ Accordion.schema = Object.freeze({
772
+ properties: {
773
+ i18n: {
774
+ type: 'object'
775
+ },
776
+ rememberExpanded: {
777
+ type: 'boolean'
778
+ }
779
+ }
780
+ });
781
+
782
+ exports.Accordion = Accordion;
783
+
784
+ }));
785
+ //# sourceMappingURL=accordion.bundle.js.map