@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
@@ -12338,7 +12338,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12338
12338
  }
12339
12339
  };
12340
12340
 
12341
- var formkitVersion$8 = '202607091919';
12341
+ var formkitVersion$8 = '202607100029';
12342
12342
 
12343
12343
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12344
12344
  // See LICENSE in the project root for license information.
@@ -26735,7 +26735,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26735
26735
  }
26736
26736
  };
26737
26737
 
26738
- var formkitVersion$2$1 = '202607091919';
26738
+ var formkitVersion$2$1 = '202607100029';
26739
26739
 
26740
26740
  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$5`${s$5(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$4`: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}
26741
26741
  `,u$4$2=i$4`.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}}
@@ -31012,12 +31012,40 @@ let AuroFloatingUI$3 = class AuroFloatingUI {
31012
31012
  return;
31013
31013
  }
31014
31014
 
31015
+ // Chrome-specific: during popover top-layer promotion after a click on a
31016
+ // slotted focusable, :focus-within can briefly evaluate false while the
31017
+ // active element is still structurally inside the trigger/bib. Fall back
31018
+ // to a shadow-piercing ancestry walk from the deep active element before
31019
+ // treating this as a real focus loss.
31020
+ try {
31021
+ let active = document.activeElement;
31022
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
31023
+ active = active.shadowRoot.activeElement;
31024
+ }
31025
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
31026
+ let node = active;
31027
+ while (node) {
31028
+ if (targets.includes(node)) {
31029
+ return;
31030
+ }
31031
+ node =
31032
+ node.parentElement ||
31033
+ (node.getRootNode && node.getRootNode().host) ||
31034
+ null;
31035
+ }
31036
+ } catch (e) {
31037
+ // Defensive: fall through to the existing close path if traversal fails.
31038
+ }
31039
+
31015
31040
  // if fullscreen bib is in fullscreen mode, do not close
31016
31041
  if (element.bib.hasAttribute("isfullscreen")) {
31017
31042
  return;
31018
31043
  }
31019
31044
 
31020
- this.hideBib("keydown");
31045
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
31046
+ // Escape keydown close. Consumers use this to decide whether to restore
31047
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
31048
+ this.hideBib("focusloss");
31021
31049
  }
31022
31050
 
31023
31051
  setupHideHandlers() {
@@ -31687,199 +31715,6 @@ function getFocusableElements$4(container) {
31687
31715
  return tabIndexedUniqueElements;
31688
31716
  }
31689
31717
 
31690
- /**
31691
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
31692
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
31693
- */
31694
- let FocusTrap$3 = class FocusTrap {
31695
- /**
31696
- * Creates a new FocusTrap instance for the given container element.
31697
- * Initializes event listeners and prepares the container for focus management.
31698
- *
31699
- * @param {HTMLElement} container The DOM element to trap focus within.
31700
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
31701
- * @throws {Error} If the provided container is not a valid HTMLElement.
31702
- */
31703
- constructor(container, controlTabOrder = false) {
31704
- if (!container || !(container instanceof HTMLElement)) {
31705
- throw new Error("FocusTrap requires a valid HTMLElement.");
31706
- }
31707
-
31708
- this.container = container;
31709
- this.tabDirection = "forward"; // or 'backward';
31710
- this.controlTabOrder = controlTabOrder;
31711
-
31712
- this._init();
31713
- }
31714
-
31715
- /**
31716
- * Initializes the focus trap by setting up event listeners and attributes on the container.
31717
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
31718
- *
31719
- * @private
31720
- */
31721
- _init() {
31722
- // Add inert attribute to prevent focusing programmatically as well (if supported)
31723
- if ("inert" in HTMLElement.prototype) {
31724
- this.container.inert = false; // Ensure the container isn't inert
31725
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
31726
- }
31727
-
31728
- // Track tab direction
31729
- this.container.addEventListener("keydown", this._onKeydown);
31730
- }
31731
-
31732
- /**
31733
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
31734
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
31735
- * @private
31736
- */
31737
- _getActiveElements() {
31738
- // Get the active element(s) in the document and shadow root
31739
- // This will include the active element in the shadow DOM if it exists
31740
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
31741
- let { activeElement } = document;
31742
- const actives = [activeElement];
31743
- while (activeElement?.shadowRoot?.activeElement) {
31744
- actives.push(activeElement.shadowRoot.activeElement);
31745
- activeElement = activeElement.shadowRoot.activeElement;
31746
- }
31747
- return actives;
31748
- }
31749
-
31750
- /**
31751
- * Gets the next focus index based on the current index and focusable elements.
31752
- * @param {number} currentIndex The current index of the focused element.
31753
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
31754
- * @returns {number|null} The next focus index or null if not determined.
31755
- */
31756
- _getNextFocusIndex(currentIndex, focusables, actives) {
31757
- if (this.controlTabOrder) {
31758
- // Calculate the new index based on the current index and tab direction
31759
- let newFocusIndex =
31760
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
31761
-
31762
- // Wrap-around logic
31763
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
31764
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
31765
-
31766
- // Early return with the new index
31767
- return newFocusIndex;
31768
- }
31769
-
31770
- // Determine if we need to wrap
31771
- const atFirst =
31772
- actives.includes(focusables[0]) || actives.includes(this.container);
31773
- const atLast = actives.includes(focusables[focusables.length - 1]);
31774
-
31775
- // Only wrap if at the ends
31776
- if (this.tabDirection === "backward" && atFirst) {
31777
- return focusables.length - 1;
31778
- }
31779
-
31780
- if (this.tabDirection === "forward" && atLast) {
31781
- return 0;
31782
- }
31783
-
31784
- // No wrap, so don't change focus, return early
31785
- return null;
31786
- }
31787
-
31788
- /**
31789
- * Handles the Tab key press event to manage focus within the container.
31790
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
31791
- * @returns {void}
31792
- */
31793
- _handleTabKey(e) {
31794
- // Update the focusable elements
31795
- const focusables = this._getFocusableElements();
31796
-
31797
- // If there are no focusable elements, exit
31798
- if (!focusables.length) return;
31799
-
31800
- // Set the tab direction based on the key pressed
31801
- this.tabDirection = e.shiftKey ? "backward" : "forward";
31802
-
31803
- // Get the active elements that are currently focused
31804
- const actives = this._getActiveElements();
31805
-
31806
- // If we're at either end of the focusable elements, wrap around to the other end
31807
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
31808
-
31809
- // Fallback if we have no focused element
31810
- if (focusIndex === -1) focusIndex = 0;
31811
-
31812
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
31813
- // Is null if no new focus index is determined
31814
- const newFocusIndex = this._getNextFocusIndex(
31815
- focusIndex,
31816
- focusables,
31817
- actives,
31818
- );
31819
-
31820
- // If we have a new focus index, set focus to that element
31821
- if (newFocusIndex !== null) {
31822
- e.preventDefault();
31823
- focusables[newFocusIndex].focus();
31824
- }
31825
- }
31826
-
31827
- /**
31828
- * Catches the keydown event
31829
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
31830
- * @private
31831
- */
31832
- _onKeydown = (e) => {
31833
- // Handle tab
31834
- if (e.key === "Tab") this._handleTabKey(e);
31835
- };
31836
-
31837
- /**
31838
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
31839
- * Returns a unique, ordered array of elements that can receive focus.
31840
- *
31841
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
31842
- * @private
31843
- */
31844
- _getFocusableElements() {
31845
- // Use the imported utility function to get focusable elements
31846
- const elements = getFocusableElements$4(this.container);
31847
-
31848
- // Return the elements found
31849
- return elements;
31850
- }
31851
-
31852
- /**
31853
- * Moves focus to the first focusable element within the container.
31854
- * Useful for setting initial focus when activating the focus trap.
31855
- */
31856
- focusFirstElement() {
31857
- const focusables = this._getFocusableElements();
31858
- if (focusables.length) focusables[0].focus();
31859
- }
31860
-
31861
- /**
31862
- * Moves focus to the last focusable element within the container.
31863
- * Useful for setting focus when deactivating or cycling focus in reverse.
31864
- */
31865
- focusLastElement() {
31866
- const focusables = this._getFocusableElements();
31867
- if (focusables.length) focusables[focusables.length - 1].focus();
31868
- }
31869
-
31870
- /**
31871
- * Removes event listeners and attributes added by the focus trap.
31872
- * Call this method to clean up when the focus trap is no longer needed.
31873
- */
31874
- disconnect() {
31875
- if (this.container.hasAttribute("data-focus-trap-container")) {
31876
- this.container.removeAttribute("data-focus-trap-container");
31877
- }
31878
-
31879
- this.container.removeEventListener("keydown", this._onKeydown);
31880
- }
31881
- };
31882
-
31883
31718
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
31884
31719
  // See LICENSE in the project root for license information.
31885
31720
 
@@ -32377,7 +32212,7 @@ let AuroDropdownBib$3 = class AuroDropdownBib extends i$2 {
32377
32212
  classes[`shape-${this.shape}`] = true;
32378
32213
 
32379
32214
  return u$d`
32380
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
32215
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
32381
32216
  ${this.dialogLabel ? u$d`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
32382
32217
  <slot></slot>
32383
32218
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -32628,7 +32463,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
32628
32463
  }
32629
32464
  };
