@aurodesignsystem/auro-formkit 6.0.3 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +20 -8
  2. package/components/checkbox/demo/customize.min.js +14 -4
  3. package/components/checkbox/demo/getting-started.min.js +14 -4
  4. package/components/checkbox/demo/index.min.js +14 -4
  5. package/components/checkbox/dist/index.js +14 -4
  6. package/components/checkbox/dist/registered.js +14 -4
  7. package/components/combobox/demo/customize.min.js +71 -10
  8. package/components/combobox/demo/getting-started.min.js +71 -10
  9. package/components/combobox/demo/index.min.js +71 -10
  10. package/components/combobox/dist/index.js +71 -10
  11. package/components/combobox/dist/registered.js +71 -10
  12. package/components/counter/demo/customize.min.js +2 -2
  13. package/components/counter/demo/index.min.js +2 -2
  14. package/components/counter/dist/index.js +2 -2
  15. package/components/counter/dist/registered.js +2 -2
  16. package/components/datepicker/demo/customize.min.js +64 -8
  17. package/components/datepicker/demo/index.min.js +64 -8
  18. package/components/datepicker/dist/index.js +64 -8
  19. package/components/datepicker/dist/registered.js +64 -8
  20. package/components/dropdown/demo/customize.min.js +1 -1
  21. package/components/dropdown/demo/getting-started.min.js +63 -7
  22. package/components/dropdown/demo/index.min.js +1 -1
  23. package/components/dropdown/dist/index.js +1 -1
  24. package/components/dropdown/dist/registered.js +1 -1
  25. package/components/form/demo/customize.min.js +241 -38
  26. package/components/form/demo/getting-started.min.js +241 -38
  27. package/components/form/demo/index.min.js +241 -38
  28. package/components/form/demo/registerDemoDeps.min.js +241 -38
  29. package/components/input/demo/api.md +1 -1
  30. package/components/input/demo/css-only.md +2 -2
  31. package/components/input/demo/customize.md +3 -3
  32. package/components/input/demo/customize.min.js +62 -6
  33. package/components/input/demo/getting-started.min.js +62 -6
  34. package/components/input/demo/index.min.js +62 -6
  35. package/components/input/demo/why-input.md +2 -3
  36. package/components/input/dist/auro-input.d.ts +8 -0
  37. package/components/input/dist/base-input.d.ts +2 -0
  38. package/components/input/dist/index.js +62 -6
  39. package/components/input/dist/registered.js +62 -6
  40. package/components/radio/demo/customize.min.js +15 -4
  41. package/components/radio/demo/getting-started.min.js +15 -4
  42. package/components/radio/demo/index.min.js +15 -4
  43. package/components/radio/dist/auro-radio-group.d.ts +1 -0
  44. package/components/radio/dist/index.js +15 -4
  45. package/components/radio/dist/registered.js +15 -4
  46. package/components/select/demo/customize.min.js +13 -4
  47. package/components/select/demo/getting-started.min.js +13 -4
  48. package/components/select/demo/index.min.js +13 -4
  49. package/components/select/dist/auro-select.d.ts +2 -0
  50. package/components/select/dist/index.js +13 -4
  51. package/components/select/dist/registered.js +13 -4
  52. package/custom-elements.json +1516 -1504
  53. package/package.json +1 -1
@@ -4992,7 +4992,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4992
4992
  }
4993
4993
  };
4994
4994
 
4995
- var formkitVersion$2 = '202608111803';
4995
+ var formkitVersion$2 = '202608262225';
4996
4996
 
