@aurodesignsystem-dev/auro-formkit 0.0.0-pr1608.0 → 0.0.0-pr1608.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/components/checkbox/demo/accessibility.md +15 -4
  2. package/components/checkbox/demo/customize.min.js +40 -12
  3. package/components/checkbox/demo/getting-started.min.js +40 -12
  4. package/components/checkbox/demo/index.min.js +40 -12
  5. package/components/checkbox/dist/auro-checkbox-group.d.ts +19 -0
  6. package/components/checkbox/dist/index.js +40 -12
  7. package/components/checkbox/dist/registered.js +40 -12
  8. package/components/combobox/demo/customize.min.js +46 -4
  9. package/components/combobox/demo/getting-started.min.js +46 -4
  10. package/components/combobox/demo/index.min.js +46 -4
  11. package/components/combobox/dist/index.js +46 -4
  12. package/components/combobox/dist/registered.js +46 -4
  13. package/components/counter/demo/customize.min.js +339 -23
  14. package/components/counter/demo/getting-started.min.js +339 -23
  15. package/components/counter/demo/index.min.js +339 -23
  16. package/components/counter/dist/counterGroupKeyboardStrategy.d.ts +1 -0
  17. package/components/counter/dist/index.js +339 -23
  18. package/components/counter/dist/registered.js +339 -23
  19. package/components/datepicker/demo/customize.min.js +46 -4
  20. package/components/datepicker/demo/getting-started.min.js +46 -4
  21. package/components/datepicker/demo/index.min.js +46 -4
  22. package/components/datepicker/dist/index.js +46 -4
  23. package/components/datepicker/dist/registered.js +46 -4
  24. package/components/dropdown/demo/customize.min.js +44 -2
  25. package/components/dropdown/demo/getting-started.min.js +45 -3
  26. package/components/dropdown/demo/index.min.js +44 -2
  27. package/components/dropdown/dist/index.js +44 -2
  28. package/components/dropdown/dist/registered.js +44 -2
  29. package/components/form/demo/customize.min.js +556 -61
  30. package/components/form/demo/getting-started.min.js +556 -61
  31. package/components/form/demo/index.min.js +556 -61
  32. package/components/form/demo/registerDemoDeps.min.js +556 -61
  33. package/components/input/demo/customize.min.js +1 -1
  34. package/components/input/demo/getting-started.min.js +1 -1
  35. package/components/input/demo/index.min.js +1 -1
  36. package/components/input/dist/index.js +1 -1
  37. package/components/input/dist/registered.js +1 -1
  38. package/components/radio/demo/accessibility.md +15 -4
  39. package/components/radio/demo/customize.min.js +39 -14
  40. package/components/radio/demo/getting-started.min.js +39 -14
  41. package/components/radio/demo/index.min.js +39 -14
  42. package/components/radio/dist/auro-radio-group.d.ts +18 -0
  43. package/components/radio/dist/index.js +39 -14
  44. package/components/radio/dist/registered.js +39 -14
  45. package/components/select/demo/customize.min.js +45 -3
  46. package/components/select/demo/getting-started.min.js +45 -3
  47. package/components/select/demo/index.min.js +45 -3
  48. package/components/select/dist/index.js +45 -3
  49. package/components/select/dist/registered.js +45 -3
  50. package/custom-elements.json +1814 -1768
  51. 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 = '202609021913';
1080
+ var formkitVersion$1 = '202609030018';
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 = window.crypto.randomUUID();
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 = '202609021913';
5422
+ var formkitVersion = '202609030018';
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 = '202609021913';
13828
+ var formkitVersion$2 = '202609030018';
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 = window.crypto.randomUUID();
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 = '202609021913';
19738
+ var formkitVersion$1 = '202609030018';
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 = '202609021913';
33607
+ var formkitVersion = '202609030018';
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.