@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,976 +7,980 @@ import { renderComponent, templateFaker } from '../../tests/helpers/rendering';
7
7
  import { mapAll } from '../../tests/helpers/cheerio';
8
8
 
9
9
  const EXAMPLE_HEADER_BASIC = {
10
- title: 'Header title',
10
+ title: 'Header title',
11
11
  };
12
12
 
13
13
  const EXAMPLE_SERVICE_LINKS_CONFIG = {
14
- id: 'service-links',
15
- ariaLabel: 'Services menu',
16
- classes: 'custom-class',
17
- toggleServicesButton: {
18
- text: 'Menu',
19
- ariaLabel: 'Toggle services menu',
20
- },
14
+ id: 'service-links',
15
+ ariaLabel: 'Services menu',
16
+ classes: 'custom-class',
17
+ toggleServicesButton: {
18
+ text: 'Menu',
19
+ ariaLabel: 'Toggle services menu',
20
+ },
21
21
  };
22
22
 
23
23
  const EXAMPLE_HEADER_SERVICE_LIST_ITEMS = {
24
- ...EXAMPLE_HEADER_BASIC,
25
- serviceLinks: {
26
- ...EXAMPLE_SERVICE_LINKS_CONFIG,
27
- itemsList: [
28
- {
29
- title: 'Title 1',
30
- },
31
- {
32
- title: 'Title 2',
33
- },
34
- {
35
- title: 'Title 3',
36
- },
37
- ],
38
- },
24
+ ...EXAMPLE_HEADER_BASIC,
25
+ serviceLinks: {
26
+ ...EXAMPLE_SERVICE_LINKS_CONFIG,
27
+ itemsList: [
28
+ {
29
+ title: 'Title 1',
30
+ },
31
+ {
32
+ title: 'Title 2',
33
+ },
34
+ {
35
+ title: 'Title 3',
36
+ },
37
+ ],
38
+ },
39
39
  };
40
40
 
41
41
  const EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE = {
42
- ...EXAMPLE_HEADER_BASIC,
43
- serviceLinks: {
44
- ...EXAMPLE_SERVICE_LINKS_CONFIG,
45
- itemsList: [
46
- {
47
- title: 'Title 1',
48
- url: '#1',
49
- },
50
- {
51
- title: 'Title 2',
52
- url: '#2',
53
- },
54
- {
55
- title: 'Title 3',
56
- url: '#3',
57
- },
58
- ],
59
- },
42
+ ...EXAMPLE_HEADER_BASIC,
43
+ serviceLinks: {
44
+ ...EXAMPLE_SERVICE_LINKS_CONFIG,
45
+ itemsList: [
46
+ {
47
+ title: 'Title 1',
48
+ url: '#1',
49
+ },
50
+ {
51
+ title: 'Title 2',
52
+ url: '#2',
53
+ },
54
+ {
55
+ title: 'Title 3',
56
+ url: '#3',
57
+ },
58
+ ],
59
+ },
60
60
  };
61
61
 
62
62
  const EXAMPLE_HEADER_SERVICE_LINKS_SINGLE = {
63
- ...EXAMPLE_HEADER_BASIC,
64
- serviceLinks: {
65
- ...EXAMPLE_SERVICE_LINKS_CONFIG,
66
- itemsList: [
67
- {
68
- title: 'Title',
69
- url: '#0',
70
- },
71
- ],
72
- },
63
+ ...EXAMPLE_HEADER_BASIC,
64
+ serviceLinks: {
65
+ ...EXAMPLE_SERVICE_LINKS_CONFIG,
66
+ itemsList: [
67
+ {
68
+ title: 'Title',
69
+ url: '#0',
70
+ },
71
+ ],
72
+ },
73
73
  };
74
74
 
75
75
  const EXAMPLE_HEADER_LANGUAGE_CONFIG = {
76
- language: {
77
- languages: [
78
- {
79
- url: '#0',
80
- ISOCode: 'en',
81
- text: 'English',
82
- buttonAriaLabel: 'Language selector. Current language: English',
83
- chooseLanguage: 'Choose language',
84
- current: true,
85
- },
86
- {
87
- url: '#0',
88
- ISOCode: 'cy',
89
- text: 'Cymraeg',
90
- buttonAriaLabel: 'Dewisydd iaith. Iaith gyfredol: Cymraeg',
91
- chooseLanguage: 'Dewiswch iaith',
92
- current: false,
93
- },
94
- ],
95
- },
76
+ language: {
77
+ languages: [
78
+ {
79
+ url: '#0',
80
+ ISOCode: 'en',
81
+ text: 'English',
82
+ buttonAriaLabel: 'Language selector. Current language: English',
83
+ chooseLanguage: 'Choose language',
84
+ current: true,
85
+ },
86
+ {
87
+ url: '#0',
88
+ ISOCode: 'cy',
89
+ text: 'Cymraeg',
90
+ buttonAriaLabel: 'Dewisydd iaith. Iaith gyfredol: Cymraeg',
91
+ chooseLanguage: 'Dewiswch iaith',
92
+ current: false,
93
+ },
94
+ ],
95
+ },
96
96
  };
97
97
 
