@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
@@ -5,364 +5,364 @@ import { renderComponent, setTestPage } from '../../tests/helpers/rendering';
5
5
  const iPhoneX = KnownDevices['iPhone X'];
6
6
 
7
7
  const EXAMPLE_TABS = {
8
- title: 'Example tabs',
9
- titleClasses: 'ons-u-fs-m',
10
- tabs: [
11
- {
12
- id: 'tab.id.1',
13
- title: 'Tab 1',
14
- showTitle: true,
15
- content: 'First content...',
16
- },
17
- {
18
- id: 'tab.id.2',
19
- title: 'Tab 2',
20
- content: 'Second content...',
21
- },
22
- {
23
- id: 'tab.id.3',
24
- title: 'Tab 3',
25
- content: 'Third content...',
26
- },
27
- ],
8
+ title: 'Example tabs',
9
+ titleClasses: 'ons-u-fs-m',
10
+ tabs: [
11
+ {
12
+ id: 'tab.id.1',
13
+ title: 'Tab 1',
14
+ showTitle: true,
15
+ content: 'First content...',
16
+ },
17
+ {
18
+ id: 'tab.id.2',
19
+ title: 'Tab 2',
20
+ content: 'Second content...',
21
+ },
22
+ {
23
+ id: 'tab.id.3',
24
+ title: 'Tab 3',
25
+ content: 'Third content...',
26
+ },
27
+ ],
28
28
  };
29
29
 
30
30
  const EXAMPLE_TABS_LONGER = {
31
- title: 'Example tabs',
32
- tabs: [
33
- {
34
- id: 'tab.id.1',
35
- title: 'Tab 1',
36
- showTitle: true,
37
- content: 'First content...',
38
- },
39
- {
40
- id: 'tab.id.2',
41
- title: 'Tab 2',
42
- content: 'Second content...',
43
- },
44
- {
45
- id: 'tab.id.3',
46
- title: 'Tab 3',
47
- content: 'Third content...',
48
- },
49
- {
50
- id: 'tab.id.4',
51
- title: 'Tab 4',
52
- content: 'Fourth content...',
53
- },
54
- {
55
- id: 'tab.id.5',
56
- title: 'Tab 5',
57
- content: 'Fifth content...',
58
- },
59
- ],
31
+ title: 'Example tabs',
32
+ tabs: [
33
+ {
34
+ id: 'tab.id.1',
35
+ title: 'Tab 1',
36
+ showTitle: true,
37
+ content: 'First content...',
38
+ },
39
+ {
40
+ id: 'tab.id.2',
41
+ title: 'Tab 2',
42
+ content: 'Second content...',
43
+ },
44
+ {
45
+ id: 'tab.id.3',
46
+ title: 'Tab 3',
47
+ content: 'Third content...',
48
+ },
49
+ {
50
+ id: 'tab.id.4',
51
+ title: 'Tab 4',
52
+ content: 'Fourth content...',
53
+ },
54
+ {
55
+ id: 'tab.id.5',
56
+ title: 'Tab 5',
57
+ content: 'Fifth content...',
58
+ },
59
+ ],
60
60
  };
61
61
 
62
62
  const EXAMPLE_TABS_WITH_NO_INITIAL_ACTIVE_TAB = {
63
- ...EXAMPLE_TABS,
64
- noInitialActiveTab: true,
63
+ ...EXAMPLE_TABS,
64
+ noInitialActiveTab: true,
65
65
  };
66
66
 
