@descope/web-components-ui 1.0.222 → 1.0.224

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 (85) hide show
  1. package/dist/cjs/index.cjs.js +1145 -739
  2. package/dist/cjs/index.cjs.js.map +1 -1
  3. package/dist/index.esm.js +1264 -752
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/umd/1000.js +1 -1
  6. package/dist/umd/1037.js +2 -0
  7. package/dist/umd/1037.js.LICENSE.txt +5 -0
  8. package/dist/umd/1419.js +360 -0
  9. package/dist/umd/1419.js.LICENSE.txt +23 -0
  10. package/dist/umd/1932.js +310 -0
  11. package/dist/umd/1932.js.LICENSE.txt +5 -0
  12. package/dist/umd/1990.js +3 -3
  13. package/dist/umd/2066.js +2 -0
  14. package/dist/umd/2066.js.LICENSE.txt +5 -0
  15. package/dist/umd/262.js +2 -0
  16. package/dist/umd/262.js.LICENSE.txt +5 -0
  17. package/dist/umd/2873.js +738 -0
  18. package/dist/umd/2873.js.LICENSE.txt +21 -0
  19. package/dist/umd/3003.js +2 -0
  20. package/dist/umd/3003.js.LICENSE.txt +9 -0
  21. package/dist/umd/{9515.js → 3092.js} +88 -88
  22. package/dist/umd/3660.js +17 -0
  23. package/dist/umd/{1883.js.LICENSE.txt → 3660.js.LICENSE.txt} +1 -11
  24. package/dist/umd/422.js +1 -1
  25. package/dist/umd/4222.js +2 -0
  26. package/dist/umd/{1852.js.LICENSE.txt → 4222.js.LICENSE.txt} +0 -30
  27. package/dist/umd/4447.js +2 -1
  28. package/dist/umd/4447.js.LICENSE.txt +5 -0
  29. package/dist/umd/4567.js +1 -0
  30. package/dist/umd/4746.js +123 -0
  31. package/dist/umd/4905.js +2 -0
  32. package/dist/umd/4905.js.LICENSE.txt +5 -0
  33. package/dist/umd/5345.js +94 -0
  34. package/dist/umd/5806.js +1 -1
  35. package/dist/umd/5977.js +289 -0
  36. package/dist/umd/5977.js.LICENSE.txt +17 -0
  37. package/dist/umd/6551.js +1 -0
  38. package/dist/umd/{7101.js → 6770.js} +5 -5
  39. package/dist/umd/6770.js.LICENSE.txt +11 -0
  40. package/dist/umd/7056.js +1 -1
  41. package/dist/umd/{6116.js → 7514.js} +9 -9
  42. package/dist/umd/8725.js +2 -2
  43. package/dist/umd/9189.js +2 -0
  44. package/dist/umd/9189.js.LICENSE.txt +5 -0
  45. package/dist/umd/9211.js +2 -2
  46. package/dist/umd/9437.js +1 -1
  47. package/dist/umd/9629.js +2 -0
  48. package/dist/umd/9629.js.LICENSE.txt +5 -0
  49. package/dist/umd/9671.js +1 -0
  50. package/dist/umd/9680.js +2 -0
  51. package/dist/umd/9680.js.LICENSE.txt +5 -0
  52. package/dist/umd/boolean-fields-descope-checkbox-index-js.js +1 -1
  53. package/dist/umd/boolean-fields-descope-switch-toggle-index-js.js +1 -1
  54. package/dist/umd/descope-combo-box-index-js.js +1 -1
  55. package/dist/umd/descope-grid-descope-grid-selection-column-index-js.js +1 -0
  56. package/dist/umd/descope-grid-descope-grid-status-column-index-js.js +1 -0
  57. package/dist/umd/descope-grid-descope-grid-text-column-index-js.js +1 -0
  58. package/dist/umd/descope-grid-index-js.js +1 -0
  59. package/dist/umd/descope-modal-index-js.js +1 -0
  60. package/dist/umd/descope-text-area-index-js.js +1 -1
  61. package/dist/umd/index.js +1 -1
  62. package/package.json +4 -2
  63. package/src/components/descope-grid/GridClass.js +226 -0
  64. package/src/components/descope-grid/descope-grid-selection-column/index.js +68 -0
  65. package/src/components/descope-grid/descope-grid-status-column/index.js +34 -0
  66. package/src/components/descope-grid/descope-grid-text-column/index.js +11 -0
  67. package/src/components/descope-grid/helpers.js +9 -0
  68. package/src/components/descope-grid/index.js +10 -0
  69. package/src/components/descope-modal/ModalClass.js +109 -0
  70. package/src/components/descope-modal/index.js +6 -0
  71. package/src/index.cjs.js +1 -0
  72. package/src/index.js +1 -0
  73. package/src/mixins/createStyleMixin/helpers.js +2 -2
  74. package/src/mixins/createStyleMixin/index.js +2 -2
  75. package/src/mixins/portalMixin.js +24 -4
  76. package/src/theme/components/grid.js +38 -0
  77. package/src/theme/components/index.js +4 -0
  78. package/src/theme/components/modal.js +16 -0
  79. package/dist/umd/1852.js +0 -375
  80. package/dist/umd/1883.js +0 -289
  81. package/dist/umd/4767.js +0 -215
  82. /package/dist/umd/{7101.js.LICENSE.txt → 3092.js.LICENSE.txt} +0 -0
  83. /package/dist/umd/{4767.js.LICENSE.txt → 4746.js.LICENSE.txt} +0 -0
  84. /package/dist/umd/{9515.js.LICENSE.txt → 5345.js.LICENSE.txt} +0 -0
  85. /package/dist/umd/{6116.js.LICENSE.txt → 7514.js.LICENSE.txt} +0 -0
