@aurodesignsystem-dev/auro-formkit 0.0.0-pr1550.1 → 0.0.0-pr1551.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 (44) 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 +46 -207
  7. package/components/combobox/demo/getting-started.min.js +46 -207
  8. package/components/combobox/demo/index.min.js +46 -207
  9. package/components/combobox/dist/index.js +46 -207
  10. package/components/combobox/dist/registered.js +46 -207
  11. package/components/counter/demo/customize.min.js +45 -206
  12. package/components/counter/demo/index.min.js +45 -206
  13. package/components/counter/dist/index.js +45 -206
  14. package/components/counter/dist/registered.js +45 -206
  15. package/components/datepicker/demo/customize.min.js +48 -208
  16. package/components/datepicker/demo/index.min.js +48 -208
  17. package/components/datepicker/dist/index.js +48 -208
  18. package/components/datepicker/dist/registered.js +48 -208
  19. package/components/dropdown/demo/customize.min.js +44 -205
  20. package/components/dropdown/demo/getting-started.min.js +44 -205
  21. package/components/dropdown/demo/index.min.js +44 -205
  22. package/components/dropdown/dist/index.js +44 -205
  23. package/components/dropdown/dist/registered.js +44 -205
  24. package/components/form/demo/customize.min.js +187 -830
  25. package/components/form/demo/getting-started.min.js +187 -830
  26. package/components/form/demo/index.min.js +187 -830
  27. package/components/form/demo/registerDemoDeps.min.js +187 -830
  28. package/components/input/demo/customize.min.js +1 -1
  29. package/components/input/demo/getting-started.min.js +1 -1
  30. package/components/input/demo/index.min.js +1 -1
  31. package/components/input/dist/index.js +1 -1
  32. package/components/input/dist/registered.js +1 -1
  33. package/components/radio/demo/customize.min.js +1 -1
  34. package/components/radio/demo/getting-started.min.js +1 -1
  35. package/components/radio/demo/index.min.js +1 -1
  36. package/components/radio/dist/index.js +1 -1
  37. package/components/radio/dist/registered.js +1 -1
  38. package/components/select/demo/customize.min.js +45 -206
  39. package/components/select/demo/getting-started.min.js +45 -206
  40. package/components/select/demo/index.min.js +45 -206
  41. package/components/select/dist/index.js +45 -206
  42. package/components/select/dist/registered.js +45 -206
  43. package/custom-elements.json +1525 -1525
  44. package/package.json +2 -2
@@ -13379,7 +13379,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13379
13379
  }
13380
13380
  };
13381
13381
 
13382
- var formkitVersion$8 = '202607091919';
13382
+ var formkitVersion$8 = '202607100029';
13383
13383
 
13384
13384
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13385
13385
  // See LICENSE in the project root for license information.
@@ -27776,7 +27776,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27776
27776
  }
27777
27777
  };
27778
27778
 
27779
- var formkitVersion$2$1 = '202607091919';
27779
+ var formkitVersion$2$1 = '202607100029';
27780
27780
 
27781
27781
  let l$1$2 = 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$2`${s$3(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = 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$2 = 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$3=i$6`: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}
27782
27782
  `,u$4$2=i$6`.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}}
@@ -32053,12 +32053,40 @@ let AuroFloatingUI$3 = class AuroFloatingUI {
32053
32053
  return;
32054
32054
  }
32055
32055
 
32056
+ // Chrome-specific: during popover top-layer promotion after a click on a
32057
+ // slotted focusable, :focus-within can briefly evaluate false while the
32058
+ // active element is still structurally inside the trigger/bib. Fall back
32059
+ // to a shadow-piercing ancestry walk from the deep active element before
32060
+ // treating this as a real focus loss.
32061
+ try {
32062
+ let active = document.activeElement;
32063
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
32064
+ active = active.shadowRoot.activeElement;
32065
+ }
32066
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
32067
+ let node = active;
32068
+ while (node) {
32069
+ if (targets.includes(node)) {
32070
+ return;
32071
+ }
32072
+ node =
32073
+ node.parentElement ||
32074
+ (node.getRootNode && node.getRootNode().host) ||
32075
+ null;
32076
+ }
32077
+ } catch (e) {
32078
+ // Defensive: fall through to the existing close path if traversal fails.
32079
+ }
32080
+
32056
32081
  // if fullscreen bib is in fullscreen mode, do not close
32057
32082
  if (element.bib.hasAttribute("isfullscreen")) {
32058
32083
  return;
32059
32084
  }
32060
32085
 
32061
- this.hideBib("keydown");
32086
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
32087
+ // Escape keydown close. Consumers use this to decide whether to restore
32088
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
32089
+ this.hideBib("focusloss");
32062
32090
  }
32063
32091
 
