@aurodesignsystem-dev/auro-formkit 0.0.0-pr1524.1 → 0.0.0-pr1530.1

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 (52) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +24 -79
  7. package/components/combobox/demo/getting-started.min.js +24 -79
  8. package/components/combobox/demo/index.min.js +24 -79
  9. package/components/combobox/dist/auro-combobox.d.ts +0 -10
  10. package/components/combobox/dist/index.js +24 -79
  11. package/components/combobox/dist/registered.js +24 -79
  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/accessibility.md +13 -4
  17. package/components/datepicker/demo/api.md +1 -1
  18. package/components/datepicker/demo/customize.min.js +192 -44
  19. package/components/datepicker/demo/index.min.js +192 -44
  20. package/components/datepicker/demo/voiceover.md +1 -1
  21. package/components/datepicker/dist/auro-calendar-cell.d.ts +11 -0
  22. package/components/datepicker/dist/auro-calendar.d.ts +26 -2
  23. package/components/datepicker/dist/auro-datepicker.d.ts +9 -1
  24. package/components/datepicker/dist/index.js +192 -44
  25. package/components/datepicker/dist/registered.js +192 -44
  26. package/components/dropdown/demo/customize.min.js +1 -1
  27. package/components/dropdown/demo/getting-started.min.js +1 -1
  28. package/components/dropdown/demo/index.min.js +1 -1
  29. package/components/dropdown/dist/index.js +1 -1
  30. package/components/dropdown/dist/registered.js +1 -1
  31. package/components/form/demo/customize.min.js +254 -205
  32. package/components/form/demo/getting-started.min.js +254 -205
  33. package/components/form/demo/index.min.js +254 -205
  34. package/components/form/demo/registerDemoDeps.min.js +254 -205
  35. package/components/input/demo/customize.min.js +19 -17
  36. package/components/input/demo/getting-started.min.js +19 -17
  37. package/components/input/demo/index.min.js +19 -17
  38. package/components/input/dist/index.js +19 -17
  39. package/components/input/dist/registered.js +19 -17
  40. package/components/radio/demo/customize.min.js +1 -1
  41. package/components/radio/demo/getting-started.min.js +1 -1
  42. package/components/radio/demo/index.min.js +1 -1
  43. package/components/radio/dist/index.js +1 -1
  44. package/components/radio/dist/registered.js +1 -1
  45. package/components/select/demo/customize.min.js +16 -62
  46. package/components/select/demo/getting-started.min.js +16 -62
  47. package/components/select/demo/index.min.js +16 -62
  48. package/components/select/dist/auro-select.d.ts +0 -6
  49. package/components/select/dist/index.js +16 -62
  50. package/components/select/dist/registered.js +16 -62
  51. package/custom-elements.json +38 -22
  52. package/package.json +1 -1
@@ -11680,23 +11680,28 @@ var popoverVersion = '6.0.1';
11680
11680
  * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
11681
11681
  */
