@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
@@ -10,20 +10,20 @@ const EXAMPLE_PAGE = `
10
10
  <div class="ons-js-adv-filter">
11
11
  <div class="ons-js-adv-filter__wrap">
12
12
  ${renderComponent('button', {
13
- type: 'button',
14
- text: 'Show filters',
15
- classes: 'ons-adv-filter__trigger ons-js-adv-filter__trigger',
16
- 'aria-expanded': 'false',
17
- 'aria-controls': 'filter-panel',
13
+ type: 'button',
14
+ text: 'Show filters',
15
+ classes: 'ons-adv-filter__trigger ons-js-adv-filter__trigger',
16
+ 'aria-expanded': 'false',
17
+ 'aria-controls': 'filter-panel',
18
18
  })}
19
19
 
20
20
  <div class="ons-adv-filter__panel ons-js-adv-filter__panel" id="filter-panel">
21
21
  <h2>Filters</h2>
22
22
  <form class="ons-js-adv-filter__form" method="POST">
23
23
  ${renderComponent('button', {
24
- type: 'reset',
25
- text: 'Reset all filters',
26
- classes: 'ons-adv-filter__reset ons-js-adv-filter__reset',
24
+ type: 'reset',
25
+ text: 'Reset all filters',
26
+ classes: 'ons-adv-filter__reset ons-js-adv-filter__reset',
27
27
  })}
28
28
 
29
29
  <div class="ons-adv-filter__item ons-js-adv-filter__item" data-default-text="All audiences" data-multi-select-text="{n} filters selected">
@@ -34,33 +34,33 @@ const EXAMPLE_PAGE = `
34
34
  <span class="ons-js-adv-filter__selection">All audiences</span>
35
35
  </div>
36
36
  ${renderComponent('checkboxes', {
37
- dontWrap: 'true',
38
- legend: 'Audience',
39
- name: 'audience',
40
- checkboxes: [
41
- {
42
- classes: 'ons-checkbox--toggle',
43
- id: 'community-groups',
44
- label: {
45
- text: 'Community groups',
46
- },
47
- value: 'community-groups',
48
- attributes: {
49
- 'data-filter': 'community-groups',
50
- },
51
- },
52
- {
53
- classes: 'ons-checkbox--toggle',
54
- id: 'general-public',
55
- label: {
56
- text: 'General public',
57
- },
58
- value: 'general-public',
59
- attributes: {
60
- 'data-filter': 'general-public',
61
- },
62
- },
63
- ],
37
+ dontWrap: 'true',
38
+ legend: 'Audience',
39
+ name: 'audience',
40
+ checkboxes: [
41
+ {
42
+ classes: 'ons-checkbox--toggle',
43
+ id: 'community-groups',
44
+ label: {
45
+ text: 'Community groups',
46
+ },
47
+ value: 'community-groups',
48
+ attributes: {
49
+ 'data-filter': 'community-groups',
50
+ },
51
+ },
52
+ {
53
+ classes: 'ons-checkbox--toggle',
54
+ id: 'general-public',
55
+ label: {
56
+ text: 'General public',
57
+ },
58
+ value: 'general-public',
59
+ attributes: {
60
+ 'data-filter': 'general-public',
61
+ },
62
+ },
63
+ ],
64
64
  })}
65
65
  </fieldset>
66
66
  </div>
@@ -73,47 +73,47 @@ const EXAMPLE_PAGE = `
73
73
  <span class="ons-js-adv-filter__selection">All types</span>
74
74
  </div>
75
75
  ${renderComponent('checkboxes', {
76
- dontWrap: 'true',
77
- legend: 'Type',
78
- name: 'type',
79
- checkboxes: [
80
- {
81
- classes: 'ons-checkbox--toggle',
82
- id: 'booklet',
83
- label: {
84
- text: 'Booklet',
85
- },
86
- value: 'booklet',
87
- attributes: {
88
- 'data-filter': 'booklet',
89
- },
90
- },
91
- {
92
- classes: 'ons-checkbox--toggle',
93
- id: 'logo',
94
- label: {
95
- text: 'Logo',
96
- },
97
- value: 'logo',
98
- attributes: {
99
- 'data-filter': 'logo',
100
- },
101
- },
102
- ],
76
+ dontWrap: 'true',
77
+ legend: 'Type',
78
+ name: 'type',
79
+ checkboxes: [
80
+ {
81
+ classes: 'ons-checkbox--toggle',
82
+ id: 'booklet',
83
+ label: {
84
+ text: 'Booklet',
85
+ },
86
+ value: 'booklet',
87
+ attributes: {
88
+ 'data-filter': 'booklet',
89
+ },
90
+ },
91
+ {
92
+ classes: 'ons-checkbox--toggle',
93
+ id: 'logo',
94
+ label: {
95
+ text: 'Logo',
96
+ },
97
+ value: 'logo',
98
+ attributes: {
99
+ 'data-filter': 'logo',
100
+ },
101
+ },
102
+ ],
103
103
  })}
104
104
  </fieldset>
105
105
  </div>
106
106
 
107
107
  <div class="ons-adv-filter__actions">
108
108
  ${renderComponent('button', {
109
- type: 'button',
110
- html: 'Show (<span class="ons-js-adv-filter__show-results">7</span> results',
111
- classes: 'ons-js-adv-filter__show',
109
+ type: 'button',
110
+ html: 'Show (<span class="ons-js-adv-filter__show-results">7</span> results',
111
+ classes: 'ons-js-adv-filter__show',
112
112
  })}
113
113
  ${renderComponent('button', {
114
- type: 'button',
115
- html: 'Close',
116
- classes: 'ons-js-adv-filter__close',
114
+ type: 'button',
115
+ html: 'Close',
116
+ classes: 'ons-js-adv-filter__close',
117
117
  })}
118
118
  </div>
119
119
  </form>
@@ -135,43 +135,43 @@ const EXAMPLE_PAGE = `
135
135
  </div>
