@ons/design-system 53.1.1 → 55.0.0

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 (82) hide show
  1. package/components/accordion/_macro.njk +2 -3
  2. package/components/accordion/_macro.spec.js +3 -40
  3. package/components/accordion/accordion.dom.js +19 -0
  4. package/components/{collapsible/collapsible.group.js → accordion/accordion.js} +12 -5
  5. package/components/accordion/accordion.spec.js +56 -51
  6. package/components/autosuggest/_autosuggest.scss +4 -4
  7. package/components/autosuggest/autosuggest.spec.js +12 -2
  8. package/components/autosuggest/autosuggest.ui.js +4 -7
  9. package/components/button/_button.scss +28 -7
  10. package/components/button/_macro.njk +1 -1
  11. package/components/button/_macro.spec.js +2 -2
  12. package/components/checkboxes/_checkbox.scss +50 -17
  13. package/components/collapsible/_collapsible.scss +59 -85
  14. package/components/collapsible/_macro.njk +6 -39
  15. package/components/collapsible/_macro.spec.js +0 -53
  16. package/components/collapsible/collapsible.dom.js +3 -12
  17. package/components/collapsible/collapsible.js +3 -45
  18. package/components/collapsible/collapsible.spec.js +6 -139
  19. package/components/cookies-banner/_cookies-banner.scss +15 -7
  20. package/components/cookies-banner/_macro.njk +66 -22
  21. package/components/cookies-banner/_macro.spec.js +172 -114
  22. package/components/cookies-banner/cookies-banner.js +35 -13
  23. package/components/cookies-banner/cookies-banner.spec.js +58 -54
  24. package/components/document-list/document-list.scss +2 -0
  25. package/components/download-resources/download-resources.js +19 -0
  26. package/components/download-resources/download-resources.spec.js +95 -0
  27. package/components/external-link/_macro.njk +1 -1
  28. package/components/external-link/_macro.spec.js +2 -2
  29. package/components/fieldset/_fieldset.scss +11 -1
  30. package/components/fieldset/_macro.njk +9 -8
  31. package/components/fieldset/_macro.spec.js +27 -5
  32. package/components/footer/_footer.scss +1 -0
  33. package/components/header/_macro.njk +2 -5
  34. package/components/header/_macro.spec.js +0 -16
  35. package/components/hero/_macro.njk +1 -1
  36. package/components/hero/_macro.spec.js +1 -1
  37. package/components/icons/_macro.njk +1 -1
  38. package/components/input/_input-type.scss +37 -3
  39. package/components/input/_input.scss +28 -9
  40. package/components/input/_macro.njk +17 -14
  41. package/components/input/_macro.spec.js +56 -0
  42. package/components/label/_label.scss +1 -1
  43. package/components/label/_macro.njk +27 -15
  44. package/components/label/_macro.spec.js +31 -0
  45. package/components/lists/_macro.njk +1 -1
  46. package/components/lists/_macro.spec.js +2 -2
  47. package/components/message/_message.scss +1 -0
  48. package/components/modal/_macro.njk +2 -2
  49. package/components/modal/_modal.scss +10 -9
  50. package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +2 -0
  51. package/components/mutually-exclusive/mutually-exclusive.number.spec.js +1 -0
  52. package/components/navigation/_macro.njk +0 -1
  53. package/components/navigation/_macro.spec.js +0 -1
  54. package/components/pagination/_pagination.scss +1 -0
  55. package/components/panel/_macro.njk +6 -7
  56. package/components/panel/_macro.spec.js +23 -20
  57. package/components/panel/_panel.scss +13 -5
  58. package/components/phase-banner/_phase-banner.scss +1 -0
  59. package/components/radios/_radio.scss +16 -4
  60. package/components/relationships/_relationships.scss +2 -2
  61. package/components/reply/_macro.njk +2 -2
  62. package/components/skip-to-content/_skip.scss +2 -1
  63. package/components/table/_macro.njk +3 -2
  64. package/components/table/_macro.spec.js +0 -27
  65. package/components/table/_table.scss +15 -7
  66. package/components/table/sortable-table.js +1 -0
  67. package/components/tabs/_tabs.scss +57 -34
  68. package/components/tabs/tabs.js +4 -2
  69. package/components/upload/_upload.scss +2 -2
  70. package/css/census.css +1 -1
  71. package/css/ids.css +1 -1
  72. package/css/main.css +1 -1
  73. package/js/main.js +1 -0
  74. package/layout/_template.njk +8 -8
  75. package/package.json +1 -1
  76. package/scripts/main.es5.js +1 -1
  77. package/scripts/main.js +2 -2
  78. package/scss/base/_global.scss +1 -0
  79. package/scss/objects/_page.scss +1 -1
  80. package/scss/overrides/hcm.scss +205 -46
  81. package/scss/patternlib.scss +1 -56
  82. package/scss/vars/_colors.scss +2 -1
