@ons/design-system 74.0.0-next.7 → 74.0.0-widen.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 (68) hide show
  1. package/README.md +2 -2
  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/_macro.njk +6 -6
  5. package/components/address-input/_macro.spec.js +0 -3
  6. package/components/address-input/autosuggest.address.spec.js +23 -0
  7. package/components/address-output/_macro.njk +1 -1
  8. package/components/announcement-banner/_announcement-banner.scss +5 -0
  9. package/components/autosuggest/_autosuggest.scss +8 -0
  10. package/components/autosuggest/autosuggest.spec.js +1 -0
  11. package/components/autosuggest/autosuggest.ui.js +11 -5
  12. package/components/back-to-top/_back-to-top.scss +7 -0
  13. package/components/back-to-top/_macro.njk +1 -1
  14. package/components/back-to-top/back-to-top.js +9 -1
  15. package/components/back-to-top/back-to-top.spec.js +46 -0
  16. package/components/breadcrumbs/example-breadcrumbs-wide.njk +52 -0
  17. package/components/card/example-card-set-with-headline-figures.njk +1 -1
  18. package/components/char-check-limit/_macro.njk +16 -14
  19. package/components/chart/_macro.njk +3 -0
  20. package/components/chart/_macro.spec.js +49 -0
  21. package/components/chart/bar-chart.js +18 -12
  22. package/components/chart/chart.js +4 -1
  23. package/components/chart/common-chart-options.js +1 -0
  24. package/components/chart/example-stacked-column-with-line-chart.njk +64 -0
  25. package/components/details/_details.scss +9 -0
  26. package/components/details/example-details-with-warning.njk +1 -1
  27. package/components/details-panel/_macro.njk +1 -1
  28. package/components/download-resources/download-resources.spec.js +1 -4
  29. package/components/featured-article/_macro.njk +4 -4
  30. package/components/featured-article/macro.spec.js +2 -2
  31. package/components/feedback/_macro.njk +4 -1
  32. package/components/feedback/_macro.spec.js +1 -1
  33. package/components/figure/_figure.scss +1 -0
  34. package/components/figure/_macro.njk +3 -3
  35. package/components/footer/_macro.njk +5 -2
  36. package/components/header/_macro.njk +1 -1
  37. package/components/header/_macro.spec.js +21 -0
  38. package/components/hero/_hero.scss +4 -0
  39. package/components/input/_input.scss +4 -0
  40. package/components/input/_macro.njk +4 -1
  41. package/components/label/_label.scss +3 -0
  42. package/components/list/_list.scss +5 -0
  43. package/components/message/_message.scss +3 -3
  44. package/components/message-list/_message-list.scss +2 -0
  45. package/components/panel/_macro.njk +1 -1
  46. package/components/panel/_panel.scss +8 -0
  47. package/components/panel/example-panel-bare.njk +1 -1
  48. package/components/phase-banner/_phase-banner.scss +1 -0
  49. package/components/quote/_macro.njk +1 -1
  50. package/components/skip-to-content/_macro.njk +1 -1
  51. package/components/skip-to-content/_skip.scss +8 -0
  52. package/components/tabs/tabs.spec.js +1 -4
  53. package/css/main.css +1 -1
  54. package/layout/_template.njk +1 -0
  55. package/package.json +55 -53
  56. package/scripts/chart.es5.js +1 -1
  57. package/scripts/chart.js +1 -1
  58. package/scripts/main.es5.js +3 -3
  59. package/scripts/main.js +3 -3
  60. package/scss/base/_typography.scss +9 -0
  61. package/scss/helpers/_mixins.scss +8 -0
  62. package/scss/objects/_container.scss +15 -3
  63. package/scss/utilities/_grid.scss +10 -25
  64. package/scss/utilities/_utilities.scss +10 -0
  65. package/scss/vars/_forms.scss +2 -1
  66. package/scss/vars/_grid.scss +20 -3
  67. package/scss/vars/_index.scss +1 -0
  68. package/scss/vars/_utilities.scss +2 -0
@@ -77,6 +77,15 @@ $details-caret-width: 1.75rem;
77
77
  display: block;