32630
32465
 
32631
- var formkitVersion$1$3 = '202607091919';
32466
+ var formkitVersion$1$3 = '202607100029';
32632
32467
 
32633
32468
  let AuroElement$2$2 = class AuroElement extends i$2 {
32634
32469
  static get properties() {
@@ -33382,7 +33217,10 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
33382
33217
  }
33383
33218
 
33384
33219
 
33385
- if (!this.isPopoverVisible) {
33220
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
33221
+ // — restoring to the trigger would trap the user on this dropdown, forcing
33222
+ // an extra Tab to move on. Escape and outside-click still restore.
33223
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
33386
33224
  // wait til the bib gets fully closed and rendered
33387
33225
  setTimeout(() => {
33388
33226
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -33612,15 +33450,16 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
33612
33450
  }
33613
33451
  });
33614
33452
  } else {
33615
- // Normal desktop: use FocusTrap on the bib element.
33616
- // Defer focusFirstElement to the next frame because the popover
33617
- // is positioned asynchronously by Floating UI — calling focus()
33618
- // synchronously here would target elements with zero dimensions
33619
- // and the focus call would be silently ignored.
33620
- this.focusTrap = new FocusTrap$3(this.bibContent);
33453
+ // Normal desktop (non-modal): move initial focus into the bib but
33454
+ // don't trap Tab. Tab should exit the bib and let the floater's
33455
+ // handleFocusLoss close it, matching native <select>/<details>
33456
+ // behavior. Deferred one frame because Floating UI positions the
33457
+ // popover asynchronously a synchronous focus() would target
33458
+ // zero-dimension elements and be silently ignored.
33621
33459
  requestAnimationFrame(() => {
33622
- if (this.focusTrap) {
33623
- this.focusTrap.focusFirstElement();
33460
+ const focusables = getFocusableElements$4(this.bibContent);
33461
+ if (focusables.length) {
33462
+ focusables[0].focus();
33624
33463
  }
33625
33464
  });
33626
33465
  }
@@ -46246,7 +46085,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
46246
46085
  }
46247
46086
  };
46248
46087
 
46249
- var formkitVersion$7 = '202607091919';
46088
+ var formkitVersion$7 = '202607100029';
46250
46089
 
46251
46090
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46252
46091
  // See LICENSE in the project root for license information.