98
98
  const EXAMPLE_HEADER_NAVIGATION_CONFIG = {
99
- navigation: {
100
- id: 'main-nav',
101
- ariaLabel: 'Main menu',
102
- currentPath: '#home',
103
- itemsList: [
104
- {
105
- title: 'Home',
106
- url: '#home',
107
- },
108
- {
109
- title: 'Guidance',
110
- url: '#0',
111
- },
112
- ],
113
- toggleNavigationButton: {
114
- text: 'Menu',
115
- ariaLabel: 'Toggle main menu',
99
+ navigation: {
100
+ id: 'main-nav',
101
+ ariaLabel: 'Main menu',
102
+ currentPath: '#home',
103
+ itemsList: [
104
+ {
105
+ title: 'Home',
106
+ url: '#home',
107
+ },
108
+ {
109
+ title: 'Guidance',
110
+ url: '#0',
111
+ },
112
+ ],
113
+ toggleNavigationButton: {
114
+ text: 'Menu',
115
+ ariaLabel: 'Toggle main menu',
116
+ },
116
117
  },
117
- },
118
118
  };
119
119
 
120
120
  const EXAMPLE_HEADER_NAVIGATION_WITH_SUBNAVIGATION_CONFIG = {
121
- navigation: {
122
- id: 'main-nav',
123
- ariaLabel: 'Main menu',
124
- currentPath: '#1',
125
- currentPageTitle: 'Guidance',
126
- itemsList: [
127
- {
128
- title: 'Home',
129
- url: '#0',
130
- },
131
- {
132
- title: 'Guidance',
133
- url: '#1',
134
- },
135
- ],
136
- toggleNavigationButton: {
137
- text: 'Menu',
138
- ariaLabel: 'Toggle main menu',
139
- },
140
- subNavigation: {
141
- id: 'sub-nav',
142
- overviewURL: '#overview',
143
- overviewText: 'Overview',
144
- ariaLabel: 'Section menu',
145
- currentPath: '#1',
146
- itemsList: [
147
- {
148
- title: 'Sub nav item 1',
149
- url: '#0',
150
- classes: 'custom-class-sub-item-1',
151
- id: 'sub-item-1',
121
+ navigation: {
122
+ id: 'main-nav',
123
+ ariaLabel: 'Main menu',
124
+ currentPath: '#1',
125
+ currentPageTitle: 'Guidance',
126
+ itemsList: [
127
+ {
128
+ title: 'Home',
129
+ url: '#0',
130
+ },
131
+ {
132
+ title: 'Guidance',
133
+ url: '#1',
134
+ },
135
+ ],
136
+ toggleNavigationButton: {
137
+ text: 'Menu',
138
+ ariaLabel: 'Toggle main menu',
152
139
  },
153
- {
154
- title: 'Sub nav item 2',
155
- url: '#1',
156
- classes: 'custom-class-sub-item-2',
157
- id: 'sub-item-2',
140
+ subNavigation: {
141
+ id: 'sub-nav',
142
+ overviewURL: '#overview',
143
+ overviewText: 'Overview',
144
+ ariaLabel: 'Section menu',
145
+ currentPath: '#1',
146
+ itemsList: [
147
+ {
148
+ title: 'Sub nav item 1',
149
+ url: '#0',
150
+ classes: 'custom-class-sub-item-1',
151
+ id: 'sub-item-1',
152
+ },
153
+ {
154
+ title: 'Sub nav item 2',
155
+ url: '#1',
156
+ classes: 'custom-class-sub-item-2',
157
+ id: 'sub-item-2',
158
+ },
159
+ ],
158
160
  },
159
- ],
160
161
  },
161
- },
162
162
  };
163
163
 
164
164
  const EXAMPLE_HEADER_NAVIGATION_WITH_SITESEARCHAUTOSUGGEST = {
165
- navigation: {
166
- id: 'main-nav',
167
- ariaLabel: 'Main menu',
168
- currentPath: '#home',
169
- itemsList: [
170
- {
171
- title: 'Home',
172
- url: '#home',
173
- },
174
- {
175
- title: 'Guidance',
176
- url: '#0',
177
- },
178
- ],
179
- toggleNavigationButton: {
180
- text: 'Menu',
181
- ariaLabel: 'Toggle main menu',
165
+ navigation: {
166
+ id: 'main-nav',
167
+ ariaLabel: 'Main menu',
168
+ currentPath: '#home',
169
+ itemsList: [
170
+ {
171
+ title: 'Home',
172
+ url: '#home',
173
+ },
174
+ {
175
+ title: 'Guidance',
176
+ url: '#0',
177
+ },
178
+ ],
179
+ toggleNavigationButton: {
180
+ text: 'Menu',
181
+ ariaLabel: 'Toggle main menu',
182
+ },
183
+ },
184
+ siteSearchAutosuggest: {
185
+ label: 'label',
186
+ instructions: 'Use up and down keys to navigate.',
187
+ ariaYouHaveSelected: 'You have selected',
188
+ ariaMinChars: 'Enter 3 or more characters for suggestions.',
189
+ minChars: 3,
190
+ ariaResultsLabel: 'Country suggestions',
191
+ ariaOneResult: 'There is one suggestion available.',
192
+ ariaNResults: 'There are {n} suggestions available.',
193
+ ariaLimitedResults: 'Type more characters to improve your search',
194
+ moreResults: 'Continue entering to improve suggestions',
195
+ resultsTitle: 'Suggestions',
196
+ resultsTitleId: 'country-of-birth-suggestions',
197
+ noResults: 'No suggestions found.',
198
+ typeMore: 'Continue entering to get suggestions',
199
+ language: 'en-gb',
182
200
  },
183
- },
184
- siteSearchAutosuggest: {
185
- label: 'label',
186
- instructions: 'Use up and down keys to navigate.',
187
- ariaYouHaveSelected: 'You have selected',
188
- ariaMinChars: 'Enter 3 or more characters for suggestions.',
189
- minChars: 3,
190
- ariaResultsLabel: 'Country suggestions',
191
- ariaOneResult: 'There is one suggestion available.',
192
- ariaNResults: 'There are {n} suggestions available.',
193
- ariaLimitedResults: 'Type more characters to improve your search',
194
- moreResults: 'Continue entering to improve suggestions',
195
- resultsTitle: 'Suggestions',
196
- resultsTitleId: 'country-of-birth-suggestions',
197
- noResults: 'No suggestions found.',
198
- typeMore: 'Continue entering to get suggestions',
199
- language: 'en-gb',
200
- },
201
201
  };
202
202
 
203
203
  describe('macro: header', () => {
204
- describe('mode: basic', () => {
205
- it('passes jest-axe checks', async () => {
206
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
207
-
208
- const results = await axe($.html());
209
- expect(results).toHaveNoViolations();
210
- });
204
+ describe('mode: basic', () => {
205
+ it('passes jest-axe checks', async () => {
206
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
211
207
 
212
- it('has provided variant style classes', () => {
213
- const $ = cheerio.load(
214
- renderComponent('header', {
215
- ...EXAMPLE_HEADER_BASIC,
216
- variants: ['variant-a', 'variant-b'],
217
- }),
218
- );
219
-
220
- expect($('.ons-header--variant-a').length).toBe(1);
221
- expect($('.ons-header--variant-b').length).toBe(1);
222
- });
208
+ const results = await axe($.html());
209
+ expect(results).toHaveNoViolations();
210
+ });
223
211
 
224
- it('has additionally provided `classes`', () => {
225
- const $ = cheerio.load(
226
- renderComponent('header', {
227
- ...EXAMPLE_HEADER_BASIC,
228
- classes: 'extra-class another-extra-class',
229
- }),
230
- );
212
+ it('has provided variant style classes', () => {
213
+ const $ = cheerio.load(
214
+ renderComponent('header', {
215
+ ...EXAMPLE_HEADER_BASIC,
216
+ variants: ['variant-a', 'variant-b'],
217
+ }),
218
+ );
231
219
 
232
- expect($('.ons-header').hasClass('extra-class')).toBe(true);
233
- expect($('.ons-header').hasClass('another-extra-class')).toBe(true);
234
- });
220
+ expect($('.ons-header--variant-a').length).toBe(1);
221
+ expect($('.ons-header--variant-b').length).toBe(1);
222
+ });
235
223
 
236
- it('has the correct container if `fullWidth`', () => {
237
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, fullWidth: true }));
224
+ it('has additionally provided `classes`', () => {
225
+ const $ = cheerio.load(
226
+ renderComponent('header', {
227
+ ...EXAMPLE_HEADER_BASIC,
228
+ classes: 'extra-class another-extra-class',
229
+ }),
230
+ );
238
231
 
239
- expect($('.ons-container').hasClass('ons-container--full-width')).toBe(true);
240
- });
232
+ expect($('.ons-header').hasClass('extra-class')).toBe(true);
233
+ expect($('.ons-header').hasClass('another-extra-class')).toBe(true);
234
+ });
241
235
 
242
- it('has the correct container if `wide`', () => {
243
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, wide: true }));
236
+ it('has the correct container if `fullWidth`', () => {
237
+ const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, fullWidth: true }));
244
238
 
245
- expect($('.ons-container').hasClass('ons-container--wide')).toBe(true);
246
- });
247
-
248
- it('has the correct masthead logo link', () => {
249
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, mastheadLogoUrl: '#0' }));
239
+ expect($('.ons-container').hasClass('ons-container--full-width')).toBe(true);
240
+ });
250
241
 
251
- expect($('.ons-header__org-logo-link').attr('href')).toBe('#0');
252
- });
242
+ it('has the correct container if `wide`', () => {
243
+ const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, wide: true }));
253
244
 
254
- it('has the default masthead logo icon', () => {
255
- const faker = templateFaker();
256
- const iconsSpy = faker.spy('icon');
245
+ expect($('.ons-container').hasClass('ons-container--wide')).toBe(true);
246
+ });
257
247
 
258
- faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
248
+ it('has the correct masthead logo link', () => {
249
+ const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, mastheadLogoUrl: '#0' }));
259
250
 
260
- expect(iconsSpy.occurrences[0].iconType).toBe('ons-logo-en');
261
- });
251
+ expect($('.ons-header__org-logo-link').attr('href')).toBe('#0');
252
+ });
262
253
 
263
- it('has the default masthead mobile logo icon', () => {
264
- const faker = templateFaker();
265
- const iconsSpy = faker.spy('icon');
254
+ it('has the default masthead logo icon', () => {
255
+ const faker = templateFaker();
256
+ const iconsSpy = faker.spy('icon');
266
257
 
267
- faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
258
+ faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
268
259
 
269
- expect(iconsSpy.occurrences[1].iconType).toBe('ons-logo-stacked-en');
270
- });
260
+ expect(iconsSpy.occurrences[0].iconType).toBe('ons-logo-en');
261
+ });
271
262
 
272
- it('has the default masthead logo icon alt text', () => {
273
- const faker = templateFaker();
274
- const iconsSpy = faker.spy('icon');
263
+ it('has the default masthead mobile logo icon', () => {
264
+ const faker = templateFaker();
265
+ const iconsSpy = faker.spy('icon');
275
266
 
276
- faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
267
+ faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
277
268
 
278
- expect(iconsSpy.occurrences[0].altText).toBe('Office for National Statistics homepage');
279
- });
269
+ expect(iconsSpy.occurrences[1].iconType).toBe('ons-logo-stacked-en');
270
+ });
280
271
 
281
- it('has the default masthead mobile logo icon alt text', () => {
282
- const faker = templateFaker();
283
- const iconsSpy = faker.spy('icon');
272
+ it('has the default masthead logo icon alt text', () => {
273
+ const faker = templateFaker();
274
+ const iconsSpy = faker.spy('icon');
284
275
 
285
- faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
276
+ faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
286
277
 
287
- expect(iconsSpy.occurrences[1].altText).toBe('Office for National Statistics logo');
288
- });
278
+ expect(iconsSpy.occurrences[0].altText).toBe('Office for National Statistics homepage');
279
+ });
289
280
 
