@ons/design-system 70.0.7 → 70.0.9

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 (454) hide show
  1. package/README.md +11 -17
  2. package/components/access-code/_macro.njk +31 -25
  3. package/components/access-code/_macro.spec.js +145 -145
  4. package/components/access-code/access-code.dom.js +5 -5
  5. package/components/access-code/access-code.js +16 -16
  6. package/components/access-code/access-code.scss +22 -22
  7. package/components/access-code/access-code.spec.js +17 -17
  8. package/components/access-code/example-access-code-error.njk +49 -37
  9. package/components/access-code/example-access-code.njk +40 -30
  10. package/components/accordion/_macro.njk +7 -6
  11. package/components/accordion/_macro.spec.js +154 -154
  12. package/components/accordion/accordion.dom.js +10 -10
  13. package/components/accordion/accordion.js +50 -50
  14. package/components/accordion/accordion.spec.js +104 -104
  15. package/components/accordion/example-accordion-open.njk +0 -1
  16. package/components/address-input/_macro.njk +23 -11
  17. package/components/address-input/_macro.spec.js +420 -420
  18. package/components/address-input/autosuggest.address.dom.js +5 -5
  19. package/components/address-input/autosuggest.address.error.js +77 -77
  20. package/components/address-input/autosuggest.address.js +354 -359
  21. package/components/address-input/autosuggest.address.setter.js +95 -95
  22. package/components/address-input/autosuggest.address.spec.js +668 -651
  23. package/components/address-input/example-address-input-editable.njk +52 -50
  24. package/components/address-input/example-address-input-manual.njk +23 -21
  25. package/components/address-input/example-address-input.njk +40 -38
  26. package/components/address-output/_address-output.scss +3 -3
  27. package/components/address-output/_macro.njk +6 -6
  28. package/components/address-output/_macro.spec.js +84 -84
  29. package/components/autosuggest/_autosuggest.scss +114 -114
  30. package/components/autosuggest/_macro.njk +57 -37
  31. package/components/autosuggest/_macro.spec.js +255 -255
  32. package/components/autosuggest/autosuggest.dom.js +5 -5
  33. package/components/autosuggest/autosuggest.helpers.js +11 -11
  34. package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
  35. package/components/autosuggest/autosuggest.js +20 -20
  36. package/components/autosuggest/autosuggest.spec.js +542 -536
  37. package/components/autosuggest/autosuggest.ui.js +478 -475
  38. package/components/autosuggest/example-autosuggest-country-multiple.njk +26 -26
  39. package/components/autosuggest/example-autosuggest-country.njk +24 -24
  40. package/components/autosuggest/fuse-config.js +17 -17
  41. package/components/back-to-top/_back-to-top.scss +27 -27
  42. package/components/back-to-top/_macro.spec.js +49 -49
  43. package/components/back-to-top/back-to-top.dom.js +5 -5
  44. package/components/back-to-top/back-to-top.js +52 -52
  45. package/components/back-to-top/back-to-top.spec.js +106 -106
  46. package/components/back-to-top/example-back-to-top.njk +183 -6
  47. package/components/back-to-top/example-full-page-back-to-top.njk +135 -123
  48. package/components/breadcrumbs/_breadcrumbs.scss +63 -65
  49. package/components/breadcrumbs/_macro.njk +12 -4
  50. package/components/breadcrumbs/_macro.spec.js +91 -91
  51. package/components/browser-banner/_browser-banner.scss +23 -23
  52. package/components/browser-banner/_macro.njk +6 -3
  53. package/components/browser-banner/_macro.spec.js +92 -92
  54. package/components/button/_button.scss +525 -491
  55. package/components/button/_macro.njk +63 -62
  56. package/components/button/_macro.spec.js +363 -363
  57. package/components/button/button.dom.js +15 -15
  58. package/components/button/button.js +53 -53
  59. package/components/button/button.spec.js +248 -240
  60. package/components/button/example-button-ghost.njk +1 -0
  61. package/components/call-to-action/_call-to-action.scss +5 -5
  62. package/components/call-to-action/_macro.njk +7 -5
  63. package/components/call-to-action/_macro.spec.js +28 -28
  64. package/components/call-to-action/example-call-to-action-default.njk +3 -2
  65. package/components/card/_card.scss +23 -23
  66. package/components/card/_macro.njk +26 -10
  67. package/components/card/_macro.spec.js +180 -180
  68. package/components/card/example-card-set-with-images.njk +31 -29
  69. package/components/card/example-card-set-with-lists.njk +58 -56
  70. package/components/card/example-card-set.njk +28 -26
  71. package/components/card/example-card.njk +9 -7
  72. package/components/char-check-limit/_macro.njk +1 -3
  73. package/components/char-check-limit/_macro.spec.js +48 -48
  74. package/components/char-check-limit/character-check.js +58 -58
  75. package/components/char-check-limit/character-check.spec.js +173 -173
  76. package/components/char-check-limit/character-limit.js +40 -40
  77. package/components/checkboxes/_checkbox-macro.njk +19 -15
  78. package/components/checkboxes/_checkbox-macro.spec.js +355 -355
  79. package/components/checkboxes/_checkbox.scss +180 -180
  80. package/components/checkboxes/_checkboxes.scss +37 -27
  81. package/components/checkboxes/_macro.njk +81 -72
  82. package/components/checkboxes/_macro.spec.js +261 -261
  83. package/components/checkboxes/checkbox-with-autoselect.js +32 -32
  84. package/components/checkboxes/checkbox-with-fieldset.js +21 -21
  85. package/components/checkboxes/checkboxes-with-reveal.js +10 -10
  86. package/components/checkboxes/checkboxes.dom.js +27 -27
  87. package/components/checkboxes/checkboxes.spec.js +183 -183
  88. package/components/checkboxes/example-checkboxes-disabled.njk +30 -30
  89. package/components/checkboxes/example-checkboxes-error.njk +0 -1
  90. package/components/checkboxes/example-checkboxes-with-descriptions.njk +7 -5
  91. package/components/checkboxes/example-checkboxes-with-hidden-label.njk +162 -170
  92. package/components/checkboxes/example-checkboxes-with-revealed-checkboxes-expanded.njk +81 -81
  93. package/components/checkboxes/example-checkboxes-with-revealed-checkboxes.njk +79 -79
  94. package/components/checkboxes/example-checkboxes-with-revealed-select-expanded.njk +7 -5
  95. package/components/checkboxes/example-checkboxes-with-revealed-select.njk +7 -5
  96. package/components/checkboxes/example-checkboxes-with-revealed-text-input-expanded.njk +7 -5
  97. package/components/checkboxes/example-checkboxes-with-revealed-text-input.njk +7 -5
  98. package/components/checkboxes/example-checkboxes-with-select-all-button.njk +7 -5
  99. package/components/checkboxes/example-checkboxes-with-visible-text-input.njk +7 -5
  100. package/components/checkboxes/example-checkboxes.njk +7 -5
  101. package/components/content-pagination/_content-pagination.scss +41 -41
  102. package/components/content-pagination/_macro.njk +34 -32
  103. package/components/content-pagination/_macro.spec.js +159 -159
  104. package/components/content-pagination/example-content-pagination.njk +17 -17
  105. package/components/cookies-banner/_cookies-banner.scss +22 -22
  106. package/components/cookies-banner/_macro.njk +19 -6
  107. package/components/cookies-banner/_macro.spec.js +177 -177
  108. package/components/cookies-banner/cookies-banner.dom.js +7 -7
  109. package/components/cookies-banner/cookies-banner.js +76 -76
  110. package/components/cookies-banner/cookies-banner.spec.js +72 -68
  111. package/components/cookies-banner/example-cookies-banner-cymraeg.njk +2 -1
  112. package/components/cookies-banner/example-cookies-banner.njk +3 -4
  113. package/components/date-input/_macro.njk +71 -63
  114. package/components/date-input/_macro.spec.js +338 -338
  115. package/components/date-input/example-date-input-error-for-single-field.njk +0 -1
  116. package/components/date-input/example-date-input-error.njk +0 -1
  117. package/components/description-list/_description-list.scss +23 -23
  118. package/components/description-list/_macro.njk +20 -11
  119. package/components/description-list/_macro.spec.js +144 -144
  120. package/components/details/_details.scss +109 -109
  121. package/components/details/_macro.njk +18 -11
  122. package/components/details/_macro.spec.js +132 -132
  123. package/components/details/details.dom.js +6 -6
  124. package/components/details/details.js +60 -60
  125. package/components/details/details.spec.js +106 -106
  126. package/components/details/example-details-with-warning.njk +15 -10
  127. package/components/document-list/_macro.njk +102 -93
  128. package/components/document-list/_macro.spec.js +444 -444
  129. package/components/document-list/document-list.scss +145 -149
  130. package/components/document-list/example-document-list-article-featured.njk +27 -25
  131. package/components/document-list/example-document-list-articles.njk +55 -53
  132. package/components/document-list/example-document-list-downloads.njk +49 -47
  133. package/components/document-list/example-document-list-search-result-featured.njk +19 -17
  134. package/components/document-list/example-document-list-search-results.njk +60 -58
  135. package/components/download-resources/_download-resources.scss +109 -108
  136. package/components/download-resources/download-resources.js +907 -900
  137. package/components/download-resources/download-resources.spec.js +461 -461
  138. package/components/duration/_macro.njk +61 -55
  139. package/components/duration/_macro.spec.js +291 -291
  140. package/components/duration/example-duration-error-for-single-field.njk +28 -26
  141. package/components/duration/example-duration-single-field.njk +23 -19
  142. package/components/duration/example-duration.njk +33 -29
  143. package/components/error/_macro.njk +8 -6
  144. package/components/error/_macro.spec.js +72 -72
  145. package/components/external-link/_external-link.scss +19 -19
  146. package/components/external-link/_macro.njk +7 -5
  147. package/components/external-link/_macro.spec.js +68 -68
  148. package/components/external-link/example-external-link.njk +9 -6
  149. package/components/feedback/_feedback.scss +31 -31
  150. package/components/feedback/_macro.njk +7 -5
  151. package/components/feedback/_macro.spec.js +72 -72
  152. package/components/field/_field-group.scss +10 -10
  153. package/components/field/_field.scss +16 -16
  154. package/components/field/_macro.njk +2 -2
  155. package/components/field/_macro.spec.js +80 -80
  156. package/components/fieldset/_fieldset.scss +27 -27
  157. package/components/fieldset/_macro.njk +23 -16
  158. package/components/fieldset/_macro.spec.js +161 -161
  159. package/components/footer/_footer.scss +45 -45
  160. package/components/footer/_macro.njk +28 -21
  161. package/components/footer/_macro.spec.js +452 -452
  162. package/components/footer/example-footer-cymraeg.njk +2 -1
  163. package/components/footer/example-footer-default.njk +3 -4
  164. package/components/footer/example-footer-transactional.njk +2 -1
  165. package/components/footer/example-footer-warning.njk +2 -1
  166. package/components/footer/example-footer-with-alternative-organisation.njk +2 -1
  167. package/components/footer/example-footer-with-coat-of-arms.njk +2 -1
  168. package/components/footer/example-footer-with-copyright.njk +2 -1
  169. package/components/footer/example-footer.njk +2 -1
  170. package/components/header/_header.scss +207 -202
  171. package/components/header/_macro.njk +183 -141
  172. package/components/header/_macro.spec.js +833 -829
  173. package/components/header/example-header-default.njk +2 -1
  174. package/components/header/example-header-external-for-survey-with-description.njk +2 -1
  175. package/components/header/example-header-external-for-surveys.njk +2 -1
  176. package/components/header/example-header-external-welsh.njk +7 -7
  177. package/components/header/example-header-external-with-navigation-and-search.njk +3 -2
  178. package/components/header/example-header-external-with-navigation.njk +2 -1
  179. package/components/header/example-header-external-with-service-links.njk +2 -1
  180. package/components/header/example-header-external-with-sub-navigation-removed.njk +2 -1
  181. package/components/header/example-header-external-with-sub-navigation.njk +3 -2
  182. package/components/header/example-header-internal.njk +2 -1
  183. package/components/header/example-header-multiple-logos.njk +2 -1
  184. package/components/header/{example-header-neutral-for-multicoloured-logo.njk → example-header-neutral.njk} +2 -1
  185. package/components/helpers/_grid.scss +4 -4
  186. package/components/helpers/grid.njk +17 -16
  187. package/components/hero/_hero.scss +48 -48
  188. package/components/hero/_macro.njk +6 -11
  189. package/components/hero/_macro.spec.js +59 -59
  190. package/components/hero/example-hero-dark.njk +2 -1
  191. package/components/hero/example-hero-default.njk +2 -1
  192. package/components/icon/_icon.scss +44 -44
  193. package/components/icon/_macro.njk +601 -168
  194. package/components/icon/_macro.spec.js +110 -110
  195. package/components/image/_image.scss +11 -11
  196. package/components/image/_macro.njk +7 -5
  197. package/components/image/_macro.spec.js +81 -81
  198. package/components/input/_input-type.scss +86 -89
  199. package/components/input/_input.scss +123 -124
  200. package/components/input/_macro.njk +114 -95
  201. package/components/input/_macro.spec.js +604 -604
  202. package/components/input/character-check.dom.js +5 -5
  203. package/components/input/example-input-search-with-character-check.njk +1 -1
  204. package/components/input/example-input-search-with-placeholder.njk +1 -1
  205. package/components/input/example-input-search.njk +1 -1
  206. package/components/input/input.dom.js +5 -5
  207. package/components/input/input.js +10 -10
  208. package/components/input/input.spec.js +18 -18
  209. package/components/label/_label.scss +24 -24
  210. package/components/label/_macro.njk +32 -26
  211. package/components/label/_macro.spec.js +173 -170
  212. package/components/language-selector/_macro.njk +11 -2
  213. package/components/language-selector/_macro.spec.js +97 -97
  214. package/components/language-selector/language.scss +7 -7
  215. package/components/list/_list.scss +110 -97
  216. package/components/list/_macro.njk +93 -73
  217. package/components/list/_macro.spec.js +583 -583
  218. package/components/message/_macro.njk +20 -7
  219. package/components/message/_macro.spec.js +74 -74
  220. package/components/message/_message.scss +39 -39
  221. package/components/message-list/_macro.njk +26 -20
  222. package/components/message-list/_macro.spec.js +86 -86
  223. package/components/message-list/_message-list.scss +16 -16
  224. package/components/modal/_macro.njk +11 -12
  225. package/components/modal/_macro.spec.js +69 -69
  226. package/components/modal/_modal.scss +36 -36
  227. package/components/modal/modal.dom.js +6 -6
  228. package/components/modal/modal.js +89 -89
  229. package/components/modal/modal.spec.js +50 -50
  230. package/components/multiple-input-fields/_macro.njk +30 -28
  231. package/components/mutually-exclusive/_macro.njk +20 -13
  232. package/components/mutually-exclusive/_macro.spec.js +140 -140
  233. package/components/mutually-exclusive/example-mutually-exclusive-checkboxes.njk +6 -4
  234. package/components/mutually-exclusive/example-mutually-exclusive-date.njk +7 -5
  235. package/components/mutually-exclusive/example-mutually-exclusive-duration.njk +44 -40
  236. package/components/mutually-exclusive/example-mutually-exclusive-email.njk +7 -5
  237. package/components/mutually-exclusive/example-mutually-exclusive-multiple-options.njk +6 -4
  238. package/components/mutually-exclusive/example-mutually-exclusive-number.njk +6 -4
  239. package/components/mutually-exclusive/example-mutually-exclusive-textarea.njk +6 -4
  240. package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
  241. package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
  242. package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
  243. package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
  244. package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
  245. package/components/mutually-exclusive/mutually-exclusive.js +137 -137
  246. package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
  247. package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
  248. package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
  249. package/components/navigation/_macro.njk +133 -67
  250. package/components/navigation/_macro.spec.js +360 -354
  251. package/components/navigation/_navigation.scss +112 -122
  252. package/components/navigation/navigation.dom.js +35 -35
  253. package/components/navigation/navigation.js +49 -49
  254. package/components/navigation/navigation.spec.js +249 -249
  255. package/components/pagination/_macro.njk +42 -20
  256. package/components/pagination/_macro.spec.js +342 -335
  257. package/components/pagination/_pagination.scss +58 -58
  258. package/components/panel/_macro.njk +27 -16
  259. package/components/panel/_macro.spec.js +372 -372
  260. package/components/panel/_panel.scss +200 -199
  261. package/components/panel/example-panel-bare.njk +6 -4
  262. package/components/panel/example-panel-with-announcement.njk +7 -4
  263. package/components/panel/example-panel-with-error-summary.njk +6 -4
  264. package/components/panel/example-panel-with-warning.njk +5 -3
  265. package/components/password/_macro.njk +7 -5
  266. package/components/password/_macro.spec.js +95 -95
  267. package/components/password/password.dom.js +5 -5
  268. package/components/password/password.js +10 -10
  269. package/components/password/password.spec.js +26 -26
  270. package/components/phase-banner/_macro.njk +3 -3
  271. package/components/phase-banner/_macro.spec.js +86 -86
  272. package/components/phase-banner/_phase-banner.scss +16 -16
  273. package/components/phase-banner/example-phase-banner-alpha.njk +2 -1
  274. package/components/phase-banner/example-phase-banner-beta.njk +4 -3
  275. package/components/question/_macro.njk +62 -47
  276. package/components/question/_macro.spec.js +235 -235
  277. package/components/question/_question.scss +24 -24
  278. package/components/question/example-question-ccs.njk +40 -35
  279. package/components/question/example-question-fieldset.njk +84 -80
  280. package/components/question/example-question-interviewer-note.njk +27 -24
  281. package/components/question/example-question-no-fieldset.njk +39 -33
  282. package/components/quote/_macro.njk +3 -1
  283. package/components/quote/_macro.spec.js +52 -52
  284. package/components/quote/_quote.scss +24 -24
  285. package/components/radios/_macro.njk +54 -36
  286. package/components/radios/_macro.spec.js +545 -524
  287. package/components/radios/_radio.scss +49 -48
  288. package/components/radios/_radios.scss +14 -20
  289. package/components/radios/check-radios.js +21 -21
  290. package/components/radios/clear-radios.js +45 -45
  291. package/components/radios/example-radios-with-clear-button-expanded.njk +6 -4
  292. package/components/radios/example-radios-with-clear-button.njk +6 -4
  293. package/components/radios/example-radios-with-descriptions.njk +7 -5
  294. package/components/radios/example-radios-with-revealed-select-expanded.njk +6 -4
  295. package/components/radios/example-radios-with-revealed-select.njk +6 -4
  296. package/components/radios/example-radios-with-revealed-text-area-expanded.njk +7 -5
  297. package/components/radios/example-radios-with-revealed-text-area.njk +7 -5
  298. package/components/radios/example-radios-with-revealed-text-input-expanded.njk +7 -5
  299. package/components/radios/example-radios-with-revealed-text-input.njk +7 -5
  300. package/components/radios/example-radios-with-separator.njk +6 -4
  301. package/components/radios/example-radios-with-visible-text-input.njk +7 -5
  302. package/components/radios/example-radios-without-border.njk +0 -1
  303. package/components/radios/example-radios.njk +7 -5
  304. package/components/radios/radio-with-fieldset.js +22 -22
  305. package/components/radios/radios.dom.js +32 -32
  306. package/components/radios/radios.spec.js +251 -251
  307. package/components/related-content/_macro.njk +10 -11
  308. package/components/related-content/_macro.spec.js +109 -109
  309. package/components/related-content/_related-content.scss +12 -12
  310. package/components/related-content/_section-macro.njk +7 -7
  311. package/components/related-content/_section-macro.spec.js +20 -20
  312. package/components/related-content/example-related-content-general.njk +5 -3
  313. package/components/related-content/example-related-content-multiple-rows-of-links.njk +51 -49
  314. package/components/related-content/example-related-content-social-media.njk +40 -38
  315. package/components/relationships/_macro.njk +10 -8
  316. package/components/relationships/_macro.spec.js +94 -94
  317. package/components/relationships/_relationships.scss +9 -9
  318. package/components/relationships/example-relationships-error.njk +176 -168
  319. package/components/relationships/example-relationships-you.njk +169 -163
  320. package/components/relationships/example-relationships.njk +167 -161
  321. package/components/relationships/relationships.dom.js +5 -5
  322. package/components/relationships/relationships.js +18 -18
  323. package/components/relationships/relationships.spec.js +71 -71
  324. package/components/reply/_macro.spec.js +47 -47
  325. package/components/reply/reply-input.js +15 -15
  326. package/components/reply/reply.dom.js +5 -5
  327. package/components/reply/reply.spec.js +57 -57
  328. package/components/section-navigation/_macro.njk +34 -12
  329. package/components/section-navigation/_macro.spec.js +210 -210
  330. package/components/section-navigation/_section-navigation.scss +76 -76
  331. package/components/select/_macro.njk +21 -18
  332. package/components/select/_macro.spec.js +166 -166
  333. package/components/share-page/_macro.njk +10 -5
  334. package/components/share-page/_macro.spec.js +68 -68
  335. package/components/skip-to-content/_macro.njk +1 -1
  336. package/components/skip-to-content/_macro.spec.js +54 -54
  337. package/components/skip-to-content/_skip.scss +30 -30
  338. package/components/skip-to-content/example-skip-to-content.njk +1 -0
  339. package/components/skip-to-content/skip-to-content.dom.js +6 -6
  340. package/components/skip-to-content/skip-to-content.js +7 -7
  341. package/components/skip-to-content/skip-to-content.spec.js +21 -21
  342. package/components/status/_macro.njk +1 -1
  343. package/components/status/_macro.spec.js +53 -53
  344. package/components/status/_status.scss +32 -32
  345. package/components/summary/_macro.njk +53 -23
  346. package/components/summary/_macro.spec.js +551 -535
  347. package/components/summary/_summary.scss +191 -195
  348. package/components/summary/example-summary-household-no-rows.njk +18 -16
  349. package/components/summary/example-summary-household.njk +75 -73
  350. package/components/summary/example-summary-hub-minimal.njk +74 -72
  351. package/components/summary/example-summary-hub.njk +169 -167
  352. package/components/table/_macro.njk +72 -45
  353. package/components/table/_macro.spec.js +499 -499
  354. package/components/table/_table.scss +204 -201
  355. package/components/table/scrollable-table.dom.js +5 -5
  356. package/components/table/scrollable-table.js +60 -60
  357. package/components/table/sortable-table.dom.js +5 -5
  358. package/components/table/sortable-table.js +135 -135
  359. package/components/table/table.spec.js +144 -140
  360. package/components/table-of-contents/_macro.njk +34 -32
  361. package/components/table-of-contents/_macro.spec.js +125 -125
  362. package/components/table-of-contents/_toc.scss +9 -9
  363. package/components/table-of-contents/example-table-of-contents-grouped.njk +1 -1
  364. package/components/table-of-contents/example-table-of-contents-single.njk +1 -1
  365. package/components/table-of-contents/example-table-of-contents-sticky-full-page.njk +79 -38
  366. package/components/table-of-contents/example-table-of-contents-sticky.njk +50 -13
  367. package/components/table-of-contents/toc.dom.js +5 -5
  368. package/components/table-of-contents/toc.js +30 -30
  369. package/components/table-of-contents/toc.spec.js +88 -88
  370. package/components/tabs/_macro.njk +12 -6
  371. package/components/tabs/_macro.spec.js +92 -92
  372. package/components/tabs/_tabs.scss +120 -115
  373. package/components/tabs/example-tabs-details.njk +5 -6
  374. package/components/tabs/tabs.dom.js +5 -5
  375. package/components/tabs/tabs.js +266 -266
  376. package/components/tabs/tabs.spec.js +268 -268
  377. package/components/text-indent/_macro.njk +1 -3
  378. package/components/text-indent/_macro.spec.js +33 -33
  379. package/components/text-indent/_text-indent.scss +3 -3
  380. package/components/textarea/_macro.njk +49 -46
  381. package/components/textarea/_macro.spec.js +227 -238
  382. package/components/textarea/textarea.dom.js +5 -5
  383. package/components/textarea/textarea.spec.js +78 -74
  384. package/components/timeline/_macro.njk +4 -6
  385. package/components/timeline/_macro.spec.js +83 -83
  386. package/components/timeline/_timeline.scss +26 -26
  387. package/components/timeout-modal/_macro.njk +21 -19
  388. package/components/timeout-modal/_macro.spec.js +47 -47
  389. package/components/timeout-modal/example-timeout-modal.njk +16 -14
  390. package/components/timeout-modal/timeout-modal.dom.js +9 -9
  391. package/components/timeout-modal/timeout-modal.js +66 -66
  392. package/components/timeout-modal/timeout-modal.spec.js +157 -157
  393. package/components/timeout-panel/_macro.njk +19 -17
  394. package/components/timeout-panel/_macro.spec.js +41 -41
  395. package/components/timeout-panel/example-panel-with-timeout-warning.njk +13 -11
  396. package/components/timeout-panel/timeout-panel.dom.js +8 -8
  397. package/components/timeout-panel/timeout-panel.spec.js +118 -118
  398. package/components/upload/_macro.njk +20 -16
  399. package/components/upload/_macro.spec.js +52 -52
  400. package/components/upload/_upload.scss +28 -28
  401. package/components/video/_macro.njk +16 -2
  402. package/components/video/_macro.spec.js +42 -42
  403. package/components/video/_video.scss +16 -16
  404. package/components/video/example-video.njk +2 -2
  405. package/components/video/video.dom.js +5 -5
  406. package/components/video/video.js +32 -32
  407. package/components/video/video.spec.js +103 -97
  408. package/css/main.css +1 -1
  409. package/favicons/manifest.json +25 -25
  410. package/js/abortable-fetch.js +23 -23
  411. package/js/analytics.js +53 -53
  412. package/js/cookies-functions.js +135 -135
  413. package/js/cookies-settings.dom.js +7 -7
  414. package/js/cookies-settings.js +77 -77
  415. package/js/cookies-settings.spec.js +106 -106
  416. package/js/domready.js +8 -8
  417. package/js/fetch.js +14 -14
  418. package/js/inpagelink.dom.js +5 -5
  419. package/js/inpagelink.js +19 -19
  420. package/js/polyfills.js +0 -1
  421. package/js/print-button.js +6 -6
  422. package/js/timeout.js +211 -211
  423. package/layout/_dsTemplate.njk +22 -20
  424. package/layout/_template.njk +63 -51
  425. package/package.json +132 -128
  426. package/scripts/main.es5.js +1 -1
  427. package/scripts/main.js +1 -1
  428. package/scss/base/_forms.scss +10 -10
  429. package/scss/base/_global.scss +45 -44
  430. package/scss/base/_typography.scss +20 -20
  431. package/scss/helpers/_functions.scss +18 -15
  432. package/scss/helpers/_mixins.scss +59 -53
  433. package/scss/helpers/_mq.scss +62 -65
  434. package/scss/objects/_container.scss +20 -20
  435. package/scss/objects/_page.scss +33 -33
  436. package/scss/objects/_spacing.scss +10 -10
  437. package/scss/overrides/hcm.scss +237 -237
  438. package/scss/overrides/rtl.scss +95 -95
  439. package/scss/print.scss +47 -47
  440. package/scss/utilities/_border.scss +7 -7
  441. package/scss/utilities/_colors.scss +6 -6
  442. package/scss/utilities/_display.scss +8 -8
  443. package/scss/utilities/_float.scss +7 -7
  444. package/scss/utilities/_grid.scss +144 -144
  445. package/scss/utilities/_highlight.scss +4 -4
  446. package/scss/utilities/_margin.scss +17 -17
  447. package/scss/utilities/_pad.scss +15 -15
  448. package/scss/utilities/_typography.scss +35 -33
  449. package/scss/utilities/_utilities.scss +8 -8
  450. package/scss/utilities/_visibility.scss +25 -25
  451. package/scss/vars/_colors.scss +116 -116
  452. package/scss/vars/_forms.scss +22 -22
  453. package/scss/vars/_grid.scss +11 -9
  454. package/scss/vars/_typography.scss +54 -54