67
67
  describe('script: tabs', () => {
68
- afterEach(async () => {
69
- // Clear viewport size and browser emulation after each test.
70
- await jestPuppeteer.resetPage();
71
- });
72
-
73
- describe('when the viewport is large', () => {
74
- beforeEach(async () => {
75
- await setViewport(page, { width: 1650, height: 1050 });
76
- await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS));
68
+ afterEach(async () => {
69
+ // Clear viewport size and browser emulation after each test.
70
+ await jestPuppeteer.resetPage();
77
71
  });
78
72
 
79
- it('has additionally provided `titleClasses`', async () => {
80
- const hasClass = await page.$eval('.ons-tabs__title', (node) => node.classList.contains('ons-u-fs-m'));
73
+ describe('when the viewport is large', () => {
74
+ beforeEach(async () => {
75
+ await setViewport(page, { width: 1650, height: 1050 });
76
+ await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS));
77
+ });
81
78
 
82
- expect(hasClass).toBe(true);
83
- });
79
+ it('has additionally provided `titleClasses`', async () => {
80
+ const hasClass = await page.$eval('.ons-tabs__title', (node) => node.classList.contains('ons-u-fs-m'));
84
81
 
85
- it('has the "presentation" role assigned to tab list items', async () => {
86
- const role = await page.$eval('.ons-tab__list-item', (node) => node.getAttribute('role'));
87
- expect(role).toBe('presentation');
88
- });
82
+ expect(hasClass).toBe(true);
83
+ });
89
84
 
90
- it('has the "tab" role assigned to each tab', async () => {
91
- const tabRoleValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('role')));
85
+ it('has the "presentation" role assigned to tab list items', async () => {
86
+ const role = await page.$eval('.ons-tab__list-item', (node) => node.getAttribute('role'));
87
+ expect(role).toBe('presentation');
88
+ });
92
89
 
93
- expect(tabRoleValues).toEqual(['tab', 'tab', 'tab']);
94
- });
90
+ it('has the "tab" role assigned to each tab', async () => {
91
+ const tabRoleValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('role')));
95
92
 
96
- it('has "aria-controls" assigned to each tab with the corresponding panel id', async () => {
97
- const ariaControlsValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('aria-controls')));
93
+ expect(tabRoleValues).toEqual(['tab', 'tab', 'tab']);
94
+ });
98
95
 
99
- expect(ariaControlsValues).toEqual(['tab.id.1', 'tab.id.2', 'tab.id.3']);
100
- });
96
+ it('has "aria-controls" assigned to each tab with the corresponding panel id', async () => {
97
+ const ariaControlsValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('aria-controls')));
101
98
 
102
- it('has "aria-selected" assigned to the first tab', async () => {
103
- const ariaSelectedValue = await page.$eval('.ons-tab', (node) => node.getAttribute('aria-selected'));
99
+ expect(ariaControlsValues).toEqual(['tab.id.1', 'tab.id.2', 'tab.id.3']);
100
+ });
104
101
 
