@descope/web-components-ui 1.0.177 → 1.0.179
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.
- package/dist/cjs/index.cjs.js +1082 -687
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1166 -772
- package/dist/index.esm.js.map +1 -1
- package/dist/umd/1000.js +1 -1
- package/dist/umd/2481.js +1 -1
- package/dist/umd/descope-button-index-js.js +1 -1
- package/dist/umd/descope-combo-box-index-js.js +1 -1
- package/dist/umd/descope-date-picker-index-js.js +1 -1
- package/dist/umd/descope-email-field-index-js.js +1 -1
- package/dist/umd/descope-number-field-index-js.js +1 -1
- package/dist/umd/descope-passcode-descope-passcode-internal-index-js.js +1 -1
- package/dist/umd/descope-passcode-index-js.js +1 -1
- package/dist/umd/descope-single-select-descope-select-item-index-js.js +1 -0
- package/dist/umd/descope-single-select-descope-single-select-internal-index-js.js +1 -0
- package/dist/umd/descope-single-select-index-js.js +1 -0
- package/dist/umd/descope-upload-file-index-js.js +1 -1
- package/dist/umd/index.js +1 -1
- package/package.json +4 -4
- package/src/components/descope-button/ButtonClass.js +1 -1
- package/src/components/descope-combo-box/ComboBoxClass.js +1 -1
- package/src/components/descope-date-picker/index.js +1 -1
- package/src/components/descope-email-field/EmailFieldClass.js +2 -2
- package/src/components/descope-number-field/NumberFieldClass.js +1 -1
- package/src/components/descope-passcode/PasscodeClass.js +1 -1
- package/src/components/descope-passcode/descope-passcode-internal/PasscodeInternal.js +0 -4
- package/src/components/descope-password/PasswordClass.js +2 -2
- package/src/components/descope-single-select/SingleSelectClass.js +130 -0
- package/src/components/descope-single-select/descope-select-item/SelectItemClass.js +102 -0
- package/src/components/descope-single-select/descope-select-item/index.js +6 -0
- package/src/components/descope-single-select/descope-single-select-internal/SingleSelectInternalClass.js +137 -0
- package/src/components/descope-single-select/descope-single-select-internal/index.js +6 -0
- package/src/components/descope-single-select/index.js +6 -0
- package/src/index.cjs.js +3 -0
- package/src/index.js +2 -0
- package/src/mixins/createProxy.js +7 -2
- package/src/theme/components/index.js +4 -0
- package/src/theme/components/single-select/selectItem.js +27 -0
- package/src/theme/components/single-select/singleSelect.js +19 -0
@@ -0,0 +1,102 @@
|
|
1
|
+
import { createStyleMixin, draggableMixin, componentNameValidationMixin } from '../../../mixins';
|
2
|
+
import { createBaseClass } from '../../../baseClasses/createBaseClass';
|
3
|
+
import { compose } from '../../../helpers';
|
4
|
+
import { forwardAttrs, getComponentName } from '../../../helpers/componentHelpers';
|
5
|
+
import { ButtonClass } from '../../descope-button/ButtonClass';
|
6
|
+
|
7
|
+
export const componentName = getComponentName('select-item');
|
8
|
+
|
9
|
+
class RawSelectItem extends createBaseClass({
|
10
|
+
componentName,
|
11
|
+
baseSelector: ':host > descope-button',
|
12
|
+
}) {
|
13
|
+
get size() {
|
14
|
+
return this.getAttribute('size') || 'md';
|
15
|
+
}
|
16
|
+
|
17
|
+
get variant() {
|
18
|
+
return this.getAttribute('variant') || 'contained';
|
19
|
+
}
|
20
|
+
|
21
|
+
get value() {
|
22
|
+
return this.getAttribute('value') || '';
|
23
|
+
}
|
24
|
+
|
25
|
+
set value(value) {
|
26
|
+
this.setAttribute('value', value);
|
27
|
+
}
|
28
|
+
|
29
|
+
constructor() {
|
30
|
+
super();
|
31
|
+
|
32
|
+
this.attachShadow({ mode: 'open' }).innerHTML = `
|
33
|
+
<style>
|
34
|
+
descope-button {
|
35
|
+
max-width: 100%;
|
36
|
+
}
|
37
|
+
descope-button > slot {
|
38
|
+
width: 100%;
|
39
|
+
overflow: hidden;
|
40
|
+
text-overflow: ellipsis;
|
41
|
+
display: inline-block;
|
42
|
+
}
|
43
|
+
:host {
|
44
|
+
display: inline-block;
|
45
|
+
max-width: 100%
|
46
|
+
}
|
47
|
+
</style>
|
48
|
+
<descope-button variant="${this.variant}" size="${this.size}" mode="primary">
|
49
|
+
<slot></slot>
|
50
|
+
</descope-button>
|
51
|
+
`;
|
52
|
+
|
53
|
+
forwardAttrs(this, this.baseElement, { includeAttrs: ['size', 'variant'] });
|
54
|
+
}
|
55
|
+
|
56
|
+
handleFocus() {
|
57
|
+
this.shadowRoot.querySelector('descope-button')?.focus();
|
58
|
+
}
|
59
|
+
|
60
|
+
focus() {
|
61
|
+
this.handleFocus();
|
62
|
+
}
|
63
|
+
|
64
|
+
init() {
|
65
|
+
super.init();
|
66
|
+
this.addEventListener('focus', (e) => {
|
67
|
+
// we want to ignore focus events we are dispatching
|
68
|
+
if (e.isTrusted) {
|
69
|
+
this.handleFocus();
|
70
|
+
}
|
71
|
+
});
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
export const SelectItemClass = compose(
|
76
|
+
createStyleMixin({
|
77
|
+
mappings: {
|
78
|
+
backgroundColor: {
|
79
|
+
selector: () => ButtonClass.componentName,
|
80
|
+
property: ButtonClass.cssVarList.backgroundColor,
|
81
|
+
},
|
82
|
+
labelTextColor: {
|
83
|
+
selector: () => ButtonClass.componentName,
|
84
|
+
property: ButtonClass.cssVarList.labelTextColor,
|
85
|
+
},
|
86
|
+
borderColor: {
|
87
|
+
selector: () => ButtonClass.componentName,
|
88
|
+
property: ButtonClass.cssVarList.borderColor,
|
89
|
+
},
|
90
|
+
borderStyle: {
|
91
|
+
selector: () => ButtonClass.componentName,
|
92
|
+
property: ButtonClass.cssVarList.borderStyle,
|
93
|
+
},
|
94
|
+
borderRadius: {
|
95
|
+
selector: () => ButtonClass.componentName,
|
96
|
+
property: ButtonClass.cssVarList.borderRadius,
|
97
|
+
},
|
98
|
+
},
|
99
|
+
}),
|
100
|
+
draggableMixin,
|
101
|
+
componentNameValidationMixin
|
102
|
+
)(RawSelectItem);
|
@@ -0,0 +1,137 @@
|
|
1
|
+
import { createBaseInputClass } from '../../../baseClasses/createBaseInputClass';
|
2
|
+
import {
|
3
|
+
getComponentName,
|
4
|
+
observeAttributes,
|
5
|
+
observeChildren,
|
6
|
+
} from '../../../helpers/componentHelpers';
|
7
|
+
import { createDispatchEvent } from '../../../helpers/mixinsHelpers';
|
8
|
+
|
9
|
+
export const componentName = getComponentName('single-select-internal');
|
10
|
+
|
11
|
+
export class SingleSelectInternalClass extends createBaseInputClass({
|
12
|
+
componentName,
|
13
|
+
baseSelector: 'slot',
|
14
|
+
}) {
|
15
|
+
constructor() {
|
16
|
+
super();
|
17
|
+
|
18
|
+
this.innerHTML = `
|
19
|
+
<style>
|
20
|
+
slot {
|
21
|
+
box-sizing: border-box;
|
22
|
+
width: 100%;
|
23
|
+
display: flex;
|
24
|
+
flex-wrap: wrap;
|
25
|
+
}
|
26
|
+
</style>
|
27
|
+
<slot part="wrapper"></slot>
|
28
|
+
`;
|
29
|
+
}
|
30
|
+
|
31
|
+
#dispatchChange = createDispatchEvent.bind(this, 'change');
|
32
|
+
|
33
|
+
get items() {
|
34
|
+
return this.querySelector('slot').assignedElements();
|
35
|
+
}
|
36
|
+
|
37
|
+
get isReadonly() {
|
38
|
+
return this.getAttribute('readonly') === 'true';
|
39
|
+
}
|
40
|
+
|
41
|
+
getSelectedNode() {
|
42
|
+
return this.items.find((item) => item.hasAttribute('selected'));
|
43
|
+
}
|
44
|
+
|
45
|
+
get size() {
|
46
|
+
return this.getAttribute('size') || 'md';
|
47
|
+
}
|
48
|
+
|
49
|
+
removeSelected() {
|
50
|
+
this.getSelectedNode()?.removeAttribute('selected');
|
51
|
+
}
|
52
|
+
|
53
|
+
onNodeClick(e) {
|
54
|
+
if (!this.isReadonly) {
|
55
|
+
this.setSelected(e.target);
|
56
|
+
this.#dispatchChange();
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
setSelected(node) {
|
61
|
+
if (node !== this.getSelectedNode()) {
|
62
|
+
this.removeSelected();
|
63
|
+
node?.setAttribute('selected', 'true');
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
get value() {
|
68
|
+
return this.getSelectedNode()?.value;
|
69
|
+
}
|
70
|
+
|
71
|
+
set value(value) {
|
72
|
+
const node = this.items.find((child) => child.value === value);
|
73
|
+
this.setSelected(node);
|
74
|
+
}
|
75
|
+
|
76
|
+
get defaultValue() {
|
77
|
+
return this.getAttribute('default-value');
|
78
|
+
}
|
79
|
+
|
80
|
+
setDefaultValue() {
|
81
|
+
// we want to defer this action until all attributes are synched
|
82
|
+
setTimeout(() => {
|
83
|
+
if (this.defaultValue) {
|
84
|
+
this.value = this.defaultValue;
|
85
|
+
this.setCustomValidity();
|
86
|
+
}
|
87
|
+
});
|
88
|
+
}
|
89
|
+
|
90
|
+
onSizeChange() {
|
91
|
+
this.items.forEach((item) => {
|
92
|
+
item.setAttribute('size', this.size);
|
93
|
+
});
|
94
|
+
}
|
95
|
+
|
96
|
+
getValidity() {
|
97
|
+
if (this.isRequired && !this.value) {
|
98
|
+
return { valueMissing: true };
|
99
|
+
}
|
100
|
+
|
101
|
+
return {};
|
102
|
+
}
|
103
|
+
|
104
|
+
onObservedAttributeChange(attrs) {
|
105
|
+
attrs.forEach((attr) => {
|
106
|
+
switch (attr) {
|
107
|
+
case 'size':
|
108
|
+
this.onSizeChange();
|
109
|
+
break;
|
110
|
+
default:
|
111
|
+
break;
|
112
|
+
}
|
113
|
+
});
|
114
|
+
}
|
115
|
+
|
116
|
+
init() {
|
117
|
+
// we are adding listeners before calling to super because it's stopping the events
|
118
|
+
this.addEventListener('focus', (e) => {
|
119
|
+
// we want to ignore focus events we are dispatching
|
120
|
+
if (e.isTrusted) {
|
121
|
+
this.items[0].focus();
|
122
|
+
}
|
123
|
+
});
|
124
|
+
|
125
|
+
super.init?.();
|
126
|
+
this.setDefaultValue();
|
127
|
+
|
128
|
+
observeAttributes(this, this.onObservedAttributeChange.bind(this), { includeAttrs: ['size'] });
|
129
|
+
|
130
|
+
observeChildren(this, ({ addedNodes }) => {
|
131
|
+
addedNodes.forEach((node) => {
|
132
|
+
node.addEventListener('click', this.onNodeClick.bind(this));
|
133
|
+
node.setAttribute('size', this.size);
|
134
|
+
});
|
135
|
+
});
|
136
|
+
}
|
137
|
+
}
|
package/src/index.cjs.js
CHANGED
@@ -26,3 +26,6 @@ export { PhoneFieldClass } from './components/phone-fields/descope-phone-field/P
|
|
26
26
|
export { PhoneFieldInputBoxClass } from './components/phone-fields/descope-phone-input-box-field/PhoneFieldInputBoxClass';
|
27
27
|
export { NewPasswordClass } from './components/descope-new-password/NewPasswordClass';
|
28
28
|
export { RecaptchaClass } from './components/descope-recaptcha/RecaptchaClass';
|
29
|
+
export { UploadFileClass } from './components/descope-upload-file/UploadFileClass';
|
30
|
+
export { SingleSelectClass } from './components/descope-single-select/SingleSelectClass';
|
31
|
+
export { SelectItemClass } from './components/descope-single-select/descope-select-item/SelectItemClass';
|
package/src/index.js
CHANGED
@@ -22,6 +22,8 @@ export * from './components/phone-fields/descope-phone-input-box-field';
|
|
22
22
|
export * from './components/descope-new-password';
|
23
23
|
export * from './components/descope-recaptcha';
|
24
24
|
export * from './components/descope-upload-file';
|
25
|
+
export * from './components/descope-single-select';
|
26
|
+
export * from './components/descope-single-select/descope-select-item';
|
25
27
|
|
26
28
|
export {
|
27
29
|
globalsThemeToStyle,
|
@@ -21,8 +21,13 @@ export const createProxy = ({
|
|
21
21
|
super().attachShadow({ mode: 'open', delegatesFocus: true }).innerHTML = `
|
22
22
|
<style id="create-proxy">${isFunction(style) ? style() : style}</style>
|
23
23
|
<${wrappedEleName}>
|
24
|
-
|
25
|
-
|
24
|
+
${slots
|
25
|
+
.map(
|
26
|
+
(
|
27
|
+
slot // when slot is an empty string, we will create the default slot (without a name)
|
28
|
+
) => `<slot ${slot ? `name="${slot}" slot="${slot}"` : ''} ></slot>`
|
29
|
+
)
|
30
|
+
.join('')}
|
26
31
|
</${wrappedEleName}>
|
27
32
|
`;
|
28
33
|
}
|
@@ -21,6 +21,8 @@ import * as phoneInputBoxField from './phoneInputBoxField';
|
|
21
21
|
import * as newPassword from './newPassword';
|
22
22
|
import * as inputWrapper from './inputWrapper';
|
23
23
|
import * as uploadFile from './uploadFile';
|
24
|
+
import * as selectItem from './single-select/selectItem';
|
25
|
+
import * as singleSelect from './single-select/singleSelect';
|
24
26
|
|
25
27
|
const components = {
|
26
28
|
button,
|
@@ -47,6 +49,8 @@ const components = {
|
|
47
49
|
newPassword,
|
48
50
|
inputWrapper,
|
49
51
|
uploadFile,
|
52
|
+
selectItem,
|
53
|
+
singleSelect,
|
50
54
|
};
|
51
55
|
|
52
56
|
const theme = Object.keys(components).reduce(
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { SelectItemClass } from '../../../components/descope-single-select/descope-select-item/SelectItemClass';
|
2
|
+
import { getThemeRefs } from '../../../helpers/themeHelpers';
|
3
|
+
import globals from '../../globals';
|
4
|
+
|
5
|
+
const globalRefs = getThemeRefs(globals);
|
6
|
+
|
7
|
+
export const vars = SelectItemClass.cssVarList;
|
8
|
+
|
9
|
+
const selectItem = {
|
10
|
+
[vars.backgroundColor]: globalRefs.colors.surface.light,
|
11
|
+
[vars.labelTextColor]: globalRefs.colors.surface.contrast,
|
12
|
+
[vars.borderColor]: globalRefs.colors.surface.main,
|
13
|
+
[vars.borderStyle]: 'solid',
|
14
|
+
[vars.borderRadius]: globalRefs.radius.sm,
|
15
|
+
|
16
|
+
_hover: {
|
17
|
+
[vars.backgroundColor]: '#f4f5f5', // can we take it from the palette?
|
18
|
+
},
|
19
|
+
|
20
|
+
_selected: {
|
21
|
+
[vars.borderColor]: globalRefs.colors.surface.contrast,
|
22
|
+
[vars.backgroundColor]: globalRefs.colors.surface.contrast,
|
23
|
+
[vars.labelTextColor]: globalRefs.colors.surface.light,
|
24
|
+
},
|
25
|
+
};
|
26
|
+
|
27
|
+
export default selectItem;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { SingleSelectClass } from '../../../components/descope-single-select/SingleSelectClass';
|
2
|
+
import { getThemeRefs } from '../../../helpers/themeHelpers';
|
3
|
+
import globals from '../../globals';
|
4
|
+
import { refs } from '../inputWrapper';
|
5
|
+
|
6
|
+
const globalRefs = getThemeRefs(globals);
|
7
|
+
const vars = SingleSelectClass.cssVarList;
|
8
|
+
|
9
|
+
const singleSelect = {
|
10
|
+
[vars.fontFamily]: refs.fontFamily,
|
11
|
+
[vars.labelTextColor]: refs.labelTextColor,
|
12
|
+
[vars.labelRequiredIndicator]: refs.requiredIndicator,
|
13
|
+
[vars.errorMessageTextColor]: refs.errorMessageTextColor,
|
14
|
+
[vars.itemsSpacing]: globalRefs.spacing.sm,
|
15
|
+
[vars.hostWidth]: refs.width,
|
16
|
+
};
|
17
|
+
|
18
|
+
export default singleSelect;
|
19
|
+
export { vars };
|