@ons/design-system 72.0.1 → 72.1.1

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 (55) hide show
  1. package/README.md +1 -1
  2. package/components/accordion/_macro.spec.js +2 -2
  3. package/components/address-input/_macro.spec.js +245 -322
  4. package/components/address-input/autosuggest.address.spec.js +16 -14
  5. package/components/address-output/_macro.spec.js +121 -74
  6. package/components/address-output/_test_examples.js +8 -0
  7. package/components/autosuggest/_macro.njk +1 -0
  8. package/components/autosuggest/_macro.spec.js +373 -178
  9. package/components/autosuggest/autosuggest.spec.js +3 -1
  10. package/components/autosuggest/autosuggest.ui.js +39 -10
  11. package/components/autosuggest/example-autosuggest-country.njk +2 -1
  12. package/components/autosuggest/fuse-config.js +7 -2
  13. package/components/back-to-top/back-to-top.dom.js +4 -4
  14. package/components/back-to-top/back-to-top.js +1 -1
  15. package/components/browser-banner/_macro.spec.js +11 -11
  16. package/components/button/_macro.njk +1 -1
  17. package/components/button/_macro.spec.js +405 -351
  18. package/components/button/example-button-group.njk +1 -0
  19. package/components/checkboxes/_checkbox-macro.njk +20 -0
  20. package/components/checkboxes/_checkbox.scss +3 -3
  21. package/components/checkboxes/_macro.njk +5 -0
  22. package/components/checkboxes/_macro.spec.js +35 -0
  23. package/components/checkboxes/example-checkboxes-with-revealed-text-area-expanded.njk +68 -0
  24. package/components/checkboxes/example-checkboxes-with-revealed-text-area.njk +67 -0
  25. package/components/details/_details.scss +1 -2
  26. package/components/details/example-details-open.njk +10 -0
  27. package/components/external-link/_macro.spec.js +66 -69
  28. package/components/external-link/_test_examples.js +4 -0
  29. package/components/feedback/_macro.spec.js +109 -80
  30. package/components/feedback/_test_examples.js +17 -0
  31. package/components/field/_macro.spec.js +106 -69
  32. package/components/section-navigation/_macro.njk +9 -6
  33. package/components/summary/_macro.njk +73 -78
  34. package/components/summary/_macro.spec.js +5 -15
  35. package/components/summary/_summary.scss +16 -11
  36. package/components/table-of-contents/_macro.njk +3 -3
  37. package/components/table-of-contents/_macro.spec.js +3 -3
  38. package/components/table-of-contents/{_toc.scss → _table-of-contents.scss} +1 -1
  39. package/components/table-of-contents/table-of-contents.dom.js +13 -0
  40. package/components/table-of-contents/{toc.js → table-of-contents.js} +4 -4
  41. package/components/table-of-contents/{toc.spec.js → table-of-contents.spec.js} +2 -2
  42. package/components/tabs/_tabs.scss +10 -11
  43. package/components/tabs/tabs.js +3 -3
  44. package/components/timeout-modal/timeout-modal.spec.js +1 -1
  45. package/css/main.css +1 -1
  46. package/js/analytics.js +1 -1
  47. package/js/main.js +1 -1
  48. package/package.json +2 -2
  49. package/scripts/main.es5.js +1 -1
  50. package/scripts/main.js +1 -1
  51. package/scss/main.scss +1 -1
  52. package/scss/objects/_page.scss +1 -1
  53. package/scss/utilities/_margin.scss +4 -0
  54. package/scss/utilities/_padding.scss +4 -0
  55. package/components/table-of-contents/toc.dom.js +0 -13
@@ -4,103 +4,132 @@ import * as cheerio from 'cheerio';
4
4
 
5
5
  import axe from '../../tests/helpers/axe';
6
6
  import { renderComponent } from '../../tests/helpers/rendering';
