@db-ux/ngx-core-components 4.13.1-angular-signal-forms5-fe63b55 → 4.13.1-angular-signal-forms9-42cbbed

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.
@@ -144,8 +144,36 @@ const stringPropVisible = (givenString, showString) => {
144
144
  return toBool(showString) && Boolean(givenString);
145
145
  };
146
146
  const getSearchInput = (element) => element.querySelector(`input[type="search"]`);
147
+ // WeakMap to store generated keys for option objects without mutating them.
148
+ // Used only as a last resort for options that have neither id, value, nor label.
149
+ const optionKeyMap = new WeakMap();
147
150
  const getOptionKey = (option, prefix) => {
148
- const key = option.id ?? option.value ?? uuid();
151
+ // 1. Consumer-provided id stable and unique (best case).
152
+ if (option.id) {
153
+ return `${prefix}${option.id}`;
154
+ }
155
+ // 2. Data-based key from value and/or label — stable across object
156
+ // recreations (e.g. inline options={[...]} on every render).
157
+ // Combining both fields maximizes uniqueness: two options may share
158
+ // a value but users couldn't distinguish identical labels, so in
159
+ // practice the combination is unique.
160
+ // We prefix each segment with its length to avoid ambiguous
161
+ // concatenations (e.g. 'a-b'+'c' vs 'a'+'b-c').
162
+ const value = option.value !== undefined && option.value !== '' ? String(option.value) : '';
163
+ const label = option.label ?? '';
164
+ if (value || label) {
165
+ return `${prefix}${value.length}:${value}.${label}`;
166
+ }
167
+ // 3. Last resort for truly anonymous options (no id, no value, no label).
168
+ // WeakMap ties a generated uuid to the object reference so the key
169
+ // persists as long as the same object is reused. If the consumer
170
+ // recreates these objects every render, keys will be unstable — but
171
+ // that's an unsolvable edge case without any data to anchor to.
172
+ let key = optionKeyMap.get(option);
173
+ if (!key) {
174
+ key = uuid();
175
+ optionKeyMap.set(option, key);
176
+ }
149
177
  return `${prefix}${key}`;
150
178
  };
151
179
  const isKeyboardEvent = (event) => event.key !== undefined;
@@ -1425,9 +1453,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1425
1453
  const defaultProps$B = {};
