@3t-transform/threeteeui 0.0.10 → 0.0.12

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 (93) hide show
  1. package/dist/cjs/{index-8a4cb9bc.js → index-61cd741f.js} +43 -88
  2. package/dist/cjs/loader.cjs.js +3 -4
  3. package/dist/cjs/tttx-button.cjs.entry.js +2 -2
  4. package/dist/cjs/tttx-checkbox.cjs.entry.js +3 -3
  5. package/dist/cjs/tttx-form.cjs.entry.js +169 -41
  6. package/dist/cjs/tttx-icon.cjs.entry.js +2 -2
  7. package/dist/cjs/tttx-list.cjs.entry.js +198 -0
  8. package/dist/cjs/tttx-loading-spinner.cjs.entry.js +4 -4
  9. package/dist/cjs/tttx-popover-content.cjs.entry.js +2 -2
  10. package/dist/cjs/tttx-standalone-input.cjs.entry.js +134 -0
  11. package/dist/cjs/tttx.cjs.js +3 -7
  12. package/dist/collection/collection-manifest.json +4 -3
  13. package/dist/collection/components/atoms/tttx-button/tttx-button.css +1 -0
  14. package/dist/collection/components/atoms/tttx-button/tttx-button.stories.js +3 -3
  15. package/dist/collection/components/atoms/tttx-icon/tttx-icon.css +3 -3
  16. package/dist/collection/components/atoms/tttx-icon/tttx-icon.stories.js +15 -15
  17. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.css +1 -1
  18. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.js +2 -2
  19. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.stories.js +1 -1
  20. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.js +1 -1
  21. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.stories.js +3 -3
  22. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.css +85 -39
  23. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.js +1 -1
  24. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.stories.js +5 -5
  25. package/dist/collection/components/molecules/tttx-form/tttx-form.css +230 -0
  26. package/dist/collection/components/molecules/tttx-form/tttx-form.js +195 -55
  27. package/dist/collection/components/molecules/tttx-form/tttx-form.stories.js +97 -28
  28. package/dist/collection/components/molecules/tttx-list/tttx-list.css +56 -0
  29. package/dist/collection/components/molecules/tttx-list/tttx-list.js +311 -0
  30. package/dist/collection/components/molecules/tttx-list/tttx-list.stories.js +37 -0
  31. package/dist/collection/components/molecules/{tttx-input/tttx-input.css → tttx-standalone-input/tttx-standalone-input.css} +77 -49
  32. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.js +561 -0
  33. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.stories.js +156 -0
  34. package/dist/collection/components/palette.stories.js +81 -81
  35. package/dist/collection/docs/gettingstarted-developer.stories.js +4 -4
  36. package/dist/components/index.d.ts +2 -10
  37. package/dist/components/index.js +3 -2
  38. package/dist/components/tttx-button.js +1 -1
  39. package/dist/components/tttx-checkbox.js +2 -2
  40. package/dist/components/tttx-form.js +167 -39
  41. package/dist/components/tttx-icon2.js +1 -1
  42. package/dist/components/{tttx-input.d.ts → tttx-list.d.ts} +4 -4
  43. package/dist/components/tttx-list.js +225 -0
  44. package/dist/components/tttx-loading-spinner.js +1 -38
  45. package/dist/components/tttx-loading-spinner2.js +40 -0
  46. package/dist/components/tttx-popover-content.js +1 -1
  47. package/dist/components/tttx-standalone-input.d.ts +11 -0
  48. package/dist/components/tttx-standalone-input.js +178 -0
  49. package/dist/esm/{index-9654537d.js → index-d8718abe.js} +44 -88
  50. package/dist/esm/loader.js +3 -4
  51. package/dist/esm/polyfills/css-shim.js +1 -1
  52. package/dist/esm/tttx-button.entry.js +2 -2
  53. package/dist/esm/tttx-checkbox.entry.js +3 -3
  54. package/dist/esm/tttx-form.entry.js +169 -41
  55. package/dist/esm/tttx-icon.entry.js +2 -2
  56. package/dist/esm/tttx-list.entry.js +194 -0
  57. package/dist/esm/tttx-loading-spinner.entry.js +4 -4
  58. package/dist/esm/tttx-popover-content.entry.js +2 -2
  59. package/dist/esm/tttx-standalone-input.entry.js +130 -0
  60. package/dist/esm/tttx.js +3 -4
  61. package/dist/tttx/p-1b6b4223.entry.js +1 -0
  62. package/dist/tttx/p-1ea7e424.entry.js +1 -0
  63. package/dist/tttx/{p-3cb692d6.entry.js → p-629411bc.entry.js} +1 -1
  64. package/dist/tttx/p-7d84c410.entry.js +1 -0
  65. package/dist/tttx/p-80bbe164.js +2 -0
  66. package/dist/tttx/{p-1884203f.entry.js → p-daa82b1b.entry.js} +1 -1
  67. package/dist/tttx/p-db1f56ba.entry.js +1 -0
  68. package/dist/tttx/p-dee50f14.entry.js +1 -0
  69. package/dist/tttx/{p-674e2f18.entry.js → p-e5c02c27.entry.js} +1 -1
  70. package/dist/tttx/tttx.esm.js +1 -1
  71. package/dist/types/components/molecules/tttx-form/tttx-form.d.ts +14 -7
  72. package/dist/types/components/molecules/tttx-form/tttx-form.stories.d.ts +1 -8
  73. package/dist/types/components/molecules/tttx-list/tttx-list.d.ts +51 -0
  74. package/dist/types/components/molecules/tttx-list/tttx-list.stories.d.ts +13 -0
  75. package/dist/types/components/molecules/tttx-standalone-input/tttx-standalone-input.d.ts +38 -0
  76. package/dist/types/components/molecules/tttx-standalone-input/tttx-standalone-input.stories.d.ts +106 -0
  77. package/dist/types/components.d.ts +88 -39
  78. package/dist/types/stencil-public-runtime.d.ts +3 -59
  79. package/loader/index.d.ts +0 -9
  80. package/package.json +67 -65
  81. package/readme.md +89 -86
  82. package/dist/cjs/tttx-input.cjs.entry.js +0 -44
  83. package/dist/collection/components/molecules/tttx-input/tttx-input.js +0 -259
  84. package/dist/collection/components/molecules/tttx-input/tttx-input.stories.js +0 -106
  85. package/dist/components/tttx-input.js +0 -77
  86. package/dist/esm/tttx-input.entry.js +0 -40
  87. package/dist/tttx/p-317b13d3.entry.js +0 -1
  88. package/dist/tttx/p-3cd7ad04.entry.js +0 -1
  89. package/dist/tttx/p-b6cc2780.js +0 -2
  90. package/dist/tttx/p-f30a0e84.entry.js +0 -1
  91. package/dist/tttx/p-f4855113.entry.js +0 -1
  92. package/dist/types/components/molecules/tttx-input/tttx-input.d.ts +0 -20
  93. package/dist/types/components/molecules/tttx-input/tttx-input.stories.d.ts +0 -60
