@aurodesignsystem-dev/auro-formkit 0.0.0-pr1555.1 → 0.0.0-pr1556.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 (47) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +46 -172
  7. package/components/combobox/demo/getting-started.min.js +46 -172
  8. package/components/combobox/demo/index.min.js +46 -172
  9. package/components/combobox/dist/index.js +46 -172
  10. package/components/combobox/dist/registered.js +46 -172
  11. package/components/counter/demo/customize.min.js +7 -59
  12. package/components/counter/demo/index.min.js +7 -59
  13. package/components/counter/dist/index.js +7 -59
  14. package/components/counter/dist/registered.js +7 -59
  15. package/components/datepicker/demo/customize.min.js +21 -109
  16. package/components/datepicker/demo/index.min.js +21 -109
  17. package/components/datepicker/dist/index.js +21 -109
  18. package/components/datepicker/dist/registered.js +21 -109
  19. package/components/dropdown/demo/customize.min.js +6 -58
  20. package/components/dropdown/demo/getting-started.min.js +6 -58
  21. package/components/dropdown/demo/index.min.js +6 -58
  22. package/components/dropdown/dist/auro-dropdown.d.ts +1 -16
  23. package/components/dropdown/dist/index.js +6 -58
  24. package/components/dropdown/dist/registered.js +6 -58
  25. package/components/form/demo/customize.min.js +106 -452
  26. package/components/form/demo/getting-started.min.js +106 -452
  27. package/components/form/demo/index.min.js +106 -452
  28. package/components/form/demo/registerDemoDeps.min.js +94 -448
  29. package/components/form/dist/index.js +12 -4
  30. package/components/form/dist/registered.js +12 -4
  31. package/components/input/demo/customize.min.js +11 -47
  32. package/components/input/demo/getting-started.min.js +11 -47
  33. package/components/input/demo/index.min.js +11 -47
  34. package/components/input/dist/index.js +11 -47
  35. package/components/input/dist/registered.js +11 -47
  36. package/components/radio/demo/customize.min.js +1 -1
  37. package/components/radio/demo/getting-started.min.js +1 -1
  38. package/components/radio/demo/index.min.js +1 -1
  39. package/components/radio/dist/index.js +1 -1
  40. package/components/radio/dist/registered.js +1 -1
  41. package/components/select/demo/customize.min.js +7 -59
  42. package/components/select/demo/getting-started.min.js +7 -59
  43. package/components/select/demo/index.min.js +7 -59
  44. package/components/select/dist/index.js +7 -59
  45. package/components/select/dist/registered.js +7 -59
  46. package/custom-elements.json +1484 -1500
  47. package/package.json +1 -1
@@ -4904,7 +4904,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4904
4904
  }
4905
4905
  };
4906
4906
 
4907
- var formkitVersion$2 = '202607162024';
4907
+ var formkitVersion$2 = '202607152340';
4908
4908
 