1426
1454
  class DBCheckbox {
1427
1455
  hasValidState() {
1456
+ if (this.validation() === 'no-validation')
1457
+ return false;
1428
1458
  return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
1429
1459
  }
1430
1460
  handleValidation() {
1461
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
1462
+ if (this.validation() === 'no-validation') {
1463
+ this._valid.set(undefined);
1464
+ this._invalidMessage.set('');
1465
+ this._validMessage.set('');
1466
+ this._descByIds.set(undefined);
1467
+ return;
1468
+ }
1431
1469
  // Signal Forms validation bridge: errors InputSignal has priority
1432
1470
  const signalFormErrors = this.errors();
1433
1471
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -1447,6 +1485,12 @@ class DBCheckbox {
1447
1485
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
1448
1486
  this._invalidMessage.set('');
1449
1487
  }
1488
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
1489
+ // so native validation can take over via CSS :user-invalid selectors
1490
+ if (this._valid() === 'valid' && this._ref()?.nativeElement?.validity && !this._ref()?.nativeElement?.validity?.valid) {
1491
+ this._valid.set(undefined);
1492
+ this._validMessage.set('');
1493
+ }
1450
1494
  /* For a11y reasons we need to map the correct message with the checkbox */
1451
1495
  if (!this._ref()?.nativeElement?.validity.valid ||
1452
1496
  this.validation() === "invalid") {
@@ -1704,6 +1748,13 @@ class DBCheckbox {
1704
1748
  }
1705
1749
  }
1706
1750
  }
1751
+ /**
1752
+ * Reflect Signal Forms hidden state to the host element.
1753
+ * This intentionally intercepts Angular's native [hidden] binding —
1754
+ * consumers using [hidden]="condition" will hide the component via
1755
+ * :host([hidden]) { display: none !important }.
1756
+ */
1757
+ get isHidden() { return this.hidden(); }
1707
1758
  /** @legacy CVA - will be removed in a future major version */
1708
1759
  writeValue(value) {
1709
1760
  this.checked.set(!!value);
@@ -1724,8 +1775,6 @@ class DBCheckbox {
1724
1775
  setDisabledState(disabled) {
1725
1776
  this.disabled.set(disabled);
1726
1777
  }
1727
- /** Reflect Signal Forms hidden state to the host element */
1728
- get isHidden() { return this.hidden(); }
1729
1778
  ngAfterViewInit() {
1730
1779
  const element = this._ref()?.nativeElement;
1731
1780
  this.enableAttributePassing(element, "db-checkbox");
@@ -1754,8 +1803,8 @@ class DBCheckbox {
1754
1803
  <label [attr.for]="_id()"
1755
1804
  ><input
1756
1805
  type="checkbox"
1757
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
1758
- [attr.data-custom-validity]="_valid() ?? validation()"
1806
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
1807
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
1759
1808
  #_ref
1760
1809
  [attr.id]="_id()"
1761
1810
  [attr.name]="name()"
@@ -1812,8 +1861,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1812
1861
  <label [attr.for]="_id()"
1813
1862
  ><input
1814
1863
  type="checkbox"
1815
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
1816
- [attr.data-custom-validity]="_valid() ?? validation()"
1864
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
1865
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
1817
1866
  #_ref
1818
1867
  [attr.id]="_id()"
1819
1868
  [attr.name]="name()"
@@ -2677,6 +2726,13 @@ class DBCustomSelectListItem {
2677
2726
  }
2678
2727
  }
2679
2728
  }
2729
+ /**
2730
+ * Reflect Signal Forms hidden state to the host element.
2731
+ * This intentionally intercepts Angular's native [hidden] binding —
2732
+ * consumers using [hidden]="condition" will hide the component via
2733
+ * :host([hidden]) { display: none !important }.
2734
+ */
2735
+ get isHidden() { return this.hidden(); }
2680
2736
  /** @legacy CVA - will be removed in a future major version */
2681
2737
  writeValue(value) {
2682
2738
  this.checked.set(!!value);
@@ -2697,8 +2753,6 @@ class DBCustomSelectListItem {
2697
2753
  setDisabledState(disabled) {
2698
2754
  this.disabled.set(disabled);
2699
2755
  }
2700
- /** Reflect Signal Forms hidden state to the host element */
2701
- get isHidden() { return this.hidden(); }
2702
2756
  ngAfterViewInit() {
2703
2757
  const element = this._ref()?.nativeElement;
2704
2758
  this.enableAttributePassing(element, "db-custom-select-list-item");
@@ -2901,6 +2955,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
2901
2955
  const defaultProps$w = {};
2902
2956
  class DBInput {
2903
2957
  hasValidState() {
2958
+ if (this.validation() === 'no-validation')
2959
+ return false;
2904
2960
  return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
2905
2961
  }
2906
2962
  getPatternAttr() {
@@ -2912,6 +2968,14 @@ class DBInput {
2912
2968
  return undefined;
2913
2969
  }
2914
2970
  handleValidation() {
2971
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
2972
+ if (this.validation() === 'no-validation') {
2973
+ this._valid.set(undefined);
2974
+ this._invalidMessage.set('');
2975
+ this._validMessage.set('');
2976
+ this._descByIds.set(undefined);
2977
+ return;
2978
+ }
2915
2979
  // Signal Forms validation bridge: errors InputSignal has priority
2916
2980
  const signalFormErrors = this.errors();
2917
2981
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -2931,6 +2995,12 @@ class DBInput {
2931
2995
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
2932
2996
  this._invalidMessage.set('');
2933
2997
  }
2998
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
2999
+ // so native validation can take over via CSS :user-invalid selectors
3000
+ if (this._valid() === 'valid' && this._ref()?.nativeElement?.validity && !this._ref()?.nativeElement?.validity?.valid) {
3001
+ this._valid.set(undefined);
3002
+ this._validMessage.set('');
3003
+ }
2934
3004
  /* For a11y reasons we need to map the correct message with the input */
2935
3005
  if (!this._ref()?.nativeElement?.validity.valid ||
2936
3006
  this.validation() === "invalid") {
@@ -3233,6 +3303,13 @@ class DBInput {
3233
3303
  }
3234
3304
  }
3235
3305
  }
3306
+ /**
3307
+ * Reflect Signal Forms hidden state to the host element.
3308
+ * This intentionally intercepts Angular's native [hidden] binding —
3309
+ * consumers using [hidden]="condition" will hide the component via
3310
+ * :host([hidden]) { display: none !important }.
3311
+ */
3312
+ get isHidden() { return this.hidden(); }
3236
3313
  /** @legacy CVA - will be removed in a future major version */
3237
3314
  writeValue(value) {
3238
3315
  this.value.set(value);
@@ -3253,8 +3330,6 @@ class DBInput {
3253
3330
  setDisabledState(disabled) {
3254
3331
  this.disabled.set(disabled);
3255
3332
  }
3256
- /** Reflect Signal Forms hidden state to the host element */
3257
- get isHidden() { return this.hidden(); }
3258
3333
  ngAfterViewInit() {
3259
3334
  const element = this._ref()?.nativeElement;
3260
3335
  this.enableAttributePassing(element, "db-input");
@@ -3285,8 +3360,8 @@ class DBInput {
3285
3360
  >
3286
3361
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
3287
3362
  <input
3288
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
3289
- [attr.data-custom-validity]="_valid() ?? validation()"
3363
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
3364
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
3290
3365
  [attr.data-field-sizing]="fieldSizing()"
3291
3366
  #_ref
3292
3367
  [attr.id]="_id()"
@@ -3374,8 +3449,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
3374
3449
  >
3375
3450
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
3376
3451
  <input
3377
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
3378
- [attr.data-custom-validity]="_valid() ?? validation()"
3452
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
3453
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
3379
3454
  [attr.data-field-sizing]="fieldSizing()"
3380
3455
  #_ref
3381
3456
  [attr.id]="_id()"
@@ -3953,9 +4028,20 @@ class DBCustomSelect {
3953
4028
  }
3954
4029
  }
3955
4030
  hasValidState() {
4031
+ if (this.validation() === 'no-validation')
4032
+ return false;
3956
4033
  return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
3957
4034
  }
3958
4035
  handleValidation() {
4036
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
4037
+ if (this.validation() === 'no-validation') {
4038
+ this._valid.set(undefined);
4039
+ this._validity.set(undefined);
4040
+ this._invalidMessage.set('');
4041
+ this._validMessage.set('');
4042
+ this._descByIds.set(undefined);
4043
+ return;
4044
+ }
3959
4045
  // Signal Forms validation bridge: errors InputSignal has priority
3960
4046
  const signalFormErrors = this.errors();
3961
4047
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -3963,11 +4049,11 @@ class DBCustomSelect {
3963
4049
  this._invalidMessage.set(signalFormErrors[0].message ?? DEFAULT_INVALID_MESSAGE);
3964
4050
  this._validMessage.set('');
3965
4051
  this._valid.set('invalid');
4052
+ this._validity.set('invalid');
3966
4053
  if (hasVoiceOver()) {
3967
4054
  this._voiceOverFallback.set(this._invalidMessage());
3968
4055
  void delay(() => this._voiceOverFallback.set(""), 1000);
3969
4056
  }
3970
- this._validity.set('invalid');
3971
4057
  return; // Signal Forms errors take priority
3972
4058
  }
3973
4059
  else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
@@ -3977,6 +4063,13 @@ class DBCustomSelect {
3977
4063
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
3978
4064
  this._invalidMessage.set('');
3979
4065
  }
4066
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
4067
+ // so native validation can take over via CSS :user-invalid selectors
4068
+ if (this._valid() === 'valid' && this._ref()?.nativeElement?.validity && !this._ref()?.nativeElement?.validity?.valid) {
4069
+ this._valid.set(undefined);
4070
+ this._validity.set(undefined);
4071
+ this._validMessage.set('');
4072
+ }
3980
4073
  if (this.selectRef()?.nativeElement) {
3981
4074
  this.selectRef().nativeElement.value = this.getNativeSelectValue();
3982
4075
  }
@@ -4538,28 +4631,33 @@ class DBCustomSelect {
4538
4631
  this._valid = signal(undefined, ...(ngDevMode ? [{ debugName: "_valid" }] : /* istanbul ignore next */ []));
4539
4632
  /** Signal Forms alias — maps to 'values' for FormValueControl duck-typing */
4540
4633
  this.value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
4541
- /** @internal Flag to prevent circular sync between value↔values */
4542
- this._syncing = false;
4634
+ /**
4635
+ * @internal Tracks the origin of the last write to prevent infinite ping-pong.
4636
+ * Convergence is guaranteed by Angular's signal equality check
4637
+ * (setting a signal to the same value does not re-notify dependents).
4638
+ */
4639
+ this._syncSource = 'none';
4543
4640
  /** @internal Sync value → values (Signal Forms writes to value) */
4544
4641
  this._syncValueToValues = effect(() => {
4545
4642
  const v = this.value();
4546
- if (this._syncing)
4643
+ if (this._syncSource === 'values') {
4644
+ this._syncSource = 'none';
4547
4645
  return;
4548
- this._syncing = true;
4646
+ }
4647
+ this._syncSource = 'value';
4549
4648
  if (v !== undefined) {
4550
4649
  this.values.set(Array.isArray(v) ? v : v ? [v] : []);
4551
4650
  }
4552
- this._syncing = false;
4553
4651
  }, ...(ngDevMode ? [{ debugName: "_syncValueToValues" }] : /* istanbul ignore next */ []));
4554
4652
  /** @internal Sync values → value (CVA/user interaction writes to values) */
4555
4653
  this._syncValuesToValue = effect(() => {
4556
4654
  const vals = this.values();
4557
- if (this._syncing)
4655
+ if (this._syncSource === 'value') {
4656
+ this._syncSource = 'none';
4558
4657
  return;
4559
- this._syncing = true;
4560
- const current = vals && vals.length > 0 ? vals : undefined;
4561
- this.value.set(current);
4562
- this._syncing = false;
4658
+ }
4659
+ this._syncSource = 'values';
4660
+ this.value.set(vals ?? []);
4563
4661
  }, ...(ngDevMode ? [{ debugName: "_syncValuesToValue" }] : /* istanbul ignore next */ []));
4564
4662
  if (typeof window !== "undefined") {
4565
4663
  effect(() => {
@@ -4883,6 +4981,13 @@ class DBCustomSelect {
4883
4981
  }
4884
4982
  }
4885
4983
  }
4984
+ /**
4985
+ * Reflect Signal Forms hidden state to the host element.
4986
+ * This intentionally intercepts Angular's native [hidden] binding —
4987
+ * consumers using [hidden]="condition" will hide the component via
4988
+ * :host([hidden]) { display: none !important }.
4989
+ */
4990
+ get isHidden() { return this.hidden(); }
4886
4991
  /** @legacy CVA - will be removed in a future major version */
4887
4992
  writeValue(value) {
4888
4993
  this.values.set(value);
@@ -4903,8 +5008,6 @@ class DBCustomSelect {
4903
5008
  setDisabledState(disabled) {
4904
5009
  this.disabled.set(disabled);
4905
5010
  }
4906
- /** Reflect Signal Forms hidden state to the host element */
4907
- get isHidden() { return this.hidden(); }
4908
5011
  ngAfterViewInit() {
4909
5012
  const element = this._ref()?.nativeElement;
4910
5013
  this.enableAttributePassing(element, "db-custom-select");
@@ -7744,6 +7847,13 @@ class DBRadio {
7744
7847
  }
7745
7848
  }
7746
7849
  }
7850
+ /**
7851
+ * Reflect Signal Forms hidden state to the host element.
7852
+ * This intentionally intercepts Angular's native [hidden] binding —
7853
+ * consumers using [hidden]="condition" will hide the component via
7854
+ * :host([hidden]) { display: none !important }.
7855
+ */
7856
+ get isHidden() { return this.hidden(); }
7747
7857
  /** @legacy CVA - will be removed in a future major version */
7748
7858
  writeValue(value) {
7749
7859
  if (value) {
@@ -7766,8 +7876,6 @@ class DBRadio {
7766
7876
  setDisabledState(disabled) {
7767
7877
  this.disabled.set(disabled);
7768
7878
  }
7769
- /** Reflect Signal Forms hidden state to the host element */
7770
- get isHidden() { return this.hidden(); }
7771
7879
  ngAfterViewInit() {
7772
7880
  const element = this._ref()?.nativeElement;
7773
7881
  this.enableAttributePassing(element, "db-radio");
@@ -7953,9 +8061,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
7953
8061
  const defaultProps$f = {};
7954
8062
  class DBSelect {
7955
8063
  hasValidState() {
8064
+ if (this.validation() === 'no-validation')
8065
+ return false;
7956
8066
  return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
7957
8067
  }
7958
8068
  handleValidation() {
8069
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
8070
+ if (this.validation() === 'no-validation') {
8071
+ this._valid.set(undefined);
8072
+ this._invalidMessage.set('');
8073
+ this._validMessage.set('');
8074
+ this._descByIds.set(undefined);
8075
+ return;
8076
+ }
7959
8077
  // Signal Forms validation bridge: errors InputSignal has priority
7960
8078
  const signalFormErrors = this.errors();
7961
8079
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -7975,6 +8093,12 @@ class DBSelect {
7975
8093
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
7976
8094
  this._invalidMessage.set('');
7977
8095
  }
8096
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
8097
+ // so native validation can take over via CSS :user-invalid selectors
8098
+ if (this._valid() === 'valid' && this._ref()?.nativeElement?.validity && !this._ref()?.nativeElement?.validity?.valid) {
8099
+ this._valid.set(undefined);
8100
+ this._validMessage.set('');
8101
+ }
7978
8102
  /* For a11y reasons we need to map the correct message with the select */
7979
8103
  if (!this._ref()?.nativeElement?.validity.valid ||
7980
8104
  this.validation() === "invalid") {
@@ -8270,6 +8394,13 @@ class DBSelect {
8270
8394
  }
8271
8395
  }
8272
8396
  }
8397
+ /**
8398
+ * Reflect Signal Forms hidden state to the host element.
8399
+ * This intentionally intercepts Angular's native [hidden] binding —
8400
+ * consumers using [hidden]="condition" will hide the component via
8401
+ * :host([hidden]) { display: none !important }.
8402
+ */
8403
+ get isHidden() { return this.hidden(); }
8273
8404
  /** @legacy CVA - will be removed in a future major version */
8274
8405
  writeValue(value) {
8275
8406
  this.value.set(value);
@@ -8290,8 +8421,6 @@ class DBSelect {
8290
8421
  setDisabledState(disabled) {
8291
8422
  this.disabled.set(disabled);
8292
8423
  }
8293
- /** Reflect Signal Forms hidden state to the host element */
8294
- get isHidden() { return this.hidden(); }
8295
8424
  ngAfterViewInit() {
8296
8425
  const element = this._ref()?.nativeElement;
8297
8426
  this.enableAttributePassing(element, "db-select");
@@ -8323,8 +8452,8 @@ class DBSelect {
8323
8452
  >
8324
8453
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
8325
8454
  <select
8326
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
8327
- [attr.data-custom-validity]="_valid() ?? validation()"
8455
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
8456
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
8328
8457
  #_ref
8329
8458
  [required]="getBoolean(required(), 'required')"
8330
8459
  [disabled]="getBoolean(disabled(), 'disabled')"
@@ -8427,8 +8556,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
8427
8556
  >
8428
8557
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
8429
8558
  <select
8430
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
8431
- [attr.data-custom-validity]="_valid() ?? validation()"
8559
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
8560
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
8432
8561
  #_ref
8433
8562
  [required]="getBoolean(required(), 'required')"
8434
8563
  [disabled]="getBoolean(disabled(), 'disabled')"
@@ -8646,9 +8775,19 @@ const StackJustifyContentList = ['space-between', 'start', 'end', 'center'];
8646
8775
  const defaultProps$d = {};
8647
8776
  class DBSwitch {
8648
8777
  hasValidState() {
8778
+ if (this.validation() === 'no-validation')
8779
+ return false;
8649
8780
  return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
8650
8781
  }
8651
8782
  handleValidation() {
8783
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
8784
+ if (this.validation() === 'no-validation') {
8785
+ this._valid.set(undefined);
8786
+ this._invalidMessage.set('');
8787
+ this._validMessage.set('');
8788
+ this._descByIds.set(undefined);
8789
+ return;
8790
+ }
8652
8791
  // Signal Forms validation bridge: errors InputSignal has priority
8653
8792
  const signalFormErrors = this.errors();
8654
8793
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -8668,6 +8807,12 @@ class DBSwitch {
8668
8807
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
8669
8808
  this._invalidMessage.set('');
8670
8809
  }
8810
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
8811
+ // so native validation can take over via CSS :user-invalid selectors
8812
+ if (this._valid() === 'valid' && this._ref()?.nativeElement?.validity && !this._ref()?.nativeElement?.validity?.valid) {
8813
+ this._valid.set(undefined);
8814
+ this._validMessage.set('');
8815
+ }
8671
8816
  if (!this._ref()?.nativeElement?.validity?.valid ||
8672
8817
  this.validation() === "invalid") {
8673
8818
  this._descByIds.set(this._invalidMessageId());
@@ -8907,6 +9052,13 @@ class DBSwitch {
8907
9052
  }
8908
9053
  }
8909
9054
  }
9055
+ /**
9056
+ * Reflect Signal Forms hidden state to the host element.
9057
+ * This intentionally intercepts Angular's native [hidden] binding —
9058
+ * consumers using [hidden]="condition" will hide the component via
9059
+ * :host([hidden]) { display: none !important }.
9060
+ */
9061
+ get isHidden() { return this.hidden(); }
8910
9062
  /** @legacy CVA - will be removed in a future major version */
8911
9063
  writeValue(value) {
8912
9064
  this.checked.set(!!value);
@@ -8927,8 +9079,6 @@ class DBSwitch {
8927
9079
  setDisabledState(disabled) {
8928
9080
  this.disabled.set(disabled);
8929
9081
  }
8930
- /** Reflect Signal Forms hidden state to the host element */
8931
- get isHidden() { return this.hidden(); }
8932
9082
  ngAfterViewInit() {
8933
9083
  const element = this._ref()?.nativeElement;
8934
9084
  this.enableAttributePassing(element, "db-switch");
@@ -8954,7 +9104,7 @@ class DBSwitch {
8954
9104
  [attr.data-hide-label]="getHideProp(showLabel())"
8955
9105
  [attr.data-variant]="variant()"
8956
9106
  [attr.data-hide-asterisk]="getHideProp(showRequiredAsterisk())"
8957
- [attr.data-custom-validity]="_valid() ?? validation()"
9107
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
8958
9108
  [class]="cls('db-switch', className())"
8959
9109
  >
8960
9110
  <label [attr.for]="_id()"
@@ -8966,7 +9116,7 @@ class DBSwitch {
8966
9116
  [checked]="getBoolean(checked(), 'checked')"
8967
9117
  [value]="value()"
8968
9118
  [disabled]="getBoolean(disabled(), 'disabled')"
8969
- [attr.aria-invalid]="validation() === 'invalid' ? 'true' : undefined"
9119
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid' ? 'true' : undefined"
8970
9120
  [attr.aria-describedby]="_descByIds()"
8971
9121
  [attr.name]="name()"
8972
9122
  [required]="getBoolean(required(), 'required')"
@@ -9019,7 +9169,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9019
9169
  [attr.data-hide-label]="getHideProp(showLabel())"
9020
9170
  [attr.data-variant]="variant()"
9021
9171
  [attr.data-hide-asterisk]="getHideProp(showRequiredAsterisk())"
9022
- [attr.data-custom-validity]="_valid() ?? validation()"
9172
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
9023
9173
  [class]="cls('db-switch', className())"
9024
9174
  >
9025
9175
  <label [attr.for]="_id()"
@@ -9031,7 +9181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9031
9181
  [checked]="getBoolean(checked(), 'checked')"
9032
9182
  [value]="value()"
9033
9183
  [disabled]="getBoolean(disabled(), 'disabled')"
9034
- [attr.aria-invalid]="validation() === 'invalid' ? 'true' : undefined"
9184
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid' ? 'true' : undefined"
9035
9185
  [attr.aria-describedby]="_descByIds()"
9036
9186
  [attr.name]="name()"
9037
9187
  [required]="getBoolean(required(), 'required')"
@@ -9229,6 +9379,13 @@ class DBTabItem {
9229
9379
  }
9230
9380
  }
9231
9381
  }
9382
+ /**
9383
+ * Reflect Signal Forms hidden state to the host element.
9384
+ * This intentionally intercepts Angular's native [hidden] binding —
9385
+ * consumers using [hidden]="condition" will hide the component via
9386
+ * :host([hidden]) { display: none !important }.
9387
+ */
9388
+ get isHidden() { return this.hidden(); }
9232
9389
  /** @legacy CVA - will be removed in a future major version */
9233
9390
  writeValue(value) {
9234
9391
  this.checked.set(!!value);
@@ -9249,8 +9406,6 @@ class DBTabItem {
9249
9406
  setDisabledState(disabled) {
9250
9407
  this.disabled.set(disabled);
9251
9408
  }
9252
- /** Reflect Signal Forms hidden state to the host element */
9253
- get isHidden() { return this.hidden(); }
9254
9409
  ngAfterViewInit() {
9255
9410
  const element = this._ref()?.nativeElement;
9256
9411
  this.enableAttributePassing(element, "db-tab-item");
@@ -9543,6 +9698,7 @@ class DBTableDataCell {
9543
9698
  this.cls = cls;
9544
9699
  this.getNumber = getNumber;
9545
9700
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
9701
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
9546
9702
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
9547
9703
  this.horizontalAlignment = input(...(ngDevMode ? [undefined, { debugName: "horizontalAlignment" }] : /* istanbul ignore next */ []));
9548
9704
  this.verticalAlignment = input(...(ngDevMode ? [undefined, { debugName: "verticalAlignment" }] : /* istanbul ignore next */ []));
@@ -9599,9 +9755,9 @@ class DBTableDataCell {
9599
9755
  this.enableAttributePassing(element, "db-table-data-cell");
9600
9756
  }
9601
9757
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableDataCell, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9602
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBTableDataCell, isStandalone: true, selector: "db-table-data-cell", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, horizontalAlignment: { classPropertyName: "horizontalAlignment", publicName: "horizontalAlignment", isSignal: true, isRequired: false, transformFunction: null }, verticalAlignment: { classPropertyName: "verticalAlignment", publicName: "verticalAlignment", isSignal: true, isRequired: false, transformFunction: null }, colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null }, colspan: { classPropertyName: "colspan", publicName: "colspan", isSignal: true, isRequired: false, transformFunction: null }, rowSpan: { classPropertyName: "rowSpan", publicName: "rowSpan", isSignal: true, isRequired: false, transformFunction: null }, rowspan: { classPropertyName: "rowspan", publicName: "rowspan", isSignal: true, isRequired: false, transformFunction: null }, headers: { classPropertyName: "headers", publicName: "headers", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<td
9758
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBTableDataCell, isStandalone: true, selector: "db-table-data-cell", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, horizontalAlignment: { classPropertyName: "horizontalAlignment", publicName: "horizontalAlignment", isSignal: true, isRequired: false, transformFunction: null }, verticalAlignment: { classPropertyName: "verticalAlignment", publicName: "verticalAlignment", isSignal: true, isRequired: false, transformFunction: null }, colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null }, colspan: { classPropertyName: "colspan", publicName: "colspan", isSignal: true, isRequired: false, transformFunction: null }, rowSpan: { classPropertyName: "rowSpan", publicName: "rowSpan", isSignal: true, isRequired: false, transformFunction: null }, rowspan: { classPropertyName: "rowspan", publicName: "rowspan", isSignal: true, isRequired: false, transformFunction: null }, headers: { classPropertyName: "headers", publicName: "headers", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<td
9603
9759
  #_ref
9604
- [attr.id]="id()"
9760
+ [attr.id]="id() ?? propOverrides()?.id"
9605
9761
  [class]="cls('db-table-data-cell', className())"
9606
9762
  [attr.data-horizontal-alignment]="horizontalAlignment()"
9607
9763
  [attr.data-vertical-alignment]="verticalAlignment()"
@@ -9616,7 +9772,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9616
9772
  type: Component,
9617
9773
  args: [{ selector: "db-table-data-cell", standalone: true, imports: [CommonModule], template: `<td
9618
9774
  #_ref
9619
- [attr.id]="id()"
9775
+ [attr.id]="id() ?? propOverrides()?.id"
9620
9776
  [class]="cls('db-table-data-cell', className())"
9621
9777
  [attr.data-horizontal-alignment]="horizontalAlignment()"
9622
9778
  [attr.data-vertical-alignment]="verticalAlignment()"
@@ -9626,7 +9782,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9626
9782
  >
9627
9783
  <ng-content></ng-content>
9628
9784
  </td> `, styles: [":host{display:contents}\n"] }]
9629
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], horizontalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontalAlignment", required: false }] }], verticalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "verticalAlignment", required: false }] }], colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }], colspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colspan", required: false }] }], rowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSpan", required: false }] }], rowspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowspan", required: false }] }], headers: [{ type: i0.Input, args: [{ isSignal: true, alias: "headers", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
9785
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], horizontalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontalAlignment", required: false }] }], verticalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "verticalAlignment", required: false }] }], colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }], colspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colspan", required: false }] }], rowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSpan", required: false }] }], rowspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowspan", required: false }] }], headers: [{ type: i0.Input, args: [{ isSignal: true, alias: "headers", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
9630
9786
 
9631
9787
  const defaultProps$8 = {};
9632
9788
  class DBTableHeaderCell {
@@ -9635,6 +9791,7 @@ class DBTableHeaderCell {
9635
9791
  this.getBooleanAsString = getBooleanAsString;
9636
9792
  this.getNumber = getNumber;
9637
9793
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
9794
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
9638
9795
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
9639
9796
  this.horizontalAlignment = input(...(ngDevMode ? [undefined, { debugName: "horizontalAlignment" }] : /* istanbul ignore next */ []));
9640
9797
  this.verticalAlignment = input(...(ngDevMode ? [undefined, { debugName: "verticalAlignment" }] : /* istanbul ignore next */ []));
@@ -9694,9 +9851,9 @@ class DBTableHeaderCell {
9694
9851
  this.enableAttributePassing(element, "db-table-header-cell");
9695
9852
  }
9696
9853
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableHeaderCell, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9697
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBTableHeaderCell, isStandalone: true, selector: "db-table-header-cell", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, horizontalAlignment: { classPropertyName: "horizontalAlignment", publicName: "horizontalAlignment", isSignal: true, isRequired: false, transformFunction: null }, verticalAlignment: { classPropertyName: "verticalAlignment", publicName: "verticalAlignment", isSignal: true, isRequired: false, transformFunction: null }, noText: { classPropertyName: "noText", publicName: "noText", isSignal: true, isRequired: false, transformFunction: null }, scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: false, transformFunction: null }, colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null }, colspan: { classPropertyName: "colspan", publicName: "colspan", isSignal: true, isRequired: false, transformFunction: null }, rowSpan: { classPropertyName: "rowSpan", publicName: "rowSpan", isSignal: true, isRequired: false, transformFunction: null }, rowspan: { classPropertyName: "rowspan", publicName: "rowspan", isSignal: true, isRequired: false, transformFunction: null }, headers: { classPropertyName: "headers", publicName: "headers", isSignal: true, isRequired: false, transformFunction: null }, abbr: { classPropertyName: "abbr", publicName: "abbr", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<th
9854
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBTableHeaderCell, isStandalone: true, selector: "db-table-header-cell", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, horizontalAlignment: { classPropertyName: "horizontalAlignment", publicName: "horizontalAlignment", isSignal: true, isRequired: false, transformFunction: null }, verticalAlignment: { classPropertyName: "verticalAlignment", publicName: "verticalAlignment", isSignal: true, isRequired: false, transformFunction: null }, noText: { classPropertyName: "noText", publicName: "noText", isSignal: true, isRequired: false, transformFunction: null }, scope: { classPropertyName: "scope", publicName: "scope", isSignal: true, isRequired: false, transformFunction: null }, colSpan: { classPropertyName: "colSpan", publicName: "colSpan", isSignal: true, isRequired: false, transformFunction: null }, colspan: { classPropertyName: "colspan", publicName: "colspan", isSignal: true, isRequired: false, transformFunction: null }, rowSpan: { classPropertyName: "rowSpan", publicName: "rowSpan", isSignal: true, isRequired: false, transformFunction: null }, rowspan: { classPropertyName: "rowspan", publicName: "rowspan", isSignal: true, isRequired: false, transformFunction: null }, headers: { classPropertyName: "headers", publicName: "headers", isSignal: true, isRequired: false, transformFunction: null }, abbr: { classPropertyName: "abbr", publicName: "abbr", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<th
9698
9855
  #_ref
9699
- [attr.id]="id()"
9856
+ [attr.id]="id() ?? propOverrides()?.id"
9700
9857
  [class]="cls('db-table-header-cell', className())"
9701
9858
  [attr.data-horizontal-alignment]="horizontalAlignment()"
9702
9859
  [attr.data-vertical-alignment]="verticalAlignment()"
@@ -9714,7 +9871,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9714
9871
  type: Component,
9715
9872
  args: [{ selector: "db-table-header-cell", standalone: true, imports: [CommonModule], template: `<th
9716
9873
  #_ref
9717
- [attr.id]="id()"
9874
+ [attr.id]="id() ?? propOverrides()?.id"
9718
9875
  [class]="cls('db-table-header-cell', className())"
9719
9876
  [attr.data-horizontal-alignment]="horizontalAlignment()"
9720
9877
  [attr.data-vertical-alignment]="verticalAlignment()"
@@ -9727,7 +9884,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9727
9884
  >
9728
9885
  <ng-content></ng-content>
9729
9886
  </th> `, styles: [":host{display:contents}\n"] }]
9730
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], horizontalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontalAlignment", required: false }] }], verticalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "verticalAlignment", required: false }] }], noText: [{ type: i0.Input, args: [{ isSignal: true, alias: "noText", required: false }] }], scope: [{ type: i0.Input, args: [{ isSignal: true, alias: "scope", required: false }] }], colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }], colspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colspan", required: false }] }], rowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSpan", required: false }] }], rowspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowspan", required: false }] }], headers: [{ type: i0.Input, args: [{ isSignal: true, alias: "headers", required: false }] }], abbr: [{ type: i0.Input, args: [{ isSignal: true, alias: "abbr", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
9887
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], horizontalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "horizontalAlignment", required: false }] }], verticalAlignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "verticalAlignment", required: false }] }], noText: [{ type: i0.Input, args: [{ isSignal: true, alias: "noText", required: false }] }], scope: [{ type: i0.Input, args: [{ isSignal: true, alias: "scope", required: false }] }], colSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colSpan", required: false }] }], colspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "colspan", required: false }] }], rowSpan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowSpan", required: false }] }], rowspan: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowspan", required: false }] }], headers: [{ type: i0.Input, args: [{ isSignal: true, alias: "headers", required: false }] }], abbr: [{ type: i0.Input, args: [{ isSignal: true, alias: "abbr", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
9731
9888
 
9732
9889
  const defaultProps$7 = {};
9733
9890
  class DBTableRow {
@@ -9742,6 +9899,7 @@ class DBTableRow {
9742
9899
  this.getBooleanAsString = getBooleanAsString;
9743
9900
  this.uuid = uuid;
9744
9901
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
9902
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
9745
9903
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
9746
9904
  this.interactive = input(...(ngDevMode ? [undefined, { debugName: "interactive" }] : /* istanbul ignore next */ []));
9747
9905
  this.subHeaderEmphasis = input(...(ngDevMode ? [undefined, { debugName: "subHeaderEmphasis" }] : /* istanbul ignore next */ []));
@@ -9794,9 +9952,9 @@ class DBTableRow {
9794
9952
  this.enableAttributePassing(element, "db-table-row");
9795
9953
  }
9796
9954
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableRow, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9797
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableRow, isStandalone: true, selector: "db-table-row", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, subHeaderEmphasis: { classPropertyName: "subHeaderEmphasis", publicName: "subHeaderEmphasis", isSignal: true, isRequired: false, transformFunction: null }, cells: { classPropertyName: "cells", publicName: "cells", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<tr
9955
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableRow, isStandalone: true, selector: "db-table-row", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, subHeaderEmphasis: { classPropertyName: "subHeaderEmphasis", publicName: "subHeaderEmphasis", isSignal: true, isRequired: false, transformFunction: null }, cells: { classPropertyName: "cells", publicName: "cells", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<tr
9798
9956
  #_ref
9799
- [attr.id]="id()"
9957
+ [attr.id]="id() ?? propOverrides()?.id"
9800
9958
  [class]="cls('db-table-row', className())"
9801
9959
  [attr.data-interactive]="getBooleanAsString(interactive())"
9802
9960
  [attr.data-sub-header-emphasis]="subHeaderEmphasis()"
@@ -9874,13 +10032,13 @@ class DBTableRow {
9874
10032
  } } }@else{
9875
10033
  <ng-content></ng-content>
9876
10034
  }
9877
- </tr> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableDataCell, selector: "db-table-data-cell", inputs: ["id", "className", "horizontalAlignment", "verticalAlignment", "colSpan", "colspan", "rowSpan", "rowspan", "headers"] }, { kind: "component", type: DBLink, selector: "db-link", inputs: ["id", "propOverrides", "className", "href", "target", "rel", "role", "referrerpolicy", "referrerPolicy", "hreflang", "disabled", "size", "showIcon", "variant", "content", "wrap", "text"] }, { kind: "component", type: DBTableHeaderCell, selector: "db-table-header-cell", inputs: ["id", "className", "horizontalAlignment", "verticalAlignment", "noText", "scope", "colSpan", "colspan", "rowSpan", "rowspan", "headers", "abbr"] }] }); }
10035
+ </tr> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableDataCell, selector: "db-table-data-cell", inputs: ["id", "propOverrides", "className", "horizontalAlignment", "verticalAlignment", "colSpan", "colspan", "rowSpan", "rowspan", "headers"] }, { kind: "component", type: DBLink, selector: "db-link", inputs: ["id", "propOverrides", "className", "href", "target", "rel", "role", "referrerpolicy", "referrerPolicy", "hreflang", "disabled", "size", "showIcon", "variant", "content", "wrap", "text"] }, { kind: "component", type: DBTableHeaderCell, selector: "db-table-header-cell", inputs: ["id", "propOverrides", "className", "horizontalAlignment", "verticalAlignment", "noText", "scope", "colSpan", "colspan", "rowSpan", "rowspan", "headers", "abbr"] }] }); }
9878
10036
  }
