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

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 (139) hide show
  1. package/README.md +15 -3
  2. package/components/access-code/example-access-code-error.njk +2 -2
  3. package/components/access-code/example-access-code.njk +2 -2
  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.ui.js +11 -5
  11. package/components/back-to-top/_back-to-top.scss +7 -0
  12. package/components/back-to-top/_macro.njk +1 -1
  13. package/components/back-to-top/example-full-page-back-to-top.njk +1 -1
  14. package/components/breadcrumbs/_breadcrumbs.scss +4 -7
  15. package/components/breadcrumbs/_macro.njk +29 -25
  16. package/components/breadcrumbs/_macro.spec.js +39 -0
  17. package/components/breadcrumbs/example-breadcrumbs-wide.njk +52 -0
  18. package/components/char-check-limit/_macro.njk +16 -14
  19. package/components/chart/_chart.scss +0 -9
  20. package/components/chart/_macro.njk +96 -128
  21. package/components/chart/_macro.spec.js +43 -28
  22. package/components/chart/example-area-chart-with-axis-min-and-max-values.njk +6 -3
  23. package/components/chart/example-area-chart.njk +6 -3
  24. package/components/chart/example-bar-chart-with-annotations.njk +6 -3
  25. package/components/chart/example-bar-chart-with-axis-min-and-max-values.njk +6 -3
  26. package/components/chart/example-bar-chart-with-point-range-and-reference-line-annotations.njk +6 -3
  27. package/components/chart/example-bar-chart.njk +6 -3
  28. package/components/chart/example-bar-with-confidence-levels.njk +6 -3
  29. package/components/chart/example-clustered-bar-chart.njk +6 -3
  30. package/components/chart/example-clustered-column-chart.njk +6 -3
  31. package/components/chart/example-column-chart-with-annotations.njk +6 -3
  32. package/components/chart/example-column-chart-with-axis-min-and-max-values.njk +6 -3
  33. package/components/chart/example-column-chart-with-custom-reference-line-value.njk +6 -3
  34. package/components/chart/example-column-chart-with-range-annotations.njk +6 -3
  35. package/components/chart/example-column-chart-with-reference-line-annotations.njk +6 -3
  36. package/components/chart/example-column-chart.njk +6 -3
  37. package/components/chart/example-column-with-confidence-levels.njk +6 -3
  38. package/components/chart/example-column-with-line-chart.njk +6 -3
  39. package/components/chart/example-iframe-chart.njk +6 -3
  40. package/components/chart/example-line-chart-with-annotations.njk +6 -3
  41. package/components/chart/example-line-chart-with-axis-min-and-max-values.njk +6 -3
  42. package/components/chart/example-line-chart-with-custom-reference-line-value.njk +6 -3
  43. package/components/chart/example-line-chart-with-label-format.njk +6 -3
  44. package/components/chart/example-line-chart-with-markers.njk +6 -3
  45. package/components/chart/example-line-chart-with-range-annotations-inside.njk +6 -3
  46. package/components/chart/example-line-chart-with-range-annotations-outside-left-right.njk +6 -3
  47. package/components/chart/example-line-chart-with-range-annotations-outside-top-bottom.njk +6 -3
  48. package/components/chart/example-line-chart-with-reference-line-annotations.njk +6 -3
  49. package/components/chart/example-line-chart.njk +6 -3
  50. package/components/chart/example-scatter-chart-with-axis-min-and-max-values.njk +6 -3
  51. package/components/chart/example-scatter-chart.njk +6 -3
  52. package/components/chart/example-stacked-bar-chart.njk +6 -3
  53. package/components/chart/example-stacked-column-chart.njk +6 -3
  54. package/components/details/_details.scss +9 -0
  55. package/components/details/example-details-with-warning.njk +1 -1
  56. package/components/document-list/_macro.njk +2 -2
  57. package/components/document-list/_macro.spec.js +55 -0
  58. package/components/featured-article/_macro.njk +6 -40
  59. package/components/featured-article/example-featured-article-with-chart.njk +19 -14
  60. package/components/featured-article/example-featured-article-with-image.njk +12 -7
  61. package/components/featured-article/featured-article.scss +1 -1
  62. package/components/featured-article/macro.spec.js +46 -69
  63. package/components/feedback/_macro.njk +4 -1
  64. package/components/feedback/_macro.spec.js +1 -1
  65. package/components/figure/_figure.scss +32 -0
  66. package/components/figure/_macro.njk +98 -0
  67. package/components/figure/_macro.spec.js +520 -0
  68. package/components/figure/example-figure-heading-level-2.njk +34 -0
  69. package/components/figure/example-figure-with-div.njk +29 -0
  70. package/components/figure/example-figure-without-footer.njk +12 -0
  71. package/components/figure/example-figure-without-header.njk +24 -0
  72. package/components/figure/example-figure.njk +34 -0
  73. package/components/footer/_macro.njk +5 -2
  74. package/components/header/_header.scss +1 -3
  75. package/components/header/_macro.njk +8 -4
  76. package/components/header/_macro.spec.js +48 -0
  77. package/components/hero/_hero.scss +4 -0
  78. package/components/hero/_macro.njk +3 -2
  79. package/components/hero/_macro.spec.js +36 -0
  80. package/components/hero/example-hero-dark-wide.njk +17 -0
  81. package/components/hero/example-hero-dark-with-external-breadcrumbs.njk +17 -21
  82. package/components/hero/example-hero-default-full-width.njk +16 -0
  83. package/components/hero/example-hero-default-with-external-breadcrumbs.njk +165 -169
  84. package/components/hero/example-hero-grey-with-external-breadcrumbs.njk +207 -211
  85. package/components/hero/example-hero-navy-blue-with-external-breadcrumbs.njk +163 -167
  86. package/components/hero/example-hero-pale-blue-with-external-breadcrumbs.njk +165 -169
  87. package/components/image/_image.scss +0 -7
  88. package/components/image/_macro.njk +25 -14
  89. package/components/image/_macro.spec.js +122 -7
  90. package/components/image/example-image-with-figure-fields.njk +25 -0
  91. package/components/input/_input.scss +4 -0
  92. package/components/input/_macro.njk +4 -1
  93. package/components/label/_label.scss +3 -0
  94. package/components/list/_list.scss +5 -0
  95. package/components/list/_macro.njk +1 -0
  96. package/components/list/_macro.spec.js +16 -0
  97. package/components/message-list/_message-list.scss +2 -0
  98. package/components/panel/_macro.njk +1 -1
  99. package/components/panel/_panel.scss +8 -0
  100. package/components/panel/example-panel-bare.njk +1 -1
  101. package/components/phase-banner/_phase-banner.scss +1 -0
  102. package/components/question/example-question-ccs.njk +1 -1
  103. package/components/question/example-question-fieldset.njk +1 -1
  104. package/components/question/example-question-interviewer-note.njk +1 -1
  105. package/components/question/example-question-no-fieldset.njk +1 -1
  106. package/components/quote/_macro.njk +1 -1
  107. package/components/relationships/example-relationships-error.njk +1 -1
  108. package/components/relationships/example-relationships-you.njk +1 -1
  109. package/components/relationships/example-relationships.njk +1 -1
  110. package/components/skip-to-content/_macro.njk +1 -1
  111. package/components/skip-to-content/_skip.scss +8 -0
  112. package/components/table/_macro.njk +138 -111
  113. package/components/table/_macro.spec.js +175 -16
  114. package/components/table/_table.scss +6 -1
  115. package/components/table/example-table-basic-no-caption.njk +46 -0
  116. package/components/table/example-table-basic-visually-hidden-caption.njk +47 -0
  117. package/components/table/example-table-with-figure-fields.njk +86 -0
  118. package/components/table/table.spec.js +2 -0
  119. package/components/table-of-contents/_macro.njk +6 -4
  120. package/components/table-of-contents/_macro.spec.js +43 -3
  121. package/components/table-of-contents/example-table-of-contents-ordered.njk +64 -0
  122. package/components/table-of-contents/example-table-of-contents-sticky-full-page-ordered.njk +156 -0
  123. package/components/table-of-contents/example-table-of-contents-sticky-full-page.njk +1 -1
  124. package/components/table-of-contents/table-of-contents.spec.js +4 -5
  125. package/css/main.css +1 -1
  126. package/layout/_template.njk +66 -46
  127. package/package.json +45 -36
  128. package/scripts/main.es5.js +3 -3
  129. package/scripts/main.js +2 -2
  130. package/scss/base/_global.scss +8 -0
  131. package/scss/base/_typography.scss +9 -0
  132. package/scss/helpers/_mixins.scss +8 -0
  133. package/scss/main.scss +1 -0
  134. package/scss/objects/_page.scss +1 -1
  135. package/scss/objects/_spacing.scss +0 -4
  136. package/scss/utilities/_utilities.scss +10 -0
  137. package/scss/vars/_forms.scss +2 -1
  138. package/scss/vars/_index.scss +1 -0
  139. package/scss/vars/_utilities.scss +2 -0