4909
4909
  let AuroElement$2 = class AuroElement extends LitElement {
4910
4910
  static get properties() {
@@ -5033,6 +5033,7 @@ class AuroDropdown extends AuroElement$2 {
5033
5033
  static get shadowRootOptions() {
5034
5034
  return {
5035
5035
  ...AuroElement$2.shadowRootOptions,
5036
+ delegatesFocus: true,
5036
5037
  };
5037
5038
  }
5038
5039
 
@@ -5044,15 +5045,6 @@ class AuroDropdown extends AuroElement$2 {
5044
5045
  this.matchWidth = false;
5045
5046
  this.noHideOnThisFocusLoss = false;
5046
5047
 
5047
- /**
5048
- * When true, the dropdown skips its generic focus restoration on close.
5049
- * Set by consumers (e.g. combobox) that manage their own focus routing
5050
- * via setClearBtnFocus / setInputFocus / keyboard strategy.
5051
- * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5052
- * @private
5053
- */
5054
- this.noFocusRestoreOnClose = false;
5055
-
5056
5048
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5057
5049
 
5058
5050
  // Layout Config
@@ -5208,49 +5200,7 @@ class AuroDropdown extends AuroElement$2 {
5208
5200
  focusables[0].focus();
5209
5201
  }
5210
5202
  } else {
5211
- this.focusTrigger();
5212
- }
5213
- }
5214
-
5215
- /**
5216
- * Focus the trigger content. When the trigger wrapper itself is focusable
5217
- * (has tabindex), focus it directly. Otherwise, focus the first focusable
5218
- * element slotted into the trigger slot (e.g. the auro-input).
5219
- * @private
5220
- */
5221
- focusTrigger() {
5222
- if (this.trigger.hasAttribute('tabindex')) {
5223
5203
  this.trigger.focus();
5224
- } else {
5225
- // Slotted content isn't a DOM child of the trigger div, so
5226
- // getFocusableElements can't find it. Query assigned nodes directly.
5227
- const slot = this.trigger.querySelector('slot[name="trigger"]');
5228
- if (slot) {
5229
- const assigned = slot.assignedElements();
5230
- for (const el of assigned) {
5231
- if (el.hasAttribute('disabled')) {
5232
- continue; // eslint-disable-line no-continue
5233
- }
5234
- // Try finding a focusable descendant first (handles non-focusable
5235
- // wrappers like <div> containing a <button>). If none found, try
5236
- // focusing the element directly (works for custom elements like
5237
- // auro-input that have delegatesFocus or a custom focus() method).
5238
- const descendants = getFocusableElements(el);
5239
- if (descendants.length > 0) {
5240
- descendants[0].focus();
5241
- return;
5242
- }
5243
- el.focus();
5244
- if (document.activeElement === el) {
5245
- return;
5246
- }
5247
- }
5248
- }
5249
- // Fallback: try DOM children (non-slotted content)
5250
- const focusables = getFocusableElements(this.trigger);
5251
- if (focusables.length > 0) {
5252
- focusables[0].focus();
5253
- }
5254
5204
  }
5255
5205
  }
5256
5206
 
@@ -5703,17 +5653,15 @@ class AuroDropdown extends AuroElement$2 {
5703
5653
  }
5704
5654
 
5705
5655
  const eventType = event.detail.eventType || "unknown";
5706
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5707
- this.focusTrigger();
5656
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
5657
+ this.trigger.focus();
5708
5658
  }
5709
5659
 
5710
5660
 
5711
5661
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5712
5662
  // — restoring to the trigger would trap the user on this dropdown, forcing
5713
5663
  // an extra Tab to move on. Escape and outside-click still restore.
5714
- // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
5715
- // its own focus restoration — skip the generic trigger focus to avoid races.
5716
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
5664
+ if (!this.isPopoverVisible && eventType !== "focusloss") {
5717
5665
  // wait til the bib gets fully closed and rendered
5718
5666
  setTimeout(() => {
5719
5667
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -5725,7 +5673,7 @@ class AuroDropdown extends AuroElement$2 {
5725
5673
  return;
5726
5674
  }
5727
5675
  // Restore focus to the trigger.
5728
- this.focusTrigger();
5676
+ this.trigger.focus();
5729
5677
  });
5730
5678
  }
5731
5679
  }
