@aurodesignsystem-dev/auro-formkit 0.0.0-pr1475.4 → 0.0.0-pr1477.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/components/bibtemplate/dist/auro-bibtemplate.d.ts +0 -7
  2. package/components/bibtemplate/dist/index.js +1 -9
  3. package/components/bibtemplate/dist/registered.js +1 -9
  4. package/components/checkbox/demo/customize.min.js +1 -1
  5. package/components/checkbox/demo/getting-started.min.js +1 -1
  6. package/components/checkbox/demo/index.min.js +1 -1
  7. package/components/checkbox/dist/index.js +1 -1
  8. package/components/checkbox/dist/registered.js +1 -1
  9. package/components/combobox/demo/customize.min.js +18 -234
  10. package/components/combobox/demo/getting-started.min.js +18 -234
  11. package/components/combobox/demo/index.min.js +18 -234
  12. package/components/combobox/demo/keyboard-behavior.md +68 -8
  13. package/components/combobox/dist/index.js +18 -234
  14. package/components/combobox/dist/registered.js +18 -234
  15. package/components/counter/demo/customize.min.js +15 -231
  16. package/components/counter/demo/index.min.js +15 -231
  17. package/components/counter/demo/keyboard-behavior.md +0 -1
  18. package/components/counter/dist/index.js +433 -45
  19. package/components/counter/dist/registered.js +2 -10
  20. package/components/datepicker/demo/accessibility.md +3 -51
  21. package/components/datepicker/demo/api.md +0 -9
  22. package/components/datepicker/demo/customize.html +0 -2
  23. package/components/datepicker/demo/customize.md +8 -72
  24. package/components/datepicker/demo/design.md +1 -3
  25. package/components/datepicker/demo/index.js +1 -5
  26. package/components/datepicker/demo/index.md +1 -81
  27. package/components/datepicker/demo/index.min.js +101 -1350
  28. package/components/datepicker/demo/keyboard-behavior.md +2 -201
  29. package/components/datepicker/demo/voiceover.md +12 -19
  30. package/components/datepicker/dist/index.js +111 -1284
  31. package/components/datepicker/dist/registered.js +111 -1284
  32. package/components/datepicker/dist/src/auro-calendar-cell.d.ts +1 -64
  33. package/components/datepicker/dist/src/auro-calendar-month.d.ts +0 -28
  34. package/components/datepicker/dist/src/auro-calendar.d.ts +0 -84
  35. package/components/datepicker/dist/src/auro-datepicker.d.ts +0 -80
  36. package/components/datepicker/dist/src/datepickerKeyboardStrategy.d.ts +3 -5
  37. package/components/dropdown/demo/accessibility.md +0 -11
  38. package/components/dropdown/demo/api.md +0 -1
  39. package/components/dropdown/demo/customize.md +0 -3
  40. package/components/dropdown/demo/customize.min.js +13 -221
  41. package/components/dropdown/demo/getting-started.min.js +13 -221
  42. package/components/dropdown/demo/index.min.js +13 -221
  43. package/components/dropdown/demo/keyboard-behavior.md +0 -1
  44. package/components/dropdown/dist/auro-dropdown.d.ts +1 -31
  45. package/components/dropdown/dist/index.js +13 -221
  46. package/components/dropdown/dist/registered.js +13 -221
  47. package/components/form/demo/customize.min.js +987 -2806
  48. package/components/form/demo/getting-started.min.js +987 -2806
  49. package/components/form/demo/index.min.js +987 -2806
  50. package/components/form/demo/registerDemoDeps.min.js +982 -2801
  51. package/components/input/demo/customize.min.js +1 -1
  52. package/components/input/demo/getting-started.min.js +1 -1
  53. package/components/input/demo/index.min.js +1 -1
  54. package/components/input/dist/index.js +1 -1
  55. package/components/input/dist/registered.js +1 -1
  56. package/components/radio/demo/getting-started.js +1 -1
  57. package/components/radio/demo/getting-started.md +1 -1
  58. package/components/radio/demo/index.min.js +1 -1
  59. package/components/radio/dist/index.js +1 -1
  60. package/components/radio/dist/registered.js +1 -1
  61. package/components/select/demo/customize.min.js +33 -247
  62. package/components/select/demo/getting-started.min.js +33 -247
  63. package/components/select/demo/index.min.js +33 -247
  64. package/components/select/demo/keyboard-behavior.md +54 -9
  65. package/components/select/dist/index.js +33 -247
  66. package/components/select/dist/registered.js +33 -247
  67. package/custom-elements.json +1491 -2163
  68. package/package.json +2 -2
  69. package/components/datepicker/demo/customize.js +0 -19
  70. package/components/datepicker/demo/customize.min.js +0 -25810
  71. package/components/radio/demo/customize.min.js +0 -2186
  72. package/components/radio/demo/demo-support.min.js +0 -55807
  73. package/components/radio/demo/getting-started.min.js +0 -2205