11682
11682
  function parseIsoToTimestamp(isoStr) {
11683
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
11684
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
11685
+ // characters. `parseInt` alone accepted both because it stops at the
11686
+ // first non-digit and doesn't require a minimum length.
11687
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
11688
+ const MAX_MONTH = 12;
11689
+ const MAX_DAY = 31;
11690
+
11683
11691
  if (typeof isoStr !== 'string') {
11684
11692
  return null;
11685
11693
  }
11686
- const parts = isoStr.split('-');
11687
- if (parts.length !== 3) {
11688
- return null;
11689
- }
11690
- const year = parseInt(parts[0], 10);
11691
- const month = parseInt(parts[1], 10);
11692
- const day = parseInt(parts[2], 10);
11693
- if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
11694
+ const match = ISO_DATE_RE.exec(isoStr);
11695
+ if (!match) {
11694
11696
  return null;
11695
11697
  }
11698
+ const year = Number(match.groups.year);
11699
+ const month = Number(match.groups.month);
11700
+ const day = Number(match.groups.day);
11696
11701
  // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
11697
11702
  // silently normalizes those to a different calendar day, which would
11698
11703
  // disable the wrong date if we let the result through.
11699
- if (month < 1 || month > 12 || day < 1 || day > 31) {
11704
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
11700
11705
  return null;
11701
11706
  }
11702
11707
  const date = new Date(year, month - 1, day);
@@ -12274,13 +12279,36 @@ class AuroCalendarCell extends i$1 {
12274
12279
  }
12275
12280
 
12276
12281
  firstUpdated() {
12282
+ this._initFromAncestors();
12283
+ }
12284
+
12285
+ /**
12286
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
12287
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
12288
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
12289
+ * method (which is outside the framework's contract).
12290
+ * @private
12291
+ * @returns {void}
12292
+ */
12293
+ _initFromAncestors() {
12277
12294
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
12278
12295
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
12279
12296
 
12280
12297
  if (!calendar) {
12281
- setTimeout(() => this.firstUpdated(), 0);
12298
+ // Retry on the next event-loop turn to give the ancestor chain a chance
12299
+ // to attach — but cap attempts so a permanently detached cell doesn't
12300
+ // spin forever. 10 turns is far more than any observed race needs.
12301
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
12302
+ if (this._firstUpdatedRetries > 10) {
12303
+ return;
12304
+ }
12305
+ this._firstUpdatedRetryTimer = setTimeout(() => {
12306
+ this._firstUpdatedRetryTimer = null;
12307
+ this._initFromAncestors();
12308
+ }, 0);
12282
12309
  return;
12283
12310
  }
12311
+ this._firstUpdatedRetries = 0;
12284
12312
  this.calendar = calendar;
12285
12313
  this.datepicker = calendar.datepicker;
12286
12314
  this._slotContentHandler = () => {
@@ -12308,6 +12336,10 @@ class AuroCalendarCell extends i$1 {
12308
12336
  if (this.datepicker && this._slotContentHandler) {
12309
12337
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
12310
12338
  }
12339
+ if (this._firstUpdatedRetryTimer) {
12340
+ clearTimeout(this._firstUpdatedRetryTimer);
12341
+ this._firstUpdatedRetryTimer = null;
12342
+ }
12311
12343
  }
12312
12344
 
12313
12345
  /**
@@ -13685,7 +13717,7 @@ class AuroBibtemplate extends i$1 {
13685
13717
  }
13686
13718
  }
13687
13719
 
13688
- var formkitVersion$2 = '202607022214';
13720
+ var formkitVersion$2 = '202607022134';
13689
13721
 
13690
13722
  let l$1 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$5`${s$5(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$4 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$3=i$3`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
13691
13723
  `,u$6=i$3`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -13824,7 +13856,10 @@ class AuroCalendar extends RangeDatepicker {
13824
13856
  * Support will be removed in a future major release.
13825
13857
  * @private
13826
13858
  */
13827
- this.disabledDays = [];
13859
+ // Initialize the backing field directly so the constructor's default
13860
+ // empty array doesn't trigger the deprecation warning. Assignments from
13861
+ // consumers still route through the setter below.
13862
+ this._disabledDays = [];
13828
13863
 
13829
13864
  /**
13830
13865
  * @private
@@ -13857,6 +13892,44 @@ class AuroCalendar extends RangeDatepicker {
13857
13892
  this._calendarInstanceId = Date.now().toString(36);
13858
13893
  }
13859
13894
 
13895
+ /**
13896
+ * @deprecated See constructor JSDoc — migrate to
13897
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
13898
+ * one-time deprecation warning fires as soon as a consumer assigns a
13899
+ * non-empty array (empty assignments are ignored — an empty array is
13900
+ * indistinguishable from the constructor default and would produce a
13901
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
13902
+ * to rebuild.
13903
+ * @returns {Array} The current legacy `disabledDays` array.
13904
+ */
13905
+ get disabledDays() {
13906
+ return this._disabledDays;
13907
+ }
13908
+
13909
+ /**
13910
+ * @param {Array} value - The legacy `disabledDays` array to set.
13911
+ */
13912
+ set disabledDays(value) {
13913
+ const oldValue = this._disabledDays;
13914
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
13915
+ // (Lit's Array attribute converter returns null for a missing/empty
13916
+ // attribute) or misuse the API; downstream code in
13917
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
13918
+ // without an Array.isArray guard, so a truthy non-array would throw
13919
+ // at render.
13920
+ const coerced = Array.isArray(value) ? value : [];
13921
+ if (coerced.length > 0) {
13922
+ this._warnDisabledDaysDeprecated();
13923
+ }
13924
+ this._disabledDays = coerced;
13925
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
13926
+ // RangeDatepicker base class; Lit's generated setter (which we've
13927
+ // overridden here to insert the warning) is what normally invalidates
13928
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
13929
+ // assignments still re-render the calendar.
13930
+ this.requestUpdate('disabledDays', oldValue);
13931
+ }
13932
+
13860
13933
  static get styles() {
13861
13934
  return [
13862
13935
  styleCss$7,
@@ -14402,8 +14475,19 @@ class AuroCalendar extends RangeDatepicker {
14402
14475
  /**
14403
14476
  * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14404
14477
  * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14405
- * The cache invalidates when either source array's reference changes, which
14406
- * matches Lit's own reactive identity semantics for array properties.
14478
+ *
14479
+ * The cache invalidates on **reference identity** only when the
14480
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
14481
+ * Lit's own reactivity semantics for array properties. In-place mutations
14482
+ * on the existing array (`push`, `splice`, index assignment) will NOT
14483
+ * invalidate the cache and the new entries will be silently ignored.
14484
+ * Consumers must reassign to update — see the JSDoc on
14485
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
14486
+ *
14487
+ * A shallow-equality tier was considered but rejected: it would run
14488
+ * O(N) work on every cell render (this method is called per-cell via
14489
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
14490
+ * offering a false sense of safety.
14407
14491
  * @private
14408
14492
  * @returns {Set<Number>}
14409
14493
  */
@@ -14584,7 +14668,24 @@ class AuroCalendar extends RangeDatepicker {
14584
14668
  // rendered month(s) first so a single-month calendar does not pick a date
14585
14669
  // that has no DOM cell. Determine the visible range based on centralDate and
14586
14670
  // the number of rendered months.
14587
- const renderedMonths = Math.max(this.numCalendars, 1);
14671
+ //
14672
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
14673
+ // render() — so by the time the visible-change handler in updated()
14674
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
14675
+ // set. Guard against the pre-first-render path anyway (e.g. any future
14676
+ // caller that reaches computeActiveDate before render() has run):
14677
+ // Math.max(undefined, 1) is NaN, which would silently skip the
14678
+ // visible-month scan below. Fall back to maximumRenderableMonths'
14679
+ // desktop default (1 for non-range, 2 for range) so the scan window is
14680
+ // correctly sized whenever numCalendars is not yet populated.
14681
+ let renderedMonths = null;
14682
+
14683
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
14684
+ renderedMonths = this.numCalendars;
14685
+ } else {
14686
+ renderedMonths = this.noRange ? 1 : 2;
14687
+ }
14688
+
14588
14689
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
14589
14690
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
14590
14691
  visMonthStart.setHours(0, 0, 0, 0);
@@ -14854,6 +14955,8 @@ class AuroCalendar extends RangeDatepicker {
14854
14955
  let targetIndex = -1;
14855
14956
  if (direction === 'next') {
14856
14957
  targetIndex = currentIndex + 1;
14958
+ } else if (direction === 'prev') {
14959
+ targetIndex = currentIndex - 1;
14857
14960
  }
14858
14961
 
14859
14962
  if (targetIndex >= 0 && targetIndex < allCells.length) {
@@ -15458,6 +15561,10 @@ class AuroCalendar extends RangeDatepicker {
15458
15561
  * originally tried aria-live="polite" here, but VoiceOver treats
15459
15562
  * polite as "wait until idle" — which never happens during active
15460
15563
  * keyboard navigation — so the announcements were silently dropped.
15564
+ *
15565
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
15566
+ * prefers `polite` for status messages. See the "Documented
15567
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
15461
15568
  * @private
15462
15569
  * @param {String} dateStr - The localized date string to announce.
15463
15570
  * @returns {void}
@@ -19527,7 +19634,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
19527
19634
  }
19528
19635
  };
19529
19636
 
19530
- var formkitVersion$1 = '202607022214';
19637
+ var formkitVersion$1 = '202607022134';
19531
19638
 
19532
19639
  let AuroElement$2 = class AuroElement extends i$1 {
19533
19640
  static get properties() {
@@ -32416,17 +32523,14 @@ class BaseInput extends AuroElement$1 {
32416
32523
  * @returns {void}
32417
32524
  */
32418
32525
  notifyValueChanged() {
32419
- // This echoes Lit's reactive value update (and handleClickClear's
32420
- // programmatic clear) — it is NOT a fresh user-input event. Mark it
32421
- // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
32422
- // it from genuine user typing and skip clobbering their own
32423
- // programmatic state during init-time renders.
32424
- const inputEvent = new Event('input', {
32526
+ let inputEvent = null;
32527
+
32528
+ inputEvent = new Event('input', {
32425
32529
  bubbles: true,
32426
32530
  composed: true,
32427
32531
  });
32428
- inputEvent.isProgrammatic = true;
32429
32532
 
32533
+ // Dispatched event to alert outside shadow DOM context of event firing.
32430
32534
  this.dispatchEvent(inputEvent);
32431
32535
  }
32432
32536
 
@@ -33139,7 +33243,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
33139
33243
  }
33140
33244
  };
33141
33245
 
33142
- var formkitVersion = '202607022214';
33246
+ var formkitVersion = '202607022134';
33143
33247
 
33144
33248
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
33145
33249
  // See LICENSE in the project root for license information.
@@ -33425,15 +33529,20 @@ class AuroInput extends BaseInput {
33425
33529
  * @returns {void}
33426
33530
  */
33427
33531
  checkDisplayValueSlotChange() {
33428
- // flatten:true resolves through auro-combobox's forwarding slot
33429
- // (<slot name="displayValue" slot="displayValue">) so a clone appended
33430
- // directly to auro-input's light DOM alongside the forwarder still
33431
- // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
33432
- // discarded any siblings past the forwarder.
33433
- const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
33434
- const nodes = slot.assignedNodes({ flatten: true });
33532
+ let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
33533
+
33534
+ // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
33535
+ if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
33536
+ nodes = nodes[0].assignedNodes();
33537
+ }
33538
+
33539
+ let hasContent = false;
33435
33540
 
33436
- this.hasDisplayValueContent = nodes.length > 0;
33541
+ if (nodes.length > 0) {
33542
+ hasContent = true;
33543
+ }
33544
+
33545
+ this.hasDisplayValueContent = hasContent;
33437
33546
  }
33438
33547
 
33439
33548
  firstUpdated() {
@@ -34511,6 +34620,15 @@ const datepickerKeyboardStrategy = {
34511
34620
  evt.stopPropagation();
34512
34621
  evt.preventDefault();
34513
34622
 
34623
+ // Signal to the visibility-change handler in auro-datepicker.js that
34624
+ // focus should be restored to the trigger regardless of hasFocus.
34625
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
34626
+ // and hiding the grid's popover ancestor drops focus to <body>. That
34627
+ // synchronously fires focusout on the datepicker host — clearing
34628
+ // hasFocus — before updated() runs, which would otherwise skip the
34629
+ // input refocus. Native <dialog>.close() (modal path) restores focus
34630
+ // itself, but the flag is harmless there.
34631
+ component._restoreFocusOnClose = true;
34514
34632
  component.hideBib();
34515
34633
  },
34516
34634
 
@@ -34784,6 +34902,14 @@ class AuroDatePicker extends AuroElement {
34784
34902
 
34785
34903
  /**
34786
34904
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
34905
+ *
34906
+ * **Immutable update required.** The datepicker treats this array as
34907
+ * immutable and memoizes a lookup Set keyed on the array's reference
34908
+ * identity — matching Lit's own reactivity semantics for array
34909
+ * properties. In-place mutations (`blackoutDates.push(...)`,
34910
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
34911
+ * invalidate the cache and the new entries will be silently ignored.
34912
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
34787
34913
  */
34788
34914
  blackoutDates: {
34789
34915
  type: Array,
@@ -35669,12 +35795,13 @@ class AuroDatePicker extends AuroElement {
35669
35795
  this.calendar.activeCellDate = null;
35670
35796
 
35671
35797
  // Show the month containing the selected date (or today) instead of
35672
- // whichever month the user last navigated to.
35798
+ // whichever month the user last navigated to. Route through
35799
+ // updateCentralDate so centralDate stays first-of-month.
35673
35800
  // Respect consumer-provided centralDate/calendarStartDate if no value is set.
35674
35801
  if (this.valueObject) {
35675
- this.centralDate = this.value;
35802
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
35676
35803
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
35677
- this.centralDate = dateFormatter$1.toISOFormatString(new Date());
35804
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
35678
35805
  }
35679
35806
  }
35680
35807
 
@@ -35732,8 +35859,15 @@ class AuroDatePicker extends AuroElement {
35732
35859
  // Always clear the inert flag. Only restore focus to the input when the datepicker
35733
35860
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
35734
35861
  // which would pull them back and require extra Tab presses to escape.
35862
+ //
35863
+ // `_restoreFocusOnClose` is set by the Escape handler in
35864
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
35865
+ // has already been cleared — hidePopover() (desktop non-modal path)
35866
+ // can drop focus to <body> before this update fires.
35735
35867
  this.dropdown.trigger.inert = false;
35736
- if (this.hasFocus) {
35868
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
35869
+ this._restoreFocusOnClose = false;
35870
+ if (shouldRestoreFocus) {
35737
35871
  requestAnimationFrame(() => {
35738
35872
  if (!this.dropdown.isPopoverVisible) {
35739
35873
  this.inputList[0].focus();
@@ -36179,6 +36313,18 @@ class AuroDatePicker extends AuroElement {
36179
36313
  this.calendar.requestUpdate();
36180
36314
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
36181
36315
  }
36316
+
36317
+ // Range invariant: if a value change (from click or programmatic) has
36318
+ // moved start past end, clear valueEnd here so both properties land in
36319
+ // the SAME reactive cycle. Doing it in updated() would schedule a
36320
+ // second cycle after cellClickActive/wasCellClick has already been
36321
+ // consumed by the value branch, leaving the valueEnd branch to run
36322
+ // with a stale handshake and racing with any intervening programmatic
36323
+ // value assignments.
36324
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
36325
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36326
+ this.valueEnd = undefined;
36327
+ }
36182
36328
  }
36183
36329
 
36184
36330
  updated(changedProperties) {
@@ -36246,8 +36392,12 @@ class AuroDatePicker extends AuroElement {
36246
36392
 
36247
36393
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
36248
36394
  // Skip centralDate update when user clicked a cell in range mode
36249
- // to prevent the displayed months from shifting
36250
- this.centralDate = this.value;
36395
+ // to prevent the displayed months from shifting. Route through
36396
+ // updateCentralDate so centralDate stays first-of-month — direct
36397
+ // assignment of the raw value briefly holds a mid-month string
36398
+ // and violates the invariant that observers (e.g. calendar sync)
36399
+ // rely on.
36400
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
36251
36401
  }
36252
36402
 
36253
36403
  this.setHasValue();
@@ -36305,8 +36455,10 @@ class AuroDatePicker extends AuroElement {
36305
36455
 
36306
36456
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
36307
36457
  // Skip centralDate update when user clicked a cell in range mode
36308
- // to prevent the displayed months from shifting
36309
- this.centralDate = this.valueEnd;
36458
+ // to prevent the displayed months from shifting. Route through
36459
+ // updateCentralDate to preserve the first-of-month invariant
36460
+ // (see matching comment in the value branch above).
36461
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
36310
36462
  }
36311
36463
 
36312
36464
  this.validate();
@@ -36330,10 +36482,6 @@ class AuroDatePicker extends AuroElement {
36330
36482
  this.validation.validate(lastInput, true);
36331
36483
  }
36332
36484
 
36333
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36334
- this.valueEnd = undefined;
36335
- }
36336
-
36337
36485
  // This resets the datepicker when the minDate is set to a new value that is
36338
36486
  // a later date than the current value date
36339
36487
  if (changedProperties.has('minDate') && this.minDate) {