@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
@@ -4,170 +4,165 @@ layout: ~
4
4
  ---
5
5
 
6
6
  {% from "components/hero/_macro.njk" import onsHero %}
7
- {% from "components/breadcrumbs/_macro.njk" import onsBreadcrumbs %}
8
7
  {% extends "layout/_template.njk" %}
9
8
  {%
10
9
  set pageConfig = {
11
10
  "header": {
12
11
  "variants": 'basic',
13
12
  "menuLinks": {
14
- "id": "menu-links",
15
- "keyLinks": [
16
- {
17
- 'heading': 'Taking part in a survey?',
18
- 'description': 'It’s never been more important.'
19
- },
20
- {
21
- 'heading': 'Release calendar',
22
- 'description': 'View our latest and upcoming releases.'
23
- },
24
- {
25
- 'heading': 'Explore local statistics',
26
- 'url': '#0',
27
- 'description': 'Explore statistics across the UK.'
28
- }
29
- ],
30
- "columns": [
31
- {
32
- "groups": [
33
- {
34
- "heading": "People, population and community",
35
- "groupItems": [
36
- {
37
- "text": "Armed forces community"
38
- },
39
- {
40
- "text": "Births, deaths and marriages"
41
- },
42
- {
43
- "text": "Crime and justice"
44
- },
45
- {
46
- "text": "Cultural identity"
47
- },
48
- {
49
- "text": "Education and childcare"
50
- },
51
- {
52
- "text": "Elections"
53
- },
54
- {
55
- "text": "Health and social care"
56
- },
57
- {
58
- "text": "Household characteristics"
59
- },
60
- {
61
- "text": "Housing"
62
- },
63
- {
64
- "text": "Leisure and tourism"
65
- },
66
- {
67
- "text": "Personal and household finances"
68
- },
69
- {
70
- "text": "Population and migration"
71
- },
72
- {
73
- "text": "Well-being"
74
- }
75
- ]
76
- }
77
- ]
78
- },
79
- {
80
- "groups": [
81
- {
82
- "heading": "Business, industry and trade",
83
- "groupItems": [
84
- {
85
- "text": "Business"
86
- },
87
- {
88
- "text": "Changes to business"
89
- },
90
- {
91
- "text": "Construction industry"
92
- },
93
- {
94
- "text": "International trade"
95
- },
96
- {
97
- "text": "IT and internet industry"
98
- },
99
- {
100
- "text": "Manufacturing and production industry"
101
- },
102
- {
103
- "text": "Retail industry",
104
- "url": "#0"
105
- },
106
- {
107
- "text": "Tourism industry"
108
- }
109
- ]
110
- },
111
- {
112
- "heading": "Employment and labour market",
113
- "url": "#0",
114
- "groupItems":
115
- [
116
- {
117
- "text": "People in work"
118
- },
119
- {
120
- "text": "People not in work"
121
- }
122
- ]
13
+ "id": "menu-links",
14
+ "keyLinks": [
15
+ {
16
+ 'heading': 'Taking part in a survey?',
17
+ 'description': 'It’s never been more important.'
18
+ },
19
+ {
20
+ 'heading': 'Release calendar',
21
+ 'description': 'View our latest and upcoming releases.'
22
+ },
23
+ {
24
+ 'heading': 'Explore local statistics',
25
+ 'url': '#0',
26
+ 'description': 'Explore statistics across the UK.'
27
+ }
28
+ ],
29
+ "columns": [
30
+ {
31
+ "groups": [
32
+ {
33
+ "heading": "People, population and community",
34
+ "groupItems": [
35
+ {
36
+ "text": "Armed forces community"
37
+ },
38
+ {
39
+ "text": "Births, deaths and marriages"
40
+ },
41
+ {
42
+ "text": "Crime and justice"
43
+ },
44
+ {
45
+ "text": "Cultural identity"
46
+ },
47
+ {
48
+ "text": "Education and childcare"
49
+ },
50
+ {
51
+ "text": "Elections"
52
+ },
53
+ {
54
+ "text": "Health and social care"
55
+ },
56
+ {
57
+ "text": "Household characteristics"
58
+ },
59
+ {
60
+ "text": "Housing"
61
+ },
62
+ {
63
+ "text": "Leisure and tourism"
64
+ },
65
+ {
66
+ "text": "Personal and household finances"
67
+ },
68
+ {
69
+ "text": "Population and migration"
70
+ },
71
+ {
72
+ "text": "Well-being"
73
+ }
74
+ ]
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "groups": [
80
+ {
81
+ "heading": "Business, industry and trade",
82
+ "groupItems": [
83
+ {
84
+ "text": "Business"
85
+ },
86
+ {
87
+ "text": "Changes to business"
88
+ },
89
+ {
90
+ "text": "Construction industry"
91
+ },
92
+ {
93
+ "text": "International trade"
94
+ },
95
+ {
96
+ "text": "IT and internet industry"
97
+ },
98
+ {
99
+ "text": "Manufacturing and production industry"
100
+ },
101
+ {
102
+ "text": "Retail industry",
103
+ "url": "#0"
104
+ },
105
+ {
106
+ "text": "Tourism industry"
107
+ }
108
+ ]
109
+ },
110
+ {
111
+ "heading": "Employment and labour market",
112
+ "url": "#0",
113
+ "groupItems":
114
+ [
115
+ {
116
+ "text": "People in work"
117
+ },
118
+ {
119
+ "text": "People not in work"
120
+ }
121
+ ]
123
122
 
124
- }
125
- ]
126
- },
127
- {
128
- "groups": [
129
- {
130
- "heading": "Economy",
131
- "groupItems": [
132
- {
133
- "text": "Economic output and productivity"
134
- },
135
- {
136
- "text": "Government, public sector and taxes"
137
- },
138
- {
139
- "text": "Gross Value Added (GVA)"
140
- },
141
- {
142
- "text": "Investments, pensions and trusts"
143
- },
144
- {
145
- "text": "Regional accounts"
146
- },
147
- {
148
- "text": "Environmental accounts"
149
- },
150
- {
151
- "text": "Gross Domestic Product (GDP)"
152
- },
153
- {
154
- "text": "Inflation and price indices"
155
- },
156
- {
157
- "text": "National accounts"
158
- }
159
- ]
160
- }
161
- ]
162
- }
163
- ]
164
- }
165
- }
166
- }
167
- %}
168
- {% block pageContent %}
169
- {{
170
- onsBreadcrumbs({
123
+ }
124
+ ]
125
+ },
126
+ {
127
+ "groups": [
128
+ {
129
+ "heading": "Economy",
130
+ "groupItems": [
131
+ {
132
+ "text": "Economic output and productivity"
133
+ },
134
+ {
135
+ "text": "Government, public sector and taxes"
136
+ },
137
+ {
138
+ "text": "Gross Value Added (GVA)"
139
+ },
140
+ {
141
+ "text": "Investments, pensions and trusts"
142
+ },
143
+ {
144
+ "text": "Regional accounts"
145
+ },
146
+ {
147
+ "text": "Environmental accounts"
148
+ },
149
+ {
150
+ "text": "Gross Domestic Product (GDP)"
151
+ },
152
+ {
153
+ "text": "Inflation and price indices"
154
+ },
155
+ {
156
+ "text": "National accounts"
157
+ }
158
+ ]
159
+ }
160
+ ]
161
+ }
162
+ ]
163
+ }
164
+ },
165
+ breadcrumbs: {
171
166
  "ariaLabel": 'Breadcrumbs',
172
167
  "variant": "pale-blue",
173
168
  "itemsList": [
@@ -184,18 +179,19 @@ layout: ~
184
179
  "text": 'Retail industry'
185
180
  }
186
181
  ]
182
+ }
183
+ }
184
+ %}
185
+
186
+ {% block hero %}
187
+ {{
188
+ onsHero({
189
+ "topic": 'Topic',
190
+ "title": 'Retail Industry',
191
+ "text": 'Sales by retailers in Great Britain directly to end consumers, including spending on goods (in store and online)
192
+ (Retail Sales Index) and spending on services (Index of Services). The industry as a whole is used as an indicator
193
+ of how the wider economy is performing and the strength of consumer spending.',
194
+ "variants": 'pale-blue'
187
195
  })
188
196
  }}
189
- <main id="main-content">
190
- {{
191
- onsHero({
192
- "topic": 'Topic',
193
- "title": 'Retail Industry',
194
- "text": 'Sales by retailers in Great Britain directly to end consumers, including spending on goods (in store and online)
195
- (Retail Sales Index) and spending on services (Index of Services). The industry as a whole is used as an indicator
196
- of how the wider economy is performing and the strength of consumer spending.',
197
- "variants": 'pale-blue'
198
- })
199
- }}
200
- </main>
201
197
  {% endblock %}
@@ -7,11 +7,4 @@
7
7
  display: block;
8
8
  max-width: 100%;
9
9
  }
