@db-ux/ngx-core-components 4.13.1-angular-signal-forms4-d3a9db2 → 4.13.1-angular-signal-forms6-a1510bb

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.
@@ -1425,9 +1425,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1425
1425
  const defaultProps$B = {};
1426
1426
  class DBCheckbox {
1427
1427
  hasValidState() {
1428
- return !!(this.validMessage() ?? this.validation() === "valid");
1428
+ if (this.validation() === 'no-validation')
1429
+ return false;
1430
+ return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
1429
1431
  }
1430
1432
  handleValidation() {
1433
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
1434
+ if (this.validation() === 'no-validation') {
1435
+ this._valid.set(undefined);
1436
+ this._invalidMessage.set('');
1437
+ this._validMessage.set('');
1438
+ this._descByIds.set(undefined);
1439
+ return;
1440
+ }
1431
1441
  // Signal Forms validation bridge: errors InputSignal has priority
1432
1442
  const signalFormErrors = this.errors();
1433
1443
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -1441,12 +1451,18 @@ class DBCheckbox {
1441
1451
  }
1442
1452
  return; // Signal Forms errors take priority
1443
1453
  }
1444
- else if (this.errors() !== undefined) {
1445
- // Signal Forms provided errors=[] (valid state)
1454
+ else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
1455
+ // Signal Forms provided errors=[] after previous invalid state → now valid
1446
1456
  this._valid.set('valid');
1447
1457
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
1448
1458
  this._invalidMessage.set('');
1449
1459
  }
1460
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
1461
+ // so native validation can take over via CSS :user-invalid selectors
1462
+ if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
1463
+ this._valid.set(undefined);
1464
+ this._validMessage.set('');
1465
+ }
1450
1466
  /* For a11y reasons we need to map the correct message with the checkbox */