290
- it('has the provided large masthead logo', () => {
291
- const $ = cheerio.load(
292
- renderComponent('header', { ...EXAMPLE_HEADER_BASIC, mastheadLogo: { large: '<img src="another-logo.svg">' } }),
293
- );
281
+ it('has the default masthead mobile logo icon alt text', () => {
282
+ const faker = templateFaker();
283
+ const iconsSpy = faker.spy('icon');
294
284
 
295
- expect($('.ons-header__org-logo--large img').attr('src')).toBe('another-logo.svg');
296
- });
285
+ faker.renderComponent('header', EXAMPLE_HEADER_BASIC);
297
286
 
298
- it('has the provided masthead logo custom classes', () => {
299
- const $ = cheerio.load(
300
- renderComponent('header', {
301
- ...EXAMPLE_HEADER_BASIC,
302
- mastheadLogo: { large: '<img src="another-logo.svg">', classes: 'custom-class another-custom-class' },
303
- }),
304
- );
287
+ expect(iconsSpy.occurrences[1].altText).toBe('Office for National Statistics logo');
288
+ });
305
289
 
306
- expect($('.ons-header__grid-top').hasClass('custom-class')).toBe(true);
307
- expect($('.ons-header__grid-top').hasClass('another-custom-class')).toBe(true);
308
- });
290
+ it('has the provided large masthead logo', () => {
291
+ const $ = cheerio.load(
292
+ renderComponent('header', { ...EXAMPLE_HEADER_BASIC, mastheadLogo: { large: '<img src="another-logo.svg">' } }),
293
+ );
309
294
 
310
- it('has the provided small masthead logo', () => {
311
- const $ = cheerio.load(
312
- renderComponent('header', {
313
- ...EXAMPLE_HEADER_BASIC,
314
- mastheadLogo: { large: 'another-logo.svg', small: '<img src="another-logo-small.svg">' },
315
- }),
316
- );
295
+ expect($('.ons-header__org-logo--large img').attr('src')).toBe('another-logo.svg');
296
+ });
317
297
 
318
- expect($('.ons-header__org-logo--small img').attr('src')).toBe('another-logo-small.svg');
319
- });
298
+ it('has the provided masthead logo custom classes', () => {
299
+ const $ = cheerio.load(
300
+ renderComponent('header', {
301
+ ...EXAMPLE_HEADER_BASIC,
302
+ mastheadLogo: { large: '<img src="another-logo.svg">', classes: 'custom-class another-custom-class' },
303
+ }),
304
+ );
320
305
 
321
- describe('mode: with multiple logos', () => {
322
- it('has the default ONS icon when requested', () => {
323
- const faker = templateFaker();
324
- const iconsSpy = faker.spy('icon');
325
-
326
- faker.renderComponent('header', {
327
- ...EXAMPLE_HEADER_BASIC,
328
- mastheadLogo: {
329
- multipleLogos: {
330
- logo1: {
331
- logoImage: 'ONS Logo',
332
- },
333
- },
334
- },
335
- });
336
- expect(iconsSpy.occurrences[0].iconType).toBe('ons-logo-stacked-en');
337
- });
338
-
339
- it('has the provided link', () => {
340
- const $ = cheerio.load(
341
- renderComponent('header', {
342
- ...EXAMPLE_HEADER_BASIC,
343
- mastheadLogo: {
344
- multipleLogos: {
345
- logo1: {
346
- logoImage: '<img src="a-logo.svg">',
347
- logoURL: '#0',
348
- },
349
- },
350
- },
351
- }),
352
- );
353
-
354
- expect($('.ons-header__org-logo-link').attr('href')).toBe('#0');
355
- });
356
-
357
- it('when multiple images are provided all show', () => {
358
- const $ = cheerio.load(
359
- renderComponent('header', {
360
- ...EXAMPLE_HEADER_BASIC,
361
- mastheadLogo: {
362
- multipleLogos: {
363
- logo1: {
364
- logoImage: '<img src="a-logo.svg">',
365
- },
366
- logo2: {
367
- logoImage: '<img src="a-second-logo.svg">',
368
- },
369
- logo3: {
370
- logoImage: '<img src="a-third-logo.svg">',
371
- },
372
- },
373
- },
374
- }),
375
- );
376
-
377
- expect($('.ons-header__org-logo--multi img').attr('src')).toBe('a-logo.svg');
378
- expect($('.ons-header__org-logo--multi img:nth-of-type(2)').attr('src')).toBe('a-second-logo.svg');
379
- expect($('.ons-header__org-logo--multi img:nth-of-type(3)').attr('src')).toBe('a-third-logo.svg');
380
- });
381
-
382
- it('renders multiple logos even when small/large parameters are used', () => {
383
- const $ = cheerio.load(
384
- renderComponent('header', {
385
- ...EXAMPLE_HEADER_BASIC,
386
- mastheadLogo: {
387
- small: '<img src="small-logo.svg">',
388
- large: '<img src="big-logo.svg">',
389
- multipleLogos: {
390
- logo1: {
391
- logoImage: '<img src="a-logo.svg">',
392
- },
393
- logo2: {
394
- logoImage: '<img src="a-second-logo.svg">',
395
- },
396
- logo3: {
397
- logoImage: '<img src="a-third-logo.svg">',
398
- },
399
- },
400
- },
401
- }),
402
- );
403
- expect($('.ons-header__org-logo--large').attr('src')).toBe(undefined);
404
- expect($('.ons-header__org-logo--multi img').attr('src')).toBe('a-logo.svg');
405
- });
406
- });
306
+ expect($('.ons-header__grid-top').hasClass('custom-class')).toBe(true);
307
+ expect($('.ons-header__grid-top').hasClass('another-custom-class')).toBe(true);
308
+ });
407
309
 
408
- it('displays the `title` text', () => {
409
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
310
+ it('has the provided small masthead logo', () => {
311
+ const $ = cheerio.load(
312
+ renderComponent('header', {
313
+ ...EXAMPLE_HEADER_BASIC,
314
+ mastheadLogo: { large: 'another-logo.svg', small: '<img src="another-logo-small.svg">' },
315
+ }),
316
+ );
410
317
 
411
- expect($('.ons-header__title').text()).toBe('Header title');
412
- });
318
+ expect($('.ons-header__org-logo--small img').attr('src')).toBe('another-logo-small.svg');
319
+ });
413
320
 
414
- it('displays the `title` using the default tag', () => {
415
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
321
+ describe('mode: with multiple logos', () => {
322
+ it('has the default ONS icon when requested', () => {
323
+ const faker = templateFaker();
324
+ const iconsSpy = faker.spy('icon');
325
+
326
+ faker.renderComponent('header', {
327
+ ...EXAMPLE_HEADER_BASIC,
328
+ mastheadLogo: {
329
+ multipleLogos: {
330
+ logo1: {
331
+ logoImage: 'ONS Logo',
332
+ },
333
+ },
334
+ },
335
+ });
336
+ expect(iconsSpy.occurrences[0].iconType).toBe('ons-logo-stacked-en');
337
+ });
338
+
339
+ it('has the provided link', () => {
340
+ const $ = cheerio.load(
341
+ renderComponent('header', {
342
+ ...EXAMPLE_HEADER_BASIC,
343
+ mastheadLogo: {
344
+ multipleLogos: {
345
+ logo1: {
346
+ logoImage: '<img src="a-logo.svg">',
347
+ logoURL: '#0',
348
+ },
349
+ },
350
+ },
351
+ }),
352
+ );
353
+
354
+ expect($('.ons-header__org-logo-link').attr('href')).toBe('#0');
355
+ });
356
+
357
+ it('when multiple images are provided all show', () => {
358
+ const $ = cheerio.load(
359
+ renderComponent('header', {
360
+ ...EXAMPLE_HEADER_BASIC,
361
+ mastheadLogo: {
362
+ multipleLogos: {
363
+ logo1: {
364
+ logoImage: '<img src="a-logo.svg">',
365
+ },
366
+ logo2: {
367
+ logoImage: '<img src="a-second-logo.svg">',
368
+ },
369
+ logo3: {
370
+ logoImage: '<img src="a-third-logo.svg">',
371
+ },
372
+ },
373
+ },
374
+ }),
375
+ );
376
+
377
+ expect($('.ons-header__org-logo--multi img').attr('src')).toBe('a-logo.svg');
378
+ expect($('.ons-header__org-logo--multi img:nth-of-type(2)').attr('src')).toBe('a-second-logo.svg');
379
+ expect($('.ons-header__org-logo--multi img:nth-of-type(3)').attr('src')).toBe('a-third-logo.svg');
380
+ });
381
+
382
+ it('renders multiple logos even when small/large parameters are used', () => {
383
+ const $ = cheerio.load(
384
+ renderComponent('header', {
385
+ ...EXAMPLE_HEADER_BASIC,
386
+ mastheadLogo: {
387
+ small: '<img src="small-logo.svg">',
388
+ large: '<img src="big-logo.svg">',
389
+ multipleLogos: {
390
+ logo1: {
391
+ logoImage: '<img src="a-logo.svg">',
392
+ },
393
+ logo2: {
394
+ logoImage: '<img src="a-second-logo.svg">',
395
+ },
396
+ logo3: {
397
+ logoImage: '<img src="a-third-logo.svg">',
398
+ },
399
+ },
400
+ },
401
+ }),
402
+ );
403
+ expect($('.ons-header__org-logo--large').attr('src')).toBe(undefined);
404
+ expect($('.ons-header__org-logo--multi img').attr('src')).toBe('a-logo.svg');
405
+ });
406
+ });
416
407
 
417
- expect($('.ons-header__title')[0].tagName).toBe('div');
418
- });
408
+ it('displays the `title` text', () => {
409
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
419
410
 
420
- it('displays the `title` using a H1 if `titleAsH1`', () => {
421
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, titleAsH1: true }));
411
+ expect($('.ons-header__title').text()).toBe('Header title');
412
+ });
422
413
 