@@ -49580,6 +49419,7 @@ class AuroDatePicker extends AuroElement$5 {
49580
49419
  const path = event.composedPath();
49581
49420
  const [initTarget] = path;
49582
49421
  const pathIncludesBib = path.includes(this.dropdown?.bibContent);
49422
+ const triggerIsInert = this.dropdown?.trigger?.inert;
49583
49423
 
49584
49424
  // When desktopModal is open, the datepicker marks the dropdown's #trigger
49585
49425
  // element inert to keep AT and Tab off the input. Inert also blocks pointer
@@ -49590,7 +49430,7 @@ class AuroDatePicker extends AuroElement$5 {
49590
49430
  // and closes the bib. Suppress that misdetection here: if the click lands
49591
49431
  // inside the trigger's bounds and outside the bib, stop propagation before
49592
49432
  // it reaches the window listener.
49593
- if (this.dropdown?.isPopoverVisible && !pathIncludesBib) {
49433
+ if (this.dropdown?.isPopoverVisible && triggerIsInert && !pathIncludesBib) {
49594
49434
  const triggerRect = this.dropdown.trigger?.getBoundingClientRect();
49595
49435
  if (triggerRect &&
49596
49436
  event.clientX >= triggerRect.left && event.clientX <= triggerRect.right &&
@@ -51186,7 +51026,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
51186
51026
  }
51187
51027
  };
51188
51028
 
51189
- var formkitVersion$1$2 = '202607091919';
51029
+ var formkitVersion$1$2 = '202607100029';
51190
51030
 
51191
51031
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
51192
51032
  // See LICENSE in the project root for license information.
@@ -53898,12 +53738,40 @@ let AuroFloatingUI$2 = class AuroFloatingUI {
53898
53738
  return;
53899
53739
  }
53900
53740
 
53741
+ // Chrome-specific: during popover top-layer promotion after a click on a
53742
+ // slotted focusable, :focus-within can briefly evaluate false while the
53743
+ // active element is still structurally inside the trigger/bib. Fall back
53744
+ // to a shadow-piercing ancestry walk from the deep active element before
53745
+ // treating this as a real focus loss.
53746
+ try {
53747
+ let active = document.activeElement;
53748
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
53749
+ active = active.shadowRoot.activeElement;
53750
+ }
53751
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
53752
+ let node = active;
53753
+ while (node) {
53754
+ if (targets.includes(node)) {
53755
+ return;
53756
+ }
53757
+ node =
53758
+ node.parentElement ||
53759
+ (node.getRootNode && node.getRootNode().host) ||
53760
+ null;
53761
+ }
53762
+ } catch (e) {
53763
+ // Defensive: fall through to the existing close path if traversal fails.
53764
+ }
53765
+
53901
53766
  // if fullscreen bib is in fullscreen mode, do not close
53902
53767
  if (element.bib.hasAttribute("isfullscreen")) {
53903
53768
  return;
53904
53769
  }
53905
53770
 
53906
- this.hideBib("keydown");
53771
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
53772
+ // Escape keydown close. Consumers use this to decide whether to restore
53773
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
53774
+ this.hideBib("focusloss");
53907
53775
  }
53908
53776
 
53909
53777
  setupHideHandlers() {
@@ -54573,199 +54441,6 @@ function getFocusableElements$3(container) {
54573
54441
  return tabIndexedUniqueElements;
54574
54442
  }
54575
54443
 
54576
- /**
54577
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
54578
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
54579
- */
54580
- let FocusTrap$2 = class FocusTrap {
54581
- /**
54582
- * Creates a new FocusTrap instance for the given container element.
54583
- * Initializes event listeners and prepares the container for focus management.
54584
- *
54585
- * @param {HTMLElement} container The DOM element to trap focus within.
54586
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
54587
- * @throws {Error} If the provided container is not a valid HTMLElement.
54588
- */
54589
- constructor(container, controlTabOrder = false) {
54590
- if (!container || !(container instanceof HTMLElement)) {
54591
- throw new Error("FocusTrap requires a valid HTMLElement.");
54592
- }
54593
-
54594
- this.container = container;
54595
- this.tabDirection = "forward"; // or 'backward';
54596
- this.controlTabOrder = controlTabOrder;
54597
-
54598
- this._init();
54599
- }
54600
-
54601
- /**
54602
- * Initializes the focus trap by setting up event listeners and attributes on the container.
54603
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
54604
- *
54605
- * @private
54606
- */
54607
- _init() {
54608
- // Add inert attribute to prevent focusing programmatically as well (if supported)
54609
- if ("inert" in HTMLElement.prototype) {
54610
- this.container.inert = false; // Ensure the container isn't inert
54611
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
54612
- }
54613
-
54614
- // Track tab direction
54615
- this.container.addEventListener("keydown", this._onKeydown);
54616
- }
54617
-
54618
- /**
54619
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
54620
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
54621
- * @private
54622
- */
54623
- _getActiveElements() {
54624
- // Get the active element(s) in the document and shadow root
54625
- // This will include the active element in the shadow DOM if it exists
54626
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
54627
- let { activeElement } = document;
54628
- const actives = [activeElement];
54629
- while (activeElement?.shadowRoot?.activeElement) {
54630
- actives.push(activeElement.shadowRoot.activeElement);
54631
- activeElement = activeElement.shadowRoot.activeElement;
54632
- }
54633
- return actives;
54634
- }
54635
-
54636
- /**
54637
- * Gets the next focus index based on the current index and focusable elements.
54638
- * @param {number} currentIndex The current index of the focused element.
54639
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
54640
- * @returns {number|null} The next focus index or null if not determined.
54641
- */
54642
- _getNextFocusIndex(currentIndex, focusables, actives) {
54643
- if (this.controlTabOrder) {
54644
- // Calculate the new index based on the current index and tab direction
54645
- let newFocusIndex =
54646
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
54647
-
54648
- // Wrap-around logic
54649
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
54650
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
54651
-
54652
- // Early return with the new index
54653
- return newFocusIndex;
54654
- }
54655
-
54656
- // Determine if we need to wrap
54657
- const atFirst =
54658
- actives.includes(focusables[0]) || actives.includes(this.container);
54659
- const atLast = actives.includes(focusables[focusables.length - 1]);
54660
-
54661
- // Only wrap if at the ends
54662
- if (this.tabDirection === "backward" && atFirst) {
54663
- return focusables.length - 1;
54664
- }
54665
-
54666
- if (this.tabDirection === "forward" && atLast) {
54667
- return 0;
54668
- }
54669
-
54670
- // No wrap, so don't change focus, return early
54671
- return null;
54672
- }
54673
-
54674
- /**
54675
- * Handles the Tab key press event to manage focus within the container.
54676
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
54677
- * @returns {void}
54678
- */
54679
- _handleTabKey(e) {
54680
- // Update the focusable elements
54681
- const focusables = this._getFocusableElements();
54682
-
54683
- // If there are no focusable elements, exit
54684
- if (!focusables.length) return;
54685
-
54686
- // Set the tab direction based on the key pressed
54687
- this.tabDirection = e.shiftKey ? "backward" : "forward";
54688
-
54689
- // Get the active elements that are currently focused
54690
- const actives = this._getActiveElements();
54691
-
54692
- // If we're at either end of the focusable elements, wrap around to the other end
54693
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
54694
-
54695
- // Fallback if we have no focused element
54696
- if (focusIndex === -1) focusIndex = 0;
54697
-
54698
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
54699
- // Is null if no new focus index is determined
54700
- const newFocusIndex = this._getNextFocusIndex(
54701
- focusIndex,
54702
- focusables,
54703
- actives,
54704
- );
54705
-
54706
- // If we have a new focus index, set focus to that element
54707
- if (newFocusIndex !== null) {
54708
- e.preventDefault();
54709
- focusables[newFocusIndex].focus();
54710
- }
54711
- }
54712
-
54713
- /**
54714
- * Catches the keydown event
54715
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
54716
- * @private
54717
- */
54718
- _onKeydown = (e) => {
54719
- // Handle tab
54720
- if (e.key === "Tab") this._handleTabKey(e);
54721
- };
54722
-
54723
- /**
54724
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
54725
- * Returns a unique, ordered array of elements that can receive focus.
54726
- *
54727
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
54728
- * @private
54729
- */
54730
- _getFocusableElements() {
54731
- // Use the imported utility function to get focusable elements
54732
- const elements = getFocusableElements$3(this.container);
54733
-
54734
- // Return the elements found
54735
- return elements;
54736
- }
54737
-
54738
- /**
54739
- * Moves focus to the first focusable element within the container.
54740
- * Useful for setting initial focus when activating the focus trap.
54741
- */
54742
- focusFirstElement() {
54743
- const focusables = this._getFocusableElements();
54744
- if (focusables.length) focusables[0].focus();
54745
- }
54746
-
54747
- /**
54748
- * Moves focus to the last focusable element within the container.
54749
- * Useful for setting focus when deactivating or cycling focus in reverse.
54750
- */
54751
- focusLastElement() {
54752
- const focusables = this._getFocusableElements();
54753
- if (focusables.length) focusables[focusables.length - 1].focus();
54754
- }
54755
-
54756
- /**
54757
- * Removes event listeners and attributes added by the focus trap.
54758
- * Call this method to clean up when the focus trap is no longer needed.
54759
- */
54760
- disconnect() {
54761
- if (this.container.hasAttribute("data-focus-trap-container")) {
54762
- this.container.removeAttribute("data-focus-trap-container");
54763
- }
54764
-
54765
- this.container.removeEventListener("keydown", this._onKeydown);
54766
- }
54767
- };
54768
-
54769
54444
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
54770
54445
  // See LICENSE in the project root for license information.
54771
54446
 
@@ -55263,7 +54938,7 @@ let AuroDropdownBib$2 = class AuroDropdownBib extends i$2 {
55263
54938
  classes[`shape-${this.shape}`] = true;
55264
54939
 
55265
54940
  return u$d`
55266
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
54941
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
55267
54942
  ${this.dialogLabel ? u$d`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
55268
54943
  <slot></slot>
55269
54944
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -55514,7 +55189,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
55514
55189
  }
55515
55190
  };
55516
55191
 
55517
- var formkitVersion$6 = '202607091919';
55192
+ var formkitVersion$6 = '202607100029';
55518
55193
 
55519
55194
  let AuroElement$1$2 = class AuroElement extends i$2 {
55520
55195
  static get properties() {
@@ -56268,7 +55943,10 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
56268
55943
  }
56269
55944
 
56270
55945
 
56271
- if (!this.isPopoverVisible) {
55946
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
55947
+ // — restoring to the trigger would trap the user on this dropdown, forcing
55948
+ // an extra Tab to move on. Escape and outside-click still restore.
55949
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
56272
55950
  // wait til the bib gets fully closed and rendered
56273
55951
  setTimeout(() => {
56274
55952
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -56498,15 +56176,16 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
56498
56176
  }
56499
56177
  });
56500
56178
  } else {
56501
- // Normal desktop: use FocusTrap on the bib element.
56502
- // Defer focusFirstElement to the next frame because the popover
56503
- // is positioned asynchronously by Floating UI — calling focus()
56504
- // synchronously here would target elements with zero dimensions
56505
- // and the focus call would be silently ignored.
56506
- this.focusTrap = new FocusTrap$2(this.bibContent);
56179
+ // Normal desktop (non-modal): move initial focus into the bib but
56180
+ // don't trap Tab. Tab should exit the bib and let the floater's
56181
+ // handleFocusLoss close it, matching native <select>/<details>
56182
+ // behavior. Deferred one frame because Floating UI positions the
56183
+ // popover asynchronously a synchronous focus() would target
56184
+ // zero-dimension elements and be silently ignored.
56507
56185
  requestAnimationFrame(() => {
56508
- if (this.focusTrap) {
56509
- this.focusTrap.focusFirstElement();
56186
+ const focusables = getFocusableElements$3(this.bibContent);
56187
+ if (focusables.length) {
56188
+ focusables[0].focus();
56510
56189
  }
56511
56190
  });
56512
56191
  }
@@ -59494,7 +59173,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
59494
59173
  }
59495
59174
  };
