@descope/web-components-ui 1.0.312 → 1.0.314
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/cjs/index.cjs.js +209 -29
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/index.esm.js +231 -63
- package/dist/index.esm.js.map +1 -1
- package/dist/umd/4978.js +1 -1
- package/dist/umd/DescopeDev.js +1 -1
- package/dist/umd/descope-divider-index-js.js +1 -1
- package/dist/umd/descope-enriched-text-index-js.js +1 -1
- package/dist/umd/descope-link-index-js.js +1 -1
- package/dist/umd/descope-new-password-descope-new-password-internal-index-js.js +1 -1
- package/dist/umd/descope-new-password-index-js.js +1 -1
- package/dist/umd/descope-password-index-js.js +1 -1
- package/dist/umd/descope-text-index-js.js +1 -1
- package/dist/umd/descope-user-attribute-index-js.js +1 -1
- package/dist/umd/descope-user-auth-method-index-js.js +1 -1
- package/dist/umd/mapping-fields-descope-mappings-field-index-js.js +1 -1
- package/dist/umd/mapping-fields-descope-saml-group-mappings-index-js.js +1 -1
- package/package.json +1 -1
- package/src/components/descope-enriched-text/EnrichedTextClass.js +1 -0
- package/src/components/descope-link/LinkClass.js +1 -0
- package/src/components/descope-new-password/NewPasswordClass.js +27 -1
- package/src/components/descope-new-password/descope-new-password-internal/NewPasswordInternal.js +18 -30
- package/src/components/descope-password/PasswordClass.js +92 -15
- package/src/components/descope-password/helpers.js +62 -0
- package/src/components/descope-password/passwordDraggableMixin.js +16 -11
- package/src/components/descope-text/TextClass.js +1 -0
- package/src/mixins/inputValidationMixin.js +12 -1
package/dist/cjs/index.cjs.js
CHANGED
@@ -1985,8 +1985,13 @@ const errorAttributes = {
|
|
1985
1985
|
tooShort: 'data-errormessage-pattern-mismatch-too-short',
|
1986
1986
|
tooLong: 'data-errormessage-pattern-mismatch-too-long',
|
1987
1987
|
};
|
1988
|
+
|
1989
|
+
const validationTargetSymbol = Symbol('validationTarget');
|
1990
|
+
|
1988
1991
|
const inputValidationMixin = (superclass) =>
|
1989
1992
|
class InputValidationMixinClass extends superclass {
|
1993
|
+
#validationTarget = validationTargetSymbol;
|
1994
|
+
|
1990
1995
|
static get observedAttributes() {
|
1991
1996
|
return [...(superclass.observedAttributes || []), ...observedAttributes$4];
|
1992
1997
|
}
|
@@ -2103,7 +2108,13 @@ const inputValidationMixin = (superclass) =>
|
|
2103
2108
|
}
|
2104
2109
|
|
2105
2110
|
get validationTarget() {
|
2106
|
-
return this
|
2111
|
+
return this.#validationTarget === validationTargetSymbol
|
2112
|
+
? this.inputElement
|
2113
|
+
: this.#validationTarget;
|
2114
|
+
}
|
2115
|
+
|
2116
|
+
set validationTarget(val) {
|
2117
|
+
this.#validationTarget = val;
|
2107
2118
|
}
|
2108
2119
|
|
2109
2120
|
setCustomValidity(errorMessage) {
|
@@ -3139,7 +3150,7 @@ const componentName$O = getComponentName('text-field');
|
|
3139
3150
|
|
3140
3151
|
const observedAttrs = ['type'];
|
3141
3152
|
|
3142
|
-
const customMixin$
|
3153
|
+
const customMixin$9 = (superclass) =>
|
3143
3154
|
class TextFieldClass extends superclass {
|
3144
3155
|
static get observedAttributes() {
|
3145
3156
|
return observedAttrs.concat(superclass.observedAttributes || []);
|
@@ -3191,7 +3202,7 @@ const TextFieldClass = compose(
|
|
3191
3202
|
draggableMixin,
|
3192
3203
|
composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'] }),
|
3193
3204
|
componentNameValidationMixin,
|
3194
|
-
customMixin$
|
3205
|
+
customMixin$9
|
3195
3206
|
)(
|
3196
3207
|
createProxy({
|
3197
3208
|
slots: ['prefix', 'suffix'],
|
@@ -3346,32 +3357,165 @@ const passwordDraggableMixin = (superclass) =>
|
|
3346
3357
|
// there is an issue in Chrome that input field with type password cannot be D&D
|
3347
3358
|
// so in case the input is draggable & readonly, we are changing the input type to "text" before dragging
|
3348
3359
|
// and return the original type when done
|
3349
|
-
|
3360
|
+
super.init?.();
|
3361
|
+
|
3362
|
+
const ele = this.querySelector('input');
|
3363
|
+
|
3364
|
+
ele?.addEventListener('mousedown', (e) => {
|
3350
3365
|
if (this.isDraggable && this.isReadOnly) {
|
3351
|
-
|
3352
|
-
const prevType = inputEle.getAttribute('type');
|
3366
|
+
ele.setAttribute('inert', 'true');
|
3353
3367
|
|
3368
|
+
const inputEle = e.target;
|
3369
|
+
const prevType = inputEle.getAttribute('type');
|
3354
3370
|
inputEle.setAttribute('type', 'text');
|
3355
|
-
setTimeout(() =>
|
3371
|
+
setTimeout(() => {
|
3372
|
+
inputEle.focus();
|
3373
|
+
});
|
3356
3374
|
|
3357
3375
|
const onComplete = (_) => {
|
3358
3376
|
inputEle.setAttribute('type', prevType);
|
3359
|
-
|
3360
|
-
|
3361
|
-
|
3377
|
+
ele.removeAttribute('inert');
|
3378
|
+
this.removeEventListener('mouseup', onComplete);
|
3379
|
+
this.removeEventListener('dragend', onComplete);
|
3362
3380
|
};
|
3363
3381
|
|
3364
|
-
|
3365
|
-
|
3382
|
+
this.addEventListener('dragend', onComplete, { once: true });
|
3383
|
+
this.addEventListener('mouseup', onComplete, { once: true });
|
3366
3384
|
}
|
3367
3385
|
});
|
3368
|
-
|
3369
|
-
super.init?.();
|
3370
3386
|
}
|
3371
3387
|
};
|
3372
3388
|
|
3389
|
+
// since on load we can only sample the color of the placeholder,
|
3390
|
+
// we need to temporarily populate the input in order to sample the value color
|
3391
|
+
const getValueColor = (ele, computedStyle) => {
|
3392
|
+
// eslint-disable-next-line no-param-reassign
|
3393
|
+
ele.value = '_';
|
3394
|
+
|
3395
|
+
const valueColor = computedStyle.getPropertyValue('color');
|
3396
|
+
|
3397
|
+
// eslint-disable-next-line no-param-reassign
|
3398
|
+
ele.value = '';
|
3399
|
+
|
3400
|
+
return valueColor;
|
3401
|
+
};
|
3402
|
+
|
3403
|
+
const createExternalInputSlot = (slotName, targetSlotName) => {
|
3404
|
+
const slotEle = document.createElement('slot');
|
3405
|
+
|
3406
|
+
slotEle.setAttribute('name', slotName);
|
3407
|
+
slotEle.setAttribute('slot', targetSlotName);
|
3408
|
+
|
3409
|
+
return slotEle;
|
3410
|
+
};
|
3411
|
+
|
3412
|
+
const createExternalInputEle = (targetSlotName, autocompleteType) => {
|
3413
|
+
const inputEle = document.createElement('input');
|
3414
|
+
|
3415
|
+
inputEle.setAttribute('slot', targetSlotName);
|
3416
|
+
inputEle.setAttribute('type', 'password');
|
3417
|
+
inputEle.setAttribute('data-hidden-input', 'true');
|
3418
|
+
inputEle.setAttribute('autocomplete', autocompleteType);
|
3419
|
+
|
3420
|
+
return inputEle;
|
3421
|
+
};
|
3422
|
+
|
3423
|
+
const applyExternalInputStyles = (sourceInputEle, targetInputEle) => {
|
3424
|
+
const computedStyle = getComputedStyle(sourceInputEle);
|
3425
|
+
const height = computedStyle.getPropertyValue('height');
|
3426
|
+
const paddingLeft = computedStyle.getPropertyValue('padding-left');
|
3427
|
+
const paddingRight = computedStyle.getPropertyValue('padding-right');
|
3428
|
+
const fontSize = computedStyle.getPropertyValue('font-size');
|
3429
|
+
const fontFamily = computedStyle.getPropertyValue('font-family');
|
3430
|
+
const letterSpacing = computedStyle.getPropertyValue('letter-spacing');
|
3431
|
+
const caretColor = computedStyle.getPropertyValue('caret-color');
|
3432
|
+
const valueColor = getValueColor(sourceInputEle, computedStyle);
|
3433
|
+
|
3434
|
+
// set external input style (and lock it with `all: unset` and `!important` all around)
|
3435
|
+
// eslint-disable-next-line no-param-reassign
|
3436
|
+
targetInputEle.style = `
|
3437
|
+
all: unset !important;
|
3438
|
+
position: absolute !important;
|
3439
|
+
width: calc(100% - 3em) !important;
|
3440
|
+
background-color: transparent !important;
|
3441
|
+
color: ${valueColor} !important;
|
3442
|
+
height: ${height} !important;
|
3443
|
+
left: ${paddingLeft} !important;
|
3444
|
+
right: ${paddingRight} !important;
|
3445
|
+
font-size: ${fontSize} !important;
|
3446
|
+
font-family: ${fontFamily} !important;
|
3447
|
+
letter-spacing: ${letterSpacing} !important;
|
3448
|
+
caret-color: ${caretColor} !important;
|
3449
|
+
`;
|
3450
|
+
};
|
3451
|
+
|
3373
3452
|
const componentName$M = getComponentName('password');
|
3374
3453
|
|
3454
|
+
const customMixin$8 = (superclass) =>
|
3455
|
+
class PasswordFieldMixinClass extends superclass {
|
3456
|
+
init() {
|
3457
|
+
super.init?.();
|
3458
|
+
|
3459
|
+
// reset vaadin's checkValidity
|
3460
|
+
this.baseElement.checkValidity = () => {};
|
3461
|
+
// set safety attribute `external-input`
|
3462
|
+
this.setAttribute('external-input', 'true');
|
3463
|
+
|
3464
|
+
// use original input element as reference
|
3465
|
+
const origInput = this.baseElement.querySelector('input');
|
3466
|
+
|
3467
|
+
// create external slot
|
3468
|
+
const externalInputSlot = createExternalInputSlot('external-input', 'suffix');
|
3469
|
+
// append external slot to base element
|
3470
|
+
this.baseElement.appendChild(externalInputSlot);
|
3471
|
+
|
3472
|
+
// create external input
|
3473
|
+
const externalInput = createExternalInputEle('external-input', this.getAutocompleteType());
|
3474
|
+
|
3475
|
+
// apply original input's styles to external input
|
3476
|
+
setTimeout(() => {
|
3477
|
+
applyExternalInputStyles(origInput, externalInput);
|
3478
|
+
});
|
3479
|
+
|
3480
|
+
// set external input events
|
3481
|
+
this.handleExternalInputEvents(externalInput);
|
3482
|
+
|
3483
|
+
// sync input stateful attributes: `type` (for visibility state change) and `readonly`
|
3484
|
+
syncAttrs(origInput, externalInput, { includeAttrs: ['type', 'readonly'] });
|
3485
|
+
|
3486
|
+
origInput.addEventListener('focus', (e) => {
|
3487
|
+
e.preventDefault();
|
3488
|
+
if (e.isTrusted) {
|
3489
|
+
externalInput.focus();
|
3490
|
+
}
|
3491
|
+
});
|
3492
|
+
|
3493
|
+
this.addEventListener('focus', (e) => {
|
3494
|
+
e.preventDefault();
|
3495
|
+
this.focus();
|
3496
|
+
});
|
3497
|
+
|
3498
|
+
// append external input to component's DOM
|
3499
|
+
this.appendChild(externalInput);
|
3500
|
+
}
|
3501
|
+
|
3502
|
+
getAutocompleteType() {
|
3503
|
+
return this.getAttribute('autocomplete') || 'current-password';
|
3504
|
+
}
|
3505
|
+
|
3506
|
+
handleExternalInputEvents(inputEle) {
|
3507
|
+
// sync value of insible input back to original input
|
3508
|
+
inputEle.addEventListener('input', (e) => {
|
3509
|
+
this.value = e.target.value;
|
3510
|
+
});
|
3511
|
+
|
3512
|
+
// sync `focused` attribute on host when focusing on external input
|
3513
|
+
inputEle.addEventListener('focus', () => {
|
3514
|
+
this.setAttribute('focused', 'true');
|
3515
|
+
});
|
3516
|
+
}
|
3517
|
+
};
|
3518
|
+
|
3375
3519
|
const {
|
3376
3520
|
host: host$l,
|
3377
3521
|
inputField: inputField$5,
|
@@ -3387,9 +3531,9 @@ const {
|
|
3387
3531
|
host: { selector: () => ':host' },
|
3388
3532
|
inputField: { selector: '::part(input-field)' },
|
3389
3533
|
inputElement: { selector: '> input' },
|
3390
|
-
inputElementPlaceholder: { selector: '
|
3391
|
-
revealButtonContainer: { selector:
|
3392
|
-
revealButtonIcon: { selector:
|
3534
|
+
inputElementPlaceholder: { selector: () => ':host input:placeholder-shown' },
|
3535
|
+
revealButtonContainer: { selector: '::part(reveal-button)' },
|
3536
|
+
revealButtonIcon: { selector: '::part(reveal-button)::before' },
|
3393
3537
|
label: { selector: '::part(label)' },
|
3394
3538
|
requiredIndicator: { selector: '[required]::part(required-indicator)::after' },
|
3395
3539
|
helperText: { selector: '::part(helper-text)' },
|
@@ -3428,8 +3572,14 @@ const PasswordClass = compose(
|
|
3428
3572
|
labelRequiredIndicator: { ...requiredIndicator$a, property: 'content' },
|
3429
3573
|
errorMessageTextColor: { ...errorMessage$b, property: 'color' },
|
3430
3574
|
|
3431
|
-
|
3432
|
-
|
3575
|
+
inputPlaceholderTextColor: [
|
3576
|
+
{ ...inputElementPlaceholder, property: 'color' },
|
3577
|
+
{ selector: () => ':host ::slotted(input:placeholder-shown)', property: 'color' },
|
3578
|
+
],
|
3579
|
+
inputValueTextColor: [
|
3580
|
+
{ ...inputElement$2, property: 'color' },
|
3581
|
+
{ selector: () => ':host ::slotted(input)', property: 'color' },
|
3582
|
+
],
|
3433
3583
|
|
3434
3584
|
revealButtonOffset: [
|
3435
3585
|
{ ...revealButtonContainer, property: 'margin-right' },
|
@@ -3442,7 +3592,8 @@ const PasswordClass = compose(
|
|
3442
3592
|
draggableMixin,
|
3443
3593
|
composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'] }),
|
3444
3594
|
componentNameValidationMixin,
|
3445
|
-
passwordDraggableMixin
|
3595
|
+
passwordDraggableMixin,
|
3596
|
+
customMixin$8
|
3446
3597
|
)(
|
3447
3598
|
createProxy({
|
3448
3599
|
slots: ['', 'suffix'],
|
@@ -3453,6 +3604,7 @@ const PasswordClass = compose(
|
|
3453
3604
|
max-width: 100%;
|
3454
3605
|
min-width: 10em;
|
3455
3606
|
box-sizing: border-box;
|
3607
|
+
position: relative;
|
3456
3608
|
}
|
3457
3609
|
${useHostExternalPadding(PasswordClass.cssVarList)}
|
3458
3610
|
${resetInputCursor('vaadin-password-field')}
|
@@ -3464,7 +3616,9 @@ const PasswordClass = compose(
|
|
3464
3616
|
padding: 0;
|
3465
3617
|
}
|
3466
3618
|
vaadin-password-field > input {
|
3619
|
+
-webkit-mask-image: none;
|
3467
3620
|
box-sizing: border-box;
|
3621
|
+
opacity: 1;
|
3468
3622
|
}
|
3469
3623
|
vaadin-password-field::part(input-field) {
|
3470
3624
|
box-sizing: border-box;
|
@@ -3473,12 +3627,11 @@ const PasswordClass = compose(
|
|
3473
3627
|
vaadin-password-field[focus-ring]::part(input-field) {
|
3474
3628
|
box-shadow: none;
|
3475
3629
|
}
|
3476
|
-
|
3630
|
+
:host ::slotted(input) {
|
3477
3631
|
min-height: 0;
|
3478
|
-
|
3479
|
-
|
3480
|
-
|
3481
|
-
opacity: 1;
|
3632
|
+
}
|
3633
|
+
:host([readonly]) ::slotted(input:placeholder-shown) {
|
3634
|
+
opacity: 0;
|
3482
3635
|
}
|
3483
3636
|
vaadin-password-field::before {
|
3484
3637
|
height: initial;
|
@@ -3489,11 +3642,9 @@ const PasswordClass = compose(
|
|
3489
3642
|
vaadin-password-field-button {
|
3490
3643
|
cursor: pointer;
|
3491
3644
|
}
|
3492
|
-
|
3493
|
-
[readonly] vaadin-password-field-button {
|
3645
|
+
:host([readonly]) vaadin-password-field-button {
|
3494
3646
|
pointer-events: none;
|
3495
3647
|
}
|
3496
|
-
|
3497
3648
|
vaadin-password-field-button[focus-ring] {
|
3498
3649
|
box-shadow: 0 0 0 2px var(${PasswordClass.cssVarList.inputOutlineColor});
|
3499
3650
|
}
|
@@ -4537,6 +4688,7 @@ class RawText extends createBaseClass({ componentName: componentName$B, baseSele
|
|
4537
4688
|
<style>
|
4538
4689
|
:host {
|
4539
4690
|
display: inline-block;
|
4691
|
+
line-height: 1em;
|
4540
4692
|
}
|
4541
4693
|
:host > slot {
|
4542
4694
|
width: 100%;
|
@@ -4701,6 +4853,7 @@ let EnrichedText$2 = class EnrichedText extends createBaseClass({ componentName:
|
|
4701
4853
|
<style>
|
4702
4854
|
:host {
|
4703
4855
|
display: inline-block;
|
4856
|
+
line-height: 1em;
|
4704
4857
|
}
|
4705
4858
|
:host > slot {
|
4706
4859
|
width: 100%;
|
@@ -4861,6 +5014,7 @@ class RawLink extends createBaseClass({ componentName: componentName$z, baseSele
|
|
4861
5014
|
<style>
|
4862
5015
|
:host {
|
4863
5016
|
display: inline-block;
|
5017
|
+
line-height: 1em;
|
4864
5018
|
}
|
4865
5019
|
:host a {
|
4866
5020
|
display: inline;
|
@@ -8044,13 +8198,24 @@ const customMixin$3 = (superclass) =>
|
|
8044
8198
|
name="new-password"
|
8045
8199
|
tabindex="-1"
|
8046
8200
|
slot="input"
|
8047
|
-
|
8201
|
+
>
|
8202
|
+
</${componentName$n}>
|
8048
8203
|
`;
|
8049
8204
|
|
8205
|
+
this.setAttribute('external-input', 'true');
|
8206
|
+
|
8050
8207
|
this.baseElement.appendChild(template.content.cloneNode(true));
|
8051
8208
|
|
8052
8209
|
this.inputElement = this.shadowRoot.querySelector(componentName$n);
|
8053
8210
|
|
8211
|
+
// get descope input components
|
8212
|
+
this.passwordInput = this.inputElement.querySelector('[data-id="password"]');
|
8213
|
+
this.confirmInput = this.inputElement.querySelector('[data-id="confirm"]');
|
8214
|
+
|
8215
|
+
// create slots for external password input
|
8216
|
+
this.createExternalInput(this.passwordInput, 'external-password-input');
|
8217
|
+
this.createExternalInput(this.confirmInput, 'external-confirm-input');
|
8218
|
+
|
8054
8219
|
forwardAttrs(this, this.inputElement, {
|
8055
8220
|
includeAttrs: [
|
8056
8221
|
'password-label',
|
@@ -8073,6 +8238,20 @@ const customMixin$3 = (superclass) =>
|
|
8073
8238
|
],
|
8074
8239
|
});
|
8075
8240
|
}
|
8241
|
+
|
8242
|
+
createExternalInput(node, slotName) {
|
8243
|
+
const externalInput = node.querySelector('input');
|
8244
|
+
const slotEle = document.createElement('slot');
|
8245
|
+
const targetSlot = externalInput.getAttribute('slot');
|
8246
|
+
slotEle.setAttribute('name', slotName);
|
8247
|
+
slotEle.setAttribute('slot', targetSlot);
|
8248
|
+
node.appendChild(slotEle);
|
8249
|
+
|
8250
|
+
// move external input
|
8251
|
+
externalInput.setAttribute('slot', slotName);
|
8252
|
+
externalInput.setAttribute('data-hidden-input', 'true');
|
8253
|
+
this.appendChild(externalInput);
|
8254
|
+
}
|
8076
8255
|
};
|
8077
8256
|
|
8078
8257
|
const {
|
@@ -8160,6 +8339,7 @@ const NewPasswordClass = compose(
|
|
8160
8339
|
padding: 0;
|
8161
8340
|
}
|
8162
8341
|
descope-new-password-internal > .wrapper {
|
8342
|
+
-webkit-mask-image: none;
|
8163
8343
|
width: 100%;
|
8164
8344
|
height: 100%;
|
8165
8345
|
display: flex;
|