@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
@@ -11638,23 +11638,28 @@ var popoverVersion = '6.0.1';
11638
11638
  * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
11639
11639
  */
11640
11640
  function parseIsoToTimestamp(isoStr) {
11641
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
11642
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
11643
+ // characters. `parseInt` alone accepted both because it stops at the
11644
+ // first non-digit and doesn't require a minimum length.
11645
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
11646
+ const MAX_MONTH = 12;
11647
+ const MAX_DAY = 31;
11648
+
11641
11649
  if (typeof isoStr !== 'string') {
11642
11650
  return null;
11643
11651
  }
11644
- const parts = isoStr.split('-');
11645
- if (parts.length !== 3) {
11646
- return null;
11647
- }
11648
- const year = parseInt(parts[0], 10);
11649
- const month = parseInt(parts[1], 10);
11650
- const day = parseInt(parts[2], 10);
11651
- if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
11652
+ const match = ISO_DATE_RE.exec(isoStr);
11653
+ if (!match) {
11652
11654
  return null;
11653
11655
  }
11656
+ const year = Number(match.groups.year);
11657
+ const month = Number(match.groups.month);
11658
+ const day = Number(match.groups.day);
11654
11659
  // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
11655
11660
  // silently normalizes those to a different calendar day, which would
11656
11661
  // disable the wrong date if we let the result through.
11657
- if (month < 1 || month > 12 || day < 1 || day > 31) {
11662
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
11658
11663
  return null;
11659
11664
  }
11660
11665
  const date = new Date(year, month - 1, day);
@@ -12232,13 +12237,36 @@ class AuroCalendarCell extends LitElement {
12232
12237
  }
12233
12238
 
12234
12239
  firstUpdated() {
12240
+ this._initFromAncestors();
12241
+ }
12242
+
12243
+ /**
12244
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
12245
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
12246
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
12247
+ * method (which is outside the framework's contract).
12248
+ * @private
12249
+ * @returns {void}
12250
+ */
12251
+ _initFromAncestors() {
12235
12252
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
12236
12253
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
12237
12254
 
12238
12255
  if (!calendar) {
12239
- setTimeout(() => this.firstUpdated(), 0);
12256
+ // Retry on the next event-loop turn to give the ancestor chain a chance
12257
+ // to attach — but cap attempts so a permanently detached cell doesn't
12258
+ // spin forever. 10 turns is far more than any observed race needs.
12259
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
12260
+ if (this._firstUpdatedRetries > 10) {
12261
+ return;
12262
+ }
12263
+ this._firstUpdatedRetryTimer = setTimeout(() => {
12264
+ this._firstUpdatedRetryTimer = null;
12265
+ this._initFromAncestors();
12266
+ }, 0);
12240
12267
  return;
12241
12268
  }
12269
+ this._firstUpdatedRetries = 0;
12242
12270
  this.calendar = calendar;
12243
12271
  this.datepicker = calendar.datepicker;
12244
12272
  this._slotContentHandler = () => {
@@ -12266,6 +12294,10 @@ class AuroCalendarCell extends LitElement {
12266
12294
  if (this.datepicker && this._slotContentHandler) {
12267
12295
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
12268
12296
  }
12297
+ if (this._firstUpdatedRetryTimer) {
12298
+ clearTimeout(this._firstUpdatedRetryTimer);
12299
+ this._firstUpdatedRetryTimer = null;
12300
+ }
12269
12301
  }
12270
12302
 
12271
12303
  /**
@@ -13637,7 +13669,7 @@ class AuroBibtemplate extends LitElement {
13637
13669
  }
13638
13670
  }
13639
13671
 
13640
- var formkitVersion$2 = '202607022214';
13672
+ var formkitVersion$2 = '202607022134';
13641
13673
 
13642
13674
  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=literal`${unsafeStatic(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$1 = 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$1=css`: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}
13643
13675
  `,u$4=css`.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}}
@@ -13776,7 +13808,10 @@ class AuroCalendar extends RangeDatepicker {
13776
13808
  * Support will be removed in a future major release.
13777
13809
  * @private
13778
13810
  */
13779
- this.disabledDays = [];
13811
+ // Initialize the backing field directly so the constructor's default
13812
+ // empty array doesn't trigger the deprecation warning. Assignments from
13813
+ // consumers still route through the setter below.
13814
+ this._disabledDays = [];
13780
13815
 
13781
13816
  /**
13782
13817
  * @private
@@ -13809,6 +13844,44 @@ class AuroCalendar extends RangeDatepicker {
13809
13844
  this._calendarInstanceId = Date.now().toString(36);
13810
13845
  }
13811
13846
 
13847
+ /**
13848
+ * @deprecated See constructor JSDoc — migrate to
13849
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
13850
+ * one-time deprecation warning fires as soon as a consumer assigns a
13851
+ * non-empty array (empty assignments are ignored — an empty array is
13852
+ * indistinguishable from the constructor default and would produce a
13853
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
13854
+ * to rebuild.
13855
+ * @returns {Array} The current legacy `disabledDays` array.
13856
+ */
13857
+ get disabledDays() {
13858
+ return this._disabledDays;
13859
+ }
13860
+
13861
+ /**
13862
+ * @param {Array} value - The legacy `disabledDays` array to set.
13863
+ */
13864
+ set disabledDays(value) {
13865
+ const oldValue = this._disabledDays;
13866
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
13867
+ // (Lit's Array attribute converter returns null for a missing/empty
13868
+ // attribute) or misuse the API; downstream code in
13869
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
13870
+ // without an Array.isArray guard, so a truthy non-array would throw
13871
+ // at render.
13872
+ const coerced = Array.isArray(value) ? value : [];
13873
+ if (coerced.length > 0) {
13874
+ this._warnDisabledDaysDeprecated();
13875
+ }
13876
+ this._disabledDays = coerced;
13877
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
13878
+ // RangeDatepicker base class; Lit's generated setter (which we've
13879
+ // overridden here to insert the warning) is what normally invalidates
13880
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
13881
+ // assignments still re-render the calendar.
13882
+ this.requestUpdate('disabledDays', oldValue);
13883
+ }
13884
+
13812
13885
  static get styles() {
13813
13886
  return [
13814
13887
  styleCss$7,
@@ -14354,8 +14427,19 @@ class AuroCalendar extends RangeDatepicker {
14354
14427
  /**
14355
14428
  * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14356
14429
  * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14357
- * The cache invalidates when either source array's reference changes, which
14358
- * matches Lit's own reactive identity semantics for array properties.
14430
+ *
14431
+ * The cache invalidates on **reference identity** only when the
14432
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
14433
+ * Lit's own reactivity semantics for array properties. In-place mutations
14434
+ * on the existing array (`push`, `splice`, index assignment) will NOT
14435
+ * invalidate the cache and the new entries will be silently ignored.
14436
+ * Consumers must reassign to update — see the JSDoc on
14437
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
14438
+ *
14439
+ * A shallow-equality tier was considered but rejected: it would run
14440
+ * O(N) work on every cell render (this method is called per-cell via
14441
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
14442
+ * offering a false sense of safety.
14359
14443
  * @private
14360
14444
  * @returns {Set<Number>}
14361
14445
  */
@@ -14536,7 +14620,24 @@ class AuroCalendar extends RangeDatepicker {
14536
14620
  // rendered month(s) first so a single-month calendar does not pick a date
14537
14621
  // that has no DOM cell. Determine the visible range based on centralDate and
14538
14622
  // the number of rendered months.
14539
- const renderedMonths = Math.max(this.numCalendars, 1);
14623
+ //
14624
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
14625
+ // render() — so by the time the visible-change handler in updated()
14626
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
14627
+ // set. Guard against the pre-first-render path anyway (e.g. any future
14628
+ // caller that reaches computeActiveDate before render() has run):
14629
+ // Math.max(undefined, 1) is NaN, which would silently skip the
14630
+ // visible-month scan below. Fall back to maximumRenderableMonths'
14631
+ // desktop default (1 for non-range, 2 for range) so the scan window is
14632
+ // correctly sized whenever numCalendars is not yet populated.
14633
+ let renderedMonths = null;
14634
+
14635
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
14636
+ renderedMonths = this.numCalendars;
14637
+ } else {
14638
+ renderedMonths = this.noRange ? 1 : 2;
14639
+ }
14640
+
14540
14641
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
14541
14642
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
14542
14643
  visMonthStart.setHours(0, 0, 0, 0);
@@ -14806,6 +14907,8 @@ class AuroCalendar extends RangeDatepicker {
14806
14907
  let targetIndex = -1;
14807
14908
  if (direction === 'next') {
14808
14909
  targetIndex = currentIndex + 1;
14910
+ } else if (direction === 'prev') {
14911
+ targetIndex = currentIndex - 1;
14809
14912
  }
14810
14913
 
14811
14914
  if (targetIndex >= 0 && targetIndex < allCells.length) {
@@ -15410,6 +15513,10 @@ class AuroCalendar extends RangeDatepicker {
15410
15513
  * originally tried aria-live="polite" here, but VoiceOver treats
15411
15514
  * polite as "wait until idle" — which never happens during active
15412
15515
  * keyboard navigation — so the announcements were silently dropped.
15516
+ *
15517
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
15518
+ * prefers `polite` for status messages. See the "Documented
15519
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
15413
15520
  * @private
15414
15521
  * @param {String} dateStr - The localized date string to announce.
15415
15522
  * @returns {void}
@@ -19455,7 +19562,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
19455
19562
  }
19456
19563
  };
19457
19564
 
19458
- var formkitVersion$1 = '202607022214';
19565
+ var formkitVersion$1 = '202607022134';
19459
19566
 
19460
19567
  let AuroElement$2 = class AuroElement extends LitElement {
19461
19568
  static get properties() {
@@ -32337,17 +32444,14 @@ class BaseInput extends AuroElement$1 {
32337
32444
  * @returns {void}
32338
32445
  */
32339
32446
  notifyValueChanged() {
32340
- // This echoes Lit's reactive value update (and handleClickClear's
32341
- // programmatic clear) — it is NOT a fresh user-input event. Mark it
32342
- // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
32343
- // it from genuine user typing and skip clobbering their own
32344
- // programmatic state during init-time renders.
32345
- const inputEvent = new Event('input', {
32447
+ let inputEvent = null;
32448
+
32449
+ inputEvent = new Event('input', {
32346
32450
  bubbles: true,
32347
32451
  composed: true,
32348
32452
  });
32349
- inputEvent.isProgrammatic = true;
32350
32453
 
32454
+ // Dispatched event to alert outside shadow DOM context of event firing.
32351
32455
  this.dispatchEvent(inputEvent);
32352
32456
  }
32353
32457
 
@@ -33060,7 +33164,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
33060
33164
  }
33061
33165
  };
33062
33166
 
33063
- var formkitVersion = '202607022214';
33167
+ var formkitVersion = '202607022134';
33064
33168
 
33065
33169
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
33066
33170
  // See LICENSE in the project root for license information.
@@ -33346,15 +33450,20 @@ class AuroInput extends BaseInput {
33346
33450
  * @returns {void}
33347
33451
  */
33348
33452
  checkDisplayValueSlotChange() {
33349
- // flatten:true resolves through auro-combobox's forwarding slot
33350
- // (<slot name="displayValue" slot="displayValue">) so a clone appended
33351
- // directly to auro-input's light DOM alongside the forwarder still
33352
- // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
33353
- // discarded any siblings past the forwarder.
33354
- const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
33355
- const nodes = slot.assignedNodes({ flatten: true });
33453
+ let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
33454
+
33455
+ // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
33456
+ if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
33457
+ nodes = nodes[0].assignedNodes();
33458
+ }
33459
+
33460
+ let hasContent = false;
33356
33461
 
33357
- this.hasDisplayValueContent = nodes.length > 0;
33462
+ if (nodes.length > 0) {
33463
+ hasContent = true;
33464
+ }
33465
+
33466
+ this.hasDisplayValueContent = hasContent;
33358
33467
  }
33359
33468
 
33360
33469
  firstUpdated() {
@@ -34432,6 +34541,15 @@ const datepickerKeyboardStrategy = {
34432
34541
  evt.stopPropagation();
34433
34542
  evt.preventDefault();
34434
34543
 
34544
+ // Signal to the visibility-change handler in auro-datepicker.js that
34545
+ // focus should be restored to the trigger regardless of hasFocus.
34546
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
34547
+ // and hiding the grid's popover ancestor drops focus to <body>. That
34548
+ // synchronously fires focusout on the datepicker host — clearing
34549
+ // hasFocus — before updated() runs, which would otherwise skip the
34550
+ // input refocus. Native <dialog>.close() (modal path) restores focus
34551
+ // itself, but the flag is harmless there.
34552
+ component._restoreFocusOnClose = true;
34435
34553
  component.hideBib();
34436
34554
  },
34437
34555
 
@@ -34705,6 +34823,14 @@ class AuroDatePicker extends AuroElement {
34705
34823
 
34706
34824
  /**
34707
34825
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
34826
+ *
34827
+ * **Immutable update required.** The datepicker treats this array as
34828
+ * immutable and memoizes a lookup Set keyed on the array's reference
34829
+ * identity — matching Lit's own reactivity semantics for array
34830
+ * properties. In-place mutations (`blackoutDates.push(...)`,
34831
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
34832
+ * invalidate the cache and the new entries will be silently ignored.
34833
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
34708
34834
  */
34709
34835
  blackoutDates: {
34710
34836
  type: Array,
@@ -35590,12 +35716,13 @@ class AuroDatePicker extends AuroElement {
35590
35716
  this.calendar.activeCellDate = null;
35591
35717
 
35592
35718
  // Show the month containing the selected date (or today) instead of
35593
- // whichever month the user last navigated to.
35719
+ // whichever month the user last navigated to. Route through
35720
+ // updateCentralDate so centralDate stays first-of-month.
35594
35721
  // Respect consumer-provided centralDate/calendarStartDate if no value is set.
35595
35722
  if (this.valueObject) {
35596
- this.centralDate = this.value;
35723
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
35597
35724
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
35598
- this.centralDate = dateFormatter$1.toISOFormatString(new Date());
35725
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
35599
35726
  }
35600
35727
  }
35601
35728
 
@@ -35653,8 +35780,15 @@ class AuroDatePicker extends AuroElement {
35653
35780
  // Always clear the inert flag. Only restore focus to the input when the datepicker
35654
35781
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
35655
35782
  // which would pull them back and require extra Tab presses to escape.
35783
+ //
35784
+ // `_restoreFocusOnClose` is set by the Escape handler in
35785
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
35786
+ // has already been cleared — hidePopover() (desktop non-modal path)
35787
+ // can drop focus to <body> before this update fires.
35656
35788
  this.dropdown.trigger.inert = false;
35657
- if (this.hasFocus) {
35789
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
35790
+ this._restoreFocusOnClose = false;
35791
+ if (shouldRestoreFocus) {
35658
35792
  requestAnimationFrame(() => {
35659
35793
  if (!this.dropdown.isPopoverVisible) {
35660
35794
  this.inputList[0].focus();
@@ -36100,6 +36234,18 @@ class AuroDatePicker extends AuroElement {
36100
36234
  this.calendar.requestUpdate();
36101
36235
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
36102
36236
  }
36237
+
36238
+ // Range invariant: if a value change (from click or programmatic) has
36239
+ // moved start past end, clear valueEnd here so both properties land in
36240
+ // the SAME reactive cycle. Doing it in updated() would schedule a
36241
+ // second cycle after cellClickActive/wasCellClick has already been
36242
+ // consumed by the value branch, leaving the valueEnd branch to run
36243
+ // with a stale handshake and racing with any intervening programmatic
36244
+ // value assignments.
36245
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
36246
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36247
+ this.valueEnd = undefined;
36248
+ }
36103
36249
  }
36104
36250
 
36105
36251
  updated(changedProperties) {
@@ -36167,8 +36313,12 @@ class AuroDatePicker extends AuroElement {
36167
36313
 
36168
36314
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
36169
36315
  // Skip centralDate update when user clicked a cell in range mode
36170
- // to prevent the displayed months from shifting
36171
- this.centralDate = this.value;
36316
+ // to prevent the displayed months from shifting. Route through
36317
+ // updateCentralDate so centralDate stays first-of-month — direct
36318
+ // assignment of the raw value briefly holds a mid-month string
36319
+ // and violates the invariant that observers (e.g. calendar sync)
36320
+ // rely on.
36321
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
36172
36322
  }
36173
36323
 
36174
36324
  this.setHasValue();
@@ -36226,8 +36376,10 @@ class AuroDatePicker extends AuroElement {
36226
36376
 
36227
36377
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
36228
36378
  // Skip centralDate update when user clicked a cell in range mode
36229
- // to prevent the displayed months from shifting
36230
- this.centralDate = this.valueEnd;
36379
+ // to prevent the displayed months from shifting. Route through
36380
+ // updateCentralDate to preserve the first-of-month invariant
36381
+ // (see matching comment in the value branch above).
36382
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
36231
36383
  }
36232
36384
 
36233
36385
  this.validate();
@@ -36251,10 +36403,6 @@ class AuroDatePicker extends AuroElement {
36251
36403
  this.validation.validate(lastInput, true);
36252
36404
  }
36253
36405
 
36254
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36255
- this.valueEnd = undefined;
36256
- }
36257
-
36258
36406
  // This resets the datepicker when the minDate is set to a new value that is
36259
36407
  // a later date than the current value date
36260
36408
  if (changedProperties.has('minDate') && this.minDate) {