32064
32092
  setupHideHandlers() {
@@ -32728,199 +32756,6 @@ function getFocusableElements$4(container) {
32728
32756
  return tabIndexedUniqueElements;
32729
32757
  }
32730
32758
 
32731
- /**
32732
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
32733
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
32734
- */
32735
- let FocusTrap$3 = class FocusTrap {
32736
- /**
32737
- * Creates a new FocusTrap instance for the given container element.
32738
- * Initializes event listeners and prepares the container for focus management.
32739
- *
32740
- * @param {HTMLElement} container The DOM element to trap focus within.
32741
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
32742
- * @throws {Error} If the provided container is not a valid HTMLElement.
32743
- */
32744
- constructor(container, controlTabOrder = false) {
32745
- if (!container || !(container instanceof HTMLElement)) {
32746
- throw new Error("FocusTrap requires a valid HTMLElement.");
32747
- }
32748
-
32749
- this.container = container;
32750
- this.tabDirection = "forward"; // or 'backward';
32751
- this.controlTabOrder = controlTabOrder;
32752
-
32753
- this._init();
32754
- }
32755
-
32756
- /**
32757
- * Initializes the focus trap by setting up event listeners and attributes on the container.
32758
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
32759
- *
32760
- * @private
32761
- */
32762
- _init() {
32763
- // Add inert attribute to prevent focusing programmatically as well (if supported)
32764
- if ("inert" in HTMLElement.prototype) {
32765
- this.container.inert = false; // Ensure the container isn't inert
32766
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
32767
- }
32768
-
32769
- // Track tab direction
32770
- this.container.addEventListener("keydown", this._onKeydown);
32771
- }
32772
-
32773
- /**
32774
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
32775
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
32776
- * @private
32777
- */
32778
- _getActiveElements() {
32779
- // Get the active element(s) in the document and shadow root
32780
- // This will include the active element in the shadow DOM if it exists
32781
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
32782
- let { activeElement } = document;
32783
- const actives = [activeElement];
32784
- while (activeElement?.shadowRoot?.activeElement) {
32785
- actives.push(activeElement.shadowRoot.activeElement);
32786
- activeElement = activeElement.shadowRoot.activeElement;
32787
- }
32788
- return actives;
32789
- }
32790
-
32791
- /**
32792
- * Gets the next focus index based on the current index and focusable elements.
32793
- * @param {number} currentIndex The current index of the focused element.
32794
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
32795
- * @returns {number|null} The next focus index or null if not determined.
32796
- */
32797
- _getNextFocusIndex(currentIndex, focusables, actives) {
32798
- if (this.controlTabOrder) {
32799
- // Calculate the new index based on the current index and tab direction
32800
- let newFocusIndex =
32801
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
32802
-
32803
- // Wrap-around logic
32804
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
32805
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
32806
-
32807
- // Early return with the new index
32808
- return newFocusIndex;
32809
- }
32810
-
32811
- // Determine if we need to wrap
32812
- const atFirst =
32813
- actives.includes(focusables[0]) || actives.includes(this.container);
32814
- const atLast = actives.includes(focusables[focusables.length - 1]);
32815
-
32816
- // Only wrap if at the ends
32817
- if (this.tabDirection === "backward" && atFirst) {
32818
- return focusables.length - 1;
32819
- }
32820
-
32821
- if (this.tabDirection === "forward" && atLast) {
32822
- return 0;
32823
- }
32824
-
32825
- // No wrap, so don't change focus, return early
32826
- return null;
32827
- }
32828
-
32829
- /**
32830
- * Handles the Tab key press event to manage focus within the container.
32831
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
32832
- * @returns {void}
32833
- */
32834
- _handleTabKey(e) {
32835
- // Update the focusable elements
32836
- const focusables = this._getFocusableElements();
32837
-
32838
- // If there are no focusable elements, exit
32839
- if (!focusables.length) return;
32840
-
32841
- // Set the tab direction based on the key pressed
32842
- this.tabDirection = e.shiftKey ? "backward" : "forward";
32843
-
32844
- // Get the active elements that are currently focused
32845
- const actives = this._getActiveElements();
32846
-
32847
- // If we're at either end of the focusable elements, wrap around to the other end
32848
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
32849
-
32850
- // Fallback if we have no focused element
32851
- if (focusIndex === -1) focusIndex = 0;
32852
-
32853
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
32854
- // Is null if no new focus index is determined
32855
- const newFocusIndex = this._getNextFocusIndex(
32856
- focusIndex,
32857
- focusables,
32858
- actives,
32859
- );
32860
-
32861
- // If we have a new focus index, set focus to that element
32862
- if (newFocusIndex !== null) {
32863
- e.preventDefault();
32864
- focusables[newFocusIndex].focus();
32865
- }
32866
- }
32867
-
32868
- /**
32869
- * Catches the keydown event
32870
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
32871
- * @private
32872
- */
32873
- _onKeydown = (e) => {
32874
- // Handle tab
32875
- if (e.key === "Tab") this._handleTabKey(e);
32876
- };
32877
-
32878
- /**
32879
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
32880
- * Returns a unique, ordered array of elements that can receive focus.
32881
- *
32882
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
32883
- * @private
32884
- */
32885
- _getFocusableElements() {
32886
- // Use the imported utility function to get focusable elements
32887
- const elements = getFocusableElements$4(this.container);
32888
-
32889
- // Return the elements found
32890
- return elements;
32891
- }
32892
-
32893
- /**
32894
- * Moves focus to the first focusable element within the container.
32895
- * Useful for setting initial focus when activating the focus trap.
32896
- */
32897
- focusFirstElement() {
32898
- const focusables = this._getFocusableElements();
32899
- if (focusables.length) focusables[0].focus();
32900
- }
32901
-
32902
- /**
32903
- * Moves focus to the last focusable element within the container.
32904
- * Useful for setting focus when deactivating or cycling focus in reverse.
32905
- */
32906
- focusLastElement() {
32907
- const focusables = this._getFocusableElements();
32908
- if (focusables.length) focusables[focusables.length - 1].focus();
32909
- }
32910
-
32911
- /**
32912
- * Removes event listeners and attributes added by the focus trap.
32913
- * Call this method to clean up when the focus trap is no longer needed.
32914
- */
32915
- disconnect() {
32916
- if (this.container.hasAttribute("data-focus-trap-container")) {
32917
- this.container.removeAttribute("data-focus-trap-container");
32918
- }
32919
-
32920
- this.container.removeEventListener("keydown", this._onKeydown);
32921
- }
32922
- };
32923
-
32924
32759
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
32925
32760
  // See LICENSE in the project root for license information.
32926
32761
 
@@ -33418,7 +33253,7 @@ let AuroDropdownBib$3 = class AuroDropdownBib extends i$3 {
33418
33253
  classes[`shape-${this.shape}`] = true;
33419
33254
 
33420
33255
  return u$c`
33421
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
33256
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
33422
33257
  ${this.dialogLabel ? u$c`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
33423
33258
  <slot></slot>
33424
33259
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -33669,7 +33504,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
33669
33504
  }
33670
33505
  };
33671
33506
 
33672
- var formkitVersion$1$3 = '202607091919';
33507
+ var formkitVersion$1$3 = '202607100029';
33673
33508
 
