@3t-transform/threeteeui 0.0.15 → 0.0.16

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 (132) hide show
  1. package/dist/cjs/index-864b7110.js +1531 -0
  2. package/dist/cjs/index.cjs.js +2 -0
  3. package/dist/cjs/loader.cjs.js +22 -0
  4. package/dist/cjs/tttx-button.cjs.entry.js +28 -0
  5. package/dist/cjs/tttx-checkbox.cjs.entry.js +28 -0
  6. package/dist/cjs/tttx-form.cjs.entry.js +374 -0
  7. package/dist/cjs/tttx-icon.cjs.entry.js +1863 -0
  8. package/dist/cjs/tttx-list.cjs.entry.js +198 -0
  9. package/dist/cjs/tttx-loading-spinner.cjs.entry.js +26 -0
  10. package/dist/cjs/tttx-popover-content.cjs.entry.js +23 -0
  11. package/dist/cjs/tttx-standalone-input.cjs.entry.js +136 -0
  12. package/dist/cjs/tttx-table.cjs.entry.js +60 -0
  13. package/dist/cjs/tttx.cjs.js +23 -0
  14. package/dist/collection/collection-manifest.json +20 -0
  15. package/dist/collection/components/atoms/tttx-button/tttx-button.css +62 -0
  16. package/dist/collection/components/atoms/tttx-button/tttx-button.js +93 -0
  17. package/dist/collection/components/atoms/tttx-button/tttx-button.stories.js +27 -0
  18. package/dist/collection/components/atoms/tttx-icon/tttx-icon.css +105 -0
  19. package/dist/collection/components/atoms/tttx-icon/tttx-icon.js +116 -0
  20. package/dist/collection/components/atoms/tttx-icon/tttx-icon.stories.js +47 -0
  21. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.css +48 -0
  22. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.js +66 -0
  23. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.stories.js +17 -0
  24. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.css +30 -0
  25. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.js +96 -0
  26. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.stories.js +23 -0
  27. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.css +181 -0
  28. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.js +101 -0
  29. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.stories.js +13 -0
  30. package/dist/collection/components/molecules/tttx-form/tttx-form.css +230 -0
  31. package/dist/collection/components/molecules/tttx-form/tttx-form.js +451 -0
  32. package/dist/collection/components/molecules/tttx-form/tttx-form.stories.js +109 -0
  33. package/dist/collection/components/molecules/tttx-list/tttx-list.css +56 -0
  34. package/dist/collection/components/molecules/tttx-list/tttx-list.js +311 -0
  35. package/dist/collection/components/molecules/tttx-list/tttx-list.stories.js +37 -0
  36. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.css +177 -0
  37. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.js +569 -0
  38. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.stories.js +156 -0
  39. package/dist/collection/components/molecules/tttx-table/tttx-table.css +166 -0
  40. package/dist/collection/components/molecules/tttx-table/tttx-table.js +177 -0
  41. package/dist/collection/components/molecules/tttx-table/tttx-table.stories.js +81 -0
  42. package/dist/collection/components/palette.stories.js +88 -0
  43. package/dist/collection/docs/gettingstarted-developer.stories.js +9 -0
  44. package/dist/collection/icons.js +2838 -0
  45. package/dist/collection/index.js +1 -0
  46. package/dist/components/index.d.ts +39 -0
  47. package/dist/components/index.js +10 -0
  48. package/dist/components/tttx-button.d.ts +11 -0
  49. package/dist/components/tttx-button.js +45 -0
  50. package/dist/components/tttx-checkbox.d.ts +11 -0
  51. package/dist/components/tttx-checkbox.js +46 -0
  52. package/dist/components/tttx-form.d.ts +11 -0
  53. package/dist/components/tttx-form.js +391 -0
  54. package/dist/components/tttx-icon.d.ts +11 -0
  55. package/dist/components/tttx-icon.js +6 -0
  56. package/dist/components/tttx-icon2.js +1877 -0
  57. package/dist/components/tttx-list.d.ts +11 -0
  58. package/dist/components/tttx-list.js +225 -0
  59. package/dist/components/tttx-loading-spinner.d.ts +11 -0
  60. package/dist/components/tttx-loading-spinner.js +6 -0
  61. package/dist/components/tttx-loading-spinner2.js +40 -0
  62. package/dist/components/tttx-popover-content.d.ts +11 -0
  63. package/dist/components/tttx-popover-content.js +6 -0
  64. package/dist/components/tttx-popover-content2.js +39 -0
  65. package/dist/components/tttx-standalone-input.d.ts +11 -0
  66. package/dist/components/tttx-standalone-input.js +179 -0
  67. package/dist/components/tttx-table.d.ts +11 -0
  68. package/dist/components/tttx-table.js +91 -0
  69. package/dist/esm/index-232e347b.js +1502 -0
  70. package/dist/esm/index.js +1 -0
  71. package/dist/esm/loader.js +18 -0
  72. package/dist/esm/polyfills/core-js.js +11 -0
  73. package/dist/esm/polyfills/css-shim.js +1 -0
  74. package/dist/esm/polyfills/dom.js +79 -0
  75. package/dist/esm/polyfills/es5-html-element.js +1 -0
  76. package/dist/esm/polyfills/index.js +34 -0
  77. package/dist/esm/polyfills/system.js +6 -0
  78. package/dist/esm/tttx-button.entry.js +24 -0
  79. package/dist/esm/tttx-checkbox.entry.js +24 -0
  80. package/dist/esm/tttx-form.entry.js +370 -0
  81. package/dist/esm/tttx-icon.entry.js +1859 -0
  82. package/dist/esm/tttx-list.entry.js +194 -0
  83. package/dist/esm/tttx-loading-spinner.entry.js +22 -0
  84. package/dist/esm/tttx-popover-content.entry.js +19 -0
  85. package/dist/esm/tttx-standalone-input.entry.js +132 -0
  86. package/dist/esm/tttx-table.entry.js +56 -0
  87. package/dist/esm/tttx.js +18 -0
  88. package/dist/index.cjs.js +1 -0
  89. package/dist/index.js +1 -0
  90. package/dist/tttx/index.esm.js +0 -0
  91. package/dist/tttx/p-01e1894e.entry.js +1 -0
  92. package/dist/tttx/p-10316ff1.entry.js +1 -0
  93. package/dist/tttx/p-125f06b3.entry.js +1 -0
  94. package/dist/tttx/p-184c4fae.js +2 -0
  95. package/dist/tttx/p-3973b7dd.entry.js +1 -0
  96. package/dist/tttx/p-5ce1ba22.entry.js +1 -0
  97. package/dist/tttx/p-6828fe6f.entry.js +1 -0
  98. package/dist/tttx/p-b1c22f5f.entry.js +1 -0
  99. package/dist/tttx/p-c7f9be65.entry.js +1 -0
  100. package/dist/tttx/p-fe4c70b2.entry.js +1 -0
  101. package/dist/tttx/tttx.esm.js +1 -0
  102. package/dist/types/components/atoms/tttx-button/tttx-button.d.ts +9 -0
  103. package/dist/types/components/atoms/tttx-button/tttx-button.stories.d.ts +20 -0
  104. package/dist/types/components/atoms/tttx-icon/tttx-icon.d.ts +14 -0
  105. package/dist/types/components/atoms/tttx-icon/tttx-icon.stories.d.ts +21 -0
  106. package/dist/types/components/atoms/tttx-loading-spinner/tttx-loading-spinner.d.ts +6 -0
  107. package/dist/types/components/atoms/tttx-loading-spinner/tttx-loading-spinner.stories.d.ts +17 -0
  108. package/dist/types/components/atoms/tttx-popover-content/tttx-popover-content.d.ts +7 -0
  109. package/dist/types/components/atoms/tttx-popover-content/tttx-popover-content.stories.d.ts +18 -0
  110. package/dist/types/components/atoms/ttx-checkbox/tttx-checkbox.d.ts +9 -0
  111. package/dist/types/components/atoms/ttx-checkbox/tttx-checkbox.stories.d.ts +6 -0
  112. package/dist/types/components/molecules/tttx-form/tttx-form.d.ts +134 -0
  113. package/dist/types/components/molecules/tttx-form/tttx-form.stories.d.ts +12 -0
  114. package/dist/types/components/molecules/tttx-list/tttx-list.d.ts +51 -0
  115. package/dist/types/components/molecules/tttx-list/tttx-list.stories.d.ts +13 -0
  116. package/dist/types/components/molecules/tttx-standalone-input/tttx-standalone-input.d.ts +38 -0
  117. package/dist/types/components/molecules/tttx-standalone-input/tttx-standalone-input.stories.d.ts +106 -0
  118. package/dist/types/components/molecules/tttx-table/tttx-table.d.ts +15 -0
  119. package/dist/types/components/molecules/tttx-table/tttx-table.stories.d.ts +21 -0
  120. package/dist/types/components/palette.stories.d.ts +6 -0
  121. package/dist/types/components.d.ts +264 -0
  122. package/dist/types/docs/gettingstarted-developer.stories.d.ts +5 -0
  123. package/dist/types/icons.d.ts +2 -0
  124. package/dist/types/index.d.ts +1 -0
  125. package/dist/types/stencil-public-runtime.d.ts +1637 -0
  126. package/loader/cdn.js +3 -0
  127. package/loader/index.cjs.js +3 -0
  128. package/loader/index.d.ts +21 -0
  129. package/loader/index.es2017.js +3 -0
  130. package/loader/index.js +4 -0
  131. package/loader/package.json +11 -0
  132. package/package.json +1 -1