423
- expect($('.ons-header__title')[0].tagName).toBe('h1');
424
- });
414
+ it('displays the `title` using the default tag', () => {
415
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
425
416
 
426
- it('has the correct `title` link', () => {
427
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, titleUrl: '#0' }));
417
+ expect($('.ons-header__title')[0].tagName).toBe('div');
418
+ });
428
419
 
429
- expect($('.ons-header__title-link').attr('href')).toBe('#0');
430
- });
420
+ it('displays the `title` using a H1 if `titleAsH1`', () => {
421
+ const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, titleAsH1: true }));
431
422
 
432
- it('has the provided large title logo', () => {
433
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, titleLogo: { large: '<img src="another-logo.svg">' } }));
423
+ expect($('.ons-header__title')[0].tagName).toBe('h1');
424
+ });
434
425
 
435
- expect($('.ons-header__title-logo--large img').attr('src')).toBe('another-logo.svg');
436
- });
426
+ it('has the correct `title` link', () => {
427
+ const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, titleUrl: '#0' }));
437
428
 
438
- it('has the provided title logo custom classes', () => {
439
- const $ = cheerio.load(
440
- renderComponent('header', {
441
- ...EXAMPLE_HEADER_BASIC,
442
- titleLogo: { large: 'another-logo.svg', classes: 'custom-class another-custom-class' },
443
- }),
444
- );
429
+ expect($('.ons-header__title-link').attr('href')).toBe('#0');
430
+ });
445
431
 
446
- expect($('.ons-header__title-logo--large').hasClass('custom-class')).toBe(true);
447
- expect($('.ons-header__title-logo--large').hasClass('another-custom-class')).toBe(true);
448
- });
432
+ it('has the provided large title logo', () => {
433
+ const $ = cheerio.load(
434
+ renderComponent('header', { ...EXAMPLE_HEADER_BASIC, titleLogo: { large: '<img src="another-logo.svg">' } }),
435
+ );
449
436
 
450
- it('has the provided small title logo', () => {
451
- const $ = cheerio.load(
452
- renderComponent('header', {
453
- ...EXAMPLE_HEADER_BASIC,
454
- titleLogo: { large: '<img src="another-logo.svg">', small: '<img src="another-logo-small.svg">' },
455
- }),
456
- );
437
+ expect($('.ons-header__title-logo--large img').attr('src')).toBe('another-logo.svg');
438
+ });
457
439
 
458
- expect($('.ons-header__title-logo--small img').attr('src')).toBe('another-logo-small.svg');
459
- });
440
+ it('has the provided title logo custom classes', () => {
441
+ const $ = cheerio.load(
442
+ renderComponent('header', {
443
+ ...EXAMPLE_HEADER_BASIC,
444
+ titleLogo: { large: 'another-logo.svg', classes: 'custom-class another-custom-class' },
445
+ }),
446
+ );
460
447
 
461
- it('displays the `description` text', () => {
462
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, description: 'Header description' }));
448
+ expect($('.ons-header__title-logo--large').hasClass('custom-class')).toBe(true);
449
+ expect($('.ons-header__title-logo--large').hasClass('another-custom-class')).toBe(true);
450
+ });
463
451
 
464
- expect($('.ons-header__description').text()).toBe('Header description');
465
- });
452
+ it('has the provided small title logo', () => {
453
+ const $ = cheerio.load(
454
+ renderComponent('header', {
455
+ ...EXAMPLE_HEADER_BASIC,
456
+ titleLogo: { large: '<img src="another-logo.svg">', small: '<img src="another-logo-small.svg">' },
457
+ }),
458
+ );
466
459
 
467
- it('renders a button with expected parameters', () => {
468
- const faker = templateFaker();
469
- const buttonSpy = faker.spy('button', { suppressOutput: true });
470
-
471
- faker.renderComponent('header', {
472
- ...EXAMPLE_HEADER_BASIC,
473
- button: {
474
- text: 'Save and sign out',
475
- name: 'button-name',
476
- attributes: {
477
- a: 'b',
478
- },
479
- url: '#0',
480
- },
481
- });
482
-
483
- expect(buttonSpy.occurrences).toContainEqual({
484
- text: 'Save and sign out',
485
- classes: 'ons-u-d-no@xxs@m',
486
- variants: 'ghost',
487
- name: 'button-name',
488
- attributes: {
489
- a: 'b',
490
- },
491
- url: '#0',
492
- iconType: 'exit',
493
- iconPosition: 'after',
494
- });
495
- });
460
+ expect($('.ons-header__title-logo--small img').attr('src')).toBe('another-logo-small.svg');
461
+ });
496
462
 
497
- it('has gutterless class if there is no button present', () => {
498
- const $ = cheerio.load(
499
- renderComponent('header', {
500
- ...EXAMPLE_HEADER_BASIC,
501
- }),
502
- );
463
+ it('displays the `description` text', () => {
464
+ const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_BASIC, description: 'Header description' }));
503
465
 
504
- const titleGridDiv = $('.ons-header__main .ons-container .ons-grid');
505
- expect($(titleGridDiv).hasClass('ons-grid--gutterless')).toBe(true);
506
- });
466
+ expect($('.ons-header__description').text()).toBe('Header description');
467
+ });
507
468
 
508
- it('has does not have gutterless class if there is a button present', () => {
509
- const $ = cheerio.load(
510
- renderComponent('header', {
511
- ...EXAMPLE_HEADER_BASIC,
512
- button: {
513
- text: 'Save and sign out',
514
- url: '#0',
515
- iconType: 'exit',
516
- iconPosition: 'after',
517
- },
518
- }),
519
- );
520
-
521
- const titleGridDiv = $('.ons-header__main .ons-container .ons-grid');
522
- expect($(titleGridDiv).hasClass('ons-grid--gutterless')).toBe(false);
523
- });
469
+ it('renders a button with expected parameters', () => {
470
+ const faker = templateFaker();
471
+ const buttonSpy = faker.spy('button', { suppressOutput: true });
472
+
473
+ faker.renderComponent('header', {
474
+ ...EXAMPLE_HEADER_BASIC,
475
+ button: {
476
+ text: 'Save and sign out',
477
+ name: 'button-name',
478
+ attributes: {
479
+ a: 'b',
480
+ },
481
+ url: '#0',
482
+ },
483
+ });
484
+
485
+ expect(buttonSpy.occurrences).toContainEqual({
486
+ text: 'Save and sign out',
487
+ classes: 'ons-u-d-no@xxs@m',
488
+ variants: 'ghost',
489
+ name: 'button-name',
490
+ attributes: {
491
+ a: 'b',
492
+ },
493
+ url: '#0',
494
+ iconType: 'exit',
495
+ iconPosition: 'after',
496
+ });
497
+ });
524
498
 
525
- it('renders the phase banner with expected parameters', () => {
526
- const faker = templateFaker();
527
- const phaseSpy = faker.spy('phase-banner');
499
+ it('has gutterless class if there is no button present', () => {
500
+ const $ = cheerio.load(
501
+ renderComponent('header', {
502
+ ...EXAMPLE_HEADER_BASIC,
503
+ }),
504
+ );
528
505
 
529
- faker.renderComponent('header', {
530
- ...EXAMPLE_HEADER_BASIC,
531
- phase: {
532
- badge: 'Example',
533
- html: 'Example content with a <a href="#">link</a>',
534
- },
535
- });
536
-
537
- expect(phaseSpy.occurrences).toContainEqual({
538
- badge: 'Example',
539
- html: 'Example content with a <a href="#">link</a>',
540
- });
541
- });
506
+ const titleGridDiv = $('.ons-header__main .ons-container .ons-grid');
507
+ expect($(titleGridDiv).hasClass('ons-grid--gutterless')).toBe(true);
508
+ });
542
509
 