9879
10037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableRow, decorators: [{
9880
10038
  type: Component,
9881
10039
  args: [{ selector: "db-table-row", standalone: true, imports: [CommonModule, DBTableDataCell, DBLink, DBTableHeaderCell], template: `<tr
9882
10040
  #_ref
9883
- [attr.id]="id()"
10041
+ [attr.id]="id() ?? propOverrides()?.id"
9884
10042
  [class]="cls('db-table-row', className())"
9885
10043
  [attr.data-interactive]="getBooleanAsString(interactive())"
9886
10044
  [attr.data-sub-header-emphasis]="subHeaderEmphasis()"
@@ -9959,7 +10117,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
9959
10117
  <ng-content></ng-content>
9960
10118
  }
9961
10119
  </tr> `, styles: [":host{display:contents}\n"] }]
9962
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], subHeaderEmphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "subHeaderEmphasis", required: false }] }], cells: [{ type: i0.Input, args: [{ isSignal: true, alias: "cells", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10120
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], subHeaderEmphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "subHeaderEmphasis", required: false }] }], cells: [{ type: i0.Input, args: [{ isSignal: true, alias: "cells", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
9963
10121
 
9964
10122
  const defaultProps$6 = {};
9965
10123
  class DBTableBody {
@@ -9970,6 +10128,7 @@ class DBTableBody {
9970
10128
  this.cls = cls;
9971
10129
  this.uuid = uuid;
9972
10130
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
10131
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
9973
10132
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
9974
10133
  this.rows = input(...(ngDevMode ? [undefined, { debugName: "rows" }] : /* istanbul ignore next */ []));
9975
10134
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
@@ -10020,9 +10179,9 @@ class DBTableBody {
10020
10179
  this.enableAttributePassing(element, "db-table-body");
10021
10180
  }
10022
10181
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableBody, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10023
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableBody, isStandalone: true, selector: "db-table-body", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<tbody
10182
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableBody, isStandalone: true, selector: "db-table-body", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<tbody
10024
10183
  #_ref
10025
- [attr.id]="id()"
10184
+ [attr.id]="id() ?? propOverrides()?.id"
10026
10185
  [class]="cls('db-table-body', className())"
10027
10186
  >
10028
10187
  @if(rows()){ @for (row of rows();track trackByRow0(index, row);let index =
@@ -10036,13 +10195,13 @@ class DBTableBody {
10036
10195
  } }@else{
10037
10196
  <ng-content></ng-content>
10038
10197
  }
10039
- </tbody> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableRow, selector: "db-table-row", inputs: ["id", "className", "interactive", "subHeaderEmphasis", "cells"] }] }); }
10198
+ </tbody> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableRow, selector: "db-table-row", inputs: ["id", "propOverrides", "className", "interactive", "subHeaderEmphasis", "cells"] }] }); }
10040
10199
  }