@@ -1521,7 +1521,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1521
1521
  }
1522
1522
  };
1523
1523
 
1524
- var formkitVersion$1 = '202605190056';
1524
+ var formkitVersion$1 = '202605192014';
1525
1525
 
1526
1526
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1527
1527
  // See LICENSE in the project root for license information.
@@ -5236,7 +5236,7 @@ function applyKeyboardStrategy(component, strategy, options = {}) {
5236
5236
  });
5237
5237
  }
5238
5238
 
5239
- var styleCss$2 = i$5`:host{position:fixed;z-index:var(--depth-tooltip, 400);display:none;isolation:isolate}:host dialog{width:auto;max-width:none;height:auto;max-height:none;padding:0;border:none;margin:0;outline:none;transform:translateZ(0)}:host dialog::backdrop{background:transparent}:host(:not([isfullscreen])) dialog{position:relative;inset:unset}:host(:not([isfullscreen])) .container.shape-box{border-radius:unset}:host(:not([isfullscreen])) .container[class*=shape-pill],:host(:not([isfullscreen])) .container[class*=shape-snowflake]{border-radius:30px}:host(:not([isfullscreen])) .container[class*=shape-rounded]{border-radius:16px}:host([desktopmodal]:popover-open)::backdrop{background:transparent}:host(:not([matchWidth])) .container{min-width:fit-content}:host([isfullscreen]){position:fixed;top:0;left:0}:host([isfullscreen]) .container{width:100dvw;max-width:none;height:100dvh;max-height:none;border-radius:unset;margin-top:0;box-shadow:unset;overscroll-behavior:contain}:host([isfullscreen]) .container::backdrop{background:var(--ds-color-background-primary, #fff)}:host(:popover-open){position:fixed;overflow:visible;padding:0;border:none;margin:0;background:transparent;inset:unset;outline:none}:host([data-show]){display:flex}:host([common]:not([isfullscreen])) .container,:host([rounded]:not([isfullscreen])) .container{border-radius:var(--ds-border-radius, 0.375rem)}:host([common][isfullscreen]) .container,:host([rounded][isfullscreen]) .container{border-radius:unset;box-shadow:unset}.container{display:inline-block;overflow:auto;box-sizing:border-box;border-radius:var(--ds-border-radius, 0.375rem);margin:var(--ds-size-50, 0.25rem) 0}.util_displayHiddenVisually{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip-path:inset(50%);white-space:nowrap}`;
5239
+ var styleCss$2 = i$5`:host{position:fixed;z-index:var(--depth-tooltip, 400);display:none;isolation:isolate}:host dialog{width:auto;max-width:none;height:auto;max-height:none;padding:0;border:none;margin:0;outline:none;transform:translateZ(0)}:host dialog::backdrop{background:transparent}:host(:not([isfullscreen])) dialog{position:relative;inset:unset}:host(:not([isfullscreen])) .container.shape-box{border-radius:unset}:host(:not([isfullscreen])) .container[class*=shape-pill],:host(:not([isfullscreen])) .container[class*=shape-snowflake]{border-radius:30px}:host(:not([isfullscreen])) .container[class*=shape-rounded]{border-radius:16px}:host(:not([matchWidth])) .container{min-width:fit-content}:host([isfullscreen]){position:fixed;top:0;left:0}:host([isfullscreen]) .container{width:100dvw;max-width:none;height:100dvh;max-height:none;border-radius:unset;margin-top:0;box-shadow:unset;overscroll-behavior:contain}:host([isfullscreen]) .container::backdrop{background:var(--ds-color-background-primary, #fff)}:host(:popover-open){position:fixed;overflow:visible;padding:0;border:none;margin:0;background:transparent;inset:unset;outline:none}:host([data-show]){display:flex}:host([common]:not([isfullscreen])) .container,:host([rounded]:not([isfullscreen])) .container{border-radius:var(--ds-border-radius, 0.375rem)}:host([common][isfullscreen]) .container,:host([rounded][isfullscreen]) .container{border-radius:unset;box-shadow:unset}.container{display:inline-block;overflow:auto;box-sizing:border-box;border-radius:var(--ds-border-radius, 0.375rem);margin:var(--ds-size-50, 0.25rem) 0}.util_displayHiddenVisually{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip-path:inset(50%);white-space:nowrap}`;
5240
5240
 