59496
59175
 
59497
- var formkitVersion$5 = '202607091919';
59176
+ var formkitVersion$5 = '202607100029';
59498
59177
 
59499
59178
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59500
59179
  // See LICENSE in the project root for license information.
@@ -61259,7 +60938,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
61259
60938
  }
61260
60939
  };
61261
60940
 
61262
- var formkitVersion$4 = '202607091919';
60941
+ var formkitVersion$4 = '202607100029';
61263
60942
 
61264
60943
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
61265
60944
  // See LICENSE in the project root for license information.
@@ -65121,12 +64800,40 @@ let AuroFloatingUI$1 = class AuroFloatingUI {
65121
64800
  return;
65122
64801
  }
65123
64802
 
64803
+ // Chrome-specific: during popover top-layer promotion after a click on a
64804
+ // slotted focusable, :focus-within can briefly evaluate false while the
64805
+ // active element is still structurally inside the trigger/bib. Fall back
64806
+ // to a shadow-piercing ancestry walk from the deep active element before
64807
+ // treating this as a real focus loss.
64808
+ try {
64809
+ let active = document.activeElement;
64810
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
64811
+ active = active.shadowRoot.activeElement;
64812
+ }
64813
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
64814
+ let node = active;
64815
+ while (node) {
64816
+ if (targets.includes(node)) {
64817
+ return;
64818
+ }
64819
+ node =
64820
+ node.parentElement ||
64821
+ (node.getRootNode && node.getRootNode().host) ||
64822
+ null;
64823
+ }
64824
+ } catch (e) {
64825
+ // Defensive: fall through to the existing close path if traversal fails.
64826
+ }
64827
+
65124
64828
  // if fullscreen bib is in fullscreen mode, do not close