105
- expect(ariaSelectedValue).toBe('true');
106
- });
102
+ it('has "aria-selected" assigned to the first tab', async () => {
103
+ const ariaSelectedValue = await page.$eval('.ons-tab', (node) => node.getAttribute('aria-selected'));
107
104
 
108
- it('has the "ons-tab--selected" class assigned to the first tab', async () => {
109
- const hasClass = await page.$eval('.ons-tab', (node) => node.classList.contains('ons-tab--selected'));
105
+ expect(ariaSelectedValue).toBe('true');
106
+ });
110
107
 
111
- expect(hasClass).toBe(true);
112
- });
108
+ it('has the "ons-tab--selected" class assigned to the first tab', async () => {
109
+ const hasClass = await page.$eval('.ons-tab', (node) => node.classList.contains('ons-tab--selected'));
113
110
 
114
- it('has "tabindex" assigned to each tab', async () => {
115
- const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
111
+ expect(hasClass).toBe(true);
112
+ });
116
113
 
117
- expect(tabIndexValues).toEqual(['0', '-1', '-1']);
118
- });
114
+ it('has "tabindex" assigned to each tab', async () => {
115
+ const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
119
116
 
120
- it('has only one visible tab panel', async () => {
121
- const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
122
- nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
123
- );
117
+ expect(tabIndexValues).toEqual(['0', '-1', '-1']);
118
+ });
124
119
 
125
- expect(panelHiddenStates).toEqual([false, true, true]);
126
- });
120
+ it('has only one visible tab panel', async () => {
121
+ const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
122
+ nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
123
+ );
127
124
 
128
- describe('when a tab is clicked', () => {
129
- beforeEach(async () => {
130
- await page.focus('a[href="#tab.id.2"]');
131
- await page.keyboard.press('Enter');
132
- });
125
+ expect(panelHiddenStates).toEqual([false, true, true]);
126
+ });
133
127
 
134
- it('is assigned a "tabindex" value', async () => {
135
- const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
128
+ describe('when a tab is clicked', () => {
129
+ beforeEach(async () => {
130
+ await page.focus('a[href="#tab.id.2"]');
131
+ await page.keyboard.press('Enter');
132
+ });
136
133
 
137
- expect(tabIndexValues).toEqual(['-1', '0', '-1']);
138
- });
134
+ it('is assigned a "tabindex" value', async () => {
135
+ const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
139
136
 
140
- it('has the "aria-selected" attribute', async () => {
141
- const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
137
+ expect(tabIndexValues).toEqual(['-1', '0', '-1']);
138
+ });
142
139
 
143
- expect(ariaSelectedValue).toBe('true');
144
- });
140
+ it('has the "aria-selected" attribute', async () => {
141
+ const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
145
142
 
146
- it('has the "ons-tab--selected" class assigned', async () => {
147
- const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
143
+ expect(ariaSelectedValue).toBe('true');
144
+ });
148
145
 
149
- expect(hasClass).toBe(true);
150
- });
146
+ it('has the "ons-tab--selected" class assigned', async () => {
147
+ const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
151
148
 
152
- it('shows the corresponding panel', async () => {
153
- const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
154
- nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
155
- );
149
+ expect(hasClass).toBe(true);
150
+ });
156
151
 
157
- expect(panelHiddenStates).toEqual([true, false, true]);
158
- });
159
- });
152
+ it('shows the corresponding panel', async () => {
153
+ const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
154
+ nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
155
+ );
160
156
 
161
- describe('when the right arrow key is pressed', () => {
162
- it('focuses the next tab', async () => {
163
- await page.focus('a[href="#tab.id.2"]');
164
- await page.keyboard.press('ArrowRight');
157
+ expect(panelHiddenStates).toEqual([true, false, true]);
158
+ });
159
+ });
165
160
 
166
- const activeElement = await page.evaluate(() => document.activeElement.innerText);
167
- expect(activeElement).toBe('Tab 3');
168
- });
169
- });
161
+ describe('when the right arrow key is pressed', () => {
162
+ it('focuses the next tab', async () => {
163
+ await page.focus('a[href="#tab.id.2"]');
164
+ await page.keyboard.press('ArrowRight');
170
165
 
171
- describe('when the left arrow key is pressed', () => {
172
- it('focuses the previous tab', async () => {
173
- await page.focus('a[href="#tab.id.2"]');
174
- await page.keyboard.press('ArrowLeft');
166
+ const activeElement = await page.evaluate(() => document.activeElement.innerText);
167
+ expect(activeElement).toBe('Tab 3');
168
+ });
169
+ });
175
170
 
176
- const activeElement = await page.evaluate(() => document.activeElement.innerText);
177
- expect(activeElement).toBe('Tab 1');
178
- });
179
- });
180
- });
171
+ describe('when the left arrow key is pressed', () => {
172
+ it('focuses the previous tab', async () => {
173
+ await page.focus('a[href="#tab.id.2"]');
174
+ await page.keyboard.press('ArrowLeft');
181
175
 
182
- describe('when a hash for a tab is in the url', () => {
183
- beforeEach(async () => {
184
- await setViewport(page, { width: 1650, height: 1050 });
185
- await setTestPage('/test#tab.id.2', renderComponent('tabs', EXAMPLE_TABS));
176
+ const activeElement = await page.evaluate(() => document.activeElement.innerText);
177
+ expect(activeElement).toBe('Tab 1');
178
+ });
179
+ });
186
180
  });
187
181
 
188
- it('is assigned a "tabindex" value', async () => {
189
- const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
182
+ describe('when a hash for a tab is in the url', () => {
183
+ beforeEach(async () => {
184
+ await setViewport(page, { width: 1650, height: 1050 });
185
+ await setTestPage('/test#tab.id.2', renderComponent('tabs', EXAMPLE_TABS));
186
+ });
190
187
 
191
- expect(tabIndexValues).toEqual(['-1', '0', '-1']);
192
- });
188
+ it('is assigned a "tabindex" value', async () => {
189
+ const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
193
190
 
194
- it('has the "aria-selected" attribute', async () => {
195
- const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
191
+ expect(tabIndexValues).toEqual(['-1', '0', '-1']);
192
+ });
196
193
 
197
- expect(ariaSelectedValue).toBe('true');
198
- });
194
+ it('has the "aria-selected" attribute', async () => {
195
+ const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
199
196
 
200
- it('has the "ons-tab--selected" class assigned', async () => {
201
- const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
197
+ expect(ariaSelectedValue).toBe('true');
198
+ });
202
199
 
203
- expect(hasClass).toBe(true);
204
- });
200
+ it('has the "ons-tab--selected" class assigned', async () => {
201
+ const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
202
+
203
+ expect(hasClass).toBe(true);
204
+ });
205
205
 
206
- it('shows the corresponding panel', async () => {
207
- const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
208
- nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
209
- );
206
+ it('shows the corresponding panel', async () => {
207
+ const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
208
+ nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
209
+ );
210
210
 
211
- expect(panelHiddenStates).toEqual([true, false, true]);
211
+ expect(panelHiddenStates).toEqual([true, false, true]);
212
+ });
212
213
  });
213
- });
214
214
 