33674
33509
  let AuroElement$2$2 = class AuroElement extends i$3 {
33675
33510
  static get properties() {
@@ -34423,7 +34258,10 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
34423
34258
  }
34424
34259
 
34425
34260
 
34426
- if (!this.isPopoverVisible) {
34261
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
34262
+ // — restoring to the trigger would trap the user on this dropdown, forcing
34263
+ // an extra Tab to move on. Escape and outside-click still restore.
34264
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
34427
34265
  // wait til the bib gets fully closed and rendered
34428
34266
  setTimeout(() => {
34429
34267
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -34653,15 +34491,16 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
34653
34491
  }
34654
34492
  });
34655
34493
  } else {
34656
- // Normal desktop: use FocusTrap on the bib element.
34657
- // Defer focusFirstElement to the next frame because the popover
34658
- // is positioned asynchronously by Floating UI — calling focus()
34659
- // synchronously here would target elements with zero dimensions
34660
- // and the focus call would be silently ignored.
34661
- this.focusTrap = new FocusTrap$3(this.bibContent);
34494
+ // Normal desktop (non-modal): move initial focus into the bib but
34495
+ // don't trap Tab. Tab should exit the bib and let the floater's
34496
+ // handleFocusLoss close it, matching native <select>/<details>
34497
+ // behavior. Deferred one frame because Floating UI positions the
34498
+ // popover asynchronously a synchronous focus() would target
34499
+ // zero-dimension elements and be silently ignored.
34662
34500
  requestAnimationFrame(() => {
34663
- if (this.focusTrap) {
34664
- this.focusTrap.focusFirstElement();
34501
+ const focusables = getFocusableElements$4(this.bibContent);
34502
+ if (focusables.length) {
34503
+ focusables[0].focus();
34665
34504
  }
34666
34505
  });
34667
34506
  }
@@ -47287,7 +47126,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
47287
47126
  }
47288
47127
  };
47289
47128
 
47290
- var formkitVersion$7 = '202607091919';
47129
+ var formkitVersion$7 = '202607100029';
47291
47130
 
47292
47131
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
47293
47132
  // See LICENSE in the project root for license information.