10041
10200
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableBody, decorators: [{
10042
10201
  type: Component,
10043
10202
  args: [{ selector: "db-table-body", standalone: true, imports: [CommonModule, DBTableRow], template: `<tbody
10044
10203
  #_ref
10045
- [attr.id]="id()"
10204
+ [attr.id]="id() ?? propOverrides()?.id"
10046
10205
  [class]="cls('db-table-body', className())"
10047
10206
  >
10048
10207
  @if(rows()){ @for (row of rows();track trackByRow0(index, row);let index =
@@ -10057,7 +10216,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10057
10216
  <ng-content></ng-content>
10058
10217
  }
10059
10218
  </tbody> `, styles: [":host{display:contents}\n"] }]
10060
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10219
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10061
10220
 
10062
10221
  const defaultProps$5 = {};
10063
10222
  class DBTableFooter {
@@ -10068,6 +10227,7 @@ class DBTableFooter {
10068
10227
  this.cls = cls;
10069
10228
  this.uuid = uuid;
10070
10229
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
10230
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
10071
10231
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
10072
10232
  this.rows = input(...(ngDevMode ? [undefined, { debugName: "rows" }] : /* istanbul ignore next */ []));
10073
10233
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
@@ -10118,9 +10278,9 @@ class DBTableFooter {
10118
10278
  this.enableAttributePassing(element, "db-table-footer");
10119
10279
  }
10120
10280
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableFooter, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableFooter, isStandalone: true, selector: "db-table-footer", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<tfoot
10281
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableFooter, isStandalone: true, selector: "db-table-footer", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<tfoot
10122
10282
  #_ref
10123
- [attr.id]="id()"
10283
+ [attr.id]="id() ?? propOverrides()?.id"
10124
10284
  [class]="cls('db-table-footer', className())"
10125
10285
  >
10126
10286
  @if(rows()){ @for (row of rows();track trackByRow0(index, row);let index =
@@ -10134,13 +10294,13 @@ class DBTableFooter {
10134
10294
  } }@else{
10135
10295
  <ng-content></ng-content>
10136
10296
  }
10137
- </tfoot> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableRow, selector: "db-table-row", inputs: ["id", "className", "interactive", "subHeaderEmphasis", "cells"] }] }); }
10297
+ </tfoot> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableRow, selector: "db-table-row", inputs: ["id", "propOverrides", "className", "interactive", "subHeaderEmphasis", "cells"] }] }); }
10138
10298
  }