@@ -0,0 +1,226 @@
1
+ import { compose } from '../../helpers';
2
+ import { getComponentName } from '../../helpers/componentHelpers';
3
+ import {
4
+ createStyleMixin,
5
+ draggableMixin,
6
+ createProxy,
7
+ componentNameValidationMixin,
8
+ } from '../../mixins';
9
+
10
+ import { isValidDataType } from './helpers';
11
+
12
+ export const componentName = getComponentName('grid');
13
+
14
+ const GridMixin = (superclass) =>
15
+ class GridMixinClass extends superclass {
16
+ #columns;
17
+
18
+ init() {
19
+ super.init?.();
20
+ this.handleColumns();
21
+ this.forwardSelectedItemsChange();
22
+ }
23
+
24
+ forwardSelectedItemsChange() {
25
+ this.baseElement.addEventListener('selected-items-changed', (e) => {
26
+ this.dispatchEvent(
27
+ new CustomEvent('selected-items-changed', {
28
+ bubbles: true,
29
+ composed: true,
30
+ detail: e.detail,
31
+ })
32
+ );
33
+ });
34
+ }
35
+
36
+ attributeChangedCallback(attrName, oldValue, newValue) {
37
+ super.attributeChangedCallback?.(attrName, oldValue, newValue);
38
+
39
+ if (attrName === 'columns') {
40
+ this.setColumnsDataFromAttr();
41
+ }
42
+ }
43
+
44
+ handleColumns() {
45
+ if (this.columnsAttr) {
46
+ this.setColumnsDataFromAttr();
47
+ } else if (this.children.length) {
48
+ this.setColumnsFromChildren();
49
+ }
50
+ }
51
+
52
+ setColumnsFromChildren() {
53
+ this.#columns = Array.from(this.children).map((child) => {
54
+ return {
55
+ path: child.getAttribute('path'),
56
+ header: child.getAttribute('header'),
57
+ type: child.localName.match('^descope-grid-(\\w+)-column$')?.[1] || 'text',
58
+
59
+ attrs: ['frozen', 'resizable', 'auto-width', 'status'].reduce((acc, attrName) => {
60
+ const attrVal = child.getAttribute(attrName);
61
+
62
+ if (attrVal) {
63
+ acc[attrName] = attrVal;
64
+ }
65
+
66
+ return acc;
67
+ }, {}),
68
+ };
69
+ });
70
+ }
71
+
72
+ get columnsAttr() {
73
+ return this.getAttribute('columns');
74
+ }
75
+
76
+ setColumnsDataFromAttr() {
77
+ try {
78
+ const data = JSON.parse(this.columnsAttr);
79
+ if (isValidDataType(data)) {
80
+ this.columns = data;
81
+ }
82
+ } catch (e) {
83
+ // eslint-disable-next-line no-console
84
+ console.error('could not parse data string from attribute "columns" -', e.message);
85
+ }
86
+ }
87
+
88
+ // eslint-disable-next-line class-methods-use-this
89
+ #renderColumn = ({ path, header, type, attrs }) => {
90
+ const colAttrs = Object.entries(attrs)
91
+ .map(([key, value]) => `${key}="${value}"`)
92
+ .join(' ');
93
+
94
+ const tagName = `descope-grid-${type}-column`;
95
+
96
+ return `<${tagName} header="${header}" path="${path}" ${colAttrs}></${tagName}>`;
97
+ };
98
+
99
+ get renderColumn() {
100
+ return this.#renderColumn;
101
+ }
102
+
103
+ set renderColumn(renderFn) {
104
+ this.#renderColumn = renderFn;
105
+ this.renderColumns();
106
+ }
107
+
108
+ getColumnsTemplate() {
109
+ return this.#columns?.reduce?.(
110
+ (acc, item) => acc + (this.renderColumn?.(item || {}) || ''),
111
+ ''
112
+ );
113
+ }
114
+
115
+ renderColumns() {
116
+ const template = this.getColumnsTemplate();
117
+ if (template) this.innerHTML = template;
118
+ }
119
+
120
+ get grid() {
121
+ return this.shadowRoot.querySelector('vaadin-grid');
122
+ }
123
+
124
+ get data() {
125
+ return this.grid.items;
126
+ }
127
+
128
+ set data(data) {
129
+ if (isValidDataType(data) && this.grid.items !== data) {
130
+ this.grid.items = data;
131
+
132
+ if (this.grid.selectedItems) {
133
+ const itemsIds = new Set(
134
+ this.grid.items.map((item) => item[this.uniqueColumnId] ?? item)
135
+ );
136
+ this.grid.selectedItems = this.grid.selectedItems.filter((selectedItem) =>
137
+ itemsIds.has(selectedItem[this.uniqueColumnId] ?? selectedItem)
138
+ );
139
+ }
140
+ }
141
+ }
142
+
143
+ get columns() {
144
+ return this.#columns;
145
+ }
146
+
147
+ set columns(data) {
148
+ this.#columns = data;
149
+ this.renderColumns();
150
+ }
151
+
152
+ get paths() {
153
+ return this.columns.map((col) => col.path);
154
+ }
155
+
156
+ get uniqueColumnId() {
157
+ return this.getAttribute('unique-column-id');
158
+ }
159
+ };
160
+
161
+ const {
162
+ host,
163
+ headerRow,
164
+ contentRow,
165
+ firstRow,
166
+ sortIndicators,
167
+ activeSortIndicator,
168
+ selectedRow,
169
+ rowSeparator,
170
+ resizeHandle,
171
+ } = {
172
+ host: { selector: () => 'vaadin-grid' },
173
+ headerRow: { selector: () => '::part(header-cell)' },
174
+ contentRow: { selector: () => '::part(cell)' },
175
+ firstRow: { selector: () => '::part(first-header-row-cell)' },
176
+ selectedRow: { selector: () => '::part(selected-row-cell)' },
177
+ sortIndicators: { selector: () => 'vaadin-grid-sorter::part(indicators)' },
178
+ activeSortIndicator: { selector: () => 'vaadin-grid-sorter[direction]' },
179
+ rowSeparator: { selector: () => 'vaadin-grid::part(body-cell)' },
180
+ resizeHandle: { selector: () => '::part(resize-handle)' },
181
+ };
182
+
183
+ export const GridClass = compose(
184
+ createStyleMixin({ componentNameOverride: getComponentName('input-wrapper') }),
185
+ createStyleMixin({
186
+ mappings: {
187
+ hostWidth: { selector: () => ':host', property: 'width' },
188
+ hostHeight: { selector: () => ':host', property: 'height' },
189
+ hostMinHeight: { selector: () => ':host', property: 'min-height' },
190
+ fontFamily: [{ ...headerRow }, { ...contentRow }],
191
+ fontSize: [{ ...headerRow }, { ...contentRow }],
192
+ fontWeight: { ...contentRow },
193
+ valueTextColor: { ...contentRow, property: 'color' },
194
+ sortIndicatorsColor: { ...sortIndicators, property: 'color' },
195
+ activeSortIndicator: { ...activeSortIndicator, property: 'color' },
196
+ inputBorderColor: { ...host, property: 'border-color' },
197
+ inputBorderWidth: { ...host, property: 'border-width' },
198
+ inputBorderStyle: { ...host, property: 'border-style' },
199
+ inputBorderRadius: { ...host, property: 'border-radius' },
200
+ selectedBackgroundColor: { ...selectedRow, property: 'background-color' },
201
+ selectedTextColor: { ...selectedRow, property: 'color' },
202
+ separatorColor: [
203
+ { ...firstRow, property: 'border-bottom-color' },
204
+ { ...rowSeparator, property: 'border-top-color' },
205
+ ],
206
+ resizeHandleColor: { ...resizeHandle, property: 'background-color' },
207
+ },
208
+ }),
209
+ draggableMixin,
210
+ componentNameValidationMixin,
211
+ GridMixin
212
+ )(
213
+ createProxy({
214
+ slots: [''],
215
+ wrappedEleName: 'vaadin-grid',
216
+ style: () => `
217
+ vaadin-grid {
218
+ overflow: hidden;
219
+ height: 100%;
220
+ min-height: 300px;
221
+ }
222
+ `,
223
+ excludeAttrsSync: ['columns', 'tabindex'],
224
+ componentName,
225
+ })
226
+ );
@@ -0,0 +1,68 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ /* eslint-disable no-param-reassign */
3
+ import { GridSelectionColumn } from '@vaadin/grid/vaadin-grid-selection-column';
4
+ import '../../boolean-fields/descope-checkbox';
5
+ import { getComponentName } from '../../../helpers/componentHelpers';
6
+
7
+ export const componentName = getComponentName('grid-selection-column');
8
+
9
+ const createCheckboxEle = () => {
10
+ const checkbox = document.createElement('descope-checkbox');
11
+
12
+ checkbox.setAttribute('bordered', 'true');
13
+ checkbox.setAttribute('size', 'xs');
14
+
15
+ return checkbox;
16
+ };
17
+
18
+ const getIsAllItemsSelected = (grid) => grid.selectedItems.length === grid.items?.length;
19
+
20
+ export class GridSelectionColumnClass extends GridSelectionColumn {
21
+ onInput(grid) {
22
+ if (grid.selectedItems.length === grid.items?.length) {
23
+ grid.selectedItems = [];
24
+ } else {
25
+ grid.selectedItems = grid.items;
26
+ }
27
+ }
28
+
29
+ _headerRenderer(cell) {
30
+ const grid = cell.parentNode;
31
+
32
+ let checkbox = cell.querySelector('descope-checkbox');
33
+ if (!checkbox) {
34
+ checkbox = createCheckboxEle();
35
+
36
+ checkbox.addEventListener('input', () => {
37
+ const isAllItemsSelected = getIsAllItemsSelected(grid);
38
+ if (isAllItemsSelected) {
39
+ grid.selectedItems = [];
40
+ } else {
41
+ grid.selectedItems = grid.items;
42
+ }
43
+ });
44
+
45
+ cell.appendChild(checkbox);
46
+ }
47
+
48
+ checkbox.setAttribute('checked', getIsAllItemsSelected(grid));
49
+ }
50
+
51
+ _defaultRenderer(cell, col, model) {
52
+ const grid = cell.parentNode;
53
+
54
+ let checkbox = cell.querySelector('descope-checkbox');
55
+ if (!checkbox) {
56
+ checkbox = createCheckboxEle();
57
+ cell.appendChild(checkbox);
58
+ }
59
+
60
+ checkbox.onchange = () => {
61
+ checkbox.checked ? grid.selectItem(model.item) : grid.deselectItem(model.item);
62
+ };
63
+
64
+ checkbox.setAttribute('checked', model.selected);
65
+ }
66
+ }
67
+
68
+ customElements.define(componentName, GridSelectionColumnClass);
@@ -0,0 +1,34 @@
1
+ /* eslint-disable no-param-reassign */
2
+ import { GridColumn } from '@vaadin/grid/vaadin-grid-column';
3
+ import { getComponentName } from '../../../helpers/componentHelpers';
4
+
5
+ export const componentName = getComponentName('grid-status-column');
6
+ class GridStatusColumnClass extends GridColumn {
7
+ _defaultRenderer(cell, _col, model) {
8
+ const grid = cell.parentNode;
9
+ const size = grid.getAttribute('size');
10
+
11
+ const contentAttr = this.getAttribute('status');
12
+ if (!contentAttr) {
13
+ cell.innerHTML = model.item[this.path];
14
+ return;
15
+ }
16
+
17
+ const [active, inactive] = contentAttr.split(',');
18
+
19
+ const label = model.item[this.path] ? active : inactive;
20
+ const mode = model.item[this.path] ? 'success' : 'error';
21
+
22
+ cell.innerHTML = `<descope-button
23
+ st-host-height="2.5em"
24
+ mode="${mode}"
25
+ variant="outline"
26
+ size="${size}">
27
+ ${label}
28
+ </descope-button>`;
29
+ }
30
+ }
31
+
32
+ customElements.define(componentName, GridStatusColumnClass);
33
+
34
+ export { GridStatusColumnClass };
@@ -0,0 +1,11 @@
1
+ import { GridColumn } from '@vaadin/grid/vaadin-grid-column';
2
+ import '../../descope-button';
3
+ import { getComponentName } from '../../../helpers/componentHelpers';
4
+
5
+ export const componentName = getComponentName('grid-text-column');
6
+
7
+ class GridTextColumnClass extends GridColumn {}
8
+
9
+ customElements.define(componentName, GridTextColumnClass);
10
+
11
+ export { GridTextColumnClass };
@@ -0,0 +1,9 @@
1
+ export const isValidDataType = (data) => {
2
+ const isValid = Array.isArray(data);
3
+ if (!isValid) {
4
+ // eslint-disable-next-line no-console
5
+ console.error('data must be an array, received:', data);
6
+ }
7
+
8
+ return isValid;
9
+ };
@@ -0,0 +1,10 @@
1
+ import '@vaadin/grid';
2
+ import './descope-grid-text-column';
3
+ import './descope-grid-status-column';
4
+ import './descope-grid-selection-column';
5
+
6
+ import { componentName, GridClass } from './GridClass';
7
+
8
+ customElements.define(componentName, GridClass);
9
+
10
+ export { GridClass };
@@ -0,0 +1,109 @@
1
+ import { compose } from '../../helpers';
2
+ import { forwardAttrs, getComponentName } from '../../helpers/componentHelpers';
3
+ import {
4
+ createStyleMixin,
5
+ draggableMixin,
6
+ createProxy,
7
+ componentNameValidationMixin,
8
+ portalMixin,
9
+ } from '../../mixins';
10
+
11
+ export const componentName = getComponentName('modal');
12
+
13
+ const customMixin = (superclass) =>
14
+ class ModalMixinClass extends superclass {
15
+ get opened() {
16
+ return this.getAttribute('opened') === 'true';
17
+ }
18
+
19
+ handleOpened() {
20
+ forwardAttrs(this, this.baseElement, { includeAttrs: ['opened'] });
21
+ if (this.opened) {
22
+ this.style.display = '';
23
+ } else {
24
+ this.style.display = 'none';
25
+ }
26
+ }
27
+
28
+ init() {
29
+ super.init?.();
30
+ this.style.display = 'none';
31
+
32
+ // vaadin-dialog might not be loaded in time
33
+ // in order to make sure it's loaded before this block is running
34
+ // we are wrapping it with setTimeout
35
+ setTimeout(() => {
36
+ // we want to sync descope-modal content through vaadin-dialog into the overlay
37
+ // so we are adding a slot to the overlay, which allows us to forward the content from
38
+ // vaadin-dialog to vaadin-dialog-overlay
39
+ this.baseElement.shadowRoot
40
+ .querySelector('vaadin-dialog-overlay')
41
+ .appendChild(document.createElement('slot'));
42
+
43
+ this.#overrideOverlaySettings();
44
+
45
+ // we need to always open the modal in `opened=false`
46
+ // to prevent it from rendering outside the dialog
47
+ // first, we have to run `overrideOverlaySettings` to setup
48
+ // the component.
49
+ this.handleOpened();
50
+ });
51
+ }
52
+
53
+ // the default vaadin behavior is to attach the overlay to the body when opened
54
+ // we do not want that because it's difficult to style the overlay in this way
55
+ // so we override it to open inside the shadow DOM
56
+ #overrideOverlaySettings() {
57
+ const overlay = this.baseElement.shadowRoot.querySelector('vaadin-dialog-overlay');
58
+
59
+ overlay._attachOverlay = () => {
60
+ overlay.bringToFront();
61
+ this.baseElement.setAttribute('style', 'display:flex!important;');
62
+ };
63
+ overlay._detachOverlay = () => {
64
+ this.baseElement.style.display = 'none';
65
+ };
66
+ overlay._enterModalState = () => {};
67
+
68
+ overlay.close = () => false;
69
+ }
70
+ };
71
+
72
+ export const ModalClass = compose(
73
+ createStyleMixin({
74
+ mappings: {
75
+ overlayBackgroundColor: { property: () => ModalClass.cssVarList.overlay.backgroundColor },
76
+ overlayShadow: { property: () => ModalClass.cssVarList.overlay.shadow },
77
+ overlayWidth: { property: () => ModalClass.cssVarList.overlay.width },
78
+ },
79
+ }),
80
+ portalMixin({
81
+ name: 'overlay',
82
+ selector: '',
83
+ mappings: {
84
+ hostDisplay: {
85
+ selector: () => ':host(.descope-modal)',
86
+ property: 'display',
87
+ important: true,
88
+ },
89
+ backgroundColor: { selector: () => '::part(content)', property: 'background-color' },
90
+ width: { selector: () => '::part(overlay)', property: 'width' },
91
+ shadow: { selector: () => '::part(overlay)', property: 'box-shadow' },
92
+ },
93
+ forward: {
94
+ include: false,
95
+ attributes: ['opened'],
96
+ },
97
+ }),
98
+ draggableMixin,
99
+ componentNameValidationMixin,
100
+ customMixin
101
+ )(
102
+ createProxy({
103
+ slots: [''],
104
+ wrappedEleName: 'vaadin-dialog',
105
+ style: () => ``,
106
+ excludeAttrsSync: ['tabindex', 'opened'],
107
+ componentName,
108
+ })
109
+ );
@@ -0,0 +1,6 @@
1
+ import '@vaadin/dialog';
2
+ import { componentName, ModalClass } from './ModalClass';
3
+
4
+ customElements.define(componentName, ModalClass);
5
+
6
+ export { ModalClass };
package/src/index.cjs.js CHANGED
@@ -29,3 +29,4 @@ export { RecaptchaClass } from './components/descope-recaptcha/RecaptchaClass';
29
29
  export { UploadFileClass } from './components/descope-upload-file/UploadFileClass';
