@aurodesignsystem-dev/auro-formkit 0.0.0-pr1608.0 → 0.0.0-pr1608.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/checkbox/demo/accessibility.md +15 -4
- package/components/checkbox/demo/customize.min.js +25 -10
- package/components/checkbox/demo/getting-started.min.js +25 -10
- package/components/checkbox/demo/index.min.js +25 -10
- package/components/checkbox/dist/auro-checkbox-group.d.ts +9 -0
- package/components/checkbox/dist/index.js +25 -10
- package/components/checkbox/dist/registered.js +25 -10
- package/components/combobox/demo/customize.min.js +46 -4
- package/components/combobox/demo/getting-started.min.js +46 -4
- package/components/combobox/demo/index.min.js +46 -4
- package/components/combobox/dist/index.js +46 -4
- package/components/combobox/dist/registered.js +46 -4
- package/components/counter/demo/customize.min.js +339 -23
- package/components/counter/demo/getting-started.min.js +339 -23
- package/components/counter/demo/index.min.js +339 -23
- package/components/counter/dist/counterGroupKeyboardStrategy.d.ts +1 -0
- package/components/counter/dist/index.js +339 -23
- package/components/counter/dist/registered.js +339 -23
- package/components/datepicker/demo/customize.min.js +46 -4
- package/components/datepicker/demo/getting-started.min.js +46 -4
- package/components/datepicker/demo/index.min.js +46 -4
- package/components/datepicker/dist/index.js +46 -4
- package/components/datepicker/dist/registered.js +46 -4
- package/components/dropdown/demo/customize.min.js +44 -2
- package/components/dropdown/demo/getting-started.min.js +45 -3
- package/components/dropdown/demo/index.min.js +44 -2
- package/components/dropdown/dist/index.js +44 -2
- package/components/dropdown/dist/registered.js +44 -2
- package/components/form/demo/customize.min.js +527 -57
- package/components/form/demo/getting-started.min.js +527 -57
- package/components/form/demo/index.min.js +527 -57
- package/components/form/demo/registerDemoDeps.min.js +527 -57
- 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/accessibility.md +13 -4
- package/components/radio/demo/customize.min.js +25 -12
- package/components/radio/demo/getting-started.min.js +25 -12
- package/components/radio/demo/index.min.js +25 -12
- package/components/radio/dist/auro-radio-group.d.ts +9 -0
- package/components/radio/dist/index.js +25 -12
- package/components/radio/dist/registered.js +25 -12
- package/components/select/demo/customize.min.js +45 -3
- package/components/select/demo/getting-started.min.js +45 -3
- package/components/select/demo/index.min.js +45 -3
- package/components/select/dist/index.js +45 -3
- package/components/select/dist/registered.js +45 -3
- package/custom-elements.json +1507 -1485
- package/package.json +3 -3
|
@@ -1077,7 +1077,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
|
|
|
1077
1077
|
}
|
|
1078
1078
|
};
|
|
1079
1079
|
|
|
1080
|
-
var formkitVersion$1 = '
|
|
1080
|
+
var formkitVersion$1 = '202609022217';
|
|
1081
1081
|
|
|
1082
1082
|
// Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
|
|
1083
1083
|
// See LICENSE in the project root for license information.
|
|
@@ -3314,6 +3314,48 @@ const computePosition = (reference, floating, options) => {
|
|
|
3314
3314
|
});
|
|
3315
3315
|
};
|
|
3316
3316
|
|
|
3317
|
+
/**
|
|
3318
|
+
* Generates a v4 UUID with a three-tier fallback for insecure contexts.
|
|
3319
|
+
*
|
|
3320
|
+
* Tier 1 (secure contexts): crypto.randomUUID() — native, fully random.
|
|
3321
|
+
* Tier 2 (insecure contexts): crypto.getRandomValues() — available on all
|
|
3322
|
+
* modern browsers regardless of secure-context status.
|
|
3323
|
+
* Tier 3 (last resort, no crypto API): new Date().getTime() — lower entropy,
|
|
3324
|
+
* but sufficient for element IDs where collision risk is negligible.
|
|
3325
|
+
*
|
|
3326
|
+
* See: https://w3c.github.io/webcrypto/#dom-crypto-randomuuid (secure-context restriction)
|
|
3327
|
+
*/
|
|
3328
|
+
function generateUUID() {
|
|
3329
|
+
let uuid;
|
|
3330
|
+
|
|
3331
|
+
if (
|
|
3332
|
+
typeof crypto !== "undefined" &&
|
|
3333
|
+
typeof crypto.randomUUID === "function"
|
|
3334
|
+
) {
|
|
3335
|
+
uuid = crypto.randomUUID();
|
|
3336
|
+
} else if (
|
|
3337
|
+
typeof crypto !== "undefined" &&
|
|
3338
|
+
typeof crypto.getRandomValues === "function"
|
|
3339
|
+
) {
|
|
3340
|
+
const bytes = new Uint8Array(16);
|
|
3341
|
+
crypto.getRandomValues(bytes);
|
|
3342
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
3343
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
3344
|
+
const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0"));
|
|
3345
|
+
uuid = `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
3346
|
+
} else {
|
|
3347
|
+
let d = new Date().getTime();
|
|
3348
|
+
uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
3349
|
+
const r = (d % 16) | 0;
|
|
3350
|
+
d = (d - r) / 16 || new Date().getTime();
|
|
3351
|
+
return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
|
|
3352
|
+
});
|
|
3353
|
+
}
|
|
3354
|
+
|
|
3355
|
+
// CSS selectors require IDs starting with a letter; replace a leading digit with 'a'.
|
|
3356
|
+
return /^[0-9]/.test(uuid) ? `a${uuid.slice(1)}` : uuid;
|
|
3357
|
+
}
|
|
3358
|
+
|
|
3317
3359
|
/* eslint-disable line-comment-position, no-inline-comments */
|
|
3318
3360
|
|
|
3319
3361
|
|
|
@@ -4332,7 +4374,7 @@ class AuroFloatingUI {
|
|
|
4332
4374
|
|
|
4333
4375
|
this.id = element.getAttribute("id");
|
|
4334
4376
|
if (!this.id) {
|
|
4335
|
-
this.id =
|
|
4377
|
+
this.id = generateUUID();
|
|
4336
4378
|
element.setAttribute("id", this.id);
|
|
4337
4379
|
}
|
|
4338
4380
|
|
|
@@ -4416,7 +4458,7 @@ class AuroFloatingUI {
|
|
|
4416
4458
|
}
|
|
4417
4459
|
|
|
4418
4460
|
// Selectors for focusable elements
|
|
4419
|
-
const FOCUSABLE_SELECTORS = [
|
|
4461
|
+
const FOCUSABLE_SELECTORS$1 = [
|
|
4420
4462
|
"a[href]",
|
|
4421
4463
|
"button:not([disabled])",
|
|
4422
4464
|
"textarea:not([disabled])",
|
|
@@ -4430,7 +4472,7 @@ const FOCUSABLE_SELECTORS = [
|
|
|
4430
4472
|
];
|
|
4431
4473
|
|
|
4432
4474
|
// List of custom components that are known to be focusable
|
|
4433
|
-
const FOCUSABLE_COMPONENTS = [
|
|
4475
|
+
const FOCUSABLE_COMPONENTS$1 = [
|
|
4434
4476
|
"auro-checkbox",
|
|
4435
4477
|
"auro-radio",
|
|
4436
4478
|
"auro-dropdown",
|
|
@@ -4452,12 +4494,12 @@ const FOCUSABLE_COMPONENTS = [
|
|
|
4452
4494
|
* @param {HTMLElement} element The element to check for focusability.
|
|
4453
4495
|
* @returns {boolean} True if the element is a focusable custom component, false otherwise.
|
|
4454
4496
|
*/
|
|
4455
|
-
function isFocusableComponent(element) {
|
|
4497
|
+
function isFocusableComponent$1(element) {
|
|
4456
4498
|
const componentName = element.tagName.toLowerCase();
|
|
4457
4499
|
|
|
4458
4500
|
// Guard Clause: Element is a focusable component
|
|
4459
4501
|
if (
|
|
4460
|
-
!FOCUSABLE_COMPONENTS.some(
|
|
4502
|
+
!FOCUSABLE_COMPONENTS$1.some(
|
|
4461
4503
|
(name) => element.hasAttribute(name) || componentName === name,
|
|
4462
4504
|
)
|
|
4463
4505
|
)
|
|
@@ -4481,7 +4523,7 @@ function isFocusableComponent(element) {
|
|
|
4481
4523
|
* @param {HTMLElement} element The element whose tabindex to read.
|
|
4482
4524
|
* @returns {?number} The numeric tabindex or null if missing/invalid.
|
|
4483
4525
|
*/
|
|
4484
|
-
function getNumericTabIndex(element) {
|
|
4526
|
+
function getNumericTabIndex$1(element) {
|
|
4485
4527
|
const raw = element.getAttribute("tabindex");
|
|
4486
4528
|
if (raw == null) return null;
|
|
4487
4529
|
|
|
@@ -4497,7 +4539,7 @@ function getNumericTabIndex(element) {
|
|
|
4497
4539
|
* @param {HTMLElement} container The container to search within
|
|
4498
4540
|
* @returns {Array<HTMLElement>} An array of focusable elements within the container.
|
|
4499
4541
|
*/
|
|
4500
|
-
function getFocusableElements(container) {
|
|
4542
|
+
function getFocusableElements$1(container) {
|
|
4501
4543
|
// Get elements in DOM order by walking the tree
|
|
4502
4544
|
const orderedFocusableElements = [];
|
|
4503
4545
|
|
|
@@ -4506,7 +4548,7 @@ function getFocusableElements(container) {
|
|
|
4506
4548
|
// Check if current element is focusable
|
|
4507
4549
|
if (root.nodeType === Node.ELEMENT_NODE) {
|
|
4508
4550
|
// Check if this is a custom component that is focusable
|
|
4509
|
-
const isComponentFocusable = isFocusableComponent(root);
|
|
4551
|
+
const isComponentFocusable = isFocusableComponent$1(root);
|
|
4510
4552
|
|
|
4511
4553
|
if (isComponentFocusable) {
|
|
4512
4554
|
// Add the component itself as a focusable element and don't traverse its shadow DOM
|
|
@@ -4515,7 +4557,7 @@ function getFocusableElements(container) {
|
|
|
4515
4557
|
}
|
|
4516
4558
|
|
|
4517
4559
|
// Check if the element itself matches any selector
|
|
4518
|
-
for (const selector of FOCUSABLE_SELECTORS) {
|
|
4560
|
+
for (const selector of FOCUSABLE_SELECTORS$1) {
|
|
4519
4561
|
if (root.matches?.(selector)) {
|
|
4520
4562
|
orderedFocusableElements.push(root);
|
|
4521
4563
|
break; // Once we know it's focusable, no need to check other selectors
|
|
@@ -4569,20 +4611,20 @@ function getFocusableElements(container) {
|
|
|
4569
4611
|
|
|
4570
4612
|
// First extract elements with valid positive tabindex
|
|
4571
4613
|
const elementsWithTabindex = uniqueElements.filter((el) => {
|
|
4572
|
-
const tabindex = getNumericTabIndex(el);
|
|
4614
|
+
const tabindex = getNumericTabIndex$1(el);
|
|
4573
4615
|
return tabindex !== null && tabindex > 0;
|
|
4574
4616
|
});
|
|
4575
4617
|
|
|
4576
4618
|
// Sort these elements by their tabindex value
|
|
4577
4619
|
elementsWithTabindex.sort((a, b) => {
|
|
4578
|
-
const aIndex = getNumericTabIndex(a) ?? 0;
|
|
4579
|
-
const bIndex = getNumericTabIndex(b) ?? 0;
|
|
4620
|
+
const aIndex = getNumericTabIndex$1(a) ?? 0;
|
|
4621
|
+
const bIndex = getNumericTabIndex$1(b) ?? 0;
|
|
4580
4622
|
return aIndex - bIndex;
|
|
4581
4623
|
});
|
|
4582
4624
|
|
|
4583
4625
|
// Elements without tabindex (preserving their original order)
|
|
4584
4626
|
const elementsWithoutTabindex = uniqueElements.filter((el) => {
|
|
4585
|
-
const tabindex = getNumericTabIndex(el);
|
|
4627
|
+
const tabindex = getNumericTabIndex$1(el);
|
|
4586
4628
|
|
|
4587
4629
|
// Elements without tabindex or with tabindex of 0 stay in DOM order
|
|
4588
4630
|
return tabindex === null || tabindex === 0;
|
|
@@ -5377,7 +5419,7 @@ class AuroHelpText extends LitElement {
|
|
|
5377
5419
|
}
|
|
5378
5420
|
}
|
|
5379
5421
|
|
|
5380
|
-
var formkitVersion = '
|
|
5422
|
+
var formkitVersion = '202609022217';
|
|
5381
5423
|
|
|
5382
5424
|
/**
|
|
5383
5425
|
* AuroElement is the shared base class for layout-aware Auro form components.
|
|
@@ -5677,7 +5719,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
5677
5719
|
*/
|
|
5678
5720
|
focus() {
|
|
5679
5721
|
if (this.isPopoverVisible && this.bibContent) {
|
|
5680
|
-
const focusables = getFocusableElements(this.bibContent);
|
|
5722
|
+
const focusables = getFocusableElements$1(this.bibContent);
|
|
5681
5723
|
if (focusables.length > 0) {
|
|
5682
5724
|
focusables[0].focus();
|
|
5683
5725
|
}
|
|
@@ -5709,7 +5751,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
5709
5751
|
// wrappers like <div> containing a <button>). If none found, try
|
|
5710
5752
|
// focusing the element directly (works for custom elements like
|
|
5711
5753
|
// auro-input that have delegatesFocus or a custom focus() method).
|
|
5712
|
-
const descendants = getFocusableElements(el);
|
|
5754
|
+
const descendants = getFocusableElements$1(el);
|
|
5713
5755
|
if (descendants.length > 0) {
|
|
5714
5756
|
descendants[0].focus();
|
|
5715
5757
|
return;
|
|
@@ -5721,7 +5763,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
5721
5763
|
}
|
|
5722
5764
|
}
|
|
5723
5765
|
// Fallback: try DOM children (non-slotted content)
|
|
5724
|
-
const focusables = getFocusableElements(this.trigger);
|
|
5766
|
+
const focusables = getFocusableElements$1(this.trigger);
|
|
5725
5767
|
if (focusables.length > 0) {
|
|
5726
5768
|
focusables[0].focus();
|
|
5727
5769
|
}
|
|
@@ -6400,7 +6442,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
6400
6442
|
}
|
|
6401
6443
|
|
|
6402
6444
|
// Collect focusable elements from the bib content.
|
|
6403
|
-
const focusables = getFocusableElements(this.bibContent);
|
|
6445
|
+
const focusables = getFocusableElements$1(this.bibContent);
|
|
6404
6446
|
|
|
6405
6447
|
// Fallback: try from slotted content directly
|
|
6406
6448
|
if (!focusables.length) {
|
|
@@ -6409,7 +6451,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
6409
6451
|
|
|
6410
6452
|
for (const node of assignedNodes) {
|
|
6411
6453
|
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
6412
|
-
focusables.push(...getFocusableElements(node));
|
|
6454
|
+
focusables.push(...getFocusableElements$1(node));
|
|
6413
6455
|
}
|
|
6414
6456
|
}
|
|
6415
6457
|
}
|
|
@@ -6469,7 +6511,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
6469
6511
|
|
|
6470
6512
|
// Move initial focus into the bib content, matching FocusTrap behavior
|
|
6471
6513
|
requestAnimationFrame(() => {
|
|
6472
|
-
const focusables = getFocusableElements(this.bibContent);
|
|
6514
|
+
const focusables = getFocusableElements$1(this.bibContent);
|
|
6473
6515
|
if (focusables.length) {
|
|
6474
6516
|
focusables[0].focus();
|
|
6475
6517
|
}
|
|
@@ -6482,7 +6524,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
6482
6524
|
// popover asynchronously — a synchronous focus() would target
|
|
6483
6525
|
// zero-dimension elements and be silently ignored.
|
|
6484
6526
|
requestAnimationFrame(() => {
|
|
6485
|
-
const focusables = getFocusableElements(this.bibContent);
|
|
6527
|
+
const focusables = getFocusableElements$1(this.bibContent);
|
|
6486
6528
|
if (focusables.length) {
|
|
6487
6529
|
focusables[0].focus();
|
|
6488
6530
|
}
|
|
@@ -6700,7 +6742,7 @@ class AuroDropdown extends AuroElement$1 {
|
|
|
6700
6742
|
if (triggerContentNodes) {
|
|
6701
6743
|
|
|
6702
6744
|
// See if any of them are focusable elements
|
|
6703
|
-
this.triggerContentFocusable = triggerContentNodes.some((node) => getFocusableElements(node).length > 0);
|
|
6745
|
+
this.triggerContentFocusable = triggerContentNodes.some((node) => getFocusableElements$1(node).length > 0);
|
|
6704
6746
|
|
|
6705
6747
|
// If any of them are focusable elements
|
|
6706
6748
|
if (this.triggerContentFocusable) {
|
|
@@ -7462,9 +7504,241 @@ class AuroElement extends LitElement {
|
|
|
7462
7504
|
}
|
|
7463
7505
|
}
|
|
7464
7506
|
|
|
7507
|
+
// Selectors for focusable elements
|
|
7508
|
+
const FOCUSABLE_SELECTORS = [
|
|
7509
|
+
"a[href]",
|
|
7510
|
+
"button:not([disabled])",
|
|
7511
|
+
"textarea:not([disabled])",
|
|
7512
|
+
"input:not([disabled])",
|
|
7513
|
+
"select:not([disabled])",
|
|
7514
|
+
'[role="tab"]:not([disabled])',
|
|
7515
|
+
'[role="link"]:not([disabled])',
|
|
7516
|
+
'[role="button"]:not([disabled])',
|
|
7517
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
7518
|
+
'[contenteditable]:not([contenteditable="false"])',
|
|
7519
|
+
];
|
|
7520
|
+
|
|
7521
|
+
// List of custom components that are known to be focusable
|
|
7522
|
+
const FOCUSABLE_COMPONENTS = [
|
|
7523
|
+
"auro-checkbox",
|
|
7524
|
+
"auro-radio",
|
|
7525
|
+
"auro-dropdown",
|
|
7526
|
+
"auro-button",
|
|
7527
|
+
"auro-combobox",
|
|
7528
|
+
"auro-input",
|
|
7529
|
+
"auro-counter",
|
|
7530
|
+
// 'auro-menu', // Auro menu is not focusable by default, it uses a different interaction model
|
|
7531
|
+
"auro-select",
|
|
7532
|
+
"auro-datepicker",
|
|
7533
|
+
"auro-hyperlink",
|
|
7534
|
+
"auro-accordion",
|
|
7535
|
+
];
|
|
7536
|
+
|
|
7537
|
+
/**
|
|
7538
|
+
* Determines if a given element is a custom focusable component.
|
|
7539
|
+
* Returns true if the element matches a known focusable component and is not disabled.
|
|
7540
|
+
*
|
|
7541
|
+
* @param {HTMLElement} element The element to check for focusability.
|
|
7542
|
+
* @returns {boolean} True if the element is a focusable custom component, false otherwise.
|
|
7543
|
+
*/
|
|
7544
|
+
function isFocusableComponent(element) {
|
|
7545
|
+
const componentName = element.tagName.toLowerCase();
|
|
7546
|
+
|
|
7547
|
+
// Guard Clause: Element is a focusable component
|
|
7548
|
+
if (
|
|
7549
|
+
!FOCUSABLE_COMPONENTS.some(
|
|
7550
|
+
(name) => element.hasAttribute(name) || componentName === name,
|
|
7551
|
+
)
|
|
7552
|
+
)
|
|
7553
|
+
return false;
|
|
7554
|
+
|
|
7555
|
+
// Guard Clause: Element is not disabled
|
|
7556
|
+
if (element.hasAttribute("disabled")) return false;
|
|
7557
|
+
|
|
7558
|
+
// Guard Clause: The element is a hyperlink and has no href attribute
|
|
7559
|
+
if (componentName.match("hyperlink") && !element.hasAttribute("href"))
|
|
7560
|
+
return false;
|
|
7561
|
+
|
|
7562
|
+
// If all guard clauses pass, the element is a focusable component
|
|
7563
|
+
return true;
|
|
7564
|
+
}
|
|
7565
|
+
|
|
7566
|
+
/**
|
|
7567
|
+
* Safely get a numeric tabindex for an element.
|
|
7568
|
+
* Returns a number if the tabindex is a valid integer, otherwise null.
|
|
7569
|
+
*
|
|
7570
|
+
* @param {HTMLElement} element The element whose tabindex to read.
|
|
7571
|
+
* @returns {?number} The numeric tabindex or null if missing/invalid.
|
|
7572
|
+
*/
|
|
7573
|
+
function getNumericTabIndex(element) {
|
|
7574
|
+
const raw = element.getAttribute("tabindex");
|
|
7575
|
+
if (raw == null) return null;
|
|
7576
|
+
|
|
7577
|
+
const value = Number.parseInt(raw, 10);
|
|
7578
|
+
return Number.isNaN(value) ? null : value;
|
|
7579
|
+
}
|
|
7580
|
+
|
|
7581
|
+
/**
|
|
7582
|
+
* Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
|
|
7583
|
+
* Returns a unique, ordered array of elements that can receive focus.
|
|
7584
|
+
* Also sorts elements with tabindex first, preserving their order.
|
|
7585
|
+
*
|
|
7586
|
+
* @param {HTMLElement} container The container to search within
|
|
7587
|
+
* @returns {Array<HTMLElement>} An array of focusable elements within the container.
|
|
7588
|
+
*/
|
|
7589
|
+
function getFocusableElements(container) {
|
|
7590
|
+
// Get elements in DOM order by walking the tree
|
|
7591
|
+
const orderedFocusableElements = [];
|
|
7592
|
+
|
|
7593
|
+
// Define a recursive function to collect focusable elements in DOM order
|
|
7594
|
+
const collectFocusableElements = (root) => {
|
|
7595
|
+
// Check if current element is focusable
|
|
7596
|
+
if (root.nodeType === Node.ELEMENT_NODE) {
|
|
7597
|
+
// Check if this is a custom component that is focusable
|
|
7598
|
+
const isComponentFocusable = isFocusableComponent(root);
|
|
7599
|
+
|
|
7600
|
+
if (isComponentFocusable) {
|
|
7601
|
+
// Add the component itself as a focusable element and don't traverse its shadow DOM
|
|
7602
|
+
orderedFocusableElements.push(root);
|
|
7603
|
+
return; // Skip traversing inside this component
|
|
7604
|
+
}
|
|
7605
|
+
|
|
7606
|
+
// Check if the element itself matches any selector
|
|
7607
|
+
for (const selector of FOCUSABLE_SELECTORS) {
|
|
7608
|
+
if (root.matches?.(selector)) {
|
|
7609
|
+
orderedFocusableElements.push(root);
|
|
7610
|
+
break; // Once we know it's focusable, no need to check other selectors
|
|
7611
|
+
}
|
|
7612
|
+
}
|
|
7613
|
+
|
|
7614
|
+
// Process shadow DOM only for non-Auro components
|
|
7615
|
+
if (root.shadowRoot) {
|
|
7616
|
+
// Process shadow DOM children in order
|
|
7617
|
+
if (root.shadowRoot.children) {
|
|
7618
|
+
Array.from(root.shadowRoot.children).forEach((child) => {
|
|
7619
|
+
collectFocusableElements(child);
|
|
7620
|
+
});
|
|
7621
|
+
}
|
|
7622
|
+
}
|
|
7623
|
+
|
|
7624
|
+
// Process slots and their assigned nodes in order
|
|
7625
|
+
if (root.tagName === "SLOT") {
|
|
7626
|
+
const assignedNodes = root.assignedNodes({ flatten: true });
|
|
7627
|
+
for (const node of assignedNodes) {
|
|
7628
|
+
collectFocusableElements(node);
|
|
7629
|
+
}
|
|
7630
|
+
} else {
|
|
7631
|
+
// Process light DOM children in order
|
|
7632
|
+
if (root.children) {
|
|
7633
|
+
Array.from(root.children).forEach((child) => {
|
|
7634
|
+
collectFocusableElements(child);
|
|
7635
|
+
});
|
|
7636
|
+
}
|
|
7637
|
+
}
|
|
7638
|
+
}
|
|
7639
|
+
};
|
|
7640
|
+
|
|
7641
|
+
// Start the traversal from the container
|
|
7642
|
+
collectFocusableElements(container);
|
|
7643
|
+
|
|
7644
|
+
// Remove duplicates that might have been collected through different paths
|
|
7645
|
+
// while preserving order
|
|
7646
|
+
const uniqueElements = [];
|
|
7647
|
+
const seen = new Set();
|
|
7648
|
+
|
|
7649
|
+
for (const element of orderedFocusableElements) {
|
|
7650
|
+
if (!seen.has(element)) {
|
|
7651
|
+
seen.add(element);
|
|
7652
|
+
uniqueElements.push(element);
|
|
7653
|
+
}
|
|
7654
|
+
}
|
|
7655
|
+
|
|
7656
|
+
// Move tab-indexed elements to the front while preserving their order
|
|
7657
|
+
// This ensures that elements with tabindex are prioritized in the focus order
|
|
7658
|
+
|
|
7659
|
+
// First extract elements with valid positive tabindex
|
|
7660
|
+
const elementsWithTabindex = uniqueElements.filter((el) => {
|
|
7661
|
+
const tabindex = getNumericTabIndex(el);
|
|
7662
|
+
return tabindex !== null && tabindex > 0;
|
|
7663
|
+
});
|
|
7664
|
+
|
|
7665
|
+
// Sort these elements by their tabindex value
|
|
7666
|
+
elementsWithTabindex.sort((a, b) => {
|
|
7667
|
+
const aIndex = getNumericTabIndex(a) ?? 0;
|
|
7668
|
+
const bIndex = getNumericTabIndex(b) ?? 0;
|
|
7669
|
+
return aIndex - bIndex;
|
|
7670
|
+
});
|
|
7671
|
+
|
|
7672
|
+
// Elements without tabindex (preserving their original order)
|
|
7673
|
+
const elementsWithoutTabindex = uniqueElements.filter((el) => {
|
|
7674
|
+
const tabindex = getNumericTabIndex(el);
|
|
7675
|
+
|
|
7676
|
+
// Elements without tabindex or with tabindex of 0 stay in DOM order
|
|
7677
|
+
return tabindex === null || tabindex === 0;
|
|
7678
|
+
});
|
|
7679
|
+
|
|
7680
|
+
// Combine both arrays with tabindex elements first
|
|
7681
|
+
const tabIndexedUniqueElements = [
|
|
7682
|
+
...elementsWithTabindex,
|
|
7683
|
+
...elementsWithoutTabindex,
|
|
7684
|
+
];
|
|
7685
|
+
|
|
7686
|
+
return tabIndexedUniqueElements;
|
|
7687
|
+
}
|
|
7688
|
+
|
|
7465
7689
|
// Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
|
|
7466
7690
|
// See LICENSE in the project root for license information.
|
|
7467
7691
|
|
|
7692
|
+
|
|
7693
|
+
/**
|
|
7694
|
+
* Whether `el` is currently visible enough to receive focus. Prefers the
|
|
7695
|
+
* browser's `checkVisibility()`; otherwise combines a display/visibility check
|
|
7696
|
+
* with an ancestor-hidden probe that keeps position:fixed elements visible.
|
|
7697
|
+
* @param {Element} el - The element to test.
|
|
7698
|
+
* @returns {boolean}
|
|
7699
|
+
*/
|
|
7700
|
+
function isVisibleForFocus(el) {
|
|
7701
|
+
if (typeof el.checkVisibility === 'function') {
|
|
7702
|
+
return el.checkVisibility();
|
|
7703
|
+
}
|
|
7704
|
+
const style = el.ownerDocument.defaultView.getComputedStyle(el);
|
|
7705
|
+
if (style.display === 'none' || style.visibility === 'hidden') {
|
|
7706
|
+
return false;
|
|
7707
|
+
}
|
|
7708
|
+
return el.offsetParent !== null || style.position === 'fixed';
|
|
7709
|
+
}
|
|
7710
|
+
|
|
7711
|
+
/**
|
|
7712
|
+
* Return the tab stop that comes before the counter-group in page tab order,
|
|
7713
|
+
* skipping any hidden entries the walker doesn't filter itself. The group host
|
|
7714
|
+
* itself is not a tab stop; its focusables (the internal dropdown and the
|
|
7715
|
+
* counters) are, so anchor the search on the group's earliest focusable.
|
|
7716
|
+
* @param {Element} component - The auro-counter-group host element.
|
|
7717
|
+
* @returns {Element|null}
|
|
7718
|
+
*/
|
|
7719
|
+
function getPreviousTabStop(component) {
|
|
7720
|
+
const tabStops = getFocusableElements(component.ownerDocument.body);
|
|
7721
|
+
const counters = component.counters || [];
|
|
7722
|
+
const owned = [
|
|
7723
|
+
component,
|
|
7724
|
+
component.dropdown,
|
|
7725
|
+
...counters
|
|
7726
|
+
].filter(Boolean);
|
|
7727
|
+
let groupStart = tabStops.length;
|
|
7728
|
+
owned.forEach((node) => {
|
|
7729
|
+
const index = tabStops.indexOf(node);
|
|
7730
|
+
if (index >= 0 && index < groupStart) {
|
|
7731
|
+
groupStart = index;
|
|
7732
|
+
}
|
|
7733
|
+
});
|
|
7734
|
+
for (let index = groupStart - 1; index >= 0; index -= 1) {
|
|
7735
|
+
if (isVisibleForFocus(tabStops[index])) {
|
|
7736
|
+
return tabStops[index];
|
|
7737
|
+
}
|
|
7738
|
+
}
|
|
7739
|
+
return null;
|
|
7740
|
+
}
|
|
7741
|
+
|
|
7468
7742
|
const counterGroupKeyboardStrategy = {
|
|
7469
7743
|
Escape(component, evt) {
|
|
7470
7744
|
if (!component.dropdown || !component.dropdown.isPopoverVisible) {
|
|
@@ -7478,6 +7752,48 @@ const counterGroupKeyboardStrategy = {
|
|
|
7478
7752
|
|
|
7479
7753
|
component.dropdown.hide();
|
|
7480
7754
|
},
|
|
7755
|
+
|
|
7756
|
+
Tab(component, evt, ctx) {
|
|
7757
|
+
// Forward Tab already exits past the bib content and the focusout handler
|
|
7758
|
+
// closes the bib. Fullscreen relies on the dialog's native focus trapping.
|
|
7759
|
+
if (!ctx.isExpanded || ctx.isModal || !evt.shiftKey) {
|
|
7760
|
+
return;
|
|
7761
|
+
}
|
|
7762
|
+
|
|
7763
|
+
// The trigger precedes the bib content in the flattened tab order, so a
|
|
7764
|
+
// native Shift+Tab off the first counter lands back on the trigger and
|
|
7765
|
+
// leaves the bib open. Only intercept when focus is on the first focusable
|
|
7766
|
+
// in the bib; otherwise let the browser move to the previous counter.
|
|
7767
|
+
// `composedPath()` reports the real event origin through every shadow
|
|
7768
|
+
// boundary, unlike `document.activeElement`, which retargets to the first
|
|
7769
|
+
// slotted counter and cannot tell the counters apart.
|
|
7770
|
+
const focusables = getFocusableElements(component.dropdown.bibContent);
|
|
7771
|
+
if (!focusables.length) {
|
|
7772
|
+
return;
|
|
7773
|
+
}
|
|
7774
|
+
|
|
7775
|
+
const path = evt.composedPath();
|
|
7776
|
+
const activeIndex = focusables.findIndex((el) => path.includes(el));
|
|
7777
|
+
if (activeIndex !== 0) {
|
|
7778
|
+
return;
|
|
7779
|
+
}
|
|
7780
|
+
|
|
7781
|
+
const previousTabStop = getPreviousTabStop(component);
|
|
7782
|
+
|
|
7783
|
+
// Always suppress the native Shift+Tab. Otherwise it fires against the bib
|
|
7784
|
+
// as it is torn down and lands focus on the trigger (which precedes the
|
|
7785
|
+
// first counter), re-opening the exact loop this handler prevents. When
|
|
7786
|
+
// nothing precedes the group, focus falls to the body instead of the
|
|
7787
|
+
// trigger, which reads as exiting the group backward.
|
|
7788
|
+
evt.preventDefault();
|
|
7789
|
+
component.hideBib();
|
|
7790
|
+
|
|
7791
|
+
if (!previousTabStop) {
|
|
7792
|
+
return;
|
|
7793
|
+
}
|
|
7794
|
+
|
|
7795
|
+
doubleRaf(() => previousTabStop.focus());
|
|
7796
|
+
},
|
|
7481
7797
|
};
|
|
7482
7798
|
|
|
7483
7799
|
/* eslint-disable lit/no-invalid-html, lit/binding-positions, max-lines, no-underscore-dangle, arrow-parens, no-confusing-arrow, curly, dot-location, no-inline-comments, line-comment-position,
|
|
@@ -13825,7 +13825,7 @@ class AuroBibtemplate extends i$1 {
|
|
|
13825
13825
|
}
|
|
13826
13826
|
}
|
|
13827
13827
|
|
|
13828
|
-
var formkitVersion$2 = '
|
|
13828
|
+
var formkitVersion$2 = '202609022217';
|
|
13829
13829
|
|
|
13830
13830
|
let l$1 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$5`${s$5(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$4 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$3=i$3`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
|
|
13831
13831
|
`,u$6=i$3`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
|
|
@@ -17630,6 +17630,48 @@ const computePosition = (reference, floating, options) => {
|
|
|
17630
17630
|
});
|
|
17631
17631
|
};
|
|
17632
17632
|
|
|
17633
|
+
/**
|
|
17634
|
+
* Generates a v4 UUID with a three-tier fallback for insecure contexts.
|
|
17635
|
+
*
|
|
17636
|
+
* Tier 1 (secure contexts): crypto.randomUUID() — native, fully random.
|
|
17637
|
+
* Tier 2 (insecure contexts): crypto.getRandomValues() — available on all
|
|
17638
|
+
* modern browsers regardless of secure-context status.
|
|
17639
|
+
* Tier 3 (last resort, no crypto API): new Date().getTime() — lower entropy,
|
|
17640
|
+
* but sufficient for element IDs where collision risk is negligible.
|
|
17641
|
+
*
|
|
17642
|
+
* See: https://w3c.github.io/webcrypto/#dom-crypto-randomuuid (secure-context restriction)
|
|
17643
|
+
*/
|
|
17644
|
+
function generateUUID() {
|
|
17645
|
+
let uuid;
|
|
17646
|
+
|
|
17647
|
+
if (
|
|
17648
|
+
typeof crypto !== "undefined" &&
|
|
17649
|
+
typeof crypto.randomUUID === "function"
|
|
17650
|
+
) {
|
|
17651
|
+
uuid = crypto.randomUUID();
|
|
17652
|
+
} else if (
|
|
17653
|
+
typeof crypto !== "undefined" &&
|
|
17654
|
+
typeof crypto.getRandomValues === "function"
|
|
17655
|
+
) {
|
|
17656
|
+
const bytes = new Uint8Array(16);
|
|
17657
|
+
crypto.getRandomValues(bytes);
|
|
17658
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
17659
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
17660
|
+
const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0"));
|
|
17661
|
+
uuid = `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
17662
|
+
} else {
|
|
17663
|
+
let d = new Date().getTime();
|
|
17664
|
+
uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
17665
|
+
const r = (d % 16) | 0;
|
|
17666
|
+
d = (d - r) / 16 || new Date().getTime();
|
|
17667
|
+
return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
|
|
17668
|
+
});
|
|
17669
|
+
}
|
|
17670
|
+
|
|
17671
|
+
// CSS selectors require IDs starting with a letter; replace a leading digit with 'a'.
|
|
17672
|
+
return /^[0-9]/.test(uuid) ? `a${uuid.slice(1)}` : uuid;
|
|
17673
|
+
}
|
|
17674
|
+
|
|
17633
17675
|
/* eslint-disable line-comment-position, no-inline-comments */
|
|
17634
17676
|
|
|
17635
17677
|
|
|
@@ -18648,7 +18690,7 @@ class AuroFloatingUI {
|
|
|
18648
18690
|
|
|
18649
18691
|
this.id = element.getAttribute("id");
|
|
18650
18692
|
if (!this.id) {
|
|
18651
|
-
this.id =
|
|
18693
|
+
this.id = generateUUID();
|
|
18652
18694
|
element.setAttribute("id", this.id);
|
|
18653
18695
|
}
|
|
18654
18696
|
|
|
@@ -19693,7 +19735,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
|
|
|
19693
19735
|
}
|
|
19694
19736
|
};
|
|
19695
19737
|
|
|
19696
|
-
var formkitVersion$1 = '
|
|
19738
|
+
var formkitVersion$1 = '202609022217';
|
|
19697
19739
|
|
|
19698
19740
|
/**
|
|
19699
19741
|
* AuroElement is the shared base class for layout-aware Auro form components.
|
|
@@ -33562,7 +33604,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
|
|
|
33562
33604
|
}
|
|
33563
33605
|
};
|
|
33564
33606
|
|
|
33565
|
-
var formkitVersion = '
|
|
33607
|
+
var formkitVersion = '202609022217';
|
|
33566
33608
|
|
|
33567
33609
|
// Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
|
|
33568
33610
|
// See LICENSE in the project root for license information.
|