@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.
- package/README.md +11 -17
- package/components/access-code/_macro.spec.js +145 -145
- package/components/access-code/access-code.dom.js +5 -5
- package/components/access-code/access-code.js +16 -16
- package/components/access-code/access-code.scss +22 -22
- package/components/access-code/access-code.spec.js +17 -17
- package/components/accordion/_macro.spec.js +154 -154
- package/components/accordion/accordion.dom.js +10 -10
- package/components/accordion/accordion.js +50 -50
- package/components/accordion/accordion.spec.js +104 -104
- package/components/address-input/_macro.spec.js +420 -420
- package/components/address-input/autosuggest.address.dom.js +5 -5
- package/components/address-input/autosuggest.address.error.js +77 -77
- package/components/address-input/autosuggest.address.js +357 -357
- package/components/address-input/autosuggest.address.setter.js +95 -95
- package/components/address-input/autosuggest.address.spec.js +668 -651
- package/components/address-input/example-address-input-editable.njk +1 -1
- package/components/address-input/example-address-input.njk +1 -1
- package/components/address-output/_address-output.scss +3 -3
- package/components/address-output/_macro.spec.js +84 -84
- package/components/autosuggest/_autosuggest.scss +114 -114
- package/components/autosuggest/_macro.spec.js +255 -255
- package/components/autosuggest/autosuggest.dom.js +5 -5
- package/components/autosuggest/autosuggest.helpers.js +11 -11
- package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
- package/components/autosuggest/autosuggest.js +20 -20
- package/components/autosuggest/autosuggest.spec.js +542 -536
- package/components/autosuggest/autosuggest.ui.js +478 -475
- package/components/autosuggest/fuse-config.js +17 -17
- package/components/back-to-top/_back-to-top.scss +27 -27
- package/components/back-to-top/_macro.spec.js +49 -49
- package/components/back-to-top/back-to-top.dom.js +5 -5
- package/components/back-to-top/back-to-top.js +52 -52
- package/components/back-to-top/back-to-top.spec.js +106 -106
- package/components/back-to-top/example-back-to-top.njk +6 -6
- package/components/breadcrumbs/_breadcrumbs.scss +63 -65
- package/components/breadcrumbs/_macro.spec.js +91 -91
- package/components/browser-banner/_browser-banner.scss +23 -23
- package/components/browser-banner/_macro.spec.js +92 -92
- package/components/button/_button.scss +482 -483
- package/components/button/_macro.spec.js +363 -363
- package/components/button/button.dom.js +15 -15
- package/components/button/button.js +53 -53
- package/components/button/button.spec.js +248 -240
- package/components/call-to-action/_call-to-action.scss +5 -5
- package/components/call-to-action/_macro.spec.js +28 -28
- package/components/card/_card.scss +23 -23
- package/components/card/_macro.spec.js +180 -180
- package/components/char-check-limit/_macro.spec.js +48 -48
- package/components/char-check-limit/character-check.js +58 -58
- package/components/char-check-limit/character-check.spec.js +173 -173
- package/components/char-check-limit/character-limit.js +40 -40
- package/components/checkboxes/_checkbox-macro.spec.js +355 -355
- package/components/checkboxes/_checkbox.scss +180 -180
- package/components/checkboxes/_checkboxes.scss +37 -27
- package/components/checkboxes/_macro.spec.js +261 -261
- package/components/checkboxes/checkbox-with-autoselect.js +32 -32
- package/components/checkboxes/checkbox-with-fieldset.js +21 -21
- package/components/checkboxes/checkboxes-with-reveal.js +10 -10
- package/components/checkboxes/checkboxes.dom.js +27 -27
- package/components/checkboxes/checkboxes.spec.js +183 -183
- package/components/content-pagination/_content-pagination.scss +41 -41
- package/components/content-pagination/_macro.spec.js +159 -159
- package/components/cookies-banner/_cookies-banner.scss +22 -22
- package/components/cookies-banner/_macro.spec.js +177 -177
- package/components/cookies-banner/cookies-banner.dom.js +7 -7
- package/components/cookies-banner/cookies-banner.js +76 -76
- package/components/cookies-banner/cookies-banner.spec.js +72 -68
- package/components/date-input/_macro.spec.js +338 -338
- package/components/description-list/_description-list.scss +23 -23
- package/components/description-list/_macro.spec.js +144 -144
- package/components/details/_details.scss +109 -109
- package/components/details/_macro.spec.js +132 -132
- package/components/details/details.dom.js +6 -6
- package/components/details/details.js +60 -60
- package/components/details/details.spec.js +106 -106
- package/components/document-list/_macro.spec.js +444 -444
- package/components/document-list/document-list.scss +145 -149
- package/components/download-resources/_download-resources.scss +109 -108
- package/components/download-resources/download-resources.js +907 -900
- package/components/download-resources/download-resources.spec.js +461 -461
- package/components/duration/_macro.spec.js +291 -291
- package/components/error/_macro.spec.js +72 -72
- package/components/external-link/_external-link.scss +19 -19
- package/components/external-link/_macro.spec.js +68 -68
- package/components/feedback/_feedback.scss +31 -31
- package/components/feedback/_macro.spec.js +72 -72
- package/components/field/_field-group.scss +10 -10
- package/components/field/_field.scss +16 -16
- package/components/field/_macro.spec.js +80 -80
- package/components/fieldset/_fieldset.scss +27 -27
- package/components/fieldset/_macro.spec.js +161 -161
- package/components/footer/_footer.scss +45 -45
- package/components/footer/_macro.spec.js +452 -452
- package/components/header/_header.scss +202 -202
- package/components/header/_macro.spec.js +833 -829
- package/components/helpers/_grid.scss +4 -4
- package/components/hero/_hero.scss +48 -48
- package/components/hero/_macro.spec.js +59 -59
- package/components/icon/_icon.scss +44 -44
- package/components/icon/_macro.spec.js +110 -110
- package/components/image/_image.scss +11 -11
- package/components/image/_macro.spec.js +81 -81
- package/components/input/_input-type.scss +86 -89
- package/components/input/_input.scss +123 -124
- package/components/input/_macro.spec.js +604 -604
- package/components/input/character-check.dom.js +5 -5
- package/components/input/input.dom.js +5 -5
- package/components/input/input.js +10 -10
- package/components/input/input.spec.js +18 -18
- package/components/label/_label.scss +24 -24
- package/components/label/_macro.spec.js +173 -170
- package/components/language-selector/_macro.spec.js +97 -97
- package/components/language-selector/language.scss +7 -7
- package/components/list/_list.scss +84 -84
- package/components/list/_macro.njk +2 -2
- package/components/list/_macro.spec.js +583 -583
- package/components/message/_macro.njk +5 -5
- package/components/message/_macro.spec.js +74 -74
- package/components/message/_message.scss +39 -39
- package/components/message-list/_macro.spec.js +86 -86
- package/components/message-list/_message-list.scss +16 -16
- package/components/modal/_macro.spec.js +69 -69
- package/components/modal/_modal.scss +36 -36
- package/components/modal/modal.dom.js +6 -6
- package/components/modal/modal.js +89 -89
- package/components/modal/modal.spec.js +50 -50
- package/components/mutually-exclusive/_macro.spec.js +140 -140
- package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
- package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
- package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
- package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
- package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
- package/components/mutually-exclusive/mutually-exclusive.js +137 -137
- package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
- package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
- package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
- package/components/navigation/_macro.spec.js +360 -354
- package/components/navigation/_navigation.scss +122 -123
- package/components/navigation/navigation.dom.js +35 -35
- package/components/navigation/navigation.js +49 -49
- package/components/navigation/navigation.spec.js +249 -249
- package/components/pagination/_macro.spec.js +342 -335
- package/components/pagination/_pagination.scss +58 -58
- package/components/panel/_macro.spec.js +372 -372
- package/components/panel/_panel.scss +200 -199
- package/components/password/_macro.spec.js +95 -95
- package/components/password/password.dom.js +5 -5
- package/components/password/password.js +10 -10
- package/components/password/password.spec.js +26 -26
- package/components/phase-banner/_macro.spec.js +86 -86
- package/components/phase-banner/_phase-banner.scss +16 -16
- package/components/question/_macro.spec.js +235 -235
- package/components/question/_question.scss +24 -24
- package/components/quote/_macro.spec.js +52 -52
- package/components/quote/_quote.scss +24 -24
- package/components/radios/_macro.spec.js +524 -524
- package/components/radios/_radio.scss +49 -48
- package/components/radios/_radios.scss +14 -20
- package/components/radios/check-radios.js +21 -21
- package/components/radios/clear-radios.js +45 -45
- package/components/radios/radio-with-fieldset.js +22 -22
- package/components/radios/radios.dom.js +32 -32
- package/components/radios/radios.spec.js +251 -251
- package/components/related-content/_macro.spec.js +109 -109
- package/components/related-content/_related-content.scss +12 -12
- package/components/related-content/_section-macro.spec.js +20 -20
- package/components/relationships/_macro.spec.js +94 -94
- package/components/relationships/_relationships.scss +9 -9
- package/components/relationships/relationships.dom.js +5 -5
- package/components/relationships/relationships.js +18 -18
- package/components/relationships/relationships.spec.js +71 -71
- package/components/reply/_macro.spec.js +47 -47
- package/components/reply/reply-input.js +15 -15
- package/components/reply/reply.dom.js +5 -5
- package/components/reply/reply.spec.js +57 -57
- package/components/section-navigation/_macro.spec.js +210 -210
- package/components/section-navigation/_section-navigation.scss +76 -76
- package/components/select/_macro.spec.js +166 -166
- package/components/share-page/_macro.spec.js +68 -68
- package/components/skip-to-content/_macro.spec.js +54 -54
- package/components/skip-to-content/_skip.scss +30 -30
- package/components/skip-to-content/skip-to-content.dom.js +6 -6
- package/components/skip-to-content/skip-to-content.js +7 -7
- package/components/skip-to-content/skip-to-content.spec.js +21 -21
- package/components/status/_macro.spec.js +53 -53
- package/components/status/_status.scss +32 -32
- package/components/summary/_macro.spec.js +551 -535
- package/components/summary/_summary.scss +191 -195
- package/components/table/_macro.spec.js +499 -499
- package/components/table/_table.scss +204 -201
- package/components/table/scrollable-table.dom.js +5 -5
- package/components/table/scrollable-table.js +60 -60
- package/components/table/sortable-table.dom.js +5 -5
- package/components/table/sortable-table.js +135 -135
- package/components/table/table.spec.js +144 -140
- package/components/table-of-contents/_macro.spec.js +125 -125
- package/components/table-of-contents/_toc.scss +9 -9
- package/components/table-of-contents/toc.dom.js +5 -5
- package/components/table-of-contents/toc.js +30 -30
- package/components/table-of-contents/toc.spec.js +88 -88
- package/components/tabs/_macro.spec.js +92 -92
- package/components/tabs/_tabs.scss +120 -115
- package/components/tabs/tabs.dom.js +5 -5
- package/components/tabs/tabs.js +266 -266
- package/components/tabs/tabs.spec.js +268 -268
- package/components/text-indent/_macro.spec.js +33 -33
- package/components/text-indent/_text-indent.scss +3 -3
- package/components/textarea/_macro.spec.js +238 -238
- package/components/textarea/textarea.dom.js +5 -5
- package/components/textarea/textarea.spec.js +78 -74
- package/components/timeline/_macro.spec.js +83 -83
- package/components/timeline/_timeline.scss +26 -26
- package/components/timeout-modal/_macro.spec.js +47 -47
- package/components/timeout-modal/timeout-modal.dom.js +9 -9
- package/components/timeout-modal/timeout-modal.js +66 -66
- package/components/timeout-modal/timeout-modal.spec.js +157 -157
- package/components/timeout-panel/_macro.spec.js +41 -41
- package/components/timeout-panel/timeout-panel.dom.js +8 -8
- package/components/timeout-panel/timeout-panel.spec.js +118 -118
- package/components/upload/_macro.spec.js +52 -52
- package/components/upload/_upload.scss +28 -28
- package/components/video/_macro.spec.js +42 -42
- package/components/video/_video.scss +16 -16
- package/components/video/video.dom.js +5 -5
- package/components/video/video.js +32 -32
- package/components/video/video.spec.js +103 -97
- package/css/main.css +1 -1
- package/favicons/android-chrome-192x192.png +0 -0
- package/favicons/android-chrome-512x512.png +0 -0
- package/favicons/apple-touch-icon.png +0 -0
- package/favicons/favicon-16x16.png +0 -0
- package/favicons/favicon-32x32.png +0 -0
- package/favicons/favicon.ico +0 -0
- package/favicons/manifest.json +25 -25
- package/favicons/maskable_icon.png +0 -0
- package/favicons/opengraph.png +0 -0
- package/favicons/twitter.png +0 -0
- package/img/large/alison-pritchard-featured.jpg +0 -0
- package/img/large/alison-pritchard.jpg +0 -0
- package/img/large/census-monuments-lights-featured.jpg +0 -0
- package/img/large/census-monuments-lights.jpg +0 -0
- package/img/large/mother-and-daughter-in-ireland.jpg +0 -0
- package/img/large/mum-and-child-healthcare-belfast.jpg +0 -0
- package/img/large/ons-award-winners.jpg +0 -0
- package/img/large/placeholder-card.png +0 -0
- package/img/large/placeholder-news-medium.png +0 -0
- package/img/large/placeholder-news.png +0 -0
- package/img/large/placeholder-portrait.png +0 -0
- package/img/large/students.jpg +0 -0
- package/img/large/woman-in-purple-dress-shirt.jpg +0 -0
- package/img/small/alison-pritchard-featured.jpg +0 -0
- package/img/small/alison-pritchard.jpg +0 -0
- package/img/small/census-monuments-lights-featured.jpg +0 -0
- package/img/small/census-monuments-lights.jpg +0 -0
- package/img/small/mother-and-daughter-in-ireland.jpg +0 -0
- package/img/small/mum-and-child-healthcare-belfast.jpg +0 -0
- package/img/small/ons-award-winners.jpg +0 -0
- package/img/small/placeholder-card.png +0 -0
- package/img/small/placeholder-news-medium.png +0 -0
- package/img/small/placeholder-news.png +0 -0
- package/img/small/placeholder-portrait.png +0 -0
- package/img/small/students.jpg +0 -0
- package/img/small/woman-in-purple-dress-shirt.jpg +0 -0
- package/js/abortable-fetch.js +23 -23
- package/js/analytics.js +53 -53
- package/js/cookies-functions.js +135 -135
- package/js/cookies-settings.dom.js +7 -7
- package/js/cookies-settings.js +77 -77
- package/js/cookies-settings.spec.js +106 -106
- package/js/domready.js +8 -8
- package/js/fetch.js +14 -14
- package/js/inpagelink.dom.js +5 -5
- package/js/inpagelink.js +19 -19
- package/js/polyfills.js +0 -1
- package/js/print-button.js +6 -6
- package/js/timeout.js +211 -211
- package/layout/_template.njk +5 -7
- package/package.json +131 -127
- package/scripts/main.es5.js +1 -1
- package/scripts/main.js +1 -1
- package/scss/base/_forms.scss +10 -10
- package/scss/base/_global.scss +45 -44
- package/scss/base/_typography.scss +20 -20
- package/scss/helpers/_functions.scss +18 -15
- package/scss/helpers/_mixins.scss +59 -53
- package/scss/helpers/_mq.scss +62 -65
- package/scss/objects/_container.scss +20 -20
- package/scss/objects/_page.scss +33 -33
- package/scss/objects/_spacing.scss +10 -10
- package/scss/overrides/hcm.scss +237 -237
- package/scss/overrides/rtl.scss +95 -95
- package/scss/print.scss +47 -47
- package/scss/utilities/_border.scss +7 -7
- package/scss/utilities/_colors.scss +6 -6
- package/scss/utilities/_display.scss +8 -8
- package/scss/utilities/_float.scss +7 -7
- package/scss/utilities/_grid.scss +144 -144
- package/scss/utilities/_highlight.scss +4 -4
- package/scss/utilities/_margin.scss +17 -17
- package/scss/utilities/_pad.scss +15 -15
- package/scss/utilities/_typography.scss +35 -33
- package/scss/utilities/_utilities.scss +8 -8
- package/scss/utilities/_visibility.scss +25 -25
- package/scss/vars/_colors.scss +116 -116
- package/scss/vars/_forms.scss +22 -22
- package/scss/vars/_grid.scss +11 -9
- 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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
64
|
-
|
|
63
|
+
...EXAMPLE_TABS,
|
|
64
|
+
noInitialActiveTab: true,
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
describe('script: tabs', () => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
expect(role).toBe('presentation');
|
|
88
|
-
});
|
|
82
|
+
expect(hasClass).toBe(true);
|
|
83
|
+
});
|
|
89
84
|
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
93
|
+
expect(tabRoleValues).toEqual(['tab', 'tab', 'tab']);
|
|
94
|
+
});
|
|
98
95
|
|
|
99
|
-
|
|
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
|
-
|
|
103
|
-
|
|
99
|
+
expect(ariaControlsValues).toEqual(['tab.id.1', 'tab.id.2', 'tab.id.3']);
|
|
100
|
+
});
|
|
104
101
|
|
|
105
|
-
|
|
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
|
-
|
|
109
|
-
|
|
105
|
+
expect(ariaSelectedValue).toBe('true');
|
|
106
|
+
});
|
|
110
107
|
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
|
|
111
|
+
expect(hasClass).toBe(true);
|
|
112
|
+
});
|
|
116
113
|
|
|
117
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
|
|
123
|
-
);
|
|
117
|
+
expect(tabIndexValues).toEqual(['0', '-1', '-1']);
|
|
118
|
+
});
|
|
124
119
|
|
|
125
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
135
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
137
|
+
expect(tabIndexValues).toEqual(['-1', '0', '-1']);
|
|
138
|
+
});
|
|
142
139
|
|
|
143
|
-
|
|
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
|
-
|
|
147
|
-
|
|
143
|
+
expect(ariaSelectedValue).toBe('true');
|
|
144
|
+
});
|
|
148
145
|
|
|
149
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
nodes.map((node) => node.classList.contains('ons-tabs__panel--hidden')),
|
|
155
|
-
);
|
|
149
|
+
expect(hasClass).toBe(true);
|
|
150
|
+
});
|
|
156
151
|
|
|
157
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
await page.keyboard.press('ArrowRight');
|
|
157
|
+
expect(panelHiddenStates).toEqual([true, false, true]);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
165
160
|
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
166
|
+
const activeElement = await page.evaluate(() => document.activeElement.innerText);
|
|
167
|
+
expect(activeElement).toBe('Tab 3');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
175
170
|
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
176
|
+
const activeElement = await page.evaluate(() => document.activeElement.innerText);
|
|
177
|
+
expect(activeElement).toBe('Tab 1');
|
|
178
|
+
});
|
|
179
|
+
});
|
|
186
180
|
});
|
|
187
181
|
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
-
|
|
195
|
-
|
|
191
|
+
expect(tabIndexValues).toEqual(['-1', '0', '-1']);
|
|
192
|
+
});
|
|
196
193
|
|
|
197
|
-
|
|
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
|
-
|
|
201
|
-
|
|
197
|
+
expect(ariaSelectedValue).toBe('true');
|
|
198
|
+
});
|
|
202
199
|
|
|
203
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
211
|
+
expect(panelHiddenStates).toEqual([true, false, true]);
|
|
212
|
+
});
|
|
212
213
|
});
|
|
213
|
-
});
|
|
214
214
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
describe('when the viewport is small', () => {
|
|
216
|
+
beforeEach(async () => {
|
|
217
|
+
await page.emulate(iPhoneX);
|
|
218
218
|
|
|
219
|
-
|
|
220
|
-
|
|
219
|
+
await setTestPage('/test', renderComponent('tabs', EXAMPLE_TABS_LONGER));
|
|
220
|
+
});
|
|
221
221
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
229
|
-
|
|
228
|
+
const hasAriaControlsAttribute = await tabElements[i].evaluate((node) => node.getAttribute('aria-controls') !== null);
|
|
229
|
+
expect(hasAriaControlsAttribute).toBe(false);
|
|
230
230
|
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
const hiddenPanelCount = await page.$$eval('.ons-tabs__panel--hidden', (nodes) => nodes.length);
|
|
241
|
+
expect(hiddenPanelCount).toBe(0);
|
|
242
|
+
});
|
|
243
243
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
257
|
-
|
|
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
|
-
|
|
260
|
-
|
|
259
|
+
expect(ariaSelectedValue).not.toBe('true');
|
|
260
|
+
});
|
|
261
261
|
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
266
|
-
|
|
265
|
+
expect(hasClass).toBe(false);
|
|
266
|
+
});
|
|
267
267
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
275
|
-
|
|
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
|
-
|
|
278
|
-
|
|
277
|
+
expect(tabIndexValues).toEqual(['0', '-1', '-1']);
|
|
278
|
+
});
|
|
279
279
|
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
284
|
-
|
|
283
|
+
expect(ariaSelectedValue).toBe('true');
|
|
284
|
+
});
|
|
285
285
|
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
290
|
-
|
|
289
|
+
expect(hasClass).toBe(true);
|
|
290
|
+
});
|
|
291
291
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
297
|
+
expect(panelHiddenStates).toEqual([false, true, true]);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
300
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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
|
-
|
|
309
|
-
|
|
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
|
-
|
|
312
|
-
|
|
311
|
+
expect(tabIndexValues).toEqual(['0', '-1', '-1']);
|
|
312
|
+
});
|
|
313
313
|
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
318
|
-
|
|
317
|
+
expect(ariaSelectedValue).not.toBe('true');
|
|
318
|
+
});
|
|
319
319
|
|
|
320
|
-
|
|
321
|
-
|
|
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
|
-
|
|
324
|
-
|
|
323
|
+
expect(hasClass).toBe(false);
|
|
324
|
+
});
|
|
325
325
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
332
|
-
|
|
331
|
+
expect(panelHiddenStates).toEqual([true, true, true]);
|
|
332
|
+
});
|
|
333
|
+
});
|
|
333
334
|
});
|
|
334
|
-
});
|
|
335
335
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
343
|
-
|
|
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
|
-
|
|
346
|
-
|
|
345
|
+
expect(tabIndexValues).toEqual(['-1', '0', '-1']);
|
|
346
|
+
});
|
|
347
347
|
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
|
|
352
|
-
|
|
351
|
+
expect(ariaSelectedValue).toBe('true');
|
|
352
|
+
});
|
|
353
353
|
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
358
|
-
|
|
357
|
+
expect(hasClass).toBe(true);
|
|
358
|
+
});
|
|
359
359
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
365
|
+
expect(panelHiddenStates).toEqual([true, false, true]);
|
|
366
|
+
});
|
|
366
367
|
});
|
|
367
|
-
});
|
|
368
368
|
});
|