7
-
8
- const EXAMPLE_FEEDBACK_MINIMAL = {
9
- heading: 'Feedback heading',
10
- content: 'Feedback content...',
11
- linkUrl: 'http://example.com',
12
- linkText: 'Feedback link text',
13
- };
14
-
15
- const EXAMPLE_FEEDBACK_FULL = {
16
- id: 'example-feedback',
17
- classes: 'extra-class',
18
- heading: 'Feedback heading',
19
- headingLevel: 5,
20
- headingClasses: 'extra-heading-class another-extra-heading-class',
21
- content: 'Feedback content...',
22
- linkUrl: 'http://example.com',
23
- linkText: 'Feedback link text',
24
- };
25
-
26
- describe('macro: feedback', () => {
27
- it('passes jest-axe checks with minimum parameters', async () => {
28
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_MINIMAL));
29
-
30
- const results = await axe($.html());
31
- expect(results).toHaveNoViolations();
7
+ import { EXAMPLE_FEEDBACK, EXAMPLE_FEEDBACK_ALL_PARAMS } from './_test_examples';
8
+
9
+ describe('FOR: Macro: Feedback', () => {
10
+ describe('GIVEN: Params: required', () => {
11
+ describe('WHEN: all required params are provided', () => {
12
+ const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK));
13
+ test('THEN: jest-axe checks pass', async () => {
14
+ const results = await axe($.html());
15
+ expect(results).toHaveNoViolations();
16
+ });
17
+
18
+ test('THEN: the title has a default headingLevel of 2', () => {
19
+ expect($(`h2.ons-feedback__heading`).text().trim()).toBe('Feedback heading');
20
+ });
21
+ });
32
22
  });
33
23
 
34
- it('passes jest-axe checks with full parameters', async () => {
35
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_FULL));
36
-
37
- const results = await axe($.html());
38
- expect(results).toHaveNoViolations();
24
+ describe('GIVEN: Params: all', () => {
25
+ describe('WHEN: all params are provided', () => {
26
+ const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_ALL_PARAMS));
27
+ test('THEN: jest-axe checks pass', async () => {
28
+ const results = await axe($.html());
29
+ expect(results).toHaveNoViolations();
30
+ });
31
+ });
39
32
  });
40
33
 