215
- describe('when the viewport is small', () => {
216
- beforeEach(async () => {
217
- await page.emulate(iPhoneX);
215
+ describe('when the viewport is small', () => {
216
+ beforeEach(async () => {
217
+ await page.emulate(iPhoneX);
218
218
 
219
- await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS_LONGER));
220
- });
219
+ await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS_LONGER));
220
+ });
221
221
 
222
- it('has no aria attributes on tabs', async () => {
223
- const tabElements = await page.$$('.ons-tab');
224
- for (let i = 0; i < 3; ++i) {
225
- const hasRoleAttribute = await tabElements[i].evaluate((node) => node.getAttribute('role') !== null);
226
- expect(hasRoleAttribute).toBe(false);
222
+ it('has no aria attributes on tabs', async () => {
223
+ const tabElements = await page.$$('.ons-tab');
224
+ for (let i = 0; i < 3; ++i) {
225
+ const hasRoleAttribute = await tabElements[i].evaluate((node) => node.getAttribute('role') !== null);
226
+ expect(hasRoleAttribute).toBe(false);
227
227
 
228
- const hasAriaControlsAttribute = await tabElements[i].evaluate((node) => node.getAttribute('aria-controls') !== null);
229
- expect(hasAriaControlsAttribute).toBe(false);
228
+ const hasAriaControlsAttribute = await tabElements[i].evaluate((node) => node.getAttribute('aria-controls') !== null);
229
+ expect(hasAriaControlsAttribute).toBe(false);
230
230
 
231
- const hasAriaSelectedAttribute = await tabElements[i].evaluate((node) => node.getAttribute('aria-selected') !== null);
232
- expect(hasAriaSelectedAttribute).toBe(false);
233
- }
234
- });
231
+ const hasAriaSelectedAttribute = await tabElements[i].evaluate((node) => node.getAttribute('aria-selected') !== null);
232
+ expect(hasAriaSelectedAttribute).toBe(false);
233
+ }
234
+ });
235
235
 
236
- it('has no hidden tab panels', async () => {
237
- const panelCount = await page.$$eval('.ons-tabs__panel', (nodes) => nodes.length);
238
- expect(panelCount).toBe(5);
236
+ it('has no hidden tab panels', async () => {
237
+ const panelCount = await page.$$eval('.ons-tabs__panel', (nodes) => nodes.length);
238
+ expect(panelCount).toBe(5);
239
239
 
240
- const hiddenPanelCount = await page.$$eval('.ons-tabs__panel--hidden', (nodes) => nodes.length);
241
- expect(hiddenPanelCount).toBe(0);
242
- });
240
+ const hiddenPanelCount = await page.$$eval('.ons-tabs__panel--hidden', (nodes) => nodes.length);
241
+ expect(hiddenPanelCount).toBe(0);
242
+ });
243
243
 
244
- it('displays a h2 element with a unique id', async () => {
245
- const panelCount = await page.$$eval('#tab-1-content-title', (nodes) => nodes.length);
246
- expect(panelCount).toBe(1);
244
+ it('displays a h2 element with a unique id', async () => {
245
+ const panelCount = await page.$$eval('#tab-1-content-title', (nodes) => nodes.length);
246
+ expect(panelCount).toBe(1);
247
+ });
247
248
  });
248
- });
249
249
 