5241
5241
  var colorCss$2 = i$5`.container{background-color:var(--ds-auro-dropdownbib-container-color);box-shadow:var(--ds-auro-dropdownbib-boxshadow-color);color:var(--ds-auro-dropdownbib-text-color)}`;
5242
5242
 
@@ -5867,7 +5867,7 @@ class AuroHelpText extends i$2 {
5867
5867
  }
5868
5868
  }
5869
5869
 
5870
- var formkitVersion = '202605190056';
5870
+ var formkitVersion = '202605192014';
5871
5871
 
5872
5872
  let AuroElement$1 = class AuroElement extends i$2 {
5873
5873
  static get properties() {
@@ -6047,7 +6047,6 @@ class AuroDropdown extends AuroElement$1 {
6047
6047
  _intializeDefaults() {
6048
6048
  this.appearance = 'default';
6049
6049
  this.chevron = false;
6050
- this.desktopModal = false;
6051
6050
  this.disabled = false;
6052
6051
  this.disableKeyboardHandling = false;
6053
6052
  this.error = false;
@@ -6228,14 +6227,6 @@ class AuroDropdown extends AuroElement$1 {
6228
6227
  reflect: true
6229
6228
  },
6230
6229
 
6231
- /**
6232
- * If declared, the dropdown will behave as a modal dialog when in a desktop viewport size.
6233
- */
6234
- desktopModal: {
6235
- type: Boolean,
6236
- reflect: true
6237
- },
6238
-
6239
6230
  /**
6240
6231
  * If declared, the dropdown will only show by calling the API .show() public method.
6241
6232
  */
@@ -6523,15 +6514,6 @@ class AuroDropdown extends AuroElement$1 {
6523
6514
 
6524
6515
  disconnectedCallback() {
6525
6516
  super.disconnectedCallback();
6526
- this._clearPageInert();
6527
- if (this._bibTabHandler) {
6528
- this.removeEventListener('keydown', this._bibTabHandler);
6529
- this._bibTabHandler = undefined;
6530
- }
6531
- if (this.focusTrap) {
6532
- this.focusTrap.disconnect();
6533
- this.focusTrap = undefined;
6534
- }
6535
6517
  if (this.floater) {
6536
6518
  this.floater.hideBib('disconnect');
6537
6519
  this.floater.disconnect();
@@ -6559,45 +6541,19 @@ class AuroDropdown extends AuroElement$1 {
6559
6541
  if (this.isPopoverVisible) {
6560
6542
  // Fullscreen: use showModal() for native accessibility (inert outside, focus trap)
6561
6543
  // Desktop: use show() for Floating UI positioning + FocusTrap for focus management
6562
- this.bibElement.value.open(this.isBibFullscreen);
6563
- this.updateFocusTrap();
6564
-
6565
- // Desktop modal: make siblings inert so content outside is not interactive
6566
- if (this.desktopModal && !this.isBibFullscreen) {
6567
- this._setPageInert();
6568
- }
6544
+ const useModal = this.isBibFullscreen;
6545
+ this.bibElement.value.open(useModal);
6569
6546
  } else {
6570
6547
  this.bibElement.value.close();
6571
- this._clearPageInert();
6572
6548
  }
6573
6549
  }
6574
6550
 
6575
6551
  // When fullscreen strategy changes while open, re-open dialog with correct mode
6576
6552
  // (e.g. resizing from desktop → mobile while dropdown is open)
6577
6553
  if (changedProperties.has('isBibFullscreen') && this.isPopoverVisible && this.bibElement.value) {
6554
+ const useModal = this.isBibFullscreen;
6578
6555
  this.bibElement.value.close();
6579
- this.bibElement.value.open(this.isBibFullscreen);
6580
-
6581
- // Re-initialize focus management for the new strategy
6582
- this.updateFocusTrap();
6583
-
6584
- // Toggle inert: desktop modal needs it, fullscreen showModal() handles it natively
6585
- if (this.desktopModal && !this.isBibFullscreen) {
6586
- this._setPageInert();
6587
- } else {
6588
- this._clearPageInert();
6589
- }
6590
- }
6591
-
6592
- // Handle desktopModal toggled while the dropdown is already open.
6593
- // Re-initialize focus trapping and page inert state to match the new mode.
6594
- if (changedProperties.has('desktopModal') && this.isPopoverVisible && !this.isBibFullscreen) {
6595
- this.updateFocusTrap();
6596
- if (this.desktopModal) {
6597
- this._setPageInert();
6598
- } else {
6599
- this._clearPageInert();
6600
- }
6556
+ this.bibElement.value.open(useModal);
6601
6557
  }
6602
6558
  }
6603
6559
 
@@ -6607,14 +6563,8 @@ class AuroDropdown extends AuroElement$1 {
6607
6563
  * @param {CustomEvent} event - The custom event that contains the dropdown toggle information.
6608
6564
  */
6609
6565
  handleDropdownToggle(event) {
6566
+ this.updateFocusTrap();
6610
6567
  this.isPopoverVisible = event.detail.expanded;
6611
-
6612
- // Tear down FocusTrap when closing. Creation happens in updated()
6613
- // after the dialog is open so getFocusableElements can find content.
6614
- if (!this.isPopoverVisible) {
6615
- this.updateFocusTrap();
6616
- }
6617
-
6618
6568
  const eventType = event.detail.eventType || "unknown";
6619
6569
  if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
6620
6570
  this.trigger.focus();
@@ -6713,176 +6663,19 @@ class AuroDropdown extends AuroElement$1 {
6713
6663
  * @private
6714
6664
  */
6715
6665
  updateFocusTrap() {
6716
- // Always clean up existing handlers/traps before setting up new ones
6717
- // to prevent duplicate listeners on repeated calls.
6718
- if (this._bibTabHandler) {
6719
- this.removeEventListener('keydown', this._bibTabHandler);
6720
- this._bibTabHandler = undefined;
6721
- }
6722
-
6723
- if (this.focusTrap) {
6724
- this.focusTrap.disconnect();
6725
- this.focusTrap = undefined;
6726
- }
6727
-
6728
6666
  if (this.isPopoverVisible) {
6729
6667
  if (!this.isBibFullscreen) {
6730
- if (this.desktopModal) {
6731
- // Desktop modal: trap focus only within the bib content.
6732
- // Can't use FocusTrap on the bib element because keydown events
6733
- // from slotted content bubble through the dropdown host (light DOM),
6734
- // not through the bib (shadow projection target). Using FocusTrap
6735
- // on the dropdown would include the trigger in the tab cycle.
6736
- // Instead, listen for Tab on the dropdown and manually wrap focus
6737
- // within the bib's focusable elements.
6738
- this._bibTabHandler = (event) => {
6739
- if (event.key !== 'Tab') {
6740
- return;
6741
- }
6742
-
6743
- // Collect focusable elements from the bib content.
6744
- const focusables = getFocusableElements(this.bibContent);
6745
-
6746
- // Fallback: try from slotted content directly
6747
- if (!focusables.length) {
6748
- const slot = this.shadowRoot.querySelector('.slotContent slot');
6749
- const assignedNodes = slot ? slot.assignedNodes({ flatten: true }) : [];
6750
-
6751
- for (const node of assignedNodes) {
6752
- if (node.nodeType === Node.ELEMENT_NODE) {
6753
- focusables.push(...getFocusableElements(node));
6754
- }
6755
- }
6756
- }
6757
-
6758
- if (!focusables.length) {
6759
- return;
6760
- }
6761
-
6762
- event.preventDefault();
6763
-
6764
- const direction = event.shiftKey ? -1 : 1; // eslint-disable-line no-magic-numbers
6765
-
6766
- // Walk the active element chain through shadow roots
6767
- const actives = this._getActiveElements();
6768
-
6769
- let idx = focusables.findIndex((el) => actives.includes(el));
6770
-
6771
- if (idx === -1) { // eslint-disable-line no-magic-numbers
6772
- // Focus is not on a known element — move to first/last
6773
- idx = direction === 1 ? -1 : focusables.length; // eslint-disable-line no-magic-numbers
6774
- }
6775
-
6776
- // Try each element in order, skipping any that can't receive focus
6777
- // (e.g. hidden elements, elements in collapsed sections)
6778
- for (let index = 0; index < focusables.length; index++) { // eslint-disable-line no-plusplus
6779
- let nextIdx = idx + direction;
6780
-
6781
- // Wrap around
6782
- if (nextIdx < 0) {
6783
- nextIdx = focusables.length - 1;
6784
- } else if (nextIdx >= focusables.length) {
6785
- nextIdx = 0;
6786
- }
6787
-
6788
- focusables[nextIdx].focus();
6789
-
6790
- // Verify focus actually moved to the target
6791
- const newActives = this._getActiveElements();
6792
-
6793
- if (newActives.includes(focusables[nextIdx])) {
6794
- return;
6795
- }
6796
-
6797
- // Focus didn't stick — skip this element and try the next
6798
- idx = nextIdx;
6799
- }
6800
- };
6801
- this.addEventListener('keydown', this._bibTabHandler);
6802
-
6803
- // Move initial focus into the bib content, matching FocusTrap behavior
6804
- requestAnimationFrame(() => {
6805
- const focusables = getFocusableElements(this.bibContent);
6806
- if (focusables.length) {
6807
- focusables[0].focus();
6808
- }
6809
- });
6810
- } else {
6811
- // Normal desktop: use FocusTrap on the bib element
6812
- this.focusTrap = new FocusTrap(this.bibContent);
6813
- this.focusTrap.focusFirstElement();
6814
- }
6668
+ // Desktop: show() doesn't trap focus, so use FocusTrap
6669
+ this.focusTrap = new FocusTrap(this.bibContent);
6670
+ this.focusTrap.focusFirstElement();
6815
6671
  }
6816
6672
  // Fullscreen: showModal() provides native focus trapping
6817
- }
6818
- }
6819
-
6820
- /**
6821
- * Returns the chain of active (focused) elements through shadow roots.
6822
- * @private
6823
- * @returns {Array<HTMLElement>}
6824
- */
6825
- _getActiveElements() {
6826
- let { activeElement } = document;
6827
- const actives = [activeElement];
6828
-
6829
- while (activeElement?.shadowRoot?.activeElement) {
6830
- activeElement = activeElement.shadowRoot.activeElement;
6831
- actives.push(activeElement);
6832
- }
6833
-
6834
- return actives;
6835
- }
6836
-
6837
- /**
6838
- * Sets `inert` on sibling elements of the dropdown's top-level host
6839
- * so that content outside the dropdown is not interactive while the modal is open.
6840
- * Walks up through shadow DOM boundaries to find the outermost host element
6841
- * in the light DOM, then sets `inert` on siblings at each ancestor level
6842
- * to ensure all page content outside the host subtree is inert.
6843
- * @private
6844
- */
6845
- _setPageInert() {
6846
- if (this._inertSiblings) {
6847
6673
  return;
6848
6674
  }
6849
6675
 
6850
- this._inertSiblings = [];
6851
-
6852
- // Walk up through shadow DOM boundaries to find the topmost host
6853
- // element in the light DOM. For example, if this dropdown is inside
6854
- // auro-datepicker's shadow DOM, we walk up to the datepicker element
6855
- // so we set inert on its siblings — not on the datepicker itself.
6856
- let host = this;
6857
- while (host.getRootNode() instanceof ShadowRoot) {
6858
- host = host.getRootNode().host;
6859
- }
6860
-
6861
- // Walk up the ancestor chain, inerting siblings at each level
6862
- // to ensure the entire page outside the host subtree is inert.
6863
- let current = host;
6864
- while (current.parentElement) {
6865
- const parent = current.parentElement;
6866
- for (const sibling of parent.children) {
6867
- if (sibling !== current && !sibling.inert) {
6868
- sibling.inert = true;
6869
- this._inertSiblings.push(sibling);
6870
- }
6871
- }
6872
- current = parent;
6873
- }
6874
- }
6875
-
6876
- /**
6877
- * Restores `inert` state on siblings that were made inert by `_setPageInert`.
6878
- * @private
6879
- */
6880
- _clearPageInert() {
6881
- if (this._inertSiblings) {
6882
- for (const sibling of this._inertSiblings) {
6883
- sibling.inert = false;
6884
- }
6885
- this._inertSiblings = undefined;
6676
+ if (this.focusTrap) {
6677
+ this.focusTrap.disconnect();
6678
+ this.focusTrap = undefined;
6886
6679
  }
6887
6680
  }
6888
6681
 
@@ -7121,7 +6914,6 @@ class AuroDropdown extends AuroElement$1 {
7121
6914
  shape="${this.shape}"
7122
6915
  ?data-show="${this.isPopoverVisible}"
7123
6916
  ?isfullscreen="${this.isBibFullscreen}"
7124
- ?desktopmodal="${this.desktopModal}"
7125
6917
  .dialogLabel="${this.bibDialogLabel}"
7126
6918
  ${n$1(this.bibElement)}
7127
6919
  >
@@ -7489,14 +7281,6 @@ class AuroBibtemplate extends i$2 {
7489
7281
  large: {
7490
7282
  type: Boolean,
7491
7283
  reflect: true
7492
- },
7493
-
7494
- /**
7495
- * If declared, the footer slot will be rendered even when not in fullscreen mode.
7496
- */
7497
- showFooter: {
7498
- type: Boolean,
7499
- reflect: true
7500
7284
  }
7501
7285
  };
7502
7286
  }
@@ -7599,7 +7383,7 @@ class AuroBibtemplate extends i$2 {
7599
7383
  <slot></slot>
7600
7384
  </div>
7601
7385
 
7602
- ${this.isFullscreen || this.showFooter ? u$5`
7386
+ ${this.isFullscreen ? u$5`
7603
7387
  <div id="footerContainer">
7604
7388
  <slot name="footer"></slot>
7605
7389
  </div>` : null}
@@ -12,7 +12,6 @@
12
12
  <p>The trigger is a focusable element and participates in the standard tab order, responding to <code>Tab</code> and <code>Shift+Tab</code> key events per <auro-hyperlink href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/tabindex">native browser behavior</auro-hyperlink>, i.e., these keys step through the browser tabindex sequence.</p>
13
13
  <p>When the component is <code>disabled</code> it is removed from the <code>tabindex</code> sequence. VoiceOver's virtual cursor <em>(swipe navigation)</em> can still encounter the component, but standard keyboard <code>Tab</code> navigation skips it.</p>
14
14
  <p>When the bib is collapsed, the bib content is excluded from the tab sequence. When <strong>expanded</strong>, focusable elements within the bib content are included in the natural tab order. In fullscreen mode, focus is trapped within the bib, and the tab sequence cycles through the bib content focusable elements until the bib is closed or the viewport no longer meets the fullscreen condition and is rendered as a popover.</p>
15
- <p>When the <code>desktopModal</code> attribute is set, focus is also trapped within the bib on desktop viewports. All sibling elements on the page are marked <code>inert</code>, preventing interaction with content outside the dropdown until it is closed.</p>
16
15
  <!-- AURO-GENERATED-CONTENT:END -->
17
16
  <auro-header level="2" id="keyEvents">Key Events</auro-header>
18
17
  <auro-header level="3" id="keyEventsCounter">Counter</auro-header>