10139
10299
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableFooter, decorators: [{
10140
10300
  type: Component,
10141
10301
  args: [{ selector: "db-table-footer", standalone: true, imports: [CommonModule, DBTableRow], template: `<tfoot
10142
10302
  #_ref
10143
- [attr.id]="id()"
10303
+ [attr.id]="id() ?? propOverrides()?.id"
10144
10304
  [class]="cls('db-table-footer', className())"
10145
10305
  >
10146
10306
  @if(rows()){ @for (row of rows();track trackByRow0(index, row);let index =
@@ -10155,7 +10315,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10155
10315
  <ng-content></ng-content>
10156
10316
  }
10157
10317
  </tfoot> `, styles: [":host{display:contents}\n"] }]
10158
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10318
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10159
10319
 
10160
10320
  const defaultProps$4 = {};
10161
10321
  class DBTableHead {
@@ -10191,6 +10351,7 @@ class DBTableHead {
10191
10351
  this.cls = cls;
10192
10352
  this.uuid = uuid;
10193
10353
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
10354
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
10194
10355
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
10195
10356
  this.rows = input(...(ngDevMode ? [undefined, { debugName: "rows" }] : /* istanbul ignore next */ []));
10196
10357
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
@@ -10248,9 +10409,9 @@ class DBTableHead {
10248
10409
  this.observer()?.disconnect();
10249
10410
  }
10250
10411
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableHead, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10251
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableHead, isStandalone: true, selector: "db-table-head", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<thead
10412
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTableHead, isStandalone: true, selector: "db-table-head", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<thead
10252
10413
  #_ref
10253
- [attr.id]="id()"
10414
+ [attr.id]="id() ?? propOverrides()?.id"
10254
10415
  [class]="cls('db-table-head', className())"
10255
10416
  >
10256
10417
  @if(rows()){ @for (row of rows();track trackByRow0(index, row);let index =
@@ -10265,13 +10426,13 @@ class DBTableHead {
10265
10426
  } }@else{
10266
10427
  <ng-content></ng-content>
10267
10428
  }
10268
- </thead> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableRow, selector: "db-table-row", inputs: ["id", "className", "interactive", "subHeaderEmphasis", "cells"] }] }); }
10429
+ </thead> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTableRow, selector: "db-table-row", inputs: ["id", "propOverrides", "className", "interactive", "subHeaderEmphasis", "cells"] }] }); }
10269
10430
  }