41
- it('has the provided `id` attribute', () => {
42
- const $ = cheerio.load(
43
- renderComponent('feedback', {
44
- id: 'example-id',
45
- }),
46
- );
47
-
48
- expect($('#example-id').length).toBe(1);
34
+ describe('GIVEN: Params: id', () => {
35
+ describe('WHEN: id is provided', () => {
36
+ const $ = cheerio.load(
37
+ renderComponent('feedback', {
38
+ ...EXAMPLE_FEEDBACK,
39
+ id: 'example-id',
40
+ }),
41
+ );
42
+ test('THEN: renders with provided id', () => {
43
+ expect($('#example-id').length).toBe(1);
44
+ });
45
+ });
49
46
  });
50
47
 
51
- it('has additionally provided style classes', () => {
52
- const $ = cheerio.load(
53
- renderComponent('feedback', {
54
- classes: 'extra-class another-extra-class',
55
- }),
56
- );
57
-
58
- expect($('.ons-feedback').hasClass('extra-class')).toBe(true);
59
- expect($('.ons-feedback').hasClass('another-extra-class')).toBe(true);
48
+ describe('GIVEN: Params: classes', () => {
49
+ describe('WHEN: additional style classes are provided', () => {
50
+ const $ = cheerio.load(
51
+ renderComponent('feedback', {
52
+ ...EXAMPLE_FEEDBACK,
53
+ classes: 'extra-class another-extra-class',
54
+ }),
55
+ );
56
+ test('THEN: renders with provided classes', () => {
57
+ expect($('.ons-feedback').hasClass('extra-class')).toBe(true);
58
+ expect($('.ons-feedback').hasClass('another-extra-class')).toBe(true);
59
+ });
60
+ });
60
61
  });
61
62
 
62
- it.each([
63
- [1, 'h1'],
64
- [4, 'h4'],
65
- ])('has the correct element type for the provided `headingLevel` (%i -> %s)', (headingLevel, expectedTitleTag) => {
66
- const $ = cheerio.load(
67
- renderComponent('feedback', {
68
- ...EXAMPLE_FEEDBACK_MINIMAL,
69
- headingLevel,
70
- }),
71
- );
72
-
73
- expect($(`${expectedTitleTag}.ons-feedback__heading`).text().trim()).toBe('Feedback heading');
63
+ describe('GIVEN: Params: heading', () => {
64
+ describe('WHEN: heading is provided', () => {
65
+ const $ = cheerio.load(
66
+ renderComponent('feedback', {
67
+ ...EXAMPLE_FEEDBACK,
68
+ }),
69
+ );
70
+ test('THEN: renders with provided heading text', () => {
71
+ expect($('.ons-feedback__heading').text().trim()).toBe('Feedback heading');
72
+ });
73
+ });
74
74
  });
75
75
 
76
- it('has a default `headingLevel` of 2', () => {
77
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_MINIMAL));
78
-
79
- expect($(`h2.ons-feedback__heading`).text().trim()).toBe('Feedback heading');
76
+ describe('GIVEN: Params: headingLevel', () => {
77
+ describe('WHEN: headingLevel is provided', () => {
78
+ test.each([
79
+ [1, 'h1'],
80
+ [4, 'h4'],
81
+ ])('THEN: has the correct heading element type for the provided headingLevel (%i -> %s)', (headingLevel, expectedTitleTag) => {
82
+ const $ = cheerio.load(
83
+ renderComponent('feedback', {
84
+ ...EXAMPLE_FEEDBACK,
85
+ headingLevel,
86
+ }),
87
+ );
88
+ const titleTag = $(`${expectedTitleTag}.ons-feedback__heading`)[0].tagName;
89
+ expect(titleTag).toBe(expectedTitleTag);
90
+ });
91
+ });
80
92
  });
81
93
 
82
- it('has additional heading style classes', () => {
83
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_FULL));
84
-
85
- expect($('.ons-feedback__heading').hasClass('extra-heading-class')).toBe(true);
86
- expect($('.ons-feedback__heading').hasClass('another-extra-heading-class')).toBe(true);
94
+ describe('GIVEN: Params: headingClasses', () => {
95
+ describe('WHEN: additional heading style classes are provided', () => {
96
+ const $ = cheerio.load(
97
+ renderComponent('feedback', {
98
+ ...EXAMPLE_FEEDBACK,
99
+ headingClasses: 'extra-heading-class another-extra-heading-class',
100
+ }),
101
+ );
102
+ test('THEN: renders with provided classes', () => {
103
+ expect($('.ons-feedback__heading').hasClass('extra-heading-class')).toBe(true);
104
+ expect($('.ons-feedback__heading').hasClass('another-extra-heading-class')).toBe(true);
105
+ });
106
+ });
87
107
  });
88
108
 
89
- it('has a paragraph with the provided `content`', () => {
90
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_MINIMAL));
91
-
92
- expect($('p').text().trim()).toBe('Feedback content...');
109
+ describe('GIVEN: Params: content', () => {
110
+ describe('WHEN: content is provided', () => {
111
+ const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK));
112
+ test('THEN: renders paragraph with the provided content', () => {
113
+ expect($('p').text().trim()).toBe('Feedback content...');
114
+ });
115
+ });
93
116
  });
94
117
 
95
- it('has a link with the provided `linkUrl`', () => {
96
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_MINIMAL));
97
-
98
- expect($('.ons-feedback__link').attr('href')).toBe('http://example.com');
118
+ describe('GIVEN: Params: linkUrl', () => {
119
+ describe('WHEN: linkUrl is provided', () => {
120
+ const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK));
121
+ test('THEN: renders a link with the provided linkUrl', () => {
122
+ expect($('.ons-feedback__link').attr('href')).toBe('http://example.com');
123
+ });
124
+ });
99
125
  });
100
126
 
101
- it('has a link with the provided `linkText`', () => {
102
- const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK_MINIMAL));
103
-
104
- expect($('.ons-feedback__link').text().trim()).toBe('Feedback link text');
127
+ describe('GIVEN: Params: linkText', () => {
128
+ describe('WHEN: linkText is provided', () => {
129
+ const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK));
130
+ test('THEN: renders a link with the provided linkText', () => {
131
+ expect($('.ons-feedback__link').text().trim()).toBe('Feedback link text');
132
+ });
133
+ });
105
134
  });
106
135
  });
@@ -0,0 +1,17 @@
1
+ export const EXAMPLE_FEEDBACK = {
2
+ heading: 'Feedback heading',
3
+ content: 'Feedback content...',
4
+ linkUrl: 'http://example.com',
5
+ linkText: 'Feedback link text',
6
+ };
7
+
8
+ export const EXAMPLE_FEEDBACK_ALL_PARAMS = {
9
+ id: 'example-feedback',
10
+ classes: 'extra-class',
11
+ heading: 'Feedback heading',
12
+ headingLevel: 5,
13
+ headingClasses: 'extra-heading-class another-extra-heading-class',
14
+ content: 'Feedback content...',
15
+ linkUrl: 'http://example.com',
16
+ linkText: 'Feedback link text',
17
+ };
@@ -5,91 +5,128 @@ import * as cheerio from 'cheerio';
5
5
  import axe from '../../tests/helpers/axe';
6
6
  import { renderComponent, templateFaker } from '../../tests/helpers/rendering';
7
7
 