543
- it('renders the phase banner in the correct container if `wide`', () => {
544
- const $ = cheerio.load(
545
- renderComponent('header', {
546
- ...EXAMPLE_HEADER_BASIC,
547
- wide: true,
548
- phase: {
549
- badge: 'Example',
550
- html: 'Example content with a <a href="#">link</a>',
551
- },
552
- }),
553
- );
554
-
555
- const phaseContainer = $('.ons-phase-banner .ons-container');
556
- expect($(phaseContainer).hasClass('ons-container--wide')).toBe(true);
557
- });
510
+ it('has does not have gutterless class if there is a button present', () => {
511
+ const $ = cheerio.load(
512
+ renderComponent('header', {
513
+ ...EXAMPLE_HEADER_BASIC,
514
+ button: {
515
+ text: 'Save and sign out',
516
+ url: '#0',
517
+ iconType: 'exit',
518
+ iconPosition: 'after',
519
+ },
520
+ }),
521
+ );
522
+
523
+ const titleGridDiv = $('.ons-header__main .ons-container .ons-grid');
524
+ expect($(titleGridDiv).hasClass('ons-grid--gutterless')).toBe(false);
525
+ });
558
526
 
559
- it('renders the phase banner in the correct container if `fullWidth`', () => {
560
- const $ = cheerio.load(
561
- renderComponent('header', {
562
- ...EXAMPLE_HEADER_BASIC,
563
- fullWidth: true,
564
- phase: {
565
- badge: 'Example',
566
- html: 'Example content with a <a href="#">link</a>',
567
- },
568
- }),
569
- );
570
-
571
- const phaseContainer = $('.ons-phase-banner .ons-container');
572
- expect($(phaseContainer).hasClass('ons-container--full-width')).toBe(true);
573
- });
574
- });
527
+ it('renders the phase banner with expected parameters', () => {
528
+ const faker = templateFaker();
529
+ const phaseSpy = faker.spy('phase-banner');
575
530
 
576
- describe('mode: with service links', () => {
577
- it('has the correct display class when multiple links are provided', () => {
578
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
531
+ faker.renderComponent('header', {
532
+ ...EXAMPLE_HEADER_BASIC,
533
+ phase: {
534
+ badge: 'Example',
535
+ html: 'Example content with a <a href="#">link</a>',
536
+ },
537
+ });
579
538
 
580
- expect($('.ons-header__links .ons-grid__col').hasClass('ons-u-d-no@xxs@m')).toBe(true);
581
- });
539
+ expect(phaseSpy.occurrences).toContainEqual({
540
+ badge: 'Example',
541
+ html: 'Example content with a <a href="#">link</a>',
542
+ });
543
+ });
582
544
 
583
- it('has the correct display class when a single link and language is provided', () => {
584
- const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SERVICE_LINKS_SINGLE, ...EXAMPLE_HEADER_LANGUAGE_CONFIG }));
545
+ it('renders the phase banner in the correct container if `wide`', () => {
546
+ const $ = cheerio.load(
547
+ renderComponent('header', {
548
+ ...EXAMPLE_HEADER_BASIC,
549
+ wide: true,
550
+ phase: {
551
+ badge: 'Example',
552
+ html: 'Example content with a <a href="#">link</a>',
553
+ },
554
+ }),
555
+ );
556
+
557
+ const phaseContainer = $('.ons-phase-banner .ons-container');
558
+ expect($(phaseContainer).hasClass('ons-container--wide')).toBe(true);
559
+ });
585
560
 
586
- expect($('.ons-header__links .ons-grid__col').hasClass('ons-u-d-no@xxs@xs')).toBe(true);
561
+ it('renders the phase banner in the correct container if `fullWidth`', () => {
562
+ const $ = cheerio.load(
563
+ renderComponent('header', {
564
+ ...EXAMPLE_HEADER_BASIC,
565
+ fullWidth: true,
566
+ phase: {
567
+ badge: 'Example',
568
+ html: 'Example content with a <a href="#">link</a>',
569
+ },
570
+ }),
571
+ );
572
+
573
+ const phaseContainer = $('.ons-phase-banner .ons-container');
574
+ expect($(phaseContainer).hasClass('ons-container--full-width')).toBe(true);
575
+ });
587
576
  });
588
577
 
589
- it('does not have the display class when only single link is provided', () => {
590
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
578
+ describe('mode: with service links', () => {
579
+ it('has the correct display class when multiple links are provided', () => {
580
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
591
581
 
592
- expect($('.ons-header__links .ons-grid__col').hasClass('ons-u-d-no@xxs@')).toBe(false);
593
- });
582
+ expect($('.ons-header__links .ons-grid__col').hasClass('ons-u-d-no@xxs@m')).toBe(true);
583
+ });
594
584
 
595
- it('has the provided custom class', () => {
596
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
585
+ it('has the correct display class when a single link and language is provided', () => {
586
+ const $ = cheerio.load(
587
+ renderComponent('header', { ...EXAMPLE_HEADER_SERVICE_LINKS_SINGLE, ...EXAMPLE_HEADER_LANGUAGE_CONFIG }),
588
+ );
597
589
 
598
- expect($('.ons-header-service-nav--main').hasClass('custom-class')).toBe(true);
599
- });
590
+ expect($('.ons-header__links .ons-grid__col').hasClass('ons-u-d-no@xxs@xs')).toBe(true);
591
+ });
600
592
 
601
- it('has the provided `aria-label`', () => {
602
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
593
+ it('does not have the display class when only single link is provided', () => {
594
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
603
595
 
604
- expect($('.ons-header-service-nav--main').attr('aria-label')).toBe('Services menu');
605
- });
596
+ expect($('.ons-header__links .ons-grid__col').hasClass('ons-u-d-no@xxs@')).toBe(false);
597
+ });
606
598
 
607
- it('has the text for each list item', () => {
608
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LIST_ITEMS));
599
+ it('has the provided custom class', () => {
600
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
609
601
 
610
- const values = mapAll($('.ons-header-service-nav--main .ons-header-service-nav__item'), (node) => node.text().trim());
611
- expect(values).toEqual(['Title 1', 'Title 2', 'Title 3']);
612
- });
602
+ expect($('.ons-header-service-nav--main').hasClass('custom-class')).toBe(true);
603
+ });
613
604
 
614
- it('has the link text for each list item', () => {
615
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
605
+ it('has the provided `aria-label`', () => {
606
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
616
607
 
617
- const values = mapAll($('.ons-header-service-nav--main .ons-header-service-nav__link'), (node) => node.text().trim());
618
- expect(values).toEqual(['Title 1', 'Title 2', 'Title 3']);
619
- });
608
+ expect($('.ons-header-service-nav--main').attr('aria-label')).toBe('Services menu');
609
+ });
620
610
 
621
- it('has the link href for each list item', () => {
622
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
611
+ it('has the text for each list item', () => {
612
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LIST_ITEMS));
623
613
 
624
- const values = mapAll($('.ons-header-service-nav--main .ons-header-service-nav__link'), (node) => node.attr('href'));
625
- expect(values).toEqual(['#1', '#2', '#3']);
626
- });
614
+ const values = mapAll($('.ons-header-service-nav--main .ons-header-service-nav__item'), (node) => node.text().trim());
615
+ expect(values).toEqual(['Title 1', 'Title 2', 'Title 3']);
616
+ });
627
617
 
628
- it('has the provided custom class', () => {
629
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
618
+ it('has the link text for each list item', () => {
619
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
630
620
 
631
- expect($('.ons-header-service-nav--main').hasClass('custom-class')).toBe(true);
632
- });
621
+ const values = mapAll($('.ons-header-service-nav--main .ons-header-service-nav__link'), (node) => node.text().trim());
622
+ expect(values).toEqual(['Title 1', 'Title 2', 'Title 3']);
623
+ });
633
624
 
634
- it('has the provided `aria-label` for the list for mobile', () => {
635
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
625
+ it('has the link href for each list item', () => {
626
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
636
627
 
637
- expect($('.ons-header-service-nav--mobile').attr('aria-label')).toBe('Services menu');
638
- });
628
+ const values = mapAll($('.ons-header-service-nav--main .ons-header-service-nav__link'), (node) => node.attr('href'));
629
+ expect(values).toEqual(['#1', '#2', '#3']);
630
+ });
639
631
 