@@ -50621,6 +50460,7 @@ class AuroDatePicker extends AuroElement$5 {
50621
50460
  const path = event.composedPath();
50622
50461
  const [initTarget] = path;
50623
50462
  const pathIncludesBib = path.includes(this.dropdown?.bibContent);
50463
+ const triggerIsInert = this.dropdown?.trigger?.inert;
50624
50464
 
50625
50465
  // When desktopModal is open, the datepicker marks the dropdown's #trigger
50626
50466
  // element inert to keep AT and Tab off the input. Inert also blocks pointer
@@ -50631,7 +50471,7 @@ class AuroDatePicker extends AuroElement$5 {
50631
50471
  // and closes the bib. Suppress that misdetection here: if the click lands
50632
50472
  // inside the trigger's bounds and outside the bib, stop propagation before
50633
50473
  // it reaches the window listener.
50634
- if (this.dropdown?.isPopoverVisible && !pathIncludesBib) {
50474
+ if (this.dropdown?.isPopoverVisible && triggerIsInert && !pathIncludesBib) {
50635
50475
  const triggerRect = this.dropdown.trigger?.getBoundingClientRect();
50636
50476
  if (triggerRect &&
50637
50477
  event.clientX >= triggerRect.left && event.clientX <= triggerRect.right &&
@@ -52227,7 +52067,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
52227
52067
  }
52228
52068
  };
52229
52069
 
52230
- var formkitVersion$1$2 = '202607091919';
52070
+ var formkitVersion$1$2 = '202607100029';
52231
52071
 
52232
52072
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
52233
52073
  // See LICENSE in the project root for license information.
@@ -54939,12 +54779,40 @@ let AuroFloatingUI$2 = class AuroFloatingUI {
54939
54779
  return;
54940
54780
  }
54941
54781
 
54782
+ // Chrome-specific: during popover top-layer promotion after a click on a
54783
+ // slotted focusable, :focus-within can briefly evaluate false while the
54784
+ // active element is still structurally inside the trigger/bib. Fall back
54785
+ // to a shadow-piercing ancestry walk from the deep active element before
54786
+ // treating this as a real focus loss.
54787
+ try {
54788
+ let active = document.activeElement;
54789
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
54790
+ active = active.shadowRoot.activeElement;
54791
+ }
54792
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
54793
+ let node = active;
54794
+ while (node) {
54795
+ if (targets.includes(node)) {
54796
+ return;
54797
+ }
54798
+ node =
54799
+ node.parentElement ||
54800
+ (node.getRootNode && node.getRootNode().host) ||
54801
+ null;
54802
+ }
54803
+ } catch (e) {
54804
+ // Defensive: fall through to the existing close path if traversal fails.
54805
+ }
54806
+
54942
54807
  // if fullscreen bib is in fullscreen mode, do not close
54943
54808
  if (element.bib.hasAttribute("isfullscreen")) {
54944
54809
  return;
54945
54810
  }
54946
54811
 
54947
- this.hideBib("keydown");
54812
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
54813
+ // Escape keydown close. Consumers use this to decide whether to restore
54814
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
54815
+ this.hideBib("focusloss");
54948
54816
  }
54949
54817
 
54950
54818
  setupHideHandlers() {
@@ -55614,199 +55482,6 @@ function getFocusableElements$3(container) {
55614
55482
  return tabIndexedUniqueElements;
55615
55483
  }
55616
55484
 
55617
- /**
55618
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
55619
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
55620
- */
55621
- let FocusTrap$2 = class FocusTrap {
55622
- /**
55623
- * Creates a new FocusTrap instance for the given container element.
55624
- * Initializes event listeners and prepares the container for focus management.
55625
- *
55626
- * @param {HTMLElement} container The DOM element to trap focus within.
55627
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
55628
- * @throws {Error} If the provided container is not a valid HTMLElement.
55629
- */
55630
- constructor(container, controlTabOrder = false) {
55631
- if (!container || !(container instanceof HTMLElement)) {
55632
- throw new Error("FocusTrap requires a valid HTMLElement.");
55633
- }
55634
-
55635
- this.container = container;
55636
- this.tabDirection = "forward"; // or 'backward';
55637
- this.controlTabOrder = controlTabOrder;
55638
-
55639
- this._init();
55640
- }
55641
-
55642
- /**
55643
- * Initializes the focus trap by setting up event listeners and attributes on the container.
55644
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
55645
- *
55646
- * @private
55647
- */
55648
- _init() {
55649
- // Add inert attribute to prevent focusing programmatically as well (if supported)
55650
- if ("inert" in HTMLElement.prototype) {
55651
- this.container.inert = false; // Ensure the container isn't inert
55652
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
55653
- }
55654
-
55655
- // Track tab direction
55656
- this.container.addEventListener("keydown", this._onKeydown);
55657
- }
55658
-
55659
- /**
55660
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
55661
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
55662
- * @private
55663
- */
55664
- _getActiveElements() {
55665
- // Get the active element(s) in the document and shadow root
55666
- // This will include the active element in the shadow DOM if it exists
55667
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
55668
- let { activeElement } = document;
55669
- const actives = [activeElement];
55670
- while (activeElement?.shadowRoot?.activeElement) {
55671
- actives.push(activeElement.shadowRoot.activeElement);
55672
- activeElement = activeElement.shadowRoot.activeElement;
55673
- }
55674
- return actives;
55675
- }
55676
-
55677
- /**
55678
- * Gets the next focus index based on the current index and focusable elements.
55679
- * @param {number} currentIndex The current index of the focused element.
55680
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
55681
- * @returns {number|null} The next focus index or null if not determined.
55682
- */
55683
- _getNextFocusIndex(currentIndex, focusables, actives) {
55684
- if (this.controlTabOrder) {
55685
- // Calculate the new index based on the current index and tab direction
55686
- let newFocusIndex =
55687
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
55688
-
55689
- // Wrap-around logic
55690
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
55691
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
55692
-
55693
- // Early return with the new index
55694
- return newFocusIndex;
55695
- }
55696
-
55697
- // Determine if we need to wrap
55698
- const atFirst =
55699
- actives.includes(focusables[0]) || actives.includes(this.container);
55700
- const atLast = actives.includes(focusables[focusables.length - 1]);
55701
-
55702
- // Only wrap if at the ends
55703
- if (this.tabDirection === "backward" && atFirst) {
55704
- return focusables.length - 1;
55705
- }
55706
-
55707
- if (this.tabDirection === "forward" && atLast) {
55708
- return 0;
55709
- }
55710
-
55711
- // No wrap, so don't change focus, return early
55712
- return null;
55713
- }
55714
-
55715
- /**
55716
- * Handles the Tab key press event to manage focus within the container.
55717
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
55718
- * @returns {void}
55719
- */
55720
- _handleTabKey(e) {
55721
- // Update the focusable elements
55722
- const focusables = this._getFocusableElements();
55723
-
55724
- // If there are no focusable elements, exit
55725
- if (!focusables.length) return;
55726
-
55727
- // Set the tab direction based on the key pressed
55728
- this.tabDirection = e.shiftKey ? "backward" : "forward";
55729
-
55730
- // Get the active elements that are currently focused
55731
- const actives = this._getActiveElements();
55732
-
55733
- // If we're at either end of the focusable elements, wrap around to the other end
55734
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
55735
-
55736
- // Fallback if we have no focused element
55737
- if (focusIndex === -1) focusIndex = 0;
55738
-
55739
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
55740
- // Is null if no new focus index is determined
55741
- const newFocusIndex = this._getNextFocusIndex(
55742
- focusIndex,
55743
- focusables,
55744
- actives,
55745
- );
55746
-
55747
- // If we have a new focus index, set focus to that element
55748
- if (newFocusIndex !== null) {
55749
- e.preventDefault();
55750
- focusables[newFocusIndex].focus();
55751
- }
55752
- }
55753
-
55754
- /**
55755
- * Catches the keydown event
55756
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
55757
- * @private
55758
- */
55759
- _onKeydown = (e) => {
55760
- // Handle tab
55761
- if (e.key === "Tab") this._handleTabKey(e);
55762
- };
55763
-
55764
- /**
55765
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
55766
- * Returns a unique, ordered array of elements that can receive focus.
55767
- *
55768
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
55769
- * @private
55770
- */
55771
- _getFocusableElements() {
55772
- // Use the imported utility function to get focusable elements
55773
- const elements = getFocusableElements$3(this.container);
55774
-
55775
- // Return the elements found
55776
- return elements;
55777
- }
55778
-
55779
- /**
55780
- * Moves focus to the first focusable element within the container.
55781
- * Useful for setting initial focus when activating the focus trap.
55782
- */
55783
- focusFirstElement() {
55784
- const focusables = this._getFocusableElements();
55785
- if (focusables.length) focusables[0].focus();
55786
- }
55787
-
55788
- /**
55789
- * Moves focus to the last focusable element within the container.
55790
- * Useful for setting focus when deactivating or cycling focus in reverse.
55791
- */
55792
- focusLastElement() {
55793
- const focusables = this._getFocusableElements();
55794
- if (focusables.length) focusables[focusables.length - 1].focus();
55795
- }
55796
-
55797
- /**
55798
- * Removes event listeners and attributes added by the focus trap.
55799
- * Call this method to clean up when the focus trap is no longer needed.
55800
- */
55801
- disconnect() {
55802
- if (this.container.hasAttribute("data-focus-trap-container")) {
55803
- this.container.removeAttribute("data-focus-trap-container");
55804
- }
55805
-
55806
- this.container.removeEventListener("keydown", this._onKeydown);
55807
- }
55808
- };
55809
-
55810
55485
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
55811
55486
  // See LICENSE in the project root for license information.
55812
55487
 
@@ -56304,7 +55979,7 @@ let AuroDropdownBib$2 = class AuroDropdownBib extends i$3 {
56304
55979
  classes[`shape-${this.shape}`] = true;
56305
55980
 
56306
55981
  return u$c`
56307
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
55982
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
56308
55983
  ${this.dialogLabel ? u$c`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
56309
55984
  <slot></slot>
56310
55985
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -56555,7 +56230,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
56555
56230
  }
56556
56231
  };
56557
56232
 
56558
- var formkitVersion$6 = '202607091919';
56233
+ var formkitVersion$6 = '202607100029';
56559
56234
 
56560
56235
  let AuroElement$1$2 = class AuroElement extends i$3 {
56561
56236
  static get properties() {
@@ -57309,7 +56984,10 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
57309
56984
  }
57310
56985
 
57311
56986
 
57312
- if (!this.isPopoverVisible) {
56987
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
56988
+ // — restoring to the trigger would trap the user on this dropdown, forcing
56989
+ // an extra Tab to move on. Escape and outside-click still restore.
56990
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
57313
56991
  // wait til the bib gets fully closed and rendered
57314
56992
  setTimeout(() => {
57315
56993
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -57539,15 +57217,16 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
57539
57217
  }
57540
57218
  });
57541
57219
  } else {
57542
- // Normal desktop: use FocusTrap on the bib element.
57543
- // Defer focusFirstElement to the next frame because the popover
57544
- // is positioned asynchronously by Floating UI — calling focus()
57545
- // synchronously here would target elements with zero dimensions
57546
- // and the focus call would be silently ignored.
57547
- this.focusTrap = new FocusTrap$2(this.bibContent);
57220
+ // Normal desktop (non-modal): move initial focus into the bib but
57221
+ // don't trap Tab. Tab should exit the bib and let the floater's
57222
+ // handleFocusLoss close it, matching native <select>/<details>
57223
+ // behavior. Deferred one frame because Floating UI positions the
57224
+ // popover asynchronously a synchronous focus() would target
57225
+ // zero-dimension elements and be silently ignored.
57548
57226
  requestAnimationFrame(() => {
57549
- if (this.focusTrap) {
57550
- this.focusTrap.focusFirstElement();
57227
+ const focusables = getFocusableElements$3(this.bibContent);
57228
+ if (focusables.length) {
57229
+ focusables[0].focus();
57551
57230
  }
57552
57231
  });
57553
57232
  }
@@ -60535,7 +60214,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
60535
60214
  }
60536
60215
  };