78
78
  margin: 1rem 0 0 0.5rem;
79
79
  padding: 0 0 0 1.5rem;
80
+
81
+ // Restrict the width of textual content within the details content (paragraphs are already globally restricted)
82
+
83
+ ul,
84
+ ol,
85
+ label,
86
+ legend {
87
+ @include reading-width;
88
+ }
80
89
  }
81
90
  }
82
91
 
@@ -16,6 +16,6 @@
16
16
  "variant": "warn"
17
17
  })
18
18
  %}
19
- Someone in your household must still complete a survey using a household access code
19
+ <p>Someone in your household must still complete a survey using a household access code</p>
20
20
  {% endcall %}
21
21
  {% endcall %}
@@ -21,7 +21,7 @@
21
21
  })
22
22
  }}
23
23
  </span>
24
- <span class="ons-details-panel__banner-detail-title">
24
+ <span class="ons-details-panel__banner-detail-title ons-u-reading-width">
25
25
  <span class="ons-details-panel__banner-detail-title--open"> {{ openText }} </span>
26
26
  <span class="ons-details-panel__banner-detail-title--close"> {{ closeText }} </span>
27
27
  </span>
@@ -1,9 +1,6 @@
1
- import { KnownDevices } from 'puppeteer';
2
- import { setViewport } from '../../tests/helpers/puppeteer';
1
+ import { iPhoneX, setViewport } from '../../tests/helpers/puppeteer';
3
2
  import { renderComponent, renderTemplate, setTestPage } from '../../tests/helpers/rendering';
4
3
 
5
- const iPhoneX = KnownDevices['iPhone X'];
6
-
7
4
  /* eslint-disable indent */
