@brightspace-ui/labs 2.56.0 → 2.56.2

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 (51) hide show
  1. package/demo/components/ou-filter/ouFilterDemoPage.js +14 -16
  2. package/package.json +4 -3
  3. package/src/components/accessibility-disability-simulator/accessibility-disability-simulator.js +70 -74
  4. package/src/components/accordion/accordion-collapse.js +161 -164
  5. package/src/components/accordion/accordion.js +14 -17
  6. package/src/components/attribute-picker/attribute-picker-item.js +63 -66
  7. package/src/components/attribute-picker/attribute-picker.js +118 -121
  8. package/src/components/card-overlay/card-overlay.js +53 -55
  9. package/src/components/checkbox-drawer/checkbox-drawer.js +32 -36
  10. package/src/components/community/community-base.js +3 -5
  11. package/src/components/community/community-button.js +3 -5
  12. package/src/components/community/community-link.js +4 -6
  13. package/src/components/file-uploader/file-uploader.js +148 -151
  14. package/src/components/grade-result/grade-result-icon-button.js +5 -6
  15. package/src/components/grade-result/grade-result-letter-score.js +18 -22
  16. package/src/components/grade-result/grade-result-numeric-score.js +25 -28
  17. package/src/components/grade-result/grade-result-presentational.js +133 -136
  18. package/src/components/grade-result/grade-result-student-grade-preview.js +38 -42
  19. package/src/components/media-player/media-player-audio-bars.js +28 -31
  20. package/src/components/media-player/media-player.js +471 -475
  21. package/src/components/media-player/slider-bar.js +119 -122
  22. package/src/components/navigation/navigation-band.js +69 -71
  23. package/src/components/navigation/navigation-button-icon.js +51 -55
  24. package/src/components/navigation/navigation-dropdown-button-custom.js +13 -17
  25. package/src/components/navigation/navigation-dropdown-button-icon.js +21 -25
  26. package/src/components/navigation/navigation-immersive.js +128 -132
  27. package/src/components/navigation/navigation-iterator.js +21 -25
  28. package/src/components/navigation/navigation-link-back.js +13 -17
  29. package/src/components/navigation/navigation-link-icon.js +36 -40
  30. package/src/components/navigation/navigation-link-image.js +31 -35
  31. package/src/components/navigation/navigation-link.js +34 -38
  32. package/src/components/navigation/navigation-main-footer.js +7 -9
  33. package/src/components/navigation/navigation-main-header.js +34 -36
  34. package/src/components/navigation/navigation-notification-icon.js +30 -34
  35. package/src/components/navigation/navigation.js +19 -23
  36. package/src/components/opt-in-flyout/flyout-impl.js +138 -146
  37. package/src/components/opt-in-flyout/opt-in-flyout.js +14 -18
  38. package/src/components/opt-in-flyout/opt-out-dialog.js +63 -67
  39. package/src/components/opt-in-flyout/opt-out-flyout.js +15 -19
  40. package/src/components/opt-in-flyout/opt-out-reason-selector.js +38 -45
  41. package/src/components/opt-in-flyout/opt-out-reason.js +9 -13
  42. package/src/components/ou-filter/ou-filter.js +14 -18
  43. package/src/components/ou-filter/tree-filter.js +22 -26
  44. package/src/components/ou-filter/tree-selector-node.js +62 -66
  45. package/src/components/ou-filter/tree-selector.js +55 -62
  46. package/src/components/pagination/pager-numeric.js +35 -39
  47. package/src/components/view-toggle/view-toggle.js +79 -81
  48. package/src/components/wizard/single-step-header.js +106 -110
  49. package/src/components/wizard/wizard-step.js +65 -68
  50. package/src/components/wizard/wizard.js +30 -33
  51. package/src/utilities/reactive-store/README.md +10 -15
@@ -11,157 +11,153 @@ const mediaQueryList = window.matchMedia('(max-width: 615px)');
11
11
 