250
- describe('when `data-no-initial-active-tab` is present', () => {
251
- beforeEach(async () => {
252
- await setViewport(page, { width: 1650, height: 1050 });
253
- await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS_WITH_NO_INITIAL_ACTIVE_TAB));
254
- });
250
+ describe('when `data-no-initial-active-tab` is present', () => {
251
+ beforeEach(async () => {
252
+ await setViewport(page, { width: 1650, height: 1050 });
253
+ await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS_WITH_NO_INITIAL_ACTIVE_TAB));
254
+ });
255
255
 
256
- it('does not assign "aria-selected" to the first tab', async () => {
257
- const ariaSelectedValue = await page.$eval('.ons-tab', (node) => node.getAttribute('aria-selected'));
256
+ it('does not assign "aria-selected" to the first tab', async () => {
257
+ const ariaSelectedValue = await page.$eval('.ons-tab', (node) => node.getAttribute('aria-selected'));
258
258
 
259
- expect(ariaSelectedValue).not.toBe('true');
260
- });
259
+ expect(ariaSelectedValue).not.toBe('true');
260
+ });
261
261
 
262
- it('does not assign the "ons-tab--selected" class to the first tab', async () => {
263
- const hasClass = await page.$eval('.ons-tab', (node) => node.classList.contains('ons-tab--selected'));
262
+ it('does not assign the "ons-tab--selected" class to the first tab', async () => {
263
+ const hasClass = await page.$eval('.ons-tab', (node) => node.classList.contains('ons-tab--selected'));
264
264
 
265
- expect(hasClass).toBe(false);
266
- });
265
+ expect(hasClass).toBe(false);
266
+ });
267
267
 
268
- describe('when a tab is clicked', () => {
269
- beforeEach(async () => {
270
- await page.focus('a[href="#tab.id.1"]');
271
- await page.keyboard.press('Enter');
272
- });
268
+ describe('when a tab is clicked', () => {
269
+ beforeEach(async () => {
270
+ await page.focus('a[href="#tab.id.1"]');
271
+ await page.keyboard.press('Enter');
272
+ });
273
273
 
274
- it('is assigned a "tabindex" value', async () => {
275
- const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
274
+ it('is assigned a "tabindex" value', async () => {
275
+ const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
276
276
 
277
- expect(tabIndexValues).toEqual(['0', '-1', '-1']);
278
- });
277
+ expect(tabIndexValues).toEqual(['0', '-1', '-1']);
278
+ });
279
279
 
280
- it('has the "aria-selected" attribute', async () => {
281
- const ariaSelectedValue = await page.$eval('a[href="#tab.id.1"]', (node) => node.getAttribute('aria-selected'));
280
+ it('has the "aria-selected" attribute', async () => {
281
+ const ariaSelectedValue = await page.$eval('a[href="#tab.id.1"]', (node) => node.getAttribute('aria-selected'));
282
282
 
283
- expect(ariaSelectedValue).toBe('true');
284
- });
283
+ expect(ariaSelectedValue).toBe('true');
284
+ });
285
285
 
286
- it('has the "ons-tab--selected" class assigned', async () => {
287
- const hasClass = await page.$eval('a[href="#tab.id.1"]', (node) => node.classList.contains('ons-tab--selected'));
286
+ it('has the "ons-tab--selected" class assigned', async () => {
287
+ const hasClass = await page.$eval('a[href="#tab.id.1"]', (node) => node.classList.contains('ons-tab--selected'));
288
288
 
289
- expect(hasClass).toBe(true);
290
- });
289
+ expect(hasClass).toBe(true);
290
+ });
291
291
 
292
- it('shows the corresponding panel', async () => {
293
- const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
294
- nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
295
- );
292
+ it('shows the corresponding panel', async () => {
293
+ const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
294
+ nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
295
+ );
296
296
 
297
- expect(panelHiddenStates).toEqual([false, true, true]);
298
- });
299
- });
297
+ expect(panelHiddenStates).toEqual([false, true, true]);
298
+ });
299
+ });
300
300
 