@@ -7,53 +7,6 @@ const EXAMPLE_COLLAPSIBLE_BASIC = {
7
7
  };
8
8
 
9
9
  describe('script: collapsible', () => {
10
- it('begins closed', async () => {
11
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
12
-
13
- const openItemCount = await page.$$eval('.ons-collapsible--open', elements => elements.length);
14
- expect(openItemCount).toBe(0);
15
- });
16
-
17
- it('sets the `role` attribute', async () => {
18
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
19
-
20
- const role = await page.$eval('.ons-collapsible', element => element.getAttribute('role'));
21
- expect(role).toBe('group');
22
- });
23
-
24
- it('adds the correct class', async () => {
25
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
26
-
27
- const className = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--initialised'));
28
- expect(className).toBe(true);
29
- });
30
-
31
- it('sets attributes on the heading element', async () => {
32
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
33
-
34
- const role = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('role'));
35
- const ariaControls = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('aria-controls'));
36
- const tabIndex = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('tabindex'));
37
-
38
- expect(role).toBe('link');
39
- expect(ariaControls).toBe('collapsible-id');
40
- expect(tabIndex).toBe('0');
41
- });
42
-
43
- it('sets attributes on the button element', async () => {
44
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
45
-
46
- const ariaControls = await page.$eval('.ons-js-collapsible-button', element => element.getAttribute('aria-controls'));
47
- expect(ariaControls).toBe('collapsible-id');
48
- });
49
-
50
- it('sets the button element to be visible', async () => {
51
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
52
-
53
- const openClass = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--open'));
54
- expect(openClass).toBe(false);
55
- });
56
-
57
10
  it('begins open when specified', async () => {
58
11
  await setTestPage(
59
12
  '/test',
@@ -63,8 +16,8 @@ describe('script: collapsible', () => {
63
16
  }),
64
17
  );
65
18
 
66
- const openClass = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--open'));
67
- expect(openClass).toBe(true);
19
+ const openAttribute = await page.$eval('.ons-js-collapsible', node => node.open !== null);
20
+ expect(openAttribute).toBe(true);
68
21
  });
69
22
 
