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