@ons/design-system 70.0.6 → 70.0.8

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 (308) hide show
  1. package/README.md +11 -17
  2. package/components/access-code/_macro.spec.js +145 -145
  3. package/components/access-code/access-code.dom.js +5 -5
  4. package/components/access-code/access-code.js +16 -16
  5. package/components/access-code/access-code.scss +22 -22
  6. package/components/access-code/access-code.spec.js +17 -17
  7. package/components/accordion/_macro.spec.js +154 -154
  8. package/components/accordion/accordion.dom.js +10 -10
  9. package/components/accordion/accordion.js +50 -50
  10. package/components/accordion/accordion.spec.js +104 -104
  11. package/components/address-input/_macro.spec.js +420 -420
  12. package/components/address-input/autosuggest.address.dom.js +5 -5
  13. package/components/address-input/autosuggest.address.error.js +77 -77
  14. package/components/address-input/autosuggest.address.js +357 -357
  15. package/components/address-input/autosuggest.address.setter.js +95 -95
  16. package/components/address-input/autosuggest.address.spec.js +668 -651
  17. package/components/address-input/example-address-input-editable.njk +1 -1
  18. package/components/address-input/example-address-input.njk +1 -1
  19. package/components/address-output/_address-output.scss +3 -3
  20. package/components/address-output/_macro.spec.js +84 -84
  21. package/components/autosuggest/_autosuggest.scss +114 -114
  22. package/components/autosuggest/_macro.spec.js +255 -255
  23. package/components/autosuggest/autosuggest.dom.js +5 -5
  24. package/components/autosuggest/autosuggest.helpers.js +11 -11
  25. package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
  26. package/components/autosuggest/autosuggest.js +20 -20
  27. package/components/autosuggest/autosuggest.spec.js +542 -536
  28. package/components/autosuggest/autosuggest.ui.js +478 -475
  29. package/components/autosuggest/fuse-config.js +17 -17
  30. package/components/back-to-top/_back-to-top.scss +27 -27
  31. package/components/back-to-top/_macro.spec.js +49 -49
  32. package/components/back-to-top/back-to-top.dom.js +5 -5
  33. package/components/back-to-top/back-to-top.js +52 -52
  34. package/components/back-to-top/back-to-top.spec.js +106 -106
  35. package/components/back-to-top/example-back-to-top.njk +6 -6
  36. package/components/breadcrumbs/_breadcrumbs.scss +63 -65
  37. package/components/breadcrumbs/_macro.spec.js +91 -91
  38. package/components/browser-banner/_browser-banner.scss +23 -23
  39. package/components/browser-banner/_macro.spec.js +92 -92
  40. package/components/button/_button.scss +482 -483
  41. package/components/button/_macro.spec.js +363 -363
  42. package/components/button/button.dom.js +15 -15
  43. package/components/button/button.js +53 -53
  44. package/components/button/button.spec.js +248 -240
  45. package/components/call-to-action/_call-to-action.scss +5 -5
  46. package/components/call-to-action/_macro.spec.js +28 -28
  47. package/components/card/_card.scss +23 -23
  48. package/components/card/_macro.spec.js +180 -180
  49. package/components/char-check-limit/_macro.spec.js +48 -48
  50. package/components/char-check-limit/character-check.js +58 -58
  51. package/components/char-check-limit/character-check.spec.js +173 -173
  52. package/components/char-check-limit/character-limit.js +40 -40
  53. package/components/checkboxes/_checkbox-macro.spec.js +355 -355
  54. package/components/checkboxes/_checkbox.scss +180 -180
  55. package/components/checkboxes/_checkboxes.scss +37 -27
  56. package/components/checkboxes/_macro.spec.js +261 -261
  57. package/components/checkboxes/checkbox-with-autoselect.js +32 -32
  58. package/components/checkboxes/checkbox-with-fieldset.js +21 -21
  59. package/components/checkboxes/checkboxes-with-reveal.js +10 -10
  60. package/components/checkboxes/checkboxes.dom.js +27 -27
  61. package/components/checkboxes/checkboxes.spec.js +183 -183
  62. package/components/content-pagination/_content-pagination.scss +41 -41
  63. package/components/content-pagination/_macro.spec.js +159 -159
  64. package/components/cookies-banner/_cookies-banner.scss +22 -22
  65. package/components/cookies-banner/_macro.spec.js +177 -177
  66. package/components/cookies-banner/cookies-banner.dom.js +7 -7
  67. package/components/cookies-banner/cookies-banner.js +76 -76
  68. package/components/cookies-banner/cookies-banner.spec.js +72 -68
  69. package/components/date-input/_macro.spec.js +338 -338
  70. package/components/description-list/_description-list.scss +23 -23
  71. package/components/description-list/_macro.spec.js +144 -144
  72. package/components/details/_details.scss +109 -109
  73. package/components/details/_macro.spec.js +132 -132
  74. package/components/details/details.dom.js +6 -6
  75. package/components/details/details.js +60 -60
  76. package/components/details/details.spec.js +106 -106
  77. package/components/document-list/_macro.spec.js +444 -444
  78. package/components/document-list/document-list.scss +145 -149
  79. package/components/download-resources/_download-resources.scss +109 -108
  80. package/components/download-resources/download-resources.js +907 -900
  81. package/components/download-resources/download-resources.spec.js +461 -461
  82. package/components/duration/_macro.spec.js +291 -291
  83. package/components/error/_macro.spec.js +72 -72
  84. package/components/external-link/_external-link.scss +19 -19
  85. package/components/external-link/_macro.spec.js +68 -68
  86. package/components/feedback/_feedback.scss +31 -31
  87. package/components/feedback/_macro.spec.js +72 -72
  88. package/components/field/_field-group.scss +10 -10
  89. package/components/field/_field.scss +16 -16
  90. package/components/field/_macro.spec.js +80 -80
  91. package/components/fieldset/_fieldset.scss +27 -27
  92. package/components/fieldset/_macro.spec.js +161 -161
  93. package/components/footer/_footer.scss +45 -45
  94. package/components/footer/_macro.spec.js +452 -452
  95. package/components/header/_header.scss +202 -202
  96. package/components/header/_macro.spec.js +833 -829
  97. package/components/helpers/_grid.scss +4 -4
  98. package/components/hero/_hero.scss +48 -48
  99. package/components/hero/_macro.spec.js +59 -59
  100. package/components/icon/_icon.scss +44 -44
  101. package/components/icon/_macro.spec.js +110 -110
  102. package/components/image/_image.scss +11 -11
  103. package/components/image/_macro.spec.js +81 -81
  104. package/components/input/_input-type.scss +86 -89
  105. package/components/input/_input.scss +123 -124
  106. package/components/input/_macro.spec.js +604 -604
  107. package/components/input/character-check.dom.js +5 -5
  108. package/components/input/input.dom.js +5 -5
  109. package/components/input/input.js +10 -10
  110. package/components/input/input.spec.js +18 -18
  111. package/components/label/_label.scss +24 -24
  112. package/components/label/_macro.spec.js +173 -170
  113. package/components/language-selector/_macro.spec.js +97 -97
  114. package/components/language-selector/language.scss +7 -7
  115. package/components/list/_list.scss +84 -84
  116. package/components/list/_macro.njk +2 -2
  117. package/components/list/_macro.spec.js +583 -583
  118. package/components/message/_macro.njk +5 -5
  119. package/components/message/_macro.spec.js +74 -74
  120. package/components/message/_message.scss +39 -39
  121. package/components/message-list/_macro.spec.js +86 -86
  122. package/components/message-list/_message-list.scss +16 -16
  123. package/components/modal/_macro.spec.js +69 -69
  124. package/components/modal/_modal.scss +36 -36
  125. package/components/modal/modal.dom.js +6 -6
  126. package/components/modal/modal.js +89 -89
  127. package/components/modal/modal.spec.js +50 -50
  128. package/components/mutually-exclusive/_macro.spec.js +140 -140
  129. package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
  130. package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
  131. package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
  132. package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
  133. package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
  134. package/components/mutually-exclusive/mutually-exclusive.js +137 -137
  135. package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
  136. package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
  137. package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
  138. package/components/navigation/_macro.spec.js +360 -354
  139. package/components/navigation/_navigation.scss +122 -123
  140. package/components/navigation/navigation.dom.js +35 -35
  141. package/components/navigation/navigation.js +49 -49
  142. package/components/navigation/navigation.spec.js +249 -249
  143. package/components/pagination/_macro.spec.js +342 -335
  144. package/components/pagination/_pagination.scss +58 -58
  145. package/components/panel/_macro.spec.js +372 -372
  146. package/components/panel/_panel.scss +200 -199
  147. package/components/password/_macro.spec.js +95 -95
  148. package/components/password/password.dom.js +5 -5
  149. package/components/password/password.js +10 -10
  150. package/components/password/password.spec.js +26 -26
  151. package/components/phase-banner/_macro.spec.js +86 -86
  152. package/components/phase-banner/_phase-banner.scss +16 -16
  153. package/components/question/_macro.spec.js +235 -235
  154. package/components/question/_question.scss +24 -24
  155. package/components/quote/_macro.spec.js +52 -52
  156. package/components/quote/_quote.scss +24 -24
  157. package/components/radios/_macro.spec.js +524 -524
  158. package/components/radios/_radio.scss +49 -48
  159. package/components/radios/_radios.scss +14 -20
  160. package/components/radios/check-radios.js +21 -21
  161. package/components/radios/clear-radios.js +45 -45
  162. package/components/radios/radio-with-fieldset.js +22 -22
  163. package/components/radios/radios.dom.js +32 -32
  164. package/components/radios/radios.spec.js +251 -251
  165. package/components/related-content/_macro.spec.js +109 -109
  166. package/components/related-content/_related-content.scss +12 -12
  167. package/components/related-content/_section-macro.spec.js +20 -20
  168. package/components/relationships/_macro.spec.js +94 -94
  169. package/components/relationships/_relationships.scss +9 -9
  170. package/components/relationships/relationships.dom.js +5 -5
  171. package/components/relationships/relationships.js +18 -18
  172. package/components/relationships/relationships.spec.js +71 -71
  173. package/components/reply/_macro.spec.js +47 -47
  174. package/components/reply/reply-input.js +15 -15
  175. package/components/reply/reply.dom.js +5 -5
  176. package/components/reply/reply.spec.js +57 -57
  177. package/components/section-navigation/_macro.spec.js +210 -210
  178. package/components/section-navigation/_section-navigation.scss +76 -76
  179. package/components/select/_macro.spec.js +166 -166
  180. package/components/share-page/_macro.spec.js +68 -68
  181. package/components/skip-to-content/_macro.spec.js +54 -54
  182. package/components/skip-to-content/_skip.scss +30 -30
  183. package/components/skip-to-content/skip-to-content.dom.js +6 -6
  184. package/components/skip-to-content/skip-to-content.js +7 -7
  185. package/components/skip-to-content/skip-to-content.spec.js +21 -21
  186. package/components/status/_macro.spec.js +53 -53
  187. package/components/status/_status.scss +32 -32
  188. package/components/summary/_macro.spec.js +551 -535
  189. package/components/summary/_summary.scss +191 -195
  190. package/components/table/_macro.spec.js +499 -499
  191. package/components/table/_table.scss +204 -201
  192. package/components/table/scrollable-table.dom.js +5 -5
  193. package/components/table/scrollable-table.js +60 -60
  194. package/components/table/sortable-table.dom.js +5 -5
  195. package/components/table/sortable-table.js +135 -135
  196. package/components/table/table.spec.js +144 -140
  197. package/components/table-of-contents/_macro.spec.js +125 -125
  198. package/components/table-of-contents/_toc.scss +9 -9
  199. package/components/table-of-contents/toc.dom.js +5 -5
  200. package/components/table-of-contents/toc.js +30 -30
  201. package/components/table-of-contents/toc.spec.js +88 -88
  202. package/components/tabs/_macro.spec.js +92 -92
  203. package/components/tabs/_tabs.scss +120 -115
  204. package/components/tabs/tabs.dom.js +5 -5
  205. package/components/tabs/tabs.js +266 -266
  206. package/components/tabs/tabs.spec.js +268 -268
  207. package/components/text-indent/_macro.spec.js +33 -33
  208. package/components/text-indent/_text-indent.scss +3 -3
  209. package/components/textarea/_macro.spec.js +238 -238
  210. package/components/textarea/textarea.dom.js +5 -5
  211. package/components/textarea/textarea.spec.js +78 -74
  212. package/components/timeline/_macro.spec.js +83 -83
  213. package/components/timeline/_timeline.scss +26 -26
  214. package/components/timeout-modal/_macro.spec.js +47 -47
  215. package/components/timeout-modal/timeout-modal.dom.js +9 -9
  216. package/components/timeout-modal/timeout-modal.js +66 -66
  217. package/components/timeout-modal/timeout-modal.spec.js +157 -157
  218. package/components/timeout-panel/_macro.spec.js +41 -41
  219. package/components/timeout-panel/timeout-panel.dom.js +8 -8
  220. package/components/timeout-panel/timeout-panel.spec.js +118 -118
  221. package/components/upload/_macro.spec.js +52 -52
  222. package/components/upload/_upload.scss +28 -28
  223. package/components/video/_macro.spec.js +42 -42
  224. package/components/video/_video.scss +16 -16
  225. package/components/video/video.dom.js +5 -5
  226. package/components/video/video.js +32 -32
  227. package/components/video/video.spec.js +103 -97
  228. package/css/main.css +1 -1
  229. package/favicons/android-chrome-192x192.png +0 -0
  230. package/favicons/android-chrome-512x512.png +0 -0
  231. package/favicons/apple-touch-icon.png +0 -0
  232. package/favicons/favicon-16x16.png +0 -0
  233. package/favicons/favicon-32x32.png +0 -0
  234. package/favicons/favicon.ico +0 -0
  235. package/favicons/manifest.json +25 -25
  236. package/favicons/maskable_icon.png +0 -0
  237. package/favicons/opengraph.png +0 -0
  238. package/favicons/twitter.png +0 -0
  239. package/img/large/alison-pritchard-featured.jpg +0 -0
  240. package/img/large/alison-pritchard.jpg +0 -0
  241. package/img/large/census-monuments-lights-featured.jpg +0 -0
  242. package/img/large/census-monuments-lights.jpg +0 -0
  243. package/img/large/mother-and-daughter-in-ireland.jpg +0 -0
  244. package/img/large/mum-and-child-healthcare-belfast.jpg +0 -0
  245. package/img/large/ons-award-winners.jpg +0 -0
  246. package/img/large/placeholder-card.png +0 -0
  247. package/img/large/placeholder-news-medium.png +0 -0
  248. package/img/large/placeholder-news.png +0 -0
  249. package/img/large/placeholder-portrait.png +0 -0
  250. package/img/large/students.jpg +0 -0
  251. package/img/large/woman-in-purple-dress-shirt.jpg +0 -0
  252. package/img/small/alison-pritchard-featured.jpg +0 -0
  253. package/img/small/alison-pritchard.jpg +0 -0
  254. package/img/small/census-monuments-lights-featured.jpg +0 -0
  255. package/img/small/census-monuments-lights.jpg +0 -0
  256. package/img/small/mother-and-daughter-in-ireland.jpg +0 -0
  257. package/img/small/mum-and-child-healthcare-belfast.jpg +0 -0
  258. package/img/small/ons-award-winners.jpg +0 -0
  259. package/img/small/placeholder-card.png +0 -0
  260. package/img/small/placeholder-news-medium.png +0 -0
  261. package/img/small/placeholder-news.png +0 -0
  262. package/img/small/placeholder-portrait.png +0 -0
  263. package/img/small/students.jpg +0 -0
  264. package/img/small/woman-in-purple-dress-shirt.jpg +0 -0
  265. package/js/abortable-fetch.js +23 -23
  266. package/js/analytics.js +53 -53
  267. package/js/cookies-functions.js +135 -135
  268. package/js/cookies-settings.dom.js +7 -7
  269. package/js/cookies-settings.js +77 -77
  270. package/js/cookies-settings.spec.js +106 -106
  271. package/js/domready.js +8 -8
  272. package/js/fetch.js +14 -14
  273. package/js/inpagelink.dom.js +5 -5
  274. package/js/inpagelink.js +19 -19
  275. package/js/polyfills.js +0 -1
  276. package/js/print-button.js +6 -6
  277. package/js/timeout.js +211 -211
  278. package/layout/_template.njk +5 -7
  279. package/package.json +131 -127
  280. package/scripts/main.es5.js +1 -1
  281. package/scripts/main.js +1 -1
  282. package/scss/base/_forms.scss +10 -10
  283. package/scss/base/_global.scss +45 -44
  284. package/scss/base/_typography.scss +20 -20
  285. package/scss/helpers/_functions.scss +18 -15
  286. package/scss/helpers/_mixins.scss +59 -53
  287. package/scss/helpers/_mq.scss +62 -65
  288. package/scss/objects/_container.scss +20 -20
  289. package/scss/objects/_page.scss +33 -33
  290. package/scss/objects/_spacing.scss +10 -10
  291. package/scss/overrides/hcm.scss +237 -237
  292. package/scss/overrides/rtl.scss +95 -95
  293. package/scss/print.scss +47 -47
  294. package/scss/utilities/_border.scss +7 -7
  295. package/scss/utilities/_colors.scss +6 -6
  296. package/scss/utilities/_display.scss +8 -8
  297. package/scss/utilities/_float.scss +7 -7
  298. package/scss/utilities/_grid.scss +144 -144
  299. package/scss/utilities/_highlight.scss +4 -4
  300. package/scss/utilities/_margin.scss +17 -17
  301. package/scss/utilities/_pad.scss +15 -15
  302. package/scss/utilities/_typography.scss +35 -33
  303. package/scss/utilities/_utilities.scss +8 -8
  304. package/scss/utilities/_visibility.scss +25 -25
  305. package/scss/vars/_colors.scss +116 -116
  306. package/scss/vars/_forms.scss +22 -22
  307. package/scss/vars/_grid.scss +11 -9
  308. 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
  });