12
12
  class NavigationImmersive extends LitElement {
13
13
 
14
- static get properties() {
15
- return {
16
- allowOverflow: {
17
- attribute: 'allow-overflow',
18
- type: Boolean,
19
- reflect: true
20
- },
21
- backLinkHref: {
22
- attribute: 'back-link-href',
23
- type: String
24
- },
25
- backLinkText: {
26
- attribute: 'back-link-text',
27
- type: String
28
- },
29
- backLinkTextShort: {
30
- attribute: 'back-link-text-short',
31
- type: String
32
- },
33
- widthType: {
34
- attribute: 'width-type',
35
- type: String,
36
- reflect: true
37
- },
38
- _dynamicSpacingHeight: { state: true },
39
- _middleHidden: { state: true },
40
- _middleNoRightBorder: { state: true },
41
- _smallWidth: { state: true }
42
- };
43
- }
14
+ static properties = {
15
+ allowOverflow: {
16
+ attribute: 'allow-overflow',
17
+ type: Boolean,
18
+ reflect: true
19
+ },
20
+ backLinkHref: {
21
+ attribute: 'back-link-href',
22
+ type: String
23
+ },
24
+ backLinkText: {
25
+ attribute: 'back-link-text',
26
+ type: String
27
+ },
28
+ backLinkTextShort: {
29
+ attribute: 'back-link-text-short',
30
+ type: String
31
+ },
32
+ widthType: {
33
+ attribute: 'width-type',
34
+ type: String,
35
+ reflect: true
36
+ },
37
+ _dynamicSpacingHeight: { state: true },
38
+ _middleHidden: { state: true },
39
+ _middleNoRightBorder: { state: true },
40
+ _smallWidth: { state: true }
41
+ };
42
+
43
+ static styles = [bodyCompactStyles, navigationSharedStyle, css`
44
+ :host {
45
+ --d2l-labs-navigation-immersive-height-main: 3.1rem;
46
+ --d2l-labs-navigation-immersive-height-responsive: 2.8rem;
47
+ }
48
+ .d2l-navigiation-immersive-fixed {
49
+ background-color: white;
50
+ left: 0;
51
+ position: fixed;
52
+ right: 0;
53
+ top: 0;
54
+ z-index: 2; /* higher than skeletons which could scroll behind immersive nav */
55
+ }
56
+ d2l-labs-navigation {
57
+ border-bottom: 1px solid var(--d2l-color-mica);
58
+ }
59
+ .d2l-labs-navigation-immersive-margin {
60
+ display: flex;
61
+ justify-content: center;
62
+ margin: 0 30px;
63
+ }
44
64
 
45
- static get styles() {
46
- return [bodyCompactStyles, navigationSharedStyle, css`
47
- :host {
48
- --d2l-labs-navigation-immersive-height-main: 3.1rem;
49
- --d2l-labs-navigation-immersive-height-responsive: 2.8rem;
50
- }
51
- .d2l-navigiation-immersive-fixed {
52
- background-color: white;
53
- left: 0;
54
- position: fixed;
55
- right: 0;
56
- top: 0;
57
- z-index: 2; /* higher than skeletons which could scroll behind immersive nav */
58
- }
59
- d2l-labs-navigation {
60
- border-bottom: 1px solid var(--d2l-color-mica);
61
- }
62
- .d2l-labs-navigation-immersive-margin {
63
- display: flex;
64
- justify-content: center;
65
- margin: 0 30px;
66
- }
65
+ .d2l-labs-navigation-immersive-container {
66
+ display: flex;
67
+ height: var(--d2l-labs-navigation-immersive-height-main);
68
+ justify-content: space-between;
69
+ margin: 0 -7px;
70
+ max-width: 100%;
71
+ overflow: hidden;
72
+ width: 100%;
73
+ }
67
74
 
68
- .d2l-labs-navigation-immersive-container {
69
- display: flex;
70
- height: var(--d2l-labs-navigation-immersive-height-main);
71
- justify-content: space-between;
72
- margin: 0 -7px;
73
- max-width: 100%;
74
- overflow: hidden;
75
- width: 100%;
76
- }
75
+ :host([width-type="normal"]) .d2l-labs-navigation-immersive-container {
76
+ max-width: 1230px;
77
+ }
77
78
 
78
- :host([width-type="normal"]) .d2l-labs-navigation-immersive-container {
79
- max-width: 1230px;
80
- }
79
+ :host([allow-overflow]) .d2l-labs-navigation-immersive-container {
80
+ overflow: visible;
81
+ }
81
82
 
82
- :host([allow-overflow]) .d2l-labs-navigation-immersive-container {
83
- overflow: visible;
84
- }
83
+ .d2l-labs-navigation-immersive-left ::slotted(*),
84
+ .d2l-labs-navigation-immersive-middle ::slotted(*),
85
+ .d2l-labs-navigation-immersive-right ::slotted(*) {
86
+ height: var(--d2l-labs-navigation-immersive-height-main);
87
+ }
85
88
 
86
- .d2l-labs-navigation-immersive-left ::slotted(*),
87
- .d2l-labs-navigation-immersive-middle ::slotted(*),
88
- .d2l-labs-navigation-immersive-right ::slotted(*) {
89
- height: var(--d2l-labs-navigation-immersive-height-main);
90
- }
89
+ .d2l-labs-navigation-immersive-left {
90
+ color: var(--d2l-color-tungsten);
91
+ letter-spacing: 0.2px;
92
+ padding-left: 7px;
93
+ }
91
94
 
92
- .d2l-labs-navigation-immersive-left {
93
- color: var(--d2l-color-tungsten);
94
- letter-spacing: 0.2px;
95
- padding-left: 7px;
96
- }
95
+ .d2l-labs-navigation-immersive-right {
96
+ padding-right: 7px;
97
+ }
97
98
 
98
- .d2l-labs-navigation-immersive-right {
99
- padding-right: 7px;
100
- }
99
+ .d2l-labs-navigation-immersive-left,
100
+ .d2l-labs-navigation-immersive-right {
101
+ flex: 0 0 auto;
102
+ }
101
103
 
102
- .d2l-labs-navigation-immersive-left,
103
- .d2l-labs-navigation-immersive-right {
104
- flex: 0 0 auto;
105
- }
104
+ .d2l-labs-navigation-immersive-middle {
105
+ border-inline-end: 1px solid var(--d2l-color-gypsum);
106
+ border-inline-start: 1px solid var(--d2l-color-gypsum);
107
+ flex: 0 1 auto;
108
+ margin: 0 24px;
109
+ min-width: 0;
110
+ padding: 0 24px;
111
+ width: 100%;
112
+ }
106
113
 
107
- .d2l-labs-navigation-immersive-middle {
108
- border-inline-end: 1px solid var(--d2l-color-gypsum);
109
- border-inline-start: 1px solid var(--d2l-color-gypsum);
110
- flex: 0 1 auto;
111
- margin: 0 24px;
112
- min-width: 0;
113
- padding: 0 24px;
114
- width: 100%;
115
- }
114
+ .d2l-labs-navigation-immersive-middle.d2l-labs-navigation-immersive-middle-no-right-border {
115
+ border-inline-end: none;
116
+ }
116
117
 
117
- .d2l-labs-navigation-immersive-middle.d2l-labs-navigation-immersive-middle-no-right-border {
118
- border-inline-end: none;
119
- }
118
+ div.d2l-labs-navigation-immersive-middle-observer,
119
+ div.d2l-labs-navigation-immersive-right-observer {
120
+ height: auto;
121
+ }
120
122
 
121
- div.d2l-labs-navigation-immersive-middle-observer,
122
- div.d2l-labs-navigation-immersive-right-observer {
123
- height: auto;
124
- }
123
+ .d2l-labs-navigation-immersive-middle-hidden {
124
+ visibility: hidden;
125
+ }
125
126
 
126
- .d2l-labs-navigation-immersive-middle-hidden {
127
- visibility: hidden;
128
- }
127
+ .d2l-labs-navigation-immersive-spacing {
128
+ position: unset;
129
+ }
129
130
 
130
- .d2l-labs-navigation-immersive-spacing {
131
- position: unset;
131
+ @media (max-width: 929px) {
132
+ .d2l-labs-navigation-immersive-margin {
133
+ margin: 0 24px;
132
134
  }
135
+ }
133
136
 
134
- @media (max-width: 929px) {
135
- .d2l-labs-navigation-immersive-margin {
136
- margin: 0 24px;
137
- }
137
+ @media (max-width: 767px) {
138
+ .d2l-labs-navigation-immersive-margin {
139
+ margin: 0 18px;
138
140
  }
141
+ }
139
142
 
140
- @media (max-width: 767px) {
141
- .d2l-labs-navigation-immersive-margin {
142
- margin: 0 18px;
143
- }
143
+ @media (max-width: 615px) {
144
+ .d2l-labs-navigation-immersive-container {
145
+ height: var(--d2l-labs-navigation-immersive-height-responsive);
144
146
  }
145
-
146
- @media (max-width: 615px) {
147
- .d2l-labs-navigation-immersive-container {
148
- height: var(--d2l-labs-navigation-immersive-height-responsive);
149
- }
150
- .d2l-labs-navigation-immersive-left ::slotted(*),
151
- .d2l-labs-navigation-immersive-middle ::slotted(*),
152
- .d2l-labs-navigation-immersive-right ::slotted(*) {
153
- height: var(--d2l-labs-navigation-immersive-height-responsive);
154
- }
155
- .d2l-labs-navigation-immersive-spacing {
156
- height: calc(var(--d2l-labs-navigation-immersive-height-responsive) + 5px);
157
- }
158
- .d2l-labs-navigation-immersive-middle {
159
- margin: 0 18px;
160
- padding: 0 18px;
161
- }
147
+ .d2l-labs-navigation-immersive-left ::slotted(*),
148
+ .d2l-labs-navigation-immersive-middle ::slotted(*),
149
+ .d2l-labs-navigation-immersive-right ::slotted(*) {
150
+ height: var(--d2l-labs-navigation-immersive-height-responsive);
162
151
  }
163
- `];
164
- }
152
+ .d2l-labs-navigation-immersive-spacing {
153
+ height: calc(var(--d2l-labs-navigation-immersive-height-responsive) + 5px);
154
+ }
155
+ .d2l-labs-navigation-immersive-middle {
156
+ margin: 0 18px;
157
+ padding: 0 18px;
158
+ }
159
+ }
160
+ `];
165
161
 
166
162
  constructor() {
167
163
  super();
@@ -5,32 +5,28 @@ import { LocalizeLabsElement } from '../localize-labs-element.js';
5
5
 
6
6
  class NavigationIterator extends LocalizeLabsElement(LitElement) {
7
7
 
8
- static get properties() {
9
- return {
10
- hideText: { attribute: 'hide-text', type: Boolean },
11
- previousDisabled: { attribute: 'previous-disabled', type: Boolean },
12
- previousText: { attribute: 'previous-text', type: String },
13
- nextDisabled: { attribute: 'next-disabled', type: Boolean },
14
- nextText: { attribute: 'next-text', type: String },
15
- noHighlightBorder: { attribute: 'no-highlight-border', type: Boolean },
16
- };
17
- }
8
+ static properties = {
9
+ hideText: { attribute: 'hide-text', type: Boolean },
10
+ previousDisabled: { attribute: 'previous-disabled', type: Boolean },
11
+ previousText: { attribute: 'previous-text', type: String },
12
+ nextDisabled: { attribute: 'next-disabled', type: Boolean },
13
+ nextText: { attribute: 'next-text', type: String },
14
+ noHighlightBorder: { attribute: 'no-highlight-border', type: Boolean },
15
+ };
18
16
 
19
- static get styles() {
20
- return [bodyCompactStyles, css`
21
- :host {
22
- align-items: center;
23
- display: flex;
24
- gap: 1.2rem;
25
- height: 3.3rem;
26
- justify-content: space-between;
27
- max-width: 20rem;
28
- }
29
- :host([hidden]) {
30
- display: none;
31
- }
32
- `];
33
- }
17
+ static styles = [bodyCompactStyles, css`
18
+ :host {
19
+ align-items: center;
20
+ display: flex;
21
+ gap: 1.2rem;
22
+ height: 3.3rem;
23
+ justify-content: space-between;
24
+ max-width: 20rem;
25
+ }
26
+ :host([hidden]) {
27
+ display: none;
28
+ }
29
+ `];
34
30
 
35
31
  constructor() {
36
32
  super();
@@ -5,24 +5,20 @@ import { LocalizeLabsElement } from '../localize-labs-element.js';
5
5
 
6
6
  class NavigationLinkBack extends LocalizeLabsElement(FocusMixin(LitElement)) {
7
7
 
8
- static get properties() {
9
- return {
10
- text: { type: String },
11
- href: { type: String }
12
- };
13
- }
8
+ static properties = {
9
+ text: { type: String },
10
+ href: { type: String }
11
+ };
14
12
 
15
- static get styles() {
16
- return css`
17
- :host {
18
- display: inline-block;
19
- height: 100%;
20
- }
21
- :host([hidden]) {
22
- display: none;
23
- }
24
- `;
25
- }
13
+ static styles = css`
14
+ :host {
15
+ display: inline-block;
16
+ height: 100%;
17
+ }
18
+ :host([hidden]) {
19
+ display: none;
20
+ }
21
+ `;
26
22
 
27
23
  static get focusElementSelector() {
28
24
  return 'd2l-labs-navigation-link-icon';
@@ -12,47 +12,43 @@ import { offscreenStyles } from '@brightspace-ui/core/components/offscreen/offsc
12
12
  */
13
13
  class NavigationLinkIcon extends FocusMixin(LitElement) {
14
14
 
15
- static get properties() {
16
- return {
17
- /**
18
- * REQUIRED: URL or URL fragment of the link
19
- * @type {string}
20
- */
21
- href: { type: String },
22
- /**
23
- * REQUIRED: Preset icon key (e.g. "tier1:gear")
24
- * @type {string}
25
- */
26
- icon: { type: String },
27
- /**
28
- * REQUIRED: Text for the link
29
- * @type {string}
30
- */
31
- text: { type: String },
32
- /**
33
- * Visually hides the text but still accessible
34
- * @type {boolean}
35
- */
36
- textHidden: { attribute: 'text-hidden', type: Boolean },
37
- /**
38
- * Offset of the tooltip
39
- * @type {Number}
40
- */
41
- tooltipOffset: { attribute: 'tooltip-offset', type: Number }
42
- };
43
- }
15
+ static properties = {
16
+ /**
17
+ * REQUIRED: URL or URL fragment of the link
18
+ * @type {string}
19
+ */
20
+ href: { type: String },
21
+ /**
22
+ * REQUIRED: Preset icon key (e.g. "tier1:gear")
23
+ * @type {string}
24
+ */
25
+ icon: { type: String },
26
+ /**
27
+ * REQUIRED: Text for the link
28
+ * @type {string}
29
+ */
30
+ text: { type: String },
31
+ /**
32
+ * Visually hides the text but still accessible
33
+ * @type {boolean}
34
+ */
35
+ textHidden: { attribute: 'text-hidden', type: Boolean },
36
+ /**
37
+ * Offset of the tooltip
38
+ * @type {Number}
39
+ */
40
+ tooltipOffset: { attribute: 'tooltip-offset', type: Number }
41
+ };
44
42
 
45
- static get styles() {
46
- return [highlightBorderStyles, highlightLinkStyles, offscreenStyles, css`
47
- :host {
48
- display: inline-block;
49
- height: 100%;
50
- }
51
- :host([hidden]) {
52
- display: none;
53
- }
54
- `];
55
- }
43
+ static styles = [highlightBorderStyles, highlightLinkStyles, offscreenStyles, css`
44
+ :host {
45
+ display: inline-block;
46
+ height: 100%;
47
+ }
48
+ :host([hidden]) {
49
+ display: none;
50
+ }
51
+ `];
56
52
 
57
53
  constructor() {
58
54
  super();
@@ -7,42 +7,38 @@ import { ifDefined } from 'lit/directives/if-defined.js';
7
7
 
8
8
  class NavigationLinkImage extends FocusMixin(LitElement) {
9
9
 
10
- static get properties() {
11
- return {
12
- href: { type: String },
13
- slim: { reflect: true, type: Boolean },
14
- src: { type: String },
15
- text: { type: String },
16
- tooltipOffset: { attribute: 'tooltip-offset', type: Number }
17
- };
18
- }
10
+ static properties = {
11
+ href: { type: String },
12
+ slim: { reflect: true, type: Boolean },
13
+ src: { type: String },
14
+ text: { type: String },
15
+ tooltipOffset: { attribute: 'tooltip-offset', type: Number }
16
+ };
19
17
 
20
- static get styles() {
21
- return [highlightBorderStyles, highlightLinkStyles, css`
22
- :host {
23
- display: inline-block;
24
- height: 100%;
25
- }
26
- :host([hidden]) {
27
- display: none;
28
- }
29
- img {
30
- max-height: 60px;
31
- max-width: 260px;
32
- vertical-align: middle;
33
- }
34
- :host([slim]) img {
35
- max-height: 40px;
36
- max-width: 173px;
37
- }
38
- .d2l-labs-navigation-link-image-container {
39
- align-items: center;
40
- display: inline-flex;
41
- height: 100%;
42
- vertical-align: middle;
43
- }
44
- `];
45
- }
18
+ static styles = [highlightBorderStyles, highlightLinkStyles, css`
19
+ :host {
20
+ display: inline-block;
21
+ height: 100%;
22
+ }
23
+ :host([hidden]) {
24
+ display: none;
25
+ }
26
+ img {
27
+ max-height: 60px;
28
+ max-width: 260px;
29
+ vertical-align: middle;
30
+ }
31
+ :host([slim]) img {
32
+ max-height: 40px;
33
+ max-width: 173px;
34
+ }
35
+ .d2l-labs-navigation-link-image-container {
36
+ align-items: center;
37
+ display: inline-flex;
38
+ height: 100%;
39
+ vertical-align: middle;
40
+ }
41
+ `];
46
42
 
47
43
  constructor() {
48
44
  super();
@@ -5,45 +5,41 @@ import { highlightBorderStyles } from './navigation-styles.js';
5
5
 
6
6
  class D2LNavigationLink extends FocusMixin(LitElement) {
7
7
 
8
- static get properties() {
9
- return {
10
- href: {
11
- reflect: true,
12
- type: String
13
- },
14
- text: {
15
- type: String
16
- }
17
- };
18
- }
8
+ static properties = {
9
+ href: {
10
+ reflect: true,
11
+ type: String
12
+ },
13
+ text: {
14
+ type: String
15
+ }
16
+ };
19
17
 
20
- static get styles() {
21
- return [highlightBorderStyles, css`
22
- :host {
23
- display: inline-block;
24
- height: 100%;
25
- }
26
- a {
27
- align-items: center;
28
- color: var(--d2l-color-ferrite);
29
- display: inline-flex;
30
- height: 100%;
31
- min-height: 40px;
32
- position: relative;
33
- text-decoration: none;
34
- vertical-align: middle;
35
- }
36
- a:hover,
37
- a:focus {
38
- --d2l-icon-fill-color: var(--d2l-color-celestine);
39
- color: var(--d2l-color-celestine);
40
- outline: none;
41
- }
42
- :host(:not([href])) .d2l-labs-navigation-highlight-border {
43
- display: none;
44
- }
45
- `];
46
- }
18
+ static styles = [highlightBorderStyles, css`
19
+ :host {
20
+ display: inline-block;
21
+ height: 100%;
22
+ }
23
+ a {
24
+ align-items: center;
25
+ color: var(--d2l-color-ferrite);
26
+ display: inline-flex;
27
+ height: 100%;
28
+ min-height: 40px;
29
+ position: relative;
30
+ text-decoration: none;
31
+ vertical-align: middle;
32
+ }
33
+ a:hover,
34
+ a:focus {
35
+ --d2l-icon-fill-color: var(--d2l-color-celestine);
36
+ color: var(--d2l-color-celestine);
37
+ outline: none;
38
+ }
39
+ :host(:not([href])) .d2l-labs-navigation-highlight-border {
40
+ display: none;
41
+ }
42
+ `];
47
43
 
48
44
  static get focusElementSelector() {
49
45
  return 'a';
@@ -3,15 +3,13 @@ import { navigationSharedStyle } from './navigation-shared-styles.js';
3
3
 
4
4
  class NavigationMainFooter extends LitElement {
5
5
 
6
- static get styles() {
7
- return [navigationSharedStyle, css`
8
- :host {
9
- border-bottom: 1px solid rgba(124, 134, 149, 0.18);
10
- border-top: 1px solid rgba(124, 134, 149, 0.18);
11
- display: block;
12
- }
13
- `];
14
- }
6
+ static styles = [navigationSharedStyle, css`
7
+ :host {
8
+ border-bottom: 1px solid rgba(124, 134, 149, 0.18);
9
+ border-top: 1px solid rgba(124, 134, 149, 0.18);
10
+ display: block;
11
+ }
12
+ `];
15
13
 
16
14
  render() {
17
15
  return html`