30
30
  export { ButtonSelectionGroupClass } from './components/descope-button-selection-group/ButtonSelectionGroupClass';
31
31
  export { ButtonSelectionGroupItemClass } from './components/descope-button-selection-group/descope-button-selection-group-item/ButtonSelectionGroupItemClass';
32
+ export { ModalClass } from './components/descope-modal/ModalClass';
package/src/index.js CHANGED
@@ -24,6 +24,7 @@ export * from './components/descope-recaptcha';
24
24
  export * from './components/descope-upload-file';
25
25
  export * from './components/descope-button-selection-group';
26
26
  export * from './components/descope-button-selection-group/descope-button-selection-group-item';
27
+ export * from './components/descope-grid';
27
28
 
28
29
  export {
29
30
  globalsThemeToStyle,
@@ -55,11 +55,11 @@ export const createStyle = (componentName, baseSelector, mappings) => {
55
55
 
56
56
  const cssVarName = getCssVarName(componentName, attr);
57
57
 
58
- attrConfig.forEach(({ selector: relativeSelectorOrSelectorFn, property }) => {
58
+ attrConfig.forEach(({ selector: relativeSelectorOrSelectorFn, property, important }) => {
59
59
  style.add(
60
60
  createCssSelector(baseSelector, relativeSelectorOrSelectorFn),
61
61
  isFunction(property) ? property() : property,
62
- createCssVarFallback(cssVarName)
62
+ createCssVarFallback(cssVarName) + (important ? '!important' : '')
63
63
  );
64
64
  });
65
65
  });
@@ -142,10 +142,10 @@ export const createStyleMixin =
142
142
  (this.#rootElement.classList || this.#rootElement.host.classList).add(className);
143
143
  }
144
144
 
145
- init() {
145
+ async init() {
146
146
  super.init?.();
147
147
  if (this.shadowRoot.isConnected) {
148
- this.#rootElement = this.#getRootElement?.(this) || this.shadowRoot;
148
+ this.#rootElement = (await this.#getRootElement?.(this)) || this.shadowRoot;
149
149
 
150
150
  this.#addClassName(componentName);
151
151
 
@@ -13,7 +13,27 @@ const DISPLAY_NAME_SEPARATOR = '_';
13
13
 
14
14
  const sanitizeSelector = (selector) => selector.replace(/[^\w\s]/gi, '');
15
15
 
16
- const getDomNode = (maybeDomNode) => maybeDomNode.host || maybeDomNode;
16
+ const withWaitForShadowRoot = (getRootElementFn) => (that) =>
17
+ new Promise((res) => {
18
+ const MAX_RETRIES = 20;
19
+ const ele = getRootElementFn(that);
20
+ let counter = 0;
21
+
22
+ const check = () => {
23
+ if (counter > MAX_RETRIES) {
24
+ // eslint-disable-next-line no-console
25
+ console.error('could not get shadow root for element', ele);
26
+ res(ele);
27
+ return;
28
+ }
29
+
30
+ counter++;
31
+
32
+ if (!ele.shadowRoot) setTimeout(check);
33
+ else res(ele.shadowRoot);
34
+ };
35
+ check();
36
+ });
17
37
 
18
38
  export const portalMixin =
19
39
  ({ name, selector, mappings = {}, forward: { attributes = [], include = true } = {} }) =>
@@ -43,17 +63,17 @@ export const portalMixin =
43
63
  const baseEle = that.shadowRoot.querySelector(that.baseSelector);
44
64
  const portal = selector ? baseEle.shadowRoot.querySelector(selector) : baseEle;
45
65
 
46
- return portal.shadowRoot || portal;
66
+ return portal;
47
67
  };
48
68
 
49
69
  super({
50
- getRootElement,
70
+ getRootElement: withWaitForShadowRoot(getRootElement),
51
71
  componentNameSuffix: DISPLAY_NAME_SEPARATOR + eleDisplayName,
52
72
  themeSection: PORTAL_THEME_PREFIX + eleDisplayName,
53
73
  baseSelector: ':host',
54
74
  });
55
75
 
56
- this.#portalEle = getDomNode(getRootElement(this));
76
+ this.#portalEle = getRootElement(this);
57
77
  }
58
78
 
59
79
  #handleHoverAttribute() {
@@ -0,0 +1,38 @@
1
+ import globals from '../globals';
2
+ import { getThemeRefs } from '../../helpers/themeHelpers';
3
+ import { GridClass } from '../../components/descope-grid/GridClass';
4
+ import { refs } from './inputWrapper';
5
+
6
+ const globalRefs = getThemeRefs(globals);
7
+ const vars = GridClass.cssVarList;
8
+
9
+ export const grid = {
10
+ [vars.hostWidth]: '100%',
11
+ [vars.hostHeight]: '100%',
12
+ [vars.hostMinHeight]: '400px',
13
+
14
+ [vars.fontSize]: refs.fontSize,
15
+ [vars.fontFamily]: refs.fontFamily,
16
+
17
+ [vars.sortIndicatorsColor]: globalRefs.colors.primary.main,
18
+ [vars.activeSortIndicator]: globalRefs.colors.primary.main,
19
+ [vars.resizeHandleColor]: globalRefs.colors.surface.main,
20
+
21
+ [vars.inputBorderWidth]: refs.borderWidth,
22
+ [vars.inputBorderStyle]: refs.borderStyle,
23
+ [vars.inputBorderRadius]: refs.borderRadius,
24
+ [vars.inputBorderColor]: 'transparent',
25
+
26
+ [vars.separatorColor]: refs.borderColor,
27
+
28
+ [vars.valueTextColor]: globalRefs.colors.surface.contrast,
29
+ [vars.selectedBackgroundColor]: globalRefs.colors.primary.main,
30
+ [vars.selectedTextColor]: globalRefs.colors.primary.contrast,
31
+
32
+ _bordered: {
33
+ [vars.inputBorderColor]: refs.borderColor,
34
+ },
35
+ };
36
+
37
+ export default grid;
38
+ export { vars };
@@ -23,6 +23,8 @@ import * as inputWrapper from './inputWrapper';
23
23
  import * as uploadFile from './uploadFile';
24
24
  import * as buttonSelectionGroupItem from './buttonSelectionGroup/buttonSelectionGroupItem';
25
25
  import * as buttonSelectionGroup from './buttonSelectionGroup/buttonSelectionGroup';
26
+ import * as modal from './modal';
27
+ import * as grid from './grid';
26
28
 
27
29
  const components = {
28
30
  button,
@@ -51,6 +53,8 @@ const components = {
51
53
  uploadFile,
52
54
  buttonSelectionGroupItem,
53
55
  buttonSelectionGroup,
56
+ modal,
57
+ grid,
54
58
  };
55
59
 
56
60
  const theme = Object.keys(components).reduce(
@@ -0,0 +1,16 @@
1
+ import { ModalClass } from '../../components/descope-modal/ModalClass';
2
+
3
+ const compVars = ModalClass.cssVarList;
4
+
5
+ const modal = {
6
+ [compVars.hostWidth]: '400px',
7
+ [compVars.hostHeight]: '400px',
8
+ [compVars.overlayShadow]: 'none',
9
+ [compVars.overlayWidth]: '700px',
10
+ };
11
+
12
+ export default modal;
13
+
14
+ export const vars = {
15
+ ...compVars,
16
+ };