@ons/design-system 74.0.0-next.1 → 74.0.0-next.10

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 (107) hide show
  1. package/README.md +15 -3
  2. package/components/access-code/example-access-code-error.njk +1 -1
  3. package/components/access-code/example-access-code.njk +1 -1
  4. package/components/address-input/autosuggest.address.spec.js +23 -0
  5. package/components/autosuggest/autosuggest.ui.js +3 -0
  6. package/components/back-to-top/example-full-page-back-to-top.njk +1 -1
  7. package/components/breadcrumbs/_breadcrumbs.scss +4 -7
  8. package/components/breadcrumbs/_macro.njk +29 -25
  9. package/components/breadcrumbs/_macro.spec.js +39 -0
  10. package/components/breadcrumbs/example-breadcrumbs-wide.njk +52 -0
  11. package/components/chart/_chart.scss +0 -9
  12. package/components/chart/_macro.njk +96 -128
  13. package/components/chart/_macro.spec.js +43 -28
  14. package/components/chart/example-area-chart-with-axis-min-and-max-values.njk +6 -3
  15. package/components/chart/example-area-chart.njk +6 -3
  16. package/components/chart/example-bar-chart-with-annotations.njk +6 -3
  17. package/components/chart/example-bar-chart-with-axis-min-and-max-values.njk +6 -3
  18. package/components/chart/example-bar-chart-with-point-range-and-reference-line-annotations.njk +6 -3
  19. package/components/chart/example-bar-chart.njk +6 -3
  20. package/components/chart/example-bar-with-confidence-levels.njk +6 -3
  21. package/components/chart/example-clustered-bar-chart.njk +6 -3
  22. package/components/chart/example-clustered-column-chart.njk +6 -3
  23. package/components/chart/example-column-chart-with-annotations.njk +6 -3
  24. package/components/chart/example-column-chart-with-axis-min-and-max-values.njk +6 -3
  25. package/components/chart/example-column-chart-with-custom-reference-line-value.njk +6 -3
  26. package/components/chart/example-column-chart-with-range-annotations.njk +6 -3
  27. package/components/chart/example-column-chart-with-reference-line-annotations.njk +6 -3
  28. package/components/chart/example-column-chart.njk +6 -3
  29. package/components/chart/example-column-with-confidence-levels.njk +6 -3
  30. package/components/chart/example-column-with-line-chart.njk +6 -3
  31. package/components/chart/example-iframe-chart.njk +6 -3
  32. package/components/chart/example-line-chart-with-annotations.njk +6 -3
  33. package/components/chart/example-line-chart-with-axis-min-and-max-values.njk +6 -3
  34. package/components/chart/example-line-chart-with-custom-reference-line-value.njk +6 -3
  35. package/components/chart/example-line-chart-with-label-format.njk +6 -3
  36. package/components/chart/example-line-chart-with-markers.njk +6 -3
  37. package/components/chart/example-line-chart-with-range-annotations-inside.njk +6 -3
  38. package/components/chart/example-line-chart-with-range-annotations-outside-left-right.njk +6 -3
  39. package/components/chart/example-line-chart-with-range-annotations-outside-top-bottom.njk +6 -3
  40. package/components/chart/example-line-chart-with-reference-line-annotations.njk +6 -3
  41. package/components/chart/example-line-chart.njk +6 -3
  42. package/components/chart/example-scatter-chart-with-axis-min-and-max-values.njk +6 -3
  43. package/components/chart/example-scatter-chart.njk +6 -3
  44. package/components/chart/example-stacked-bar-chart.njk +6 -3
  45. package/components/chart/example-stacked-column-chart.njk +6 -3
  46. package/components/document-list/_macro.njk +2 -2
  47. package/components/document-list/_macro.spec.js +55 -0
  48. package/components/featured-article/_macro.njk +3 -37
  49. package/components/featured-article/example-featured-article-with-chart.njk +19 -14
  50. package/components/featured-article/example-featured-article-with-image.njk +12 -7
  51. package/components/featured-article/featured-article.scss +1 -1
  52. package/components/featured-article/macro.spec.js +44 -67
  53. package/components/figure/_figure.scss +31 -0
  54. package/components/figure/_macro.njk +98 -0
  55. package/components/figure/_macro.spec.js +520 -0
  56. package/components/figure/example-figure-heading-level-2.njk +34 -0
  57. package/components/figure/example-figure-with-div.njk +29 -0
  58. package/components/figure/example-figure-without-footer.njk +12 -0
  59. package/components/figure/example-figure-without-header.njk +24 -0
  60. package/components/figure/example-figure.njk +34 -0
  61. package/components/header/_header.scss +1 -3
  62. package/components/header/_macro.njk +8 -4
  63. package/components/header/_macro.spec.js +48 -0
  64. package/components/hero/_macro.njk +3 -2
  65. package/components/hero/_macro.spec.js +36 -0
  66. package/components/hero/example-hero-dark-wide.njk +17 -0
  67. package/components/hero/example-hero-dark-with-external-breadcrumbs.njk +17 -21
  68. package/components/hero/example-hero-default-full-width.njk +16 -0
  69. package/components/hero/example-hero-default-with-external-breadcrumbs.njk +165 -169
  70. package/components/hero/example-hero-grey-with-external-breadcrumbs.njk +207 -211
  71. package/components/hero/example-hero-navy-blue-with-external-breadcrumbs.njk +163 -167
  72. package/components/hero/example-hero-pale-blue-with-external-breadcrumbs.njk +165 -169
  73. package/components/image/_image.scss +0 -7
  74. package/components/image/_macro.njk +25 -14
  75. package/components/image/_macro.spec.js +122 -7
  76. package/components/image/example-image-with-figure-fields.njk +25 -0
  77. package/components/list/_macro.njk +1 -0
  78. package/components/list/_macro.spec.js +16 -0
  79. package/components/question/example-question-ccs.njk +1 -1
  80. package/components/question/example-question-fieldset.njk +1 -1
  81. package/components/question/example-question-interviewer-note.njk +1 -1
  82. package/components/question/example-question-no-fieldset.njk +1 -1
  83. package/components/relationships/example-relationships-error.njk +1 -1
  84. package/components/relationships/example-relationships-you.njk +1 -1
  85. package/components/relationships/example-relationships.njk +1 -1
  86. package/components/table/_macro.njk +138 -111
  87. package/components/table/_macro.spec.js +175 -16
  88. package/components/table/_table.scss +6 -1
  89. package/components/table/example-table-basic-no-caption.njk +46 -0
  90. package/components/table/example-table-basic-visually-hidden-caption.njk +47 -0
  91. package/components/table/example-table-with-figure-fields.njk +86 -0
  92. package/components/table/table.spec.js +2 -0
  93. package/components/table-of-contents/_macro.njk +6 -4
  94. package/components/table-of-contents/_macro.spec.js +43 -3
  95. package/components/table-of-contents/example-table-of-contents-ordered.njk +64 -0
  96. package/components/table-of-contents/example-table-of-contents-sticky-full-page-ordered.njk +156 -0
  97. package/components/table-of-contents/example-table-of-contents-sticky-full-page.njk +1 -1
  98. package/components/table-of-contents/table-of-contents.spec.js +4 -5
  99. package/css/main.css +1 -1
  100. package/layout/_template.njk +66 -46
  101. package/package.json +45 -36
  102. package/scripts/main.es5.js +3 -3
  103. package/scripts/main.js +2 -2
  104. package/scss/base/_global.scss +8 -0
  105. package/scss/main.scss +1 -0
  106. package/scss/objects/_page.scss +1 -1
  107. package/scss/objects/_spacing.scss +0 -4