@@ -16899,10 +16847,9 @@ class DomHandler {
16899
16847
  class BaseInput extends AuroElement$1 {
16900
16848
 
16901
16849
  // Delegate focus to the native <input> inside the shadow root so that
16902
- // clicking anywhere on the input wrapper focuses the native input, and
16903
- // programmatic .focus() calls on elements in the shadow DOM work correctly.
16904
- // The initial-load focus theft was caused by the static `autofocus`
16905
- // attribute on the bib input (now conditional), not by delegatesFocus.
16850
+ // showModal()'s dialog focusing steps reach the input element.
16851
+ // This keeps the mobile virtual keyboard open when the fullscreen dialog
16852
+ // opens, because the browser sees an input-to-input focus transfer.
16906
16853
  static get shadowRootOptions() {
16907
16854
  return {
16908
16855
  ...AuroElement$1.shadowRootOptions,
@@ -18579,7 +18526,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
18579
18526
  }
18580
18527
  };
18581
18528
 
18582
- var formkitVersion$1 = '202607162024';
18529
+ var formkitVersion$1 = '202607152340';
18583
18530
 
18584
18531
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18585
18532
  // See LICENSE in the project root for license information.
@@ -18865,50 +18812,15 @@ class AuroInput extends BaseInput {
18865
18812
  * @returns {void}
18866
18813
  */
18867
18814
  checkDisplayValueSlotChange() {
18868
- const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
18869
- if (!slot) {
18870
- // Shadow slot not yet rendered — fall back to checking light-DOM
18871
- // children so hasDisplayValueContent isn't stuck false when called
18872
- // before firstUpdated (e.g. from auro-combobox during mount).
18873
- // Check for any element (including custom elements like <auro-icon>
18874
- // that render via shadow DOM with no text content).
18875
- const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
18876
- const hasContent = lightDomNodes.some((node) => (
18877
- node.textContent.trim().length > 0 ||
18878
- node.children.length > 0 ||
18879
- node.shadowRoot !== null
18880
- ));
18881
- if (this.hasDisplayValueContent !== hasContent) {
18882
- this.hasDisplayValueContent = hasContent;
18883
- this.requestUpdate();
18884
- }
18885
- return;
18886
- }
18815
+ // flatten:true resolves through auro-combobox's forwarding slot
18816
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
18817
+ // directly to auro-input's light DOM alongside the forwarder still
18818
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
18819
+ // discarded any siblings past the forwarder.
18820
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
18887
18821
  const nodes = slot.assignedNodes({ flatten: true });
18888
18822
 
18889
- // Check for actual visible content, not just node existence.
18890
- // An empty <span slot="displayValue"></span> forwarded from the
18891
- // consumer should not be treated as "has content" — it causes the
18892
- // displayValue wrapper to render (with hasContent class) but show
18893
- // nothing, blocking the combobox's synthetic displayValue from
18894
- // being visible on preset/deeplink load.
18895
- // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
18896
- // treated as content even when they have no text or light-DOM children.
18897
- const hasContent = nodes.some((node) => {
18898
- if (node.nodeType === Node.TEXT_NODE) {
18899
- return node.textContent.trim().length > 0;
18900
- }
18901
- if (node.nodeType === Node.ELEMENT_NODE) {
18902
- return node.textContent.trim().length > 0 ||
18903
- node.children.length > 0 ||
18904
- node.shadowRoot !== null;
18905
- }
18906
- return false;
18907
- });
18908
- if (this.hasDisplayValueContent !== hasContent) {
18909
- this.hasDisplayValueContent = hasContent;
18910
- this.requestUpdate();
18911
- }
18823
+ this.hasDisplayValueContent = nodes.length > 0;
18912
18824
  }
18913
18825
 
18914
18826
  firstUpdated() {
@@ -19735,7 +19647,7 @@ class AuroBibtemplate extends LitElement {
19735
19647
  }
19736
19648
  }
19737
19649
 
19738
- var formkitVersion = '202607162024';
19650
+ var formkitVersion = '202607152340';
19739
19651
 
19740
19652
  var styleCss$1 = css`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
19741
19653
 
@@ -20772,34 +20684,14 @@ class AuroCombobox extends AuroElement {
20772
20684
  const displayValueEl = this.menu.optionSelected.querySelector("[slot='displayValue']");
20773
20685
  if (displayValueEl) {
20774
20686
  this.input.appendChild(displayValueEl.cloneNode(true));
20775
- }
20776
-
20777
- // auro-input's hasDisplayValueContent is non-reactive; nudge it to
20778
- // re-evaluate the slot and re-render so the displayValue wrapper
20779
- // gets its hasContent class. Without this, the apple/icon stays
20780
- // hidden when input.value is set in the same tick as the append.
20781
- if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20782
- this.input.checkDisplayValueSlotChange();
20783
- }
20784
- } else if (this.value) {
20785
- // No optionSelected yet (e.g. setMenuValue was called but the menu's
20786
- // auroMenu-selectedOption event hasn't fired yet, or we're on remount
20787
- // with no options loaded). Synthesize a displayValue from the value so
20788
- // the overlay isn't blank.
20789
- //
20790
- // NOTE: This renders the raw machine value (e.g. "SEA"), not the
20791
- // human-readable label (e.g. "Seattle, WA"). For consumers where
20792
- // value ≠ label, this produces a brief flash of the raw value until
20793
- // the option elements load and updateTriggerTextDisplay re-runs with
20794
- // the correct label. This is intentionally preferred over a blank
20795
- // state — the displayValueInTrigger.remove() cleanup above ensures
20796
- // this placeholder is replaced once the real option is available.
20797
- const syntheticDV = document.createElement('span');
20798
- syntheticDV.setAttribute('slot', 'displayValue');
20799
- syntheticDV.textContent = this.value;
20800
- this.input.appendChild(syntheticDV);
20801
- if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20802
- this.input.checkDisplayValueSlotChange();
20687
+ // auro-input's hasDisplayValueContent is non-reactive; nudge it to
20688
+ // re-evaluate the slot and re-render so the displayValue wrapper
20689
+ // gets its hasContent class. Without this, the apple/icon stays
20690
+ // hidden when input.value is set in the same tick as the append.
20691
+ if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20692
+ this.input.checkDisplayValueSlotChange();
20693
+ this.input.requestUpdate();
20694
+ }
20803
20695
  }
20804
20696
  }
20805
20697
 
@@ -20972,10 +20864,6 @@ class AuroCombobox extends AuroElement {
20972
20864
  // from combobox's light DOM and won't be detected by dropdown's contains() check.
20973
20865
  this.dropdown.noHideOnThisFocusLoss = true;
20974
20866
 
20975
- // Suppress the dropdown's generic focus restoration on close — the combobox
20976
- // manages its own focus via setClearBtnFocus / setInputFocus / keyboard strategy.
20977
- this.dropdown.noFocusRestoreOnClose = true;
20978
-
20979
20867
  // Listen for the ID to be added to the dropdown so we can capture it and use it for accessibility.
20980
20868
  this.dropdown.addEventListener('auroDropdown-idAdded', (event) => {
20981
20869
  this.dropdownId = event.detail.id;
@@ -21049,11 +20937,7 @@ class AuroCombobox extends AuroElement {
21049
20937
  // after the dropdown layout settles.
21050
20938
 
21051
20939
  doubleRaf(() => {
21052
- // Guard: skip if the dropdown closed before this rAF fired
21053
- // (e.g. user selected an option immediately after the bib opened).
21054
- if (this.dropdownOpen) {
21055
- this.setInputFocus();
21056
- }
20940
+ this.setInputFocus();
21057
20941
  if (this._inFullscreenTransition) {
21058
20942
  this._inFullscreenTransition = false;
21059
20943
  }
@@ -21100,9 +20984,7 @@ class AuroCombobox extends AuroElement {
21100
20984
  }
21101
20985
 
21102
20986
  this._scheduleTimer(() => {
21103
- if (this.dropdown.isPopoverVisible) {
21104
- this.setInputFocus();
21105
- }
20987
+ this.setInputFocus();
21106
20988
  }, 0);
21107
20989
  });
21108
20990
  }
@@ -21111,19 +20993,14 @@ class AuroCombobox extends AuroElement {
21111
20993
  * @private
21112
20994
  */
21113
20995
  setClearBtnFocus() {
21114
- doubleRaf(() => {
21115
- // First establish focus inside the input's shadow root.
21116
- // Without this, clearBtn.focus() silently fails when focus is on
21117
- // document.body (e.g. after a click selection closes the bib dialog).
21118
- // delegatesFocus on BaseInput routes this to the native <input>.
21119
- this.input.focus();
21120
-
21121
- // Now move focus to the clear button within the same shadow root.
21122
- const clearBtn = this.input.shadowRoot.querySelector('.clearBtn');
21123
- if (clearBtn) {
20996
+ const clearBtn = this.input.shadowRoot.querySelector('.clearBtn');
20997
+ if (clearBtn) {
20998
+ // Wait for the element to fully render across
20999
+ // multiple Lit update cycles before moving focus
21000
+ doubleRaf(() => {
21124
21001
  clearBtn.focus();
21125
- }
21126
- });
21002
+ });
21003
+ }
21127
21004
  }
21128
21005
 
21129
21006
  /**
@@ -21334,9 +21211,6 @@ class AuroCombobox extends AuroElement {
21334
21211
  // only — fresh user selections take the existing hideBib path.
21335
21212
  if (isEcho && this.menu.optionSelected) {
21336
21213
  this._programmaticFilterRefresh = true;
21337
- this.updateComplete.then(() => {
21338
- this._programmaticFilterRefresh = false;
21339
- });
21340
21214
  }
21341
21215
  });
21342
21216
 
@@ -21589,6 +21463,10 @@ class AuroCombobox extends AuroElement {
21589
21463
  if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0 && this.dropdown.isPopoverVisible) {
21590
21464
  this.setInputFocus();
21591
21465
  }
21466
+
21467
+ if (this._programmaticFilterRefresh) {
21468
+ this._programmaticFilterRefresh = false;
21469
+ }
21592
21470
  }
21593
21471
 
21594
21472
  /**
@@ -21602,12 +21480,10 @@ class AuroCombobox extends AuroElement {
21602
21480
  inputResolver: (comp, ctx) => (ctx.isModal && comp.inputInBib ? comp.inputInBib : comp.input),
21603
21481
  });
21604
21482
 
21605
- this.addEventListener('focusin', (event) => {
21483
+ this.addEventListener('focusin', () => {
21606
21484
  this.touched = true;
21607
21485
 
21608
- if (event.composedPath()[0] === this) {
21609
- this.focus();
21610
- }
21486
+ this.focus();
21611
21487
  });
21612
21488
 
21613
21489
  this.addEventListener('auroFormElement-validated', (evt) => {
@@ -21787,12 +21663,6 @@ class AuroCombobox extends AuroElement {
21787
21663
  // setting the flag unconditionally here masks the user-typed open path.
21788
21664
  if (!this._userTyped) {
21789
21665
  this._programmaticFilterRefresh = true;
21790
- // Self-clear after this update cycle completes. This collapses
21791
- // the previous scattered clear-points into one and prevents the
21792
- // flag from surviving into the next user interaction.
21793
- this.updateComplete.then(() => {
21794
- this._programmaticFilterRefresh = false;
21795
- });
21796
21666
  }
21797
21667
 
21798
21668
  if (this.input.value !== this.value) {
@@ -21882,6 +21752,10 @@ class AuroCombobox extends AuroElement {
21882
21752
  } else if (!this.dropdown.isBibFullscreen) {
21883
21753
  this.hideBib();
21884
21754
  }
21755
+
21756
+ if (this._programmaticFilterRefresh) {
21757
+ this._programmaticFilterRefresh = false;
21758
+ }
21885
21759
  }
21886
21760
 
21887
21761
  if (changedProperties.has('error')) {
@@ -22063,7 +21937,7 @@ class AuroCombobox extends AuroElement {
22063
21937
  <slot @slotchange="${this.handleSlotChange}"></slot>
22064
21938
  <${this.inputTag}
22065
21939
  id="inputInBib"
22066
- ?autofocus="${this.dropdownOpen && this.dropdown?.isBibFullscreen}"
21940
+ autofocus
22067
21941
  @input="${this.handleInputValueChange}"
22068
21942
  .a11yActivedescendant="${this.dropdownOpen && this.optionActive ? this.optionActive.id : undefined}"
22069
21943
  .a11yControls=${`${this.dropdownId}-floater-bib`}