65125
64829
  if (element.bib.hasAttribute("isfullscreen")) {
65126
64830
  return;
65127
64831
  }
65128
64832
 
65129
- this.hideBib("keydown");
64833
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
64834
+ // Escape keydown close. Consumers use this to decide whether to restore
64835
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
64836
+ this.hideBib("focusloss");
65130
64837
  }
65131
64838
 
65132
64839
  setupHideHandlers() {
@@ -65796,199 +65503,6 @@ function getFocusableElements$2(container) {
65796
65503
  return tabIndexedUniqueElements;
65797
65504
  }
65798
65505
 
65799
- /**
65800
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
65801
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
65802
- */
65803
- let FocusTrap$1 = class FocusTrap {
65804
- /**
65805
- * Creates a new FocusTrap instance for the given container element.
65806
- * Initializes event listeners and prepares the container for focus management.
65807
- *
65808
- * @param {HTMLElement} container The DOM element to trap focus within.
65809
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
65810
- * @throws {Error} If the provided container is not a valid HTMLElement.
65811
- */
65812
- constructor(container, controlTabOrder = false) {
65813
- if (!container || !(container instanceof HTMLElement)) {
65814
- throw new Error("FocusTrap requires a valid HTMLElement.");
65815
- }
65816
-
65817
- this.container = container;
65818
- this.tabDirection = "forward"; // or 'backward';
65819
- this.controlTabOrder = controlTabOrder;
65820
-
65821
- this._init();
65822
- }
65823
-
65824
- /**
65825
- * Initializes the focus trap by setting up event listeners and attributes on the container.
65826
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
65827
- *
65828
- * @private
65829
- */
65830
- _init() {
65831
- // Add inert attribute to prevent focusing programmatically as well (if supported)
65832
- if ("inert" in HTMLElement.prototype) {
65833
- this.container.inert = false; // Ensure the container isn't inert
65834
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
65835
- }
65836
-
65837
- // Track tab direction
65838
- this.container.addEventListener("keydown", this._onKeydown);
65839
- }
65840
-
65841
- /**
65842
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
65843
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
65844
- * @private
65845
- */
65846
- _getActiveElements() {
65847
- // Get the active element(s) in the document and shadow root
65848
- // This will include the active element in the shadow DOM if it exists
65849
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
65850
- let { activeElement } = document;
65851
- const actives = [activeElement];
65852
- while (activeElement?.shadowRoot?.activeElement) {
65853
- actives.push(activeElement.shadowRoot.activeElement);
65854
- activeElement = activeElement.shadowRoot.activeElement;
65855
- }
65856
- return actives;
65857
- }
65858
-
65859
- /**
65860
- * Gets the next focus index based on the current index and focusable elements.
65861
- * @param {number} currentIndex The current index of the focused element.
65862
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
65863
- * @returns {number|null} The next focus index or null if not determined.
65864
- */
65865
- _getNextFocusIndex(currentIndex, focusables, actives) {
65866
- if (this.controlTabOrder) {
65867
- // Calculate the new index based on the current index and tab direction
65868
- let newFocusIndex =
65869
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
65870
-
65871
- // Wrap-around logic
65872
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
65873
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
65874
-
65875
- // Early return with the new index
65876
- return newFocusIndex;
65877
- }
65878
-
65879
- // Determine if we need to wrap
65880
- const atFirst =
65881
- actives.includes(focusables[0]) || actives.includes(this.container);
65882
- const atLast = actives.includes(focusables[focusables.length - 1]);
65883
-
65884
- // Only wrap if at the ends
65885
- if (this.tabDirection === "backward" && atFirst) {
65886
- return focusables.length - 1;
65887
- }
65888
-
65889
- if (this.tabDirection === "forward" && atLast) {
65890
- return 0;
65891
- }
65892
-
65893
- // No wrap, so don't change focus, return early
65894
- return null;
65895
- }
65896
-
65897
- /**
65898
- * Handles the Tab key press event to manage focus within the container.
65899
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
65900
- * @returns {void}
65901
- */
65902
- _handleTabKey(e) {
65903
- // Update the focusable elements
65904
- const focusables = this._getFocusableElements();
65905
-
65906
- // If there are no focusable elements, exit
65907
- if (!focusables.length) return;
65908
-
65909
- // Set the tab direction based on the key pressed
65910
- this.tabDirection = e.shiftKey ? "backward" : "forward";
65911
-
65912
- // Get the active elements that are currently focused
65913
- const actives = this._getActiveElements();
65914
-
65915
- // If we're at either end of the focusable elements, wrap around to the other end
65916
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
65917
-
65918
- // Fallback if we have no focused element
65919
- if (focusIndex === -1) focusIndex = 0;
65920
-
65921
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
65922
- // Is null if no new focus index is determined
65923
- const newFocusIndex = this._getNextFocusIndex(
65924
- focusIndex,
65925
- focusables,
65926
- actives,
65927
- );
65928
-
65929
- // If we have a new focus index, set focus to that element
65930
- if (newFocusIndex !== null) {
65931
- e.preventDefault();
65932
- focusables[newFocusIndex].focus();
65933
- }
65934
- }
65935
-
65936
- /**
65937
- * Catches the keydown event
65938
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
65939
- * @private
65940
- */
65941
- _onKeydown = (e) => {
65942
- // Handle tab
65943
- if (e.key === "Tab") this._handleTabKey(e);
65944
- };
65945
-
65946
- /**
65947
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
65948
- * Returns a unique, ordered array of elements that can receive focus.
65949
- *
65950
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
65951
- * @private
65952
- */
65953
- _getFocusableElements() {
65954
- // Use the imported utility function to get focusable elements
65955
- const elements = getFocusableElements$2(this.container);
65956
-
65957
- // Return the elements found
65958
- return elements;
65959
- }
65960
-
65961
- /**
65962
- * Moves focus to the first focusable element within the container.
65963
- * Useful for setting initial focus when activating the focus trap.
65964
- */
65965
- focusFirstElement() {
65966
- const focusables = this._getFocusableElements();
65967
- if (focusables.length) focusables[0].focus();
65968
- }
65969
-
65970
- /**
65971
- * Moves focus to the last focusable element within the container.
65972
- * Useful for setting focus when deactivating or cycling focus in reverse.
65973
- */
65974
- focusLastElement() {
65975
- const focusables = this._getFocusableElements();
65976
- if (focusables.length) focusables[focusables.length - 1].focus();
65977
- }
65978
-
65979
- /**
65980
- * Removes event listeners and attributes added by the focus trap.
65981
- * Call this method to clean up when the focus trap is no longer needed.
65982
- */
65983
- disconnect() {
65984
- if (this.container.hasAttribute("data-focus-trap-container")) {
65985
- this.container.removeAttribute("data-focus-trap-container");
65986
- }
65987
-
65988
- this.container.removeEventListener("keydown", this._onKeydown);
65989
- }
65990
- };
65991
-
65992
65506
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
65993
65507
  // See LICENSE in the project root for license information.
65994
65508
 
@@ -66486,7 +66000,7 @@ let AuroDropdownBib$1 = class AuroDropdownBib extends i$2 {
66486
66000
  classes[`shape-${this.shape}`] = true;
66487
66001
 
66488
66002
  return u$d`
66489
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
66003
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
66490
66004
  ${this.dialogLabel ? u$d`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
66491
66005
  <slot></slot>
66492
66006
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -66737,7 +66251,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
66737
66251
  }
66738
66252
  };