@@ -0,0 +1,311 @@
1
+ import { h, Host } from "@stencil/core";
2
+ export class TttxList {
3
+ constructor() {
4
+ this.rowCount = 0;
5
+ this.name = undefined;
6
+ this.selectable = undefined;
7
+ this.items = [];
8
+ this.selectedIds = [];
9
+ this.loading = true;
10
+ this.lastPage = false;
11
+ }
12
+ listLoadHandler(event) {
13
+ if (event.detail.name !== this.name)
14
+ return;
15
+ this.items = [...this.items, ...event.detail.items];
16
+ this.loading = false;
17
+ this.lastPage = event.detail.lastPage;
18
+ this.renderRows(event.detail.items);
19
+ if (this.scrollableParent.clientHeight === this.scrollableParent.scrollHeight)
20
+ this.listPaginateHandler();
21
+ }
22
+ listPaginateHandler() {
23
+ // We don't want to emit an event to load the next page if this is the last page, or if we're already loading
24
+ if (this.lastPage || this.loading)
25
+ return;
26
+ this.loading = true;
27
+ this.listPaginate.emit({ name: this.name });
28
+ }
29
+ listClearDataCacheHandler(event) {
30
+ if (event.detail.name !== this.name)
31
+ return;
32
+ this.items = [];
33
+ this.selectedIds = [];
34
+ this.listItemContainer()
35
+ .querySelectorAll(".tttx-list__row")
36
+ .forEach((node) => {
37
+ node.remove();
38
+ });
39
+ this.rowCount = 0;
40
+ this.lastPage = false;
41
+ this.loading = false;
42
+ }
43
+ listActionSelectedEventHandler(event) {
44
+ if (event.detail.name !== this.name || !this.selectable || this.selectedIds.length === 0)
45
+ return;
46
+ const selectedRows = this.selectedIds.map(id => {
47
+ return this.items[id];
48
+ });
49
+ if (event.detail.removeRows)
50
+ this.removeSelectedRows();
51
+ this.listSelectedEvent.emit({
52
+ name: this.name,
53
+ eventName: event.detail.eventName,
54
+ selectedRows,
55
+ });
56
+ }
57
+ removeSelectedRows() {
58
+ const orderedSelectedIds = [...this.selectedIds].sort((a, b) => {
59
+ return b - a;
60
+ });
61
+ orderedSelectedIds.forEach(itemIndex => {
62
+ this.items.splice(itemIndex, 1);
63
+ this.listItemContainer().removeChild(this.listItemContainer().querySelector(`[data-row-id="${itemIndex}"]`));
64
+ // If this removes the scrollbar and we're not on the last page, load in a new page
65
+ if (this.scrollableParent.clientHeight === this.scrollableParent.scrollHeight)
66
+ this.listPaginateHandler();
67
+ });
68
+ // Empty selected ids with mutation rather than assignment to avoid unecessary component rerender
69
+ this.selectedIds.splice(0, this.selectedIds.length);
70
+ }
71
+ listItemClickHandler(itemData) {
72
+ if (this.selectedIds.length !== 0)
73
+ return;
74
+ this.listItemClick.emit({ itemData, name: this.name });
75
+ }
76
+ componentWillLoad() {
77
+ this.template = this.host.querySelector("template");
78
+ this.scrollableParent = this.getScrollableParent(this.host);
79
+ const scrollableContext = this.scrollableParent === document.scrollingElement ? document : this.scrollableParent;
80
+ scrollableContext.addEventListener("scroll", this.scrollHandler.bind(this));
81
+ window.addEventListener("resize", this.scrollHandler.bind(this));
82
+ }
83
+ componentDidLoad() {
84
+ // Emit event to load first page
85
+ this.listPaginate.emit({ name: this.name });
86
+ }
87
+ listItemContainer() {
88
+ return this.host.shadowRoot.querySelector(".list-item-container");
89
+ }
90
+ async scrollHandler() {
91
+ const { clientHeight, scrollTop, scrollHeight } = this.scrollableParent;
92
+ if (Math.abs(scrollHeight - clientHeight - scrollTop) < 26)
93
+ this.listPaginateHandler();
94
+ }
95
+ isScrollable(node) {
96
+ const hasScrollbar = ["scroll", "auto"].includes(node.style.overflowY);
97
+ return hasScrollbar;
98
+ }
99
+ getScrollableParent(node) {
100
+ if (!node || node === document.body) {
101
+ return document.scrollingElement;
102
+ }
103
+ else {
104
+ return this.isScrollable(node) ? node : this.getScrollableParent(node.parentElement);
105
+ }
106
+ }
107
+ appendRowCheckbox(rowContainer) {
108
+ if (!this.selectable)
109
+ return;
110
+ const rowId = this.rowCount;
111
+ const checkbox = document.createElement("input");
112
+ checkbox.setAttribute("type", "checkbox");
113
+ checkbox.addEventListener("click", e => {
114
+ e.stopPropagation();
115
+ if (e.target.checked) {
116
+ this.selectedIds = [...this.selectedIds, rowId];
117
+ rowContainer.classList.add("selected");
118
+ }
119
+ else {
120
+ this.selectedIds = this.selectedIds.filter(id => {
121
+ return id !== rowId;
122
+ });
123
+ rowContainer.classList.remove("selected");
124
+ }
125
+ });
126
+ rowContainer.setAttribute("data-row-id", `${rowId}`);
127
+ this.rowCount++;
128
+ rowContainer.appendChild(checkbox);
129
+ }
130
+ appendSeededTemplate(rowData, rowContainer) {
131
+ this.template.childNodes.forEach(child => {
132
+ const clone = child.cloneNode(false);
133
+ if (clone.getAttribute("data-fields")) {
134
+ const fields = clone.getAttribute("data-fields").replace(/\s/g, "").split(",");
135
+ const filteredRowData = Object.fromEntries(fields.map((field) => {
136
+ return [field, rowData[field]];
137
+ }));
138
+ clone.setAttribute("row-data", JSON.stringify(filteredRowData));
139
+ }
140
+ else {
141
+ clone.setAttribute("row-data", JSON.stringify(rowData));
142
+ }
143
+ rowContainer.appendChild(clone);
144
+ });
145
+ }
146
+ appendGenericTemplate(rowData, rowContainer) {
147
+ const row = document.createElement("div");
148
+ row.classList.add("generic-template__content");
149
+ row.textContent = rowData.text;
150
+ rowContainer.appendChild(row);
151
+ if (!rowData.icon)
152
+ return;
153
+ const icon = document.createElement("span");
154
+ icon.classList.add("material-symbols-rounded");
155
+ icon.textContent = rowData.icon;
156
+ if (rowData.iconColor)
157
+ icon.style["color"] = rowData.iconColor;
158
+ row.prepend(icon);
159
+ }
160
+ row(rowData) {
161
+ const rowContainer = document.createElement("div");
162
+ rowContainer.classList.add("tttx-list__row");
163
+ rowContainer.addEventListener("click", () => {
164
+ this.listItemClickHandler(rowData);
165
+ });
166
+ this.appendRowCheckbox(rowContainer);
167
+ this.template ? this.appendSeededTemplate(rowData, rowContainer) : this.appendGenericTemplate(rowData, rowContainer);
168
+ return rowContainer;
169
+ }
170
+ renderRows(batchData) {
171
+ batchData.forEach(rowData => {
172
+ this.listItemContainer().appendChild(this.row(rowData));
173
+ });
174
+ }
175
+ loadIndicator() {
176
+ if (!this.loading)
177
+ return;
178
+ return h("div", { class: "load-indicator" }, h("tttx-loading-spinner", { size: 'large' }));
179
+ }
180
+ render() {
181
+ return (h(Host, null, h("div", { class: "list-item-container", tabindex: "0" }, !this.loading && this.items.length === 0 ? "No data to display" : undefined), this.loadIndicator()));
182
+ }
183
+ static get is() { return "tttx-list"; }
184
+ static get encapsulation() { return "shadow"; }
185
+ static get originalStyleUrls() {
186
+ return {
187
+ "$": ["tttx-list.scss"]
188
+ };
189
+ }
190
+ static get styleUrls() {
191
+ return {
192
+ "$": ["tttx-list.css"]
193
+ };
194
+ }
195
+ static get properties() {
196
+ return {
197
+ "name": {
198
+ "type": "string",
199
+ "mutable": false,
200
+ "complexType": {
201
+ "original": "string",
202
+ "resolved": "string",
203
+ "references": {}
204
+ },
205
+ "required": false,
206
+ "optional": false,
207
+ "docs": {
208
+ "tags": [],
209
+ "text": ""
210
+ },
211
+ "attribute": "name",
212
+ "reflect": false
213
+ },
214
+ "selectable": {
215
+ "type": "boolean",
216
+ "mutable": false,
217
+ "complexType": {
218
+ "original": "boolean",
219
+ "resolved": "boolean",
220
+ "references": {}
221
+ },
222
+ "required": false,
223
+ "optional": false,
224
+ "docs": {
225
+ "tags": [],
226
+ "text": ""
227
+ },
228
+ "attribute": "selectable",
229
+ "reflect": false
230
+ }
231
+ };
232
+ }
233
+ static get states() {
234
+ return {
235
+ "items": {},
236
+ "selectedIds": {},
237
+ "loading": {},
238
+ "lastPage": {}
239
+ };
240
+ }
241
+ static get events() {
242
+ return [{
243
+ "method": "listPaginate",
244
+ "name": "listPaginate",
245
+ "bubbles": true,
246
+ "cancelable": true,
247
+ "composed": true,
248
+ "docs": {
249
+ "tags": [],
250
+ "text": ""
251
+ },
252
+ "complexType": {
253
+ "original": "any",
254
+ "resolved": "any",
255
+ "references": {}
256
+ }
257
+ }, {
258
+ "method": "listSelectedEvent",
259
+ "name": "listSelectedEvent",
260
+ "bubbles": true,
261
+ "cancelable": true,
262
+ "composed": true,
263
+ "docs": {
264
+ "tags": [],
265
+ "text": ""
266
+ },
267
+ "complexType": {
268
+ "original": "any",
269
+ "resolved": "any",
270
+ "references": {}
271
+ }
272
+ }, {
273
+ "method": "listItemClick",
274
+ "name": "listItemClick",
275
+ "bubbles": true,
276
+ "cancelable": true,
277
+ "composed": true,
278
+ "docs": {
279
+ "tags": [],
280
+ "text": ""
281
+ },
282
+ "complexType": {
283
+ "original": "any",
284
+ "resolved": "any",
285
+ "references": {}
286
+ }
287
+ }];
288
+ }
289
+ static get elementRef() { return "host"; }
290
+ static get listeners() {
291
+ return [{
292
+ "name": "listPageLoad",
293
+ "method": "listLoadHandler",
294
+ "target": "document",
295
+ "capture": false,
296
+ "passive": false
297
+ }, {
298
+ "name": "listClearDataCache",
299
+ "method": "listClearDataCacheHandler",
300
+ "target": "document",
301
+ "capture": false,
302
+ "passive": false
303
+ }, {
304
+ "name": "listActionSelectedEvent",
305
+ "method": "listActionSelectedEventHandler",
306
+ "target": "document",
307
+ "capture": false,
308
+ "passive": false
309
+ }];
310
+ }
311
+ }
@@ -0,0 +1,37 @@
1
+ export default {
2
+ title: "molecules/List",
3
+ component: "tttx-list",
4
+ argTypes: {
5
+ selectable: {
6
+ control: {
7
+ type: "boolean"
8
+ }
9
+ }
10
+ }
11
+ };
12
+ export const ListWithGenericTemplate = (args) => {
13
+ return `
14
+ <script>
15
+ function loadPage (event) {
16
+ const page = new CustomEvent('listPageLoad', {
17
+ detail: {
18
+ name: 'listWithGenericTemplate',
19
+ lastPage: true,
20
+ items: [
21
+ { text: 'Row with only text' },
22
+ { text: 'Row with text and an icon', icon: 'sentiment_calm' },
23
+ { text: 'Row with text and a coloured icon', icon: 'check_circle', iconColor: 'blue' },
24
+ ]
25
+ }
26
+ });
27
+ document.dispatchEvent(page);
28
+
29
+ // Stop this event handler from being duplicated every time the storybook iframe is reloaded
30
+ document.removeEventListener("listPaginate", loadPage);
31
+ }
32
+ document.addEventListener("listPaginate", loadPage);
33
+ </script>
34
+
35
+ <tttx-list ${args.selectable ? "selectable" : ""} name='listWithGenericTemplate' />
36
+ `;
37
+ };
@@ -19,19 +19,6 @@
19
19
  color: #9e9e9e;