@@ -7,566 +7,566 @@ import { mapAll } from '../../tests/helpers/cheerio';
7
7
  import { renderComponent, templateFaker } from '../../tests/helpers/rendering';
8
8
 
9
9
  const EXAMPLE_OGL_LINK_PARAM = {
10
- pre: 'All content is available under the',
11
- link: 'Open Government Licence v3.0',
12
- url: 'https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/',
13
- post: ', except where otherwise stated',
10
+ pre: 'All content is available under the',
11
+ link: 'Open Government Licence v3.0',
12
+ url: 'https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/',
13
+ post: ', except where otherwise stated',
14
14
  };
15
15
 
16
16
  const EXAMPLE_COLS_PARAM = [
17
- {
18
- title: 'First column',
19
- itemsList: [
20
- {
21
- url: '/example-link-a',
22
- text: 'Example Link A',
23
- },
24
- ],
25
- },
26
- {
27
- title: 'Second column',
28
- itemsList: [
29
- {
30
- url: '/example-link-b',
31
- text: 'Example Link B',
32
- },
33
- ],
34
- },
17
+ {
18
+ title: 'First column',
19
+ itemsList: [
20
+ {
21
+ url: '/example-link-a',
22
+ text: 'Example Link A',
23
+ },
24
+ ],
25
+ },
26
+ {
27
+ title: 'Second column',
28
+ itemsList: [
29
+ {
30
+ url: '/example-link-b',
31
+ text: 'Example Link B',
32
+ },
33
+ ],
34
+ },
35
35
  ];