60537
60216
 
60538
- var formkitVersion$5 = '202607091919';
60217
+ var formkitVersion$5 = '202607100029';
60539
60218
 
60540
60219
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
60541
60220
  // See LICENSE in the project root for license information.
@@ -62300,7 +61979,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
62300
61979
  }
62301
61980
  };
62302
61981
 
62303
- var formkitVersion$4 = '202607091919';
61982
+ var formkitVersion$4 = '202607100029';
62304
61983
 
62305
61984
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
62306
61985
  // See LICENSE in the project root for license information.
@@ -66162,12 +65841,40 @@ let AuroFloatingUI$1 = class AuroFloatingUI {
66162
65841
  return;
66163
65842
  }
66164
65843
 
65844
+ // Chrome-specific: during popover top-layer promotion after a click on a
65845
+ // slotted focusable, :focus-within can briefly evaluate false while the
65846
+ // active element is still structurally inside the trigger/bib. Fall back
65847
+ // to a shadow-piercing ancestry walk from the deep active element before
65848
+ // treating this as a real focus loss.
65849
+ try {
65850
+ let active = document.activeElement;
65851
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
65852
+ active = active.shadowRoot.activeElement;
65853
+ }
65854
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
65855
+ let node = active;
65856
+ while (node) {
65857
+ if (targets.includes(node)) {
65858
+ return;
65859
+ }
65860
+ node =
65861
+ node.parentElement ||
65862
+ (node.getRootNode && node.getRootNode().host) ||
65863
+ null;
65864
+ }
65865
+ } catch (e) {
65866
+ // Defensive: fall through to the existing close path if traversal fails.
65867
+ }
65868
+
66165
65869
  // if fullscreen bib is in fullscreen mode, do not close
66166
65870
  if (element.bib.hasAttribute("isfullscreen")) {
66167
65871
  return;
66168
65872
  }
66169
65873
 
66170
- this.hideBib("keydown");
65874
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
65875
+ // Escape keydown close. Consumers use this to decide whether to restore
65876
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
65877
+ this.hideBib("focusloss");
66171
65878
  }
66172
65879
 