4997
4997
  let AuroElement$2 = class AuroElement extends i$3 {
4998
4998
  static get properties() {
@@ -17164,6 +17164,8 @@ class BaseInput extends AuroElement$1 {
17164
17164
 
17165
17165
  /**
17166
17166
  * If set, the label will remain fixed in the active position.
17167
+ * Only applies to the classic/default layout; the emphasized and snowflake
17168
+ * layouts always render the label inside the field, so this has no effect there.
17167
17169
  */
17168
17170
  activeLabel: {
17169
17171
  type: Boolean,
@@ -18283,6 +18285,18 @@ class BaseInput extends AuroElement$1 {
18283
18285
  cardIcon: 'cc-dinersclub',
18284
18286
  maskFormat: "0000 000000 0000"
18285
18287
  },
18288
+ {
18289
+ // JCB is variable length (16-19 digits), like UnionPay, so it reuses the
18290
+ // formatMinLength/formatLength range machinery. The 35 prefix overlaps no
18291
+ // other brand (Amex is 34|37, Diners is 30[0-5]|36|38).
18292
+ name: 'JCB',
18293
+ regex: /^(?<num>35)\d{0}/u,
18294
+ formatMinLength: 19,
18295
+ formatLength: 23,
18296
+ errorMessage: CreditCardValidationMessage,
18297
+ cardIcon: 'cc-jcb',
18298
+ maskFormat: "0000 0000 0000 0000 000"
18299
+ },
18286
18300
  {
18287
18301
  name: 'Visa',
18288
18302
  regex: /^(?<num>4)\d{0}/u,
@@ -18314,6 +18328,20 @@ class BaseInput extends AuroElement$1 {
18314
18328
  errorMessage: CreditCardValidationMessage,
18315
18329
  cardIcon: 'cc-discover',
18316
18330
  maskFormat: "0000 0000 0000 0000"
18331
+ },
18332
+ {
18333
+ // China UnionPay is variable length (16-19 digits). It must come after
18334
+ // Discover so the last-match-wins loop below gives its 62 prefix
18335
+ // precedence over the generic `6` that resolves to Discover. 81 is used
18336
+ // by UnionPay cards issued outside mainland China and overlaps no other
18337
+ // brand. 60 is intentionally excluded (it overlaps real Discover 6011).
18338
+ name: 'China UnionPay',
18339
+ regex: /^(?<num>62|81)\d{0}/u,
18340
+ formatMinLength: 19,
18341
+ formatLength: 23,
18342
+ errorMessage: CreditCardValidationMessage,
18343
+ cardIcon: 'cc-unionpay',
18344
+ maskFormat: "0000 0000 0000 0000 000"
18317
18345
  }
18318
18346
  ];
18319
18347
 
@@ -18331,7 +18359,12 @@ class BaseInput extends AuroElement$1 {
18331
18359
  }
18332
18360
  });
18333
18361
 
18334
- this.validationCCLength = type.formatLength;
18362
+ // Variable-length brands (both min and max defined, e.g. UnionPay) validate
18363
+ // against the minimum masked length so shorter-but-valid entries are not
18364
+ // flagged tooShort. Fixed-length brands keep their single formatLength.
18365
+ this.validationCCLength = type.formatMinLength && type.formatLength
18366
+ ? type.formatMinLength
18367
+ : type.formatLength;
18335
18368
 
18336
18369
  return type;
18337
18370
  }
@@ -18690,7 +18723,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18690
18723
  }
18691
18724
  };
18692
18725
 
18693
- var formkitVersion$1 = '202608111803';
18726
+ var formkitVersion$1 = '202608262225';
18694
18727
 
18695
18728
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18696
18729
  // See LICENSE in the project root for license information.