@@ -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;
@@ -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', {
@@ -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
  }
@@ -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,
@@ -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": "<mark>Interviewer note:</mark>Who to interview",
@@ -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 are staying overnight at 3 Severn Road on 13 May 2019?",
@@ -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({
@@ -25,7 +25,7 @@ layout: ~
25
25
  }
26
26
  %}
27
27
 
28
- {% block main %}
28
+ {% block mainContent %}
29
29
 
30
30
  {%
31
31
  call onsPanel({
@@ -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": "Joe Bloggs is your <strong>…</strong>",
@@ -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": "Thinking of Joe Bloggs, Amanda Bloggs is their <strong>…</strong>",
@@ -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,121 +1,148 @@
1
1
  {% macro onsTable(params) %}
2
2
  {% from "components/button/_macro.njk" import onsButton %}
3
3
  {% from "components/icon/_macro.njk" import onsIcon %}
4
+ {% from "components/figure/_macro.njk" import onsFigure %}
4
5
  {% set variants = params.variants if params.variants %}
5
6
 
6
- <div class="ons-table-scrollable ons-table-scrollable--on">
7
- <div
8
- class="ons-table-scrollable__content"
9
- tabindex="0"
10
- role="region"
11
- aria-label="{{ params.caption }}. {{ params.ariaLabel | default('Scrollable table') }}"
12
- >
13
- {# Uses multiple loops to set the rowspan class so that it can work in both nunjucks and jinja2 environments due to the scoping rules of each language #}
14
- <table
15
- {% if params.id %}id="{{ params.id }}"{% endif %}
16
- class="ons-table{{ ' ' + params.tableClasses if params.tableClasses else '' }}{% for row in params.thList %}{% for th in row.ths %}{% if th.rowspan %}{{ ' ' }}ons-table--has-rowspan{% endif %}{% endfor %}{% endfor %}{% for row in params.trs %}{% for td in row.tds %}{% if td.rowspan %}{{ ' ' }}ons-table--has-rowspan{% endif %}{% endfor %}{% endfor %}{% if variants %}{% if variants is not string %}{% for variant in variants %}{{ ' ' }}ons-table--{{ variant }}{% endfor %}{% else %}{{ ' ' }}ons-table--{{ variants }}{% endif %}{% endif %}"
17
- {% if params.sortBy and 'sortable' in variants %}
18
- data-aria-sort="{{ params.sortBy }}" data-aria-asc="{{ params.ariaAsc }}" data-aria-desc="{{ params.ariaDesc }}"
19
- {% endif %}
7
+ {%
8
+ call onsFigure({
9
+ "useDivForRootElement": true,
10
+ "id": params.id,
11
+ "headingLevel": params.headingLevel,
12
+ "figureNumber": params.figureNumber,
13
+ "title": params.title,
14
+ "subtitle": params.subtitle,
15
+ "footnotes": params.footnotes,
16
+ "download": params.download,
17
+ "caption": params.sourceNote
18
+ })
19
+ %}
20
+ {% set tableClasses = "ons-table" %}
21
+
22
+ {# If there is no source note, footnotes or downloads after the table, add a bottom margin to the table to match the previous spacing #}
23
+ {# If there source note, footnotes or downloads after the table, the figure component handles the extra spacing #}
24
+ {% if not params.sourceNote and not params.footnotes and not params.download %}
25
+ {% set tableClasses = tableClasses + " ons-table--bottom-space" %}
26
+ {% endif %}
27
+
28
+ {% if params.tableClasses %}
29
+ {% set tableClasses = tableClasses + " " + params.tableClasses %}
30
+ {% endif %}
31
+
32
+ <div class="ons-table-scrollable ons-table-scrollable--on">
33
+ <div
34
+ class="ons-table-scrollable__content"
35
+ tabindex="0"
36
+ role="region"
37
+ {% if params.ariaLabel %}aria-label="{{ params.ariaLabel }}"{% endif %}
20
38
  >
21
- {% if params.caption %}
22
- <caption class="ons-table__caption{{ ' ons-u-vh' if params.hideCaption }}">
23
- {{ params.caption }}
24
- </caption>
25
- {% endif %}
26
- <thead class="ons-table__head">
27
- {# Uses thList if multiple-row headers, otherwise wrap single ths array into a default group #}
28
- {% if params.thList %}
29
- {% set thGroups = params.thList %}
30
- {% else %}
31
- {% set thGroups = [ { "ths": params.ths } ] %}
39
+ {# Uses multiple loops to set the rowspan class so that it can work in both nunjucks and jinja2 environments due to the scoping rules of each language #}
40
+ <table
41
+ class="{{ tableClasses }}{% for row in params.thList %}{% for th in row.ths %}{% if th.rowspan %}{{ ' ' }}ons-table--has-rowspan{% endif %}{% endfor %}{% endfor %}{% for row in params.trs %}{% for td in row.tds %}{% if td.rowspan %}{{ ' ' }}ons-table--has-rowspan{% endif %}{% endfor %}{% endfor %}{% if variants %}{% if variants is not string %}{% for variant in variants %}{{ ' ' }}ons-table--{{ variant }}{% endfor %}{% else %}{{ ' ' }}ons-table--{{ variants }}{% endif %}{% endif %}"
42
+ {% if params.sortBy and 'sortable' in variants %}
43
+ data-aria-sort="{{ params.sortBy }}" data-aria-asc="{{ params.ariaAsc }}" data-aria-desc="{{ params.ariaDesc }}"
32
44
  {% endif %}
33
- {% for headerCols in thGroups %}
34
- <tr class="ons-table__row">
35
- {% for th in headerCols.ths %}
36
- <th
37
- scope="col"
38
- class="ons-table__header ons-table__header--{{ th.valign | default('top') }}{{ ' ' + th.thClasses if th.thClasses else '' }}{{ ' ons-table__header--numeric' if th.numeric }}"
39
- {% if th.colspan %}colspan="{{ th.colspan }}"{% endif %}
40
- {% if th.rowspan %}rowspan="{{ th.rowspan }}"{% endif %}
41
- {% if 'sortable' in variants %}aria-sort="{{ th.ariaSort | default('none') }}"{% endif %}
42
- {% if th.widthPercentage %}width="{{ th.widthPercentage }}%"{% endif %}
43
- >
44
- <span class="ons-table__header-text">{{ th.value | safe }}</span>
45
- {% if 'sortable' in variants %}
46
- {{-
47
- onsIcon({
48
- "iconType": "sort-sprite",
49
- "id": th.value | replace(' ', '-'),
50
- "classes": 'ons-u-d-no'
51
- })
52
- -}}
53
- {% endif %}
54
- </th>
55
- {% endfor %}
56
- </tr>
57
- {% endfor %}
58
- </thead>
59
- <tbody class="ons-table__body">
60
- {% for tr in params.trs %}
61
- <tr
62
- class="ons-table__row{{ ' ons-table__row--highlight' if tr.highlight }}"
63
- {% if tr.id %}id="{{ tr.id }}"{% endif %}
64
- >
65
- {% for td in tr.tds %}
66
- {% if td.heading == true %}
67
- {% set openingTag = '<th' %}
68
- {% set closingTag = '</th>' %}
69
- {% else %}
70
- {% set openingTag = '<td' %}
71
- {% set closingTag = '</td>' %}
72
- {% endif %}
73
- {% set isFirstRow = loop.index == 0 and td.rowspan %}
74
- {% set rowSpan = isFirstRow and loop.index0 == rowspanCount %}
75
- {{ openingTag | safe }}
76
- class="ons-table__cell
77
- ons-table__cell--{{ td.valign | default('top') }}{{ ' ' + td.tdClasses if td.tdClasses else '' }}{{ ' ons-table__cell--numeric' if td.numeric }}"
78
- {% if td.id %}id="{{ td.id }}"{% endif %}
79
- {% if td.data %}{{ ' ' }}data-th="{{ td.data }}"{% endif %}
80
- {% if td.colspan %}colspan="{{ td.colspan }}"{% endif %}
81
- {% if td.rowspan %}rowspan="{{ td.rowspan }}"{% endif %}
82
- {% if td.dataSort %}{{ ' ' }}data-sort-value="{{ td.dataSort }}"{% endif %}
83
- {% if td.heading %}scope="row"{% endif %}
84
- >
85
- {% if td.form %}
86
- <form action="{{ td.form.action }}" method="{{ td.form.method | default('POST') }}">
87
- {{ onsButton(td.form.button) }}
88
- {% if td.form.hiddenFormField %}
89
- {% for hiddenField in td.form.hiddenFormField %}
90
- <input
91
- type="hidden"
92
- {% if hiddenField.name %}name="{{ hiddenField.name }}"{% endif %}
93
- {% if hiddenField.value %}value="{{ hiddenField.value }}"{% endif %}
94
- />
95
- {% endfor %}
45
+ >
46
+ {# Note that the caption is rendered inside the table element to be semantically correct, and we deliberately do not render it with the onsFigure caption option. We also have the option to visually hide it for the table. #}
47
+ {% if params.caption %}
48
+ <caption class="ons-table__caption{{ ' ons-u-vh' if params.hideCaption }}">
49
+ {{ params.caption }}
50
+ </caption>
51
+ {% endif %}
52
+ <thead class="ons-table__head">
53
+ {# Uses thList if multiple-row headers, otherwise wrap single ths array into a default group #}
54
+ {% if params.thList %}
55
+ {% set thGroups = params.thList %}
56
+ {% else %}
57
+ {% set thGroups = [ { "ths": params.ths } ] %}
58
+ {% endif %}
59
+ {% for headerCols in thGroups %}
60
+ <tr class="ons-table__row">
61
+ {% for th in headerCols.ths %}
62
+ <th
63
+ scope="col"
64
+ class="ons-table__header ons-table__header--{{ th.valign | default('top') }}{{ ' ' + th.thClasses if th.thClasses else '' }}{{ ' ons-table__header--numeric' if th.numeric }}"
65
+ {% if th.colspan %}colspan="{{ th.colspan }}"{% endif %}
66
+ {% if th.rowspan %}rowspan="{{ th.rowspan }}"{% endif %}
67
+ {% if 'sortable' in variants %}aria-sort="{{ th.ariaSort | default('none') }}"{% endif %}
68
+ {% if th.widthPercentage %}width="{{ th.widthPercentage }}%"{% endif %}
69
+ >
70
+ <span class="ons-table__header-text">{{ th.value | safe }}</span>
71
+ {% if 'sortable' in variants %}
72
+ {{-
73
+ onsIcon({
74
+ "iconType": "sort-sprite",
75
+ "id": th.value | replace(' ', '-'),
76
+ "classes": 'ons-u-d-no'
77
+ })
78
+ -}}
96
79
  {% endif %}
97
- </form>
98
- {% endif %}
99
- {% if td.value %}
100
- {{ td.value | safe }}
101
- {% endif %}
102
- {{ closingTag | safe }}
103
- {% endfor %}
104
- </tr>
105
- {% endfor %}
106
- </tbody>
107
- {% if params.tfoot %}
108
- <tfoot class="ons-table__foot">
109
- <tr class="ons-table__row">
110
- {% for tfootCell in params.tfoot %}
111
- <td class="ons-table__cell ons-table__cell--{{ tfootCell.valign | default('top') }} ons-u-fs-s">
112
- {{ tfootCell.value }}
113
- </td>
114
- {% endfor %}
115
- </tr>
116
- </tfoot>
117
- {% endif %}
118
- </table>
80
+ </th>
81
+ {% endfor %}
82
+ </tr>
83
+ {% endfor %}
84
+ </thead>
85
+ <tbody class="ons-table__body">
86
+ {% for tr in params.trs %}
87
+ <tr
88
+ class="ons-table__row{{ ' ons-table__row--highlight' if tr.highlight }}"
89
+ {% if tr.id %}id="{{ tr.id }}"{% endif %}
90
+ >
91
+ {% for td in tr.tds %}
92
+ {% if td.heading == true %}
93
+ {% set openingTag = '<th' %}
94
+ {% set closingTag = '</th>' %}
95
+ {% else %}
96
+ {% set openingTag = '<td' %}
97
+ {% set closingTag = '</td>' %}
98
+ {% endif %}
99
+ {% set isFirstRow = loop.index == 0 and td.rowspan %}
100
+ {% set rowSpan = isFirstRow and loop.index0 == rowspanCount %}
101
+ {{ openingTag | safe }}
102
+ class="ons-table__cell
103
+ ons-table__cell--{{ td.valign | default('top') }}{{ ' ' + td.tdClasses if td.tdClasses else '' }}{{ ' ons-table__cell--numeric' if td.numeric }}"
104
+ {% if td.id %}id="{{ td.id }}"{% endif %}
105
+ {% if td.data %}{{ ' ' }}data-th="{{ td.data }}"{% endif %}
106
+ {% if td.colspan %}colspan="{{ td.colspan }}"{% endif %}
107
+ {% if td.rowspan %}rowspan="{{ td.rowspan }}"{% endif %}
108
+ {% if td.dataSort %}{{ ' ' }}data-sort-value="{{ td.dataSort }}"{% endif %}
109
+ {% if td.heading %}scope="row"{% endif %}
110
+ >
111
+ {% if td.form %}
112
+ <form action="{{ td.form.action }}" method="{{ td.form.method | default('POST') }}">
113
+ {{ onsButton(td.form.button) }}
114
+ {% if td.form.hiddenFormField %}
115
+ {% for hiddenField in td.form.hiddenFormField %}
116
+ <input
117
+ type="hidden"
118
+ {% if hiddenField.name %}name="{{ hiddenField.name }}"{% endif %}
119
+ {% if hiddenField.value %}value="{{ hiddenField.value }}"{% endif %}
120
+ />
121
+ {% endfor %}
122
+ {% endif %}
123
+ </form>
124
+ {% endif %}
125
+ {% if td.value %}
126
+ {{ td.value | safe }}
127
+ {% endif %}
128
+ {{ closingTag | safe }}
129
+ {% endfor %}
130
+ </tr>
131
+ {% endfor %}
132
+ </tbody>
133
+ {% if params.tfoot %}
134
+ <tfoot class="ons-table__foot">
135
+ <tr class="ons-table__row">
136
+ {% for tfootCell in params.tfoot %}
137
+ <td class="ons-table__cell ons-table__cell--{{ tfootCell.valign | default('top') }} ons-u-fs-s">
138
+ {{ tfootCell.value }}
139
+ </td>
140
+ {% endfor %}
141
+ </tr>
142
+ </tfoot>
143
+ {% endif %}
144
+ </table>
145
+ </div>
119
146
  </div>
120
- </div>
147
+ {% endcall %}
121
148
  {% endmacro %}