10270
10431
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableHead, decorators: [{
10271
10432
  type: Component,
10272
10433
  args: [{ selector: "db-table-head", standalone: true, imports: [CommonModule, DBTableRow], template: `<thead
10273
10434
  #_ref
10274
- [attr.id]="id()"
10435
+ [attr.id]="id() ?? propOverrides()?.id"
10275
10436
  [class]="cls('db-table-head', className())"
10276
10437
  >
10277
10438
  @if(rows()){ @for (row of rows();track trackByRow0(index, row);let index =
@@ -10287,7 +10448,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10287
10448
  <ng-content></ng-content>
10288
10449
  }
10289
10450
  </thead> `, styles: [":host{display:contents}\n"] }]
10290
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10451
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10291
10452
 
10292
10453
  const defaultProps$3 = {};
10293
10454
  class DBTable {
@@ -10336,6 +10497,7 @@ class DBTable {
10336
10497
  this.showCaption = input(...(ngDevMode ? [undefined, { debugName: "showCaption" }] : /* istanbul ignore next */ []));
10337
10498
  this.stickyHeader = input(...(ngDevMode ? [undefined, { debugName: "stickyHeader" }] : /* istanbul ignore next */ []));
10338
10499
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
10500
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
10339
10501
  this.captionPlain = input(...(ngDevMode ? [undefined, { debugName: "captionPlain" }] : /* istanbul ignore next */ []));
10340
10502
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
10341
10503
  this._data = signal(undefined, ...(ngDevMode ? [{ debugName: "_data" }] : /* istanbul ignore next */ []));
@@ -10464,7 +10626,7 @@ class DBTable {
10464
10626
  this.observer()?.disconnect();
10465
10627
  }
10466
10628
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTable, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10467
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTable, isStandalone: true, selector: "db-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, mobileVariant: { classPropertyName: "mobileVariant", publicName: "mobileVariant", isSignal: true, isRequired: false, transformFunction: null }, columnSizes: { classPropertyName: "columnSizes", publicName: "columnSizes", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, divider: { classPropertyName: "divider", publicName: "divider", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, showCaption: { classPropertyName: "showCaption", publicName: "showCaption", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, captionPlain: { classPropertyName: "captionPlain", publicName: "captionPlain", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<div
10629
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTable, isStandalone: true, selector: "db-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, mobileVariant: { classPropertyName: "mobileVariant", publicName: "mobileVariant", isSignal: true, isRequired: false, transformFunction: null }, columnSizes: { classPropertyName: "columnSizes", publicName: "columnSizes", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, divider: { classPropertyName: "divider", publicName: "divider", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, showCaption: { classPropertyName: "showCaption", publicName: "showCaption", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, captionPlain: { classPropertyName: "captionPlain", publicName: "captionPlain", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<div
10468
10630
  [class]="cls('db-table', className())"
10469
10631
  [ngStyle]="_style()"
10470
10632
  [attr.data-width]="width()"
@@ -10475,7 +10637,7 @@ class DBTable {
10475
10637
  [attr.data-show-caption]="getBooleanAsString(showCaption())"
10476
10638
  [attr.data-sticky-header]="stickyHeader()"
10477
10639
  >
10478
- <table #_ref [attr.id]="id()">
10640
+ <table #_ref [attr.id]="id() ?? propOverrides()?.id">
10479
10641
  @if(captionPlain()){
10480
10642
  <caption>
10481
10643
  {{captionPlain()}}
@@ -10492,7 +10654,7 @@ class DBTable {
10492
10654
  <ng-content></ng-content>
10493
10655
  }
10494
10656
  </table>
10495
- </div> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DBTableHead, selector: "db-table-head", inputs: ["id", "className", "rows"] }, { kind: "component", type: DBTableBody, selector: "db-table-body", inputs: ["id", "className", "rows"] }, { kind: "component", type: DBTableFooter, selector: "db-table-footer", inputs: ["id", "className", "rows"] }] }); }
10657
+ </div> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DBTableHead, selector: "db-table-head", inputs: ["id", "propOverrides", "className", "rows"] }, { kind: "component", type: DBTableBody, selector: "db-table-body", inputs: ["id", "propOverrides", "className", "rows"] }, { kind: "component", type: DBTableFooter, selector: "db-table-footer", inputs: ["id", "propOverrides", "className", "rows"] }] }); }
10496
10658
  }