8
- const EXAMPLE_FIELD_BASIC = {
9
- id: 'example-field',
10
- };
11
-
12
- describe('macro: field', () => {
13
- it('passes jest-axe checks', async () => {
14
- const $ = cheerio.load(renderComponent('field', EXAMPLE_FIELD_BASIC));
15
-
16
- const results = await axe($.html());
17
- expect(results).toHaveNoViolations();
8
+ describe('FOR: Macro: Field', () => {
9
+ describe('GIVEN: Params: none', () => {
10
+ describe('WHEN: no params are provided', () => {
11
+ const $ = cheerio.load(renderComponent('field'));
12
+ test('THEN: passes jest-axe checks', async () => {
13
+ const results = await axe($.html());
14
+ expect(results).toHaveNoViolations();
15
+ });
16
+ });
18
17
  });
19
18
 
20
- it('has the provided `id` attribute', () => {
21
- const $ = cheerio.load(renderComponent('field', EXAMPLE_FIELD_BASIC));
22
-
23
- expect($('.ons-field').attr('id')).toBe('example-field');
19
+ describe('GIVEN: Params: id', () => {
20
+ describe('WHEN: id is provided', () => {
21
+ const $ = cheerio.load(
22
+ renderComponent('field', {
23
+ id: 'example-field',
24
+ }),
25
+ );
26
+ test('THEN: renders with the provided id', () => {
27
+ expect($('.ons-field').attr('id')).toBe('example-field');
28
+ });
29
+ });
24
30
  });
25
31
 
26
- it('has additionally provided style classes', () => {
27
- const $ = cheerio.load(
28
- renderComponent('field', {
29
- ...EXAMPLE_FIELD_BASIC,
30
- classes: 'extra-class another-extra-class',
31
- }),
32
- );
33
-
34
- expect($('.ons-field').hasClass('extra-class')).toBe(true);
35
- expect($('.ons-field').hasClass('another-extra-class')).toBe(true);
32
+ describe('GIVEN: Params: classes', () => {
33
+ describe('WHEN: additional style classes are provided', () => {
34
+ const $ = cheerio.load(
35
+ renderComponent('field', {
36
+ classes: 'extra-class another-extra-class',
37
+ }),
38
+ );
39
+ test('THEN: renders with provided classes', () => {
40
+ expect($('.ons-field').hasClass('extra-class')).toBe(true);
41
+ expect($('.ons-field').hasClass('another-extra-class')).toBe(true);
42
+ });
43
+ });
36
44
  });
37
45
 
38
- it('has correct class when `inline` is provided', () => {
39
- const $ = cheerio.load(
40
- renderComponent('field', {
41
- ...EXAMPLE_FIELD_BASIC,
42
- inline: true,
43
- }),
44
- );
45
-
46
- expect($('.ons-field').hasClass('ons-field--inline')).toBe(true);
46
+ describe('GIVEN: Params: inline', () => {
47
+ describe('WHEN: inline is provided', () => {
48
+ const $ = cheerio.load(
49
+ renderComponent('field', {
50
+ inline: true,
51
+ }),
52
+ );
53
+ test('THEN: renders with the inline class', () => {
54
+ expect($('.ons-field').hasClass('ons-field--inline')).toBe(true);
55
+ });
56
+ });
47
57
  });
48
58
 
49
- it('has additionally provided `attributes`', () => {
50
- const $ = cheerio.load(
51
- renderComponent('field', {
52
- ...EXAMPLE_FIELD_BASIC,
53
- attributes: {
54
- a: 123,
55
- b: 456,
56
- },
57
- }),
58
- );
59
-
60
- expect($('.ons-field').attr('a')).toBe('123');
61
- expect($('.ons-field').attr('b')).toBe('456');
59
+ describe('GIVEN: Params: attributes', () => {
60
+ describe('WHEN: custom attributes are provided', () => {
61
+ const $ = cheerio.load(
62
+ renderComponent('field', {
63
+ attributes: {
64
+ a: 123,
65
+ b: 456,
66
+ },
67
+ }),
68
+ );
69
+ test('THEN: renders with additionally provided attributes', () => {
70
+ expect($('.ons-field').attr('a')).toBe('123');
71
+ expect($('.ons-field').attr('b')).toBe('456');
72
+ });
73
+ });
62
74
  });
63
75
 
64
- it('has the correct element with `dontWrap`', () => {
65
- const $ = cheerio.load(
66
- renderComponent('field', {
67
- ...EXAMPLE_FIELD_BASIC,
68
- dontWrap: true,
69
- }),
70
- );
71
-
72
- expect($('.ons-field').length).toBe(0);
73
- });
76
+ describe('GIVEN: Params: dontWrap', () => {
77
+ describe('WHEN: dontWrap is set to true', () => {
78
+ const $ = cheerio.load(
79
+ renderComponent('field', {
80
+ dontWrap: true,
81
+ }),
82
+ );
83
+ test('THEN: renders the content without being wrapped in a field div', () => {
84
+ expect($('.ons-field').length).toBe(0);
85
+ });
86
+ });
74
87
 
75
- it('calls with content', () => {
76
- const $ = cheerio.load(renderComponent('field', EXAMPLE_FIELD_BASIC, 'Example content...'));
88
+ describe('WHEN: dontWrap is set to false', () => {
89
+ const $ = cheerio.load(
90
+ renderComponent('field', {
91
+ dontWrap: false,
92
+ }),
93
+ );
94
+ test('THEN: renders the content wrapped in a field div', () => {
95
+ expect($('.ons-field').length).toBe(1);
96
+ });
97
+ });
77
98
 
78
- const content = $('.ons-field').html().trim();
79
- expect(content).toEqual(expect.stringContaining('Example content...'));
99
+ describe('WHEN: dontWrap is not provided', () => {
100
+ const $ = cheerio.load(renderComponent('field', {}));
101
+ test('THEN: renders the content wrapped in a field div', () => {
102
+ expect($('.ons-field').length).toBe(1);
103
+ });
104
+ });
80
105
  });
81
106
 
82
- it('calls the error component when `error` is provided', () => {
83
- const faker = templateFaker();
84
- const errorSpy = faker.spy('error');
85
-
86
- faker.renderComponent('field', {
87
- ...EXAMPLE_FIELD_BASIC,
88
- error: { text: 'There is an error' },
107
+ describe('GIVEN: Params: error', () => {
108
+ describe('WHEN: error is provided', () => {
109
+ const faker = templateFaker();
110
+ const errorSpy = faker.spy('error');
111
+
112
+ faker.renderComponent('field', {
113
+ error: { text: 'There is an error' },
114
+ });
115
+ test('THEN" calls the error component', () => {
116
+ expect(errorSpy.occurrences[0]).toEqual({
117
+ text: 'There is an error',
118
+ });
119
+ });
89
120
  });
121
+ });
90
122
 
91
- expect(errorSpy.occurrences[0]).toEqual({
92
- text: 'There is an error',
123
+ describe('GIVEN: Content', () => {
124
+ describe('WHEN: field is called with content provided', () => {
125
+ const $ = cheerio.load(renderComponent('field', {}, 'Example content...'));
126
+ const content = $('.ons-field').html().trim();
127
+ test('THEN: renders the field with the provided content', () => {
128
+ expect(content).toEqual(expect.stringContaining('Example content...'));
129
+ });
93
130
  });
94
131
  });
95
132
  });
@@ -31,9 +31,12 @@
31
31
  class="ons-section-nav__item{{ ' ' + item.classes if item.classes else '' }}{{ ' ons-section-nav__item--active' if isCurrent == true }}"
32
32
  >
33
33
  {% if isCurrent == true %}
34
- {{ openingHeadingTag | replace(headingLevel, sectionItemHeadingLevel | string) | safe }}
35
- class="ons-section-nav__link ons-section-nav__item-header" href="{{ item.url }}"
36
- aria-current="location">{{ item.text }}{{ closingHeadingTag | replace(headingLevel, sectionItemHeadingLevel | string) | safe }}
34
+ <a
35
+ class="ons-section-nav__link ons-section-nav__item-header"
36
+ href="{{ item.url }}"
37
+ aria-current="location"
38
+ >{{ item.text }}</a
39
+ >
37
40
  {% else %}
38
41
  <a class="ons-section-nav__link" href="{{ item.url }}">{{ item.text }}</a>
39
42
  {% endif %}
@@ -71,9 +74,9 @@
71
74
  class="ons-section-nav__item{{ ' ' + item.classes if item.classes else '' }}{% if isCurrent == true %}{{ ' ' }}ons-section-nav__item--active{% endif %}"
72
75
  >
73
76
  {% if isCurrent == true %}
74
- {{ openingHeadingTag | replace(headingLevel, sectionItemHeadingLevel | string) | safe }}
75
- class="ons-section-nav__link ons-section-nav__item-header" href="{{ item.url }}"
76
- aria-current="location">{{ item.text }}{{ closingHeadingTag | replace(headingLevel, sectionItemHeadingLevel | string) | safe }}
77
+ <a class="ons-section-nav__link ons-section-nav__item-header" href="{{ item.url }}" aria-current="location"
78
+ >{{ item.text }}</a
79
+ >
77
80
  {% else %}
78
81
  <a class="ons-section-nav__link" href="{{ item.url }}">{{ item.text }}</a>
79
82
  {% endif %}