@descope/web-components-ui 1.0.312 → 1.0.314

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 (27) hide show
  1. package/dist/cjs/index.cjs.js +209 -29
  2. package/dist/cjs/index.cjs.js.map +1 -1
  3. package/dist/index.esm.js +231 -63
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/umd/4978.js +1 -1
  6. package/dist/umd/DescopeDev.js +1 -1
  7. package/dist/umd/descope-divider-index-js.js +1 -1
  8. package/dist/umd/descope-enriched-text-index-js.js +1 -1
  9. package/dist/umd/descope-link-index-js.js +1 -1
  10. package/dist/umd/descope-new-password-descope-new-password-internal-index-js.js +1 -1
  11. package/dist/umd/descope-new-password-index-js.js +1 -1
  12. package/dist/umd/descope-password-index-js.js +1 -1
  13. package/dist/umd/descope-text-index-js.js +1 -1
  14. package/dist/umd/descope-user-attribute-index-js.js +1 -1
  15. package/dist/umd/descope-user-auth-method-index-js.js +1 -1
  16. package/dist/umd/mapping-fields-descope-mappings-field-index-js.js +1 -1
  17. package/dist/umd/mapping-fields-descope-saml-group-mappings-index-js.js +1 -1
  18. package/package.json +1 -1
  19. package/src/components/descope-enriched-text/EnrichedTextClass.js +1 -0
  20. package/src/components/descope-link/LinkClass.js +1 -0
  21. package/src/components/descope-new-password/NewPasswordClass.js +27 -1
  22. package/src/components/descope-new-password/descope-new-password-internal/NewPasswordInternal.js +18 -30
  23. package/src/components/descope-password/PasswordClass.js +92 -15
  24. package/src/components/descope-password/helpers.js +62 -0
  25. package/src/components/descope-password/passwordDraggableMixin.js +16 -11
  26. package/src/components/descope-text/TextClass.js +1 -0
  27. package/src/mixins/inputValidationMixin.js +12 -1
package/dist/index.esm.js CHANGED
@@ -763,8 +763,13 @@ const errorAttributes = {
763
763
  tooShort: 'data-errormessage-pattern-mismatch-too-short',
764
764
  tooLong: 'data-errormessage-pattern-mismatch-too-long',
765
765
  };
766
+
767
+ const validationTargetSymbol = Symbol('validationTarget');
768
+
766
769
  const inputValidationMixin = (superclass) =>
767
770
  class InputValidationMixinClass extends superclass {
771
+ #validationTarget = validationTargetSymbol;
772
+
768
773
  static get observedAttributes() {
769
774
  return [...(superclass.observedAttributes || []), ...observedAttributes$6];
770
775
  }
@@ -881,7 +886,13 @@ const inputValidationMixin = (superclass) =>
881
886
  }
882
887
 
883
888
  get validationTarget() {
884
- return this.inputElement;
889
+ return this.#validationTarget === validationTargetSymbol
890
+ ? this.inputElement
891
+ : this.#validationTarget;
892
+ }
893
+
894
+ set validationTarget(val) {
895
+ this.#validationTarget = val;
885
896
  }
886
897
 