@@ -18791,15 +18824,35 @@ class AuroInput extends BaseInput {
18791
18824
  * @private
18792
18825
  */
18793
18826
  get inputHidden() {
18827
+ // In the classic/default layout, activeLabel keeps the input row visible so
18828
+ // the label stays raised rather than collapsing to the centered placeholder
18829
+ // position. Emphasized/snowflake always render the label inside the field,
18830
+ // so activeLabel does not apply there. This only overrides the empty/
18831
+ // unfocused clause — the display-value clause (combobox/datepicker) is
18832
+ // preserved regardless.
18833
+ const activeLabelRaisesInput = this.activeLabel && this.isClassicLayout;
18834
+
18794
18835
  return (
18795
18836
  this.hasDisplayValueContent && !this.hasFocus && this.hasValue) ||
18796
18837
  (
18838
+ !activeLabelRaisesInput &&
18797
18839
  (!this.value || this.value.length === 0) &&
18798
18840
  !this.hasFocus &&
18799
18841
  (!this.placeholderStr || this.placeholderStr === '')
18800
18842
  );
18801
18843
  }
18802
18844
 
18845
+ /**
18846
+ * Whether the component is rendering the classic/default layout, meaning not
18847
+ * emphasized and not snowflake. Kept as a single source of truth so
18848
+ * layout-scoped behavior such as activeLabel stays consistent across getters.
18849
+ * @returns {boolean} - True for the classic/default layout.
18850
+ * @private
18851
+ */
18852
+ get isClassicLayout() {
18853
+ return !this.layout.startsWith('emphasized') && this.layout !== 'snowflake';
18854
+ }
18855
+
18803
18856
  /**
18804
18857
  * Determines if the input should display in a state with no focus or value indication.
18805
18858
  * Returns true when the input has display content without focus and has a value,
@@ -18845,7 +18898,7 @@ class AuroInput extends BaseInput {
18845
18898
  }
18846
18899
 
18847
18900
  // classic layout (default)
18848
- return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus) ? 'body-default' : 'body-xs';
18901
+ return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus && !this.activeLabel) ? 'body-default' : 'body-xs';
18849
18902
  }
18850
18903
 
18851
18904
  /**
@@ -18941,7 +18994,8 @@ class AuroInput extends BaseInput {
18941
18994
  'wrapper': true,
18942
18995
  'simple': this.simple,
18943
18996
  'withValue': this.hasValue,
18944
- 'hasFocus': this.hasFocus
18997
+ 'hasFocus': this.hasFocus,
18998
+ 'activeLabel': this.activeLabel
18945
18999
  };
18946
19000
  }
18947
19001
 
@@ -19091,7 +19145,10 @@ class AuroInput extends BaseInput {
19091
19145
  */
19092
19146
  definePattern() {
19093
19147
  if (this.type === 'credit-card' && !this.noValidate && this.maxLength) {
19094
- return `.{${this.maxLength},${this.maxLength}}`;
19148
+ // Variable-length brands (e.g. UnionPay) set minLength, so accept a range;
19149
+ // fixed-length brands leave minLength undefined and keep an exact length.
19150
+ const minPatternLength = this.minLength || this.maxLength;
19151
+ return `.{${minPatternLength},${this.maxLength}}`;
19095
19152
  }
19096
19153
 
19097
19154
  return this.pattern;
@@ -19152,7 +19209,6 @@ class AuroInput extends BaseInput {
19152
19209
  @input="${this.handleInput}"
19153
19210
  .placeholder=${this.placeholderStr}
19154
19211
  .role=${this.a11yRole}
19155
- ?activeLabel="${this.activeLabel}"
19156
19212
  ?disabled="${this.disabled}"
19157
19213
  ?required="${this.required}"
19158
19214
  aria-activedescendant=${o(this.a11yActivedescendant)}
@@ -19846,7 +19902,7 @@ class AuroBibtemplate extends i$3 {
19846
19902
  }
19847
19903
  }
19848
19904
 
19849
- var formkitVersion = '202608111803';
19905
+ var formkitVersion = '202608262225';
19850
19906
 
19851
19907
  var styleCss$3 = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
19852
19908
 
@@ -21541,8 +21597,13 @@ class AuroCombobox extends AuroElement {
21541
21597
  // and validating against the pre-selection value flashes a stale error
21542
21598
  // between mousedown and mouseup. The next focusout fires after the
21543
21599
  // dropdown closes and validates against the post-selection value.
21544
- if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21600
+ if (!this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21545
21601
  this.validate();
21602
+ } else if (this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen && this.validity !== undefined && !this.hasAttribute('error')) {
21603
+ // Clear stale error state left by a previous validate(true) call.
21604
+ // Do not clear when the error attribute is set — that is an externally forced error.
21605
+ this.validity = undefined;
21606
+ this.errorMessage = null;
21546
21607
  }
21547
21608
  });
21548
21609
 
@@ -21681,7 +21742,7 @@ class AuroCombobox extends AuroElement {
21681
21742
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
21682
21743
  // because focus is inside the top-layer dialog, so also check
21683
21744
  // dropdownOpen and the fullscreen transition flag.
21684
- if (!this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21745
+ if (!this.noValidate && !this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21685
21746
  this.validate();
21686
21747
  }
21687
21748
 
@@ -4910,7 +4910,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4910
4910
  }
4911
4911
  };
4912
4912
 
4913
- var formkitVersion$2 = '202608111803';
4913
+ var formkitVersion$2 = '202608262225';
4914
4914
 
4915
4915
  let AuroElement$2 = class AuroElement extends LitElement {
4916
4916
  static get properties() {
@@ -17075,6 +17075,8 @@ class BaseInput extends AuroElement$1 {
17075
17075
 
17076
17076
  /**
17077
17077
  * If set, the label will remain fixed in the active position.
17078
+ * Only applies to the classic/default layout; the emphasized and snowflake
17079
+ * layouts always render the label inside the field, so this has no effect there.
17078
17080
  */
17079
17081
  activeLabel: {
17080
17082
  type: Boolean,
@@ -18194,6 +18196,18 @@ class BaseInput extends AuroElement$1 {
18194
18196
  cardIcon: 'cc-dinersclub',
18195
18197
  maskFormat: "0000 000000 0000"
18196
18198
  },
18199
+ {
18200
+ // JCB is variable length (16-19 digits), like UnionPay, so it reuses the
18201
+ // formatMinLength/formatLength range machinery. The 35 prefix overlaps no
18202
+ // other brand (Amex is 34|37, Diners is 30[0-5]|36|38).
18203
+ name: 'JCB',
18204
+ regex: /^(?<num>35)\d{0}/u,
18205
+ formatMinLength: 19,
18206
+ formatLength: 23,
18207
+ errorMessage: CreditCardValidationMessage,
18208
+ cardIcon: 'cc-jcb',
18209
+ maskFormat: "0000 0000 0000 0000 000"
18210
+ },
18197
18211
  {
18198
18212
  name: 'Visa',
18199
18213
  regex: /^(?<num>4)\d{0}/u,
@@ -18225,6 +18239,20 @@ class BaseInput extends AuroElement$1 {
18225
18239
  errorMessage: CreditCardValidationMessage,
18226
18240
  cardIcon: 'cc-discover',
18227
18241
  maskFormat: "0000 0000 0000 0000"
18242
+ },
18243
+ {
18244
+ // China UnionPay is variable length (16-19 digits). It must come after
18245
+ // Discover so the last-match-wins loop below gives its 62 prefix
18246
+ // precedence over the generic `6` that resolves to Discover. 81 is used
18247
+ // by UnionPay cards issued outside mainland China and overlaps no other
18248
+ // brand. 60 is intentionally excluded (it overlaps real Discover 6011).
18249
+ name: 'China UnionPay',
18250
+ regex: /^(?<num>62|81)\d{0}/u,
18251
+ formatMinLength: 19,
18252
+ formatLength: 23,
18253
+ errorMessage: CreditCardValidationMessage,
18254
+ cardIcon: 'cc-unionpay',
18255
+ maskFormat: "0000 0000 0000 0000 000"
18228
18256
  }
18229
18257
  ];
18230
18258
 
@@ -18242,7 +18270,12 @@ class BaseInput extends AuroElement$1 {
18242
18270
  }
18243
18271
  });
18244
18272
 
18245
- this.validationCCLength = type.formatLength;
18273
+ // Variable-length brands (both min and max defined, e.g. UnionPay) validate
18274
+ // against the minimum masked length so shorter-but-valid entries are not
18275
+ // flagged tooShort. Fixed-length brands keep their single formatLength.
18276
+ this.validationCCLength = type.formatMinLength && type.formatLength
18277
+ ? type.formatMinLength
18278
+ : type.formatLength;
18246
18279
 
18247
18280
  return type;
18248
18281
  }
@@ -18601,7 +18634,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
18601
18634
  }
18602
18635
  };