70
23
  describe('when the collapsible heading is clicked to open the collapsible', () => {
@@ -78,59 +31,10 @@ describe('script: collapsible', () => {
78
31
  expect(openAttribute).toBe(true);
79
32
  });
80
33
 
81
- it('sets the open class', async () => {
82
- const openClass = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--open'));
83
- expect(openClass).toBe(true);
84
- });
85
-
86
- it('sets the `aria` attributes', async () => {
87
- const ariaExpanded = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('aria-expanded'));
88
- const ariaHidden = await page.$eval('.ons-js-collapsible-content', element => element.getAttribute('aria-hidden'));
89
-
90
- expect(ariaExpanded).toBe('true');
91
- expect(ariaHidden).toBe('false');
92
- });
93
-
94
34
  it('sets the `ga` attributes', async () => {
95
35
  const gaHeadingAttribute = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('data-ga-action'));
96
- const gaButtonAttribute = await page.$eval('.ons-js-collapsible-button', element => element.getAttribute('data-ga-action'));
97
36
 
98
37
  expect(gaHeadingAttribute).toBe('Open panel');
99
- expect(gaButtonAttribute).toBe('Open panel');
100
- });
101
- });
102
-
103
- describe('when the collapsible button is clicked to close the collapsible', () => {
104
- beforeEach(async () => {
105
- await setTestPage('/test', renderComponent('collapsible', EXAMPLE_COLLAPSIBLE_BASIC));
106
- await page.click('.ons-js-collapsible-heading');
107
- await page.click('.ons-js-collapsible-button');
108
- });
109
-
110
- it('removes the `open` attribute', async () => {
111
- const openAttribute = await page.$eval('.ons-js-collapsible', node => node.open === true);
112
- expect(openAttribute).toBe(false);
113
- });
114
-
115
- it('removes the open class', async () => {
116
- const openClass = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--open'));
117
- expect(openClass).toBe(false);
118
- });
119
-
120
- it('sets the `aria` attributes', async () => {
121
- const ariaExpanded = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('aria-expanded'));
122
- const ariaHidden = await page.$eval('.ons-js-collapsible-content', element => element.getAttribute('aria-hidden'));
123
-
124
- expect(ariaExpanded).toBe('false');
125
- expect(ariaHidden).toBe('true');
126
- });
127
-
128
- it('sets the `ga` attributes', async () => {
129
- const gaHeadingAttribute = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('data-ga-action'));
130
- const gaButtonAttribute = await page.$eval('.ons-js-collapsible-button', element => element.getAttribute('data-ga-action'));
131
-
132
- expect(gaHeadingAttribute).toBe('Close panel');
133
- expect(gaButtonAttribute).toBe('Close panel');
134
38
  });
135
39
  });
136
40
 
@@ -146,8 +50,8 @@ describe('script: collapsible', () => {
146
50
  });
147
51
 
148
52
  it('opens the collapsible content', async () => {
149
- const openClass = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--open'));
150
- expect(openClass).toBe(true);
53
+ const openAttribute = await page.$eval('.ons-js-collapsible', node => node.open !== null);
54
+ expect(openAttribute).toBe(true);
151
55
  });
152
56
  });
153
57
 
@@ -157,8 +61,8 @@ describe('script: collapsible', () => {
157
61
  });
158
62
 
159
63
  it('opens the collapsible content', async () => {
160
- const openClass = await page.$eval('.ons-collapsible', element => element.classList.contains('ons-collapsible--open'));
161
- expect(openClass).toBe(true);
64
+ const openAttribute = await page.$eval('.ons-js-collapsible', node => node.open !== null);
65
+ expect(openAttribute).toBe(true);
162
66
  });
163
67
  });
164
68
  });
@@ -196,41 +100,4 @@ describe('script: collapsible', () => {
196
100
  });
197
101
  });
198
102
  });
199
-
200
- describe('when the collapsible is an accordion', () => {
201
- beforeEach(async () => {
202
- await setTestPage(
203
- '/test',
204
- renderComponent('collapsible', {
205
- ...EXAMPLE_COLLAPSIBLE_BASIC,
206
- isAccordion: true,
207
- }),
208
- );
209
- });
210
-
211
- it('does not set `tabindex` on the heading element', async () => {
212
- const tabIndex = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('tabindex'));
213
-
214
- expect(tabIndex).toBe(null);
215
- });
216
- });
217
-
218
- describe('when the collapsible is an accordion and the simple variant', () => {
219
- beforeEach(async () => {
220
- await setTestPage(
221
- '/test',
222
- renderComponent('collapsible', {
223
- ...EXAMPLE_COLLAPSIBLE_BASIC,
224
- isAccordion: true,
225
- variants: 'simple',
226
- }),
227
- );
228
- });
229
-
230
- it('does set `tabindex` on the heading element', async () => {
231
- const tabIndex = await page.$eval('.ons-js-collapsible-heading', element => element.getAttribute('tabindex'));
232
-
233
- expect(tabIndex).toBe('0');
234
- });
235
- });
236
103
  });
