@ons/design-system 72.4.0 → 72.6.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.
- package/components/button/_button.scss +171 -3
- package/components/button/_macro.njk +4 -0
- package/components/card/_card.scss +5 -0
- package/components/card/_macro.njk +10 -2
- package/components/card/_macro.spec.js +58 -0
- package/components/card/example-card-set-with-headline-figures.njk +62 -0
- package/components/chart/_chart.scss +80 -0
- package/components/chart/_macro.njk +125 -0
- package/components/chart/_macro.spec.js +825 -0
- package/components/chart/annotations-options.js +78 -0
- package/components/chart/bar-chart.js +164 -0
- package/components/chart/chart-constants.js +21 -0
- package/components/chart/chart.dom.js +8 -0
- package/components/chart/chart.js +242 -0
- package/components/chart/column-chart.js +48 -0
- package/components/chart/common-chart-options.js +247 -0
- package/components/chart/example-bar-chart-with-annotations.njk +62 -0
- package/components/chart/example-bar-chart.njk +55 -0
- package/components/chart/example-bar-with-line-chart.njk +64 -0
- package/components/chart/example-clustered-bar-chart.njk +60 -0
- package/components/chart/example-clustered-column-chart.njk +74 -0
- package/components/chart/example-column-chart-with-annotations.njk +62 -0
- package/components/chart/example-column-chart.njk +54 -0
- package/components/chart/example-column-with-line-chart.njk +62 -0
- package/components/chart/example-line-chart-with-annotations.njk +235 -0
- package/components/chart/example-line-chart.njk +221 -0
- package/components/chart/example-stacked-bar-chart.njk +60 -0
- package/components/chart/example-stacked-column-chart.njk +67 -0
- package/components/chart/line-chart.js +42 -0
- package/components/chart/specific-chart-options.js +22 -0
- package/components/footer/_footer.scss +12 -0
- package/components/footer/_macro.njk +38 -17
- package/components/header/_header.scss +18 -2
- package/components/header/_macro.njk +81 -8
- package/components/header/_macro.spec.js +97 -0
- package/components/header/example-header-with-search-button.njk +190 -0
- package/components/header/header.spec.js +128 -0
- package/components/hero/_hero.scss +39 -7
- package/components/hero/_macro.njk +47 -17
- package/components/hero/_macro.spec.js +94 -0
- package/components/hero/example-hero-grey.njk +9 -0
- package/components/icon/_macro.njk +8 -8
- package/components/input/_input.scss +15 -0
- package/components/input/_macro.njk +3 -3
- package/components/navigation/navigation.dom.js +17 -0
- package/components/navigation/navigation.js +72 -2
- package/components/pagination/_pagination.scss +7 -1
- package/components/summary/_macro.njk +1 -1
- package/components/summary/_macro.spec.js +6 -0
- package/components/table-of-contents/_macro.njk +40 -0
- package/components/table-of-contents/_macro.spec.js +72 -0
- package/components/table-of-contents/_table-of-contents.scss +11 -0
- package/components/table-of-contents/example-table-of-contents-related-links-with-button.njk +60 -0
- package/css/main.css +1 -1
- package/js/cookies-functions.js +11 -6
- package/js/cookies-functions.spec.js +44 -0
- package/js/main.js +2 -0
- package/package.json +4 -1
- package/scripts/main.es5.js +1 -1
- package/scripts/main.js +1 -1
- package/scss/main.scss +1 -0
- package/scss/utilities/_grid.scss +13 -4
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class LineChart {
|
|
2
|
+
getLineChartOptions = () => {
|
|
3
|
+
return {
|
|
4
|
+
plotOptions: {
|
|
5
|
+
line: {
|
|
6
|
+
lineWidth: 3,
|
|
7
|
+
linecap: 'round',
|
|
8
|
+
// In a later PR we will update the marker styles
|
|
9
|
+
marker: {
|
|
10
|
+
enabled: false,
|
|
11
|
+
radius: 4,
|
|
12
|
+
symbol: 'circle',
|
|
13
|
+
lineWidth: 0,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
updateLastPointMarker = (series) => {
|
|
21
|
+
series.forEach((series) => {
|
|
22
|
+
// If markers are disabled, hide them all but the last point marker
|
|
23
|
+
if (series.options.marker.enabled.enabled === undefined) {
|
|
24
|
+
const points = series.points;
|
|
25
|
+
if (points && points.length > 0) {
|
|
26
|
+
// Show only the last point marker
|
|
27
|
+
const lastPoint = points[points.length - 1];
|
|
28
|
+
lastPoint.update(
|
|
29
|
+
{
|
|
30
|
+
marker: {
|
|
31
|
+
enabled: true,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
false,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default LineChart;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import ChartConstants from './chart-constants';
|
|
2
|
+
|
|
3
|
+
// Options that rely on the chart config but are not specific to the chart type
|
|
4
|
+
class SpecificChartOptions {
|
|
5
|
+
constructor(theme, type, config) {
|
|
6
|
+
this.constants = ChartConstants.constants();
|
|
7
|
+
this.theme = theme;
|
|
8
|
+
this.config = config;
|
|
9
|
+
|
|
10
|
+
this.options = {
|
|
11
|
+
colors: this.theme === 'alternate' ? this.constants.alternateTheme : this.constants.primaryTheme,
|
|
12
|
+
chart: {
|
|
13
|
+
type: type,
|
|
14
|
+
marginTop: this.config.legend.enabled ? undefined : 50,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
getOptions = () => this.options;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default SpecificChartOptions;
|
|
@@ -9,23 +9,44 @@
|
|
|
9
9
|
{% endif %}
|
|
10
10
|
{% set extraLogo = params.footerLogo.logos.logo2 %}
|
|
11
11
|
{% set onsLogo %}
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
{
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
12
|
+
<div class="ons-footer__logo-large">
|
|
13
|
+
{% if params.lang == 'cy' %}
|
|
14
|
+
{{-
|
|
15
|
+
onsIcon({
|
|
16
|
+
"iconType": 'ons-logo-stacked-cy' if extraLogo else 'ons-logo-cy',
|
|
17
|
+
"altText": 'Swyddfa Ystadegau Gwladol',
|
|
18
|
+
"altTextId": 'ons-logo-cy-footer-alt'
|
|
19
|
+
})
|
|
20
|
+
-}}
|
|
21
|
+
{% else %}
|
|
22
|
+
{{-
|
|
23
|
+
onsIcon({
|
|
24
|
+
"iconType": 'ons-logo-stacked-en' if extraLogo else 'ons-logo-en',
|
|
25
|
+
"altText": 'Office for National Statistics',
|
|
26
|
+
"altTextId": 'ons-logo-en-footer-alt'
|
|
27
|
+
})
|
|
28
|
+
-}}
|
|
29
|
+
{% endif %}
|
|
30
|
+
</div>
|
|
31
|
+
<div class="ons-footer__logo-small">
|
|
32
|
+
{% if params.lang == 'cy' %}
|
|
33
|
+
{{-
|
|
34
|
+
onsIcon({
|
|
35
|
+
"iconType": 'ons-logo-stacked-cy',
|
|
36
|
+
"altText": 'Swyddfa Ystadegau Gwladol',
|
|
37
|
+
"altTextId": 'ons-logo-stacked-cy-footer-alt'
|
|
38
|
+
})
|
|
39
|
+
-}}
|
|
40
|
+
{% else %}
|
|
41
|
+
{{-
|
|
42
|
+
onsIcon({
|
|
43
|
+
"iconType": 'ons-logo-stacked-en',
|
|
44
|
+
"altText": 'Office for National Statistics',
|
|
45
|
+
"altTextId": 'ons-logo-stacked-en-footer-alt'
|
|
46
|
+
})
|
|
47
|
+
-}}
|
|
48
|
+
{% endif %}
|
|
49
|
+
</div>
|
|
29
50
|
{% endset %}
|
|
30
51
|
|
|
31
52
|
<footer class="ons-footer">
|
|
@@ -168,13 +168,13 @@
|
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
&__org-logo--large {
|
|
171
|
-
@include mq('2xs',
|
|
171
|
+
@include mq('2xs', 460px) {
|
|
172
172
|
display: none;
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
&__org-logo--small {
|
|
177
|
-
@include mq(
|
|
177
|
+
@include mq(461px) {
|
|
178
178
|
display: none;
|
|
179
179
|
}
|
|
180
180
|
}
|
|
@@ -278,6 +278,22 @@
|
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
|
|
281
|
+
&-nav-search {
|
|
282
|
+
background-color: var(--ons-color-branded-tint);
|
|
283
|
+
margin-bottom: 1rem;
|
|
284
|
+
@extend .ons-u-pt-2xl;
|
|
285
|
+
@extend .ons-u-pb-2xl;
|
|
286
|
+
|
|
287
|
+
width: 100%;
|
|
288
|
+
&__input {
|
|
289
|
+
border-bottom: 1px solid var(--ons-color-ocean-blue);
|
|
290
|
+
@extend .ons-u-mb-2xl;
|
|
291
|
+
@extend .ons-u-pb-2xl;
|
|
292
|
+
|
|
293
|
+
row-gap: 1rem;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
281
297
|
.ons-btn {
|
|
282
298
|
top: 0 !important;
|
|
283
299
|
}
|
|
@@ -180,20 +180,21 @@
|
|
|
180
180
|
{% endif %}
|
|
181
181
|
</div>
|
|
182
182
|
{% endif %}
|
|
183
|
-
|
|
184
|
-
|
|
183
|
+
|
|
184
|
+
{% if params.variants == "basic" %}
|
|
185
|
+
<div class="ons-grid__col ons-col-auto">
|
|
185
186
|
{% if params.menuLinks %}
|
|
186
|
-
<div class="ons-
|
|
187
|
+
<div class="ons-header__links ons-grid__col">
|
|
187
188
|
{{
|
|
188
189
|
onsButton({
|
|
189
|
-
"text": params.menuLinks.
|
|
190
|
-
"classes": "ons-u-fs-s--b ons-js-toggle-
|
|
190
|
+
"text": params.menuLinks.toggleMenuButton.text | default("Menu"),
|
|
191
|
+
"classes": "ons-u-fs-s--b ons-js-toggle-nav-menu button-nav",
|
|
191
192
|
"type": "button",
|
|
192
193
|
"variants": "menu",
|
|
193
194
|
"iconType": "chevron",
|
|
194
195
|
"iconPosition": "before",
|
|
195
196
|
"attributes": {
|
|
196
|
-
"aria-label": params.menuLinks.
|
|
197
|
+
"aria-label": params.menuLinks.toggleMenuButton.ariaLabel | default("Toggle menu"),
|
|
197
198
|
"aria-controls": params.menuLinks.id,
|
|
198
199
|
"aria-expanded": "false"
|
|
199
200
|
}
|
|
@@ -201,6 +202,23 @@
|
|
|
201
202
|
}}
|
|
202
203
|
</div>
|
|
203
204
|
{% endif %}
|
|
205
|
+
{% if params.searchLinks %}
|
|
206
|
+
<div class="ons-header__links ons-grid__col">
|
|
207
|
+
{{
|
|
208
|
+
onsButton({
|
|
209
|
+
"classes": "ons-u-fs-s--b ons-js-toggle-header-search ons-btn--search ons-btn--search-icon",
|
|
210
|
+
"type": "button",
|
|
211
|
+
"variants": "search",
|
|
212
|
+
"iconType": "search",
|
|
213
|
+
"attributes": {
|
|
214
|
+
"aria-label": params.searchLinks.searchButtonAriaLabel | default("Toggle search"),
|
|
215
|
+
"aria-controls": params.searchLinks.id,
|
|
216
|
+
"aria-expanded": "false"
|
|
217
|
+
}
|
|
218
|
+
})
|
|
219
|
+
}}
|
|
220
|
+
</div>
|
|
221
|
+
{% endif %}
|
|
204
222
|
</div>
|
|
205
223
|
{% endif %}
|
|
206
224
|
</div>
|
|
@@ -240,9 +258,10 @@
|
|
|
240
258
|
{% endif %}
|
|
241
259
|
</nav>
|
|
242
260
|
{% endif %}
|
|
243
|
-
|
|
261
|
+
|
|
262
|
+
{% if params.variants == "basic" and params.menuLinks %}
|
|
244
263
|
<nav
|
|
245
|
-
class="ons-u-d-no ons-js-
|
|
264
|
+
class="ons-u-d-no ons-js-nav-menu ons-header-nav-menu ons-u-mb-s ons-u-pt-2xl"
|
|
246
265
|
id="{{ params.menuLinks.id }}"
|
|
247
266
|
aria-label="{{ params.menuLinks.ariaLabel | default("Menu navigation") }}"
|
|
248
267
|
>
|
|
@@ -312,6 +331,60 @@
|
|
|
312
331
|
{% endif %}
|
|
313
332
|
</nav>
|
|
314
333
|
{% endif %}
|
|
334
|
+
|
|
335
|
+
{% if params.variants == "basic" and params.searchLinks %}
|
|
336
|
+
<nav
|
|
337
|
+
class="ons-u-d-no ons-js-header-search ons-header-nav-search {{ params.searchLinks.classes }}"
|
|
338
|
+
id="{{ params.searchLinks.id }}"
|
|
339
|
+
aria-label="{{ params.searchLinks.searchNavigationAriaLabel | default('Search navigation') }}"
|
|
340
|
+
>
|
|
341
|
+
<div class="ons-container">
|
|
342
|
+
<div class="ons-header-nav-search__input">
|
|
343
|
+
{% from "components/input/_macro.njk" import onsInput %}
|
|
344
|
+
{{
|
|
345
|
+
onsInput({
|
|
346
|
+
"id": 'search-field',
|
|
347
|
+
"width": 'full',
|
|
348
|
+
"label": {
|
|
349
|
+
"text": 'Search the ONS',
|
|
350
|
+
"id": "header-search-input-label"
|
|
351
|
+
},
|
|
352
|
+
"searchButton": {
|
|
353
|
+
"visuallyHideButtonText": true,
|
|
354
|
+
"text": 'Search',
|
|
355
|
+
"iconType": 'search',
|
|
356
|
+
'variant': 'header'
|
|
357
|
+
|
|
358
|
+
}
|
|
359
|
+
})
|
|
360
|
+
}}
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
{% if params.searchLinks %}
|
|
364
|
+
<div class="ons-container">
|
|
365
|
+
<h2 class="ons-u-fs-r--b ons-u-mb-s ons-header-nav-search__heading">{{ params.searchLinks.heading }}</h2>
|
|
366
|
+
<ul class="ons-list ons-list--bare ons-list--inline">
|
|
367
|
+
{% for item in params.searchLinks.itemsList %}
|
|
368
|
+
{# Limiting the popular searches to 5 #}
|
|
369
|
+
{% if loop.index <= 5 %}
|
|
370
|
+
<li class="ons-list__item">
|
|
371
|
+
{% if item.text %}
|
|
372
|
+
{% if item.url %}
|
|
373
|
+
<a href="{{ item.url }}" class="ons-u-fs-r ons-header-nav-search__text"
|
|
374
|
+
>{{ item.text }}
|
|
375
|
+
</a>
|
|
376
|
+
{% else %}
|
|
377
|
+
<p class="ons-u-fs-r ons-header-nav-search__text">{{ item.text }}</p>
|
|
378
|
+
{% endif %}
|
|
379
|
+
{% endif %}
|
|
380
|
+
</li>
|
|
381
|
+
{% endif %}
|
|
382
|
+
{% endfor %}
|
|
383
|
+
</ul>
|
|
384
|
+
</div>
|
|
385
|
+
{% endif %}
|
|
386
|
+
</nav>
|
|
387
|
+
{% endif %}
|
|
315
388
|
</div>
|
|
316
389
|
{% if params.variants != "basic" %}
|
|
317
390
|
<div class="ons-header__main">
|
|
@@ -9,6 +9,7 @@ import { mapAll } from '../../tests/helpers/cheerio';
|
|
|
9
9
|
import {
|
|
10
10
|
EXAMPLE_HEADER_BASIC,
|
|
11
11
|
EXAMPLE_SERVICE_LINKS_CONFIG,
|
|
12
|
+
EXAMPLE_HEADER_SEARCH_LINKS,
|
|
12
13
|
EXAMPLE_HEADER_SERVICE_LINKS_MULTIPLE,
|
|
13
14
|
EXAMPLE_HEADER_SERVICE_LINKS_SINGLE,
|
|
14
15
|
EXAMPLE_HEADER_LANGUAGE_CONFIG,
|
|
@@ -784,4 +785,100 @@ describe('FOR: Macro: Header', () => {
|
|
|
784
785
|
});
|
|
785
786
|
});
|
|
786
787
|
});
|
|
788
|
+
describe('GIVEN: Params: searchLinks', () => {
|
|
789
|
+
describe('WHEN: searchLinks are provided', () => {
|
|
790
|
+
const faker = templateFaker();
|
|
791
|
+
const buttonSpy = faker.spy('button', { suppressOutput: true });
|
|
792
|
+
faker.renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'basic' });
|
|
793
|
+
|
|
794
|
+
test('THEN: renders search icon button', () => {
|
|
795
|
+
expect(buttonSpy.occurrences[0]).toEqual({
|
|
796
|
+
iconType: 'search',
|
|
797
|
+
classes: 'ons-u-fs-s--b ons-js-toggle-header-search ons-btn--search ons-btn--search-icon',
|
|
798
|
+
type: 'button',
|
|
799
|
+
variants: 'search',
|
|
800
|
+
attributes: {
|
|
801
|
+
'aria-label': 'Example aria label',
|
|
802
|
+
'aria-expanded': 'false',
|
|
803
|
+
'aria-controls': 'search-links-id',
|
|
804
|
+
},
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
describe('WHEN: itemsList are provided in searchLinks', () => {
|
|
810
|
+
const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'basic' }));
|
|
811
|
+
|
|
812
|
+
test('THEN: renders items list', () => {
|
|
813
|
+
const itemsList = $('.ons-list--bare .ons-list__item').length;
|
|
814
|
+
expect(itemsList).toBeGreaterThan(0);
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
test('THEN: renders correct links for items list', () => {
|
|
818
|
+
const searchItemsLinks = mapAll($('.ons-list--bare .ons-list__item a'), (node) => node.attr('href'));
|
|
819
|
+
expect(searchItemsLinks).toEqual(['#1', '#2', '#3']);
|
|
820
|
+
});
|
|
821
|
+
|
|
822
|
+
test('THEN: renders correct text for items list', () => {
|
|
823
|
+
const searchItemsText = mapAll($('.ons-list--bare .ons-list__item a'), (node) => node.text().trim());
|
|
824
|
+
expect(searchItemsText).toEqual(['Popular Search 1', 'Popular Search 2', 'Popular Search 3']);
|
|
825
|
+
});
|
|
826
|
+
});
|
|
827
|
+
|
|
828
|
+
describe('WHEN: searchLinks parameter is missing', () => {
|
|
829
|
+
const $ = cheerio.load(renderComponent('header', EXAMPLE_HEADER_BASIC));
|
|
830
|
+
|
|
831
|
+
test('THEN: does not render search icon button', () => {
|
|
832
|
+
expect($('.ons-js-toggle-services').length).toBe(0);
|
|
833
|
+
});
|
|
834
|
+
|
|
835
|
+
test('THEN: does not render search input form', () => {
|
|
836
|
+
expect($('.ons-header-nav-search').length).toBe(0);
|
|
837
|
+
});
|
|
838
|
+
|
|
839
|
+
test('THEN: does not render items list', () => {
|
|
840
|
+
expect($('.ons-list--bare').length).toBe(0);
|
|
841
|
+
});
|
|
842
|
+
});
|
|
843
|
+
|
|
844
|
+
describe('WHEN: searchLinks are provided and the header variant is not basic', () => {
|
|
845
|
+
const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'neutral' }));
|
|
846
|
+
|
|
847
|
+
test('THEN: does not render the search icon button', () => {
|
|
848
|
+
expect($('.ons-js-toggle-services').length).toBe(0);
|
|
849
|
+
});
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
describe('WHEN: heading parameter is provided', () => {
|
|
853
|
+
const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'basic' }));
|
|
854
|
+
|
|
855
|
+
test('THEN: it renders heading with provided text', () => {
|
|
856
|
+
expect($('.ons-header-nav-search__heading').text()).toBe('Header Search');
|
|
857
|
+
});
|
|
858
|
+
});
|
|
859
|
+
|
|
860
|
+
describe('WHEN: id parameter is provided', () => {
|
|
861
|
+
const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'basic' }));
|
|
862
|
+
|
|
863
|
+
test('THEN: applies id to search links ', () => {
|
|
864
|
+
expect($('#search-links-id').length).toBe(1);
|
|
865
|
+
});
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
describe('WHEN: ariaLabel parameter is provided', () => {
|
|
869
|
+
const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'basic' }));
|
|
870
|
+
|
|
871
|
+
test('THEN: applies aria label to the search links', () => {
|
|
872
|
+
expect($('.ons-header-nav-search').attr('aria-label')).toBe('Header Search');
|
|
873
|
+
});
|
|
874
|
+
});
|
|
875
|
+
|
|
876
|
+
describe('WHEN: classes parameter is provided', () => {
|
|
877
|
+
const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH_LINKS, variants: 'basic' }));
|
|
878
|
+
|
|
879
|
+
test('THEN: it renders classes with provided value', () => {
|
|
880
|
+
expect($('.ons-header-nav-search').hasClass('custom-class')).toBe(true);
|
|
881
|
+
});
|
|
882
|
+
});
|
|
883
|
+
});
|
|
787
884
|
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
'fullWidth': true
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
{% from "components/header/_macro.njk" import onsHeader %}
|
|
6
|
+
|
|
7
|
+
{{
|
|
8
|
+
onsHeader({
|
|
9
|
+
"variants": 'basic',
|
|
10
|
+
"menuLinks": {
|
|
11
|
+
"keyLinks": [
|
|
12
|
+
{
|
|
13
|
+
'heading': 'Taking part in a survey?',
|
|
14
|
+
'description': 'It’s never been more important.'
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
'heading': 'Release calendar',
|
|
18
|
+
'description': 'View our latest and upcoming releases.'
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
'heading': 'Explore local statistics',
|
|
22
|
+
'url': '#0',
|
|
23
|
+
'description': 'Explore statistics across the UK.'
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"columns": [
|
|
27
|
+
{
|
|
28
|
+
"groups": [
|
|
29
|
+
{
|
|
30
|
+
"heading": "People, population and community",
|
|
31
|
+
"groupItems": [
|
|
32
|
+
{
|
|
33
|
+
"text": "Armed forces community"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"text": "Births, deaths and marriages"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"text": "Crime and justice"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"text": "Cultural identity"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"text": "Education and childcare"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"text": "Elections"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"text": "Health and social care"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"text": "Household characteristics"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"text": "Housing"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"text": "Leisure and tourism"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"text": "Personal and household finances"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"text": "Population and migration"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"text": "Well-being"
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"groups": [
|
|
77
|
+
{
|
|
78
|
+
"heading": "Business, industry and trade",
|
|
79
|
+
"groupItems": [
|
|
80
|
+
{
|
|
81
|
+
"text": "Business"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"text": "Changes to business"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"text": "Construction industry"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"text": "International trade"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"text": "IT and internet industry"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"text": "Manufacturing and production industry"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"text": "Retail industry",
|
|
100
|
+
"url": "#0"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"text": "Tourism industry"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"heading": "Employment and labour market",
|
|
109
|
+
"url": "#0",
|
|
110
|
+
"groupItems":
|
|
111
|
+
[
|
|
112
|
+
{
|
|
113
|
+
"text": "People in work"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"text": "People not in work"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"groups": [
|
|
125
|
+
{
|
|
126
|
+
"heading": "Economy",
|
|
127
|
+
"groupItems": [
|
|
128
|
+
{
|
|
129
|
+
"text": "Economic output and productivity"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"text": "Government, public sector and taxes"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"text": "Gross Value Added (GVA)"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"text": "Investments, pensions and trusts"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"text": "Regional accounts"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"text": "Environmental accounts"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"text": "Gross Domestic Product (GDP)"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"text": "Inflation and price indices"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"text": "National accounts"
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"searchLinks": {
|
|
162
|
+
"id": "search-links",
|
|
163
|
+
"searchNavigationAriaLabel": 'Nav Search',
|
|
164
|
+
"searchButtonAriaLabel": 'Toggle search',
|
|
165
|
+
'heading': 'Popular searches',
|
|
166
|
+
"itemsList": [
|
|
167
|
+
{
|
|
168
|
+
"url": '#1',
|
|
169
|
+
"text": 'Cost of living'
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"url": '#1',
|
|
173
|
+
"text": 'Inflation'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"url": '#3',
|
|
177
|
+
"text": 'NHS waiting times'
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"url": '#0',
|
|
181
|
+
"text": 'Wellbeing'
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"url": '#0',
|
|
185
|
+
"text": 'Baby names'
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
}
|
|
189
|
+
})
|
|
190
|
+
}}
|