18603
18636
 
18604
- var formkitVersion$1 = '202608111803';
18637
+ var formkitVersion$1 = '202608262225';
18605
18638
 
18606
18639
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18607
18640
  // See LICENSE in the project root for license information.
@@ -18702,15 +18735,35 @@ class AuroInput extends BaseInput {
18702
18735
  * @private
18703
18736
  */
18704
18737
  get inputHidden() {
18738
+ // In the classic/default layout, activeLabel keeps the input row visible so
18739
+ // the label stays raised rather than collapsing to the centered placeholder
18740
+ // position. Emphasized/snowflake always render the label inside the field,
18741
+ // so activeLabel does not apply there. This only overrides the empty/
18742
+ // unfocused clause — the display-value clause (combobox/datepicker) is
18743
+ // preserved regardless.
18744
+ const activeLabelRaisesInput = this.activeLabel && this.isClassicLayout;
18745
+
18705
18746
  return (
18706
18747
  this.hasDisplayValueContent && !this.hasFocus && this.hasValue) ||
18707
18748
  (
18749
+ !activeLabelRaisesInput &&
18708
18750
  (!this.value || this.value.length === 0) &&
18709
18751
  !this.hasFocus &&
18710
18752
  (!this.placeholderStr || this.placeholderStr === '')
18711
18753
  );
18712
18754
  }
18713
18755
 
18756
+ /**
18757
+ * Whether the component is rendering the classic/default layout, meaning not
18758
+ * emphasized and not snowflake. Kept as a single source of truth so
18759
+ * layout-scoped behavior such as activeLabel stays consistent across getters.
18760
+ * @returns {boolean} - True for the classic/default layout.
18761
+ * @private
18762
+ */
18763
+ get isClassicLayout() {
18764
+ return !this.layout.startsWith('emphasized') && this.layout !== 'snowflake';
18765
+ }
18766
+
18714
18767
  /**
18715
18768
  * Determines if the input should display in a state with no focus or value indication.
18716
18769
  * Returns true when the input has display content without focus and has a value,
@@ -18756,7 +18809,7 @@ class AuroInput extends BaseInput {
18756
18809
  }
18757
18810
 
18758
18811
  // classic layout (default)
18759
- return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus) ? 'body-default' : 'body-xs';
18812
+ return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus && !this.activeLabel) ? 'body-default' : 'body-xs';
18760
18813
  }
18761
18814
 
18762
18815
  /**
@@ -18852,7 +18905,8 @@ class AuroInput extends BaseInput {
18852
18905
  'wrapper': true,
18853
18906
  'simple': this.simple,
18854
18907
  'withValue': this.hasValue,
18855
- 'hasFocus': this.hasFocus
18908
+ 'hasFocus': this.hasFocus,
18909
+ 'activeLabel': this.activeLabel
18856
18910
  };
18857
18911
  }
18858
18912
 
@@ -19002,7 +19056,10 @@ class AuroInput extends BaseInput {
19002
19056
  */
19003
19057
  definePattern() {
19004
19058
  if (this.type === 'credit-card' && !this.noValidate && this.maxLength) {
19005
- return `.{${this.maxLength},${this.maxLength}}`;
19059
+ // Variable-length brands (e.g. UnionPay) set minLength, so accept a range;
19060
+ // fixed-length brands leave minLength undefined and keep an exact length.
19061
+ const minPatternLength = this.minLength || this.maxLength;
19062
+ return `.{${minPatternLength},${this.maxLength}}`;
19006
19063
  }
19007
19064
 
19008
19065
  return this.pattern;
@@ -19063,7 +19120,6 @@ class AuroInput extends BaseInput {
19063
19120
  @input="${this.handleInput}"
19064
19121
  .placeholder=${this.placeholderStr}
19065
19122
  .role=${this.a11yRole}
19066
- ?activeLabel="${this.activeLabel}"
19067
19123
  ?disabled="${this.disabled}"
19068
19124
  ?required="${this.required}"
19069
19125
  aria-activedescendant=${ifDefined(this.a11yActivedescendant)}
@@ -19757,7 +19813,7 @@ class AuroBibtemplate extends LitElement {
19757
19813
  }
19758
19814
  }
19759
19815
 
19760
- var formkitVersion = '202608111803';
19816
+ var formkitVersion = '202608262225';
19761
19817
 
19762
19818
  var styleCss$1 = css`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
19763
19819
 
@@ -21452,8 +21508,13 @@ class AuroCombobox extends AuroElement {
21452
21508
  // and validating against the pre-selection value flashes a stale error
21453
21509
  // between mousedown and mouseup. The next focusout fires after the
21454
21510
  // dropdown closes and validates against the post-selection value.
21455
- if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21511
+ if (!this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21456
21512
  this.validate();
21513
+ } else if (this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen && this.validity !== undefined && !this.hasAttribute('error')) {
21514
+ // Clear stale error state left by a previous validate(true) call.
21515
+ // Do not clear when the error attribute is set — that is an externally forced error.
21516
+ this.validity = undefined;
21517
+ this.errorMessage = null;
21457
21518
  }
21458
21519
  });
21459
21520
 
@@ -21592,7 +21653,7 @@ class AuroCombobox extends AuroElement {
21592
21653
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
21593
21654
  // because focus is inside the top-layer dialog, so also check
21594
21655
  // dropdownOpen and the fullscreen transition flag.
21595
- if (!this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21656
+ if (!this.noValidate && !this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21596
21657
  this.validate();
21597
21658
  }
21598
21659
 
@@ -4910,7 +4910,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4910
4910
  }
4911
4911
  };
4912
4912
 
4913
- var formkitVersion$2 = '202608111803';
4913
+ var formkitVersion$2 = '202608262225';
4914
4914
 
4915
4915
  let AuroElement$2 = class AuroElement extends LitElement {
4916
4916
  static get properties() {
@@ -17075,6 +17075,8 @@ class BaseInput extends AuroElement$1 {
17075
17075
 
17076
17076
  /**
17077
17077
  * If set, the label will remain fixed in the active position.
17078
+ * Only applies to the classic/default layout; the emphasized and snowflake
17079
+ * layouts always render the label inside the field, so this has no effect there.
17078
17080
  */
17079
17081
  activeLabel: {
17080
17082
  type: Boolean,
@@ -18194,6 +18196,18 @@ class BaseInput extends AuroElement$1 {
18194
18196
  cardIcon: 'cc-dinersclub',
18195
18197
  maskFormat: "0000 000000 0000"
18196
18198
  },
18199
+ {
18200
+ // JCB is variable length (16-19 digits), like UnionPay, so it reuses the
18201
+ // formatMinLength/formatLength range machinery. The 35 prefix overlaps no
18202
+ // other brand (Amex is 34|37, Diners is 30[0-5]|36|38).
18203
+ name: 'JCB',
18204
+ regex: /^(?<num>35)\d{0}/u,
18205
+ formatMinLength: 19,
18206
+ formatLength: 23,
18207
+ errorMessage: CreditCardValidationMessage,
18208
+ cardIcon: 'cc-jcb',
18209
+ maskFormat: "0000 0000 0000 0000 000"
18210
+ },
18197
18211
  {
18198
18212
  name: 'Visa',
18199
18213
  regex: /^(?<num>4)\d{0}/u,
@@ -18225,6 +18239,20 @@ class BaseInput extends AuroElement$1 {
18225
18239
  errorMessage: CreditCardValidationMessage,
18226
18240
  cardIcon: 'cc-discover',
18227
18241
  maskFormat: "0000 0000 0000 0000"
18242
+ },
18243
+ {
18244
+ // China UnionPay is variable length (16-19 digits). It must come after
18245
+ // Discover so the last-match-wins loop below gives its 62 prefix
18246
+ // precedence over the generic `6` that resolves to Discover. 81 is used
18247
+ // by UnionPay cards issued outside mainland China and overlaps no other
18248
+ // brand. 60 is intentionally excluded (it overlaps real Discover 6011).
18249
+ name: 'China UnionPay',
18250
+ regex: /^(?<num>62|81)\d{0}/u,
18251
+ formatMinLength: 19,
18252
+ formatLength: 23,
18253
+ errorMessage: CreditCardValidationMessage,
18254
+ cardIcon: 'cc-unionpay',
18255
+ maskFormat: "0000 0000 0000 0000 000"
18228
18256
  }
18229
18257
  ];
18230
18258
 
@@ -18242,7 +18270,12 @@ class BaseInput extends AuroElement$1 {
18242
18270
  }
18243
18271
  });
18244
18272
 
18245
- this.validationCCLength = type.formatLength;
18273
+ // Variable-length brands (both min and max defined, e.g. UnionPay) validate
18274
+ // against the minimum masked length so shorter-but-valid entries are not
18275
+ // flagged tooShort. Fixed-length brands keep their single formatLength.
18276
+ this.validationCCLength = type.formatMinLength && type.formatLength
18277
+ ? type.formatMinLength
18278
+ : type.formatLength;
18246
18279
 
18247
18280
  return type;
18248
18281
  }
@@ -18601,7 +18634,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
18601
18634
  }
18602
18635
  };
18603
18636
 
18604
- var formkitVersion$1 = '202608111803';
18637
+ var formkitVersion$1 = '202608262225';
18605
18638
 
18606
18639
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18607
18640
  // See LICENSE in the project root for license information.
@@ -18702,15 +18735,35 @@ class AuroInput extends BaseInput {
18702
18735
  * @private
18703
18736
  */
18704
18737
  get inputHidden() {
18738
+ // In the classic/default layout, activeLabel keeps the input row visible so
18739
+ // the label stays raised rather than collapsing to the centered placeholder
18740
+ // position. Emphasized/snowflake always render the label inside the field,
18741
+ // so activeLabel does not apply there. This only overrides the empty/
18742
+ // unfocused clause — the display-value clause (combobox/datepicker) is
18743
+ // preserved regardless.
18744
+ const activeLabelRaisesInput = this.activeLabel && this.isClassicLayout;
18745
+
18705
18746
  return (
18706
18747
  this.hasDisplayValueContent && !this.hasFocus && this.hasValue) ||
18707
18748
  (
18749
+ !activeLabelRaisesInput &&
18708
18750
  (!this.value || this.value.length === 0) &&
18709
18751
  !this.hasFocus &&
18710
18752
  (!this.placeholderStr || this.placeholderStr === '')
18711
18753
  );
18712
18754
  }
18713
18755
 
18756
+ /**
18757
+ * Whether the component is rendering the classic/default layout, meaning not
18758
+ * emphasized and not snowflake. Kept as a single source of truth so
18759
+ * layout-scoped behavior such as activeLabel stays consistent across getters.
18760
+ * @returns {boolean} - True for the classic/default layout.
18761
+ * @private
18762
+ */
18763
+ get isClassicLayout() {
18764
+ return !this.layout.startsWith('emphasized') && this.layout !== 'snowflake';
18765
+ }
18766
+
18714
18767
  /**
18715
18768
  * Determines if the input should display in a state with no focus or value indication.
18716
18769
  * Returns true when the input has display content without focus and has a value,
@@ -18756,7 +18809,7 @@ class AuroInput extends BaseInput {
18756
18809
  }
18757
18810
 
18758
18811
  // classic layout (default)
18759
- return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus) ? 'body-default' : 'body-xs';
18812
+ return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus && !this.activeLabel) ? 'body-default' : 'body-xs';
18760
18813
  }
18761
18814
 
18762
18815
  /**
@@ -18852,7 +18905,8 @@ class AuroInput extends BaseInput {
18852
18905
  'wrapper': true,
18853
18906
  'simple': this.simple,
18854
18907
  'withValue': this.hasValue,
18855
- 'hasFocus': this.hasFocus
18908
+ 'hasFocus': this.hasFocus,
18909
+ 'activeLabel': this.activeLabel
18856
18910
  };
18857
18911
  }
18858
18912
 
@@ -19002,7 +19056,10 @@ class AuroInput extends BaseInput {
19002
19056
  */
19003
19057
  definePattern() {
19004
19058
  if (this.type === 'credit-card' && !this.noValidate && this.maxLength) {
19005
- return `.{${this.maxLength},${this.maxLength}}`;
19059
+ // Variable-length brands (e.g. UnionPay) set minLength, so accept a range;
19060
+ // fixed-length brands leave minLength undefined and keep an exact length.
19061
+ const minPatternLength = this.minLength || this.maxLength;
19062
+ return `.{${minPatternLength},${this.maxLength}}`;
19006
19063
  }
19007
19064
 
19008
19065
  return this.pattern;
@@ -19063,7 +19120,6 @@ class AuroInput extends BaseInput {
19063
19120
  @input="${this.handleInput}"
19064
19121
  .placeholder=${this.placeholderStr}
19065
19122
  .role=${this.a11yRole}
19066
- ?activeLabel="${this.activeLabel}"
19067
19123
  ?disabled="${this.disabled}"
19068
19124
  ?required="${this.required}"
19069
19125
  aria-activedescendant=${ifDefined(this.a11yActivedescendant)}
@@ -19757,7 +19813,7 @@ class AuroBibtemplate extends LitElement {
19757
19813
  }
19758
19814
  }
19759
19815
 
19760
- var formkitVersion = '202608111803';
19816
+ var formkitVersion = '202608262225';
19761
19817
 
19762
19818
  var styleCss$1 = css`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
19763
19819
 
@@ -21452,8 +21508,13 @@ class AuroCombobox extends AuroElement {
21452
21508
  // and validating against the pre-selection value flashes a stale error
21453
21509
  // between mousedown and mouseup. The next focusout fires after the
21454
21510
  // dropdown closes and validates against the post-selection value.
21455
- if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21511
+ if (!this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21456
21512
  this.validate();
21513
+ } else if (this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen && this.validity !== undefined && !this.hasAttribute('error')) {
21514
+ // Clear stale error state left by a previous validate(true) call.
21515
+ // Do not clear when the error attribute is set — that is an externally forced error.
21516
+ this.validity = undefined;
21517
+ this.errorMessage = null;
21457
21518
  }
21458
21519
  });
21459
21520
 
@@ -21592,7 +21653,7 @@ class AuroCombobox extends AuroElement {
21592
21653
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
21593
21654
  // because focus is inside the top-layer dialog, so also check
21594
21655
  // dropdownOpen and the fullscreen transition flag.
21595
- if (!this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21656
+ if (!this.noValidate && !this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21596
21657
  this.validate();
21597
21658
  }
21598
21659
 
@@ -1117,7 +1117,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1117
1117
  }
1118
1118
  };
1119
1119
 
1120
- var formkitVersion$1 = '202608111803';
1120
+ var formkitVersion$1 = '202608262225';
1121
1121
 
1122
1122
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1123
1123
  // See LICENSE in the project root for license information.
@@ -5288,7 +5288,7 @@ class AuroHelpText extends i$2 {
5288
5288
  }
5289
5289
  }