@@ -1,22 +1,30 @@
1
1
  .ons-cookies-banner {
2
2
  background: $color-banner-bg;
3
3
  display: none;
4
- padding: 1rem 0;
4
+ padding: 1rem 0 1.5rem;
5
5
 
6
6
  &__title {
7
7
  color: $color-text;
8
8
  }
9
9
 
10
- &__desc {
10
+ &__statement {
11
11
  color: $color-text;
12
- margin-bottom: 1rem;
13
12
  word-break: break-word;
13
+ p {
14
+ margin: 0 0 0.5rem;
15
+
16
+ @include mq(xxs, s) {
17
+ font-size: 0.9rem;
18
+ line-height: 1.4;
19
+ }
20
+ }
21
+ }
22
+
23
+ &__link {
24
+ line-height: 2.1rem;
14
25
  }
15
26
 
16
27
  &__btn {
17
- @include mq(xxs, 499px) {
18
- display: block;
19
- width: 100%;
20
- }
28
+ margin: 0 0 0.8rem;
21
29
  }
22
30
  }
@@ -1,40 +1,84 @@
1
1
  {% macro onsCookiesBanner(params) %}
2
- <div class="ons-cookies-banner" role="region" aria-label="{{ params.ariaLabel | default('Cookies banner')}}">
2
+ {% if params.lang == 'cy' %}
3
+ {% set ariaLabel = 'Cwcis' %}
4
+ {% set serviceName = 'ons.gov.uk' %}
5
+ {% set statementTitle = 'Cwcis ar' %}
6
+ {% set settingsLinkText = 'Gweld cwcis' %}
7
+ {% set settingsLinkURL = '/cwics' %}
8
+ {% set statementText = '<p>Ffeiliau bach a gaiff eu storio ar eich dyfais pan fyddwch yn mynd ar wefan yw cwcis. Rydym ni’n defnyddio rhai cwcis hanfodol i wneud i’r wefan hon weithio.</p><p>Hoffem osod <a href="' + settingsLinkURL + '">cwcis ychwanegol</a> er mwyn cofio eich gosodiadau a deall sut rydych chi’n defnyddio’r wefan. Mae hyn yn ein helpu ni i wella ein gwasanaethau.</p>' %}
9
+ {% set acceptButtonText = 'Derbyn cwcis ychwanegol' %}
10
+ {% set rejectButtonText = 'Gwrthod cwcis ychwanegol' %}
11
+ {% set acceptedText = 'Rydych chi wedi derbyn yr holl gwcis ychwanegol.' %}
12
+ {% set rejectedText = 'Rydych chi wedi gwrthod yr holl gwcis ychwanegol. ' %}
13
+ {% set preferencesText = 'Gallwch chi <a href="' + settingsLinkURL + '">newid eich dewisiadau o ran cwcis</a> ar unrhyw adeg.' %}
14
+ {% set confirmationButtonText = 'Cuddio' %}
15
+ {% set confirmationButtonTextAria = 'neges hon' %}
16
+ {% else %}
17
+ {% set ariaLabel = 'Cookies banner' %}
18
+ {% set serviceName = 'ons.gov.uk' %}
19
+ {% set statementTitle = 'Cookies on' %}
20
+ {% set settingsLinkText = 'View cookies' %}
21
+ {% set settingsLinkURL = '/cookies' %}
22
+ {% set statementText = '<p>Cookies are small files stored on your device when you visit a website. We use some essential cookies to make this website work.</p><p>We would like to set <a href="' + settingsLinkURL + '">additional cookies</a> to remember your settings and understand how you use the site. This helps us to improve our services. </p>' %}
23
+ {% set acceptButtonText = 'Accept additional cookies' %}
24
+ {% set rejectButtonText = 'Reject additional cookies' %}
25
+ {% set acceptedText = 'You have accepted all additional cookies.' %}
26
+ {% set rejectedText = 'You have rejected all additional cookies.' %}
27
+ {% set preferencesText = 'You can <a href="' + settingsLinkURL + '">change your cookie preferences</a> at any time.' %}
28
+ {% set confirmationButtonText = 'Hide' %}
29
+ {% set confirmationButtonTextAria = 'this message' %}
30
+ {% endif %}
31
+
32
+ <div class="ons-cookies-banner" role="region" aria-label="{{ params.ariaLabel | default(ariaLabel)}}">
3
33
  <div class="ons-container ons-cookies-banner__primary">
4
34
  <div class="ons-grid">
5
35
  <div class="ons-grid__col ons-col-8@m">
6
- <h2 class="ons-cookies-banner__title ons-u-mb-xs">{{ params.statementTitle }}</h2>
7
- <p class="ons-cookies-banner__desc">{{ params.statementText | safe }}</p>
8
- {% from "components/button/_macro.njk" import onsButton %}
9
- {{
10
- onsButton({
11
- "type": 'button',
12
- "text": params.primaryButtonText | default('Accept all cookies'),
13
- "classes": 'ons-btn--small ons-js-accept-cookies ons-u-mb-xs@xxs@s ons-cookies-banner__btn'
14
- })
15
- }}
16
- {{
17
- onsButton({
18
- "type": 'button',
19
- "url": params.secondaryButtonUrl,
20
- "text": params.secondaryButtonText | default('Set cookie preferences'),
21
- "classes": 'ons-btn--small ons-u-ml-no@xxs@s ons-cookies-banner__btn'
22
- })
23
- }}
36
+ <h2 class="ons-cookies-banner__title ons-u-mb-xs">{{ params.statementTitle | default(statementTitle) }} {{ params.serviceName | default(serviceName) }}</h2>
37
+ <div class="ons-cookies-banner__statement">{{ params.statementText | default(statementText) | safe }}</div>
38
+ </div>
39
+ </div>
40
+ <div class="ons-grid ons-grid--flex ons-u-mt-s">
41
+ <div class="ons-grid__col">
42
+ {% from "components/button/_macro.njk" import onsButton %}
43
+ {{
44
+ onsButton({
45
+ "type": 'button',
46
+ "attributes": {
47
+ "data-button": 'accept'
48
+ },
49
+ "text": params.acceptButtonText | default(acceptButtonText),
50
+ "classes": 'ons-btn--small ons-js-accept-cookies ons-cookies-banner__btn'
51
+ })
52
+ }}
53
+ </div>
54
+ <div class="ons-grid__col">
55
+ {{
56
+ onsButton({
57
+ "type": 'button',
58
+ "attributes": {
59
+ "data-button": 'reject'
60
+ },
61
+ "text": params.rejectButtonText | default(rejectButtonText),
62
+ "classes": 'ons-btn--small ons-js-reject-cookies ons-cookies-banner__btn'
63
+ })
64
+ }}
65
+ </div>
66
+ <div class="ons-grid__col">
67
+ <a class="ons-cookies-banner__link" href="{{ params.settingsLinkURL | default(settingsLinkURL) }}">{{ params.settingsLinkText | default(settingsLinkText) }}</a>
24
68
  </div>
25
69
  </div>
26
70
  </div>
27
71
  <div class="ons-container ons-cookies-banner__confirmation ons-u-d-no">
28
72
  <div class="ons-grid ons-grid--flex ons-grid--between ons-grid--gutterless ons-grid--no-wrap@s ons-grid--vertical-center">
29
73
  <div class="ons-grid__col ons-grid__col--flex ons-col-auto ons-u-flex-shrink@s">
30
- <p class="ons-cookies-banner__desc ons-u-mb-no@s ons-u-mr-s@s">{{ params.confirmationText | safe }}</p>
74
+ <p class="ons-cookies-banner__desc ons-u-mb-no@s ons-u-mr-s@s"><span class="ons-js-accepted-text ons-u-d-no">{{ params.acceptedText | default(acceptedText) | safe }} </span><span class="ons-js-rejected-text ons-u-d-no">{{ params.rejectedText | default(rejectedText) | safe }} </span><span class="ons-cookies-banner__preferences-text">{{ params.preferencesText | default(preferencesText) | safe }}</span></p>
31
75
  </div>
32
76
  <div class="ons-grid__col">
33
77
  {{
34
78
  onsButton({
35
79
  "type": 'button',
36
- "text": params.confirmationButtonText | default('Hide'),
37
- "buttonContext": params.confirmationButtonTextAria | default('the cookie message'),
80
+ "text": params.confirmationButtonText | default(confirmationButtonText),
81
+ "buttonContext": params.confirmationButtonTextAria | default(confirmationButtonTextAria),
38
82
  "classes": 'ons-btn--secondary ons-btn--small ons-js-hide-button'
39
83
  })
40
84
  }}