640
- it('has the link text for each list item for mobile', () => {
641
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
632
+ it('has the provided custom class', () => {
633
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
642
634
 
643
- const values = mapAll($('.ons-header-service-nav--mobile .ons-header-service-nav__link'), (node) => node.text().trim());
644
- expect(values).toEqual(['Title 1', 'Title 2', 'Title 3']);
645
- });
635
+ expect($('.ons-header-service-nav--main').hasClass('custom-class')).toBe(true);
636
+ });
646
637
 
647
- it('has the link href for each list item for mobile', () => {
648
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
638
+ it('has the provided `aria-label` for the list for mobile', () => {
639
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
649
640
 
650
- const values = mapAll($('.ons-header-service-nav--mobile .ons-header-service-nav__link'), (node) => node.attr('href'));
651
- expect(values).toEqual(['#1', '#2', '#3']);
652
- });
641
+ expect($('.ons-header-service-nav--mobile').attr('aria-label')).toBe('Services menu');
642
+ });
653
643
 
654
- it('renders a button with expected parameters', () => {
655
- const faker = templateFaker();
656
- const buttonSpy = faker.spy('button', { suppressOutput: true });
644
+ it('has the link text for each list item for mobile', () => {
645
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
657
646
 
658
- faker.renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE);
647
+ const values = mapAll($('.ons-header-service-nav--mobile .ons-header-service-nav__link'), (node) => node.text().trim());
648
+ expect(values).toEqual(['Title 1', 'Title 2', 'Title 3']);
649
+ });
659
650
 
660
- expect(buttonSpy.occurrences).toContainEqual({
661
- text: 'Menu',
662
- classes: 'ons-u-d-no ons-js-toggle-services',
663
- type: 'button',
664
- variants: ['mobile', 'text-link'],
665
- attributes: {
666
- 'aria-label': 'Toggle services menu',
667
- 'aria-controls': 'service-links',
668
- 'aria-expanded': 'false',
669
- },
670
- });
671
- });
651
+ it('has the link href for each list item for mobile', () => {
652
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE));
672
653
 
673
- it('renders a button with correct variant if `internal`', () => {
674
- const faker = templateFaker();
675
- const buttonSpy = faker.spy('button');
654
+ const values = mapAll($('.ons-header-service-nav--mobile .ons-header-service-nav__link'), (node) => node.attr('href'));
655
+ expect(values).toEqual(['#1', '#2', '#3']);
656
+ });
676
657
 
677
- faker.renderComponent('header', {
678
- ...EXAMPLE_HEADER_BASIC,
679
- variants: 'internal',
680
- serviceLinks: {
681
- ...EXAMPLE_SERVICE_LINKS_CONFIG,
682
- itemsList: [
683
- {
684
- title: 'Title',
685
- url: '#0',
686
- },
687
- {
688
- title: 'Title 2',
689
- url: '#0',
690
- },
691
- ],
692
- },
693
- });
658
+ it('renders a button with expected parameters', () => {
659
+ const faker = templateFaker();
660
+ const buttonSpy = faker.spy('button', { suppressOutput: true });
661
+
662
+ faker.renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE);
663
+
664
+ expect(buttonSpy.occurrences).toContainEqual({
665
+ text: 'Menu',
666
+ classes: 'ons-u-d-no ons-js-toggle-services',
667
+ type: 'button',
668
+ variants: ['mobile', 'text-link'],
669
+ attributes: {
670
+ 'aria-label': 'Toggle services menu',
671
+ 'aria-controls': 'service-links',
672
+ 'aria-expanded': 'false',
673
+ },
674
+ });
675
+ });
694
676
 
695
- expect(buttonSpy.occurrences[0]).toHaveProperty('variants', ['mobile', 'text-link', 'text-link-inverse']);
696
- });
677
+ it('renders a button with correct variant if `internal`', () => {
678
+ const faker = templateFaker();
679
+ const buttonSpy = faker.spy('button');
680
+
681
+ faker.renderComponent('header', {
682
+ ...EXAMPLE_HEADER_BASIC,
683
+ variants: 'internal',
684
+ serviceLinks: {
685
+ ...EXAMPLE_SERVICE_LINKS_CONFIG,
686
+ itemsList: [
687
+ {
688
+ title: 'Title',
689
+ url: '#0',
690
+ },
691
+ {
692
+ title: 'Title 2',
693
+ url: '#0',
694
+ },
695
+ ],
696
+ },
697
+ });
697
698
 
698
- it('does not render a button for a single services link', () => {
699
- const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
699
+ expect(buttonSpy.occurrences[0]).toHaveProperty('variants', ['mobile', 'text-link', 'text-link-inverse']);
700
+ });
700
701
 
701
- expect($('.ons-js-toggle-services').length).toBe(0);
702
- });
702
+ it('does not render a button for a single services link', () => {
703
+ const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_SERVICE_LINKS_SINGLE));
703
704
 
704
- it('has the correct list item icon', () => {
705
- const faker = templateFaker();
706
- const iconsSpy = faker.spy('icon');
705
+ expect($('.ons-js-toggle-services').length).toBe(0);
706
+ });
707
707
 
708
- faker.renderComponent('header', {
709
- ...EXAMPLE_HEADER_BASIC,
710
- serviceLinks: {
711
- ...EXAMPLE_SERVICE_LINKS_CONFIG,
712
- itemsList: [
713
- {
714
- title: 'Title 1',
715
- iconType: 'check',
716
- },
717
- ],
718
- },
719
- });
708
+ it('has the correct list item icon', () => {
709
+ const faker = templateFaker();
710
+ const iconsSpy = faker.spy('icon');
711
+
712
+ faker.renderComponent('header', {
713
+ ...EXAMPLE_HEADER_BASIC,
714
+ serviceLinks: {
715
+ ...EXAMPLE_SERVICE_LINKS_CONFIG,
716
+ itemsList: [
717
+ {
718
+ title: 'Title 1',
719
+ iconType: 'check',
720
+ },
721
+ ],
722
+ },
723
+ });
720
724
 
721
- expect(iconsSpy.occurrences[2].iconType).toBe('check');
725
+ expect(iconsSpy.occurrences[2].iconType).toBe('check');
726
+ });
722
727
  });