36
36
 
37
37
  const EXAMPLE_ROWS_PARAM = [
38
- {
39
- itemsList: [
40
- {
41
- url: '/example-link-a',
42
- text: 'Example Link A',
43
- },
44
- ],
45
- },
46
- {
47
- itemsList: [
48
- {
49
- url: '/example-link-b',
50
- text: 'Example Link B',
51
- },
52
- ],
53
- },
38
+ {
39
+ itemsList: [
40
+ {
41
+ url: '/example-link-a',
42
+ text: 'Example Link A',
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ itemsList: [
48
+ {
49
+ url: '/example-link-b',
50
+ text: 'Example Link B',
51
+ },
52
+ ],
53
+ },
54
54
  ];
55
55
 
56
56
  const EXAMPLE_LEGAL_PARAM = [
57
- {
58
- itemsList: [
59
- {
60
- url: '/example-legal-link-a',
61
- text: 'Example Legal Link A',
62
- },
63
- ],
64
- },
65
- {
66
- itemsList: [
67
- {
68
- url: '/example-legal-link-b',
69
- text: 'Example Legal Link B',
70
- },
71
- ],
72
- },
57
+ {
58
+ itemsList: [
59
+ {
60
+ url: '/example-legal-link-a',
61
+ text: 'Example Legal Link A',
62
+ },
63
+ ],
64
+ },
65
+ {
66
+ itemsList: [
67
+ {
68
+ url: '/example-legal-link-b',
69
+ text: 'Example Legal Link B',
70
+ },
71
+ ],
72
+ },
73
73
  ];
74
74
 
75
75
  describe('macro: footer', () => {
76
- it('decorates container block with `wide` modifier when the `wide` parameter is provided', () => {
77
- const $ = cheerio.load(
78
- renderComponent('footer', {
79
- wide: true,
80
- }),
81
- );
82
-
83
- const hasClass = $('.ons-container').hasClass('ons-container--wide');
84
- expect(hasClass).toBe(true);
85
- });
86
-
87
- it('does not decorate container block with `wide` modifier when the `wide` parameter is not provided', () => {
88
- const $ = cheerio.load(renderComponent('footer', {}));
89
-
90
- const hasClass = $('.ons-container').hasClass('ons-container--wide');
91
- expect(hasClass).toBe(false);
92
- });
93
-
94
- it('decorates container block with `fullWidth` modifier when the `fullWidth` parameter is provided', () => {
95
- const $ = cheerio.load(
96
- renderComponent('footer', {
97
- fullWidth: true,
98
- }),
99
- );
100
-
101
- const hasClass = $('.ons-container').hasClass('ons-container--full-width');
102
- expect(hasClass).toBe(true);
103
- });
104
-
105
- it('does not decorate container block with `fullWidth` modifier when the `fullWidth` parameter is not provided', () => {
106
- const $ = cheerio.load(renderComponent('footer', {}));
107
-
108
- const hasClass = $('.ons-container').hasClass('ons-container--full-width');
109
- expect(hasClass).toBe(false);
110
- });
111
-
112
- it('has additionally provided `attributes` on the `body` element', () => {
113
- const $ = cheerio.load(
114
- renderComponent('footer', {
115
- attributes: {
116
- a: '123',
117
- b: '456',
118
- },
119
- }),
120
- );
121
-
122
- expect($('.ons-footer__body').attr('a')).toBe('123');
123
- expect($('.ons-footer__body').attr('b')).toBe('456');
124
- });
125
-
126
- describe('OGL link', () => {
127
- const params = {
128
- OGLLink: EXAMPLE_OGL_LINK_PARAM,
129
- };
130
-
131
- it('passes jest-axe checks', async () => {
132
- const $ = cheerio.load(renderComponent('footer', params));
133
-
134
- const results = await axe($.html());
135
- expect(results).toHaveNoViolations();
136
- });
76
+ it('decorates container block with `wide` modifier when the `wide` parameter is provided', () => {
77
+ const $ = cheerio.load(
78
+ renderComponent('footer', {
79
+ wide: true,
80
+ }),
81
+ );
137
82
 
138
- it('renders OGL icon', () => {
139
- const faker = templateFaker();
140
- const iconsSpy = faker.spy('icon');
141
-
142
- faker.renderComponent('footer', params);
143
-
144
- expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining({ iconType: 'ogl' }));
145
- });
146
-
147
- it('renders raw HTML when `HTML` is provided', () => {
148
- const $ = cheerio.load(
149
- renderComponent('footer', {
150
- OGLLink: {
151
- ...params.OGLLink,
152
- HTML: '<strong>Bold text.</strong>',
153
- },
154
- }),
155
- );
156
-
157
- const licenseHtml = $('.ons-footer__license').html();
158
- expect(licenseHtml).toContain('<strong>Bold text.</strong>');
83
+ const hasClass = $('.ons-container').hasClass('ons-container--wide');
84
+ expect(hasClass).toBe(true);
159
85
  });
160
86
 
161
- it('renders link using the external link component', () => {
162
- const faker = templateFaker();
163
- const externalLinkSpy = faker.spy('external-link');
87
+ it('does not decorate container block with `wide` modifier when the `wide` parameter is not provided', () => {
88
+ const $ = cheerio.load(renderComponent('footer', {}));
164
89
 
165
- faker.renderComponent('footer', params);
166
-
167
- expect(externalLinkSpy.occurrences).toContainEqual(
168
- expect.objectContaining({
169
- url: 'https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/',
170
- linkText: 'Open Government Licence v3.0',
171
- }),
172
- );
90
+ const hasClass = $('.ons-container').hasClass('ons-container--wide');
91
+ expect(hasClass).toBe(false);
173
92
  });
174
93
 
175
- it('renders `post` content when provided', () => {
176
- const $ = cheerio.load(renderComponent('footer', params));
94
+ it('decorates container block with `fullWidth` modifier when the `fullWidth` parameter is provided', () => {
95
+ const $ = cheerio.load(
96
+ renderComponent('footer', {
97
+ fullWidth: true,
98
+ }),
99
+ );
177
100
 
178
- const licenseHtml = $('.ons-footer__license').html();
179
- expect(licenseHtml).toContain(', except where otherwise stated');
101
+ const hasClass = $('.ons-container').hasClass('ons-container--full-width');
102
+ expect(hasClass).toBe(true);
180
103
  });
181
104
 
182
- it('renders welsh `post` content when `lang:cy` provided and `OGLLink` is "true"', () => {
183
- const $ = cheerio.load(
184
- renderComponent('footer', {
185
- lang: 'cy',
186
- OGLLink: true,
187
- }),
188
- );
105
+ it('does not decorate container block with `fullWidth` modifier when the `fullWidth` parameter is not provided', () => {
106
+ const $ = cheerio.load(renderComponent('footer', {}));
189
107
 
190
- const licenseHtml = $('.ons-footer__license').html();
191
- expect(licenseHtml).toContain(', oni bai y nodir fel arall');
108
+ const hasClass = $('.ons-container').hasClass('ons-container--full-width');
109
+ expect(hasClass).toBe(false);
192
110
  });
193
- });
194
-
195
- describe('warning', () => {
196
- const params = {
197
- footerWarning: 'Footer warning text with <strong>bold</strong> content.',
198
- };
199
111
 
200
- it('passes jest-axe checks', async () => {
201
- const $ = cheerio.load(renderComponent('footer', params));
112
+ it('has additionally provided `attributes` on the `body` element', () => {
113
+ const $ = cheerio.load(
114
+ renderComponent('footer', {
115
+ attributes: {
116
+ a: '123',
117
+ b: '456',
118
+ },
119
+ }),
120
+ );
202
121
 
203
- const results = await axe($.html());
204
- expect(results).toHaveNoViolations();
122
+ expect($('.ons-footer__body').attr('a')).toBe('123');
123
+ expect($('.ons-footer__body').attr('b')).toBe('456');
205
124
  });
206
125
 
207
- it('renders warning element', () => {
208
- const $ = cheerio.load(renderComponent('footer', params));
126
+ describe('OGL link', () => {
127
+ const params = {
128
+ OGLLink: EXAMPLE_OGL_LINK_PARAM,
129
+ };
209
130
 
210
- const warningHtml = $('.ons-footer__warning').html();
211
- expect(warningHtml).toContain('Footer warning text with <strong>bold</strong> content.');
212
- });
131
+ it('passes jest-axe checks', async () => {
132
+ const $ = cheerio.load(renderComponent('footer', params));
213
133
 
214
- it('is not rendered when `footerWarning` is not provided', () => {
215
- const $ = cheerio.load(renderComponent('footer', {}));
134
+ const results = await axe($.html());
135
+ expect(results).toHaveNoViolations();
136
+ });
216
137
 
217
- expect($('.ons-footer__warning').length).toBe(0);
218
- });
138
+ it('renders OGL icon', () => {
139
+ const faker = templateFaker();
140
+ const iconsSpy = faker.spy('icon');
219
141
 
220
- it('renders warning text using the panel component', () => {
221
- const faker = templateFaker();
222
- const panelSpy = faker.spy('panel');
142
+ faker.renderComponent('footer', params);
223
143
 
224
- faker.renderComponent('footer', params);
144
+ expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining({ iconType: 'ogl' }));
145
+ });
225
146
 
226
- expect(panelSpy.occurrences).toContainEqual(
227
- expect.objectContaining({
228
- variant: 'warn',
229
- classes: 'ons-panel--warn--footer',
230
- }),
231
- );
232
- });
233
- });
147
+ it('renders raw HTML when `HTML` is provided', () => {
148
+ const $ = cheerio.load(
149
+ renderComponent('footer', {
150
+ OGLLink: {
151
+ ...params.OGLLink,
152
+ HTML: '<strong>Bold text.</strong>',
153
+ },
154
+ }),
155
+ );
156
+
157
+ const licenseHtml = $('.ons-footer__license').html();
158
+ expect(licenseHtml).toContain('<strong>Bold text.</strong>');
159
+ });
234
160
 
235
- describe('copyright', () => {
236
- const params = {
237
- copyrightDeclaration: {
238
- copyright: 'Crown copyright and database rights 2020 OS 100019153.',
239
- text: 'Use of address data is subject to the terms and conditions.',
240
- },
241
- };
161
+ it('renders link using the external link component', () => {
162
+ const faker = templateFaker();
163
+ const externalLinkSpy = faker.spy('external-link');
242
164
 
243
- it('passes jest-axe checks', async () => {
244
- const $ = cheerio.load(renderComponent('footer', params));
165
+ faker.renderComponent('footer', params);
245
166
 
246
- const results = await axe($.html());
247
- expect(results).toHaveNoViolations();
248
- });
167
+ expect(externalLinkSpy.occurrences).toContainEqual(
168
+ expect.objectContaining({
169
+ url: 'https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/',
170
+ linkText: 'Open Government Licence v3.0',
171
+ }),
172
+ );
173
+ });
249
174
 
250
- it('renders copyright declaration', () => {
251
- const $ = cheerio.load(renderComponent('footer', params));
175
+ it('renders `post` content when provided', () => {
176
+ const $ = cheerio.load(renderComponent('footer', params));
252
177
 
253
- const text = $('.ons-footer__copyright').text();
254
- expect(text).toBe(
255
- '© Crown copyright and database rights 2020 OS 100019153. Use of address data is subject to the terms and conditions.',
256
- );
257
- });
178
+ const licenseHtml = $('.ons-footer__license').html();
179
+ expect(licenseHtml).toContain(', except where otherwise stated');
180
+ });
258
181
 
259
- it('is not rendered when `copyrightDeclaration` is not provided', () => {
260
- const $ = cheerio.load(renderComponent('footer', {}));
182
+ it('renders welsh `post` content when `lang:cy` provided and `OGLLink` is "true"', () => {
183
+ const $ = cheerio.load(
184
+ renderComponent('footer', {
185
+ lang: 'cy',
186
+ OGLLink: true,
187
+ }),
188
+ );
261
189
 
262
- expect($('.ons-footer__copyright').length).toBe(0);
190
+ const licenseHtml = $('.ons-footer__license').html();
191
+ expect(licenseHtml).toContain(', oni bai y nodir fel arall');
192
+ });
263
193
  });
264
- });
265
194
 
266
- describe('cols', () => {
267
- const params = {
268
- cols: EXAMPLE_COLS_PARAM,
269
- };
195
+ describe('warning', () => {
196
+ const params = {
197
+ footerWarning: 'Footer warning text with <strong>bold</strong> content.',
198
+ };
270
199
 
271
- it('passes jest-axe checks', async () => {
272
- const $ = cheerio.load(renderComponent('footer', params));
200
+ it('passes jest-axe checks', async () => {
201
+ const $ = cheerio.load(renderComponent('footer', params));
273
202
 
274
- const results = await axe($.html());
275
- expect(results).toHaveNoViolations();
276
- });
203
+ const results = await axe($.html());
204
+ expect(results).toHaveNoViolations();
205
+ });
277
206
 
278
- it('renders expected column titles', () => {
279
- const $ = cheerio.load(renderComponent('footer', params));
207
+ it('renders warning element', () => {
208
+ const $ = cheerio.load(renderComponent('footer', params));
280
209
 
281
- const titleHeadings = mapAll($('.ons-footer__heading'), (node) => node.text().trim());
282
- expect(titleHeadings).toEqual(['First column', 'Second column']);
283
- });
210
+ const warningHtml = $('.ons-footer__warning').html();
211
+ expect(warningHtml).toContain('Footer warning text with <strong>bold</strong> content.');
212
+ });
284
213
 
285
- it('renders expected lists using list component', () => {
286
- const faker = templateFaker();
287
- const listsSpy = faker.spy('list');
214
+ it('is not rendered when `footerWarning` is not provided', () => {
215
+ const $ = cheerio.load(renderComponent('footer', {}));
288
216
 
289
- faker.renderComponent('footer', params);
217
+ expect($('.ons-footer__warning').length).toBe(0);
218
+ });
219
+
220
+ it('renders warning text using the panel component', () => {
221
+ const faker = templateFaker();
222
+ const panelSpy = faker.spy('panel');
290
223
 
291
- const itemsList1 = listsSpy.occurrences[0].itemsList;
292
- expect(itemsList1[0]).toHaveProperty('url', '/example-link-a');
293
- expect(itemsList1[0]).toHaveProperty('text', 'Example Link A');
224
+ faker.renderComponent('footer', params);
294
225
 
295
- const itemsList2 = listsSpy.occurrences[1].itemsList;
296
- expect(itemsList2[0]).toHaveProperty('url', '/example-link-b');
297
- expect(itemsList2[0]).toHaveProperty('text', 'Example Link B');
226
+ expect(panelSpy.occurrences).toContainEqual(
227
+ expect.objectContaining({
228
+ variant: 'warn',
229
+ classes: 'ons-panel--warn--footer',
230
+ }),
231
+ );
232
+ });
298
233
  });
299
- });
300
234
 
301
- describe('rows', () => {
302
- const params = {
303
- rows: EXAMPLE_ROWS_PARAM,
304
- };
235
+ describe('copyright', () => {
236
+ const params = {
237
+ copyrightDeclaration: {
238
+ copyright: 'Crown copyright and database rights 2020 OS 100019153.',
239
+ text: 'Use of address data is subject to the terms and conditions.',
240
+ },
241
+ };
305
242
 
306
- it('passes jest-axe checks', async () => {
307
- const $ = cheerio.load(renderComponent('footer', params));
243
+ it('passes jest-axe checks', async () => {
244
+ const $ = cheerio.load(renderComponent('footer', params));
308
245
 
309
- const results = await axe($.html());
310
- expect(results).toHaveNoViolations();
311
- });
246
+ const results = await axe($.html());
247
+ expect(results).toHaveNoViolations();
248
+ });
312
249
 
313
- it('renders expected lists using list component', () => {
314
- const faker = templateFaker();
315
- const listsSpy = faker.spy('list');
250
+ it('renders copyright declaration', () => {
251
+ const $ = cheerio.load(renderComponent('footer', params));
316
252
 
317
- faker.renderComponent('footer', params);
253
+ const text = $('.ons-footer__copyright').text();
254
+ expect(text).toBe(
255
+ '© Crown copyright and database rights 2020 OS 100019153. Use of address data is subject to the terms and conditions.',
256
+ );
257
+ });
318
258
 
319
- const itemsList1 = listsSpy.occurrences[0].itemsList;
320
- expect(itemsList1[0]).toHaveProperty('url', '/example-link-a');
321
- expect(itemsList1[0]).toHaveProperty('text', 'Example Link A');
259
+ it('is not rendered when `copyrightDeclaration` is not provided', () => {
260
+ const $ = cheerio.load(renderComponent('footer', {}));
322
261
 
323
- const itemsList2 = listsSpy.occurrences[1].itemsList;
324
- expect(itemsList2[0]).toHaveProperty('url', '/example-link-b');
325
- expect(itemsList2[0]).toHaveProperty('text', 'Example Link B');
262
+ expect($('.ons-footer__copyright').length).toBe(0);
263
+ });
326
264
  });
327
- });
328
265
 
329
- describe('legal', () => {
330
- const params = {
331
- legal: EXAMPLE_LEGAL_PARAM,
332
- };
266
+ describe('cols', () => {
267
+ const params = {
268
+ cols: EXAMPLE_COLS_PARAM,
269
+ };
333
270
 
334
- it('passes jest-axe checks', async () => {
335
- const $ = cheerio.load(renderComponent('footer', params));
271
+ it('passes jest-axe checks', async () => {
272
+ const $ = cheerio.load(renderComponent('footer', params));
336
273
 
337
- const results = await axe($.html());
338
- expect(results).toHaveNoViolations();
339
- });
274
+ const results = await axe($.html());
275
+ expect(results).toHaveNoViolations();
276
+ });
340
277
 
341
- it('renders expected lists using list component', () => {
342
- const faker = templateFaker();
343
- const listsSpy = faker.spy('list');
278
+ it('renders expected column titles', () => {
279
+ const $ = cheerio.load(renderComponent('footer', params));
344
280
 
345
- faker.renderComponent('footer', params);
281
+ const titleHeadings = mapAll($('.ons-footer__heading'), (node) => node.text().trim());
282
+ expect(titleHeadings).toEqual(['First column', 'Second column']);
283
+ });
346
284
 
347
- const itemsList1 = listsSpy.occurrences[0].itemsList;
348
- expect(itemsList1[0]).toHaveProperty('url', '/example-legal-link-a');
349
- expect(itemsList1[0]).toHaveProperty('text', 'Example Legal Link A');
285
+ it('renders expected lists using list component', () => {
286
+ const faker = templateFaker();
287
+ const listsSpy = faker.spy('list');
350
288
 
351
- const itemsList2 = listsSpy.occurrences[1].itemsList;
352
- expect(itemsList2[0]).toHaveProperty('url', '/example-legal-link-b');
353
- expect(itemsList2[0]).toHaveProperty('text', 'Example Legal Link B');
354
- });
355
- });
356
-
357
- describe('poweredBy logo', () => {
358
- describe('default poweredBy logo', () => {
359
- describe.each([
360
- [
361
- 'the `lang` parameter is not provided',
362
- {},
363
- {
364
- iconType: 'ons-logo-en',
365
- altText: 'Office for National Statistics',
366
- },
367
- ],
368
- [
369
- 'the `lang` parameter is "en"',
370
- { lang: 'en' },
371
- {
372
- iconType: 'ons-logo-en',
373
- altText: 'Office for National Statistics',
374
- },
375
- ],
376
- ])('where %s', (_, langParams, defaultIcon) => {
377
- const params = {
378
- ...langParams,
379
- };
380
- it('renders the expected icon', () => {
381
- const faker = templateFaker();
382
- const iconsSpy = faker.spy('icon');
289
+ faker.renderComponent('footer', params);
383
290
 
384
- faker.renderComponent('footer', params);
291
+ const itemsList1 = listsSpy.occurrences[0].itemsList;
292
+ expect(itemsList1[0]).toHaveProperty('url', '/example-link-a');
293
+ expect(itemsList1[0]).toHaveProperty('text', 'Example Link A');
385
294
 
386
- expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining(defaultIcon));
295
+ const itemsList2 = listsSpy.occurrences[1].itemsList;
296
+ expect(itemsList2[0]).toHaveProperty('url', '/example-link-b');
297
+ expect(itemsList2[0]).toHaveProperty('text', 'Example Link B');
387
298
  });
388
- });
389
299
  });
390
- describe('provided poweredBy logo', () => {
391
- describe.each([
392
- [
393
- 'the `lang` parameter is "cy"',
394
- { lang: 'cy' },
395
- {
396
- iconType: 'ons-logo-cy',
397
- altText: 'Swyddfa Ystadegau Gwladol',
398
- },
399
- ],
400
- ])('where %s', (_, langParams, defaultIcon) => {
300
+
301
+ describe('rows', () => {
401
302
  const params = {
402
- ...langParams,
303
+ rows: EXAMPLE_ROWS_PARAM,
403
304
  };
404
- it('renders the expected icon', () => {
405
- const faker = templateFaker();
406
- const iconsSpy = faker.spy('icon');
407
305
 
408
- faker.renderComponent('footer', params);
306
+ it('passes jest-axe checks', async () => {
307
+ const $ = cheerio.load(renderComponent('footer', params));
409
308
 
410
- expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining(defaultIcon));
309
+ const results = await axe($.html());
310
+ expect(results).toHaveNoViolations();
411
311
  });
412
- });
413
- });
414
- describe('correct link for language', () => {
415
- it('has the Welsh lang link when the default Welsh lang ons icon is present', () => {
416
- const $ = cheerio.load(renderComponent('footer', { lang: 'cy' }));
417
312
 
418
- expect($('.ons-footer__poweredBy-link').attr('href')).toBe('https://cy.ons.gov.uk/');
419
- });
420
- it('has the English lang link when the default English lang ons icon is present', () => {
421
- const $ = cheerio.load(renderComponent('footer', { lang: 'en' }));
313
+ it('renders expected lists using list component', () => {
314
+ const faker = templateFaker();
315
+ const listsSpy = faker.spy('list');
316
+
317
+ faker.renderComponent('footer', params);
318
+
319
+ const itemsList1 = listsSpy.occurrences[0].itemsList;
320
+ expect(itemsList1[0]).toHaveProperty('url', '/example-link-a');
321
+ expect(itemsList1[0]).toHaveProperty('text', 'Example Link A');
422
322
 
423
- expect($('.ons-footer__poweredBy-link').attr('href')).toBe('https://www.ons.gov.uk/');
424
- });
323
+ const itemsList2 = listsSpy.occurrences[1].itemsList;
324
+ expect(itemsList2[0]).toHaveProperty('url', '/example-link-b');
325
+ expect(itemsList2[0]).toHaveProperty('text', 'Example Link B');
326
+ });
425
327
  });
426
- describe('provided poweredBy logo', () => {
427
- describe.each([
428
- [
429
- 'the `poweredBy` and `OGLLink` parameters are provided',
430
- {
431
- poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
432
- OGLLink: EXAMPLE_OGL_LINK_PARAM,
433
- },
434
- ],
435
- [
436
- 'the `poweredBy` and `legal` parameters are provided',
437
- {
438
- poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
439
- legal: EXAMPLE_LEGAL_PARAM,
440
- },
441
- ],
442
- [
443
- 'the `poweredBy` and `crest` parameters are provided',
444
- {
445
- poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
446
- crest: true,
447
- },
448
- ],
449
- [
450
- 'the `poweredBy`, `legal` and `crest` parameters are provided',
451
- {
452
- poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
453
- legal: EXAMPLE_LEGAL_PARAM,
454
- crest: true,
455
- },
456
- ],
457
- [
458
- 'the `poweredBy` parameter is provided but the `legal` and `crest` parameters are not provided',
459
- {
460
- poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
461
- },
462
- ],
463
- ])('where %s', (_, poweredByParams) => {
328
+
329
+ describe('legal', () => {
464
330
  const params = {
465
- ...poweredByParams,
331
+ legal: EXAMPLE_LEGAL_PARAM,
466
332
  };
467
333
 
468
334
  it('passes jest-axe checks', async () => {
469
- const $ = cheerio.load(renderComponent('footer', params));
335
+ const $ = cheerio.load(renderComponent('footer', params));
470
336
 
471
- const results = await axe($.html());
472
- expect(results).toHaveNoViolations();
337
+ const results = await axe($.html());
338
+ expect(results).toHaveNoViolations();
473
339
  });
474
340
 
475
- it('renders the expected logo', () => {
476
- const $ = cheerio.load(renderComponent('footer', params));
341
+ it('renders expected lists using list component', () => {
342
+ const faker = templateFaker();
343
+ const listsSpy = faker.spy('list');
344
+
345
+ faker.renderComponent('footer', params);
477
346
 
478
- expect($('.custom-logo').length).toBe(1);
347
+ const itemsList1 = listsSpy.occurrences[0].itemsList;
348
+ expect(itemsList1[0]).toHaveProperty('url', '/example-legal-link-a');
349
+ expect(itemsList1[0]).toHaveProperty('text', 'Example Legal Link A');
350
+
351
+ const itemsList2 = listsSpy.occurrences[1].itemsList;
352
+ expect(itemsList2[0]).toHaveProperty('url', '/example-legal-link-b');
353
+ expect(itemsList2[0]).toHaveProperty('text', 'Example Legal Link B');
479
354
  });
480
- });
481
- });
482
- });
483
-
484
- describe('save and sign out button', () => {
485
- const params = {
486
- button: {
487
- id: 'save-and-sign-out',
488
- classes: 'extra-class',
489
- text: 'Save changes and sign out',
490
- name: 'button-name',
491
- attributes: { a: 42 },
492
- url: 'https://example.com/',
493
- },
494
- };
495
-
496
- it('passes jest-axe checks', async () => {
497
- const $ = cheerio.load(renderComponent('footer', params));
498
-
499
- const results = await axe($.html());
500
- expect(results).toHaveNoViolations();
501
355
  });
502
356
 
503
- it('renders "Save changes and sign out" button using the button component', () => {
504
- const faker = templateFaker();
505
- const buttonSpy = faker.spy('button');
357
+ describe('poweredBy logo', () => {
358
+ describe('default poweredBy logo', () => {
359
+ describe.each([
360
+ [
361
+ 'the `lang` parameter is not provided',
362
+ {},
363
+ {
364
+ iconType: 'ons-logo-en',
365
+ altText: 'Office for National Statistics',
366
+ },
367
+ ],
368
+ [
369
+ 'the `lang` parameter is "en"',
370
+ { lang: 'en' },
371
+ {
372
+ iconType: 'ons-logo-en',
373
+ altText: 'Office for National Statistics',
374
+ },
375
+ ],
376
+ ])('where %s', (_, langParams, defaultIcon) => {
377
+ const params = {
378
+ ...langParams,
379
+ };
380
+ it('renders the expected icon', () => {
381
+ const faker = templateFaker();
382
+ const iconsSpy = faker.spy('icon');
383
+
384
+ faker.renderComponent('footer', params);
385
+
386
+ expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining(defaultIcon));
387
+ });
388
+ });
389
+ });
390
+ describe('provided poweredBy logo', () => {
391
+ describe.each([
392
+ [
393
+ 'the `lang` parameter is "cy"',
394
+ { lang: 'cy' },
395
+ {
396
+ iconType: 'ons-logo-cy',
397
+ altText: 'Swyddfa Ystadegau Gwladol',
398
+ },
399
+ ],
400
+ ])('where %s', (_, langParams, defaultIcon) => {
401
+ const params = {
402
+ ...langParams,
403
+ };
404
+ it('renders the expected icon', () => {
405
+ const faker = templateFaker();
406
+ const iconsSpy = faker.spy('icon');
407
+
408
+ faker.renderComponent('footer', params);
409
+
410
+ expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining(defaultIcon));
411
+ });
412
+ });
413
+ });
414
+ describe('correct link for language', () => {
415
+ it('has the Welsh lang link when the default Welsh lang ons icon is present', () => {
416
+ const $ = cheerio.load(renderComponent('footer', { lang: 'cy' }));
506
417
 
507
- faker.renderComponent('footer', params);
418
+ expect($('.ons-footer__poweredBy-link').attr('href')).toBe('https://cy.ons.gov.uk/');
419
+ });
420
+ it('has the English lang link when the default English lang ons icon is present', () => {
421
+ const $ = cheerio.load(renderComponent('footer', { lang: 'en' }));
508
422
 
509
- expect(buttonSpy.occurrences).toContainEqual(
510
- expect.objectContaining({
511
- ...params.button,
512
- variants: 'ghost',
513
- }),
514
- );
423
+ expect($('.ons-footer__poweredBy-link').attr('href')).toBe('https://www.ons.gov.uk/');
424
+ });
425
+ });
426
+ describe('provided poweredBy logo', () => {
427
+ describe.each([
428
+ [
429
+ 'the `poweredBy` and `OGLLink` parameters are provided',
430
+ {
431
+ poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
432
+ OGLLink: EXAMPLE_OGL_LINK_PARAM,
433
+ },
434
+ ],
435
+ [
436
+ 'the `poweredBy` and `legal` parameters are provided',
437
+ {
438
+ poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
439
+ legal: EXAMPLE_LEGAL_PARAM,
440
+ },
441
+ ],
442
+ [
443
+ 'the `poweredBy` and `crest` parameters are provided',
444
+ {
445
+ poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
446
+ crest: true,
447
+ },
448
+ ],
449
+ [
450
+ 'the `poweredBy`, `legal` and `crest` parameters are provided',
451
+ {
452
+ poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
453
+ legal: EXAMPLE_LEGAL_PARAM,
454
+ crest: true,
455
+ },
456
+ ],
457
+ [
458
+ 'the `poweredBy` parameter is provided but the `legal` and `crest` parameters are not provided',
459
+ {
460
+ poweredBy: '<img src="logo.svg" class="custom-logo" alt="logo">',
461
+ },
462
+ ],
463
+ ])('where %s', (_, poweredByParams) => {
464
+ const params = {
465
+ ...poweredByParams,
466
+ };
467
+
468
+ it('passes jest-axe checks', async () => {
469
+ const $ = cheerio.load(renderComponent('footer', params));
470
+
471
+ const results = await axe($.html());
472
+ expect(results).toHaveNoViolations();
473
+ });
474
+
475
+ it('renders the expected logo', () => {
476
+ const $ = cheerio.load(renderComponent('footer', params));
477
+
478
+ expect($('.custom-logo').length).toBe(1);
479
+ });
480
+ });
481
+ });
515
482
  });
516
- });
517
483
 
518
- describe('new tab warning', () => {
519
- const params = {
520
- newTabWarning: 'The following links open in a <strong>new tab</strong>',
521
- };
484
+ describe('save and sign out button', () => {
485
+ const params = {
486
+ button: {
487
+ id: 'save-and-sign-out',
488
+ classes: 'extra-class',
489
+ text: 'Save changes and sign out',
490
+ name: 'button-name',
491
+ attributes: { a: 42 },
492
+ url: 'https://example.com/',
493
+ },
494
+ };
522
495
 
523
- it('passes jest-axe checks', async () => {
524
- const $ = cheerio.load(renderComponent('footer', params));
496
+ it('passes jest-axe checks', async () => {
497
+ const $ = cheerio.load(renderComponent('footer', params));
525
498
 
526
- const results = await axe($.html());
527
- expect(results).toHaveNoViolations();
528
- });
499
+ const results = await axe($.html());
500
+ expect(results).toHaveNoViolations();
501
+ });
502
+
503
+ it('renders "Save changes and sign out" button using the button component', () => {
504
+ const faker = templateFaker();
505
+ const buttonSpy = faker.spy('button');
529
506
 
530
- it('renders new tab warning element', () => {
531
- const $ = cheerio.load(renderComponent('footer', params));
507
+ faker.renderComponent('footer', params);
532
508
 
533
- const warningHtml = $('.ons-footer__new-tab-warning').html();
534
- expect(warningHtml).toContain('The following links open in a <strong>new tab</strong>');
509
+ expect(buttonSpy.occurrences).toContainEqual(
510
+ expect.objectContaining({
511
+ ...params.button,
512
+ variants: 'ghost',
513
+ }),
514
+ );
515
+ });
535
516
  });
536
517
 
537
- it('is not rendered when `newTabWarning` is not provided', () => {
538
- const $ = cheerio.load(renderComponent('footer', {}));
518
+ describe('new tab warning', () => {
519
+ const params = {
520
+ newTabWarning: 'The following links open in a <strong>new tab</strong>',
521
+ };
539
522
 
540
- expect($('.ons-footer__new-tab-warning').length).toBe(0);
541
- });
542
- });
523
+ it('passes jest-axe checks', async () => {
524
+ const $ = cheerio.load(renderComponent('footer', params));
543
525
 
544
- describe('crest', () => {
545
- const params = {
546
- crest: true,
547
- legal: true,
548
- };
526
+ const results = await axe($.html());
527
+ expect(results).toHaveNoViolations();
528
+ });
529
+
530
+ it('renders new tab warning element', () => {
531
+ const $ = cheerio.load(renderComponent('footer', params));
549
532
 
550
- it('passes jest-axe checks', async () => {
551
- const $ = cheerio.load(renderComponent('footer', params));
533
+ const warningHtml = $('.ons-footer__new-tab-warning').html();
534
+ expect(warningHtml).toContain('The following links open in a <strong>new tab</strong>');
535
+ });
552
536
 
553
- const results = await axe($.html());
554
- expect(results).toHaveNoViolations();
537
+ it('is not rendered when `newTabWarning` is not provided', () => {
538
+ const $ = cheerio.load(renderComponent('footer', {}));
539
+
540
+ expect($('.ons-footer__new-tab-warning').length).toBe(0);
541
+ });
555
542
  });
556
543
 
557
- it('renders crest icon when `crest` parameter is provided', () => {
558
- const faker = templateFaker();
559
- const iconsSpy = faker.spy('icon');
544
+ describe('crest', () => {
545
+ const params = {
546
+ crest: true,
547
+ legal: true,
548
+ };
560
549
 
561
- faker.renderComponent('footer', params);
550
+ it('passes jest-axe checks', async () => {
551
+ const $ = cheerio.load(renderComponent('footer', params));
562
552
 
563
- expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining({ iconType: 'crest' }));
564
- });
553
+ const results = await axe($.html());
554
+ expect(results).toHaveNoViolations();
555
+ });
556
+
557
+ it('renders crest icon when `crest` parameter is provided', () => {
558
+ const faker = templateFaker();
559
+ const iconsSpy = faker.spy('icon');
560
+
561
+ faker.renderComponent('footer', params);
565
562
 
566
- it('renders "crest" element', () => {
567
- const $ = cheerio.load(renderComponent('footer', params));
563
+ expect(iconsSpy.occurrences).toContainEqual(expect.objectContaining({ iconType: 'crest' }));
564
+ });
565
+
566
+ it('renders "crest" element', () => {
567
+ const $ = cheerio.load(renderComponent('footer', params));
568
568
 
569
- expect($('.ons-footer__crest').length).toBe(1);
569
+ expect($('.ons-footer__crest').length).toBe(1);
570
+ });
570
571
  });
571
- });
572
572
  });