20
20
  }
21
21
 
22
- .field {
23
- clear: both;
24
- }
25
-
26
- .container {
27
- display: flex;
28
- flex-wrap: wrap;
29
- box-sizing: border-box;
30
- height: 36px;
31
- border: 1px solid #c8c8c8;
32
- border-radius: 4px;
33
- }
34
-
35
22
  .icon-left,
36
23
  .icon-right {
37
24
  flex-basis: 24px;
@@ -56,13 +43,14 @@
56
43
  margin-right: 4px;
57
44
  }
58
45
 
59
- .input {
60
- flex-grow: 1;
61
- border: none;
62
- outline: none;
63
- font-size: 16px;
64
- padding: 8px 16px;
65
- background-color: transparent;
46
+ .icon-right {
47
+ margin-top: 5px;
48
+ margin-right: 4px;
49
+ }
50
+
51
+ .icon-left {
52
+ margin-top: 5px;
53
+ margin-left: 4px;
66
54
  }
67
55
 
68
56
  .iconleft .input {
@@ -73,22 +61,6 @@
73
61
  padding-right: 4px;
74
62
  }
75
63
 
76
- .label {
77
- display: block;
78
- height: 18px;
79
- font-weight: 600;
80
- color: #212121;
81
- font-size: 16px;
82
- margin-bottom: 4px;
83
- z-index: 1;
84
- }
85
-
86
- .disabled {
87
- background: #f0f0f0;
88
- color: #9e9e9e;
89
- border-color: #c8c8c8;
90
- }
91
-
92
64
  .focused {
93
65
  border-color: #1479c6;
94
66
  }
@@ -105,7 +77,7 @@
105
77
  font-size: 14px;
106
78
  border-radius: none;
107
79
  z-index: 2;
108
- color: #DC0000;
80
+ color: #dc0000;
109
81
  }