8
5
  const EXAMPLE_PAGE = `
9
6
  <div class="ons-page">
@@ -31,12 +31,12 @@
31
31
 
32
32
  {# The media (a nested figure containing a chart or image) is provided via the caller
33
33
  block, so the article does not need to know how the content is rendered. #}
34
- <div class="ons-featured__media">
35
- {{ caller() if caller }}
36
- </div>
34
+ <div class="ons-featured__media">{{ caller() if caller }}</div>
37
35
 
38
36
  {% if params.description %}
39
- <div class="ons-featured__description">{{ params.description | safe }}</div>
37
+ <div class="ons-featured__description">
38
+ <div class="ons-u-reading-width">{{ params.description | safe }}</div>
39
+ </div>
40
40
  {% endif %}
41
41
  </div>
42
42
  {% endmacro %}
@@ -123,8 +123,8 @@ describe('Macro: Featured Article', () => {
123
123
  EXAMPLE_CHART_CALLER_CONTENT,
124
124
  ),
125
125
  );
126
- const title = $('.ons-featured__description').html().trim();
127
- expect(title).toBe('Some description');
126
+ const description = $('.ons-featured__description .ons-u-reading-width').html().trim();
127
+ expect(description).toBe('Some description');
128
128
  });
129
129
  });
130
130
  });
@@ -7,6 +7,9 @@
7
7
  {{ params.heading }}
8
8
  {{ closingHeadingTag | safe }}
9
9
  <p class="ons-feedback__content">{{- params.content | safe -}}</p>
10
- <a href="{{ params.linkUrl }}" class="ons-feedback__link">{{- params.linkText -}}</a>
10
+ {# p tag ensures reading width is applied #}
11
+ <p class="ons-u-mb-no">
12
+ <a href="{{ params.linkUrl }}" class="ons-feedback__link">{{- params.linkText -}}</a>
13
+ </p>
11
14
  </div>
12
15
  {% endmacro %}
@@ -110,7 +110,7 @@ describe('FOR: Macro: Feedback', () => {
110
110
  describe('WHEN: content is provided', () => {
111
111
  const $ = cheerio.load(renderComponent('feedback', EXAMPLE_FEEDBACK));
112
112
  test('THEN: renders paragraph with the provided content', () => {
113
- expect($('p').text().trim()).toBe('Feedback content...');
113
+ expect($('p').first().text().trim()).toBe('Feedback content...');
114
114
  });
115
115
  });
116
116
  });
@@ -6,6 +6,7 @@
6
6
  font-size: 1.125rem;
7
7
  font-weight: $font-weight-bold;
8
8
  line-height: 1.3;
9
+ display: block;
9
10
  }
10
11
 
11
12
  &__title {
@@ -34,7 +34,7 @@
34
34
 
35
35
  {{ openingRootTag | safe }}
36
36
  {% if params.figureNumber %}
37
- <span class="ons-figure__number">{{ params.figureNumber }}</span>
37
+ <span class="ons-figure__number ons-u-reading-width">{{ params.figureNumber }}</span>
38
38
  {% endif %}
39
39
  {% if params.title %}
40
40
  {{ openingTitleTag | safe }}{{ params.title }}{{ closingTitleTag | safe }}
@@ -61,9 +61,9 @@
61
61
 
62
62
  {% if params.caption %}
63
63
  {% if rootElement == 'figure' %}
64
- <figcaption class="ons-figure__caption">{{ params.caption }}</figcaption>
64
+ <figcaption class="ons-figure__caption ons-u-reading-width">{{ params.caption }}</figcaption>
65
65
  {% else %}
66
- <span class="ons-figure__caption">{{ params.caption }}</span>
66
+ <span class="ons-figure__caption ons-u-reading-width">{{ params.caption }}</span>
67
67
  {% endif %}
68
68
  {% endif %}
69
69
  {{ closingRootTag | safe }}
@@ -53,14 +53,17 @@
53
53
  {% if params.footerWarning %}
54
54
  {% from "components/panel/_macro.njk" import onsPanel %}
55
55
  <div class="ons-footer__warning">
56
- <div class="ons-container">
56
+ <div
57
+ class="ons-container{{ ' ons-container--full-width' if params.fullWidth else "" }}{{ ' ons-container--wide' if params.wide else "" }}"
58
+ >
57
59
  {%
58
60
  call onsPanel({
59
61
  "variant": "warn",
60
62
  "classes": "ons-panel--warn--footer"
61
63
  })
62
64
  %}
63
- {{ params.footerWarning | safe }}
65
+ {# p tag ensures reading width is applied #}
66
+ <div class="ons-u-reading-width">{{ params.footerWarning | safe }}</div>
64
67
  {% endcall %}
65
68
  </div>
66
69
  </div>
@@ -370,7 +370,7 @@
370
370
  "name": params.search.form.inputName | default('q'),
371
371
  "width": 'full',
372
372
  "label": {
373
- "text": (params.search.form.inputLabel if params.search.form else params.searchLinks.searchNavigationInputLabel) | default('Chwilio’r SYG' if params.lang == 'cy' else 'Search the ONS'),
373
+ "text": (params.search.form.inputLabel if params.search.form else params.searchLinks.searchNavigationInputLabel) | default('Chwilio’r SYG' if currentLanguageIsoCode == 'cy' else 'Search the ONS'),
374
374
  "id": "header-search-input-label"
375
375
  },
376
376
  "searchButton": {
@@ -1131,6 +1131,27 @@ describe('FOR: Macro: Header', () => {
1131
1131
  expect($('#header-search-input-label').text().trim()).toBe('Search the ONS');
1132
1132
  });
1133
1133
  });
1134
+ describe('WHEN: inputLabel is not provided and Welsh is the current language', () => {
1135
+ const $ = cheerio.load(
1136
+ renderComponent('header', {
1137
+ ...EXAMPLE_HEADER_SEARCH,
1138
+ variants: 'basic',
1139
+ language: {
1140
+ languages: [
1141
+ { url: '#0', isoCode: 'en', text: 'English', current: false },
1142
+ { url: '#0', isoCode: 'cy', text: 'Cymraeg', current: true },
1143
+ ],
1144
+ },
1145
+ search: {
1146
+ ...EXAMPLE_HEADER_SEARCH.search,
1147
+ form: { ...EXAMPLE_HEADER_SEARCH.search.form, inputLabel: undefined },
1148
+ },
1149
+ }),
1150
+ );
1151
+ test('THEN: renders search input with Welsh default label', () => {
1152
+ expect($('#header-search-input-label').text().trim()).toBe('Chwilio’r SYG');
1153
+ });
1154
+ });
1134
1155
  describe('WHEN: buttonText is provided', () => {
1135
1156
  const $ = cheerio.load(renderComponent('header', { ...EXAMPLE_HEADER_SEARCH, variants: 'basic' }));
1136
1157
 
@@ -466,6 +466,10 @@
466
466
  display: flex;
467
467
  flex-direction: column-reverse;
468
468
  }
469
+
470
+ &__text {
471
+ @include no-reading-width;
472
+ }
469
473
  }
470
474
 
471
475
  @include panel-variant(ons-red, var(--ons-color-errors), var(--ons-color-errors-tint));
@@ -43,6 +43,10 @@
43
43
  &--textarea {
44
44
  // Prevent inner shadow on iOS
45
45
  appearance: none;
46
+
47
+ &:not(.ons-input--header-search, [class*='--w-']) {
48
+ @include reading-width;
49
+ }
46
50
  }
47
51
 
48
52
  &:focus {
@@ -60,7 +60,10 @@
60
60
  <!-- prettier-ignore-end -->
61
61
  {% endif %}
62
62
  {% if params.postTextboxLinkText %}
63
- <a class="ons-u-fs-s ons-input__post-link" href="{{ params.postTextboxLinkUrl }}">{{ params.postTextboxLinkText }}</a>
63
+ {# p tag ensures reading width is applied #}
64
+ <p class="ons-u-mb-no">
65
+ <a class="ons-u-fs-s ons-input__post-link" href="{{ params.postTextboxLinkUrl }}">{{ params.postTextboxLinkText }}</a>
66
+ </p>
64
67
  {% endif %}
65
68
  {% endset %}
66
69
 
@@ -1,4 +1,6 @@
1
1
  .ons-label {
2
+ @include reading-width;
3
+
2
4
  color: inherit;
3
5
  display: block;
4
6
  font-weight: $font-weight-bold;
@@ -6,6 +8,7 @@
6
8
 
7
9
  &__description {
8
10
  @extend .ons-u-fs-s;
11
+ @include reading-width;
9
12
 
10
13
  display: block;
11
14
  }
@@ -3,6 +3,8 @@
3
3
  padding: 0 0 0 1.5rem;
4
4
 
5
5
  &__item {
6
+ @include reading-width;
7
+
6
8
  &:first-child {
7
9
  margin-top: 0.5rem;
8
10
  }
@@ -109,14 +111,17 @@
109
111
  }
110
112
 
111
113
  @include bp-suffix('ons-list--inline') {
114
+ /* stylelint-disable-next-line nesting-selector-no-missing-scoping-root */
112
115
  &:not(.ons-list--icons) {
113
116
  margin: 0 1rem 0 0;
114
117
  .ons-list__item {
118
+ max-width: none;
115
119
  display: inline-block;
116
120
  margin: 0 1rem 0 0;
117
121
  }
118
122
  }
119
123
 
124
+ /* stylelint-disable-next-line nesting-selector-no-missing-scoping-root */
120
125
  &.ons-list--icons {
121
126
  align-items: center;
122
127
  display: flex;
@@ -1,7 +1,7 @@
1
1
  @use 'sass:math';
2
2
 
3
3
  .ons-message {
4
- border-radius: math.div($grid-gutters, 2);
4
+ border-radius: math.div($grid-gutter-standard, 2);
5
5
  margin-bottom: 2rem;
6
6
  outline: 1px solid transparent; // Add transparent outline because Windows High Contrast Mode doesn't show background
7
7
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  &__head {
25
25
  border-bottom: 1px solid var(--ons-color-borders);
26
- padding: $grid-gutters;
26
+ padding: $grid-gutter-standard;
27
27
  position: relative;
28
28
  }
29
29
 
@@ -50,6 +50,6 @@
50
50
  }
51
51
 
52
52
  &__body {
53
- padding: $grid-gutters;
53
+ padding: $grid-gutter-standard;
54
54
  }
55
55
  }
@@ -16,6 +16,8 @@
16
16
  }
17
17
 
18
18
  &__metadata {
19
+ @include reading-width;
20
+
19
21
  margin: 0 0 1rem;
20
22
 
21
23
  &-term,
@@ -62,7 +62,7 @@
62
62
  {% set closingTag = "</" ~ titleTag ~ ">" %}
63
63
  <div class="ons-panel__header">
64
64
  {{ openingTag | safe }} id="alert"{% if params.variant %}data-qa="{{ params.variant }}-header"{% endif %}
65
- class="ons-panel__title ons-u-fs-r--b">{{ params.title | safe }}{{ closingTag | safe }}
65
+ class="ons-panel__title ons-u-fs-r--b ons-u-reading-width">{{ params.title | safe }}{{ closingTag | safe }}
66
66
  </div>
67
67
  {% else %}
68
68
  {% if not params.variant or params.variant == "branded" or params.variant == "info" or params.variant == "bare" %}
@@ -112,6 +112,14 @@
112
112
  margin: 0;
113
113
  }
114
114
  }
115
+
116
+ // Restrict the width of textual content within the panel body (paragraphs are already globally restricted)
117
+ ul,
118
+ ol,
119
+ label,
120
+ legend {
121
+ @include reading-width;
122
+ }
115
123
  }
116
124
 
117
125
  &__error {
@@ -6,5 +6,5 @@
6
6
  "iconType": 'lock'
7
7
  })
8
8
  %}
9
- Here is some text with an icon
9
+ <p>Here is some text with an icon</p>
10
10
  {% endcall %}
@@ -15,5 +15,6 @@
15
15
 
16
16
  &__desc {
17
17
  margin-top: 0.25rem;
18
+ @include no-reading-width;
18
19
  }
19
20
  }
@@ -1,5 +1,5 @@
1
1
  {% macro onsQuote(params) %}
2
- <blockquote class="ons-quote">
2
+ <blockquote class="ons-quote ons-u-reading-width">
3
3
  {% from "components/icon/_macro.njk" import onsIcon %}
4
4
  {{-
5
5
  onsIcon({
@@ -1,6 +1,6 @@
1
1
  {% macro onsSkipToContent(params) %}
2
2
  <div role="region">
3
3
  {% set text = params.text | default('Skip to content') %}
4
- <a class="ons-skip-to-content ons-u-fs-r--b" href="{{ params.url }}">{{ text }}</a>
4
+ <a class="ons-skip-to-content ons-u-fs-r--b" href="{{ params.url }}"><span class="ons-skip-to-content__text">{{ text }}</span></a>
5
5
  </div>
6
6
  {% endmacro %}
@@ -1,4 +1,5 @@
1
1
  .ons-skip-to-content {
2
+ /* stylelint-disable-next-line property-no-deprecated */
2
3
  clip: rect(0 0 0 0);
3
4
  clip-path: inset(50%);
4
5
  display: block;
@@ -13,6 +14,7 @@
13
14
  &:focus {
14
15
  background-color: var(--ons-color-focus);
15
16
  box-shadow: 0;
17
+ /* stylelint-disable-next-line property-no-deprecated */
16
18
  clip: auto;
17
19
  clip-path: none;
18
20
  color: var(--ons-color-text-link-focus);
@@ -28,4 +30,10 @@
28
30
  white-space: inherit;
29
31
  width: auto;
30
32
  }
33
+
34
+ &__text {
35
+ // Reading width max-width is hard-coded as skip to content sits outside the `ons-container` class
36
+ max-width: $reading-width;
37
+ display: block;
38
+ }
31
39
  }
@@ -1,9 +1,6 @@
1
- import { KnownDevices } from 'puppeteer';
2
- import { setViewport } from '../../tests/helpers/puppeteer';
1
+ import { iPhoneX, setViewport } from '../../tests/helpers/puppeteer';
3
2
  import { renderComponent, setTestPage } from '../../tests/helpers/rendering';
4
3
 
5
- const iPhoneX = KnownDevices['iPhone X'];
6
-
7
4
  const EXAMPLE_TABS = {
8
5
  title: 'Example tabs',
9
6
  titleClasses: 'ons-u-fs-m',