@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
package/CHANGELOG.md CHANGED
@@ -1,15 +1,27 @@
1
- ## [6.0.3](https://github.com/AlaskaAirlines/auro-formkit/compare/v6.0.2...v6.0.3) (2026-08-11)
1
+ # [6.1.0](https://github.com/AlaskaAirlines/auro-formkit/compare/v6.0.3...v6.1.0) (2026-08-26)
2
2
 
3
3
 
4
4
  ### Bug Fixes
5
5
 
6
- * **dropdown:** align js example system AB[#1611713](https://github.com/AlaskaAirlines/auro-formkit/issues/1611713) ([2e06af7](https://github.com/AlaskaAirlines/auro-formkit/commit/2e06af7babdf13323fd71d67380916dca0172af2))
7
- * **dropdown:** re-configure floater on reconnect to restore trigger event listeners AB[#1611656](https://github.com/AlaskaAirlines/auro-formkit/issues/1611656) ([e782512](https://github.com/AlaskaAirlines/auro-formkit/commit/e78251238cf4d751c19585acf94b71d84c590d6a))
8
- * ellipses dp value at small widths AB[#1602084](https://github.com/AlaskaAirlines/auro-formkit/issues/1602084) ([2fe60e2](https://github.com/AlaskaAirlines/auro-formkit/commit/2fe60e25d415053805abae83e94c1002b77f30fc))
9
- * ensure range inputs maintain equal size with long labels AB[#1494482](https://github.com/AlaskaAirlines/auro-formkit/issues/1494482) ([146a039](https://github.com/AlaskaAirlines/auro-formkit/commit/146a0398fb491ecd857d496ff7ec89e5977fc012))
10
- * **menu:** distinguish menu options that share a value AB[#1602086](https://github.com/AlaskaAirlines/auro-formkit/issues/1602086) ([cc880c9](https://github.com/AlaskaAirlines/auro-formkit/commit/cc880c9c6254bcec133e54990c85839bf3428e68))
11
- * **menu:** re-select highlighted option via Enter after emptying selection AB[#1606433](https://github.com/AlaskaAirlines/auro-formkit/issues/1606433) ([50b3af2](https://github.com/AlaskaAirlines/auro-formkit/commit/50b3af20b08fe4a1cf46ed849ea14d7c7df1fac3))
12
- * stringfy counter's aria-valuetext AB[#1443553](https://github.com/AlaskaAirlines/auro-formkit/issues/1443553) ([f8d33f9](https://github.com/AlaskaAirlines/auro-formkit/commit/f8d33f9db67f55f1e45d4d45d442a21c94e6127b))
6
+ * **dropdown:** align js example system AB[#1611713](https://github.com/AlaskaAirlines/auro-formkit/issues/1611713) ([50a787d](https://github.com/AlaskaAirlines/auro-formkit/commit/50a787d6f163b34f7eba68c0a0ba37a5357f10a7))
7
+ * **dropdown:** re-configure floater on reconnect to restore trigger event listeners AB[#1611656](https://github.com/AlaskaAirlines/auro-formkit/issues/1611656) ([a769d8f](https://github.com/AlaskaAirlines/auro-formkit/commit/a769d8f5e2d78fe4b9ff31264fd571cb38d9d5b5))
8
+ * ellipses dp value at small widths AB[#1602084](https://github.com/AlaskaAirlines/auro-formkit/issues/1602084) ([08dcaa4](https://github.com/AlaskaAirlines/auro-formkit/commit/08dcaa40dd6a45d3cfbf8996b47c728595cbe171))
9
+ * ensure range inputs maintain equal size with long labels AB[#1494482](https://github.com/AlaskaAirlines/auro-formkit/issues/1494482) ([1d9e95d](https://github.com/AlaskaAirlines/auro-formkit/commit/1d9e95d2bcef01d66c80cef514c958e22746b85a))
10
+ * honor noValidate on blur in select, combobox, radio-group, and checkbox-group AB[#1594311](https://github.com/AlaskaAirlines/auro-formkit/issues/1594311) ([f50b0c5](https://github.com/AlaskaAirlines/auro-formkit/commit/f50b0c53342904cdfb5f2b9db2f4dd3f8e90408c))
11
+ * **input:** enable activeLabel functionality AB[#1494433](https://github.com/AlaskaAirlines/auro-formkit/issues/1494433) ([78a5cba](https://github.com/AlaskaAirlines/auro-formkit/commit/78a5cba84972cc05dc583e0b78709fe15789cdde))
12
+ * **menu:** distinguish menu options that share a value AB[#1602086](https://github.com/AlaskaAirlines/auro-formkit/issues/1602086) ([d93d0cf](https://github.com/AlaskaAirlines/auro-formkit/commit/d93d0cf4ef494eccb653f0459986291e67379623))
13
+ * **menu:** re-select highlighted option via Enter after emptying selection AB[#1606433](https://github.com/AlaskaAirlines/auro-formkit/issues/1606433) ([f0fe516](https://github.com/AlaskaAirlines/auro-formkit/commit/f0fe5168055d193fcafc323193eb8c440416f743))
14
+ * preserve error attribute state on blur when noValidate is set AB[#1629494](https://github.com/AlaskaAirlines/auro-formkit/issues/1629494) ([6d16d46](https://github.com/AlaskaAirlines/auro-formkit/commit/6d16d46fd6f994b170b3e455f0c260a234c7d734))
15
+ * stringfy counter's aria-valuetext AB[#1443553](https://github.com/AlaskaAirlines/auro-formkit/issues/1443553) ([1902b94](https://github.com/AlaskaAirlines/auro-formkit/commit/1902b94f0cbbaf55daff88ac234b6b807a24592a))
16
+ * suppress selection-triggered validation when noValidate is set [#1588](https://github.com/AlaskaAirlines/auro-formkit/issues/1588) ([761110b](https://github.com/AlaskaAirlines/auro-formkit/commit/761110bfee5f902cfd9f725875989f92993d66f2))
17
+ * suppress selection-triggered validation when noValidate is set [#1588](https://github.com/AlaskaAirlines/auro-formkit/issues/1588) ([20222bc](https://github.com/AlaskaAirlines/auro-formkit/commit/20222bc7035bdc509626bf04a253e94f2aaf8df0))
18
+ * use hasAttribute('error') to guard stale-clear and cover empty error="" case [#1594](https://github.com/AlaskaAirlines/auro-formkit/issues/1594) ([1e0c1d7](https://github.com/AlaskaAirlines/auro-formkit/commit/1e0c1d75878e891cb4df0f9707ff88c8118cb04d))
19
+
20
+
21
+ ### Features
22
+
23
+ * **cc:** support chinese union pay credit cards AB[#1551772](https://github.com/AlaskaAirlines/auro-formkit/issues/1551772) ([eb0a268](https://github.com/AlaskaAirlines/auro-formkit/commit/eb0a26862c929307eced6cb68dd4a95b74f5805c))
24
+ * **cc:** support JCB credit cards AB[#1550294](https://github.com/AlaskaAirlines/auro-formkit/issues/1550294) ([574a68d](https://github.com/AlaskaAirlines/auro-formkit/commit/574a68df7847ff38590eb105829715028a3035d7))
13
25
 
14
26
  # Changelog
15
27
 
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202608111803';
1278
+ var formkitVersion = '202608262225';
1279
1279
 
1280
1280
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1281
1281
  // See LICENSE in the project root for license information.
@@ -1495,7 +1495,9 @@ class AuroCheckboxGroup extends i$2 {
1495
1495
  composed: true,
1496
1496
  }));
1497
1497
 
1498
- this.validate(true);
1498
+ if (!this.noValidate) {
1499
+ this.validate(true);
1500
+ }
1499
1501
  }
1500
1502
 
1501
1503
  firstUpdated() {
@@ -1506,11 +1508,19 @@ class AuroCheckboxGroup extends i$2 {
1506
1508
  const checkFocusWithin = function(evt) {
1507
1509
  if (document.auroCheckboxGroupActive && !document.auroCheckboxGroupActive.contains(evt.target)) {
1508
1510
  // if focus has left the group, cleanup and validate
1509
- document.auroCheckboxGroupActive.focusWithin = false;
1511
+ const group = document.auroCheckboxGroupActive;
1512
+ group.focusWithin = false;
1510
1513
  window.removeEventListener('focusin', checkFocusWithin);
1511
1514
  document.removeEventListener('click', checkFocusWithin);
1512
1515
  // execute the validation
1513
- document.auroCheckboxGroupActive.validation.validate(document.auroCheckboxGroupActive);
1516
+ if (!group.noValidate) {
1517
+ group.validation.validate(group);
1518
+ } else if (group.validity !== undefined && !group.hasAttribute('error')) {
1519
+ // Clear stale error state left by a previous validate(true) call.
1520
+ // Do not clear when the error attribute is set — that is an externally forced error.
1521
+ group.validity = undefined;
1522
+ group.errorMessage = '';
1523
+ }
1514
1524
  }
1515
1525
  };
1516
1526
 
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202608111803';
1278
+ var formkitVersion = '202608262225';
1279
1279
 
1280
1280
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1281
1281
  // See LICENSE in the project root for license information.
@@ -1495,7 +1495,9 @@ class AuroCheckboxGroup extends i$2 {
1495
1495
  composed: true,
1496
1496
  }));
1497
1497
 
1498
- this.validate(true);
1498
+ if (!this.noValidate) {
1499
+ this.validate(true);
1500
+ }
1499
1501
  }
1500
1502
 
1501
1503
  firstUpdated() {
@@ -1506,11 +1508,19 @@ class AuroCheckboxGroup extends i$2 {
1506
1508
  const checkFocusWithin = function(evt) {
1507
1509
  if (document.auroCheckboxGroupActive && !document.auroCheckboxGroupActive.contains(evt.target)) {
1508
1510
  // if focus has left the group, cleanup and validate
1509
- document.auroCheckboxGroupActive.focusWithin = false;
1511
+ const group = document.auroCheckboxGroupActive;
1512
+ group.focusWithin = false;
1510
1513
  window.removeEventListener('focusin', checkFocusWithin);
1511
1514
  document.removeEventListener('click', checkFocusWithin);
1512
1515
  // execute the validation
1513
- document.auroCheckboxGroupActive.validation.validate(document.auroCheckboxGroupActive);
1516
+ if (!group.noValidate) {
1517
+ group.validation.validate(group);
1518
+ } else if (group.validity !== undefined && !group.hasAttribute('error')) {
1519
+ // Clear stale error state left by a previous validate(true) call.
1520
+ // Do not clear when the error attribute is set — that is an externally forced error.
1521
+ group.validity = undefined;
1522
+ group.errorMessage = '';
1523
+ }
1514
1524
  }
1515
1525
  };
1516
1526
 
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202608111803';
1278
+ var formkitVersion = '202608262225';
1279
1279
 
1280
1280
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1281
1281
  // See LICENSE in the project root for license information.
@@ -1495,7 +1495,9 @@ class AuroCheckboxGroup extends i$2 {
1495
1495
  composed: true,
1496
1496
  }));
1497
1497
 
1498
- this.validate(true);
1498
+ if (!this.noValidate) {
1499
+ this.validate(true);
1500
+ }
1499
1501
  }
1500
1502
 
1501
1503
  firstUpdated() {
@@ -1506,11 +1508,19 @@ class AuroCheckboxGroup extends i$2 {
1506
1508
  const checkFocusWithin = function(evt) {
1507
1509
  if (document.auroCheckboxGroupActive && !document.auroCheckboxGroupActive.contains(evt.target)) {
1508
1510
  // if focus has left the group, cleanup and validate
1509
- document.auroCheckboxGroupActive.focusWithin = false;
1511
+ const group = document.auroCheckboxGroupActive;
1512
+ group.focusWithin = false;
1510
1513
  window.removeEventListener('focusin', checkFocusWithin);
1511
1514
  document.removeEventListener('click', checkFocusWithin);
1512
1515
  // execute the validation
1513
- document.auroCheckboxGroupActive.validation.validate(document.auroCheckboxGroupActive);
1516
+ if (!group.noValidate) {
1517
+ group.validation.validate(group);
1518
+ } else if (group.validity !== undefined && !group.hasAttribute('error')) {
1519
+ // Clear stale error state left by a previous validate(true) call.
1520
+ // Do not clear when the error attribute is set — that is an externally forced error.
1521
+ group.validity = undefined;
1522
+ group.errorMessage = '';
1523
+ }
1514
1524
  }
1515
1525
  };
1516
1526
 
@@ -1228,7 +1228,7 @@ class AuroHelpText extends LitElement {
1228
1228
  }
1229
1229
  }
1230
1230
 
1231
- var formkitVersion = '202608111803';
1231
+ var formkitVersion = '202608262225';
1232
1232
 
1233
1233
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1234
1234
  // See LICENSE in the project root for license information.
@@ -1448,7 +1448,9 @@ class AuroCheckboxGroup extends LitElement {
1448
1448
  composed: true,
1449
1449
  }));
1450
1450
 
1451
- this.validate(true);
1451
+ if (!this.noValidate) {
1452
+ this.validate(true);
1453
+ }
1452
1454
  }
1453
1455
 
1454
1456
  firstUpdated() {
@@ -1459,11 +1461,19 @@ class AuroCheckboxGroup extends LitElement {
1459
1461
  const checkFocusWithin = function(evt) {
1460
1462
  if (document.auroCheckboxGroupActive && !document.auroCheckboxGroupActive.contains(evt.target)) {
1461
1463
  // if focus has left the group, cleanup and validate
1462
- document.auroCheckboxGroupActive.focusWithin = false;
1464
+ const group = document.auroCheckboxGroupActive;
1465
+ group.focusWithin = false;
1463
1466
  window.removeEventListener('focusin', checkFocusWithin);
1464
1467
  document.removeEventListener('click', checkFocusWithin);
1465
1468
  // execute the validation
1466
- document.auroCheckboxGroupActive.validation.validate(document.auroCheckboxGroupActive);
1469
+ if (!group.noValidate) {
1470
+ group.validation.validate(group);
1471
+ } else if (group.validity !== undefined && !group.hasAttribute('error')) {
1472
+ // Clear stale error state left by a previous validate(true) call.
1473
+ // Do not clear when the error attribute is set — that is an externally forced error.
1474
+ group.validity = undefined;
1475
+ group.errorMessage = '';
1476
+ }
1467
1477
  }
1468
1478
  };
1469
1479
 
@@ -1228,7 +1228,7 @@ class AuroHelpText extends LitElement {
1228
1228
  }
1229
1229
  }
1230
1230
 
1231
- var formkitVersion = '202608111803';
1231
+ var formkitVersion = '202608262225';
1232
1232
 
1233
1233
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1234
1234
  // See LICENSE in the project root for license information.
@@ -1448,7 +1448,9 @@ class AuroCheckboxGroup extends LitElement {
1448
1448
  composed: true,
1449
1449
  }));
1450
1450
 
1451
- this.validate(true);
1451
+ if (!this.noValidate) {
1452
+ this.validate(true);
1453
+ }
1452
1454
  }
1453
1455
 
1454
1456
  firstUpdated() {
@@ -1459,11 +1461,19 @@ class AuroCheckboxGroup extends LitElement {
1459
1461
  const checkFocusWithin = function(evt) {
1460
1462
  if (document.auroCheckboxGroupActive && !document.auroCheckboxGroupActive.contains(evt.target)) {
1461
1463
  // if focus has left the group, cleanup and validate
1462
- document.auroCheckboxGroupActive.focusWithin = false;
1464
+ const group = document.auroCheckboxGroupActive;
1465
+ group.focusWithin = false;
1463
1466
  window.removeEventListener('focusin', checkFocusWithin);
1464
1467
  document.removeEventListener('click', checkFocusWithin);
1465
1468
  // execute the validation
1466
- document.auroCheckboxGroupActive.validation.validate(document.auroCheckboxGroupActive);
1469
+ if (!group.noValidate) {
1470
+ group.validation.validate(group);
1471
+ } else if (group.validity !== undefined && !group.hasAttribute('error')) {
1472
+ // Clear stale error state left by a previous validate(true) call.
1473
+ // Do not clear when the error attribute is set — that is an externally forced error.
1474
+ group.validity = undefined;
1475
+ group.errorMessage = '';
1476
+ }
1467
1477
  }
1468
1478
  };
1469
1479
 
@@ -4977,7 +4977,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4977
4977
  }
4978
4978
  };
4979
4979
 
4980
- var formkitVersion$2 = '202608111803';
4980
+ var formkitVersion$2 = '202608262225';
4981
4981
 
4982
4982
  let AuroElement$2 = class AuroElement extends i$3 {
4983
4983
  static get properties() {
@@ -17149,6 +17149,8 @@ class BaseInput extends AuroElement$1 {
17149
17149
 
17150
17150
  /**
17151
17151
  * If set, the label will remain fixed in the active position.
17152
+ * Only applies to the classic/default layout; the emphasized and snowflake
17153
+ * layouts always render the label inside the field, so this has no effect there.
17152
17154
  */
17153
17155
  activeLabel: {
17154
17156
  type: Boolean,
@@ -18268,6 +18270,18 @@ class BaseInput extends AuroElement$1 {
18268
18270
  cardIcon: 'cc-dinersclub',
18269
18271
  maskFormat: "0000 000000 0000"
18270
18272
  },
18273
+ {
18274
+ // JCB is variable length (16-19 digits), like UnionPay, so it reuses the
18275
+ // formatMinLength/formatLength range machinery. The 35 prefix overlaps no
18276
+ // other brand (Amex is 34|37, Diners is 30[0-5]|36|38).
18277
+ name: 'JCB',
18278
+ regex: /^(?<num>35)\d{0}/u,
18279
+ formatMinLength: 19,
18280
+ formatLength: 23,
18281
+ errorMessage: CreditCardValidationMessage,
18282
+ cardIcon: 'cc-jcb',
18283
+ maskFormat: "0000 0000 0000 0000 000"
18284
+ },
18271
18285
  {
18272
18286
  name: 'Visa',
18273
18287
  regex: /^(?<num>4)\d{0}/u,
@@ -18299,6 +18313,20 @@ class BaseInput extends AuroElement$1 {
18299
18313
  errorMessage: CreditCardValidationMessage,
18300
18314
  cardIcon: 'cc-discover',
18301
18315
  maskFormat: "0000 0000 0000 0000"
18316
+ },
18317
+ {
18318
+ // China UnionPay is variable length (16-19 digits). It must come after
18319
+ // Discover so the last-match-wins loop below gives its 62 prefix
18320
+ // precedence over the generic `6` that resolves to Discover. 81 is used
18321
+ // by UnionPay cards issued outside mainland China and overlaps no other
18322
+ // brand. 60 is intentionally excluded (it overlaps real Discover 6011).
18323
+ name: 'China UnionPay',
18324
+ regex: /^(?<num>62|81)\d{0}/u,
18325
+ formatMinLength: 19,
18326
+ formatLength: 23,
18327
+ errorMessage: CreditCardValidationMessage,
18328
+ cardIcon: 'cc-unionpay',
18329
+ maskFormat: "0000 0000 0000 0000 000"
18302
18330
  }
18303
18331
  ];
18304
18332
 
@@ -18316,7 +18344,12 @@ class BaseInput extends AuroElement$1 {
18316
18344
  }
18317
18345
  });
18318
18346
 
18319
- this.validationCCLength = type.formatLength;
18347
+ // Variable-length brands (both min and max defined, e.g. UnionPay) validate
18348
+ // against the minimum masked length so shorter-but-valid entries are not
18349
+ // flagged tooShort. Fixed-length brands keep their single formatLength.
18350
+ this.validationCCLength = type.formatMinLength && type.formatLength
18351
+ ? type.formatMinLength
18352
+ : type.formatLength;
18320
18353
 
18321
18354
  return type;
18322
18355
  }
@@ -18675,7 +18708,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18675
18708
  }
18676
18709
  };
18677
18710
 
18678
- var formkitVersion$1 = '202608111803';
18711
+ var formkitVersion$1 = '202608262225';
18679
18712
 
18680
18713
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18681
18714
  // See LICENSE in the project root for license information.
@@ -18776,15 +18809,35 @@ class AuroInput extends BaseInput {
18776
18809
  * @private
18777
18810
  */
18778
18811
  get inputHidden() {
18812
+ // In the classic/default layout, activeLabel keeps the input row visible so
18813
+ // the label stays raised rather than collapsing to the centered placeholder
18814
+ // position. Emphasized/snowflake always render the label inside the field,
18815
+ // so activeLabel does not apply there. This only overrides the empty/
18816
+ // unfocused clause — the display-value clause (combobox/datepicker) is
18817
+ // preserved regardless.
18818
+ const activeLabelRaisesInput = this.activeLabel && this.isClassicLayout;
18819
+
18779
18820
  return (
18780
18821
  this.hasDisplayValueContent && !this.hasFocus && this.hasValue) ||
18781
18822
  (
18823
+ !activeLabelRaisesInput &&
18782
18824
  (!this.value || this.value.length === 0) &&
18783
18825
  !this.hasFocus &&
18784
18826
  (!this.placeholderStr || this.placeholderStr === '')
18785
18827
  );
18786
18828
  }
18787
18829
 
18830
+ /**
18831
+ * Whether the component is rendering the classic/default layout, meaning not
18832
+ * emphasized and not snowflake. Kept as a single source of truth so
18833
+ * layout-scoped behavior such as activeLabel stays consistent across getters.
18834
+ * @returns {boolean} - True for the classic/default layout.
18835
+ * @private
18836
+ */
18837
+ get isClassicLayout() {
18838
+ return !this.layout.startsWith('emphasized') && this.layout !== 'snowflake';
18839
+ }
18840
+
18788
18841
  /**
18789
18842
  * Determines if the input should display in a state with no focus or value indication.
18790
18843
  * Returns true when the input has display content without focus and has a value,
@@ -18830,7 +18883,7 @@ class AuroInput extends BaseInput {
18830
18883
  }
18831
18884
 
18832
18885
  // classic layout (default)
18833
- return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus) ? 'body-default' : 'body-xs';
18886
+ return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus && !this.activeLabel) ? 'body-default' : 'body-xs';
18834
18887
  }
18835
18888
 
18836
18889
  /**
@@ -18926,7 +18979,8 @@ class AuroInput extends BaseInput {
18926
18979
  'wrapper': true,
18927
18980
  'simple': this.simple,
18928
18981
  'withValue': this.hasValue,
18929
- 'hasFocus': this.hasFocus
18982
+ 'hasFocus': this.hasFocus,
18983
+ 'activeLabel': this.activeLabel
18930
18984
  };
18931
18985
  }
18932
18986
 
@@ -19076,7 +19130,10 @@ class AuroInput extends BaseInput {
19076
19130
  */
19077
19131
  definePattern() {
19078
19132
  if (this.type === 'credit-card' && !this.noValidate && this.maxLength) {
19079
- return `.{${this.maxLength},${this.maxLength}}`;
19133
+ // Variable-length brands (e.g. UnionPay) set minLength, so accept a range;
19134
+ // fixed-length brands leave minLength undefined and keep an exact length.
19135
+ const minPatternLength = this.minLength || this.maxLength;
19136
+ return `.{${minPatternLength},${this.maxLength}}`;
19080
19137
  }
19081
19138
 
19082
19139
  return this.pattern;
@@ -19137,7 +19194,6 @@ class AuroInput extends BaseInput {
19137
19194
  @input="${this.handleInput}"
19138
19195
  .placeholder=${this.placeholderStr}
19139
19196
  .role=${this.a11yRole}
19140
- ?activeLabel="${this.activeLabel}"
19141
19197
  ?disabled="${this.disabled}"
19142
19198
  ?required="${this.required}"
19143
19199
  aria-activedescendant=${o(this.a11yActivedescendant)}
@@ -19831,7 +19887,7 @@ class AuroBibtemplate extends i$3 {
19831
19887
  }
19832
19888
  }
19833
19889
 
19834
- var formkitVersion = '202608111803';
19890
+ var formkitVersion = '202608262225';
19835
19891
 
19836
19892
  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}`;
19837
19893
 
@@ -21526,8 +21582,13 @@ class AuroCombobox extends AuroElement {
21526
21582
  // and validating against the pre-selection value flashes a stale error
21527
21583
  // between mousedown and mouseup. The next focusout fires after the
21528
21584
  // dropdown closes and validates against the post-selection value.
21529
- if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21585
+ if (!this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21530
21586
  this.validate();
21587
+ } else if (this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen && this.validity !== undefined && !this.hasAttribute('error')) {
21588
+ // Clear stale error state left by a previous validate(true) call.
21589
+ // Do not clear when the error attribute is set — that is an externally forced error.
21590
+ this.validity = undefined;
21591
+ this.errorMessage = null;
21531
21592
  }
21532
21593
  });
21533
21594
 
@@ -21666,7 +21727,7 @@ class AuroCombobox extends AuroElement {
21666
21727
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
21667
21728
  // because focus is inside the top-layer dialog, so also check
21668
21729
  // dropdownOpen and the fullscreen transition flag.
21669
- if (!this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21730
+ if (!this.noValidate && !this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21670
21731
  this.validate();
21671
21732
  }
21672
21733
 
@@ -4977,7 +4977,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4977
4977
  }
4978
4978
  };
4979
4979
 
4980
- var formkitVersion$2 = '202608111803';
4980
+ var formkitVersion$2 = '202608262225';
4981
4981
 
4982
4982
  let AuroElement$2 = class AuroElement extends i$3 {
4983
4983
  static get properties() {
@@ -17149,6 +17149,8 @@ class BaseInput extends AuroElement$1 {
17149
17149
 
17150
17150
  /**
17151
17151
  * If set, the label will remain fixed in the active position.
17152
+ * Only applies to the classic/default layout; the emphasized and snowflake
17153
+ * layouts always render the label inside the field, so this has no effect there.
17152
17154
  */
17153
17155
  activeLabel: {
17154
17156
  type: Boolean,
@@ -18268,6 +18270,18 @@ class BaseInput extends AuroElement$1 {
18268
18270
  cardIcon: 'cc-dinersclub',
18269
18271
  maskFormat: "0000 000000 0000"
18270
18272
  },
18273
+ {
18274
+ // JCB is variable length (16-19 digits), like UnionPay, so it reuses the
18275
+ // formatMinLength/formatLength range machinery. The 35 prefix overlaps no
18276
+ // other brand (Amex is 34|37, Diners is 30[0-5]|36|38).
18277
+ name: 'JCB',
18278
+ regex: /^(?<num>35)\d{0}/u,
18279
+ formatMinLength: 19,
18280
+ formatLength: 23,
18281
+ errorMessage: CreditCardValidationMessage,
18282
+ cardIcon: 'cc-jcb',
18283
+ maskFormat: "0000 0000 0000 0000 000"
18284
+ },
18271
18285
  {
18272
18286
  name: 'Visa',
18273
18287
  regex: /^(?<num>4)\d{0}/u,
@@ -18299,6 +18313,20 @@ class BaseInput extends AuroElement$1 {
18299
18313
  errorMessage: CreditCardValidationMessage,
18300
18314
  cardIcon: 'cc-discover',
18301
18315
  maskFormat: "0000 0000 0000 0000"
18316
+ },
18317
+ {
18318
+ // China UnionPay is variable length (16-19 digits). It must come after
18319
+ // Discover so the last-match-wins loop below gives its 62 prefix
18320
+ // precedence over the generic `6` that resolves to Discover. 81 is used
18321
+ // by UnionPay cards issued outside mainland China and overlaps no other
18322
+ // brand. 60 is intentionally excluded (it overlaps real Discover 6011).
18323
+ name: 'China UnionPay',
18324
+ regex: /^(?<num>62|81)\d{0}/u,
18325
+ formatMinLength: 19,
18326
+ formatLength: 23,
18327
+ errorMessage: CreditCardValidationMessage,
18328
+ cardIcon: 'cc-unionpay',
18329
+ maskFormat: "0000 0000 0000 0000 000"
18302
18330
  }
18303
18331
  ];
18304
18332
 
@@ -18316,7 +18344,12 @@ class BaseInput extends AuroElement$1 {
18316
18344
  }
18317
18345
  });
18318
18346
 
18319
- this.validationCCLength = type.formatLength;
18347
+ // Variable-length brands (both min and max defined, e.g. UnionPay) validate
18348
+ // against the minimum masked length so shorter-but-valid entries are not
18349
+ // flagged tooShort. Fixed-length brands keep their single formatLength.
18350
+ this.validationCCLength = type.formatMinLength && type.formatLength
18351
+ ? type.formatMinLength
18352
+ : type.formatLength;
18320
18353
 
18321
18354
  return type;
18322
18355
  }
@@ -18675,7 +18708,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18675
18708
  }
18676
18709
  };
18677
18710
 
18678
- var formkitVersion$1 = '202608111803';
18711
+ var formkitVersion$1 = '202608262225';
18679
18712
 
18680
18713
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18681
18714
  // See LICENSE in the project root for license information.
@@ -18776,15 +18809,35 @@ class AuroInput extends BaseInput {
18776
18809
  * @private
18777
18810
  */
18778
18811
  get inputHidden() {
18812
+ // In the classic/default layout, activeLabel keeps the input row visible so
18813
+ // the label stays raised rather than collapsing to the centered placeholder
18814
+ // position. Emphasized/snowflake always render the label inside the field,
18815
+ // so activeLabel does not apply there. This only overrides the empty/
18816
+ // unfocused clause — the display-value clause (combobox/datepicker) is
18817
+ // preserved regardless.
18818
+ const activeLabelRaisesInput = this.activeLabel && this.isClassicLayout;
18819
+
18779
18820
  return (
18780
18821
  this.hasDisplayValueContent && !this.hasFocus && this.hasValue) ||
18781
18822
  (
18823
+ !activeLabelRaisesInput &&
18782
18824
  (!this.value || this.value.length === 0) &&
18783
18825
  !this.hasFocus &&
18784
18826
  (!this.placeholderStr || this.placeholderStr === '')
18785
18827
  );
18786
18828
  }
18787
18829
 
18830
+ /**
18831
+ * Whether the component is rendering the classic/default layout, meaning not
18832
+ * emphasized and not snowflake. Kept as a single source of truth so
18833
+ * layout-scoped behavior such as activeLabel stays consistent across getters.
18834
+ * @returns {boolean} - True for the classic/default layout.
18835
+ * @private
18836
+ */
18837
+ get isClassicLayout() {
18838
+ return !this.layout.startsWith('emphasized') && this.layout !== 'snowflake';
18839
+ }
18840
+
18788
18841
  /**
18789
18842
  * Determines if the input should display in a state with no focus or value indication.
18790
18843
  * Returns true when the input has display content without focus and has a value,
@@ -18830,7 +18883,7 @@ class AuroInput extends BaseInput {
18830
18883
  }
18831
18884
 
18832
18885
  // classic layout (default)
18833
- return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus) ? 'body-default' : 'body-xs';
18886
+ return ((!this.value || this.value.length === 0) && !this.placeholderStr && !this.hasFocus && !this.activeLabel) ? 'body-default' : 'body-xs';
18834
18887
  }
18835
18888
 
18836
18889
  /**
@@ -18926,7 +18979,8 @@ class AuroInput extends BaseInput {
18926
18979
  'wrapper': true,
18927
18980
  'simple': this.simple,
18928
18981
  'withValue': this.hasValue,
18929
- 'hasFocus': this.hasFocus
18982
+ 'hasFocus': this.hasFocus,
18983
+ 'activeLabel': this.activeLabel
18930
18984
  };
18931
18985
  }
18932
18986
 
@@ -19076,7 +19130,10 @@ class AuroInput extends BaseInput {
19076
19130
  */
19077
19131
  definePattern() {
19078
19132
  if (this.type === 'credit-card' && !this.noValidate && this.maxLength) {
19079
- return `.{${this.maxLength},${this.maxLength}}`;
19133
+ // Variable-length brands (e.g. UnionPay) set minLength, so accept a range;
19134
+ // fixed-length brands leave minLength undefined and keep an exact length.
19135
+ const minPatternLength = this.minLength || this.maxLength;
19136
+ return `.{${minPatternLength},${this.maxLength}}`;
19080
19137
  }
19081
19138
 
19082
19139
  return this.pattern;
@@ -19137,7 +19194,6 @@ class AuroInput extends BaseInput {
19137
19194
  @input="${this.handleInput}"
19138
19195
  .placeholder=${this.placeholderStr}
19139
19196
  .role=${this.a11yRole}
19140
- ?activeLabel="${this.activeLabel}"
19141
19197
  ?disabled="${this.disabled}"
19142
19198
  ?required="${this.required}"
19143
19199
  aria-activedescendant=${o(this.a11yActivedescendant)}
@@ -19831,7 +19887,7 @@ class AuroBibtemplate extends i$3 {
19831
19887
  }
19832
19888
  }
19833
19889
 
19834
- var formkitVersion = '202608111803';
19890
+ var formkitVersion = '202608262225';
19835
19891
 
19836
19892
  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}`;
19837
19893
 
@@ -21526,8 +21582,13 @@ class AuroCombobox extends AuroElement {
21526
21582
  // and validating against the pre-selection value flashes a stale error
21527
21583
  // between mousedown and mouseup. The next focusout fires after the
21528
21584
  // dropdown closes and validates against the post-selection value.
21529
- if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21585
+ if (!this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21530
21586
  this.validate();
21587
+ } else if (this.noValidate && !this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen && this.validity !== undefined && !this.hasAttribute('error')) {
21588
+ // Clear stale error state left by a previous validate(true) call.
21589
+ // Do not clear when the error attribute is set — that is an externally forced error.
21590
+ this.validity = undefined;
21591
+ this.errorMessage = null;
21531
21592
  }
21532
21593
  });
21533
21594
 
@@ -21666,7 +21727,7 @@ class AuroCombobox extends AuroElement {
21666
21727
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
21667
21728
  // because focus is inside the top-layer dialog, so also check
21668
21729
  // dropdownOpen and the fullscreen transition flag.
21669
- if (!this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21730
+ if (!this.noValidate && !this.componentHasFocus && !this.dropdownOpen && !this._inFullscreenTransition) {
21670
21731
  this.validate();
21671
21732
  }
21672
21733