301
- describe('when a tab is clicked twice', () => {
302
- beforeEach(async () => {
303
- await page.focus('a[href="#tab.id.2"]');
304
- await page.keyboard.press('Enter');
305
- await page.keyboard.press('Enter');
306
- });
301
+ describe('when a tab is clicked twice', () => {
302
+ beforeEach(async () => {
303
+ await page.focus('a[href="#tab.id.2"]');
304
+ await page.keyboard.press('Enter');
305
+ await page.keyboard.press('Enter');
306
+ });
307
307
 
308
- it('is assigned a "tabindex" value', async () => {
309
- const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
308
+ it('is assigned a "tabindex" value', async () => {
309
+ const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
310
310
 
311
- expect(tabIndexValues).toEqual(['0', '-1', '-1']);
312
- });
311
+ expect(tabIndexValues).toEqual(['0', '-1', '-1']);
312
+ });
313
313
 
314
- it('does not have the "aria-selected" attribute', async () => {
315
- const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
314
+ it('does not have the "aria-selected" attribute', async () => {
315
+ const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
316
316
 
317
- expect(ariaSelectedValue).not.toBe('true');
318
- });
317
+ expect(ariaSelectedValue).not.toBe('true');
318
+ });
319
319
 
320
- it('does not have the "ons-tab--selected" class assigned', async () => {
321
- const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
320
+ it('does not have the "ons-tab--selected" class assigned', async () => {
321
+ const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
322
322
 
323
- expect(hasClass).toBe(false);
324
- });
323
+ expect(hasClass).toBe(false);
324
+ });
325
325
 
326
- it('hides the corresponding panel', async () => {
327
- const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
328
- nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
329
- );
326
+ it('hides the corresponding panel', async () => {
327
+ const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
328
+ nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
329
+ );
330
330
 
331
- expect(panelHiddenStates).toEqual([true, true, true]);
332
- });
331
+ expect(panelHiddenStates).toEqual([true, true, true]);
332
+ });
333
+ });
333
334
  });
334
- });
335
335
 
336
- describe('when a hash for a tab is in the url and `data-no-initial-active-tab` is present', () => {
337
- beforeEach(async () => {
338
- await setViewport(page, { width: 1650, height: 1050 });
339
- await setTestPage('/test#tab.id.2', renderComponent('tabs', EXAMPLE_TABS_WITH_NO_INITIAL_ACTIVE_TAB));
340
- });
336
+ describe('when a hash for a tab is in the url and `data-no-initial-active-tab` is present', () => {
337
+ beforeEach(async () => {
338
+ await setViewport(page, { width: 1650, height: 1050 });
339
+ await setTestPage('/test#tab.id.2', renderComponent('tabs', EXAMPLE_TABS_WITH_NO_INITIAL_ACTIVE_TAB));
340
+ });
341
341
 
342
- it('is assigned a "tabindex" value', async () => {
343
- const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
342
+ it('is assigned a "tabindex" value', async () => {
343
+ const tabIndexValues = await page.$$eval('.ons-tab', (nodes) => nodes.map((node) => node.getAttribute('tabindex')));
344
344
 
345
- expect(tabIndexValues).toEqual(['-1', '0', '-1']);
346
- });
345
+ expect(tabIndexValues).toEqual(['-1', '0', '-1']);
346
+ });
347
347
 
348
- it('has the "aria-selected" attribute', async () => {
349
- const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
348
+ it('has the "aria-selected" attribute', async () => {
349
+ const ariaSelectedValue = await page.$eval('a[href="#tab.id.2"]', (node) => node.getAttribute('aria-selected'));
350
350
 
351
- expect(ariaSelectedValue).toBe('true');
352
- });
351
+ expect(ariaSelectedValue).toBe('true');
352
+ });
353
353
 
354
- it('has the "ons-tab--selected" class assigned', async () => {
355
- const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
354
+ it('has the "ons-tab--selected" class assigned', async () => {
355
+ const hasClass = await page.$eval('a[href="#tab.id.2"]', (node) => node.classList.contains('ons-tab--selected'));
356
356
 
357
- expect(hasClass).toBe(true);
358
- });
357
+ expect(hasClass).toBe(true);
358
+ });
359
359
 
360
- it('shows the corresponding panel', async () => {
361
- const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
362
- nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
363
- );
360
+ it('shows the corresponding panel', async () => {
361
+ const panelHiddenStates = await page.$$eval('.ons-tabs__panel', (nodes) =>
362
+ nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
363
+ );
364
364
 
365
- expect(panelHiddenStates).toEqual([true, false, true]);
365
+ expect(panelHiddenStates).toEqual([true, false, true]);
366
+ });
366
367
  });
367
- });
368
368
  });