66739
66253
 
66740
- var formkitVersion$2 = '202607091919';
66254
+ var formkitVersion$2 = '202607100029';
66741
66255
 
66742
66256
  let AuroElement$2$1 = class AuroElement extends i$2 {
66743
66257
  static get properties() {
@@ -67491,7 +67005,10 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
67491
67005
  }
67492
67006
 
67493
67007
 
67494
- if (!this.isPopoverVisible) {
67008
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
67009
+ // — restoring to the trigger would trap the user on this dropdown, forcing
67010
+ // an extra Tab to move on. Escape and outside-click still restore.
67011
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
67495
67012
  // wait til the bib gets fully closed and rendered
67496
67013
  setTimeout(() => {
67497
67014
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -67721,15 +67238,16 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
67721
67238
  }
67722
67239
  });
67723
67240
  } else {
67724
- // Normal desktop: use FocusTrap on the bib element.
67725
- // Defer focusFirstElement to the next frame because the popover
67726
- // is positioned asynchronously by Floating UI — calling focus()
67727
- // synchronously here would target elements with zero dimensions
67728
- // and the focus call would be silently ignored.
67729
- this.focusTrap = new FocusTrap$1(this.bibContent);
67241
+ // Normal desktop (non-modal): move initial focus into the bib but
67242
+ // don't trap Tab. Tab should exit the bib and let the floater's
67243
+ // handleFocusLoss close it, matching native <select>/<details>
67244
+ // behavior. Deferred one frame because Floating UI positions the
67245
+ // popover asynchronously a synchronous focus() would target
67246
+ // zero-dimension elements and be silently ignored.
67730
67247
  requestAnimationFrame(() => {
67731
- if (this.focusTrap) {
67732
- this.focusTrap.focusFirstElement();
67248
+ const focusables = getFocusableElements$2(this.bibContent);
67249
+ if (focusables.length) {
67250
+ focusables[0].focus();
67733
67251
  }
67734
67252
  });
67735
67253
  }
@@ -80355,7 +79873,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
80355
79873
  }