110
82
 
111
83
  .errormsg .validationicon {
@@ -114,11 +86,11 @@
114
86
  font-size: 16px;
115
87
  margin-right: 4px;
116
88
  vertical-align: middle;
117
- color: #DC0000;
89
+ color: #dc0000;
118
90
  }
119
91
 
120
92
  .danger {
121
- color: #DC0000;
93
+ color: #dc0000;
122
94
  }
123
95
 
124
96
  .optional {
@@ -126,24 +98,80 @@
126
98
  font-weight: normal;
127
99
  }
128
100
 
129
- :host {
101
+ label.inputBlock {
130
102
  display: block;
103
+ position: relative;
104
+ line-height: 21px;
131
105
  }
132
106
 
133
- .spacing {
134
- margin-bottom: 16px;
107
+ label {
108
+ font-weight: 500;
109
+ font-size: 16px;
110
+ }
111
+
112
+ input:not([type=submit]) {
113
+ font-family: "Roboto", serif;
114
+ box-sizing: border-box;
115
+ width: 100%;
116
+ height: 36px;
117
+ padding: 0 16px;
118
+ font-size: 16px;
119
+ border: 1px solid #d5d5d5;
120
+ border-radius: 4px;
121
+ margin-top: 4px;
135
122
  }
136
123
 
137
- .errorstate {
138
- border-color: #DC0000;
124
+ /* iPhone OS fix */
125
+ input[type=date] {
126
+ background: white;
127
+ display: block;
128
+ min-width: calc(100% - 18px);
129
+ line-height: 37px;
139
130
  }
140
131
 
141
- .icon-right {
142
- margin-top: 5px;
132
+ input.invalid:invalid, input.standalone.invalid {
133
+ border: 1px solid #dc0000;
134
+ }
135
+
136
+ input ~ .errorBubble {
137
+ min-height: 27px;
138
+ position: relative;
139
+ font-size: 14px;
140
+ font-weight: normal;
141
+ width: 100%;
142
+ font-family: "Roboto", sans-serif;
143
+ color: #dc0000;
144
+ display: flex;
145
+ align-content: center;
146
+ align-items: center;
147
+ justify-items: center;
148
+ }
149
+
150
+ input ~ .errorBubble:not(.visible) {
151
+ visibility: hidden;
152
+ }
153
+
154
+ input ~ .errorBubble span {
155
+ color: #dc0000;
156
+ font-size: 16px;
143
157
  margin-right: 4px;
158
+ height: 16px;
144
159
  }
145
160
 
146
- .icon-left {
147
- margin-top: 5px;
148
- margin-left: 4px;
161
+ input.invalid:invalid ~ .errorBubble {
162
+ position: relative;
163
+ font-size: 14px;
164
+ font-weight: normal;
165
+ width: 100%;
166
+ font-family: "Roboto", sans-serif;
167
+ color: #dc0000;
168
+ visibility: visible;
169
+ }
170
+
171
+ input:focus {
172
+ border-color: #1479c6;
173
+ }
174
+
175
+ :host {
176
+ display: block;
149
177
  }