66173
65880
  setupHideHandlers() {
@@ -66837,199 +66544,6 @@ function getFocusableElements$2(container) {
66837
66544
  return tabIndexedUniqueElements;
66838
66545
  }
66839
66546
 
66840
- /**
66841
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
66842
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
66843
- */
66844
- let FocusTrap$1 = class FocusTrap {
66845
- /**
66846
- * Creates a new FocusTrap instance for the given container element.
66847
- * Initializes event listeners and prepares the container for focus management.
66848
- *
66849
- * @param {HTMLElement} container The DOM element to trap focus within.
66850
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
66851
- * @throws {Error} If the provided container is not a valid HTMLElement.
66852
- */
66853
- constructor(container, controlTabOrder = false) {
66854
- if (!container || !(container instanceof HTMLElement)) {
66855
- throw new Error("FocusTrap requires a valid HTMLElement.");
66856
- }
66857
-
66858
- this.container = container;
66859
- this.tabDirection = "forward"; // or 'backward';
66860
- this.controlTabOrder = controlTabOrder;
66861
-
66862
- this._init();
66863
- }
66864
-
66865
- /**
66866
- * Initializes the focus trap by setting up event listeners and attributes on the container.
66867
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
66868
- *
66869
- * @private
66870
- */
66871
- _init() {
66872
- // Add inert attribute to prevent focusing programmatically as well (if supported)
66873
- if ("inert" in HTMLElement.prototype) {
66874
- this.container.inert = false; // Ensure the container isn't inert
66875
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
66876
- }
66877
-
66878
- // Track tab direction
66879
- this.container.addEventListener("keydown", this._onKeydown);
66880
- }
66881
-
66882
- /**
66883
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
66884
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
66885
- * @private
66886
- */
66887
- _getActiveElements() {
66888
- // Get the active element(s) in the document and shadow root
66889
- // This will include the active element in the shadow DOM if it exists
66890
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
66891
- let { activeElement } = document;
66892
- const actives = [activeElement];
66893
- while (activeElement?.shadowRoot?.activeElement) {
66894
- actives.push(activeElement.shadowRoot.activeElement);
66895
- activeElement = activeElement.shadowRoot.activeElement;
66896
- }
66897
- return actives;
66898
- }
66899
-
66900
- /**
66901
- * Gets the next focus index based on the current index and focusable elements.
66902
- * @param {number} currentIndex The current index of the focused element.
66903
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
66904
- * @returns {number|null} The next focus index or null if not determined.
66905
- */
66906
- _getNextFocusIndex(currentIndex, focusables, actives) {
66907
- if (this.controlTabOrder) {
66908
- // Calculate the new index based on the current index and tab direction
66909
- let newFocusIndex =
66910
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
66911
-
66912
- // Wrap-around logic
66913
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
66914
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
66915
-
66916
- // Early return with the new index
66917
- return newFocusIndex;
66918
- }
66919
-
66920
- // Determine if we need to wrap
66921
- const atFirst =
66922
- actives.includes(focusables[0]) || actives.includes(this.container);
66923
- const atLast = actives.includes(focusables[focusables.length - 1]);
66924
-
66925
- // Only wrap if at the ends
66926
- if (this.tabDirection === "backward" && atFirst) {
66927
- return focusables.length - 1;
66928
- }
66929
-
66930
- if (this.tabDirection === "forward" && atLast) {
66931
- return 0;
66932
- }
66933
-
66934
- // No wrap, so don't change focus, return early
66935
- return null;
66936
- }
66937
-
66938
- /**
66939
- * Handles the Tab key press event to manage focus within the container.
66940
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
66941
- * @returns {void}
66942
- */
66943
- _handleTabKey(e) {
66944
- // Update the focusable elements
66945
- const focusables = this._getFocusableElements();
66946
-
66947
- // If there are no focusable elements, exit
66948
- if (!focusables.length) return;
66949
-
66950
- // Set the tab direction based on the key pressed
66951
- this.tabDirection = e.shiftKey ? "backward" : "forward";
66952
-
66953
- // Get the active elements that are currently focused
66954
- const actives = this._getActiveElements();
66955
-
66956
- // If we're at either end of the focusable elements, wrap around to the other end
66957
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
66958
-
66959
- // Fallback if we have no focused element
66960
- if (focusIndex === -1) focusIndex = 0;
66961
-
66962
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
66963
- // Is null if no new focus index is determined
66964
- const newFocusIndex = this._getNextFocusIndex(
66965
- focusIndex,
66966
- focusables,
66967
- actives,
66968
- );
66969
-
66970
- // If we have a new focus index, set focus to that element
66971
- if (newFocusIndex !== null) {
66972
- e.preventDefault();
66973
- focusables[newFocusIndex].focus();
66974
- }
66975
- }
66976
-
66977
- /**
66978
- * Catches the keydown event
66979
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
66980
- * @private
66981
- */
66982
- _onKeydown = (e) => {
66983
- // Handle tab
66984
- if (e.key === "Tab") this._handleTabKey(e);
66985
- };
66986
-
66987
- /**
66988
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
66989
- * Returns a unique, ordered array of elements that can receive focus.
66990
- *
66991
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
66992
- * @private
66993
- */
66994
- _getFocusableElements() {
66995
- // Use the imported utility function to get focusable elements
66996
- const elements = getFocusableElements$2(this.container);
66997
-
66998
- // Return the elements found
66999
- return elements;
67000
- }
67001
-
67002
- /**
67003
- * Moves focus to the first focusable element within the container.
67004
- * Useful for setting initial focus when activating the focus trap.
67005
- */
67006
- focusFirstElement() {
67007
- const focusables = this._getFocusableElements();
67008
- if (focusables.length) focusables[0].focus();
67009
- }
67010
-
67011
- /**
67012
- * Moves focus to the last focusable element within the container.
67013
- * Useful for setting focus when deactivating or cycling focus in reverse.
67014
- */
67015
- focusLastElement() {
67016
- const focusables = this._getFocusableElements();
67017
- if (focusables.length) focusables[focusables.length - 1].focus();
67018
- }
67019
-
67020
- /**
67021
- * Removes event listeners and attributes added by the focus trap.
67022
- * Call this method to clean up when the focus trap is no longer needed.
67023
- */
67024
- disconnect() {
67025
- if (this.container.hasAttribute("data-focus-trap-container")) {
67026
- this.container.removeAttribute("data-focus-trap-container");
67027
- }
67028
-
67029
- this.container.removeEventListener("keydown", this._onKeydown);
67030
- }
67031
- };
67032
-
67033
66547
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
67034
66548
  // See LICENSE in the project root for license information.
67035
66549
 
@@ -67527,7 +67041,7 @@ let AuroDropdownBib$1 = class AuroDropdownBib extends i$3 {
67527
67041
  classes[`shape-${this.shape}`] = true;
67528
67042
 
67529
67043
  return u$c`
67530
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
67044
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
67531
67045
  ${this.dialogLabel ? u$c`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
67532
67046
  <slot></slot>
67533
67047
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -67778,7 +67292,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
67778
67292
  }
67779
67293
  };
67780
67294
 
67781
- var formkitVersion$2 = '202607091919';
67295
+ var formkitVersion$2 = '202607100029';
67782
67296
 
67783
67297
  let AuroElement$2$1 = class AuroElement extends i$3 {
67784
67298
  static get properties() {
@@ -68532,7 +68046,10 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
68532
68046
  }
68533
68047
 
68534
68048
 
68535
- if (!this.isPopoverVisible) {
68049
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
68050
+ // — restoring to the trigger would trap the user on this dropdown, forcing
68051
+ // an extra Tab to move on. Escape and outside-click still restore.
68052
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
68536
68053
  // wait til the bib gets fully closed and rendered
68537
68054
  setTimeout(() => {
68538
68055
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -68762,15 +68279,16 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
68762
68279
  }
68763
68280
  });
68764
68281
  } else {
68765
- // Normal desktop: use FocusTrap on the bib element.
68766
- // Defer focusFirstElement to the next frame because the popover
68767
- // is positioned asynchronously by Floating UI — calling focus()
68768
- // synchronously here would target elements with zero dimensions
68769
- // and the focus call would be silently ignored.
68770
- this.focusTrap = new FocusTrap$1(this.bibContent);
68282
+ // Normal desktop (non-modal): move initial focus into the bib but
68283
+ // don't trap Tab. Tab should exit the bib and let the floater's
68284
+ // handleFocusLoss close it, matching native <select>/<details>
68285
+ // behavior. Deferred one frame because Floating UI positions the
68286
+ // popover asynchronously a synchronous focus() would target
68287
+ // zero-dimension elements and be silently ignored.
68771
68288
  requestAnimationFrame(() => {
68772
- if (this.focusTrap) {
68773
- this.focusTrap.focusFirstElement();
68289
+ const focusables = getFocusableElements$2(this.bibContent);
68290
+ if (focusables.length) {
68291
+ focusables[0].focus();
68774
68292
  }
68775
68293
  });
68776
68294
  }
@@ -81396,7 +80914,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
81396
80914
  }