80356
79874
  };
80357
79875
 
80358
- var formkitVersion$1$1 = '202607091919';
79876
+ var formkitVersion$1$1 = '202607100029';
80359
79877
 
80360
79878
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
80361
79879
  // See LICENSE in the project root for license information.
@@ -81476,7 +80994,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
81476
80994
  }
81477
80995
  };
81478
80996
 
81479
- var formkitVersion$3 = '202607091919';
80997
+ var formkitVersion$3 = '202607100029';
81480
80998
 
81481
80999
  var styleCss$1$3 = i$4`.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}`;
81482
81000
 
@@ -88846,12 +88364,40 @@ class AuroFloatingUI {
88846
88364
  return;
88847
88365
  }
88848
88366
 
88367
+ // Chrome-specific: during popover top-layer promotion after a click on a
88368
+ // slotted focusable, :focus-within can briefly evaluate false while the
88369
+ // active element is still structurally inside the trigger/bib. Fall back
88370
+ // to a shadow-piercing ancestry walk from the deep active element before
88371
+ // treating this as a real focus loss.
88372
+ try {
88373
+ let active = document.activeElement;
88374
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
88375
+ active = active.shadowRoot.activeElement;
88376
+ }
88377
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
88378
+ let node = active;
88379
+ while (node) {
88380
+ if (targets.includes(node)) {
88381
+ return;
88382
+ }
88383
+ node =
88384
+ node.parentElement ||
88385
+ (node.getRootNode && node.getRootNode().host) ||
88386
+ null;
88387
+ }
88388
+ } catch (e) {
88389
+ // Defensive: fall through to the existing close path if traversal fails.
88390
+ }
88391
+
88849
88392
  // if fullscreen bib is in fullscreen mode, do not close
88850
88393
  if (element.bib.hasAttribute("isfullscreen")) {
88851
88394
  return;
88852
88395
  }
88853
88396
 
88854
- this.hideBib("keydown");
88397
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
88398
+ // Escape keydown close. Consumers use this to decide whether to restore
88399
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
88400
+ this.hideBib("focusloss");
88855
88401
  }
88856
88402
 
88857
88403
  setupHideHandlers() {
@@ -89521,199 +89067,6 @@ function getFocusableElements(container) {
89521
89067
  return tabIndexedUniqueElements;
89522
89068
  }
89523
89069
 
89524
- /**
89525
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
89526
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
89527
- */
89528
- class FocusTrap {
89529
- /**
89530
- * Creates a new FocusTrap instance for the given container element.
89531
- * Initializes event listeners and prepares the container for focus management.
89532
- *
89533
- * @param {HTMLElement} container The DOM element to trap focus within.
89534
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
89535
- * @throws {Error} If the provided container is not a valid HTMLElement.
89536
- */
89537
- constructor(container, controlTabOrder = false) {
89538
- if (!container || !(container instanceof HTMLElement)) {
89539
- throw new Error("FocusTrap requires a valid HTMLElement.");
89540
- }
89541
-
89542
- this.container = container;
89543
- this.tabDirection = "forward"; // or 'backward';
89544
- this.controlTabOrder = controlTabOrder;
89545
-
89546
- this._init();
89547
- }
89548
-
89549
- /**
89550
- * Initializes the focus trap by setting up event listeners and attributes on the container.
89551
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
89552
- *
89553
- * @private
89554
- */
89555
- _init() {
89556
- // Add inert attribute to prevent focusing programmatically as well (if supported)
89557
- if ("inert" in HTMLElement.prototype) {
89558
- this.container.inert = false; // Ensure the container isn't inert
89559
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
89560
- }
89561
-
89562
- // Track tab direction
89563
- this.container.addEventListener("keydown", this._onKeydown);
89564
- }
89565
-
89566
- /**
89567
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
89568
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
89569
- * @private
89570
- */
89571
- _getActiveElements() {
89572
- // Get the active element(s) in the document and shadow root
89573
- // This will include the active element in the shadow DOM if it exists
89574
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
89575
- let { activeElement } = document;
89576
- const actives = [activeElement];
89577
- while (activeElement?.shadowRoot?.activeElement) {
89578
- actives.push(activeElement.shadowRoot.activeElement);
89579
- activeElement = activeElement.shadowRoot.activeElement;
89580
- }
89581
- return actives;
89582
- }
89583
-
89584
- /**
89585
- * Gets the next focus index based on the current index and focusable elements.
89586
- * @param {number} currentIndex The current index of the focused element.
89587
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
89588
- * @returns {number|null} The next focus index or null if not determined.
89589
- */
89590
- _getNextFocusIndex(currentIndex, focusables, actives) {
89591
- if (this.controlTabOrder) {
89592
- // Calculate the new index based on the current index and tab direction
89593
- let newFocusIndex =
89594
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
89595
-
89596
- // Wrap-around logic
89597
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
89598
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
89599
-
89600
- // Early return with the new index
89601
- return newFocusIndex;
89602
- }
89603
-
89604
- // Determine if we need to wrap
89605
- const atFirst =
89606
- actives.includes(focusables[0]) || actives.includes(this.container);
89607
- const atLast = actives.includes(focusables[focusables.length - 1]);
89608
-
89609
- // Only wrap if at the ends
89610
- if (this.tabDirection === "backward" && atFirst) {
89611
- return focusables.length - 1;
89612
- }
89613
-
89614
- if (this.tabDirection === "forward" && atLast) {
89615
- return 0;
89616
- }
89617
-
89618
- // No wrap, so don't change focus, return early
89619
- return null;
89620
- }
89621
-
89622
- /**
89623
- * Handles the Tab key press event to manage focus within the container.
89624
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
89625
- * @returns {void}
89626
- */
89627
- _handleTabKey(e) {
89628
- // Update the focusable elements
89629
- const focusables = this._getFocusableElements();
89630
-
89631
- // If there are no focusable elements, exit
89632
- if (!focusables.length) return;
89633
-
89634
- // Set the tab direction based on the key pressed
89635
- this.tabDirection = e.shiftKey ? "backward" : "forward";
89636
-
89637
- // Get the active elements that are currently focused
89638
- const actives = this._getActiveElements();
89639
-
89640
- // If we're at either end of the focusable elements, wrap around to the other end
89641
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
89642
-
89643
- // Fallback if we have no focused element
89644
- if (focusIndex === -1) focusIndex = 0;
89645
-
89646
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
89647
- // Is null if no new focus index is determined
89648
- const newFocusIndex = this._getNextFocusIndex(
89649
- focusIndex,
89650
- focusables,
89651
- actives,
89652
- );
89653
-
89654
- // If we have a new focus index, set focus to that element
89655
- if (newFocusIndex !== null) {
89656
- e.preventDefault();
89657
- focusables[newFocusIndex].focus();
89658
- }
89659
- }
89660
-
89661
- /**
89662
- * Catches the keydown event
89663
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
89664
- * @private
89665
- */
89666
- _onKeydown = (e) => {
89667
- // Handle tab
89668
- if (e.key === "Tab") this._handleTabKey(e);
89669
- };
89670
-
89671
- /**
89672
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
89673
- * Returns a unique, ordered array of elements that can receive focus.
89674
- *
89675
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
89676
- * @private
89677
- */
89678
- _getFocusableElements() {
89679
- // Use the imported utility function to get focusable elements
89680
- const elements = getFocusableElements(this.container);
89681
-
89682
- // Return the elements found
89683
- return elements;
89684
- }
89685
-
89686
- /**
89687
- * Moves focus to the first focusable element within the container.
89688
- * Useful for setting initial focus when activating the focus trap.
89689
- */
89690
- focusFirstElement() {
89691
- const focusables = this._getFocusableElements();
89692
- if (focusables.length) focusables[0].focus();
89693
- }
89694
-
89695
- /**
89696
- * Moves focus to the last focusable element within the container.
89697
- * Useful for setting focus when deactivating or cycling focus in reverse.
89698
- */
89699
- focusLastElement() {
89700
- const focusables = this._getFocusableElements();
89701
- if (focusables.length) focusables[focusables.length - 1].focus();
89702
- }
89703
-
89704
- /**
89705
- * Removes event listeners and attributes added by the focus trap.
89706
- * Call this method to clean up when the focus trap is no longer needed.
89707
- */
89708
- disconnect() {
89709
- if (this.container.hasAttribute("data-focus-trap-container")) {
89710
- this.container.removeAttribute("data-focus-trap-container");
89711
- }
89712
-
89713
- this.container.removeEventListener("keydown", this._onKeydown);
89714
- }
89715
- }
89716
-
89717
89070
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
89718
89071
  // See LICENSE in the project root for license information.
89719
89072
 
@@ -90211,7 +89564,7 @@ class AuroDropdownBib extends i$2 {
90211
89564
  classes[`shape-${this.shape}`] = true;
90212
89565
 
90213
89566
  return u$d`
90214
- <dialog class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
89567
+ <dialog tabindex="-1" class="${e$2(classes)}" part="bibContainer" role="${o$4(this.dialogRole)}" aria-labelledby="${o$4(this.dialogLabel ? 'dialogLabel' : undefined)}">
90215
89568
  ${this.dialogLabel ? u$d`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
90216
89569
  <slot></slot>
90217
89570
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -90462,7 +89815,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
90462
89815
  }
90463
89816
  };