10
-
11
- &__caption {
12
- @extend .ons-u-fs-s;
13
-
14
- display: block;
15
- padding: 0.5rem 0 0;
16
- }
17
10
  }
@@ -1,17 +1,28 @@
1
1
  {%- macro onsImage(params) -%}
2
- <figure class="ons-image">
3
- {% if params.image %}
4
- <img
5
- class="ons-image__img"
6
- {% if params.image.largeSrc %}srcset="{{ params.image.smallSrc }} 1x, {{ params.image.largeSrc }} 2x"{% endif %}src="{{ params.image.smallSrc }}"
7
- alt="{{ params.alt if params.alt }}"
8
- />
9
- {% else %}
10
- <img class="ons-image__img" src="{{ params.src }}" alt="{{ params.alt }}" />
11
- {% endif %}
2
+ {% from "components/figure/_macro.njk" import onsFigure %}
12
3
 
13
- {% if params.caption %}
14
- <figcaption class="ons-image__caption">{{ params.caption }}</figcaption>
15
- {% endif %}
16
- </figure>
4
+ {%
5
+ call onsFigure({
6
+ "id": params.id,
7
+ "headingLevel": params.headingLevel,
8
+ "figureNumber": params.figureNumber,
9
+ "title": params.title,
10
+ "subtitle": params.subtitle,
11
+ "caption": params.caption,
12
+ "footnotes": params.footnotes,
13
+ "download": params.download
14
+ })
15
+ %}
16
+ <div class="ons-image">
17
+ {% if params.image %}
18
+ <img
19
+ class="ons-image__img"
20
+ {% if params.image.largeSrc %}srcset="{{ params.image.smallSrc }} 1x, {{ params.image.largeSrc }} 2x"{% endif %}src="{{ params.image.smallSrc }}"
21
+ alt="{{ params.alt if params.alt }}"
22
+ />
23
+ {% else %}
24
+ <img class="ons-image__img" src="{{ params.src }}" alt="{{ params.alt }}" />
25
+ {% endif %}
26
+ </div>
27
+ {% endcall %}
17
28
  {%- endmacro -%}
