scb-wc-test 0.1.11 → 0.1.13

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 (95) hide show
  1. package/all.js +2 -0
  2. package/index.d.ts +1 -0
  3. package/index.js +34 -32
  4. package/mvc/components/all.js +1 -0
  5. package/mvc/components/scb-accordion/scb-accordion-item.js +21 -61
  6. package/mvc/components/scb-app-bar/scb-app-bar.js +1 -1
  7. package/mvc/components/scb-avatar/scb-avatar.js +1 -1
  8. package/mvc/components/scb-breadcrumb/scb-breadcrumb-item.js +1 -1
  9. package/mvc/components/scb-breadcrumb/scb-breadcrumb.js +1 -1
  10. package/mvc/components/scb-button/scb-button.js +1 -1
  11. package/mvc/components/scb-calendar-card/scb-calendar-card.js +165 -126
  12. package/mvc/components/scb-card/scb-card.js +223 -217
  13. package/mvc/components/scb-checkbox/scb-checkbox-group.js +1 -1
  14. package/mvc/components/scb-checkbox/scb-checkbox.js +9 -11
  15. package/mvc/components/scb-chips/scb-chip.js +1 -1
  16. package/mvc/components/scb-dialog/scb-dialog.js +2 -2
  17. package/mvc/components/scb-divider/scb-divider.js +43 -53
  18. package/mvc/components/scb-drawer/scb-drawer-item.js +2 -2
  19. package/mvc/components/scb-drawer/scb-drawer-section.js +4 -4
  20. package/mvc/components/scb-drawer/scb-drawer.js +1 -1
  21. package/mvc/components/scb-drawer/scb-sub-drawer.js +1 -1
  22. package/mvc/components/scb-fact-card/scb-fact-card-content.js +1 -1
  23. package/mvc/components/scb-fact-card/scb-fact-card.js +68 -55
  24. package/mvc/components/scb-footer/scb-footer-section.js +2 -2
  25. package/mvc/components/scb-footer/scb-footer.js +1 -1
  26. package/mvc/components/scb-grid/scb-grid-item.js +5 -3
  27. package/mvc/components/scb-grid/scb-grid.js +27 -10
  28. package/mvc/components/scb-grid/scb-stack.js +10 -6
  29. package/mvc/components/scb-header/scb-header-drawer-group.js +1 -1
  30. package/mvc/components/scb-header/scb-header-drawer-item.js +1 -1
  31. package/mvc/components/scb-header/scb-header-tab.js +1 -1
  32. package/mvc/components/scb-header/scb-header-utility.js +1 -1
  33. package/mvc/components/scb-header/scb-header.js +53 -49
  34. package/mvc/components/scb-icon-button/scb-icon-button.js +45 -80
  35. package/mvc/components/scb-keyfigure-card/scb-keyfigure-card.js +84 -58
  36. package/mvc/components/scb-link/scb-link.js +39 -16
  37. package/mvc/components/scb-list/scb-list-item.js +115 -37
  38. package/mvc/components/scb-list/scb-list.js +16 -7
  39. package/mvc/components/scb-menu/scb-menu-item.js +1 -1
  40. package/mvc/components/scb-menu/scb-menu.js +1 -1
  41. package/mvc/components/scb-menu/scb-sub-menu.js +1 -1
  42. package/mvc/components/scb-notification/scb-notification.js +1 -1
  43. package/mvc/components/scb-notification-card/scb-notification-card.js +187 -0
  44. package/mvc/components/scb-progress-indicator/scb-progress-indicator.js +1 -1
  45. package/mvc/components/scb-radio-button/scb-radio-button.js +29 -36
  46. package/mvc/components/scb-radio-button/scb-radio-group.js +1 -1
  47. package/mvc/components/scb-search/scb-search.js +48 -37
  48. package/mvc/components/scb-snackbar/scb-snackbar.js +8 -8
  49. package/mvc/components/scb-status-pill/scb-status-pill.js +1 -1
  50. package/mvc/components/scb-switch/scb-switch.js +1 -1
  51. package/mvc/components/scb-tabs/scb-primary-tab.js +1 -1
  52. package/mvc/components/scb-tabs/scb-secondary-tab.js +1 -1
  53. package/mvc/components/scb-tabs/scb-tabs.js +1 -1
  54. package/mvc/components/scb-textfield/scb-textfield.js +1 -1
  55. package/mvc/components/scb-toc/scb-toc-item.js +1 -1
  56. package/mvc/components/scb-toc/scb-toc.js +2 -2
  57. package/mvc/components/scb-tooltip/scb-tooltip.js +1 -1
  58. package/mvc/vendor/vendor-material.js +232 -312
  59. package/mvc/vendor/vendor.js +19 -23
  60. package/package.json +6 -2
  61. package/scb-accordion/scb-accordion-item.js +47 -98
  62. package/scb-calendar-card/scb-calendar-card.d.ts +6 -4
  63. package/scb-calendar-card/scb-calendar-card.js +207 -154
  64. package/scb-card/scb-card.d.ts +8 -3
  65. package/scb-card/scb-card.js +265 -250
  66. package/scb-checkbox/scb-checkbox.d.ts +1 -0
  67. package/scb-checkbox/scb-checkbox.js +56 -49
  68. package/scb-divider/scb-divider.d.ts +16 -4
  69. package/scb-divider/scb-divider.js +63 -69
  70. package/scb-fact-card/scb-fact-card.d.ts +8 -7
  71. package/scb-fact-card/scb-fact-card.js +100 -78
  72. package/scb-grid/scb-grid-item.d.ts +7 -2
  73. package/scb-grid/scb-grid-item.js +47 -33
  74. package/scb-grid/scb-grid.d.ts +7 -3
  75. package/scb-grid/scb-grid.js +57 -21
  76. package/scb-grid/scb-stack.d.ts +5 -1
  77. package/scb-grid/scb-stack.js +57 -31
  78. package/scb-header/scb-header.d.ts +1 -2
  79. package/scb-header/scb-header.js +154 -162
  80. package/scb-icon-button/scb-icon-button.d.ts +15 -11
  81. package/scb-icon-button/scb-icon-button.js +149 -132
  82. package/scb-keyfigure-card/scb-keyfigure-card.d.ts +6 -1
  83. package/scb-keyfigure-card/scb-keyfigure-card.js +139 -93
  84. package/scb-link/scb-link.d.ts +1 -0
  85. package/scb-link/scb-link.js +65 -38
  86. package/scb-list/scb-list-item.d.ts +8 -5
  87. package/scb-list/scb-list-item.js +183 -73
  88. package/scb-list/scb-list.d.ts +5 -0
  89. package/scb-list/scb-list.js +71 -21
  90. package/scb-notification-card/scb-notification-card.d.ts +18 -0
  91. package/scb-notification-card/scb-notification-card.js +264 -0
  92. package/scb-radio-button/scb-radio-button.js +46 -53
  93. package/scb-search/scb-search.d.ts +8 -0
  94. package/scb-search/scb-search.js +176 -139
  95. package/scb-wc-test.bundle.js +1870 -1546