@@ -3,12 +3,12 @@
3
3
  import * as cheerio from 'cheerio';
4
4
  import axe from '../../tests/helpers/axe';
5
5
  import { renderComponent } from '../../tests/helpers/rendering';
6
- import { EXAMPLE_FEATURED_ARTICLE_WITH_CHART, EXAMPLE_FEATURED_ARTICLE_WITH_IMAGE } from './_test-examples';
6
+ import { EXAMPLE_FEATURED_ARTICLE_PARAMS, EXAMPLE_CHART_CALLER_CONTENT, EXAMPLE_IMAGE_CALLER_CONTENT } from './_test-examples';
7
7
 
8
8
  describe('Macro: Featured Article', () => {
9
9
  describe('GIVEN: Params: required', () => {
10
- describe('WHEN: chart is provided and image is not', () => {
11
- const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_WITH_CHART));
10
+ describe('WHEN: chart content is provided via caller', () => {
11
+ const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_PARAMS, EXAMPLE_CHART_CALLER_CONTENT));
12
12
 
13
13
  test('THEN: it passes accessibility checks', async () => {
14
14
  const results = await axe($.html());
@@ -23,8 +23,8 @@ describe('Macro: Featured Article', () => {
23
23
  expect($('.ons-featured__title a').attr('href')).toBe('/economy/economic-trends-2024');
24
24
  });
25
25
 
26
- test('THEN: it renders the onsChart component', () => {
27
- expect($('[data-highcharts-base-chart]').length).toBe(1);
26
+ test('THEN: it renders the caller content in the media area', () => {
27
+ expect($('.ons-featured__media [data-highcharts-base-chart]').length).toBe(1);
28
28
  });
29
29
 
30
30
  test('THEN: the chart has the correct id', () => {
@@ -36,8 +36,8 @@ describe('Macro: Featured Article', () => {
36
36
  });
37
37
  });
38
38
 
39
- describe('WHEN: image is provided and chart is not', () => {
40
- const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_WITH_IMAGE));
39
+ describe('WHEN: image content is provided via caller', () => {
40
+ const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_PARAMS, EXAMPLE_IMAGE_CALLER_CONTENT));
41
41
 
42
42
  test('THEN: it passes accessibility checks', async () => {
43
43
  const results = await axe($.html());
@@ -45,78 +45,50 @@ describe('Macro: Featured Article', () => {
45
45
  });
46
46
 
47
47
  test('THEN: it displays the correct title text', () => {
48
- expect($('.ons-featured__title').text().trim()).toBe('Population Insights');
48
+ expect($('.ons-featured__title').text().trim()).toBe('Economic Trends 2024');
49
49
  });
50
50
 
51
51
  test('THEN: the title has the correct url link', () => {
52
- expect($('.ons-featured__title a').attr('href')).toBe('/people/population/insights');
52
+ expect($('.ons-featured__title a').attr('href')).toBe('/economy/economic-trends-2024');
53
53
  });
54
54
 
55
55
  test('THEN: it renders image with correct src attribute', () => {
56
- expect($('.ons-image__img').attr('src')).toBe('example.png');
56
+ expect($('.ons-featured__media .ons-image__img').attr('src')).toBe('example.png');
57
57
  });
58
58
 
59
59
  test('THEN: it renders image with correct alt text', () => {
60
- expect($('.ons-image__img').attr('alt')).toBe('Example alt text');
60
+ expect($('.ons-featured__media .ons-image__img').attr('alt')).toBe('Example alt text');
61
61
  });
62
62
  });
63
63
 
64
- describe('WHEN: both chart and image is provided', () => {
65
- const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_WITH_CHART));
64
+ describe('WHEN: no caller content is provided', () => {
65
+ const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_PARAMS));
66
66
 
67
- test('THEN: it renders the onsChart component', () => {
68
- expect($('[data-highcharts-base-chart]').length).toBe(1);
69
- });
70
- test('THEN: it does not render the onsImage component', () => {
71
- expect($('.ons-image__img').length).toBe(0);
67
+ test('THEN: the media area is empty', () => {
68
+ expect($('.ons-featured__media').html().trim()).toBe('');
72
69
  });
73
70
  });
74
71
  });
75
72
 
76
73
  describe('GIVEN: Param: metadata', () => {
77
- describe('WHEN: chart is provided', () => {
78
- const $ = cheerio.load(
79
- renderComponent('featured-article', {
80
- ...EXAMPLE_FEATURED_ARTICLE_WITH_CHART,
81
- metadata: {
82
- date: {
83
- prefix: 'Released',
84
- showPrefix: true,
85
- iso: '2024-05-01',
86
- short: '1 May 2024',
87
- },
88
- text: 'Bulletin',
89
- },
90
- }),
91
- );
92
-
93
- test('THEN: it renders ISO date value correctly', () => {
94
- expect($('time').attr('datetime')).toBe('2024-05-01');
95
- });
96
-
97
- test('THEN: it renders short date label correctly', () => {
98
- expect($('time').text()).toBe('1 May 2024');
99
- });
100
-
101
- test('THEN: it displays metadata text', () => {
102
- expect($('.ons-featured__item-attribute span').text()).toContain('Bulletin');
103
- });
104
- });
105
-
106
- describe('WHEN: image is provided', () => {
74
+ describe('WHEN: metadata is provided', () => {
107
75
  const $ = cheerio.load(
108
- renderComponent('featured-article', {
109
- ...EXAMPLE_FEATURED_ARTICLE_WITH_IMAGE,
110
- metadata: {
111
- date: {
112
- prefix: 'Released',
113
- showPrefix: true,
114
- iso: '2024-05-01',
115
- short: '1 May 2024',
76
+ renderComponent(
77
+ 'featured-article',
78
+ {
79
+ ...EXAMPLE_FEATURED_ARTICLE_PARAMS,
80
+ metadata: {
81
+ date: {
82
+ prefix: 'Released',
83
+ showPrefix: true,
84
+ iso: '2024-05-01',
85
+ short: '1 May 2024',
86
+ },
87
+ text: 'Bulletin',
116
88
  },
117
- text: 'Bulletin',
118
89
  },
119
- }),
90
+ EXAMPLE_CHART_CALLER_CONTENT,
91
+ ),
120
92
  );
121
93
 
122
94
  test('THEN: it renders ISO date value correctly', () => {
@@ -133,10 +105,7 @@ describe('Macro: Featured Article', () => {
133
105
  });
134
106
 
135
107
  describe('WHEN: metadata is not provided', () => {
136
- const articleWithoutMetadata = {
137
- ...EXAMPLE_FEATURED_ARTICLE_WITH_CHART,
138
- };
139
- const $ = cheerio.load(renderComponent('featured-article', articleWithoutMetadata));
108
+ const $ = cheerio.load(renderComponent('featured-article', EXAMPLE_FEATURED_ARTICLE_PARAMS, EXAMPLE_CHART_CALLER_CONTENT));
140
109
 
141
110
  test('THEN: metadata section is not rendered', () => {
142
111
  expect($('.ons-featured__item-metadata').length).toBe(0);
@@ -148,7 +117,11 @@ describe('Macro: Featured Article', () => {
148
117
  describe('WHEN: description is provided', () => {
149
118
  test('THEN: has expected description', () => {
150
119
  const $ = cheerio.load(
151
- renderComponent('featured-article', { ...EXAMPLE_FEATURED_ARTICLE_WITH_CHART, description: 'Some description' }),
120
+ renderComponent(
121
+ 'featured-article',
122
+ { ...EXAMPLE_FEATURED_ARTICLE_PARAMS, description: 'Some description' },
123
+ EXAMPLE_CHART_CALLER_CONTENT,
124
+ ),
152
125
  );
153
126
  const title = $('.ons-featured__description').html().trim();
154
127
  expect(title).toBe('Some description');
@@ -159,10 +132,14 @@ describe('Macro: Featured Article', () => {
159
132
  describe('GIVEN: Param: headingLevel', () => {
160
133
  describe('WHEN: heading level is provided', () => {
161
134
  const $ = cheerio.load(
162
- renderComponent('featured-article', {
163
- ...EXAMPLE_FEATURED_ARTICLE_WITH_CHART,
164
- headingLevel: 3,
165
- }),
135
+ renderComponent(
136
+ 'featured-article',
137
+ {
138
+ ...EXAMPLE_FEATURED_ARTICLE_PARAMS,
139
+ headingLevel: 3,
140
+ },
141
+ EXAMPLE_CHART_CALLER_CONTENT,
142
+ ),
166
143
  );
167
144
 
168
145
  test('THEN: title is rendered using correct heading tag', () => {
@@ -0,0 +1,31 @@
1
+ .ons-figure {
2
+ margin: 0;
3
+
4
+ &__number {
5
+ color: var(--ons-color-text-light);
6
+ font-size: 1.125rem;
7
+ font-weight: $font-weight-bold;
8
+ line-height: 1.3;
9
+ }
10
+
11
+ &__title {
12
+ font-size: 1.25rem;
13
+ line-height: 1.6;
14
+ font-weight: $font-weight-bold;
15
+ margin-bottom: 0.5rem;
16
+ }
17
+
18
+ &__subtitle {
19
+ font-size: 1.125rem;
20
+ line-height: 1.6;
21
+ font-weight: $font-weight-regular;
22
+ }
23
+
24
+ &__caption {
25
+ color: var(--ons-color-text-light);
26
+ font-size: 0.875rem;
27
+ line-height: 1.7;
28
+ display: block;
29
+ margin-bottom: 1.5rem;
30
+ }
31
+ }
@@ -0,0 +1,98 @@
1
+ {% from "components/list/_macro.njk" import onsList %}
2
+ {% from "components/details/_macro.njk" import onsDetails %}
3
+
4
+ {% macro onsFigure(params) %}
5
+ {# The heading levels are configurable so the figure slots into the correct place in the
6
+ document outline, but the title and subtitle always render at the same visual size
7
+ via the utility font-size classes below. #}
8
+ {% set headingLevel = params.headingLevel | default(2, true) %}
9
+ {% set openingTitleTag = '<h' ~ headingLevel ~ ' class="ons-figure__title">' %}
10
+ {% set closingTitleTag = "</h" ~ headingLevel ~ ">" %}
11
+ {% set openingSubtitleTag = '<h' ~ (headingLevel + 1) ~ ' class="ons-figure__subtitle">' %}
12
+ {% set closingSubtitleTag = "</h" ~ (headingLevel + 1) ~ ">" %}
13
+ {% if params.title and params.subtitle %}
14
+ {% set childHeadingLevel = headingLevel + 2 %}
15
+ {% elif params.title %}
16
+ {% set childHeadingLevel = headingLevel + 1 %}
17
+ {% else %}
18
+ {% set childHeadingLevel = headingLevel %}
19
+ {% endif %}
20
+ {% set audioDescriptionId = "figure-audio-description-" ~ params.id %}
21
+ {% set rootElement = 'div' if params.useDivForRootElement else 'figure' %}
22
+ {% set openingRootTag = '<' ~ rootElement %}
23
+ {% if params.audioDescription %}
24
+ {% set openingRootTag = openingRootTag ~ ' aria-describedby="' ~ audioDescriptionId ~ '"' %}
25
+ {% endif %}
26
+ {% set openingRootTag = openingRootTag ~ ' class="ons-figure' ~ (' ' ~ params.classes if params.classes else '') ~ '"' %}
27
+ {% if params.id %}
28
+ {% set openingRootTag = openingRootTag ~ ' id="' ~ params.id ~ '"' %}
29
+ {% endif %}
30
+ {% set openingRootTag = openingRootTag ~ '>' %}
31
+ {% set closingRootTag = '</' ~ rootElement ~ '>' %}
32
+ {% set contentHasTopMargin = true if params.figureNumber or params.title or params.subtitle else false %}
33
+ {% set contentHasBottomMargin = true if params.caption or params.footnotes or params.download else false %}
34
+
35
+ {{ openingRootTag | safe }}
36
+ {% if params.figureNumber %}
37
+ <span class="ons-figure__number">{{ params.figureNumber }}</span>
38
+ {% endif %}
39
+ {% if params.title %}
40
+ {{ openingTitleTag | safe }}{{ params.title }}{{ closingTitleTag | safe }}
41
+ {% endif %}
42
+ {% if params.subtitle and params.title %}
43
+ {{ openingSubtitleTag | safe }}{{ params.subtitle }}{{ closingSubtitleTag | safe }}
44
+ {% endif %}
45
+
46
+ {# A visually-hidden description of the nested content for screen reader users. #}
47
+ {% if params.audioDescription %}
48
+ <p class="ons-u-vh" id="{{ audioDescriptionId }}">{{ params.audioDescription }}</p>
49
+ {% endif %}
50
+
51
+ <div
52
+ class="
53
+ ons-figure__content
54
+ {% if contentHasTopMargin %}ons-u-mt-l{% endif %}
55
+ {% if contentHasBottomMargin %}ons-u-mb-l{% endif %}
56
+ "
57
+ >
58
+ {# The nested content appears here #}
59
+ {{ caller() if caller else '' }}
60
+ </div>
61
+
62
+ {% if params.caption %}
63
+ {% if rootElement == 'figure' %}
64
+ <figcaption class="ons-figure__caption">{{ params.caption }}</figcaption>
65
+ {% else %}
66
+ <span class="ons-figure__caption">{{ params.caption }}</span>
67
+ {% endif %}
68
+ {% endif %}
69
+ {{ closingRootTag | safe }}
70
+
71
+ {% if params.footnotes %}
72
+ {% set footnotesId = ["figure-footnotes--", params.id] | join %}
73
+ {{
74
+ onsDetails({
75
+ "id": footnotesId,
76
+ "title": params.footnotes.title,
77
+ "content": params.footnotes.content,
78
+ "headingLevel": childHeadingLevel,
79
+ "classes": "ons-u-mb-l"
80
+ })
81
+ }}
82
+ {% endif %}
83
+
84
+ {% if params.download.title and params.download.itemsList | length > 0 %}
85
+ {% set downloadsId = ["figure-downloads--", params.id] | join %}
86
+ {{
87
+ onsDetails({
88
+ "id": downloadsId,
89
+ "title": params.download.title,
90
+ "content": onsList({
91
+ "itemsList": params.download.itemsList,
92
+ "variants": "bare"
93
+ }),
94
+ "headingLevel": childHeadingLevel
95
+ })
96
+ }}
97
+ {% endif %}
98
+ {% endmacro %}