1451
1467
  if (!this._ref()?.nativeElement?.validity.valid ||
1452
1468
  this.validation() === "invalid") {
@@ -1754,8 +1770,8 @@ class DBCheckbox {
1754
1770
  <label [attr.for]="_id()"
1755
1771
  ><input
1756
1772
  type="checkbox"
1757
- [attr.aria-invalid]="validation() === 'invalid'"
1758
- [attr.data-custom-validity]="validation()"
1773
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
1774
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
1759
1775
  #_ref
1760
1776
  [attr.id]="_id()"
1761
1777
  [attr.name]="name()"
@@ -1812,8 +1828,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1812
1828
  <label [attr.for]="_id()"
1813
1829
  ><input
1814
1830
  type="checkbox"
1815
- [attr.aria-invalid]="validation() === 'invalid'"
1816
- [attr.data-custom-validity]="validation()"
1831
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
1832
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
1817
1833
  #_ref
1818
1834
  [attr.id]="_id()"
1819
1835
  [attr.name]="name()"
@@ -2901,7 +2917,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
2901
2917
  const defaultProps$w = {};
2902
2918
  class DBInput {
2903
2919
  hasValidState() {
2904
- return !!(this.validMessage() ?? this.validation() === "valid");
2920
+ if (this.validation() === 'no-validation')
2921
+ return false;
2922
+ return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
2905
2923
  }
2906
2924
  getPatternAttr() {
2907
2925
  const p = this.pattern();
@@ -2912,6 +2930,14 @@ class DBInput {
2912
2930
  return undefined;
2913
2931
  }
2914
2932
  handleValidation() {
2933
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
2934
+ if (this.validation() === 'no-validation') {
2935
+ this._valid.set(undefined);
2936
+ this._invalidMessage.set('');
2937
+ this._validMessage.set('');
2938
+ this._descByIds.set(undefined);
2939
+ return;
2940
+ }
2915
2941
  // Signal Forms validation bridge: errors InputSignal has priority
2916
2942
  const signalFormErrors = this.errors();
2917
2943
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -2925,12 +2951,18 @@ class DBInput {
2925
2951
  }
2926
2952
  return; // Signal Forms errors take priority
2927
2953
  }
2928
- else if (this.errors() !== undefined) {
2929
- // Signal Forms provided errors=[] (valid state)
2954
+ else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
2955
+ // Signal Forms provided errors=[] after previous invalid state → now valid
2930
2956
  this._valid.set('valid');
2931
2957
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
2932
2958
  this._invalidMessage.set('');
2933
2959
  }
2960
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
2961
+ // so native validation can take over via CSS :user-invalid selectors
2962
+ if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
2963
+ this._valid.set(undefined);
2964
+ this._validMessage.set('');
2965
+ }
2934
2966
  /* For a11y reasons we need to map the correct message with the input */
2935
2967
  if (!this._ref()?.nativeElement?.validity.valid ||
2936
2968
  this.validation() === "invalid") {
@@ -3285,8 +3317,8 @@ class DBInput {
3285
3317
  >
3286
3318
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
3287
3319
  <input
3288
- [attr.aria-invalid]="validation() === 'invalid'"
3289
- [attr.data-custom-validity]="validation()"
3320
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
3321
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
3290
3322
  [attr.data-field-sizing]="fieldSizing()"
3291
3323
  #_ref
3292
3324
  [attr.id]="_id()"
@@ -3374,8 +3406,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
3374
3406
  >
3375
3407
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
3376
3408
  <input
3377
- [attr.aria-invalid]="validation() === 'invalid'"
3378
- [attr.data-custom-validity]="validation()"
3409
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
3410
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
3379
3411
  [attr.data-field-sizing]="fieldSizing()"
3380
3412
  #_ref
3381
3413
  [attr.id]="_id()"
@@ -3953,9 +3985,20 @@ class DBCustomSelect {
3953
3985
  }
3954
3986
  }
3955
3987
  hasValidState() {
3956
- return !!(this.validMessage() ?? this.validation() === "valid");
3988
+ if (this.validation() === 'no-validation')
3989
+ return false;
3990
+ return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
3957
3991
  }
3958
3992
  handleValidation() {
3993
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
3994
+ if (this.validation() === 'no-validation') {
3995
+ this._valid.set(undefined);
3996
+ this._validity.set(undefined);
3997
+ this._invalidMessage.set('');
3998
+ this._validMessage.set('');
3999
+ this._descByIds.set(undefined);
4000
+ return;
4001
+ }
3959
4002
  // Signal Forms validation bridge: errors InputSignal has priority
3960
4003
  const signalFormErrors = this.errors();
3961
4004
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -3967,14 +4010,23 @@ class DBCustomSelect {
3967
4010
  this._voiceOverFallback.set(this._invalidMessage());
3968
4011
  void delay(() => this._voiceOverFallback.set(""), 1000);
3969
4012
  }
4013
+ this._validity.set('invalid');
3970
4014
  return; // Signal Forms errors take priority
3971
4015
  }
3972
- else if (this.errors() !== undefined) {
3973
- // Signal Forms provided errors=[] (valid state)
4016
+ else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
4017
+ // Signal Forms provided errors=[] after previous invalid state → now valid
3974
4018
  this._valid.set('valid');
4019
+ this._validity.set('valid');
3975
4020
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
3976
4021
  this._invalidMessage.set('');
3977
4022
  }
4023
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
4024
+ // so native validation can take over via CSS :user-invalid selectors
4025
+ if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
4026
+ this._valid.set(undefined);
4027
+ this._validity.set(undefined);
4028
+ this._validMessage.set('');
4029
+ }
3978
4030
  if (this.selectRef()?.nativeElement) {
3979
4031
  this.selectRef().nativeElement.value = this.getNativeSelectValue();
3980
4032
  }
@@ -4536,20 +4588,28 @@ class DBCustomSelect {
4536
4588
  this._valid = signal(undefined, ...(ngDevMode ? [{ debugName: "_valid" }] : /* istanbul ignore next */ []));
4537
4589
  /** Signal Forms alias — maps to 'values' for FormValueControl duck-typing */
4538
4590
  this.value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
4591
+ /** @internal Flag to prevent circular sync between value↔values */
4592
+ this._syncing = false;
4539
4593
  /** @internal Sync value → values (Signal Forms writes to value) */
4540
4594
  this._syncValueToValues = effect(() => {
4541
4595
  const v = this.value();
4596
+ if (this._syncing)
4597
+ return;
4598
+ this._syncing = true;
4542
4599
  if (v !== undefined) {
4543
4600
  this.values.set(Array.isArray(v) ? v : v ? [v] : []);
4544
4601
  }
4602
+ this._syncing = false;
4545
4603
  }, ...(ngDevMode ? [{ debugName: "_syncValueToValues" }] : /* istanbul ignore next */ []));
4546
4604
  /** @internal Sync values → value (CVA/user interaction writes to values) */
4547
4605
  this._syncValuesToValue = effect(() => {
4548
4606
  const vals = this.values();
4549
- const current = vals && vals.length > 0 ? vals[0] : undefined;
4550
- if (current !== this.value()) {
4551
- this.value.set(current);
4552
- }
4607
+ if (this._syncing)
4608
+ return;
4609
+ this._syncing = true;
4610
+ const current = vals && vals.length > 0 ? vals : undefined;
4611
+ this.value.set(current);
4612
+ this._syncing = false;
4553
4613
  }, ...(ngDevMode ? [{ debugName: "_syncValuesToValue" }] : /* istanbul ignore next */ []));
4554
4614
  if (typeof window !== "undefined") {
4555
4615
  effect(() => {
@@ -7943,9 +8003,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
7943
8003
  const defaultProps$f = {};
7944
8004
  class DBSelect {
7945
8005
  hasValidState() {
7946
- return !!(this.validMessage() ?? this.validation() === "valid");
8006
+ if (this.validation() === 'no-validation')
8007
+ return false;
8008
+ return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
7947
8009
  }
7948
8010
  handleValidation() {
8011
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
8012
+ if (this.validation() === 'no-validation') {
8013
+ this._valid.set(undefined);
8014
+ this._invalidMessage.set('');
8015
+ this._validMessage.set('');
8016
+ this._descByIds.set(undefined);
8017
+ return;
8018
+ }
7949
8019
  // Signal Forms validation bridge: errors InputSignal has priority
7950
8020
  const signalFormErrors = this.errors();
7951
8021
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -7959,12 +8029,18 @@ class DBSelect {
7959
8029
  }
7960
8030
  return; // Signal Forms errors take priority
7961
8031
  }
7962
- else if (this.errors() !== undefined) {
7963
- // Signal Forms provided errors=[] (valid state)
8032
+ else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
8033
+ // Signal Forms provided errors=[] after previous invalid state → now valid
7964
8034
  this._valid.set('valid');
7965
8035
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
7966
8036
  this._invalidMessage.set('');
7967
8037
  }
8038
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
8039
+ // so native validation can take over via CSS :user-invalid selectors
8040
+ if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
8041
+ this._valid.set(undefined);
8042
+ this._validMessage.set('');
8043
+ }
7968
8044
  /* For a11y reasons we need to map the correct message with the select */
7969
8045
  if (!this._ref()?.nativeElement?.validity.valid ||
7970
8046
  this.validation() === "invalid") {
@@ -8313,8 +8389,8 @@ class DBSelect {
8313
8389
  >
8314
8390
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
8315
8391
  <select
8316
- [attr.aria-invalid]="validation() === 'invalid'"
8317
- [attr.data-custom-validity]="validation()"
8392
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
8393
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
8318
8394
  #_ref
8319
8395
  [required]="getBoolean(required(), 'required')"
8320
8396
  [disabled]="getBoolean(disabled(), 'disabled')"
@@ -8417,8 +8493,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
8417
8493
  >
8418
8494
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
8419
8495
  <select
8420
- [attr.aria-invalid]="validation() === 'invalid'"
8421
- [attr.data-custom-validity]="validation()"
8496
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
8497
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
8422
8498
  #_ref
8423
8499
  [required]="getBoolean(required(), 'required')"
8424
8500
  [disabled]="getBoolean(disabled(), 'disabled')"
@@ -8636,9 +8712,19 @@ const StackJustifyContentList = ['space-between', 'start', 'end', 'center'];
8636
8712
  const defaultProps$d = {};
8637
8713
  class DBSwitch {
8638
8714
  hasValidState() {
8639
- return !!(this.validMessage() ?? this.validation() === "valid");
8715
+ if (this.validation() === 'no-validation')
8716
+ return false;
8717
+ return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
8640
8718
  }
8641
8719
  handleValidation() {
8720
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
8721
+ if (this.validation() === 'no-validation') {
8722
+ this._valid.set(undefined);
8723
+ this._invalidMessage.set('');
8724
+ this._validMessage.set('');
8725
+ this._descByIds.set(undefined);
8726
+ return;
8727
+ }
8642
8728
  // Signal Forms validation bridge: errors InputSignal has priority
8643
8729
  const signalFormErrors = this.errors();
8644
8730
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -8652,12 +8738,18 @@ class DBSwitch {
8652
8738
  }
8653
8739
  return; // Signal Forms errors take priority
8654
8740
  }
8655
- else if (this.errors() !== undefined) {
8656
- // Signal Forms provided errors=[] (valid state)
8741
+ else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
8742
+ // Signal Forms provided errors=[] after previous invalid state → now valid
8657
8743
  this._valid.set('valid');
8658
8744
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
8659
8745
  this._invalidMessage.set('');
8660
8746
  }
8747
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
8748
+ // so native validation can take over via CSS :user-invalid selectors
8749
+ if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
8750
+ this._valid.set(undefined);
8751
+ this._validMessage.set('');
8752
+ }
8661
8753
  if (!this._ref()?.nativeElement?.validity?.valid ||
8662
8754
  this.validation() === "invalid") {
8663
8755
  this._descByIds.set(this._invalidMessageId());
@@ -8944,7 +9036,7 @@ class DBSwitch {
8944
9036
  [attr.data-hide-label]="getHideProp(showLabel())"
8945
9037
  [attr.data-variant]="variant()"
8946
9038
  [attr.data-hide-asterisk]="getHideProp(showRequiredAsterisk())"
8947
- [attr.data-custom-validity]="validation()"
9039
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
8948
9040
  [class]="cls('db-switch', className())"
8949
9041
  >
8950
9042
  <label [attr.for]="_id()"
@@ -8956,7 +9048,7 @@ class DBSwitch {
8956
9048
  [checked]="getBoolean(checked(), 'checked')"
8957
9049
  [value]="value()"
8958
9050
  [disabled]="getBoolean(disabled(), 'disabled')"
8959
- [attr.aria-invalid]="validation() === 'invalid' ? 'true' : undefined"
9051
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid' ? 'true' : undefined"
8960
9052
  [attr.aria-describedby]="_descByIds()"
8961
9053
  [attr.name]="name()"
8962
9054
  [required]="getBoolean(required(), 'required')"
@@ -9009,7 +9101,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9009
9101
  [attr.data-hide-label]="getHideProp(showLabel())"
9010
9102
  [attr.data-variant]="variant()"
9011
9103
  [attr.data-hide-asterisk]="getHideProp(showRequiredAsterisk())"
9012
- [attr.data-custom-validity]="validation()"
9104
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
9013
9105
  [class]="cls('db-switch', className())"
9014
9106
  >
9015
9107
  <label [attr.for]="_id()"
@@ -9021,7 +9113,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9021
9113
  [checked]="getBoolean(checked(), 'checked')"
9022
9114
  [value]="value()"
9023
9115
  [disabled]="getBoolean(disabled(), 'disabled')"
9024
- [attr.aria-invalid]="validation() === 'invalid' ? 'true' : undefined"
9116
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid' ? 'true' : undefined"
9025
9117
  [attr.aria-describedby]="_descByIds()"
9026
9118
  [attr.name]="name()"
9027
9119
  [required]="getBoolean(required(), 'required')"
@@ -11002,9 +11094,19 @@ const TagBehaviorList = ['static', 'removable'];
11002
11094
  const defaultProps = {};
11003
11095
  class DBTextarea {
11004
11096
  hasValidState() {
11005
- return !!(this.validMessage() ?? this.validation() === "valid");
11097
+ if (this.validation() === 'no-validation')
11098
+ return false;
11099
+ return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
11006
11100
  }
11007
11101
  handleValidation() {
11102
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
11103
+ if (this.validation() === 'no-validation') {
11104
+ this._valid.set(undefined);
11105
+ this._invalidMessage.set('');
11106
+ this._validMessage.set('');
11107
+ this._descByIds.set(undefined);
11108
+ return;
11109
+ }
11008
11110
  // Signal Forms validation bridge: errors InputSignal has priority
11009
11111
  const signalFormErrors = this.errors();
11010
11112
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -11018,12 +11120,18 @@ class DBTextarea {
11018
11120
  }
11019
11121
  return; // Signal Forms errors take priority
11020
11122
  }
11021
- else if (this.errors() !== undefined) {
11022
- // Signal Forms provided errors=[] (valid state)
11123
+ else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
11124
+ // Signal Forms provided errors=[] after previous invalid state → now valid
11023
11125
  this._valid.set('valid');
11024
11126
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
11025
11127
  this._invalidMessage.set('');
11026
11128
  }
11129
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
11130
+ // so native validation can take over via CSS :user-invalid selectors
11131
+ if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
11132
+ this._valid.set(undefined);
11133
+ this._validMessage.set('');
11134
+ }
11027
11135
  /* For a11y reasons we need to map the correct message with the textarea */
11028
11136
  if (!this._ref()?.nativeElement?.validity.valid ||
11029
11137
  this.validation() === "invalid") {
@@ -11337,8 +11445,8 @@ class DBTextarea {
11337
11445
  >
11338
11446
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
11339
11447
  <textarea
11340
- [attr.aria-invalid]="validation() === 'invalid'"
11341
- [attr.data-custom-validity]="validation()"
11448
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
11449
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
11342
11450
  [attr.data-field-sizing]="fieldSizing()"
11343
11451
  #_ref
11344
11452
  [attr.id]="_id()"
@@ -11406,8 +11514,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
11406
11514
  >
11407
11515
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
11408
11516
  <textarea
11409
- [attr.aria-invalid]="validation() === 'invalid'"
11410
- [attr.data-custom-validity]="validation()"
11517
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
11518
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
11411
11519
  [attr.data-field-sizing]="fieldSizing()"
11412
11520
  #_ref
11413
11521
  [attr.id]="_id()"