90464
89817
 
90465
- var formkitVersion$1 = '202607091919';
89818
+ var formkitVersion$1 = '202607100029';
90466
89819
 
90467
89820
  class AuroElement extends i$2 {
90468
89821
  static get properties() {
@@ -91216,7 +90569,10 @@ class AuroDropdown extends AuroElement {
91216
90569
  }
91217
90570
 
91218
90571
 
91219
- if (!this.isPopoverVisible) {
90572
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
90573
+ // — restoring to the trigger would trap the user on this dropdown, forcing
90574
+ // an extra Tab to move on. Escape and outside-click still restore.
90575
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
91220
90576
  // wait til the bib gets fully closed and rendered
91221
90577
  setTimeout(() => {
91222
90578
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -91446,15 +90802,16 @@ class AuroDropdown extends AuroElement {
91446
90802
  }
91447
90803
  });
91448
90804
  } else {
91449
- // Normal desktop: use FocusTrap on the bib element.
91450
- // Defer focusFirstElement to the next frame because the popover
91451
- // is positioned asynchronously by Floating UI — calling focus()
91452
- // synchronously here would target elements with zero dimensions
91453
- // and the focus call would be silently ignored.
91454
- this.focusTrap = new FocusTrap(this.bibContent);
90805
+ // Normal desktop (non-modal): move initial focus into the bib but
90806
+ // don't trap Tab. Tab should exit the bib and let the floater's
90807
+ // handleFocusLoss close it, matching native <select>/<details>
90808
+ // behavior. Deferred one frame because Floating UI positions the
90809
+ // popover asynchronously a synchronous focus() would target
90810
+ // zero-dimension elements and be silently ignored.
91455
90811
  requestAnimationFrame(() => {
91456
- if (this.focusTrap) {
91457
- this.focusTrap.focusFirstElement();
90812
+ const focusables = getFocusableElements(this.bibContent);
90813
+ if (focusables.length) {
90814
+ focusables[0].focus();
91458
90815
  }
91459
90816
  });
91460
90817
  }
@@ -92501,7 +91858,7 @@ class AuroHelpText extends i$2 {
92501
91858
  }
92502
91859
  }
92503
91860
 
92504
- var formkitVersion = '202607091919';
91861
+ var formkitVersion = '202607100029';
92505
91862
 
92506
91863
  var styleCss = i$4`.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}`;
92507
91864