@@ -0,0 +1,264 @@
1
+ import { css as d, LitElement as h, html as o } from "lit";
2
+ import { property as e, customElement as f } from "lit/decorators.js";
3
+ import "../scb-icon-button/scb-icon-button.js";
4
+ import "@material/web/icon/icon.js";
5
+ var y = Object.defineProperty, x = Object.getOwnPropertyDescriptor, i = (s, r, a, c) => {
6
+ for (var n = c > 1 ? void 0 : c ? x(r, a) : r, l = s.length - 1, p; l >= 0; l--)
7
+ (p = s[l]) && (n = (c ? p(r, a, n) : p(n)) || n);
8
+ return c && n && y(r, a, n), n;
9
+ };
10
+ let t = class extends h {
11
+ constructor() {
12
+ super(...arguments), this.type = "success", this.direction = "horizontal", this.title = "", this.subtitle = "", this.supportingText = "", this.open = !1, this.linkText = "", this.linkhref = "#", this.showIcon = !1, this.showCloseButton = !1, this._closeNotification = () => {
13
+ this.open = !1;
14
+ const s = new CustomEvent("close", {
15
+ detail: { open: this.open }
16
+ });
17
+ this.dispatchEvent(s);
18
+ };
19
+ }
20
+ /** Return icon name for notification type */
21
+ _iconForType() {
22
+ switch (this.type) {
23
+ case "success":
24
+ return "check_circle";
25
+ case "error":
26
+ return "error";
27
+ case "warning":
28
+ return "warning";
29
+ case "info":
30
+ return "info";
31
+ default:
32
+ return "info";
33
+ }
34
+ }
35
+ render() {
36
+ const s = this.type ? `${this.type.toLowerCase()}` : "", r = this.direction ? `${this.direction.toLowerCase()}` : "", a = this.linkhref ? "clickable" : "";
37
+ return o`
38
+ <div class="notification ${r} ${a} ${s}" type=${this.type} role="alert" aria-live="assertive" aria-atomic="true" style="display: ${this.open ? "flex" : "none"};">
39
+ <div class="notification-content">
40
+ ${this.showIcon || this.showCloseButton ? o`<div class="notification-header">
41
+ ${this.showIcon ? o`<md-icon>${this._iconForType()}</md-icon>` : ""}
42
+ </div>` : ""}
43
+ <div class="notification-text-container">
44
+ ${this.title ? o`<div class="notification-title">${this.title}</div>` : ""}
45
+ ${this.subtitle ? o`<div class="notification-subtitle">${this.subtitle}</div>` : ""}
46
+ ${this.supportingText ? o`<div class="notification-text">${this.supportingText}</div>` : ""}
47
+ ${this.linkText ? o`
48
+ <div class="notification-footer">
49
+ <a class="footer-link" href="${this.linkhref}">${this.linkText}</a>
50
+ </div>
51
+ ` : ""}
52
+ </div>
53
+ </div>
54
+ ${this.showCloseButton ? o`<scb-icon-button icon="close" @click=${this._closeNotification}
55
+ style="--_icon-color: ${this.type === "success" ? "var(--md-sys-color-on-success-container)" : this.type === "error" ? "var(--md-sys-color-on-error-container)" : this.type === "warning" ? "var(--md-sys-color-on-warning-container)" : "var(--md-sys-color-on-info-container)"};"></scb-icon-button>` : ""}
56
+ </div>
57
+ `;
58
+ }
59
+ };
60
+ t.styles = [
61
+ d`
62
+ :host {
63
+ display: block;
64
+ position: relative;
65
+ container-type: inline-size;
66
+ container-name: notification-container;
67
+ }
68
+
69
+ .notification {
70
+ border-radius: 12px;
71
+ padding: 16px;
72
+ display: flex;
73
+ gap: 12px;
74
+ flex-direction: column;
75
+
76
+ &.horizontal {
77
+ max-width: 600px;
78
+ }
79
+
80
+ &.vertical {
81
+ max-width: 580px;
82
+
83
+ .notification-content{
84
+ flex-direction: row;
85
+ gap: var(--spacing-spacing-4, 12px);
86
+ }
87
+ }
88
+ }
89
+
90
+ @container notification-container (min-width: 400px) {
91
+ .notification {
92
+ flex-direction: row;
93
+ }
94
+ .notification-label {
95
+ margin-right: 40px;
96
+ }
97
+ }
98
+
99
+ .notification-text-container {
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: var(--Spacing-Spacing-3, 8px);
103
+
104
+ .notification-title {
105
+ display: flex;
106
+ padding: 0 0 var(--spacing-spacing-0, 0) 0;
107
+ align-items: flex-start;
108
+ align-self: stretch;
109
+ font-family: var(--Brand, Inter);
110
+ font-size: var(--md-sys-typescale-headline-small-Size, 24px);
111
+ font-style: normal;
112
+ font-weight: var(--weight-bold, 700);
113
+ line-height: var(--md-sys-typescale-headline-small-line-height2, 30px);
114
+ letter-spacing: var(--md-sys-typescale-headline-small-tracking, -0.6px);
115
+ }
116
+
117
+ .notification-subtitle {
118
+ display: flex;
119
+ padding: 0 0 var(--spacing-spacing-0, 0) 0;
120
+ align-items: flex-start;
121
+ align-self: stretch;
122
+ font-family: var(--Brand, Inter);
123
+ font-size: var(--md-sys-typescale-title-medium-size, 18px);
124
+ font-style: normal;
125
+ font-weight: var(--weight-semibold, 600);
126
+ line-height: var(--md-sys-typescale-title-medium-line-height, 26px);
127
+ letter-spacing: var(--md-sys-typescale-title-medium-tracking, -0.3px);
128
+ }
129
+
130
+ .notification-text {
131
+ padding: 0 0 var(--spacing-spacing-0, 0) 0;
132
+ align-items: flex-start;
133
+ align-self: stretch;
134
+ font-family: var(--Brand, Inter);
135
+ font-size: var(--md-sys-typescale-body-large-size, 18px);
136
+ font-style: normal;
137
+ font-weight: var(--eeight-regular, 400);
138
+ line-height: var(--md-sys-typescale-body-large-line-height, 26px);
139
+ letter-spacing: var(--md-sys-typescale-body-large-tracking, -0.3px);
140
+ }
141
+ }
142
+
143
+ .notification[type="success"] {
144
+ background: var(--md-sys-color-success-container);
145
+ color: var(--md-sys-color-on-success-container);
146
+
147
+ a {
148
+ text-decoration: underline;
149
+ text-decoration-thickness: 1px;
150
+ text-underline-offset: .1578em;
151
+ color: var(--md-sys-color-on-success-container);
152
+ &:hover {text-decoration-thickness: 2px;}
153
+ }
154
+
155
+ &::part(scb-icon-button){
156
+ --icon-color: var(--md-sys-color-on-success-container);
157
+ }
158
+ }
159
+
160
+ .notification[type="error"] {
161
+ background: var(--md-sys-color-error-container);
162
+ color: var(--md-sys-color-on-error-container);
163
+ a {
164
+ text-decoration: underline;
165
+ text-decoration-thickness: 1px;
166
+ text-underline-offset: .1578em;
167
+ color: var(--md-sys-color-on-error-container);
168
+ &:hover {text-decoration-thickness: 2px;}
169
+ }
170
+ }
171
+
172
+ .notification[type="warning"] {
173
+ background: var(--md-sys-color-warning-container);
174
+ color: var(--md-sys-color-on-warning-container);
175
+ a {
176
+ text-decoration: underline;
177
+ text-decoration-thickness: 1px;
178
+ text-underline-offset: .1578em;
179
+ color: var(--md-sys-color-on-warning-container);
180
+ &:hover {text-decoration-thickness: 2px;}
181
+ }
182
+ }
183
+
184
+ .notification[type="info"] {
185
+ background: var(--md-sys-color-info-container);
186
+ color: var(--md-sys-color-on-info-container);
187
+ a {
188
+ text-decoration: underline;
189
+ text-decoration-thickness: 1px;
190
+ text-underline-offset: .1578em;
191
+ color: var(--md-sys-color-on-info-container);
192
+ &:hover {text-decoration-thickness: 2px;}
193
+ }
194
+ }
195
+
196
+ .notification-header scb-icon-button {
197
+ position: absolute;
198
+ right: 8px;
199
+ top: 8px;
200
+ }
201
+
202
+ .notification-content {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 4px;
206
+ }
207
+
208
+ slot {
209
+ font-size: 18px;
210
+ line-height: 26px;
211
+ }
212
+
213
+ .notification-footer {
214
+ font-size: 18px;
215
+ margin-top: 4px;
216
+ line-height: 26px;
217
+ }
218
+
219
+ :host([open]) .notification {
220
+ opacity: 1;
221
+ }
222
+
223
+ :host(:not([open])) .notification {
224
+ opacity: 0;
225
+ pointer-events: none;
226
+ }
227
+ `
228
+ ];
229
+ i([
230
+ e({ type: String })
231
+ ], t.prototype, "type", 2);
232
+ i([
233
+ e({ type: String, reflect: !0 })
234
+ ], t.prototype, "direction", 2);
235
+ i([
236
+ e({ type: String })
237
+ ], t.prototype, "title", 2);
238
+ i([
239
+ e({ type: String })
240
+ ], t.prototype, "subtitle", 2);
241
+ i([
242
+ e({ type: String, attribute: "supporting-text" })
243
+ ], t.prototype, "supportingText", 2);
244
+ i([
245
+ e({ type: Boolean, reflect: !0 })
246
+ ], t.prototype, "open", 2);
247
+ i([
248
+ e({ type: String, attribute: "link-text" })
249
+ ], t.prototype, "linkText", 2);
250
+ i([
251
+ e({ type: String, attribute: "link-href" })
252
+ ], t.prototype, "linkhref", 2);
253
+ i([
254
+ e({ type: Boolean, attribute: "show-icon" })
255
+ ], t.prototype, "showIcon", 2);
256
+ i([
257
+ e({ type: Boolean, attribute: "show-close-button" })
258
+ ], t.prototype, "showCloseButton", 2);
259
+ t = i([
260
+ f("scb-notification-card")
261
+ ], t);
262
+ export {
263
+ t as ScbNotificationCard
264
+ };
@@ -1,12 +1,12 @@
1
1
  import { LitElement as c, html as p, css as h } from "lit";