@@ -3,7 +3,7 @@
3
3
  import * as cheerio from 'cheerio';
4
4
 
5
5
  import axe from '../../tests/helpers/axe';
6
- import { renderComponent } from '../../tests/helpers/rendering';
6
+ import { renderComponent, templateFaker } from '../../tests/helpers/rendering';
7
7
 
8
8
  const EXAMPLE_IMAGE_SRC_URL_MINIMAL = {
9
9
  src: 'example.png',
@@ -17,13 +17,14 @@ const EXAMPLE_IMAGE_IMAGE_MINIMAL = {
17
17
  };
18
18
 
19
19
  describe('macro: image', () => {
20
- it('outputs a `figure` element', () => {
20
+ it('outputs a `figure` element wrapping the image', () => {
21
21
  const $ = cheerio.load(renderComponent('image', EXAMPLE_IMAGE_SRC_URL_MINIMAL));
22
22
 
23
- expect($('.ons-image')[0].tagName).toBe('figure');
23
+ expect($('.ons-figure')[0].tagName).toBe('figure');
24
+ expect($('.ons-figure .ons-image').length).toBe(1);
24
25
  });
25
26
 
26
- it('outputs a `figurecaption` element when `caption` is provided', () => {
27
+ it('outputs a `figcaption` element when `caption` is provided', () => {
27
28
  const $ = cheerio.load(
28
29
  renderComponent('image', {
29
30
  ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
@@ -31,10 +32,10 @@ describe('macro: image', () => {
31
32
  }),
32
33
  );
33
34
 
34
- expect($('.ons-image__caption')[0].tagName).toBe('figcaption');
35
+ expect($('.ons-figure__caption')[0].tagName).toBe('figcaption');
35
36
  });
36
37
 
37
- it('outputs a `figurecaption` element with provided `caption` text', () => {
38
+ it('outputs a `figcaption` element with provided `caption` text', () => {
38
39
  const $ = cheerio.load(
39
40
  renderComponent('image', {
40
41
  ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
@@ -42,7 +43,121 @@ describe('macro: image', () => {
42
43
  }),
43
44
  );
44
45
 
45
- expect($('.ons-image__caption').text().trim()).toBe('Example image caption');
46
+ expect($('.ons-figure__caption').text().trim()).toBe('Example image caption');
47
+ });
48
+
49
+ describe('figure params', () => {
50
+ it('passes `id` to the figure component', () => {
51
+ const faker = templateFaker();
52
+ const figureSpy = faker.spy('figure');
53
+
54
+ faker.renderComponent('image', {
55
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
56
+ id: 'my-image',
57
+ });
58
+
59
+ expect(figureSpy.occurrences[0].id).toBe('my-image');
60
+ });
61
+
62
+ it('passes `headingLevel` to the figure component', () => {
63
+ const faker = templateFaker();
64
+ const figureSpy = faker.spy('figure');
65
+
66
+ faker.renderComponent('image', {
67
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
68
+ headingLevel: 4,
69
+ });
70
+
71
+ expect(figureSpy.occurrences[0].headingLevel).toBe(4);
72
+ });
73
+
74
+ it('passes `figureNumber` to the figure component', () => {
75
+ const faker = templateFaker();
76
+ const figureSpy = faker.spy('figure');
77
+
78
+ faker.renderComponent('image', {
79
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
80
+ figureNumber: 'Image 1',
81
+ });
82
+
83
+ expect(figureSpy.occurrences[0].figureNumber).toBe('Image 1');
84
+ });
85
+
86
+ it('passes `title` to the figure component', () => {
87
+ const faker = templateFaker();
88
+ const figureSpy = faker.spy('figure');
89
+
90
+ faker.renderComponent('image', {
91
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
92
+ title: 'Image title',
93
+ });
94
+
95
+ expect(figureSpy.occurrences[0].title).toBe('Image title');
96
+ });
97
+
98
+ it('passes `subtitle` to the figure component', () => {
99
+ const faker = templateFaker();
100
+ const figureSpy = faker.spy('figure');
101
+
102
+ faker.renderComponent('image', {
103
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
104
+ subtitle: 'Image subtitle',
105
+ });
106
+
107
+ expect(figureSpy.occurrences[0].subtitle).toBe('Image subtitle');
108
+ });
109
+
110
+ it('passes `caption` to the figure component', () => {
111
+ const faker = templateFaker();
112
+ const figureSpy = faker.spy('figure');
113
+
114
+ faker.renderComponent('image', {
115
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
116
+ caption: 'A caption',
117
+ });
118
+
119
+ expect(figureSpy.occurrences[0].caption).toBe('A caption');
120
+ });
121
+
122
+ it('passes `footnotes` to the figure component', () => {
123
+ const faker = templateFaker();
124
+ const figureSpy = faker.spy('figure');
125
+
126
+ const footnotes = {
127
+ title: 'Footnotes',
128
+ content: 'Some notes about this image.',
129
+ };
130
+
131
+ faker.renderComponent('image', {
132
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
133
+ footnotes,
134
+ });
135
+
136
+ expect(figureSpy.occurrences[0].footnotes).toEqual(footnotes);
137
+ });
138
+
139
+ it('passes `download` to the figure component', () => {
140
+ const faker = templateFaker();
141
+ const figureSpy = faker.spy('figure');
142
+
143
+ const download = {
144
+ title: 'Download this image',
145
+ itemsList: [
146
+ {
147
+ text: 'High resolution image (JPG, 1.2MB)',
148
+ url: '/img/example.jpg',
149
+ download: 'file',
150
+ },
151
+ ],
152
+ };
153
+
154
+ faker.renderComponent('image', {
155
+ ...EXAMPLE_IMAGE_SRC_URL_MINIMAL,
156
+ download,
157
+ });
158
+
159
+ expect(figureSpy.occurrences[0].download).toEqual(download);
160
+ });
46
161
  });
47
162
 
48
163
  describe('mode: src', () => {
@@ -0,0 +1,25 @@
1
+ {% from "components/image/_macro.njk" import onsImage %}
2
+ {{
3
+ onsImage({
4
+ "id": "image-with-extra-fields",
5
+ "src": '/img/small/woman-in-purple-dress-shirt.jpg',
6
+ "alt": 'Woman in a purple dress shirt using a laptop',
7
+ "title": "Image 1: Working from home",
8
+ "subtitle": "A growing proportion of the workforce now works remotely",
9
+ "caption": "Image 1 - Woman in a purple dress shirt using a laptop",
10
+ "footnotes": {
11
+ "title": "Footnotes",
12
+ "content": "Image is for illustrative purposes only."
13
+ },
14
+ "download": {
15
+ "title": "Download this image",
16
+ "itemsList": [
17
+ {
18
+ "text": "High resolution image (JPG format, 1.2MB)",
19
+ "url": "/img/small/woman-in-purple-dress-shirt.jpg",
20
+ "download": "file"
21
+ }
22
+ ]
23
+ }
24
+ })
25
+ }}
@@ -79,6 +79,7 @@
79
79
  href="{{ item.url }}"
80
80
  class="ons-list__link{{ ' ons-js-inpagelink' if item.variants == 'inPageLink' }}{{ ' ' + item.classes if item.classes else '' }}"
81
81
  {% if item.target %}target="{{ item.target }}"{% endif %}
82
+ {% if item.download %}download="{{ item.download}}"{% endif %}
82
83
  >
83
84
  {%- if item.prefix -%}<span class="ons-u-vh">{{- item.prefix -}}</span>{%- endif -%} {{- itemText | safe -}}
84
85
  {%- if item.target == "_blank" -%}
@@ -376,6 +376,22 @@ describe('macro: list', () => {
376
376
  expect($('.ons-list__link').hasClass('another-extra-class')).toBe(true);
377
377
  });
378
378
 
379
+ it('has the provided `download` attribute', () => {
380
+ const $ = cheerio.load(
381
+ renderComponent('list', {
382
+ itemsList: [
383
+ {
384
+ ...item,
385
+ url: '/example.csv',
386
+ download: 'file',
387
+ },
388
+ ],
389
+ }),
390
+ );
391
+
392
+ expect($('.ons-list__link').attr('download')).toBe('file');
393
+ });
394
+
379
395
  it('has the provided `target` attribute', () => {
380
396
  const $ = cheerio.load(
381
397
  renderComponent('list', {
@@ -23,7 +23,7 @@ layout: ~
23
23
  }
24
24
  %}
25
25
 
26
- {% block main %}
26
+ {% block mainContent %}
27
27
  {%
28
28
  call onsQuestion({
29
29
  "title": "How many visitors do you have staying overnight at 3 Severn Road on Sunday 21 March 2021?",
@@ -24,7 +24,7 @@ layout: ~
24
24
  %}
25
25
  {% set questionTitle = "On 1 May 2016, what was the number of employees for Bolt and Ratchet?" %}
26
26
 
27
- {% block main %}
27
+ {% block mainContent %}
28
28
  {%
29
29
  call onsQuestion({
30
30
  "title": questionTitle,