10497
10659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTable, decorators: [{
10498
10660
  type: Component,
@@ -10507,7 +10669,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10507
10669
  [attr.data-show-caption]="getBooleanAsString(showCaption())"
10508
10670
  [attr.data-sticky-header]="stickyHeader()"
10509
10671
  >
10510
- <table #_ref [attr.id]="id()">
10672
+ <table #_ref [attr.id]="id() ?? propOverrides()?.id">
10511
10673
  @if(captionPlain()){
10512
10674
  <caption>
10513
10675
  {{captionPlain()}}
@@ -10525,7 +10687,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10525
10687
  }
10526
10688
  </table>
10527
10689
  </div> `, styles: [":host{display:contents}\n"] }]
10528
- }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], mobileVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileVariant", required: false }] }], columnSizes: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnSizes", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], divider: [{ type: i0.Input, args: [{ isSignal: true, alias: "divider", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], showCaption: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCaption", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], captionPlain: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionPlain", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10690
+ }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], mobileVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileVariant", required: false }] }], columnSizes: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnSizes", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], divider: [{ type: i0.Input, args: [{ isSignal: true, alias: "divider", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], showCaption: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCaption", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], captionPlain: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionPlain", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10529
10691
 
10530
10692
  const defaultProps$2 = {};
10531
10693
  class DBTableCaption {
@@ -10551,6 +10713,7 @@ class DBTableCaption {
10551
10713
  constructor() {
10552
10714
  this.cls = cls;
10553
10715
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
10716
+ this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
10554
10717
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
10555
10718
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
10556
10719
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
@@ -10607,9 +10770,9 @@ class DBTableCaption {
10607
10770
  this.observer()?.disconnect();
10608
10771
  }
10609
10772
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTableCaption, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10610
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBTableCaption, isStandalone: true, selector: "db-table-caption", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<caption
10773
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBTableCaption, isStandalone: true, selector: "db-table-caption", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<caption
10611
10774
  #_ref
10612
- [attr.id]="id()"
10775
+ [attr.id]="id() ?? propOverrides()?.id"
10613
10776
  [class]="cls('db-table-caption', className())"
10614
10777
  >
10615
10778
  <ng-content></ng-content>
@@ -10619,12 +10782,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10619
10782
  type: Component,
10620
10783
  args: [{ selector: "db-table-caption", standalone: true, imports: [CommonModule], template: `<caption
10621
10784
  #_ref
10622
- [attr.id]="id()"
10785
+ [attr.id]="id() ?? propOverrides()?.id"
10623
10786
  [class]="cls('db-table-caption', className())"
10624
10787
  >
10625
10788
  <ng-content></ng-content>
10626
10789
  </caption> `, styles: [":host{display:contents}\n"] }]
10627
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10790
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
10628
10791
 
10629
10792
  const DBTableHeaderCellScopeList = ['row', 'col', 'rowgroup', 'colgroup'];
10630
10793
 
@@ -11012,9 +11175,19 @@ const TagBehaviorList = ['static', 'removable'];
11012
11175
  const defaultProps = {};
11013
11176
  class DBTextarea {
11014
11177
  hasValidState() {
11178
+ if (this.validation() === 'no-validation')
11179
+ return false;
11015
11180
  return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
11016
11181
  }
11017
11182
  handleValidation() {
11183
+ // validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
11184
+ if (this.validation() === 'no-validation') {
11185
+ this._valid.set(undefined);
11186
+ this._invalidMessage.set('');
11187
+ this._validMessage.set('');
11188
+ this._descByIds.set(undefined);
11189
+ return;
11190
+ }
11018
11191
  // Signal Forms validation bridge: errors InputSignal has priority
11019
11192
  const signalFormErrors = this.errors();
11020
11193
  if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
@@ -11034,6 +11207,12 @@ class DBTextarea {
11034
11207
  this._validMessage.set(DEFAULT_VALID_MESSAGE);
11035
11208
  this._invalidMessage.set('');
11036
11209
  }
11210
+ // If Signal Forms says "valid" but native validation disagrees, reset _valid
11211
+ // so native validation can take over via CSS :user-invalid selectors
11212
+ if (this._valid() === 'valid' && this._ref()?.nativeElement?.validity && !this._ref()?.nativeElement?.validity?.valid) {
11213
+ this._valid.set(undefined);
11214
+ this._validMessage.set('');
11215
+ }
11037
11216
  /* For a11y reasons we need to map the correct message with the textarea */
11038
11217
  if (!this._ref()?.nativeElement?.validity.valid ||
11039
11218
  this.validation() === "invalid") {
@@ -11299,6 +11478,13 @@ class DBTextarea {
11299
11478
  }
11300
11479
  }
11301
11480
  }
11481
+ /**
11482
+ * Reflect Signal Forms hidden state to the host element.
11483
+ * This intentionally intercepts Angular's native [hidden] binding —
11484
+ * consumers using [hidden]="condition" will hide the component via
11485
+ * :host([hidden]) { display: none !important }.
11486
+ */
11487
+ get isHidden() { return this.hidden(); }
11302
11488
  /** @legacy CVA - will be removed in a future major version */
11303
11489
  writeValue(value) {
11304
11490
  this.value.set(value);
@@ -11319,8 +11505,6 @@ class DBTextarea {
11319
11505
  setDisabledState(disabled) {
11320
11506
  this.disabled.set(disabled);
11321
11507
  }
11322
- /** Reflect Signal Forms hidden state to the host element */
11323
- get isHidden() { return this.hidden(); }
11324
11508
  ngAfterViewInit() {
11325
11509
  const element = this._ref()?.nativeElement;
11326
11510
  this.enableAttributePassing(element, "db-textarea");
@@ -11347,8 +11531,8 @@ class DBTextarea {
11347
11531
  >
11348
11532
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
11349
11533
  <textarea
11350
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
11351
- [attr.data-custom-validity]="_valid() ?? validation()"
11534
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
11535
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
11352
11536
  [attr.data-field-sizing]="fieldSizing()"
11353
11537
  #_ref
11354
11538
  [attr.id]="_id()"
@@ -11416,8 +11600,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
11416
11600
  >
11417
11601
  <label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
11418
11602
  <textarea
11419
- [attr.aria-invalid]="(_valid() ?? validation()) === 'invalid'"
11420
- [attr.data-custom-validity]="_valid() ?? validation()"
11603
+ [attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
11604
+ [attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
11421
11605
  [attr.data-field-sizing]="fieldSizing()"
11422
11606
  #_ref
11423
11607
  [attr.id]="_id()"