81397
80915
  };
81398
80916
 
81399
- var formkitVersion$1$1 = '202607091919';
80917
+ var formkitVersion$1$1 = '202607100029';
81400
80918
 
81401
80919
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
81402
80920
  // See LICENSE in the project root for license information.
@@ -82517,7 +82035,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
82517
82035
  }
82518
82036
  };
82519
82037
 
82520
- var formkitVersion$3 = '202607091919';
82038
+ var formkitVersion$3 = '202607100029';
82521
82039
 
82522
82040
  var styleCss$1$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}`;
82523
82041
 
@@ -89887,12 +89405,40 @@ class AuroFloatingUI {
89887
89405
  return;
89888
89406
  }
89889
89407
 
89408
+ // Chrome-specific: during popover top-layer promotion after a click on a
89409
+ // slotted focusable, :focus-within can briefly evaluate false while the
89410
+ // active element is still structurally inside the trigger/bib. Fall back
89411
+ // to a shadow-piercing ancestry walk from the deep active element before
89412
+ // treating this as a real focus loss.
89413
+ try {
89414
+ let active = document.activeElement;
89415
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
89416
+ active = active.shadowRoot.activeElement;
89417
+ }
89418
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
89419
+ let node = active;
89420
+ while (node) {
89421
+ if (targets.includes(node)) {
89422
+ return;
89423
+ }
89424
+ node =
89425
+ node.parentElement ||
89426
+ (node.getRootNode && node.getRootNode().host) ||
89427
+ null;
89428
+ }
89429
+ } catch (e) {
89430
+ // Defensive: fall through to the existing close path if traversal fails.
89431
+ }
89432
+
89890
89433
  // if fullscreen bib is in fullscreen mode, do not close
89891
89434
  if (element.bib.hasAttribute("isfullscreen")) {
89892
89435
  return;
89893
89436
  }
89894
89437
 
89895
- this.hideBib("keydown");
89438
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
89439
+ // Escape keydown close. Consumers use this to decide whether to restore
89440
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
89441
+ this.hideBib("focusloss");
89896
89442
  }
89897
89443
 
89898
89444
  setupHideHandlers() {
@@ -90562,199 +90108,6 @@ function getFocusableElements(container) {
90562
90108
  return tabIndexedUniqueElements;
90563
90109
  }
90564
90110
 
90565
- /**
90566
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
90567
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
90568
- */
90569
- class FocusTrap {
90570
- /**
90571
- * Creates a new FocusTrap instance for the given container element.
90572
- * Initializes event listeners and prepares the container for focus management.
90573
- *
90574
- * @param {HTMLElement} container The DOM element to trap focus within.
90575
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
90576
- * @throws {Error} If the provided container is not a valid HTMLElement.
90577
- */
90578
- constructor(container, controlTabOrder = false) {
90579
- if (!container || !(container instanceof HTMLElement)) {
90580
- throw new Error("FocusTrap requires a valid HTMLElement.");
90581
- }
90582
-
90583
- this.container = container;
90584
- this.tabDirection = "forward"; // or 'backward';
90585
- this.controlTabOrder = controlTabOrder;
90586
-
90587
- this._init();
90588
- }
90589
-
90590
- /**
90591
- * Initializes the focus trap by setting up event listeners and attributes on the container.
90592
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
90593
- *
90594
- * @private
90595
- */
90596
- _init() {
90597
- // Add inert attribute to prevent focusing programmatically as well (if supported)
90598
- if ("inert" in HTMLElement.prototype) {
90599
- this.container.inert = false; // Ensure the container isn't inert
90600
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
90601
- }
90602
-
90603
- // Track tab direction
90604
- this.container.addEventListener("keydown", this._onKeydown);
90605
- }
90606
-
90607
- /**
90608
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
90609
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
90610
- * @private
90611
- */
90612
- _getActiveElements() {
90613
- // Get the active element(s) in the document and shadow root
90614
- // This will include the active element in the shadow DOM if it exists
90615
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
90616
- let { activeElement } = document;
90617
- const actives = [activeElement];
90618
- while (activeElement?.shadowRoot?.activeElement) {
90619
- actives.push(activeElement.shadowRoot.activeElement);
90620
- activeElement = activeElement.shadowRoot.activeElement;
90621
- }
90622
- return actives;
90623
- }
90624
-
90625
- /**
90626
- * Gets the next focus index based on the current index and focusable elements.
90627
- * @param {number} currentIndex The current index of the focused element.
90628
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
90629
- * @returns {number|null} The next focus index or null if not determined.
90630
- */
90631
- _getNextFocusIndex(currentIndex, focusables, actives) {
90632
- if (this.controlTabOrder) {
90633
- // Calculate the new index based on the current index and tab direction
90634
- let newFocusIndex =
90635
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
90636
-
90637
- // Wrap-around logic
90638
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
90639
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
90640
-
90641
- // Early return with the new index
90642
- return newFocusIndex;
90643
- }
90644
-
90645
- // Determine if we need to wrap
90646
- const atFirst =
90647
- actives.includes(focusables[0]) || actives.includes(this.container);
90648
- const atLast = actives.includes(focusables[focusables.length - 1]);
90649
-
90650
- // Only wrap if at the ends
90651
- if (this.tabDirection === "backward" && atFirst) {
90652
- return focusables.length - 1;
90653
- }
90654
-
90655
- if (this.tabDirection === "forward" && atLast) {
90656
- return 0;
90657
- }
90658
-
90659
- // No wrap, so don't change focus, return early
90660
- return null;
90661
- }
90662
-
90663
- /**
90664
- * Handles the Tab key press event to manage focus within the container.
90665
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
90666
- * @returns {void}
90667
- */
90668
- _handleTabKey(e) {
90669
- // Update the focusable elements
90670
- const focusables = this._getFocusableElements();
90671
-
90672
- // If there are no focusable elements, exit
90673
- if (!focusables.length) return;
90674
-
90675
- // Set the tab direction based on the key pressed
90676
- this.tabDirection = e.shiftKey ? "backward" : "forward";
90677
-
90678
- // Get the active elements that are currently focused
90679
- const actives = this._getActiveElements();
90680
-
90681
- // If we're at either end of the focusable elements, wrap around to the other end
90682
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
90683
-
90684
- // Fallback if we have no focused element
90685
- if (focusIndex === -1) focusIndex = 0;
90686
-
90687
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
90688
- // Is null if no new focus index is determined
90689
- const newFocusIndex = this._getNextFocusIndex(
90690
- focusIndex,
90691
- focusables,
90692
- actives,
90693
- );
90694
-
90695
- // If we have a new focus index, set focus to that element
90696
- if (newFocusIndex !== null) {
90697
- e.preventDefault();
90698
- focusables[newFocusIndex].focus();
90699
- }
90700
- }
90701
-
90702
- /**
90703
- * Catches the keydown event
90704
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
90705
- * @private
90706
- */
90707
- _onKeydown = (e) => {
90708
- // Handle tab
90709
- if (e.key === "Tab") this._handleTabKey(e);
90710
- };
90711
-
90712
- /**
90713
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
90714
- * Returns a unique, ordered array of elements that can receive focus.
90715
- *
90716
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
90717
- * @private
90718
- */
90719
- _getFocusableElements() {
90720
- // Use the imported utility function to get focusable elements
90721
- const elements = getFocusableElements(this.container);
90722
-
90723
- // Return the elements found
90724
- return elements;
90725
- }
90726
-
90727
- /**
90728
- * Moves focus to the first focusable element within the container.
90729
- * Useful for setting initial focus when activating the focus trap.
90730
- */
90731
- focusFirstElement() {
90732
- const focusables = this._getFocusableElements();
90733
- if (focusables.length) focusables[0].focus();
90734
- }
90735
-
90736
- /**
90737
- * Moves focus to the last focusable element within the container.
90738
- * Useful for setting focus when deactivating or cycling focus in reverse.
90739
- */
90740
- focusLastElement() {
90741
- const focusables = this._getFocusableElements();
90742
- if (focusables.length) focusables[focusables.length - 1].focus();
90743
- }
90744
-
90745
- /**
90746
- * Removes event listeners and attributes added by the focus trap.
90747
- * Call this method to clean up when the focus trap is no longer needed.
90748
- */
90749
- disconnect() {
90750
- if (this.container.hasAttribute("data-focus-trap-container")) {
90751
- this.container.removeAttribute("data-focus-trap-container");
90752
- }
90753
-
90754
- this.container.removeEventListener("keydown", this._onKeydown);
90755
- }
90756
- }
90757
-
90758
90111
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
90759
90112
  // See LICENSE in the project root for license information.
90760
90113
 
@@ -91252,7 +90605,7 @@ class AuroDropdownBib extends i$3 {
91252
90605
  classes[`shape-${this.shape}`] = true;
91253
90606
 
91254
90607
  return u$c`