723
- });
724
-
725
- describe('mode: with language selector', () => {
726
- it('displays the language selector with expected parameters', () => {
727
- const faker = templateFaker();
728
- const languageSpy = faker.spy('language-selector', { suppressOutput: true });
729
728
 
730
- faker.renderComponent('header', { ...EXAMPLE_HEADER_BASIC, ...EXAMPLE_HEADER_LANGUAGE_CONFIG });
731
-
732
- expect(languageSpy.occurrences).toContainEqual({
733
- languages: [
734
- {
735
- url: '#0',
736
- ISOCode: 'en',
737
- text: 'English',
738
- buttonAriaLabel: 'Language selector. Current language: English',
739
- chooseLanguage: 'Choose language',
740
- current: true,
741
- },
742
- {
743
- url: '#0',
744
- ISOCode: 'cy',
745
- text: 'Cymraeg',
746
- buttonAriaLabel: 'Dewisydd iaith. Iaith gyfredol: Cymraeg',
747
- chooseLanguage: 'Dewiswch iaith',
748
- current: false,
749
- },
750
- ],
751
- });
729
+ describe('mode: with language selector', () => {
730
+ it('displays the language selector with expected parameters', () => {
731
+ const faker = templateFaker();
732
+ const languageSpy = faker.spy('language-selector', { suppressOutput: true });
733
+
734
+ faker.renderComponent('header', { ...EXAMPLE_HEADER_BASIC, ...EXAMPLE_HEADER_LANGUAGE_CONFIG });
735
+
736
+ expect(languageSpy.occurrences).toContainEqual({
737
+ languages: [
738
+ {
739
+ url: '#0',
740
+ ISOCode: 'en',
741
+ text: 'English',
742
+ buttonAriaLabel: 'Language selector. Current language: English',
743
+ chooseLanguage: 'Choose language',
744
+ current: true,
745
+ },
746
+ {
747
+ url: '#0',
748
+ ISOCode: 'cy',
749
+ text: 'Cymraeg',
750
+ buttonAriaLabel: 'Dewisydd iaith. Iaith gyfredol: Cymraeg',
751
+ chooseLanguage: 'Dewiswch iaith',
752
+ current: false,
753
+ },
754
+ ],
755
+ });
756
+ });
752
757
  });
753
- });
754
758
 
755
- describe('mode: with navigation', () => {
756
- it('renders the navigation with expected parameters', () => {
757
- const faker = templateFaker();
758
- const navigationSpy = faker.spy('navigation', { suppressOutput: true });
759
-
760
- faker.renderComponent('header', { ...EXAMPLE_HEADER_BASIC, ...EXAMPLE_HEADER_NAVIGATION_CONFIG });
761
-
762
- expect(navigationSpy.occurrences[0]).toEqual({
763
- navigation: {
764
- id: 'main-nav',
765
- ariaLabel: 'Main menu',
766
- currentPath: '#home',
767
- itemsList: [
768
- {
769
- title: 'Home',
770
- url: '#home',
771
- },
772
- {
773
- title: 'Guidance',
774
- url: '#0',
775
- },
776
- ],
777
- toggleNavigationButton: {
778
- text: 'Menu',
779
- ariaLabel: 'Toggle main menu',
780
- },
781
- },
782
- title: 'Header title',
783
- });
784
- });
759
+ describe('mode: with navigation', () => {
760
+ it('renders the navigation with expected parameters', () => {
761
+ const faker = templateFaker();
762
+ const navigationSpy = faker.spy('navigation', { suppressOutput: true });
763
+
764
+ faker.renderComponent('header', { ...EXAMPLE_HEADER_BASIC, ...EXAMPLE_HEADER_NAVIGATION_CONFIG });
765
+
766
+ expect(navigationSpy.occurrences[0]).toEqual({
767
+ navigation: {
768
+ id: 'main-nav',
769
+ ariaLabel: 'Main menu',
770
+ currentPath: '#home',
771
+ itemsList: [
772
+ {
773
+ title: 'Home',
774
+ url: '#home',
775
+ },
776
+ {
777
+ title: 'Guidance',
778
+ url: '#0',
779
+ },
780
+ ],
781
+ toggleNavigationButton: {
782
+ text: 'Menu',
783
+ ariaLabel: 'Toggle main menu',
784
+ },
785
+ },
786
+ title: 'Header title',
787
+ });
788
+ });
785
789
 
786
- it('renders a button to toggle the menu on mobile', () => {
787
- const faker = templateFaker();
788
- const buttonSpy = faker.spy('button');
790
+ it('renders a button to toggle the menu on mobile', () => {
791
+ const faker = templateFaker();
792
+ const buttonSpy = faker.spy('button');
789
793
 
790
- faker.renderComponent('header', { ...EXAMPLE_HEADER_BASIC, ...EXAMPLE_HEADER_NAVIGATION_CONFIG });
794
+ faker.renderComponent('header', { ...EXAMPLE_HEADER_BASIC, ...EXAMPLE_HEADER_NAVIGATION_CONFIG });
791
795
 
792
- expect(buttonSpy.occurrences[0]).toEqual({
793
- text: 'Menu',
794
- classes: 'ons-u-ml-xs ons-u-d-no ons-js-navigation-button ons-u-d-no@l',
795
- variants: ['mobile', 'ghost'],
796
- attributes: {
797
- 'aria-label': 'Toggle main menu',
798
- 'aria-controls': 'main-nav',
799
- 'aria-expanded': 'false',
800
- },
801
- });
802
- });
796
+ expect(buttonSpy.occurrences[0]).toEqual({
797
+ text: 'Menu',
798
+ classes: 'ons-u-ml-xs ons-u-d-no ons-js-navigation-button ons-u-d-no@l',
799
+ variants: ['mobile', 'ghost'],
800
+ attributes: {
801
+ 'aria-label': 'Toggle main menu',
802
+ 'aria-controls': 'main-nav',
803
+ 'aria-expanded': 'false',
804
+ },
805
+ });
806
+ });
803
807
 
804
- it('renders a button to toggle the search on mobile', () => {
805
- const faker = templateFaker();
806
- const buttonSpy = faker.spy('button');
807
-
808
- faker.renderComponent('header', {
809
- ...EXAMPLE_HEADER_BASIC,
810
- navigation: {
811
- id: 'main-nav',
812
- ariaLabel: 'Main menu',
813
- currentPath: '#home',
814
- itemsList: [
815
- {
816
- title: 'Home',
817
- url: '#home',
818
- },
819
- {
820
- title: 'Guidance',
821
- url: '#0',
822
- },
823
- ],
824
- toggleNavigationButton: {
825
- text: 'Menu',
826
- ariaLabel: 'Toggle main menu',
827
- },
828
- },
829
- siteSearchAutosuggest: {},
830
- });
831
-
832
- expect(buttonSpy.occurrences[0]).toEqual({
833
- text: 'Search',
834
- classes: 'ons-btn--search ons-u-ml-xs ons-u-d-no ons-js-toggle-search',
835
- variants: ['small', 'ghost'],
836
- iconType: 'search',
837
- iconPosition: 'only',
838
- attributes: {
839
- 'aria-label': 'Toggle search',
840
- 'aria-controls': 'ons-site-search',
841
- 'aria-expanded': 'false',
842
- },
843
- });
844
- });
808
+ it('renders a button to toggle the search on mobile', () => {
809
+ const faker = templateFaker();
810
+ const buttonSpy = faker.spy('button');
811
+
812
+ faker.renderComponent('header', {
813
+ ...EXAMPLE_HEADER_BASIC,
814
+ navigation: {
815
+ id: 'main-nav',
816
+ ariaLabel: 'Main menu',
817
+ currentPath: '#home',
818
+ itemsList: [
819
+ {
820
+ title: 'Home',
821
+ url: '#home',
822
+ },
823
+ {
824
+ title: 'Guidance',
825
+ url: '#0',
826
+ },
827
+ ],
828
+ toggleNavigationButton: {
829
+ text: 'Menu',
830
+ ariaLabel: 'Toggle main menu',
831
+ },
832
+ },
833
+ siteSearchAutosuggest: {},
834
+ });
835
+
836
+ expect(buttonSpy.occurrences[0]).toEqual({
837
+ text: 'Search',
838
+ classes: 'ons-btn--search ons-u-ml-xs ons-u-d-no ons-js-toggle-search',
839
+ variants: ['small', 'ghost'],
840
+ iconType: 'search',
841
+ iconPosition: 'only',
842
+ attributes: {
843
+ 'aria-label': 'Toggle search',
844
+ 'aria-controls': 'ons-site-search',
845
+ 'aria-expanded': 'false',
846
+ },
847
+ });
848
+ });
845
849
 
846
- it('renders the navigation in the correct container if `wide`', () => {
847
- const $ = cheerio.load(
848
- renderComponent('header', {
849
- ...EXAMPLE_HEADER_BASIC,
850
- wide: true,
851
- ...EXAMPLE_HEADER_NAVIGATION_CONFIG,
852
- }),
853
- );
854
-
855
- const navContainer = $('.ons-navigation-wrapper .ons-container');
856
- expect($(navContainer).hasClass('ons-container--wide')).toBe(true);
857
- });
850
+ it('renders the navigation in the correct container if `wide`', () => {
851
+ const $ = cheerio.load(
852
+ renderComponent('header', {
853
+ ...EXAMPLE_HEADER_BASIC,
854
+ wide: true,
855
+ ...EXAMPLE_HEADER_NAVIGATION_CONFIG,
856
+ }),
857
+ );
858
+
859
+ const navContainer = $('.ons-navigation-wrapper .ons-container');
860
+ expect($(navContainer).hasClass('ons-container--wide')).toBe(true);
861
+ });
858
862
 
859
- it('renders the navigation in the correct container if `fullWidth`', () => {
860
- const $ = cheerio.load(
861
- renderComponent('header', {
862
- ...EXAMPLE_HEADER_BASIC,
863
- fullWidth: true,
864
- ...EXAMPLE_HEADER_NAVIGATION_CONFIG,
865
- }),
866
- );
867
-
868
- const navContainer = $('.ons-navigation-wrapper .ons-container');
869
- expect($(navContainer).hasClass('ons-container--full-width')).toBe(true);
870
- });
863
+ it('renders the navigation in the correct container if `fullWidth`', () => {
864
+ const $ = cheerio.load(
865
+ renderComponent('header', {
866
+ ...EXAMPLE_HEADER_BASIC,
867
+ fullWidth: true,
868
+ ...EXAMPLE_HEADER_NAVIGATION_CONFIG,
869
+ }),
870
+ );
871
+
872
+ const navContainer = $('.ons-navigation-wrapper .ons-container');
873
+ expect($(navContainer).hasClass('ons-container--full-width')).toBe(true);
874
+ });
871
875
 
872
- it('renders the sub-navigation in the correct container if `wide`', () => {
873
- const $ = cheerio.load(
874
- renderComponent('header', {
875
- ...EXAMPLE_HEADER_BASIC,
876
- wide: true,
877
- ...EXAMPLE_HEADER_NAVIGATION_WITH_SUBNAVIGATION_CONFIG,
878
- }),
879
- );
880
-
881
- const subNavContainer = $('.ons-navigation--sub .ons-container');
882
- expect($(subNavContainer).hasClass('ons-container--wide')).toBe(true);
883
- });
876
+ it('renders the sub-navigation in the correct container if `wide`', () => {
877
+ const $ = cheerio.load(
878
+ renderComponent('header', {
879
+ ...EXAMPLE_HEADER_BASIC,
880
+ wide: true,
881
+ ...EXAMPLE_HEADER_NAVIGATION_WITH_SUBNAVIGATION_CONFIG,
882
+ }),
883
+ );
884
+
885
+ const subNavContainer = $('.ons-navigation--sub .ons-container');
886
+ expect($(subNavContainer).hasClass('ons-container--wide')).toBe(true);
887
+ });
884
888
 
885
- it('renders the sub-navigation in the correct container if `fullWidth`', () => {
886
- const $ = cheerio.load(
887
- renderComponent('header', {
888
- ...EXAMPLE_HEADER_BASIC,
889
- fullWidth: true,
890
- ...EXAMPLE_HEADER_NAVIGATION_WITH_SUBNAVIGATION_CONFIG,
891
- }),
892
- );
893
-
894
- const subNavContainer = $('.ons-navigation--sub .ons-container');
895
- expect($(subNavContainer).hasClass('ons-container--full-width')).toBe(true);
889
+ it('renders the sub-navigation in the correct container if `fullWidth`', () => {
890
+ const $ = cheerio.load(
891
+ renderComponent('header', {
892
+ ...EXAMPLE_HEADER_BASIC,
893
+ fullWidth: true,
894
+ ...EXAMPLE_HEADER_NAVIGATION_WITH_SUBNAVIGATION_CONFIG,
895
+ }),
896
+ );
897
+
898
+ const subNavContainer = $('.ons-navigation--sub .ons-container');
899
+ expect($(subNavContainer).hasClass('ons-container--full-width')).toBe(true);
900
+ });
896
901
  });
897
- });
898
902
  });
899
903
 
900
904
  describe('mode: with site search autosuggest', () => {
901
- it('renders the search with expected parameters', () => {
902
- const faker = templateFaker();
903
- const buttonSpy = faker.spy('autosuggest');
904
-
905
- faker.renderComponent('header', EXAMPLE_HEADER_NAVIGATION_WITH_SITESEARCHAUTOSUGGEST);
906
-
907
- expect(buttonSpy.occurrences[0]).toEqual({
908
- ariaLimitedResults: 'Type more characters to improve your search',
909
- minChars: 3,
910
- language: 'en-gb',
911
- ariaMinChars: 'Enter 3 or more characters for suggestions.',
912
- ariaNResults: 'There are {n} suggestions available.',
913
- ariaOneResult: 'There is one suggestion available.',
914
- ariaResultsLabel: 'Country suggestions',
915
- ariaYouHaveSelected: 'You have selected',
916
- containerClasses: 'ons-autosuggest--header',
917
- id: 'ons-site-search',
918
- input: {
919
- accessiblePlaceholder: true,
920
- autocomplete: 'off',
921
- classes: 'ons-input-search ons-input-search--icon',
922
- label: {
923
- classes: 'ons-u-pl-m ons-label--white',
924
- id: 'ons-site-search-label',
925
- text: 'label',
926
- },
927
- },
928
- instructions: 'Use up and down keys to navigate.',
929
- moreResults: 'Continue entering to improve suggestions',
930
- noResults: 'No suggestions found.',
931
- resultsTitle: 'Suggestions',
932
- typeMore: 'Continue entering to get suggestions',
933
- });
934
- });
935
-
936
- describe('when the user inputs text', () => {
937
- let $; // Initialize a Cheerio instance
938
-
939
- const mockData = [
940
- { en: 'England' },
941
- { en: 'Wales' },
942
- { en: 'Scotland' },
943
- { en: 'United States of America' },
944
- { en: 'United States Virgin Islands' },
945
- { en: 'Åland Islands' },
946
- ];
947
-
948
- beforeEach(() => {
949
- $ = cheerio.load(
950
- renderComponent('header', {
951
- ...EXAMPLE_HEADER_NAVIGATION_WITH_SITESEARCHAUTOSUGGEST,
952
- autosuggestData: mockData,
953
- }),
954
- );
905
+ it('renders the search with expected parameters', () => {
906
+ const faker = templateFaker();
907
+ const buttonSpy = faker.spy('autosuggest');
908
+
909
+ faker.renderComponent('header', EXAMPLE_HEADER_NAVIGATION_WITH_SITESEARCHAUTOSUGGEST);
910
+
911
+ expect(buttonSpy.occurrences[0]).toEqual({
912
+ ariaLimitedResults: 'Type more characters to improve your search',
913
+ minChars: 3,
914
+ language: 'en-gb',
915
+ ariaMinChars: 'Enter 3 or more characters for suggestions.',
916
+ ariaNResults: 'There are {n} suggestions available.',
917
+ ariaOneResult: 'There is one suggestion available.',
918
+ ariaResultsLabel: 'Country suggestions',
919
+ ariaYouHaveSelected: 'You have selected',
920
+ containerClasses: 'ons-autosuggest--header',
921
+ id: 'ons-site-search',
922
+ input: {
923
+ accessiblePlaceholder: true,
924
+ autocomplete: 'off',
925
+ classes: 'ons-input-search ons-input-search--icon',
926
+ label: {
927
+ classes: 'ons-u-pl-m ons-label--white',
928
+ id: 'ons-site-search-label',
929
+ text: 'label',
930
+ },
931
+ },
932
+ instructions: 'Use up and down keys to navigate.',
933
+ moreResults: 'Continue entering to improve suggestions',
934
+ noResults: 'No suggestions found.',
935
+ resultsTitle: 'Suggestions',
936
+ typeMore: 'Continue entering to get suggestions',
937
+ });
955
938
  });
956
939
 
957
- it('does not show suggestions when input length < minimum characters', () => {
958
- $('.ons-js-autosuggest-input').val('En');
940
+ describe('when the user inputs text', () => {
941
+ let $; // Initialize a Cheerio instance
942
+
943
+ const mockData = [
944
+ { en: 'England' },
945
+ { en: 'Wales' },
946
+ { en: 'Scotland' },
947
+ { en: 'United States of America' },
948
+ { en: 'United States Virgin Islands' },
949
+ { en: 'Åland Islands' },
950
+ ];
951
+
952
+ beforeEach(() => {
953
+ $ = cheerio.load(
954
+ renderComponent('header', {
955
+ ...EXAMPLE_HEADER_NAVIGATION_WITH_SITESEARCHAUTOSUGGEST,
956
+ autosuggestData: mockData,
957
+ }),
958
+ );
959
+ });
959
960
 
960
- setTimeout(() => {
961
- const suggestionCount = $('.ons-autosuggest__option').length;
962
- expect(suggestionCount).toBe(0);
963
- }, 20);
964
- });
961
+ it('does not show suggestions when input length < minimum characters', () => {
962
+ $('.ons-js-autosuggest-input').val('En');
965
963
 
966
- it('shows suggestions when input length >= minimum characters', () => {
967
- $('.ons-js-autosuggest-input').val('Eng');
964
+ setTimeout(() => {
965
+ const suggestionCount = $('.ons-autosuggest__option').length;
966
+ expect(suggestionCount).toBe(0);
967
+ }, 20);
968
+ });
968
969
 
969
- setTimeout(() => {
970
- const suggestionCount = $('.ons-autosuggest__option').length;
971
- expect(suggestionCount).toBe(1);
972
- }, 20);
973
- });
970
+ it('shows suggestions when input length >= minimum characters', () => {
971
+ $('.ons-js-autosuggest-input').val('Eng');
974
972
 
975
- it('gets the language if set', () => {
976
- $('.ons-js-autosuggest-input').val('Eng');
973
+ setTimeout(() => {
974
+ const suggestionCount = $('.ons-autosuggest__option').length;
975
+ expect(suggestionCount).toBe(1);
976
+ }, 20);
977
+ });
978
+
979
+ it('gets the language if set', () => {
980
+ $('.ons-js-autosuggest-input').val('Eng');
977
981
 
978
- const autosuggestElement = $('.ons-js-autosuggest').attr('data-lang');
979
- expect(autosuggestElement).toBe('en-gb');
982
+ const autosuggestElement = $('.ons-js-autosuggest').attr('data-lang');
983
+ expect(autosuggestElement).toBe('en-gb');
984
+ });
980
985
  });
981
- });
982
986
  });