136
136
 
137
137
  ${renderComponent('document-list', {
138
- id: 'adv-filter-gallery',
139
- classes: 'ons-adv-filter__gallery ons-js-adv-filter__gallery',
140
- attributes: {
141
- 'data-filter-animation': 'off',
142
- },
143
- documents: [
144
- {
145
- classes: 'ons-filter__item ons-js-filter__item',
146
- attributes: {
147
- 'data-filter': 'general-public booklet',
148
- 'data-sort-index': '1',
149
- },
150
- url: '/example-booklet-1',
151
- title: 'Example booklet 1',
152
- description: 'The first example booklet.',
153
- },
154
- {
155
- classes: 'ons-filter__item ons-js-filter__item',
156
- attributes: {
157
- 'data-filter': 'general-public booklet logo',
158
- 'data-sort-index': '2',
159
- },
160
- url: '/example-booklet-2',
161
- title: 'Example booklet 2 with logo',
162
- description: 'The second example booklet with a logo.',
138
+ id: 'adv-filter-gallery',
139
+ classes: 'ons-adv-filter__gallery ons-js-adv-filter__gallery',
140
+ attributes: {
141
+ 'data-filter-animation': 'off',
163
142
  },
164
- {
165
- classes: 'ons-filter__item ons-js-filter__item',
166
- attributes: {
167
- 'data-filter': 'logo',
168
- 'data-sort-index': '3',
169
- },
170
- url: '/example-logo',
171
- title: 'Example logo',
172
- description: 'An example logo.',
173
- },
174
- ],
143
+ documents: [
144
+ {
145
+ classes: 'ons-filter__item ons-js-filter__item',
146
+ attributes: {
147
+ 'data-filter': 'general-public booklet',
148
+ 'data-sort-index': '1',
149
+ },
150
+ url: '/example-booklet-1',
151
+ title: 'Example booklet 1',
152
+ description: 'The first example booklet.',
153
+ },
154
+ {
155
+ classes: 'ons-filter__item ons-js-filter__item',
156
+ attributes: {
157
+ 'data-filter': 'general-public booklet logo',
158
+ 'data-sort-index': '2',
159
+ },
160
+ url: '/example-booklet-2',
161
+ title: 'Example booklet 2 with logo',
162
+ description: 'The second example booklet with a logo.',
163
+ },
164
+ {
165
+ classes: 'ons-filter__item ons-js-filter__item',
166
+ attributes: {
167
+ 'data-filter': 'logo',
168
+ 'data-sort-index': '3',
169
+ },
170
+ url: '/example-logo',
171
+ title: 'Example logo',
172
+ description: 'An example logo.',
173
+ },
174
+ ],
175
175
  })}
176
176
 
177
177
  <div class="ons-adv-filter__no-results" data-fallback-gallery-id="adv-filter-gallery">
@@ -186,393 +186,393 @@ const EXAMPLE_PAGE = `
186
186
  const RENDERED_EXAMPLE_PAGE = renderTemplate(EXAMPLE_PAGE);
187
187
 
188
188
  describe('script: download-resources', () => {
189
- describe('no filtering', () => {
190
- beforeEach(async () => {
191
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
192
- });
193
-
194
- it('shows all documents', async () => {
195
- const hiddenTitles = await getHiddenDocumentTitles(page);
196
- expect(hiddenTitles).toEqual([]);
197
- });
198
-
199
- it('updates filter selection labels ', async () => {
200
- const filterSelectionLabels = await getFilterSelectionLabels(page);
201
- expect(filterSelectionLabels).toEqual(['All audiences', 'All types']);
202
- });
189
+ describe('no filtering', () => {
190
+ beforeEach(async () => {
191
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
192
+ });
193
+
194
+ it('shows all documents', async () => {
195
+ const hiddenTitles = await getHiddenDocumentTitles(page);
196
+ expect(hiddenTitles).toEqual([]);
197
+ });
198
+
199
+ it('updates filter selection labels ', async () => {
200
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
201
+ expect(filterSelectionLabels).toEqual(['All audiences', 'All types']);
202
+ });
203
+
204
+ it('updates result count text', async () => {
205
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
206
+ expect(resultsCount).toBe('3');
207
+ });
208
+
209
+ it('hides the "No results" content', async () => {
210
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
211
+ expect(isHidden).toBe(true);
212
+ });
213
+ });
214
+
215
+ describe('filtering one parameter where there are no results', () => {
216
+ beforeEach(async () => {
217
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
218
+ await page.click('#community-groups');
219
+ });
220
+
221
+ it('hides all documents', async () => {
222
+ const hiddenTitles = await getHiddenDocumentTitles(page);
223
+ expect(hiddenTitles).toEqual(['Example booklet 1', 'Example booklet 2 with logo', 'Example logo']);
224
+ });
225
+
226
+ it('updates filter selection labels ', async () => {
227
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
228
+ expect(filterSelectionLabels).toEqual(['Community groups', 'All types']);
229
+ });
230
+
231
+ it('updates result count text', async () => {
232
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
233
+ expect(resultsCount).toBe('0');
234
+ });
235
+
236
+ it('shows the "No results" content', async () => {
237
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
238
+ expect(isHidden).toBe(false);
239
+ });
240
+ });
241
+
242
+ describe('filtering one parameter where there are results', () => {
243
+ beforeEach(async () => {
244
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
245
+ await page.click('#general-public');
246
+ });
247
+
248
+ it('hides non-matching documents', async () => {
249
+ const hiddenTitles = await getHiddenDocumentTitles(page);
250
+ expect(hiddenTitles).toEqual(['Example logo']);
251
+ });
252
+
253
+ it('updates filter selection labels ', async () => {
254
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
255
+ expect(filterSelectionLabels).toEqual(['General public', 'All types']);
256
+ });
257
+
258
+ it('updates result count text', async () => {
259
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
260
+ expect(resultsCount).toBe('2');
261
+ });
262
+
263
+ it('hides the "No results" content', async () => {
264
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
265
+ expect(isHidden).toBe(true);
266
+ });
267
+ });
268
+
269
+ describe('filtering two values of the same parameter', () => {
270
+ beforeEach(async () => {
271
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
272
+ await page.click('#booklet');
273
+ await page.click('#logo');
274
+ });
275
+
276
+ it('hides non-matching documents', async () => {
277
+ const hiddenTitles = await getHiddenDocumentTitles(page);
278
+ expect(hiddenTitles).toEqual([]);
279
+ });
280
+
281
+ it('updates filter selection labels ', async () => {
282
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
283
+ expect(filterSelectionLabels).toEqual(['All audiences', '2 filters selected']);
284
+ });
285
+
286
+ it('updates result count text', async () => {
287
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
288
+ expect(resultsCount).toBe('3');
289
+ });
290
+
291
+ it('hides the "No results" content', async () => {
292
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
293
+ expect(isHidden).toBe(true);
294
+ });
295
+ });
296
+
297
+ describe('filtering two parameters where there are no results', () => {
298
+ beforeEach(async () => {
299
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
300
+ await page.click('#community-groups');
301
+ await page.click('#booklet');
302
+ });
303
+
304
+ it('hides all documents', async () => {
305
+ const hiddenTitles = await getHiddenDocumentTitles(page);
306
+ expect(hiddenTitles).toEqual(['Example booklet 1', 'Example booklet 2 with logo', 'Example logo']);
307
+ });
308
+
309
+ it('updates filter selection labels ', async () => {
310
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
311
+ expect(filterSelectionLabels).toEqual(['Community groups', 'Booklet']);
312
+ });
313
+
314
+ it('updates result count text', async () => {
315
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
316
+ expect(resultsCount).toBe('0');
317
+ });
318
+
319
+ it('shows the "No results" content', async () => {
320
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
321
+ expect(isHidden).toBe(false);
322
+ });
323
+ });
324
+
325
+ describe('filtering two parameters where results match both', () => {
326
+ beforeEach(async () => {
327
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
328
+ await page.click('#general-public');
329
+ await page.click('#booklet');
330
+ });
331
+
332
+ it('hides non-matching documents', async () => {
333
+ const hiddenTitles = await getHiddenDocumentTitles(page);
334
+ expect(hiddenTitles).toEqual(['Example logo']);
335
+ });
336
+
337
+ it('updates filter selection labels ', async () => {
338
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
339
+ expect(filterSelectionLabels).toEqual(['General public', 'Booklet']);
340
+ });
341
+
342
+ it('updates result count text', async () => {
343
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
344
+ expect(resultsCount).toBe('2');
345
+ });
346
+
347
+ it('hides the "No results" content', async () => {
348
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
349
+ expect(isHidden).toBe(true);
350
+ });
351
+ });
352
+
353
+ describe('filtering two parameters where results do not match both', () => {
354
+ beforeEach(async () => {
355
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
356
+ await page.click('#general-public');
357
+ await page.click('#logo');
358
+ });
359
+
360
+ it('hides non-matching documents ', async () => {
361
+ const hiddenTitles = await getHiddenDocumentTitles(page);
362
+ expect(hiddenTitles).toEqual(['Example booklet 1', 'Example logo']);
363
+ });
364
+
365
+ it('updates filter selection labels ', async () => {
366
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
367
+ expect(filterSelectionLabels).toEqual(['General public', 'Logo']);
368
+ });
369
+
370
+ it('updates result count text', async () => {
371
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
372
+ expect(resultsCount).toBe('1');
373
+ });
374
+
375
+ it('hides the "No results" content', async () => {
376
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
377
+ expect(isHidden).toBe(true);
378
+ });
379
+ });
380
+
381
+ describe('adding and then removing a filter', () => {
382
+ beforeEach(async () => {
383
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
384
+ await page.click('#general-public');
385
+ await page.click('#logo');
386
+ await page.click('#logo');
387
+ });
388
+
389
+ it('hides non-matching documents ', async () => {
390
+ const hiddenTitles = await getHiddenDocumentTitles(page);
391
+ expect(hiddenTitles).toEqual(['Example logo']);
392
+ });
393
+
394
+ it('updates filter selection labels ', async () => {
395
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
396
+ expect(filterSelectionLabels).toEqual(['General public', 'All types']);
397
+ });
398
+
399
+ it('updates result count text', async () => {
400
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
401
+ expect(resultsCount).toBe('2');
402
+ });
403
+
404
+ it('hides the "No results" content', async () => {
405
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
406
+ expect(isHidden).toBe(true);
407
+ });
408
+ });
409
+
410
+ describe('sorting', () => {
411
+ beforeEach(async () => {
412
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
413
+ });
414
+
415
+ it('sorts ascending by default', async () => {
416
+ const shownTitles = await getShownDocumentTitles(page);
417
+ expect(shownTitles).toEqual(['Example booklet 1', 'Example booklet 2 with logo', 'Example logo']);
418
+ });
419
+
420
+ it('sorts descending when "sort" selection is set to "desc"', async () => {
421
+ await page.type('#sort', 'O');
422
+
423
+ const shownTitles = await getShownDocumentTitles(page);
424
+ expect(shownTitles).toEqual(['Example logo', 'Example booklet 2 with logo', 'Example booklet 1']);
425
+ });
426
+ });
427
+
428
+ describe('"Reset all filters" button', () => {
429
+ beforeEach(async () => {
430
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
431
+ await page.click('#general-public');
432
+ await page.click('#logo');
433
+ await page.click('.ons-js-adv-filter__reset');
434
+ });
435
+
436
+ it('resets state of all filter checkboxes ', async () => {
437
+ const selector = '.ons-js-adv-filter__item .ons-js-checkbox';
438
+ const checkboxStates = await page.$$eval(selector, (nodes) => nodes.map((node) => `${node.id}: ${node.checked}`));
439
+
440
+ expect(checkboxStates).toEqual(['community-groups: false', 'general-public: false', 'booklet: false', 'logo: false']);
441
+ });
442
+
443
+ it('shows all documents ', async () => {
444
+ const hiddenTitles = await getHiddenDocumentTitles(page);
445
+ expect(hiddenTitles).toEqual([]);
446
+ });
447
+
448
+ it('updates filter selection labels ', async () => {
449
+ const filterSelectionLabels = await getFilterSelectionLabels(page);
450
+ expect(filterSelectionLabels).toEqual(['All audiences', 'All types']);
451
+ });
452
+
453
+ it('updates result count text', async () => {
454
+ const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
455
+ expect(resultsCount).toBe('3');
456
+ });
457
+
458
+ it('hides the "No results" content', async () => {
459
+ const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
460
+ expect(isHidden).toBe(true);
461
+ });
462
+ });
463
+
464
+ describe('when the viewport is large', () => {
465
+ beforeEach(async () => {
466
+ await setViewport(page, { width: 1650, height: 1050 });
467
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
468
+ });
469
+
470
+ afterEach(async () => {
471
+ // Clear viewport size and browser emulation after each test.
472
+ await jestPuppeteer.resetPage();
473
+ });
474
+
475
+ it('hides elements that are only needed for mobile', async () => {
476
+ const displayStyle = await page.$eval('.ons-adv-filter__trigger', (node) => getComputedStyle(node).display);
477
+ expect(displayStyle).toBe('none');
478
+ });
203
479
 
204
- it('updates result count text', async () => {
205
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
206
- expect(resultsCount).toBe('3');
207
- });
208
-
209
- it('hides the "No results" content', async () => {
210
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
211
- expect(isHidden).toBe(true);
212
- });
213
- });
480
+ it('shows filter elements', async () => {
481
+ const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
482
+ expect(displayStyle).not.toBe('none');
483
+ });
484
+ });
485
+
486
+ describe('when the viewport is small', () => {
487
+ beforeEach(async () => {
488
+ await page.emulate(iPhoneX);
489
+ await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
490
+ });
214
491
 
215
- describe('filtering one parameter where there are no results', () => {
216
- beforeEach(async () => {
217
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
218
- await page.click('#community-groups');
219
- });
492
+ afterEach(async () => {
493
+ // Clear viewport size and browser emulation after each test.
494
+ await jestPuppeteer.resetPage();
495
+ });
220
496
 
221
- it('hides all documents', async () => {
222
- const hiddenTitles = await getHiddenDocumentTitles(page);
223
- expect(hiddenTitles).toEqual(['Example booklet 1', 'Example booklet 2 with logo', 'Example logo']);
224
- });
497
+ it('shows elements that are only needed for mobile', async () => {
498
+ const displayStyle = await page.$eval('.ons-adv-filter__trigger', (node) => getComputedStyle(node).display);
499
+ expect(displayStyle).not.toBe('none');
500
+ });
225
501
 
226
- it('updates filter selection labels ', async () => {
227
- const filterSelectionLabels = await getFilterSelectionLabels(page);
228
- expect(filterSelectionLabels).toEqual(['Community groups', 'All types']);
229
- });
502
+ it('hides filter elements', async () => {
503
+ const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
504
+ expect(displayStyle).toBe('none');
505
+ });
230
506
 
231
- it('updates result count text', async () => {
232
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
233
- expect(resultsCount).toBe('0');
234
- });
507
+ it('shows filter elements when the "Show filters" button is pressed', async () => {
508
+ await page.click('.ons-js-adv-filter__trigger');
235
509
 
236
- it('shows the "No results" content', async () => {
237
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
238
- expect(isHidden).toBe(false);
239
- });
240
- });
510
+ const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
511
+ expect(displayStyle).not.toBe('none');
512
+ });
241
513
 
242
- describe('filtering one parameter where there are results', () => {
243
- beforeEach(async () => {
244
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
245
- await page.click('#general-public');
246
- });
514
+ it('hides the underlying page elements when the "Show filters" button is pressed', async () => {
515
+ await page.click('.ons-js-adv-filter__trigger');
247
516
 
248
- it('hides non-matching documents', async () => {
249
- const hiddenTitles = await getHiddenDocumentTitles(page);
250
- expect(hiddenTitles).toEqual(['Example logo']);
251
- });
517
+ const pageIsHidden = await page.$eval('.ons-page', (node) => node.classList.contains('ons-u-d-no'));
518
+ const pageIsAriaHidden = await page.$eval('.ons-page', (node) => node.getAttribute('aria-hidden'));
252
519
 
253
- it('updates filter selection labels ', async () => {
254
- const filterSelectionLabels = await getFilterSelectionLabels(page);
255
- expect(filterSelectionLabels).toEqual(['General public', 'All types']);
256
- });
520
+ expect(pageIsHidden).toBe(true);
521
+ expect(pageIsAriaHidden).toBe('true');
522
+ });
257
523
 
258
- it('updates result count text', async () => {
259
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
260
- expect(resultsCount).toBe('2');
261
- });
524
+ it('hides filter elements when the "Show (n results)" button is pressed', async () => {
525
+ await page.click('.ons-js-adv-filter__trigger');
526
+ await page.click('.ons-js-adv-filter__show');
262
527
 
263
- it('hides the "No results" content', async () => {
264
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
265
- expect(isHidden).toBe(true);
266
- });
267
- });
528
+ const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
529
+ expect(displayStyle).toBe('none');
530
+ });
268
531
 
269
- describe('filtering two values of the same parameter', () => {
270
- beforeEach(async () => {
271
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
272
- await page.click('#booklet');
273
- await page.click('#logo');
274
- });
532
+ it('shows the underlying page elements when the "Show (n results)" button is pressed', async () => {
533
+ await page.click('.ons-js-adv-filter__trigger');
534
+ await page.click('.ons-js-adv-filter__show');
275
535
 
276
- it('hides non-matching documents', async () => {
277
- const hiddenTitles = await getHiddenDocumentTitles(page);
278
- expect(hiddenTitles).toEqual([]);
279
- });
536
+ const pageIsHidden = await page.$eval('.ons-page', (node) => node.classList.contains('ons-u-d-no'));
537
+ const pageIsAriaHidden = await page.$eval('.ons-page', (node) => node.getAttribute('aria-hidden'));
280
538
 
281
- it('updates filter selection labels ', async () => {
282
- const filterSelectionLabels = await getFilterSelectionLabels(page);
283
- expect(filterSelectionLabels).toEqual(['All audiences', '2 filters selected']);
284
- });
539
+ expect(pageIsHidden).toBe(false);
540
+ expect(pageIsAriaHidden).toBe('false');
541
+ });
285
542
 
286
- it('updates result count text', async () => {
287
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
288
- expect(resultsCount).toBe('3');
289
- });
290
-
291
- it('hides the "No results" content', async () => {
292
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
293
- expect(isHidden).toBe(true);
294
- });
295
- });
296
-
297
- describe('filtering two parameters where there are no results', () => {
298
- beforeEach(async () => {
299
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
300
- await page.click('#community-groups');
301
- await page.click('#booklet');
302
- });
303
-
304
- it('hides all documents', async () => {
305
- const hiddenTitles = await getHiddenDocumentTitles(page);
306
- expect(hiddenTitles).toEqual(['Example booklet 1', 'Example booklet 2 with logo', 'Example logo']);
307
- });
308
-
309
- it('updates filter selection labels ', async () => {
310
- const filterSelectionLabels = await getFilterSelectionLabels(page);
311
- expect(filterSelectionLabels).toEqual(['Community groups', 'Booklet']);
312
- });
313
-
314
- it('updates result count text', async () => {
315
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
316
- expect(resultsCount).toBe('0');
317
- });
318
-
319
- it('shows the "No results" content', async () => {
320
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
321
- expect(isHidden).toBe(false);
322
- });
323
- });
324
-
325
- describe('filtering two parameters where results match both', () => {
326
- beforeEach(async () => {
327
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
328
- await page.click('#general-public');
329
- await page.click('#booklet');
330
- });
331
-
332
- it('hides non-matching documents', async () => {
333
- const hiddenTitles = await getHiddenDocumentTitles(page);
334
- expect(hiddenTitles).toEqual(['Example logo']);
335
- });
336
-
337
- it('updates filter selection labels ', async () => {
338
- const filterSelectionLabels = await getFilterSelectionLabels(page);
339
- expect(filterSelectionLabels).toEqual(['General public', 'Booklet']);
340
- });
341
-
342
- it('updates result count text', async () => {
343
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
344
- expect(resultsCount).toBe('2');
345
- });
346
-
347
- it('hides the "No results" content', async () => {
348
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
349
- expect(isHidden).toBe(true);
350
- });
351
- });
352
-
353
- describe('filtering two parameters where results do not match both', () => {
354
- beforeEach(async () => {
355
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
356
- await page.click('#general-public');
357
- await page.click('#logo');
358
- });
359
-
360
- it('hides non-matching documents ', async () => {
361
- const hiddenTitles = await getHiddenDocumentTitles(page);
362
- expect(hiddenTitles).toEqual(['Example booklet 1', 'Example logo']);
363
- });
364
-
365
- it('updates filter selection labels ', async () => {
366
- const filterSelectionLabels = await getFilterSelectionLabels(page);
367
- expect(filterSelectionLabels).toEqual(['General public', 'Logo']);
368
- });
369
-
370
- it('updates result count text', async () => {
371
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
372
- expect(resultsCount).toBe('1');
373
- });
543
+ it('hides filter elements when the "Close" button is pressed', async () => {
544
+ await page.click('.ons-js-adv-filter__trigger');
545
+ await page.click('.ons-js-adv-filter__close');
374
546
 
375
- it('hides the "No results" content', async () => {
376
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
377
- expect(isHidden).toBe(true);
378
- });
379
- });
380
-
381
- describe('adding and then removing a filter', () => {
382
- beforeEach(async () => {
383
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
384
- await page.click('#general-public');
385
- await page.click('#logo');
386
- await page.click('#logo');
387
- });
388
-
389
- it('hides non-matching documents ', async () => {
390
- const hiddenTitles = await getHiddenDocumentTitles(page);
391
- expect(hiddenTitles).toEqual(['Example logo']);
392
- });
393
-
394
- it('updates filter selection labels ', async () => {
395
- const filterSelectionLabels = await getFilterSelectionLabels(page);
396
- expect(filterSelectionLabels).toEqual(['General public', 'All types']);
397
- });
398
-
399
- it('updates result count text', async () => {
400
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
401
- expect(resultsCount).toBe('2');
402
- });
403
-
404
- it('hides the "No results" content', async () => {
405
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
406
- expect(isHidden).toBe(true);
407
- });
408
- });
409
-
410
- describe('sorting', () => {
411
- beforeEach(async () => {
412
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
413
- });
414
-
415
- it('sorts ascending by default', async () => {
416
- const shownTitles = await getShownDocumentTitles(page);
417
- expect(shownTitles).toEqual(['Example booklet 1', 'Example booklet 2 with logo', 'Example logo']);
418
- });
419
-
420
- it('sorts descending when "sort" selection is set to "desc"', async () => {
421
- await page.type('#sort', 'O');
422
-
423
- const shownTitles = await getShownDocumentTitles(page);
424
- expect(shownTitles).toEqual(['Example logo', 'Example booklet 2 with logo', 'Example booklet 1']);
425
- });
426
- });
427
-
428
- describe('"Reset all filters" button', () => {
429
- beforeEach(async () => {
430
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
431
- await page.click('#general-public');
432
- await page.click('#logo');
433
- await page.click('.ons-js-adv-filter__reset');
434
- });
435
-
436
- it('resets state of all filter checkboxes ', async () => {
437
- const selector = '.ons-js-adv-filter__item .ons-js-checkbox';
438
- const checkboxStates = await page.$$eval(selector, (nodes) => nodes.map((node) => `${node.id}: ${node.checked}`));
439
-
440
- expect(checkboxStates).toEqual(['community-groups: false', 'general-public: false', 'booklet: false', 'logo: false']);
441
- });
442
-
443
- it('shows all documents ', async () => {
444
- const hiddenTitles = await getHiddenDocumentTitles(page);
445
- expect(hiddenTitles).toEqual([]);
446
- });
447
-
448
- it('updates filter selection labels ', async () => {
449
- const filterSelectionLabels = await getFilterSelectionLabels(page);
450
- expect(filterSelectionLabels).toEqual(['All audiences', 'All types']);
451
- });
452
-
453
- it('updates result count text', async () => {
454
- const resultsCount = await page.$eval('.ons-js-adv-filter__results-count', (node) => node.textContent.trim());
455
- expect(resultsCount).toBe('3');
456
- });
457
-
458
- it('hides the "No results" content', async () => {
459
- const isHidden = await page.$eval('.ons-adv-filter__no-results', (node) => node.classList.contains('ons-u-hidden'));
460
- expect(isHidden).toBe(true);
461
- });
462
- });
463
-
464
- describe('when the viewport is large', () => {
465
- beforeEach(async () => {
466
- await setViewport(page, { width: 1650, height: 1050 });
467
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
468
- });
469
-
470
- afterEach(async () => {
471
- // Clear viewport size and browser emulation after each test.
472
- await jestPuppeteer.resetPage();
473
- });
474
-
475
- it('hides elements that are only needed for mobile', async () => {
476
- const displayStyle = await page.$eval('.ons-adv-filter__trigger', (node) => getComputedStyle(node).display);
477
- expect(displayStyle).toBe('none');
478
- });
479
-
480
- it('shows filter elements', async () => {
481
- const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
482
- expect(displayStyle).not.toBe('none');
483
- });
484
- });
485
-
486
- describe('when the viewport is small', () => {
487
- beforeEach(async () => {
488
- await page.emulate(iPhoneX);
489
- await setTestPage('/test', RENDERED_EXAMPLE_PAGE);
490
- });
491
-
492
- afterEach(async () => {
493
- // Clear viewport size and browser emulation after each test.
494
- await jestPuppeteer.resetPage();
495
- });
496
-
497
- it('shows elements that are only needed for mobile', async () => {
498
- const displayStyle = await page.$eval('.ons-adv-filter__trigger', (node) => getComputedStyle(node).display);
499
- expect(displayStyle).not.toBe('none');
500
- });
501
-
502
- it('hides filter elements', async () => {
503
- const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
504
- expect(displayStyle).toBe('none');
505
- });
506
-
507
- it('shows filter elements when the "Show filters" button is pressed', async () => {
508
- await page.click('.ons-js-adv-filter__trigger');
509
-
510
- const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
511
- expect(displayStyle).not.toBe('none');
512
- });
513
-
514
- it('hides the underlying page elements when the "Show filters" button is pressed', async () => {
515
- await page.click('.ons-js-adv-filter__trigger');
516
-
517
- const pageIsHidden = await page.$eval('.ons-page', (node) => node.classList.contains('ons-u-d-no'));
518
- const pageIsAriaHidden = await page.$eval('.ons-page', (node) => node.getAttribute('aria-hidden'));
519
-
520
- expect(pageIsHidden).toBe(true);
521
- expect(pageIsAriaHidden).toBe('true');
522
- });
523
-
524
- it('hides filter elements when the "Show (n results)" button is pressed', async () => {
525
- await page.click('.ons-js-adv-filter__trigger');
526
- await page.click('.ons-js-adv-filter__show');
527
-
528
- const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
529
- expect(displayStyle).toBe('none');
530
- });
531
-
532
- it('shows the underlying page elements when the "Show (n results)" button is pressed', async () => {
533
- await page.click('.ons-js-adv-filter__trigger');
534
- await page.click('.ons-js-adv-filter__show');
535
-
536
- const pageIsHidden = await page.$eval('.ons-page', (node) => node.classList.contains('ons-u-d-no'));
537
- const pageIsAriaHidden = await page.$eval('.ons-page', (node) => node.getAttribute('aria-hidden'));
538
-
539
- expect(pageIsHidden).toBe(false);
540
- expect(pageIsAriaHidden).toBe('false');
541
- });
542
-
543
- it('hides filter elements when the "Close" button is pressed', async () => {
544
- await page.click('.ons-js-adv-filter__trigger');
545
- await page.click('.ons-js-adv-filter__close');
546
-
547
- const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
548
- expect(displayStyle).toBe('none');
549
- });
547
+ const displayStyle = await page.$eval('.ons-adv-filter__panel', (node) => getComputedStyle(node).display);
548
+ expect(displayStyle).toBe('none');
549
+ });
550
550
 
551
- it('shows the underlying page elements when the "Close" button is pressed', async () => {
552
- await page.click('.ons-js-adv-filter__trigger');
553
- await page.click('.ons-js-adv-filter__close');
551
+ it('shows the underlying page elements when the "Close" button is pressed', async () => {
552
+ await page.click('.ons-js-adv-filter__trigger');
553
+ await page.click('.ons-js-adv-filter__close');
554
554
 
555
- const pageIsHidden = await page.$eval('.ons-page', (node) => node.classList.contains('ons-u-d-no'));
556
- const pageIsAriaHidden = await page.$eval('.ons-page', (node) => node.getAttribute('aria-hidden'));
555
+ const pageIsHidden = await page.$eval('.ons-page', (node) => node.classList.contains('ons-u-d-no'));
556
+ const pageIsAriaHidden = await page.$eval('.ons-page', (node) => node.getAttribute('aria-hidden'));
557
557
 
558
- expect(pageIsHidden).toBe(false);
559
- expect(pageIsAriaHidden).toBe('false');
558
+ expect(pageIsHidden).toBe(false);
559
+ expect(pageIsAriaHidden).toBe('false');
560
+ });
560
561
  });
561
- });
562
562
  });
563
563
 
564
564
  async function getTextContent(page, selector) {
565
- return await page.$$eval(selector, (nodes) => nodes.map((node) => node.textContent.trim()));
565
+ return await page.$$eval(selector, (nodes) => nodes.map((node) => node.textContent.trim()));
566
566
  }
567
567
 
568
568
  async function getFilterSelectionLabels(page) {
569
- return await getTextContent(page, '.ons-js-adv-filter__selection');
569
+ return await getTextContent(page, '.ons-js-adv-filter__selection');
570
570
  }
571
571
 
572
572
  async function getHiddenDocumentTitles(page) {
573
- return await getTextContent(page, '.ons-js-filter__item.ons-u-hidden .ons-document-list__item-title');
573
+ return await getTextContent(page, '.ons-js-filter__item.ons-u-hidden .ons-document-list__item-title');
574
574
  }
575
575
 
576
576
  async function getShownDocumentTitles(page) {
577
- return await getTextContent(page, '.ons-js-filter__item:not(.ons-u-hidden) .ons-document-list__item-title');
577
+ return await getTextContent(page, '.ons-js-filter__item:not(.ons-u-hidden) .ons-document-list__item-title');
578
578
  }