2
2
  import { property as s, customElement as u } from "lit/decorators.js";
3
3
  import "@material/web/radio/radio.js";
4
- var b = Object.defineProperty, g = Object.getOwnPropertyDescriptor, a = (e, t, n, o) => {
5
- for (var i = o > 1 ? void 0 : o ? g(t, n) : t, d = e.length - 1, l; d >= 0; d--)
4
+ var g = Object.defineProperty, m = Object.getOwnPropertyDescriptor, r = (e, t, n, o) => {
5
+ for (var i = o > 1 ? void 0 : o ? m(t, n) : t, d = e.length - 1, l; d >= 0; d--)
6
6
  (l = e[d]) && (i = (o ? l(t, n, i) : l(i)) || i);
7
- return o && i && b(t, n, i), i;
7
+ return o && i && g(t, n, i), i;
8
8
  };
9
- let r = class extends c {
9
+ let a = class extends c {
10
10
  constructor() {
11
11
  super(...arguments), this.disabled = !1, this.checked = !1, this.name = "", this.value = "", this.label = "", this.supportingText = "", this._radioId = "", this._onMdRadioChange = (e) => {
12
12
  if (this.disabled) return;
@@ -77,33 +77,36 @@ let r = class extends c {
77
77
  `;
78
78
  }
79
79
  };
80
- r.styles = h`
80
+ a.styles = h`
81
81
  /* layout med inline-grid */
82
82
  :host {
83
83
  display: inline-grid;
84
84
  grid-template-columns: auto;
85
85
  grid-template-rows: auto auto;
86
- row-gap: 4px;
86
+ row-gap: var(--spacing-2, 4px);
87
87
  font-family: var(--brand-font, 'Inter', sans-serif);
88
88
  }
89
89
 
90
+ /* Styr horisontellt avstånd när den placeras i horisontell layout */
91
+ :host([orientation="horizontal"]) {
92
+ margin-inline-end: var(--scb-radio-gap, var(--spacing-7, 24px));
93
+ }
94
+
90
95
  /* Wrapper för md-radio + label */
91
96
  .wrap {
92
97
  display: inline-flex;
93
98
  align-items: center;
94
- gap: 12px;
99
+ padding: var(--spacing-2, 4px);
100
+ gap: var(--spacing-2, 4px);
95
101
  cursor: pointer;
96
- /* låt ripple/state-layer synas */
97
102
  overflow: visible;
98
103
  }
99
- :host([disabled]) .wrap {
100
- cursor: default;
101
- }
104
+ :host([disabled]) .wrap { cursor: default; }
102
105
 
103
- /* Hit-yta runt md-radio (styr via variabel) */
106
+ /* Hit-yta runt md-radio */
104
107
  .radio-wrap {
105
- height: var(--scb-radio-target, 48px);
106
- width: var(--scb-radio-target, 48px);
108
+ height: var(--scb-radio-target, 40px);
109
+ width: var(--scb-radio-target, 40px);
107
110
  align-items: center;
108
111
  display: flex;
109
112
  justify-content: center;
@@ -111,66 +114,56 @@ r.styles = h`
111
114
  }
112
115
 
113
116
  /* Nollställ md-radio marginal */
114
- md-radio {
115
- margin: 0;
116
- }
117
+ md-radio { margin: 0; }
117
118
 
118
119
  /* Label-styling */
119
120
  .lbl {
120
121
  color: var(--md-sys-color-on-surface);
121
- line-height: 1.2;
122
- margin-top: 2px;
123
- }
124
- :host([disabled]) .lbl {
125
- color: var(--n-60);
122
+ font-family: var(--brand-font);
123
+ font-size: var(--md-sys-typescale-body-medium-size);
124
+ line-height: var(--md-sys-typescale-body-medium-line-height);
125
+ font-weight: var(--weight-regular, 400);
126
+ letter-spacing: var(--md-sys-typescale-body-medium-tracking);
127
+ margin-top: var(--spacing-1, 2px);
126
128
  }
129
+ :host([disabled]) .lbl { color: var(--n-60); }
127
130
 
128
131
  /* Supporting text styling */
129
132
  .supporting-text {
130
133
  color: var(--md-sys-color-on-surface-variant);
131
- line-height: 1.2;
132
- /* 12px gap + wrapperbredd (inte ikonstorlek) så texten linjerar med labeln */
133
- margin-left: calc(12px + var(--scb-radio-target, 48px));
134
- }
135
- :host([disabled]) .supporting-text {
136
- color: var(--n-60);
134
+ line-height: var(--md-sys-typescale-body-medium-line-height, 20px);
135
+ /* gap + wrapperbredd så texten linjerar med labeln */
136
+ margin-left: calc(var(--spacing-2, 4px) + var(--scb-radio-target, 40px));
137
137
  }
138
-
139
- :host([orientation="horizontal"]) {
140
- margin-inline-end: var(--scb-radio-gap, 24px); /* tweakable */
141
- }
138
+ :host([disabled]) .supporting-text { color: var(--n-60); }
142
139
 
143
140
  /* Anpassning för mörkt läge */
144
141
  @media (prefers-color-scheme: dark) {
145
- .lbl {
146
- color: var(--md-sys-color-on-surface);
147
- }
148
- .supporting-text {
149
- color: var(--md-sys-color-on-surface-variant);
150
- }
142
+ .lbl { color: var(--md-sys-color-on-surface); }
143
+ .supporting-text { color: var(--md-sys-color-on-surface-variant); }
151
144
  }
152
145
  `;
153
- a([
146
+ r([
154
147
  s({ type: Boolean, reflect: !0 })
155
- ], r.prototype, "disabled", 2);
156
- a([
148
+ ], a.prototype, "disabled", 2);
149
+ r([
157
150
  s({ type: Boolean, reflect: !0 })
158
- ], r.prototype, "checked", 2);
159
- a([
151
+ ], a.prototype, "checked", 2);
152
+ r([
160
153
  s({ type: String, reflect: !0 })
161
- ], r.prototype, "name", 2);
162
- a([
154
+ ], a.prototype, "name", 2);
155
+ r([
163
156
  s({ type: String, reflect: !0 })
164
- ], r.prototype, "value", 2);
165
- a([
157
+ ], a.prototype, "value", 2);
158
+ r([
166
159
  s({ type: String })
167
- ], r.prototype, "label", 2);
168
- a([
160
+ ], a.prototype, "label", 2);
161
+ r([
169
162
  s({ type: String, attribute: "supporting-text" })
170
- ], r.prototype, "supportingText", 2);
171
- r = a([
163
+ ], a.prototype, "supportingText", 2);
164
+ a = r([
172
165
  u("scb-radio-button")
173
- ], r);
166
+ ], a);
174
167
  export {
175
- r as ScbRadioButton
168
+ a as ScbRadioButton
176
169
  };
@@ -28,6 +28,7 @@ export declare class ScbSearch extends LitElement {
28
28
  private _filterSuggestions;
29
29
  private _inputEl;
30
30
  private _listEl;
31
+ private _ringEl;
31
32
  private _getVisibleItems;
32
33
  private _getActiveItem;
33
34
  private _moveActive;
@@ -36,6 +37,13 @@ export declare class ScbSearch extends LitElement {
36
37
  private _ensureListboxA11y;
37
38
  private _ensureOptionA11y;
38
39
  private _updateComboboxA11y;
40
+ private _positionOptionRing;
41
+ private _hideOptionRing;
42
+ private _onWindowResize;
43
+ private _listScrollHandler;
44
+ private _listWithHandler?;
45
+ private _attachListScrollListener;
46
+ private _detachListScrollListener;
39
47
  }
40
48
  declare global {
41
49
  interface HTMLElementTagNameMap {