91255
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
90608
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
91256
90609
  ${this.dialogLabel ? u$c`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
91257
90610
  <slot></slot>
91258
90611
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -91503,7 +90856,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
91503
90856
  }
91504
90857
  };
91505
90858
 
91506
- var formkitVersion$1 = '202607091919';
90859
+ var formkitVersion$1 = '202607100029';
91507
90860
 
91508
90861
  class AuroElement extends i$3 {
91509
90862
  static get properties() {
@@ -92257,7 +91610,10 @@ class AuroDropdown extends AuroElement {
92257
91610
  }
92258
91611
 
92259
91612
 
92260
- if (!this.isPopoverVisible) {
91613
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
91614
+ // — restoring to the trigger would trap the user on this dropdown, forcing
91615
+ // an extra Tab to move on. Escape and outside-click still restore.
91616
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
92261
91617
  // wait til the bib gets fully closed and rendered
92262
91618
  setTimeout(() => {
92263
91619
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -92487,15 +91843,16 @@ class AuroDropdown extends AuroElement {
92487
91843
  }
92488
91844
  });
92489
91845
  } else {
92490
- // Normal desktop: use FocusTrap on the bib element.
92491
- // Defer focusFirstElement to the next frame because the popover
92492
- // is positioned asynchronously by Floating UI — calling focus()
92493
- // synchronously here would target elements with zero dimensions
92494
- // and the focus call would be silently ignored.
92495
- this.focusTrap = new FocusTrap(this.bibContent);
91846
+ // Normal desktop (non-modal): move initial focus into the bib but
91847
+ // don't trap Tab. Tab should exit the bib and let the floater's
91848
+ // handleFocusLoss close it, matching native <select>/<details>
91849
+ // behavior. Deferred one frame because Floating UI positions the
91850
+ // popover asynchronously a synchronous focus() would target
91851
+ // zero-dimension elements and be silently ignored.
92496
91852
  requestAnimationFrame(() => {
92497
- if (this.focusTrap) {
92498
- this.focusTrap.focusFirstElement();
91853
+ const focusables = getFocusableElements(this.bibContent);
91854
+ if (focusables.length) {
91855
+ focusables[0].focus();
92499
91856
  }
92500
91857
  });
92501
91858
  }
@@ -93542,7 +92899,7 @@ class AuroHelpText extends i$3 {
93542
92899
  }
93543
92900
  }
93544
92901
 
93545
- var formkitVersion = '202607091919';
92902
+ var formkitVersion = '202607100029';
93546
92903
 
93547
92904
  var styleCss = 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}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );line-height:var(--wcss-body-2xs-emphasized-line-height, 0.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, 300);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, 300);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, 0.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, 0.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, 0.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, 0.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, 0.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, 0.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(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
93548
92905