5290
5290
 
5291
- var formkitVersion = '202608111803';
5291
+ var formkitVersion = '202608262225';
5292
5292
 
5293
5293
  let AuroElement$1 = class AuroElement extends i$2 {
5294
5294
  static get properties() {
@@ -1117,7 +1117,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1117
1117
  }
1118
1118
  };
1119
1119
 
1120
- var formkitVersion$1 = '202608111803';
1120
+ var formkitVersion$1 = '202608262225';
1121
1121
 
1122
1122
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1123
1123
  // See LICENSE in the project root for license information.
@@ -5288,7 +5288,7 @@ class AuroHelpText extends i$2 {
5288
5288
  }
5289
5289
  }
5290
5290
 
5291
- var formkitVersion = '202608111803';
5291
+ var formkitVersion = '202608262225';
5292
5292
 
5293
5293
  let AuroElement$1 = class AuroElement extends i$2 {
5294
5294
  static get properties() {
@@ -1067,7 +1067,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1067
1067
  }
1068
1068
  };
1069
1069
 
1070
- var formkitVersion$1 = '202608111803';
1070
+ var formkitVersion$1 = '202608262225';
1071
1071
 
1072
1072
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1073
1073
  // See LICENSE in the project root for license information.
@@ -5220,7 +5220,7 @@ class AuroHelpText extends LitElement {
5220
5220
  }
5221
5221
  }
5222
5222
 
5223
- var formkitVersion = '202608111803';
5223
+ var formkitVersion = '202608262225';
5224
5224
 
5225
5225
  let AuroElement$1 = class AuroElement extends LitElement {
5226
5226
  static get properties() {
@@ -1067,7 +1067,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1067
1067
  }
1068
1068
  };
1069
1069
 
1070
- var formkitVersion$1 = '202608111803';
1070
+ var formkitVersion$1 = '202608262225';
1071
1071
 
1072
1072
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1073
1073
  // See LICENSE in the project root for license information.
@@ -5220,7 +5220,7 @@ class AuroHelpText extends LitElement {
5220
5220
  }
5221
5221
  }
5222
5222
 
5223
- var formkitVersion = '202608111803';
5223
+ var formkitVersion = '202608262225';
5224
5224
 
5225
5225
  let AuroElement$1 = class AuroElement extends LitElement {
5226
5226
  static get properties() {