@aurodesignsystem-dev/auro-formkit 0.0.0-pr1551.0 → 0.0.0-pr1552.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.
- package/components/checkbox/demo/customize.min.js +1 -1
- package/components/checkbox/demo/getting-started.min.js +1 -1
- package/components/checkbox/demo/index.min.js +1 -1
- package/components/checkbox/dist/index.js +1 -1
- package/components/checkbox/dist/registered.js +1 -1
- package/components/combobox/demo/customize.min.js +207 -46
- package/components/combobox/demo/getting-started.min.js +207 -46
- package/components/combobox/demo/index.min.js +207 -46
- package/components/combobox/dist/index.js +207 -46
- package/components/combobox/dist/registered.js +207 -46
- package/components/counter/demo/customize.min.js +206 -45
- package/components/counter/demo/index.min.js +206 -45
- package/components/counter/dist/index.js +206 -45
- package/components/counter/dist/registered.js +206 -45
- package/components/datepicker/demo/customize.min.js +207 -46
- package/components/datepicker/demo/index.min.js +207 -46
- package/components/datepicker/dist/index.js +207 -46
- package/components/datepicker/dist/registered.js +207 -46
- package/components/dropdown/demo/customize.min.js +205 -44
- package/components/dropdown/demo/getting-started.min.js +205 -44
- package/components/dropdown/demo/index.min.js +205 -44
- package/components/dropdown/dist/index.js +205 -44
- package/components/dropdown/dist/registered.js +205 -44
- package/components/form/demo/customize.min.js +829 -185
- package/components/form/demo/getting-started.min.js +829 -185
- package/components/form/demo/index.min.js +829 -185
- package/components/form/demo/registerDemoDeps.min.js +829 -185
- package/components/input/demo/customize.min.js +1 -1
- package/components/input/demo/getting-started.min.js +1 -1
- package/components/input/demo/index.min.js +1 -1
- package/components/input/dist/index.js +1 -1
- package/components/input/dist/registered.js +1 -1
- package/components/radio/demo/customize.min.js +1 -1
- package/components/radio/demo/getting-started.min.js +1 -1
- package/components/radio/demo/index.min.js +1 -1
- package/components/radio/dist/index.js +1 -1
- package/components/radio/dist/registered.js +1 -1
- package/components/select/demo/customize.min.js +206 -45
- package/components/select/demo/getting-started.min.js +206 -45
- package/components/select/demo/index.min.js +206 -45
- package/components/select/dist/index.js +206 -45
- package/components/select/dist/registered.js +206 -45
- package/package.json +2 -2
|
@@ -3379,40 +3379,12 @@ class AuroFloatingUI {
|
|
|
3379
3379
|
return;
|
|
3380
3380
|
}
|
|
3381
3381
|
|
|
3382
|
-
// Chrome-specific: during popover top-layer promotion after a click on a
|
|
3383
|
-
// slotted focusable, :focus-within can briefly evaluate false while the
|
|
3384
|
-
// active element is still structurally inside the trigger/bib. Fall back
|
|
3385
|
-
// to a shadow-piercing ancestry walk from the deep active element before
|
|
3386
|
-
// treating this as a real focus loss.
|
|
3387
|
-
try {
|
|
3388
|
-
let active = document.activeElement;
|
|
3389
|
-
while (active && active.shadowRoot && active.shadowRoot.activeElement) {
|
|
3390
|
-
active = active.shadowRoot.activeElement;
|
|
3391
|
-
}
|
|
3392
|
-
const targets = [element, element.trigger, element.bib].filter(Boolean);
|
|
3393
|
-
let node = active;
|
|
3394
|
-
while (node) {
|
|
3395
|
-
if (targets.includes(node)) {
|
|
3396
|
-
return;
|
|
3397
|
-
}
|
|
3398
|
-
node =
|
|
3399
|
-
node.parentElement ||
|
|
3400
|
-
(node.getRootNode && node.getRootNode().host) ||
|
|
3401
|
-
null;
|
|
3402
|
-
}
|
|
3403
|
-
} catch (e) {
|
|
3404
|
-
// Defensive: fall through to the existing close path if traversal fails.
|
|
3405
|
-
}
|
|
3406
|
-
|
|
3407
3382
|
// if fullscreen bib is in fullscreen mode, do not close
|
|
3408
3383
|
if (element.bib.hasAttribute("isfullscreen")) {
|
|
3409
3384
|
return;
|
|
3410
3385
|
}
|
|
3411
3386
|
|
|
3412
|
-
|
|
3413
|
-
// Escape keydown close. Consumers use this to decide whether to restore
|
|
3414
|
-
// focus to the trigger (Escape) or let it advance naturally (Tab).
|
|
3415
|
-
this.hideBib("focusloss");
|
|
3387
|
+
this.hideBib("keydown");
|
|
3416
3388
|
}
|
|
3417
3389
|
|
|
3418
3390
|
setupHideHandlers() {
|
|
@@ -4082,6 +4054,199 @@ function getFocusableElements(container) {
|
|
|
4082
4054
|
return tabIndexedUniqueElements;
|
|
4083
4055
|
}
|
|
4084
4056
|
|
|
4057
|
+
/**
|
|
4058
|
+
* FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
|
|
4059
|
+
* It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
|
|
4060
|
+
*/
|
|
4061
|
+
class FocusTrap {
|
|
4062
|
+
/**
|
|
4063
|
+
* Creates a new FocusTrap instance for the given container element.
|
|
4064
|
+
* Initializes event listeners and prepares the container for focus management.
|
|
4065
|
+
*
|
|
4066
|
+
* @param {HTMLElement} container The DOM element to trap focus within.
|
|
4067
|
+
* @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
|
|
4068
|
+
* @throws {Error} If the provided container is not a valid HTMLElement.
|
|
4069
|
+
*/
|
|
4070
|
+
constructor(container, controlTabOrder = false) {
|
|
4071
|
+
if (!container || !(container instanceof HTMLElement)) {
|
|
4072
|
+
throw new Error("FocusTrap requires a valid HTMLElement.");
|
|
4073
|
+
}
|
|
4074
|
+
|
|
4075
|
+
this.container = container;
|
|
4076
|
+
this.tabDirection = "forward"; // or 'backward';
|
|
4077
|
+
this.controlTabOrder = controlTabOrder;
|
|
4078
|
+
|
|
4079
|
+
this._init();
|
|
4080
|
+
}
|
|
4081
|
+
|
|
4082
|
+
/**
|
|
4083
|
+
* Initializes the focus trap by setting up event listeners and attributes on the container.
|
|
4084
|
+
* Prepares the container for focus management, including support for shadow DOM and inert attributes.
|
|
4085
|
+
*
|
|
4086
|
+
* @private
|
|
4087
|
+
*/
|
|
4088
|
+
_init() {
|
|
4089
|
+
// Add inert attribute to prevent focusing programmatically as well (if supported)
|
|
4090
|
+
if ("inert" in HTMLElement.prototype) {
|
|
4091
|
+
this.container.inert = false; // Ensure the container isn't inert
|
|
4092
|
+
this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
|
|
4093
|
+
}
|
|
4094
|
+
|
|
4095
|
+
// Track tab direction
|
|
4096
|
+
this.container.addEventListener("keydown", this._onKeydown);
|
|
4097
|
+
}
|
|
4098
|
+
|
|
4099
|
+
/**
|
|
4100
|
+
* Gets an array of currently active (focused) elements in the document and shadow DOM.
|
|
4101
|
+
* @returns {Array<HTMLElement>} An array of focusable elements within the container.
|
|
4102
|
+
* @private
|
|
4103
|
+
*/
|
|
4104
|
+
_getActiveElements() {
|
|
4105
|
+
// Get the active element(s) in the document and shadow root
|
|
4106
|
+
// This will include the active element in the shadow DOM if it exists
|
|
4107
|
+
// Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
|
|
4108
|
+
let { activeElement } = document;
|
|
4109
|
+
const actives = [activeElement];
|
|
4110
|
+
while (activeElement?.shadowRoot?.activeElement) {
|
|
4111
|
+
actives.push(activeElement.shadowRoot.activeElement);
|
|
4112
|
+
activeElement = activeElement.shadowRoot.activeElement;
|
|
4113
|
+
}
|
|
4114
|
+
return actives;
|
|
4115
|
+
}
|
|
4116
|
+
|
|
4117
|
+
/**
|
|
4118
|
+
* Gets the next focus index based on the current index and focusable elements.
|
|
4119
|
+
* @param {number} currentIndex The current index of the focused element.
|
|
4120
|
+
* @param {Array<HTMLElement>} focusables The array of focusable elements.
|
|
4121
|
+
* @returns {number|null} The next focus index or null if not determined.
|
|
4122
|
+
*/
|
|
4123
|
+
_getNextFocusIndex(currentIndex, focusables, actives) {
|
|
4124
|
+
if (this.controlTabOrder) {
|
|
4125
|
+
// Calculate the new index based on the current index and tab direction
|
|
4126
|
+
let newFocusIndex =
|
|
4127
|
+
currentIndex + (this.tabDirection === "forward" ? 1 : -1);
|
|
4128
|
+
|
|
4129
|
+
// Wrap-around logic
|
|
4130
|
+
if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
|
|
4131
|
+
if (newFocusIndex >= focusables.length) newFocusIndex = 0;
|
|
4132
|
+
|
|
4133
|
+
// Early return with the new index
|
|
4134
|
+
return newFocusIndex;
|
|
4135
|
+
}
|
|
4136
|
+
|
|
4137
|
+
// Determine if we need to wrap
|
|
4138
|
+
const atFirst =
|
|
4139
|
+
actives.includes(focusables[0]) || actives.includes(this.container);
|
|
4140
|
+
const atLast = actives.includes(focusables[focusables.length - 1]);
|
|
4141
|
+
|
|
4142
|
+
// Only wrap if at the ends
|
|
4143
|
+
if (this.tabDirection === "backward" && atFirst) {
|
|
4144
|
+
return focusables.length - 1;
|
|
4145
|
+
}
|
|
4146
|
+
|
|
4147
|
+
if (this.tabDirection === "forward" && atLast) {
|
|
4148
|
+
return 0;
|
|
4149
|
+
}
|
|
4150
|
+
|
|
4151
|
+
// No wrap, so don't change focus, return early
|
|
4152
|
+
return null;
|
|
4153
|
+
}
|
|
4154
|
+
|
|
4155
|
+
/**
|
|
4156
|
+
* Handles the Tab key press event to manage focus within the container.
|
|
4157
|
+
* @param {KeyboardEvent} e The keyboard event triggered by the user.
|
|
4158
|
+
* @returns {void}
|
|
4159
|
+
*/
|
|
4160
|
+
_handleTabKey(e) {
|
|
4161
|
+
// Update the focusable elements
|
|
4162
|
+
const focusables = this._getFocusableElements();
|
|
4163
|
+
|
|
4164
|
+
// If there are no focusable elements, exit
|
|
4165
|
+
if (!focusables.length) return;
|
|
4166
|
+
|
|
4167
|
+
// Set the tab direction based on the key pressed
|
|
4168
|
+
this.tabDirection = e.shiftKey ? "backward" : "forward";
|
|
4169
|
+
|
|
4170
|
+
// Get the active elements that are currently focused
|
|
4171
|
+
const actives = this._getActiveElements();
|
|
4172
|
+
|
|
4173
|
+
// If we're at either end of the focusable elements, wrap around to the other end
|
|
4174
|
+
let focusIndex = focusables.findIndex((el) => actives.includes(el));
|
|
4175
|
+
|
|
4176
|
+
// Fallback if we have no focused element
|
|
4177
|
+
if (focusIndex === -1) focusIndex = 0;
|
|
4178
|
+
|
|
4179
|
+
// Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
|
|
4180
|
+
// Is null if no new focus index is determined
|
|
4181
|
+
const newFocusIndex = this._getNextFocusIndex(
|
|
4182
|
+
focusIndex,
|
|
4183
|
+
focusables,
|
|
4184
|
+
actives,
|
|
4185
|
+
);
|
|
4186
|
+
|
|
4187
|
+
// If we have a new focus index, set focus to that element
|
|
4188
|
+
if (newFocusIndex !== null) {
|
|
4189
|
+
e.preventDefault();
|
|
4190
|
+
focusables[newFocusIndex].focus();
|
|
4191
|
+
}
|
|
4192
|
+
}
|
|
4193
|
+
|
|
4194
|
+
/**
|
|
4195
|
+
* Catches the keydown event
|
|
4196
|
+
* @param {KeyboardEvent} e The keyboard event triggered by user interaction.
|
|
4197
|
+
* @private
|
|
4198
|
+
*/
|
|
4199
|
+
_onKeydown = (e) => {
|
|
4200
|
+
// Handle tab
|
|
4201
|
+
if (e.key === "Tab") this._handleTabKey(e);
|
|
4202
|
+
};
|
|
4203
|
+
|
|
4204
|
+
/**
|
|
4205
|
+
* Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
|
|
4206
|
+
* Returns a unique, ordered array of elements that can receive focus.
|
|
4207
|
+
*
|
|
4208
|
+
* @returns {Array<HTMLElement>} An array of focusable elements within the container.
|
|
4209
|
+
* @private
|
|
4210
|
+
*/
|
|
4211
|
+
_getFocusableElements() {
|
|
4212
|
+
// Use the imported utility function to get focusable elements
|
|
4213
|
+
const elements = getFocusableElements(this.container);
|
|
4214
|
+
|
|
4215
|
+
// Return the elements found
|
|
4216
|
+
return elements;
|
|
4217
|
+
}
|
|
4218
|
+
|
|
4219
|
+
/**
|
|
4220
|
+
* Moves focus to the first focusable element within the container.
|
|
4221
|
+
* Useful for setting initial focus when activating the focus trap.
|
|
4222
|
+
*/
|
|
4223
|
+
focusFirstElement() {
|
|
4224
|
+
const focusables = this._getFocusableElements();
|
|
4225
|
+
if (focusables.length) focusables[0].focus();
|
|
4226
|
+
}
|
|
4227
|
+
|
|
4228
|
+
/**
|
|
4229
|
+
* Moves focus to the last focusable element within the container.
|
|
4230
|
+
* Useful for setting focus when deactivating or cycling focus in reverse.
|
|
4231
|
+
*/
|
|
4232
|
+
focusLastElement() {
|
|
4233
|
+
const focusables = this._getFocusableElements();
|
|
4234
|
+
if (focusables.length) focusables[focusables.length - 1].focus();
|
|
4235
|
+
}
|
|
4236
|
+
|
|
4237
|
+
/**
|
|
4238
|
+
* Removes event listeners and attributes added by the focus trap.
|
|
4239
|
+
* Call this method to clean up when the focus trap is no longer needed.
|
|
4240
|
+
*/
|
|
4241
|
+
disconnect() {
|
|
4242
|
+
if (this.container.hasAttribute("data-focus-trap-container")) {
|
|
4243
|
+
this.container.removeAttribute("data-focus-trap-container");
|
|
4244
|
+
}
|
|
4245
|
+
|
|
4246
|
+
this.container.removeEventListener("keydown", this._onKeydown);
|
|
4247
|
+
}
|
|
4248
|
+
}
|
|
4249
|
+
|
|
4085
4250
|
// Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
|
|
4086
4251
|
// See LICENSE in the project root for license information.
|
|
4087
4252
|
|
|
@@ -4579,7 +4744,7 @@ class AuroDropdownBib extends i$2 {
|
|
|
4579
4744
|
classes[`shape-${this.shape}`] = true;
|
|
4580
4745
|
|
|
4581
4746
|
return u$4`
|
|
4582
|
-
<dialog
|
|
4747
|
+
<dialog class="${e$2(classes)}" part="bibContainer" role="${o(this.dialogRole)}" aria-labelledby="${o(this.dialogLabel ? 'dialogLabel' : undefined)}">
|
|
4583
4748
|
${this.dialogLabel ? u$4`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
|
|
4584
4749
|
<slot></slot>
|
|
4585
4750
|
<span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
|
|
@@ -4830,7 +4995,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
|
|
|
4830
4995
|
}
|
|
4831
4996
|
};
|
|
4832
4997
|
|
|
4833
|
-
var formkitVersion$1 = '
|
|
4998
|
+
var formkitVersion$1 = '202607092329';
|
|
4834
4999
|
|
|
4835
5000
|
class AuroElement extends i$2 {
|
|
4836
5001
|
static get properties() {
|
|
@@ -5584,10 +5749,7 @@ class AuroDropdown extends AuroElement {
|
|
|
5584
5749
|
}
|
|
5585
5750
|
|
|
5586
5751
|
|
|
5587
|
-
|
|
5588
|
-
// — restoring to the trigger would trap the user on this dropdown, forcing
|
|
5589
|
-
// an extra Tab to move on. Escape and outside-click still restore.
|
|
5590
|
-
if (!this.isPopoverVisible && eventType !== "focusloss") {
|
|
5752
|
+
if (!this.isPopoverVisible) {
|
|
5591
5753
|
// wait til the bib gets fully closed and rendered
|
|
5592
5754
|
setTimeout(() => {
|
|
5593
5755
|
// Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
|
|
@@ -5817,16 +5979,15 @@ class AuroDropdown extends AuroElement {
|
|
|
5817
5979
|
}
|
|
5818
5980
|
});
|
|
5819
5981
|
} else {
|
|
5820
|
-
// Normal desktop
|
|
5821
|
-
//
|
|
5822
|
-
//
|
|
5823
|
-
//
|
|
5824
|
-
//
|
|
5825
|
-
|
|
5982
|
+
// Normal desktop: use FocusTrap on the bib element.
|
|
5983
|
+
// Defer focusFirstElement to the next frame because the popover
|
|
5984
|
+
// is positioned asynchronously by Floating UI — calling focus()
|
|
5985
|
+
// synchronously here would target elements with zero dimensions
|
|
5986
|
+
// and the focus call would be silently ignored.
|
|
5987
|
+
this.focusTrap = new FocusTrap(this.bibContent);
|
|
5826
5988
|
requestAnimationFrame(() => {
|
|
5827
|
-
|
|
5828
|
-
|
|
5829
|
-
focusables[0].focus();
|
|
5989
|
+
if (this.focusTrap) {
|
|
5990
|
+
this.focusTrap.focusFirstElement();
|
|
5830
5991
|
}
|
|
5831
5992
|
});
|
|
5832
5993
|
}
|
|
@@ -6873,7 +7034,7 @@ class AuroHelpText extends i$2 {
|
|
|
6873
7034
|
}
|
|
6874
7035
|
}
|
|
6875
7036
|
|
|
6876
|
-
var formkitVersion = '
|
|
7037
|
+
var formkitVersion = '202607092329';
|
|
6877
7038
|
|
|
6878
7039
|
var styleCss$2 = i$5`.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}`;
|
|
6879
7040
|
|
|
@@ -3379,40 +3379,12 @@ class AuroFloatingUI {
|
|
|
3379
3379
|
return;
|
|
3380
3380
|
}
|
|
3381
3381
|
|
|
3382
|
-
// Chrome-specific: during popover top-layer promotion after a click on a
|
|
3383
|
-
// slotted focusable, :focus-within can briefly evaluate false while the
|
|
3384
|
-
// active element is still structurally inside the trigger/bib. Fall back
|
|
3385
|
-
// to a shadow-piercing ancestry walk from the deep active element before
|
|
3386
|
-
// treating this as a real focus loss.
|
|
3387
|
-
try {
|
|
3388
|
-
let active = document.activeElement;
|
|
3389
|
-
while (active && active.shadowRoot && active.shadowRoot.activeElement) {
|
|
3390
|
-
active = active.shadowRoot.activeElement;
|
|
3391
|
-
}
|
|
3392
|
-
const targets = [element, element.trigger, element.bib].filter(Boolean);
|
|
3393
|
-
let node = active;
|
|
3394
|
-
while (node) {
|
|
3395
|
-
if (targets.includes(node)) {
|
|
3396
|
-
return;
|
|
3397
|
-
}
|
|
3398
|
-
node =
|
|
3399
|
-
node.parentElement ||
|
|
3400
|
-
(node.getRootNode && node.getRootNode().host) ||
|
|
3401
|
-
null;
|
|
3402
|
-
}
|
|
3403
|
-
} catch (e) {
|
|
3404
|
-
// Defensive: fall through to the existing close path if traversal fails.
|
|
3405
|
-
}
|
|
3406
|
-
|
|
3407
3382
|
// if fullscreen bib is in fullscreen mode, do not close
|
|
3408
3383
|
if (element.bib.hasAttribute("isfullscreen")) {
|
|
3409
3384
|
return;
|
|
3410
3385
|
}
|
|
3411
3386
|
|
|
3412
|
-
|
|
3413
|
-
// Escape keydown close. Consumers use this to decide whether to restore
|
|
3414
|
-
// focus to the trigger (Escape) or let it advance naturally (Tab).
|
|
3415
|
-
this.hideBib("focusloss");
|
|
3387
|
+
this.hideBib("keydown");
|
|
3416
3388
|
}
|
|
3417
3389
|
|
|
3418
3390
|
setupHideHandlers() {
|
|
@@ -4082,6 +4054,199 @@ function getFocusableElements(container) {
|
|
|
4082
4054
|
return tabIndexedUniqueElements;
|
|
4083
4055
|
}
|
|
4084
4056
|
|
|
4057
|
+
/**
|
|
4058
|
+
* FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
|
|
4059
|
+
* It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
|
|
4060
|
+
*/
|
|
4061
|
+
class FocusTrap {
|
|
4062
|
+
/**
|
|
4063
|
+
* Creates a new FocusTrap instance for the given container element.
|
|
4064
|
+
* Initializes event listeners and prepares the container for focus management.
|
|
4065
|
+
*
|
|
4066
|
+
* @param {HTMLElement} container The DOM element to trap focus within.
|
|
4067
|
+
* @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
|
|
4068
|
+
* @throws {Error} If the provided container is not a valid HTMLElement.
|
|
4069
|
+
*/
|
|
4070
|
+
constructor(container, controlTabOrder = false) {
|
|
4071
|
+
if (!container || !(container instanceof HTMLElement)) {
|
|
4072
|
+
throw new Error("FocusTrap requires a valid HTMLElement.");
|
|
4073
|
+
}
|
|
4074
|
+
|
|
4075
|
+
this.container = container;
|
|
4076
|
+
this.tabDirection = "forward"; // or 'backward';
|
|
4077
|
+
this.controlTabOrder = controlTabOrder;
|
|
4078
|
+
|
|
4079
|
+
this._init();
|
|
4080
|
+
}
|
|
4081
|
+
|
|
4082
|
+
/**
|
|
4083
|
+
* Initializes the focus trap by setting up event listeners and attributes on the container.
|
|
4084
|
+
* Prepares the container for focus management, including support for shadow DOM and inert attributes.
|
|
4085
|
+
*
|
|
4086
|
+
* @private
|
|
4087
|
+
*/
|
|
4088
|
+
_init() {
|
|
4089
|
+
// Add inert attribute to prevent focusing programmatically as well (if supported)
|
|
4090
|
+
if ("inert" in HTMLElement.prototype) {
|
|
4091
|
+
this.container.inert = false; // Ensure the container isn't inert
|
|
4092
|
+
this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
|
|
4093
|
+
}
|
|
4094
|
+
|
|
4095
|
+
// Track tab direction
|
|
4096
|
+
this.container.addEventListener("keydown", this._onKeydown);
|
|
4097
|
+
}
|
|
4098
|
+
|
|
4099
|
+
/**
|
|
4100
|
+
* Gets an array of currently active (focused) elements in the document and shadow DOM.
|
|
4101
|
+
* @returns {Array<HTMLElement>} An array of focusable elements within the container.
|
|
4102
|
+
* @private
|
|
4103
|
+
*/
|
|
4104
|
+
_getActiveElements() {
|
|
4105
|
+
// Get the active element(s) in the document and shadow root
|
|
4106
|
+
// This will include the active element in the shadow DOM if it exists
|
|
4107
|
+
// Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
|
|
4108
|
+
let { activeElement } = document;
|
|
4109
|
+
const actives = [activeElement];
|
|
4110
|
+
while (activeElement?.shadowRoot?.activeElement) {
|
|
4111
|
+
actives.push(activeElement.shadowRoot.activeElement);
|
|
4112
|
+
activeElement = activeElement.shadowRoot.activeElement;
|
|
4113
|
+
}
|
|
4114
|
+
return actives;
|
|
4115
|
+
}
|
|
4116
|
+
|
|
4117
|
+
/**
|
|
4118
|
+
* Gets the next focus index based on the current index and focusable elements.
|
|
4119
|
+
* @param {number} currentIndex The current index of the focused element.
|
|
4120
|
+
* @param {Array<HTMLElement>} focusables The array of focusable elements.
|
|
4121
|
+
* @returns {number|null} The next focus index or null if not determined.
|
|
4122
|
+
*/
|
|
4123
|
+
_getNextFocusIndex(currentIndex, focusables, actives) {
|
|
4124
|
+
if (this.controlTabOrder) {
|
|
4125
|
+
// Calculate the new index based on the current index and tab direction
|
|
4126
|
+
let newFocusIndex =
|
|
4127
|
+
currentIndex + (this.tabDirection === "forward" ? 1 : -1);
|
|
4128
|
+
|
|
4129
|
+
// Wrap-around logic
|
|
4130
|
+
if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
|
|
4131
|
+
if (newFocusIndex >= focusables.length) newFocusIndex = 0;
|
|
4132
|
+
|
|
4133
|
+
// Early return with the new index
|
|
4134
|
+
return newFocusIndex;
|
|
4135
|
+
}
|
|
4136
|
+
|
|
4137
|
+
// Determine if we need to wrap
|
|
4138
|
+
const atFirst =
|
|
4139
|
+
actives.includes(focusables[0]) || actives.includes(this.container);
|
|
4140
|
+
const atLast = actives.includes(focusables[focusables.length - 1]);
|
|
4141
|
+
|
|
4142
|
+
// Only wrap if at the ends
|
|
4143
|
+
if (this.tabDirection === "backward" && atFirst) {
|
|
4144
|
+
return focusables.length - 1;
|
|
4145
|
+
}
|
|
4146
|
+
|
|
4147
|
+
if (this.tabDirection === "forward" && atLast) {
|
|
4148
|
+
return 0;
|
|
4149
|
+
}
|
|
4150
|
+
|
|
4151
|
+
// No wrap, so don't change focus, return early
|
|
4152
|
+
return null;
|
|
4153
|
+
}
|
|
4154
|
+
|
|
4155
|
+
/**
|
|
4156
|
+
* Handles the Tab key press event to manage focus within the container.
|
|
4157
|
+
* @param {KeyboardEvent} e The keyboard event triggered by the user.
|
|
4158
|
+
* @returns {void}
|
|
4159
|
+
*/
|
|
4160
|
+
_handleTabKey(e) {
|
|
4161
|
+
// Update the focusable elements
|
|
4162
|
+
const focusables = this._getFocusableElements();
|
|
4163
|
+
|
|
4164
|
+
// If there are no focusable elements, exit
|
|
4165
|
+
if (!focusables.length) return;
|
|
4166
|
+
|
|
4167
|
+
// Set the tab direction based on the key pressed
|
|
4168
|
+
this.tabDirection = e.shiftKey ? "backward" : "forward";
|
|
4169
|
+
|
|
4170
|
+
// Get the active elements that are currently focused
|
|
4171
|
+
const actives = this._getActiveElements();
|
|
4172
|
+
|
|
4173
|
+
// If we're at either end of the focusable elements, wrap around to the other end
|
|
4174
|
+
let focusIndex = focusables.findIndex((el) => actives.includes(el));
|
|
4175
|
+
|
|
4176
|
+
// Fallback if we have no focused element
|
|
4177
|
+
if (focusIndex === -1) focusIndex = 0;
|
|
4178
|
+
|
|
4179
|
+
// Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
|
|
4180
|
+
// Is null if no new focus index is determined
|
|
4181
|
+
const newFocusIndex = this._getNextFocusIndex(
|
|
4182
|
+
focusIndex,
|
|
4183
|
+
focusables,
|
|
4184
|
+
actives,
|
|
4185
|
+
);
|
|
4186
|
+
|
|
4187
|
+
// If we have a new focus index, set focus to that element
|
|
4188
|
+
if (newFocusIndex !== null) {
|
|
4189
|
+
e.preventDefault();
|
|
4190
|
+
focusables[newFocusIndex].focus();
|
|
4191
|
+
}
|
|
4192
|
+
}
|
|
4193
|
+
|
|
4194
|
+
/**
|
|
4195
|
+
* Catches the keydown event
|
|
4196
|
+
* @param {KeyboardEvent} e The keyboard event triggered by user interaction.
|
|
4197
|
+
* @private
|
|
4198
|
+
*/
|
|
4199
|
+
_onKeydown = (e) => {
|
|
4200
|
+
// Handle tab
|
|
4201
|
+
if (e.key === "Tab") this._handleTabKey(e);
|
|
4202
|
+
};
|
|
4203
|
+
|
|
4204
|
+
/**
|
|
4205
|
+
* Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
|
|
4206
|
+
* Returns a unique, ordered array of elements that can receive focus.
|
|
4207
|
+
*
|
|
4208
|
+
* @returns {Array<HTMLElement>} An array of focusable elements within the container.
|
|
4209
|
+
* @private
|
|
4210
|
+
*/
|
|
4211
|
+
_getFocusableElements() {
|
|
4212
|
+
// Use the imported utility function to get focusable elements
|
|
4213
|
+
const elements = getFocusableElements(this.container);
|
|
4214
|
+
|
|
4215
|
+
// Return the elements found
|
|
4216
|
+
return elements;
|
|
4217
|
+
}
|
|
4218
|
+
|
|
4219
|
+
/**
|
|
4220
|
+
* Moves focus to the first focusable element within the container.
|
|
4221
|
+
* Useful for setting initial focus when activating the focus trap.
|
|
4222
|
+
*/
|
|
4223
|
+
focusFirstElement() {
|
|
4224
|
+
const focusables = this._getFocusableElements();
|
|
4225
|
+
if (focusables.length) focusables[0].focus();
|
|
4226
|
+
}
|
|
4227
|
+
|
|
4228
|
+
/**
|
|
4229
|
+
* Moves focus to the last focusable element within the container.
|
|
4230
|
+
* Useful for setting focus when deactivating or cycling focus in reverse.
|
|
4231
|
+
*/
|
|
4232
|
+
focusLastElement() {
|
|
4233
|
+
const focusables = this._getFocusableElements();
|
|
4234
|
+
if (focusables.length) focusables[focusables.length - 1].focus();
|
|
4235
|
+
}
|
|
4236
|
+
|
|
4237
|
+
/**
|
|
4238
|
+
* Removes event listeners and attributes added by the focus trap.
|
|
4239
|
+
* Call this method to clean up when the focus trap is no longer needed.
|
|
4240
|
+
*/
|
|
4241
|
+
disconnect() {
|
|
4242
|
+
if (this.container.hasAttribute("data-focus-trap-container")) {
|
|
4243
|
+
this.container.removeAttribute("data-focus-trap-container");
|
|
4244
|
+
}
|
|
4245
|
+
|
|
4246
|
+
this.container.removeEventListener("keydown", this._onKeydown);
|
|
4247
|
+
}
|
|
4248
|
+
}
|
|
4249
|
+
|
|
4085
4250
|
// Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
|
|
4086
4251
|
// See LICENSE in the project root for license information.
|
|
4087
4252
|
|
|
@@ -4579,7 +4744,7 @@ class AuroDropdownBib extends i$2 {
|
|
|
4579
4744
|
classes[`shape-${this.shape}`] = true;
|
|
4580
4745
|
|
|
4581
4746
|
return u$4`
|
|
4582
|
-
<dialog
|
|
4747
|
+
<dialog class="${e$2(classes)}" part="bibContainer" role="${o(this.dialogRole)}" aria-labelledby="${o(this.dialogLabel ? 'dialogLabel' : undefined)}">
|
|
4583
4748
|
${this.dialogLabel ? u$4`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
|
|
4584
4749
|
<slot></slot>
|
|
4585
4750
|
<span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
|
|
@@ -4830,7 +4995,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
|
|
|
4830
4995
|
}
|
|
4831
4996
|
};
|
|
4832
4997
|
|
|
4833
|
-
var formkitVersion$1 = '
|
|
4998
|
+
var formkitVersion$1 = '202607092329';
|
|
4834
4999
|
|
|
4835
5000
|
class AuroElement extends i$2 {
|
|
4836
5001
|
static get properties() {
|
|
@@ -5584,10 +5749,7 @@ class AuroDropdown extends AuroElement {
|
|
|
5584
5749
|
}
|
|
5585
5750
|
|
|
5586
5751
|
|
|
5587
|
-
|
|
5588
|
-
// — restoring to the trigger would trap the user on this dropdown, forcing
|
|
5589
|
-
// an extra Tab to move on. Escape and outside-click still restore.
|
|
5590
|
-
if (!this.isPopoverVisible && eventType !== "focusloss") {
|
|
5752
|
+
if (!this.isPopoverVisible) {
|
|
5591
5753
|
// wait til the bib gets fully closed and rendered
|
|
5592
5754
|
setTimeout(() => {
|
|
5593
5755
|
// Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
|
|
@@ -5817,16 +5979,15 @@ class AuroDropdown extends AuroElement {
|
|
|
5817
5979
|
}
|
|
5818
5980
|
});
|
|
5819
5981
|
} else {
|
|
5820
|
-
// Normal desktop
|
|
5821
|
-
//
|
|
5822
|
-
//
|
|
5823
|
-
//
|
|
5824
|
-
//
|
|
5825
|
-
|
|
5982
|
+
// Normal desktop: use FocusTrap on the bib element.
|
|
5983
|
+
// Defer focusFirstElement to the next frame because the popover
|
|
5984
|
+
// is positioned asynchronously by Floating UI — calling focus()
|
|
5985
|
+
// synchronously here would target elements with zero dimensions
|
|
5986
|
+
// and the focus call would be silently ignored.
|
|
5987
|
+
this.focusTrap = new FocusTrap(this.bibContent);
|
|
5826
5988
|
requestAnimationFrame(() => {
|
|
5827
|
-
|
|
5828
|
-
|
|
5829
|
-
focusables[0].focus();
|
|
5989
|
+
if (this.focusTrap) {
|
|
5990
|
+
this.focusTrap.focusFirstElement();
|
|
5830
5991
|
}
|
|
5831
5992
|
});
|
|
5832
5993
|
}
|
|
@@ -6873,7 +7034,7 @@ class AuroHelpText extends i$2 {
|
|
|
6873
7034
|
}
|
|
6874
7035
|
}
|
|
6875
7036
|
|
|
6876
|
-
var formkitVersion = '
|
|
7037
|
+
var formkitVersion = '202607092329';
|
|
6877
7038
|
|
|
6878
7039
|
var styleCss$2 = i$5`.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}`;
|
|
6879
7040
|
|