@@ -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
+ };
@@ -0,0 +1,177 @@
1
+ .material-symbols-rounded {
2
+ font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 24;
3
+ }
4
+
5
+ .material-symbols-rounded {
6
+ font-family: "Material Symbols Rounded", sans-serif;
7
+ font-weight: 400;
8
+ font-style: normal;
9
+ font-size: 24px;
10
+ line-height: 1;
11
+ letter-spacing: normal;
12
+ text-transform: none;
13
+ display: inline-block;
14
+ white-space: nowrap;
15
+ word-wrap: normal;
16
+ direction: ltr;
17
+ text-rendering: optimizeLegibility;
18
+ -webkit-font-smoothing: antialiased;
19
+ color: #9e9e9e;
20
+ }
21
+
22
+ .icon-left,
23
+ .icon-right {
24
+ flex-basis: 24px;
25
+ }
26
+
27
+ .icon-left span,
28
+ .icon-right span {
29
+ font-size: 24px;
30
+ line-height: 24px;
31
+ text-align: center;
32
+ display: block;
33
+ width: 24px;
34
+ height: 24px;
35
+ margin-top: 4px;
36
+ }
37
+
38
+ .icon-left span {
39
+ margin-left: 4px;
40
+ }
41
+
42
+ .icon-right span {
43
+ margin-right: 4px;
44
+ }
45
+
46
+ .icon-right {
47
+ margin-top: 5px;
48
+ margin-right: 4px;
49
+ }
50
+
51
+ .icon-left {
52
+ margin-top: 5px;
53
+ margin-left: 4px;
54
+ }
55
+
56
+ .iconleft .input {
57
+ padding-left: 4px;
58
+ }
59
+
60
+ .iconright .input {
61
+ padding-right: 4px;
62
+ }
63
+
64
+ .focused {
65
+ border-color: #1479c6;
66
+ }
67
+
68
+ .errormsg {
69
+ display: flex;
70
+ justify-content: center;
71
+ align-items: center;
72
+ float: left;
73
+ margin-bottom: 16px;
74
+ box-sizing: border-box;
75
+ background-color: transparent;
76
+ height: 26px;
77
+ font-size: 14px;
78
+ border-radius: none;
79
+ z-index: 2;
80
+ color: #dc0000;
81
+ }
82
+
83
+ .errormsg .validationicon {
84
+ width: 16px;
85
+ height: 16px;
86
+ font-size: 16px;
87
+ margin-right: 4px;
88
+ vertical-align: middle;
89
+ color: #dc0000;
90
+ }
91
+
92
+ .danger {
93
+ color: #dc0000;
94
+ }
95
+
96
+ .optional {
97
+ color: #757575;
98
+ font-weight: normal;
99
+ }
100
+
101
+ label.inputBlock {
102
+ display: block;
103
+ position: relative;
104
+ line-height: 21px;
105
+ }
106
+
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;
122
+ }
123
+
124
+ /* iPhone OS fix */
125
+ input[type=date] {
126
+ background: white;
127
+ display: block;
128
+ min-width: calc(100% - 18px);
129
+ line-height: 37px;
130
+ }
131
+
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;
157
+ margin-right: 4px;
158
+ height: 16px;
159
+ }
160
+
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;
177
+ }