@descope/web-components-ui 1.0.371 → 1.0.372
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/cjs/index.cjs.js +392 -9
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/index.esm.js +395 -10
- package/dist/index.esm.js.map +1 -1
- package/dist/umd/4392.js +1 -1
- package/dist/umd/4978.js +1 -1
- package/dist/umd/DescopeDev.js +1 -1
- package/dist/umd/descope-email-field-index-js.js +2 -2
- 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-number-field-index-js.js +1 -1
- package/dist/umd/descope-passcode-index-js.js +1 -1
- package/dist/umd/descope-password-index-js.js +1 -1
- package/dist/umd/descope-radio-group-index-js.js +1 -1
- package/dist/umd/descope-text-field-index-js.js +1 -1
- package/dist/umd/mapping-fields-descope-mappings-field-index-js.js +1 -1
- package/package.json +1 -1
- package/src/components/descope-email-field/EmailFieldClass.js +12 -0
- package/src/components/descope-new-password/NewPasswordClass.js +35 -0
- package/src/components/descope-new-password/descope-new-password-internal/NewPasswordInternal.js +3 -1
- package/src/components/descope-password/PasswordClass.js +59 -1
- package/src/components/descope-text-field/textFieldMappings.js +37 -6
- package/src/mixins/externalInputHelpers.js +86 -0
- package/src/mixins/externalInputMixin.js +165 -0
- package/src/mixins/index.js +1 -0
- package/src/mixins/proxyInputMixin.js +5 -2
package/dist/cjs/index.cjs.js
CHANGED
@@ -2229,7 +2229,7 @@ const proxyInputMixin =
|
|
2229
2229
|
({
|
2230
2230
|
proxyProps = [],
|
2231
2231
|
// useProxyTargets flag allows to forwardProps to other targets, other than
|
2232
|
-
// `this.inputElement`.
|
2232
|
+
// `this.inputElement`. It's to be used within `external-input` components,
|
2233
2233
|
// if needed
|
2234
2234
|
useProxyTargets = false,
|
2235
2235
|
// allows us to set the event that should trigger validation
|
@@ -2368,7 +2368,10 @@ const proxyInputMixin =
|
|
2368
2368
|
|
2369
2369
|
// sync properties
|
2370
2370
|
proxyProps.forEach((prop) => {
|
2371
|
-
const
|
2371
|
+
const externalInput = this.querySelector('input[slot="external-input"]') || null;
|
2372
|
+
const proxyTargets = useProxyTargets
|
2373
|
+
? [this.baseElement, externalInput].filter(Boolean)
|
2374
|
+
: [];
|
2372
2375
|
forwardProps(this, [this.inputElement, ...proxyTargets], prop);
|
2373
2376
|
});
|
2374
2377
|
|
@@ -2618,6 +2621,252 @@ const inputEventsDispatchingMixin = (superclass) =>
|
|
2618
2621
|
}
|
2619
2622
|
};
|
2620
2623
|
|
2624
|
+
// since on load we can only sample the color of the placeholder,
|
2625
|
+
// we need to temporarily populate the input in order to sample the value color
|
2626
|
+
const getValueColor = (ele, computedStyle) => {
|
2627
|
+
// eslint-disable-next-line no-param-reassign
|
2628
|
+
ele.value = '_';
|
2629
|
+
|
2630
|
+
const valueColor = computedStyle.getPropertyValue('color');
|
2631
|
+
|
2632
|
+
// eslint-disable-next-line no-param-reassign
|
2633
|
+
ele.value = '';
|
2634
|
+
|
2635
|
+
return valueColor;
|
2636
|
+
};
|
2637
|
+
|
2638
|
+
const createExternalInputSlot = (slotName, targetSlotName) => {
|
2639
|
+
const slotEle = document.createElement('slot');
|
2640
|
+
|
2641
|
+
slotEle.setAttribute('name', slotName);
|
2642
|
+
slotEle.setAttribute('slot', targetSlotName);
|
2643
|
+
|
2644
|
+
return slotEle;
|
2645
|
+
};
|
2646
|
+
|
2647
|
+
const createExternalInputEle = (targetSlotName, type, autocompleteType) => {
|
2648
|
+
const inputEle = document.createElement('input');
|
2649
|
+
|
2650
|
+
inputEle.setAttribute('slot', targetSlotName);
|
2651
|
+
inputEle.setAttribute('type', type);
|
2652
|
+
inputEle.setAttribute('data-hidden-input', 'true');
|
2653
|
+
inputEle.setAttribute('autocomplete', autocompleteType);
|
2654
|
+
|
2655
|
+
return inputEle;
|
2656
|
+
};
|
2657
|
+
|
2658
|
+
// We apply the original input's style to the external-input.
|
2659
|
+
// Eventually, the user should interact directly with the external input.
|
2660
|
+
// We keep the original input
|
2661
|
+
const applyExternalInputStyles = (sourceInputEle, targetInputEle, labelType) => {
|
2662
|
+
// We set a timeout here to avoid "Double Print" cases,
|
2663
|
+
// caused by sampling the computed style before it's ready.
|
2664
|
+
setTimeout(() => {
|
2665
|
+
const computedStyle = getComputedStyle(sourceInputEle);
|
2666
|
+
// Get minimal set of computed theme properties to set on external input
|
2667
|
+
const height = computedStyle.getPropertyValue('height');
|
2668
|
+
const paddingLeft = computedStyle.getPropertyValue('padding-left');
|
2669
|
+
const paddingRight = computedStyle.getPropertyValue('padding-right');
|
2670
|
+
const fontSize = computedStyle.getPropertyValue('font-size');
|
2671
|
+
const fontFamily = computedStyle.getPropertyValue('font-family');
|
2672
|
+
const letterSpacing = computedStyle.getPropertyValue('letter-spacing');
|
2673
|
+
const caretColor = computedStyle.getPropertyValue('caret-color');
|
2674
|
+
|
2675
|
+
const valueColor = getValueColor(sourceInputEle, computedStyle);
|
2676
|
+
|
2677
|
+
const commonThemeStyles = [
|
2678
|
+
['all', 'unset'],
|
2679
|
+
['position', 'absolute'],
|
2680
|
+
['background-color', 'transparent'],
|
2681
|
+
['height', height],
|
2682
|
+
['left', paddingLeft],
|
2683
|
+
['right', paddingRight],
|
2684
|
+
['font-size', fontSize],
|
2685
|
+
['font-family', fontFamily],
|
2686
|
+
['letter-spacing', letterSpacing],
|
2687
|
+
['caret-color', caretColor], // this is for seeing caret when focusing on external input
|
2688
|
+
['color', valueColor],
|
2689
|
+
];
|
2690
|
+
|
2691
|
+
commonThemeStyles.forEach(([key, val]) =>
|
2692
|
+
targetInputEle.style.setProperty(key, val, 'important')
|
2693
|
+
);
|
2694
|
+
|
2695
|
+
// Handle floating label theme properties
|
2696
|
+
if (labelType === 'floating') {
|
2697
|
+
const marginBottom = computedStyle.getPropertyValue('margin-bottom');
|
2698
|
+
targetInputEle.style.setProperty('margin-bottom', marginBottom, 'important');
|
2699
|
+
}
|
2700
|
+
|
2701
|
+
// sample and apply width only after original input is ready and fully rendered
|
2702
|
+
const width = computedStyle.getPropertyValue('width');
|
2703
|
+
targetInputEle.style.setProperty(
|
2704
|
+
'width',
|
2705
|
+
`calc(${width} - ${paddingLeft} - ${paddingRight}`,
|
2706
|
+
'important'
|
2707
|
+
);
|
2708
|
+
}, 0);
|
2709
|
+
};
|
2710
|
+
|
2711
|
+
const externalInputMixin =
|
2712
|
+
({ inputType, autocompleteType, includeAttrs = [], noBlurDispatch = false }) =>
|
2713
|
+
(superclass) =>
|
2714
|
+
class ExternalInputMixinClass extends superclass {
|
2715
|
+
#timers = [];
|
2716
|
+
|
2717
|
+
get isExternalInput() {
|
2718
|
+
return this.getAttribute('external-input') === 'true';
|
2719
|
+
}
|
2720
|
+
|
2721
|
+
createExternalInput() {
|
2722
|
+
if (!this.isExternalInput) {
|
2723
|
+
return null;
|
2724
|
+
}
|
2725
|
+
|
2726
|
+
// use original input element as reference
|
2727
|
+
const origInput = this.baseElement.querySelector('input');
|
2728
|
+
|
2729
|
+
// to avoid focus loop between external-input and origInput
|
2730
|
+
// we set origInput's tabindex to -1
|
2731
|
+
// otherwise, shift-tab will never leave the component focus
|
2732
|
+
origInput.setAttribute('tabindex', '-1');
|
2733
|
+
|
2734
|
+
// create external slot
|
2735
|
+
const externalInputSlot = createExternalInputSlot('external-input', 'suffix');
|
2736
|
+
|
2737
|
+
// append external slot to base element
|
2738
|
+
this.baseElement.appendChild(externalInputSlot);
|
2739
|
+
|
2740
|
+
this.externalInput = createExternalInputEle(
|
2741
|
+
'external-input',
|
2742
|
+
inputType,
|
2743
|
+
this.getAutocompleteType()
|
2744
|
+
);
|
2745
|
+
|
2746
|
+
// apply original input's styles to external input
|
2747
|
+
setTimeout(() => {
|
2748
|
+
applyExternalInputStyles(origInput, this.externalInput, this.getAttribute('label-type'));
|
2749
|
+
});
|
2750
|
+
|
2751
|
+
// 1Password catches the internal input, so we forward the value to the external input
|
2752
|
+
this.forwardInputValue(origInput, this.externalInput);
|
2753
|
+
|
2754
|
+
syncAttrs(origInput, this.externalInput, {
|
2755
|
+
includeAttrs,
|
2756
|
+
});
|
2757
|
+
|
2758
|
+
// We disable Vaadin's original `_setFocused` function, and use handleFocusEvents
|
2759
|
+
// and handleBlurEvents functions
|
2760
|
+
this.baseElement
|
2761
|
+
.querySelector('input')
|
2762
|
+
.addEventListener('focusout', (e) => e.stopImmediatePropagation(), true);
|
2763
|
+
|
2764
|
+
// In order to manage focus/blur events when moving between parts of the component
|
2765
|
+
// we're managing the event dispatching by ourselves, with the following strategy:
|
2766
|
+
// - If one of the component parts is focused - it means that the component is still focused - so we stop the blur events.
|
2767
|
+
// - When none of the component parts is focused, we dispatch blur event.
|
2768
|
+
this.handleFocusEvents();
|
2769
|
+
this.handleBlurEvents();
|
2770
|
+
|
2771
|
+
// sync input value
|
2772
|
+
this.handlelInputEvents(this.externalInput);
|
2773
|
+
|
2774
|
+
// append external input to component's DOM
|
2775
|
+
this.appendChild(this.externalInput);
|
2776
|
+
|
2777
|
+
return this.externalInput;
|
2778
|
+
}
|
2779
|
+
|
2780
|
+
clearBlurTimers() {
|
2781
|
+
this.#timers.forEach((timer) => clearTimeout(timer));
|
2782
|
+
this.#timers.length = 0;
|
2783
|
+
}
|
2784
|
+
|
2785
|
+
dispatchBlur() {
|
2786
|
+
return setTimeout(() => {
|
2787
|
+
this.dispatchEvent(new Event('blur', { bubbles: true, composed: true }));
|
2788
|
+
this.removeAttribute('focused');
|
2789
|
+
});
|
2790
|
+
}
|
2791
|
+
|
2792
|
+
handleFocusEvents() {
|
2793
|
+
// on baseElement `focus` we forward the focus to the external input.
|
2794
|
+
// also, in order to avoid any blur within the component, we clear the blur timers.
|
2795
|
+
this.baseElement.addEventListener('focus', () => {
|
2796
|
+
this.externalInput.focus();
|
2797
|
+
this.clearBlurTimers();
|
2798
|
+
});
|
2799
|
+
|
2800
|
+
// on `focus` of the external input, we manually set the `focused` attribute
|
2801
|
+
this.externalInput.addEventListener('focus', () => {
|
2802
|
+
this.clearBlurTimers();
|
2803
|
+
setTimeout(() => this.baseElement.setAttribute('focused', 'true'));
|
2804
|
+
});
|
2805
|
+
}
|
2806
|
+
|
2807
|
+
handleBlurEvents() {
|
2808
|
+
this.baseElement.addEventListener(
|
2809
|
+
'blur',
|
2810
|
+
(e) => {
|
2811
|
+
e.stopImmediatePropagation();
|
2812
|
+
// some components do not require this synthetic blur dispatch (e.g. Password)
|
2813
|
+
// so we allow them to override this dispatch
|
2814
|
+
if (noBlurDispatch) return;
|
2815
|
+
this.#timers.push(this.dispatchBlur());
|
2816
|
+
},
|
2817
|
+
true
|
2818
|
+
);
|
2819
|
+
|
2820
|
+
this.externalInput.addEventListener(
|
2821
|
+
'blur',
|
2822
|
+
(e) => {
|
2823
|
+
e.stopImmediatePropagation();
|
2824
|
+
this.#timers.push(this.dispatchBlur());
|
2825
|
+
},
|
2826
|
+
true
|
2827
|
+
);
|
2828
|
+
}
|
2829
|
+
|
2830
|
+
handlelInputEvents(externalInput) {
|
2831
|
+
// sync value of insible input back to original input
|
2832
|
+
externalInput.addEventListener('input', (e) => {
|
2833
|
+
this.value = e.target.value;
|
2834
|
+
});
|
2835
|
+
|
2836
|
+
// handle has-value attr
|
2837
|
+
externalInput.addEventListener('input', (e) => {
|
2838
|
+
if (!e.target.value) {
|
2839
|
+
this.removeAttribute('has-value');
|
2840
|
+
} else {
|
2841
|
+
this.setAttribute('has-value', 'true');
|
2842
|
+
}
|
2843
|
+
});
|
2844
|
+
}
|
2845
|
+
|
2846
|
+
getAutocompleteType() {
|
2847
|
+
return this.getAttribute('autocomplete') || autocompleteType;
|
2848
|
+
}
|
2849
|
+
|
2850
|
+
forwardInputValue(source, target) {
|
2851
|
+
// set internal sync events
|
2852
|
+
const valueDescriptor = Object.getOwnPropertyDescriptor(
|
2853
|
+
this.inputElement.constructor.prototype,
|
2854
|
+
'value'
|
2855
|
+
);
|
2856
|
+
|
2857
|
+
Object.defineProperty(source, 'value', {
|
2858
|
+
...valueDescriptor,
|
2859
|
+
|
2860
|
+
set(v) {
|
2861
|
+
valueDescriptor.set.call(this, v);
|
2862
|
+
// eslint-disable-next-line no-param-reassign
|
2863
|
+
target.value = v;
|
2864
|
+
},
|
2865
|
+
configurable: true,
|
2866
|
+
});
|
2867
|
+
}
|
2868
|
+
};
|
2869
|
+
|
2621
2870
|
const getFileExtension = (path) => {
|
2622
2871
|
const match = path.match(/\.([0-9a-z]+)(?:[\\?#]|$)/i);
|
2623
2872
|
return match ? match[1] : null;
|
@@ -3057,6 +3306,10 @@ const {
|
|
3057
3306
|
disabledPlaceholder,
|
3058
3307
|
inputDisabled,
|
3059
3308
|
inputIcon,
|
3309
|
+
externalInput,
|
3310
|
+
externalInputDisabled,
|
3311
|
+
externalPlaceholder,
|
3312
|
+
externalDisabledPlaceholder,
|
3060
3313
|
} = {
|
3061
3314
|
host: { selector: () => ':host' },
|
3062
3315
|
label: { selector: '::part(label)' },
|
@@ -3073,6 +3326,10 @@ const {
|
|
3073
3326
|
helperText: { selector: '::part(helper-text)' },
|
3074
3327
|
errorMessage: { selector: '::part(error-message)' },
|
3075
3328
|
inputIcon: { selector: 'vaadin-icon' },
|
3329
|
+
externalInput: { selector: () => '::slotted(input)' },
|
3330
|
+
externalInputDisabled: { selector: () => '::slotted(input:disabled)' },
|
3331
|
+
externalPlaceholder: { selector: () => '::slotted(input:placeholder-shown)' },
|
3332
|
+
externalDisabledPlaceholder: { selector: () => '::slotted(input:disabled::placeholder)' },
|
3076
3333
|
};
|
3077
3334
|
|
3078
3335
|
var textFieldMappings = {
|
@@ -3105,8 +3362,12 @@ var textFieldMappings = {
|
|
3105
3362
|
inputValueTextColor: [
|
3106
3363
|
{ ...inputField$6, property: 'color' },
|
3107
3364
|
{ ...inputDisabled, property: '-webkit-text-fill-color' },
|
3365
|
+
{ ...externalInputDisabled, property: '-webkit-text-fill-color' },
|
3366
|
+
],
|
3367
|
+
inputCaretTextColor: [
|
3368
|
+
{ ...input, property: 'caret-color' },
|
3369
|
+
{ ...externalInput, property: 'caret-color' },
|
3108
3370
|
],
|
3109
|
-
inputCaretTextColor: [{ ...input, property: 'color' }],
|
3110
3371
|
|
3111
3372
|
labelRequiredIndicator: { ...requiredIndicator$b, property: 'content' },
|
3112
3373
|
|
@@ -3119,6 +3380,8 @@ var textFieldMappings = {
|
|
3119
3380
|
inputHorizontalPadding: [
|
3120
3381
|
{ ...input, property: 'padding-left' },
|
3121
3382
|
{ ...input, property: 'padding-right' },
|
3383
|
+
{ ...externalInput, property: 'padding-left' },
|
3384
|
+
{ ...externalInput, property: 'padding-right' },
|
3122
3385
|
],
|
3123
3386
|
|
3124
3387
|
inputOutlineColor: { ...inputField$6, property: 'outline-color' },
|
@@ -3126,12 +3389,17 @@ var textFieldMappings = {
|
|
3126
3389
|
inputOutlineWidth: { ...inputField$6, property: 'outline-width' },
|
3127
3390
|
inputOutlineOffset: { ...inputField$6, property: 'outline-offset' },
|
3128
3391
|
|
3129
|
-
inputTextAlign: [
|
3392
|
+
inputTextAlign: [
|
3393
|
+
{ ...input, property: 'text-align' },
|
3394
|
+
{ ...externalInput, property: 'text-align' },
|
3395
|
+
],
|
3130
3396
|
|
3131
3397
|
inputPlaceholderColor: [
|
3132
3398
|
{ selector: () => ':host input:placeholder-shown', property: 'color' },
|
3399
|
+
{ ...externalPlaceholder, property: 'color' },
|
3133
3400
|
{ ...placeholder$3, property: 'color' },
|
3134
3401
|
{ ...disabledPlaceholder, property: '-webkit-text-fill-color' },
|
3402
|
+
{ ...externalDisabledPlaceholder, property: '-webkit-text-fill-color' },
|
3135
3403
|
],
|
3136
3404
|
|
3137
3405
|
labelPosition: { ...label$9, property: 'position' },
|
@@ -3143,10 +3411,22 @@ var textFieldMappings = {
|
|
3143
3411
|
inputTransformY: { ...label$9, property: 'transform' },
|
3144
3412
|
inputTransition: { ...label$9, property: 'transition' },
|
3145
3413
|
marginInlineStart: { ...label$9, property: 'margin-inline-start' },
|
3146
|
-
placeholderOpacity: [
|
3147
|
-
|
3148
|
-
|
3149
|
-
|
3414
|
+
placeholderOpacity: [
|
3415
|
+
{ selector: '> input:placeholder-shown', property: 'opacity' },
|
3416
|
+
{ ...externalPlaceholder, property: 'opacity' },
|
3417
|
+
],
|
3418
|
+
inputVerticalAlignment: [
|
3419
|
+
{ ...inputField$6, property: 'align-items' },
|
3420
|
+
{ ...externalInput, property: 'align-items' },
|
3421
|
+
],
|
3422
|
+
valueInputHeight: [
|
3423
|
+
{ ...input, property: 'height' },
|
3424
|
+
{ ...externalInput, property: 'height' },
|
3425
|
+
],
|
3426
|
+
valueInputMarginBottom: [
|
3427
|
+
{ ...input, property: 'margin-bottom' },
|
3428
|
+
{ ...externalInput, property: 'margin-bottom' },
|
3429
|
+
],
|
3150
3430
|
|
3151
3431
|
inputIconOffset: [
|
3152
3432
|
{ ...inputIcon, property: 'margin-right' },
|
@@ -3658,6 +3938,15 @@ const customMixin$b = (superclass) =>
|
|
3658
3938
|
this.origSetPasswordVisible = this.baseElement._setPasswordVisible;
|
3659
3939
|
this.origSetFocused = this.baseElement._setFocused;
|
3660
3940
|
this.baseElement._setFocused = this.setFocus.bind(this);
|
3941
|
+
|
3942
|
+
this.initExternalInput();
|
3943
|
+
}
|
3944
|
+
|
3945
|
+
initExternalInput() {
|
3946
|
+
const externalInput = this.createExternalInput();
|
3947
|
+
if (externalInput) {
|
3948
|
+
this.handlePasswordVisibility(externalInput);
|
3949
|
+
}
|
3661
3950
|
}
|
3662
3951
|
|
3663
3952
|
get caretPosition() {
|
@@ -3672,6 +3961,7 @@ const customMixin$b = (superclass) =>
|
|
3672
3961
|
setTimeout(() => {
|
3673
3962
|
origTogglePasswordVisibility();
|
3674
3963
|
this.inputElement.setSelectionRange(this.caretPosition, this.caretPosition);
|
3964
|
+
return false;
|
3675
3965
|
});
|
3676
3966
|
};
|
3677
3967
|
}
|
@@ -3698,6 +3988,44 @@ const customMixin$b = (superclass) =>
|
|
3698
3988
|
attributeChangedCallback(attrName, oldValue, newValue) {
|
3699
3989
|
super.attributeChangedCallback?.(attrName, oldValue, newValue);
|
3700
3990
|
}
|
3991
|
+
|
3992
|
+
// override vaadin's password visibility toggle.
|
3993
|
+
// we need this override in order to to resolve the external input `focus` race condition,
|
3994
|
+
// which is caused due to the focus sync between the two inputs.
|
3995
|
+
handlePasswordVisibility(externalInput) {
|
3996
|
+
// disable vaadin's `__boundRevealButtonMouseDown` mouse-down event lisetener
|
3997
|
+
const origBoundRevealButtonMouseDown = this.baseElement.__boundRevealButtonMouseDown;
|
3998
|
+
this.baseElement
|
3999
|
+
.querySelector('vaadin-password-field-button')
|
4000
|
+
.removeEventListener('mousedown', origBoundRevealButtonMouseDown);
|
4001
|
+
|
4002
|
+
// disable vaadin's `_passwordVisibleChanged` observer
|
4003
|
+
this.baseElement._passwordVisibleChanged = () => {};
|
4004
|
+
|
4005
|
+
// override vaadin's `_togglePasswordVisibility`
|
4006
|
+
this.baseElement._togglePasswordVisibility = () => {
|
4007
|
+
const currVisibility = externalInput.getAttribute('type');
|
4008
|
+
if (currVisibility === 'password') {
|
4009
|
+
this.showPasswordVisibility(externalInput);
|
4010
|
+
} else {
|
4011
|
+
this.hidePasswordVisibility(externalInput);
|
4012
|
+
}
|
4013
|
+
};
|
4014
|
+
}
|
4015
|
+
|
4016
|
+
showPasswordVisibility(input) {
|
4017
|
+
// handle input element's type
|
4018
|
+
input.setAttribute('type', 'text');
|
4019
|
+
// handle vaadin's `password-visible` attribute
|
4020
|
+
this.setAttribute('password-visible', 'true');
|
4021
|
+
}
|
4022
|
+
|
4023
|
+
hidePasswordVisibility(input) {
|
4024
|
+
// handle input element's type
|
4025
|
+
input.setAttribute('type', 'password');
|
4026
|
+
// handle vaadin's `password-visible` attribute
|
4027
|
+
this.setAttribute('password-visible', 'false');
|
4028
|
+
}
|
3701
4029
|
};
|
3702
4030
|
|
3703
4031
|
const {
|
@@ -3792,7 +4120,12 @@ const PasswordClass = compose(
|
|
3792
4120
|
},
|
3793
4121
|
}),
|
3794
4122
|
draggableMixin,
|
3795
|
-
|
4123
|
+
externalInputMixin({
|
4124
|
+
inputType: 'password',
|
4125
|
+
includeAttrs: ['disabled', 'readonly', 'pattern', 'type', 'autocomplete'],
|
4126
|
+
noBlurDispatch: true,
|
4127
|
+
}),
|
4128
|
+
composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'], useProxyTargets: true }),
|
3796
4129
|
componentNameValidationMixin,
|
3797
4130
|
passwordDraggableMixin,
|
3798
4131
|
customMixin$b
|
@@ -3856,6 +4189,10 @@ const PasswordClass = compose(
|
|
3856
4189
|
::part(reveal-button) {
|
3857
4190
|
align-self: center;
|
3858
4191
|
}
|
4192
|
+
|
4193
|
+
vaadin-password-field[external-input="true"] > input:not(:placeholder-shown) {
|
4194
|
+
opacity: 0;
|
4195
|
+
}
|
3859
4196
|
`,
|
3860
4197
|
excludeAttrsSync: ['tabindex'],
|
3861
4198
|
componentName: componentName$R,
|
@@ -4007,6 +4344,8 @@ const customMixin$a = (superclass) =>
|
|
4007
4344
|
if (!this.getAttribute('autocomplete')) {
|
4008
4345
|
this.setAttribute('autocomplete', defaultAutocomplete);
|
4009
4346
|
}
|
4347
|
+
|
4348
|
+
this.createExternalInput();
|
4010
4349
|
}
|
4011
4350
|
};
|
4012
4351
|
|
@@ -4015,6 +4354,11 @@ const EmailFieldClass = compose(
|
|
4015
4354
|
mappings: textFieldMappings,
|
4016
4355
|
}),
|
4017
4356
|
draggableMixin,
|
4357
|
+
externalInputMixin({
|
4358
|
+
inputType: 'text',
|
4359
|
+
autocompleteType: 'username',
|
4360
|
+
includeAttrs: ['disabled', 'readonly', 'pattern'],
|
4361
|
+
}),
|
4018
4362
|
composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'], useProxyTargets: true }),
|
4019
4363
|
componentNameValidationMixin,
|
4020
4364
|
customMixin$a
|
@@ -4046,6 +4390,10 @@ const EmailFieldClass = compose(
|
|
4046
4390
|
:host ::slotted(*) {
|
4047
4391
|
-webkit-mask-image: none;
|
4048
4392
|
}
|
4393
|
+
|
4394
|
+
vaadin-email-field[external-input="true"] > input:not(:placeholder-shown) {
|
4395
|
+
opacity: 0;
|
4396
|
+
}
|
4049
4397
|
`,
|
4050
4398
|
excludeAttrsSync: ['tabindex'],
|
4051
4399
|
componentName: componentName$P,
|
@@ -8608,11 +8956,14 @@ const customMixin$6 = (superclass) =>
|
|
8608
8956
|
|
8609
8957
|
const template = document.createElement('template');
|
8610
8958
|
|
8959
|
+
const externalInputAttr = this.getAttribute('external-input');
|
8960
|
+
|
8611
8961
|
template.innerHTML = `
|
8612
8962
|
<${componentName$s}
|
8613
8963
|
name="new-password"
|
8614
8964
|
tabindex="-1"
|
8615
8965
|
slot="input"
|
8966
|
+
external-input="${externalInputAttr}"
|
8616
8967
|
>
|
8617
8968
|
</${componentName$s}>
|
8618
8969
|
`;
|
@@ -8621,6 +8972,10 @@ const customMixin$6 = (superclass) =>
|
|
8621
8972
|
|
8622
8973
|
this.inputElement = this.shadowRoot.querySelector(componentName$s);
|
8623
8974
|
|
8975
|
+
if (this.getAttribute('external-input') === 'true') {
|
8976
|
+
this.initExternalInput();
|
8977
|
+
}
|
8978
|
+
|
8624
8979
|
forwardAttrs(this, this.inputElement, {
|
8625
8980
|
includeAttrs: [
|
8626
8981
|
'password-label',
|
@@ -8645,6 +9000,34 @@ const customMixin$6 = (superclass) =>
|
|
8645
9000
|
],
|
8646
9001
|
});
|
8647
9002
|
}
|
9003
|
+
|
9004
|
+
createSlottedExternalInput(node, slotName) {
|
9005
|
+
const externalInput = node.querySelector('input');
|
9006
|
+
const slotEle = document.createElement('slot');
|
9007
|
+
|
9008
|
+
const targetSlot = externalInput.getAttribute('slot');
|
9009
|
+
|
9010
|
+
slotEle.setAttribute('name', slotName);
|
9011
|
+
slotEle.setAttribute('slot', targetSlot);
|
9012
|
+
|
9013
|
+
node.appendChild(slotEle);
|
9014
|
+
|
9015
|
+
// move external input
|
9016
|
+
externalInput.setAttribute('slot', slotName);
|
9017
|
+
externalInput.setAttribute('data-hidden-input', 'true');
|
9018
|
+
|
9019
|
+
this.appendChild(externalInput);
|
9020
|
+
}
|
9021
|
+
|
9022
|
+
initExternalInput() {
|
9023
|
+
// get descope input components
|
9024
|
+
this.passwordInput = this.inputElement.querySelector('[data-id="password"]');
|
9025
|
+
this.confirmInput = this.inputElement.querySelector('[data-id="confirm"]');
|
9026
|
+
|
9027
|
+
// create slots for external password input
|
9028
|
+
this.createSlottedExternalInput(this.passwordInput, 'external-password-input');
|
9029
|
+
this.createSlottedExternalInput(this.confirmInput, 'external-confirm-input');
|
9030
|
+
}
|
8648
9031
|
};
|
8649
9032
|
|
8650
9033
|
const {
|