887
898
  setCustomValidity(errorMessage) {
@@ -2289,6 +2300,7 @@ class RawText extends createBaseClass({ componentName: componentName$M, baseSele
2289
2300
  <style>
2290
2301
  :host {
2291
2302
  display: inline-block;
2303
+ line-height: 1em;
2292
2304
  }
2293
2305
  :host > slot {
2294
2306
  width: 100%;
@@ -2538,7 +2550,7 @@ var textFieldMappings = {
2538
2550
 
2539
2551
  const componentName$K = getComponentName('email-field');
2540
2552
 
2541
- const customMixin$8 = (superclass) =>
2553
+ const customMixin$9 = (superclass) =>
2542
2554
  class EmailFieldMixinClass extends superclass {
2543
2555
  init() {
2544
2556
  super.init?.();
@@ -2552,7 +2564,7 @@ const EmailFieldClass = compose(
2552
2564
  draggableMixin,
2553
2565
  composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'] }),
2554
2566
  componentNameValidationMixin,
2555
- customMixin$8
2567
+ customMixin$9
2556
2568
  )(
2557
2569
  createProxy({
2558
2570
  slots: ['', 'suffix'],
@@ -2587,6 +2599,7 @@ class RawLink extends createBaseClass({ componentName: componentName$J, baseSele
2587
2599
  <style>
2588
2600
  :host {
2589
2601
  display: inline-block;
2602
+ line-height: 1em;
2590
2603
  }
2591
2604
  :host a {
2592
2605
  display: inline;
@@ -3010,7 +3023,7 @@ const componentName$D = getComponentName('text-field');
3010
3023
 
3011
3024
  const observedAttrs = ['type'];
3012
3025
 
3013
- const customMixin$7 = (superclass) =>
3026
+ const customMixin$8 = (superclass) =>
3014
3027
  class TextFieldClass extends superclass {
3015
3028
  static get observedAttributes() {
3016
3029
  return observedAttrs.concat(superclass.observedAttributes || []);
@@ -3062,7 +3075,7 @@ const TextFieldClass = compose(
3062
3075
  draggableMixin,
3063
3076
  composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'] }),
3064
3077
  componentNameValidationMixin,
3065
- customMixin$7
3078
+ customMixin$8
3066
3079
  )(
3067
3080
  createProxy({
3068
3081
  slots: ['prefix', 'suffix'],
@@ -3089,7 +3102,7 @@ const componentName$C = getComponentName('passcode');
3089
3102
 
3090
3103
  const observedAttributes$4 = ['digits'];
3091
3104
 
3092
- const customMixin$6 = (superclass) =>
3105
+ const customMixin$7 = (superclass) =>
3093
3106
  class PasscodeMixinClass extends superclass {
3094
3107
  static get observedAttributes() {
3095
3108
  return observedAttributes$4.concat(superclass.observedAttributes || []);
@@ -3185,7 +3198,7 @@ const PasscodeClass = compose(
3185
3198
  draggableMixin,
3186
3199
  composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'] }),
3187
3200
  componentNameValidationMixin,
3188
- customMixin$6
3201
+ customMixin$7
3189
3202
  )(
3190
3203
  createProxy({
3191
3204
  slots: [],
@@ -3281,32 +3294,165 @@ const passwordDraggableMixin = (superclass) =>
3281
3294
  // there is an issue in Chrome that input field with type password cannot be D&D
3282
3295
  // so in case the input is draggable & readonly, we are changing the input type to "text" before dragging
3283
3296
  // and return the original type when done
3284
- this.addEventListener('mousedown', (e) => {
3297
+ super.init?.();
3298
+
3299
+ const ele = this.querySelector('input');
3300
+
3301
+ ele?.addEventListener('mousedown', (e) => {
3285
3302
  if (this.isDraggable && this.isReadOnly) {
3286
- const inputEle = this.baseElement.querySelector('input');
3287
- const prevType = inputEle.getAttribute('type');
3303
+ ele.setAttribute('inert', 'true');
3288
3304
 
3305
+ const inputEle = e.target;
3306
+ const prevType = inputEle.getAttribute('type');
3289
3307
  inputEle.setAttribute('type', 'text');
3290
- setTimeout(() => inputEle.focus());
3308
+ setTimeout(() => {
3309
+ inputEle.focus();
3310
+ });
3291
3311
 
3292
3312
  const onComplete = (_) => {
3293
3313
  inputEle.setAttribute('type', prevType);
3294
-
3295
- e.target.removeEventListener('mouseup', onComplete);
3296
- e.target.removeEventListener('dragend', onComplete);
3314
+ ele.removeAttribute('inert');
3315
+ this.removeEventListener('mouseup', onComplete);
3316
+ this.removeEventListener('dragend', onComplete);
3297
3317
  };
3298
3318
 
3299
- e.target.addEventListener('mouseup', onComplete, { once: true });
3300
- e.target.addEventListener('dragend', onComplete, { once: true });
3319
+ this.addEventListener('dragend', onComplete, { once: true });
3320
+ this.addEventListener('mouseup', onComplete, { once: true });
3301
3321
  }
3302
3322
  });
3303
-
3304
- super.init?.();
3305
3323
  }
3306
3324
  };
3307
3325
 
3326
+ // since on load we can only sample the color of the placeholder,
3327
+ // we need to temporarily populate the input in order to sample the value color
3328
+ const getValueColor = (ele, computedStyle) => {
3329
+ // eslint-disable-next-line no-param-reassign
3330
+ ele.value = '_';
3331
+
3332
+ const valueColor = computedStyle.getPropertyValue('color');
3333
+
3334
+ // eslint-disable-next-line no-param-reassign
3335
+ ele.value = '';
3336
+
3337
+ return valueColor;
3338
+ };
3339
+
3340
+ const createExternalInputSlot = (slotName, targetSlotName) => {
3341
+ const slotEle = document.createElement('slot');
3342
+
3343
+ slotEle.setAttribute('name', slotName);
3344
+ slotEle.setAttribute('slot', targetSlotName);
3345
+
3346
+ return slotEle;
3347
+ };
3348
+
3349
+ const createExternalInputEle = (targetSlotName, autocompleteType) => {
3350
+ const inputEle = document.createElement('input');
3351
+
3352
+ inputEle.setAttribute('slot', targetSlotName);
3353
+ inputEle.setAttribute('type', 'password');
3354
+ inputEle.setAttribute('data-hidden-input', 'true');
3355
+ inputEle.setAttribute('autocomplete', autocompleteType);
3356
+
3357
+ return inputEle;
3358
+ };
3359
+
3360
+ const applyExternalInputStyles = (sourceInputEle, targetInputEle) => {
3361
+ const computedStyle = getComputedStyle(sourceInputEle);
3362
+ const height = computedStyle.getPropertyValue('height');
3363
+ const paddingLeft = computedStyle.getPropertyValue('padding-left');
3364
+ const paddingRight = computedStyle.getPropertyValue('padding-right');
3365
+ const fontSize = computedStyle.getPropertyValue('font-size');
3366
+ const fontFamily = computedStyle.getPropertyValue('font-family');
3367
+ const letterSpacing = computedStyle.getPropertyValue('letter-spacing');
3368
+ const caretColor = computedStyle.getPropertyValue('caret-color');
3369
+ const valueColor = getValueColor(sourceInputEle, computedStyle);
3370
+
3371
+ // set external input style (and lock it with `all: unset` and `!important` all around)
3372
+ // eslint-disable-next-line no-param-reassign
3373
+ targetInputEle.style = `
3374
+ all: unset !important;
3375
+ position: absolute !important;
3376
+ width: calc(100% - 3em) !important;
3377
+ background-color: transparent !important;
3378
+ color: ${valueColor} !important;
3379
+ height: ${height} !important;
3380
+ left: ${paddingLeft} !important;
3381
+ right: ${paddingRight} !important;
3382
+ font-size: ${fontSize} !important;
3383
+ font-family: ${fontFamily} !important;
3384
+ letter-spacing: ${letterSpacing} !important;
3385
+ caret-color: ${caretColor} !important;
3386
+ `;
3387
+ };
3388
+
3308
3389
  const componentName$B = getComponentName('password');
3309
3390
 
3391
+ const customMixin$6 = (superclass) =>
3392
+ class PasswordFieldMixinClass extends superclass {
3393
+ init() {
3394
+ super.init?.();
3395
+
3396
+ // reset vaadin's checkValidity
3397
+ this.baseElement.checkValidity = () => {};
3398
+ // set safety attribute `external-input`
3399
+ this.setAttribute('external-input', 'true');
3400
+
3401
+ // use original input element as reference
3402
+ const origInput = this.baseElement.querySelector('input');
3403
+
3404
+ // create external slot
3405
+ const externalInputSlot = createExternalInputSlot('external-input', 'suffix');
3406
+ // append external slot to base element
3407
+ this.baseElement.appendChild(externalInputSlot);
3408
+
3409
+ // create external input
3410
+ const externalInput = createExternalInputEle('external-input', this.getAutocompleteType());
3411
+
3412
+ // apply original input's styles to external input
3413
+ setTimeout(() => {
3414
+ applyExternalInputStyles(origInput, externalInput);
3415
+ });
3416
+
3417
+ // set external input events
3418
+ this.handleExternalInputEvents(externalInput);
3419
+
3420
+ // sync input stateful attributes: `type` (for visibility state change) and `readonly`
3421
+ syncAttrs(origInput, externalInput, { includeAttrs: ['type', 'readonly'] });
3422
+
3423
+ origInput.addEventListener('focus', (e) => {
3424
+ e.preventDefault();
3425
+ if (e.isTrusted) {
3426
+ externalInput.focus();
3427
+ }
3428
+ });
3429
+
3430
+ this.addEventListener('focus', (e) => {
3431
+ e.preventDefault();
3432
+ this.focus();
3433
+ });
3434
+
3435
+ // append external input to component's DOM
3436
+ this.appendChild(externalInput);
3437
+ }
3438
+
3439
+ getAutocompleteType() {
3440
+ return this.getAttribute('autocomplete') || 'current-password';
3441
+ }
3442
+
3443
+ handleExternalInputEvents(inputEle) {
3444
+ // sync value of insible input back to original input
3445
+ inputEle.addEventListener('input', (e) => {
3446
+ this.value = e.target.value;
3447
+ });
3448
+
3449
+ // sync `focused` attribute on host when focusing on external input
3450
+ inputEle.addEventListener('focus', () => {
3451
+ this.setAttribute('focused', 'true');
3452
+ });
3453
+ }
3454
+ };
3455
+
3310
3456
  const {
3311
3457
  host: host$f,
3312
3458
  inputField: inputField$5,
@@ -3322,9 +3468,9 @@ const {
3322
3468
  host: { selector: () => ':host' },
3323
3469
  inputField: { selector: '::part(input-field)' },
3324
3470
  inputElement: { selector: '> input' },
3325
- inputElementPlaceholder: { selector: '> input:placeholder-shown' },
3326
- revealButtonContainer: { selector: () => '::part(reveal-button)' },
3327
- revealButtonIcon: { selector: () => '::part(reveal-button)::before' },
3471
+ inputElementPlaceholder: { selector: () => ':host input:placeholder-shown' },
3472
+ revealButtonContainer: { selector: '::part(reveal-button)' },
3473
+ revealButtonIcon: { selector: '::part(reveal-button)::before' },
3328
3474
  label: { selector: '::part(label)' },
3329
3475
  requiredIndicator: { selector: '[required]::part(required-indicator)::after' },
3330
3476
  helperText: { selector: '::part(helper-text)' },
@@ -3363,8 +3509,14 @@ const PasswordClass = compose(
3363
3509
  labelRequiredIndicator: { ...requiredIndicator$7, property: 'content' },
3364
3510
  errorMessageTextColor: { ...errorMessage$8, property: 'color' },
3365
3511
 
3366
- inputValueTextColor: { ...inputElement$2, property: 'color' },
3367
- inputPlaceholderTextColor: { ...inputElementPlaceholder, property: 'color' },
3512
+ inputPlaceholderTextColor: [
3513
+ { ...inputElementPlaceholder, property: 'color' },
3514
+ { selector: () => ':host ::slotted(input:placeholder-shown)', property: 'color' },
3515
+ ],
3516
+ inputValueTextColor: [
3517
+ { ...inputElement$2, property: 'color' },
3518
+ { selector: () => ':host ::slotted(input)', property: 'color' },
3519
+ ],
3368
3520
 
3369
3521
  revealButtonOffset: [
3370
3522
  { ...revealButtonContainer, property: 'margin-right' },
@@ -3377,7 +3529,8 @@ const PasswordClass = compose(
3377
3529
  draggableMixin,
3378
3530
  composedProxyInputMixin({ proxyProps: ['value', 'selectionStart'] }),
3379
3531
  componentNameValidationMixin,
3380
- passwordDraggableMixin
3532
+ passwordDraggableMixin,
3533
+ customMixin$6
3381
3534
  )(
3382
3535
  createProxy({
3383
3536
  slots: ['', 'suffix'],
@@ -3388,6 +3541,7 @@ const PasswordClass = compose(
3388
3541
  max-width: 100%;
3389
3542
  min-width: 10em;
3390
3543
  box-sizing: border-box;
3544
+ position: relative;
3391
3545
  }
3392
3546
  ${useHostExternalPadding(PasswordClass.cssVarList)}
3393
3547
  ${resetInputCursor('vaadin-password-field')}
@@ -3399,7 +3553,9 @@ const PasswordClass = compose(
3399
3553
  padding: 0;
3400
3554
  }
3401
3555
  vaadin-password-field > input {
3556
+ -webkit-mask-image: none;
3402
3557
  box-sizing: border-box;
3558
+ opacity: 1;
3403
3559
  }
3404
3560
  vaadin-password-field::part(input-field) {
3405
3561
  box-sizing: border-box;
@@ -3408,12 +3564,11 @@ const PasswordClass = compose(
3408
3564
  vaadin-password-field[focus-ring]::part(input-field) {
3409
3565
  box-shadow: none;
3410
3566
  }
3411
- vaadin-password-field > input {
3567
+ :host ::slotted(input) {
3412
3568
  min-height: 0;
3413
- -webkit-mask-image: none;
3414
- }
3415
- vaadin-password-field[readonly] > input:placeholder-shown {
3416
- opacity: 1;
3569
+ }
3570
+ :host([readonly]) ::slotted(input:placeholder-shown) {
3571
+ opacity: 0;
3417
3572
  }
3418
3573
  vaadin-password-field::before {
3419
3574
  height: initial;
@@ -3424,11 +3579,9 @@ const PasswordClass = compose(
3424
3579
  vaadin-password-field-button {
3425
3580
  cursor: pointer;
3426
3581
  }
3427
-
3428
- [readonly] vaadin-password-field-button {
3582
+ :host([readonly]) vaadin-password-field-button {
3429
3583
  pointer-events: none;
3430
3584
  }
3431
-
3432
3585
  vaadin-password-field-button[focus-ring] {
3433
3586
  box-shadow: 0 0 0 2px var(${PasswordClass.cssVarList.inputOutlineColor});
3434
3587
  }
@@ -3466,6 +3619,7 @@ let EnrichedText$2 = class EnrichedText extends createBaseClass({ componentName:
3466
3619
  <style>
3467
3620
  :host {
3468
3621
  display: inline-block;
3622
+ line-height: 1em;
3469
3623
  }
3470
3624
  :host > slot {
3471
3625
  width: 100%;
@@ -6351,13 +6505,24 @@ const customMixin$3 = (superclass) =>
6351
6505
  name="new-password"
6352
6506
  tabindex="-1"
6353
6507
  slot="input"
6354
- ></${componentName$s}>
6508
+ >
6509
+ </${componentName$s}>
6355
6510
  `;
6356
6511
 
6512
+ this.setAttribute('external-input', 'true');
6513
+
6357
6514
  this.baseElement.appendChild(template.content.cloneNode(true));
6358
6515
 
6359
6516
  this.inputElement = this.shadowRoot.querySelector(componentName$s);
6360
6517
 
6518
+ // get descope input components
6519
+ this.passwordInput = this.inputElement.querySelector('[data-id="password"]');
6520
+ this.confirmInput = this.inputElement.querySelector('[data-id="confirm"]');
6521
+
6522
+ // create slots for external password input
6523
+ this.createExternalInput(this.passwordInput, 'external-password-input');
6524
+ this.createExternalInput(this.confirmInput, 'external-confirm-input');
6525
+
6361
6526
  forwardAttrs(this, this.inputElement, {
6362
6527
  includeAttrs: [
6363
6528
  'password-label',
@@ -6380,6 +6545,20 @@ const customMixin$3 = (superclass) =>
6380
6545
  ],
6381
6546
  });
6382
6547
  }
6548
+
6549
+ createExternalInput(node, slotName) {
6550
+ const externalInput = node.querySelector('input');
6551
+ const slotEle = document.createElement('slot');
6552
+ const targetSlot = externalInput.getAttribute('slot');
6553
+ slotEle.setAttribute('name', slotName);
6554
+ slotEle.setAttribute('slot', targetSlot);
6555
+ node.appendChild(slotEle);
6556
+
6557
+ // move external input
6558
+ externalInput.setAttribute('slot', slotName);
6559
+ externalInput.setAttribute('data-hidden-input', 'true');
6560
+ this.appendChild(externalInput);
6561
+ }
6383
6562
  };
6384
6563
 
6385
6564
  const {
@@ -6467,6 +6646,7 @@ const NewPasswordClass = compose(
6467
6646
  padding: 0;
6468
6647
  }
6469
6648
  descope-new-password-internal > .wrapper {
6649
+ -webkit-mask-image: none;
6470
6650
  width: 100%;
6471
6651
  height: 100%;
6472
6652
  display: flex;
@@ -6503,6 +6683,7 @@ const passwordInputAttrs = ['password-label', 'password-placeholder'];
6503
6683
  const confirmInputAttrs = ['confirm-label', 'confirm-placeholder'];
6504
6684
  const policyPanelAttrs = ['has-validation'];
6505
6685
  const commonAttrs = [
6686
+ 'has-confirm',
6506
6687
  'disabled',
6507
6688
  'bordered',
6508
6689
  'size',
@@ -6525,7 +6706,7 @@ const BaseInputClass$4 = createBaseInputClass({ componentName: componentName$s,
6525
6706
 
6526
6707
  class NewPasswordInternal extends BaseInputClass$4 {
6527
6708
  static get observedAttributes() {
6528
- return ['has-confirm'].concat(BaseInputClass$4.observedAttributes || [], inputRelatedAttrs);
6709
+ return [].concat(BaseInputClass$4.observedAttributes || [], inputRelatedAttrs);
6529
6710
  }
6530
6711
 
6531
6712
  constructor() {
@@ -6551,6 +6732,14 @@ class NewPasswordInternal extends BaseInputClass$4 {
6551
6732
  return this.getAttribute('has-confirm') === 'true';
6552
6733
  }
6553
6734
 
6735
+ onHasConfirmChange(hasConfirm) {
6736
+ this.confirmInput.style.display = hasConfirm ? '' : 'none';
6737
+ }
6738
+
6739
+ onHasValidationChange(hasValidation) {
6740
+ this.policyPanel.style.display = hasValidation ? '' : 'none';
6741
+ }
6742
+
6554
6743
  get hasValidation() {
6555
6744
  return this.getAttribute('has-validation') === 'true';
6556
6745
  }
@@ -6589,20 +6778,15 @@ class NewPasswordInternal extends BaseInputClass$4 {
6589
6778
  this.renderInputs(this.hasConfirm, this.hasValidation);
6590
6779
  }
6591
6780
 
6592
- renderInputs(shouldRenderConfirm, shouldRenderValidation) {
6593
- let template = `
6781
+ renderInputs() {
6782
+ const template = `
6594
6783
  <div>
6595
- <descope-password data-id="password"></descope-password>
6596
- <descope-policy-validation class="${
6597
- shouldRenderValidation ? 'hidden' : ''
6598
- }"></descope-policy-validation>
6784
+ <descope-password autocomplete="new-password" data-id="password"></descope-password>
6785
+ <descope-policy-validation></descope-policy-validation>
6599
6786
  </div>
6787
+ <descope-password autocomplete="new-password" data-id="confirm"></descope-password>
6600
6788
  `;
6601
6789
 
6602
- if (shouldRenderConfirm) {
6603
- template += `<descope-password data-id="confirm"></descope-password>`;
6604
- }
6605
-
6606
6790
  this.wrapperEle.innerHTML = template;
6607
6791
 
6608
6792
  this.passwordInput = this.querySelector('[data-id="password"]');
@@ -6613,12 +6797,7 @@ class NewPasswordInternal extends BaseInputClass$4 {
6613
6797
 
6614
6798
  this.initInputs();
6615
6799
 
6616
- // we are calling attributeChangedCallback with all the input related attributes
6617
- // in order to set it on the newly generated input
6618
- [...passwordInputAttrs, ...confirmInputAttrs, ...commonAttrs].forEach((attr) => {
6619
- this.attributeChangedCallback(attr, null, this.getAttribute(attr));
6620
- });
6621
-
6800
+ // sync input value to policy validation panel
6622
6801
  this.passwordInput.addEventListener('input', (e) => {
6623
6802
  this.policyPanel.setAttribute('value', e.target.value);
6624
6803
  });
@@ -6694,22 +6873,14 @@ class NewPasswordInternal extends BaseInputClass$4 {
6694
6873
  value === null ? ele?.removeAttribute(name) : ele?.setAttribute(name, value);
6695
6874
  }
6696
6875
 
6697
- hidePolicy() {
6698
- this.policyPanel.classList.add('hidden');
6699
- }
6700
-
6701
- showPolicy() {
6702
- this.policyPanel.classList.remove('hidden');
6703
- }
6704
-
6705
6876
  attributeChangedCallback(attrName, oldValue, newValue) {
6706
6877
  super.attributeChangedCallback?.(attrName, oldValue, newValue);
6707
6878
 
6708
6879
  if (oldValue !== newValue) {
6709
6880
  if (attrName === 'has-validation') {
6710
- this.renderInputs(this.hasConfirm, newValue === 'true');
6881
+ this.onHasValidationChange(newValue === 'true');
6711
6882
  } else if (attrName === 'has-confirm') {
6712
- this.renderInputs(newValue !== null && newValue !== 'false', this.hasValidation);
6883
+ this.onHasConfirmChange(newValue === 'true');
6713
6884
  } else if (commonAttrs.includes(attrName)) {
6714
6885
  this.inputs.forEach((input) => this.toggleBooleanAttribute(input, attrName, newValue));
6715
6886
  } else if (passwordInputAttrs.includes(attrName)) {
@@ -6725,9 +6896,6 @@ class NewPasswordInternal extends BaseInputClass$4 {
6725
6896
  newValue
6726
6897
  );
6727
6898
  }
6728
- if (attrName === 'has-validation') {
6729
- newValue === 'true' ? this.showPolicy() : this.hidePolicy();
6730
- }
6731
6899
  }
6732
6900
  }
6733
6901
  }