@aurodesignsystem-dev/auro-formkit 0.0.0-pr1408.9 → 0.0.0-pr1411.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 (62) hide show
  1. package/components/checkbox/demo/api.min.js +1 -1
  2. package/components/checkbox/demo/index.min.js +1 -1
  3. package/components/checkbox/demo/keyboardBehavior.md +0 -0
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/api.min.js +121 -144
  7. package/components/combobox/demo/index.min.js +121 -144
  8. package/components/combobox/demo/keyboardBehavior.html +1 -0
  9. package/components/combobox/demo/keyboardBehavior.md +20 -21
  10. package/components/combobox/dist/index.js +87 -117
  11. package/components/combobox/dist/registered.js +87 -117
  12. package/components/counter/demo/api.md +1 -1
  13. package/components/counter/demo/api.min.js +184 -148
  14. package/components/counter/demo/index.min.js +184 -148
  15. package/components/counter/demo/keyboardBehavior.html +1 -0
  16. package/components/counter/demo/keyboardBehavior.md +1 -1
  17. package/components/counter/dist/auro-counter.d.ts +11 -8
  18. package/components/counter/dist/index.js +184 -148
  19. package/components/counter/dist/keyboardStrategy.d.ts +4 -0
  20. package/components/counter/dist/registered.js +184 -148
  21. package/components/datepicker/demo/api.min.js +89 -120
  22. package/components/datepicker/demo/index.min.js +89 -120
  23. package/components/datepicker/demo/keyboardBehavior.html +1 -0
  24. package/components/datepicker/demo/keyboardBehavior.md +14 -13
  25. package/components/datepicker/dist/index.js +84 -115
  26. package/components/datepicker/dist/registered.js +84 -115
  27. package/components/dropdown/demo/api.md +0 -1
  28. package/components/dropdown/demo/api.min.js +99 -123
  29. package/components/dropdown/demo/index.md +2 -2
  30. package/components/dropdown/demo/index.min.js +99 -123
  31. package/components/dropdown/demo/keyboardBehavior.html +1 -0
  32. package/components/dropdown/dist/auro-dropdown.d.ts +0 -8
  33. package/components/dropdown/dist/auro-dropdownBib.d.ts +1 -40
  34. package/components/dropdown/dist/dropdownBibKeyboardStrategy.d.ts +7 -0
  35. package/components/dropdown/dist/index.js +83 -111
  36. package/components/dropdown/dist/registered.js +83 -111
  37. package/components/form/demo/api.min.js +542 -564
  38. package/components/form/demo/index.min.js +542 -564
  39. package/components/form/demo/keyboardBehavior.md +0 -0
  40. package/components/input/demo/api.min.js +1 -1
  41. package/components/input/demo/index.min.js +1 -1
  42. package/components/input/demo/keyboardBehavior.md +0 -0
  43. package/components/input/dist/index.js +1 -1
  44. package/components/input/dist/registered.js +1 -1
  45. package/components/menu/demo/api.min.js +34 -27
  46. package/components/menu/demo/index.min.js +34 -27
  47. package/components/menu/dist/auro-menu.d.ts +0 -6
  48. package/components/menu/dist/index.js +34 -27
  49. package/components/menu/dist/registered.js +34 -27
  50. package/components/radio/demo/api.min.js +1 -1
  51. package/components/radio/demo/index.min.js +1 -1
  52. package/components/radio/dist/index.js +1 -1
  53. package/components/radio/dist/registered.js +1 -1
  54. package/components/select/demo/api.min.js +181 -178
  55. package/components/select/demo/index.min.js +181 -178
  56. package/components/select/demo/keyboardBehavior.html +1 -0
  57. package/components/select/demo/keyboardBehavior.md +240 -239
  58. package/components/select/dist/index.js +147 -151
  59. package/components/select/dist/registered.js +147 -151
  60. package/components/select/dist/selectKeyboardStrategy.d.ts +3 -1
  61. package/custom-elements.json +101 -83
  62. package/package.json +5 -3
@@ -1190,7 +1190,7 @@ function restoreTriggerAfterClose(dropdown, focusTarget) {
1190
1190
  * @returns {{isExpanded: boolean, isModal: boolean, isPopover: boolean, activeInput: HTMLElement|null}}
1191
1191
  * isModal and isPopover reflect the display mode (fullscreen vs not) regardless of expanded state.
1192
1192
  */
1193
- function createDisplayContext(component, options = {}) {
1193
+ function createDisplayContext$1(component, options = {}) {
1194
1194
  const dd = options.dropdown || component.dropdown;
1195
1195
  // isPopoverVisible reflects as the `open` attribute.
1196
1196
  // It reports whether the bib is open in any mode (popover or modal).
@@ -1220,11 +1220,11 @@ function createDisplayContext(component, options = {}) {
1220
1220
  * @param {Object} strategy - Map of key names to handler functions.
1221
1221
  * @param {Object} [options] - Optional config passed to createDisplayContext.
1222
1222
  */
1223
- function applyKeyboardStrategy(component, strategy, options = {}) {
1223
+ function applyKeyboardStrategy$1(component, strategy, options = {}) {
1224
1224
  component.addEventListener('keydown', async (evt) => {
1225
1225
  const handler = strategy[evt.key] || strategy.default;
1226
1226
  if (typeof handler === 'function') {
1227
- const ctx = createDisplayContext(component, options);
1227
+ const ctx = createDisplayContext$1(component, options);
1228
1228
  await handler(component, evt, ctx);
1229
1229
  }
1230
1230
  });
@@ -1250,24 +1250,39 @@ function navigateArrow(component, direction, options = {}) {
1250
1250
 
1251
1251
  const selectKeyboardStrategy = {
1252
1252
  ArrowUp(component, evt, ctx) {
1253
+ // Navigate menu only if the bib is open, otherwise open the bib
1253
1254
  evt.preventDefault();
1254
- navigateArrow(component, 'up', {
1255
- ctx,
1256
- showFn: () => component.dropdown.show(),
1257
- });
1255
+ if (evt.altKey || evt.metaKey) ; else if (component.dropdown.isPopoverVisible) {
1256
+ navigateArrow(component, 'up', {
1257
+ ctx,
1258
+ showFn: () => component.dropdown.show(),
1259
+ });
1260
+ } else {
1261
+ component.dropdown.show();
1262
+ }
1258
1263
  },
1259
1264
 
1260
1265
  ArrowDown(component, evt, ctx) {
1266
+ // Navigate menu only if the bib is open, otherwise open the bib
1261
1267
  evt.preventDefault();
1262
- navigateArrow(component, 'down', {
1263
- ctx,
1264
- showFn: () => component.dropdown.show(),
1265
- });
1268
+ if (evt.altKey || evt.metaKey) ; else if (component.dropdown.isPopoverVisible) {
1269
+ navigateArrow(component, 'down', {
1270
+ ctx,
1271
+ showFn: () => component.dropdown.show(),
1272
+ });
1273
+ } else {
1274
+ component.dropdown.show();
1275
+ }
1266
1276
  },
1267
1277
 
1268
- Enter(component, evt) {
1269
- evt.preventDefault();
1270
- component.menu.makeSelection();
1278
+ Enter(component, evt, ctx) {
1279
+ if (!ctx.isExpanded && ctx.isPopover) {
1280
+ component.menu.makeSelection();
1281
+ } else if (ctx.isModal && !evt.defaultPrevented) {
1282
+ // for modal, isExpanded is always true
1283
+ // defaultPrevented will be true if Floating UI has already handled the event to open the dropdown
1284
+ component.menu.makeSelection();
1285
+ }
1271
1286
  },
1272
1287
 
1273
1288
  Tab(component, evt, ctx) {
@@ -1275,17 +1290,6 @@ const selectKeyboardStrategy = {
1275
1290
  return;
1276
1291
  }
1277
1292
 
1278
- // Shift+Tab moves the highlight to the first non-disabled option
1279
- // without making a selection or closing the bib.
1280
- if (evt.shiftKey) {
1281
- evt.preventDefault();
1282
- const firstActive = component.menu.menuService.menuOptions.find((option) => option.isActive);
1283
- if (firstActive) {
1284
- component.menu.updateActiveOption(firstActive);
1285
- }
1286
- return;
1287
- }
1288
-
1289
1293
  // Tab selects the focused option and closes the popup per the
1290
1294
  // WAI-ARIA APG select-only combobox / listbox pattern.
1291
1295
  if (component.optionActive && !component.multiSelect) {
@@ -1293,6 +1297,23 @@ const selectKeyboardStrategy = {
1293
1297
  }
1294
1298
  component.dropdown.hide();
1295
1299
  },
1300
+ Home(component, evt) {
1301
+ evt.preventDefault();
1302
+ evt.stopPropagation();
1303
+ const firstOption = component.menu.menuService.menuOptions.find((option) => !option.disabled);
1304
+ if (firstOption) {
1305
+ component.menu.updateActiveOption(firstOption);
1306
+ }
1307
+ },
1308
+
1309
+ End(component, evt) {
1310
+ evt.preventDefault();
1311
+ evt.stopPropagation();
1312
+ const lastOption = [...component.menu.menuService.menuOptions].reverse().find((option) => !option.disabled);
1313
+ if (lastOption) {
1314
+ component.menu.updateActiveOption(lastOption);
1315
+ }
1316
+ },
1296
1317
 
1297
1318
  default(component, evt) {
1298
1319
  component.updateActiveOptionBasedOnKey(evt.key);
@@ -3388,11 +3409,10 @@ class AuroFloatingUI {
3388
3409
  return;
3389
3410
  }
3390
3411
 
3391
- const { activeElement } = document;
3392
3412
  // if focus is still inside of trigger or bib, do not close
3393
3413
  if (
3394
- this.element.contains(activeElement) ||
3395
- this.element.bib?.contains(activeElement)
3414
+ this.element.matches(":focus") ||
3415
+ this.element.matches(":focus-within")
3396
3416
  ) {
3397
3417
  return;
3398
3418
  }
@@ -4231,12 +4251,83 @@ let p$2 = class p{registerComponent(t,a){customElements.get(t)||customElements.d
4231
4251
 
4232
4252
  var iconVersion$1 = '9.1.2';
4233
4253
 
4254
+ /**
4255
+ * Computes display state once per keydown event.
4256
+ * Centralizes null-safety checks and makes the shared/modal/popover branching explicit.
4257
+ *
4258
+ * @param {HTMLElement} component - The component with a dropdown reference.
4259
+ * @param {Object} [options] - Optional config.
4260
+ * @param {HTMLElement} [options.dropdown] - Explicit dropdown reference. Falls back to component.dropdown.
4261
+ * @param {Function} [options.inputResolver] - Called with (component, ctx) to resolve the active input element.
4262
+ * @returns {{isExpanded: boolean, isModal: boolean, isPopover: boolean, activeInput: HTMLElement|null}}
4263
+ * isModal and isPopover reflect the display mode (fullscreen vs not) regardless of expanded state.
4264
+ */
4265
+ function createDisplayContext(component, options = {}) {
4266
+ const dd = options.dropdown || component.dropdown;
4267
+ // isPopoverVisible reflects as the `open` attribute.
4268
+ // It reports whether the bib is open in any mode (popover or modal).
4269
+ const isExpanded = Boolean(dd && dd.isPopoverVisible);
4270
+ const isFullscreen = Boolean(dd && dd.isBibFullscreen);
4271
+
4272
+ const ctx = {
4273
+ isExpanded,
4274
+ isModal: isFullscreen,
4275
+ isPopover: !isFullscreen,
4276
+ activeInput: null,
4277
+ };
4278
+
4279
+ if (options.inputResolver) {
4280
+ const resolvedInput = options.inputResolver(component, ctx);
4281
+ // Guard against resolvers returning undefined or non-HTMLElement values.
4282
+ ctx.activeInput = resolvedInput instanceof HTMLElement ? resolvedInput : null;
4283
+ }
4284
+
4285
+ return ctx;
4286
+ }
4287
+
4288
+ /**
4289
+ * Wires up a keydown listener that dispatches to strategy[evt.key] or strategy.default.
4290
+ * Handles both sync and async handlers.
4291
+ * @param {HTMLElement} component - The component to attach the listener to.
4292
+ * @param {Object} strategy - Map of key names to handler functions.
4293
+ * @param {Object} [options] - Optional config passed to createDisplayContext.
4294
+ */
4295
+ function applyKeyboardStrategy(component, strategy, options = {}) {
4296
+ component.addEventListener('keydown', async (evt) => {
4297
+ const handler = strategy[evt.key] || strategy.default;
4298
+ if (typeof handler === 'function') {
4299
+ const ctx = createDisplayContext(component, options);
4300
+ await handler(component, evt, ctx);
4301
+ }
4302
+ });
4303
+ }
4304
+
4234
4305
  var styleCss$2$1 = css`: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}`;
4235
4306
 
4236
4307
  var colorCss$2 = css`.container{background-color:var(--ds-auro-dropdownbib-container-color);box-shadow:var(--ds-auro-dropdownbib-boxshadow-color);color:var(--ds-auro-dropdownbib-text-color)}`;
4237
4308
 
4238
4309
  var tokensCss$1 = css`:host(:not([ondark])),:host(:not([appearance=inverse])){--ds-auro-dropdown-label-text-color: var(--ds-basic-color-texticon-muted, #676767);--ds-auro-dropdown-trigger-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdown-trigger-hover-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdown-trigger-container-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdown-trigger-border-color: var(--ds-basic-color-border-bold, #585e67);--ds-auro-dropdown-trigger-outline-color: transparent;--ds-auro-dropdown-trigger-text-color: var(--ds-basic-color-texticon-default, #2a2a2a);--ds-auro-dropdownbib-boxshadow-color: var(--ds-elevation-200, 0px 0px 10px rgba(0, 0, 0, 0.15));--ds-auro-dropdownbib-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdownbib-container-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdownbib-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-dropdown-label-text-color: var(--ds-basic-color-texticon-inverse-muted, #ccd2db);--ds-auro-dropdown-trigger-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdown-trigger-hover-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdown-trigger-container-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdown-trigger-border-color: var(--ds-basic-color-border-inverse, #ffffff);--ds-auro-dropdown-trigger-outline-color: transparent;--ds-auro-dropdown-trigger-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-dropdownbib-boxshadow-color: var(--ds-elevation-200, 0px 0px 10px rgba(0, 0, 0, 0.15));--ds-auro-dropdownbib-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdownbib-container-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdownbib-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}`;
4239
4310
 
4311
+ /**
4312
+ * Creates a keyboard strategy for dialog-specific key handling.
4313
+ * All other keydown behavior is left to the browser's native bubbling path.
4314
+ * @param {HTMLElement} bib - The dropdown bib element.
4315
+ * @returns {Object} Keyboard handlers keyed by `event.key`.
4316
+ */
4317
+ // eslint-disable-next-line no-unused-vars
4318
+ function createDropdownBibKeyboardStrategy(bib) {
4319
+ return {
4320
+ // eslint-disable-next-line no-unused-vars
4321
+ Enter(_dialog, event) {
4322
+ // Floating UI handles Enter key to open the dropdown
4323
+ },
4324
+ // eslint-disable-next-line no-unused-vars
4325
+ Escape(_dialog, event) {
4326
+ // Floating UI handles Escape key to close the dropdown
4327
+ }
4328
+ };
4329
+ }
4330
+
4240
4331
  // Copyright (c) 2020 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
4241
4332
  // See LICENSE in the project root for license information.
4242
4333
  /* eslint-disable max-lines */
@@ -4361,11 +4452,7 @@ class AuroDropdownBib extends LitElement {
4361
4452
  },
4362
4453
 
4363
4454
  /**
4364
- * Set by auro-dropdown when a menu option is highlighted via
4365
- * aria-activedescendant. The dialog keyboard bridge checks this
4366
- * flag so that Enter selects the highlighted option instead of
4367
- * activating the focused interactive element (e.g. the trigger
4368
- * button, or the bibtemplate close button in fullscreen).
4455
+ * Tracks whether a menu option is currently highlighted.
4369
4456
  * @private
4370
4457
  */
4371
4458
  hasActiveDescendant: {
@@ -4439,7 +4526,7 @@ class AuroDropdownBib extends LitElement {
4439
4526
 
4440
4527
  const dialog = this.shadowRoot.querySelector('dialog');
4441
4528
  this._setupCancelHandler(dialog);
4442
- this._setupKeyboardBridge(dialog);
4529
+ applyKeyboardStrategy(dialog, createDropdownBibKeyboardStrategy());
4443
4530
 
4444
4531
  this.dispatchEvent(new CustomEvent('auro-dropdownbib-connected', {
4445
4532
  bubbles: true,
@@ -4466,92 +4553,6 @@ class AuroDropdownBib extends LitElement {
4466
4553
  });
4467
4554
  }
4468
4555
 
4469
- /**
4470
- * showModal() creates a closed focus scope — keyboard events inside
4471
- * the dialog's shadow DOM do NOT bubble out to the combobox/select
4472
- * keydown handlers in the parent shadow DOM. This handler bridges
4473
- * that gap by re-dispatching navigation keys so they cross the
4474
- * shadow boundary and reach the menu navigation logic in the parent
4475
- * component.
4476
- *
4477
- * The trade-off: intercepting these keys means native keyboard
4478
- * behaviors that would normally "just work" must be manually
4479
- * re-implemented here:
4480
- *
4481
- * - Enter on buttons: Custom elements (auro-button) don't get the
4482
- * native Enter→click that <button> provides, so we call .click()
4483
- * directly when Enter is pressed on a button-like element.
4484
- *
4485
- * - Tab: Intercepted and re-dispatched so parent components
4486
- * (select/combobox) can select the active option and close the
4487
- * dialog. The <dialog> provides containment and isolation
4488
- * (inert background, VoiceOver focus trapping, top layer), while
4489
- * the content inside is a role="listbox" navigated via
4490
- * aria-activedescendant (options are not focusable). Tab keyboard
4491
- * behavior follows listbox conventions (select + close) because
4492
- * the dialog's native Tab trap only cycles between the close
4493
- * button and browser chrome.
4494
- *
4495
- * - Escape: The native <dialog> fires a `cancel` event on ESC
4496
- * (handled by _setupCancelHandler), so the re-dispatched Escape
4497
- * is a secondary path for parent components that also listen for
4498
- * Escape keydown.
4499
- *
4500
- * @param {HTMLDialogElement} dialog - The dialog element to attach the keyboard bridge to.
4501
- * @private
4502
- */
4503
- _setupKeyboardBridge(dialog) {
4504
- const navKeys = new Set([
4505
- 'ArrowUp',
4506
- 'ArrowDown',
4507
- 'Enter',
4508
- 'Escape',
4509
- 'Tab'
4510
- ]);
4511
-
4512
- dialog.addEventListener('keydown', (event) => {
4513
- if (!navKeys.has(event.key)) {
4514
- return;
4515
- }
4516
-
4517
- // Custom elements (auro-button) don't get the native Enter→click
4518
- // behavior that <button> has. Find the button in the composed path
4519
- // and click it directly — but only when no menu option is
4520
- // highlighted. In fullscreen mode focus stays on the close button
4521
- // while arrow keys move the active-descendant highlight through
4522
- // the listbox. If the user presses Enter with an option
4523
- // highlighted, the intent is to select that option, not to click
4524
- // the close button. In that case we fall through and bridge the
4525
- // Enter key to the parent component's keyboard strategy.
4526
- if (event.key === 'Enter') {
4527
- if (!this.hasActiveDescendant) {
4528
- const buttonSelector = 'button, [role="button"], auro-button, [auro-button]';
4529
- const btn = event.composedPath().find((el) => el.matches && el.matches(buttonSelector));
4530
- if (btn) {
4531
- event.preventDefault();
4532
- event.stopPropagation();
4533
- btn.click();
4534
- return;
4535
- }
4536
- }
4537
- }
4538
-
4539
- event.preventDefault();
4540
- event.stopPropagation();
4541
- const newEvent = new KeyboardEvent('keydown', {
4542
- key: event.key,
4543
- code: event.code,
4544
- shiftKey: event.shiftKey,
4545
- altKey: event.altKey,
4546
- ctrlKey: event.ctrlKey,
4547
- metaKey: event.metaKey,
4548
- bubbles: true,
4549
- composed: true,
4550
- cancelable: true
4551
- });
4552
- this.dispatchEvent(newEvent);
4553
- });
4554
- }
4555
4556
 
4556
4557
  /**
4557
4558
  * Blocks touch-driven page scroll while a fullscreen modal dialog is open.
@@ -4926,7 +4927,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
4926
4927
  }
4927
4928
  };
4928
4929
 
4929
- var formkitVersion$1 = '202603310458';
4930
+ var formkitVersion$1 = '202604021512';
4930
4931
 
4931
4932
  class AuroElement extends LitElement {
4932
4933
  static get properties() {
@@ -5107,7 +5108,6 @@ class AuroDropdown extends AuroElement {
5107
5108
  this.appearance = 'default';
5108
5109
  this.chevron = false;
5109
5110
  this.disabled = false;
5110
- this.disableFocusTrap = false;
5111
5111
  this.error = false;
5112
5112
  this.tabIndex = 0;
5113
5113
  this.noToggle = false;
@@ -5205,9 +5205,8 @@ class AuroDropdown extends AuroElement {
5205
5205
  // showModal() fires asynchronously via Lit's update cycle, which
5206
5206
  // falls outside the user activation window and causes iOS to
5207
5207
  // dismiss the keyboard.
5208
- if (this.isBibFullscreen && this.bibElement && this.bibElement.value) {
5209
- const useModal = !this.disableFocusTrap;
5210
- this.bibElement.value.open(useModal);
5208
+ if (this.bibElement && this.bibElement.value) {
5209
+ this.bibElement.value.open(this.isBibFullscreen);
5211
5210
  }
5212
5211
  }
5213
5212
 
@@ -5320,14 +5319,6 @@ class AuroDropdown extends AuroElement {
5320
5319
  reflect: true
5321
5320
  },
5322
5321
 
5323
- /**
5324
- * If declared, the focus trap inside of bib will be turned off.
5325
- */
5326
- disableFocusTrap: {
5327
- type: Boolean,
5328
- reflect: true
5329
- },
5330
-
5331
5322
  /**
5332
5323
  * @private
5333
5324
  */
@@ -5601,7 +5592,7 @@ class AuroDropdown extends AuroElement {
5601
5592
  if (this.isPopoverVisible) {
5602
5593
  // Fullscreen: use showModal() for native accessibility (inert outside, focus trap)
5603
5594
  // Desktop: use show() for Floating UI positioning + FocusTrap for focus management
5604
- const useModal = this.isBibFullscreen && !this.disableFocusTrap;
5595
+ const useModal = this.isBibFullscreen;
5605
5596
  this.bibElement.value.open(useModal);
5606
5597
  } else {
5607
5598
  this.bibElement.value.close();
@@ -5611,7 +5602,7 @@ class AuroDropdown extends AuroElement {
5611
5602
  // When fullscreen strategy changes while open, re-open dialog with correct mode
5612
5603
  // (e.g. resizing from desktop → mobile while dropdown is open)
5613
5604
  if (changedProperties.has('isBibFullscreen') && this.isPopoverVisible && this.bibElement.value) {
5614
- const useModal = this.isBibFullscreen && !this.disableFocusTrap;
5605
+ const useModal = this.isBibFullscreen;
5615
5606
  this.bibElement.value.close();
5616
5607
  this.bibElement.value.open(useModal);
5617
5608
  }
@@ -5723,7 +5714,7 @@ class AuroDropdown extends AuroElement {
5723
5714
  * @private
5724
5715
  */
5725
5716
  updateFocusTrap() {
5726
- if (this.isPopoverVisible && !this.disableFocusTrap) {
5717
+ if (this.isPopoverVisible) {
5727
5718
  if (!this.isBibFullscreen) {
5728
5719
  // Desktop: show() doesn't trap focus, so use FocusTrap
5729
5720
  this.focusTrap = new FocusTrap(this.bibContent);
@@ -6679,7 +6670,7 @@ class AuroHelpText extends LitElement {
6679
6670
  }
6680
6671
  }
6681
6672
 
6682
- var formkitVersion = '202603310458';
6673
+ var formkitVersion = '202604021512';
6683
6674
 
6684
6675
  var styleCss = 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}.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, 0.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, 0.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, 0.625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 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, 0.05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
6685
6676
 
@@ -7201,7 +7192,7 @@ class AuroSelect extends AuroElement$1 {
7201
7192
 
7202
7193
  // Prevent dropdown from closing on focus loss since menu content is slotted
7203
7194
  // from select's light DOM and won't be detected by dropdown's contains() check.
7204
- // Select handles Tab key closing explicitly, ESC via dialog cancel, and
7195
+ // Select handles Tab key closing explicitly, `Escape` key via dialog cancel, and
7205
7196
  // click outside works correctly via composedPath().
7206
7197
  this.dropdown.noHideOnThisFocusLoss = true;
7207
7198
 
@@ -7214,12 +7205,28 @@ class AuroSelect extends AuroElement$1 {
7214
7205
  this.dropdown.setActiveDescendant(null);
7215
7206
  this.optionActive = null;
7216
7207
 
7217
- restoreTriggerAfterClose(this.dropdown, this.dropdown.trigger);
7208
+ if (this.dropdown.isBibFullscreen) {
7209
+ restoreTriggerAfterClose(this.dropdown, this.dropdown.trigger);
7210
+ }
7218
7211
  }
7219
7212
 
7220
7213
  if (this.dropdown.isPopoverVisible) {
7221
7214
  this.updateMenuShapeSize();
7222
7215
 
7216
+ // If there's a selected option, highlight it (per W3C APG combobox-select-only pattern)
7217
+ // No selection → first enabled option gets highlighted
7218
+ if (this.optionSelected && !Array.isArray(this.optionSelected)) {
7219
+ this.menu.updateActiveOption(this.optionSelected);
7220
+ } else if (this.multiSelect && Array.isArray(this.optionSelected) && this.optionSelected.length > 0) {
7221
+ this.menu.updateActiveOption(this.optionSelected[0]);
7222
+ } else if (!this.menu.optionActive) {
7223
+ // If no activeOption has yet to be set, then make the first enabled option active by default
7224
+ const firstActive = this.menu.menuService.menuOptions.find((option) => !option.disabled);
7225
+ this.menu.updateActiveOption(firstActive);
7226
+ }
7227
+
7228
+ // Scroll the selected option into view when dropdown opens
7229
+ this.scrollSelectedOptionIntoView();
7223
7230
  if (this.dropdown.isBibFullscreen) {
7224
7231
  // Hide the trigger from assistive technology so VoiceOver cannot reach it
7225
7232
  // behind the fullscreen dialog
@@ -7231,17 +7238,6 @@ class AuroSelect extends AuroElement$1 {
7231
7238
  // multiple Lit update cycles before moving focus into the bib
7232
7239
  doubleRaf(() => {
7233
7240
  this.bibtemplate.focusCloseButton();
7234
-
7235
- // If there's a selected option, highlight it (per W3C APG combobox-select-only pattern)
7236
- // No selection → no highlight
7237
- if (this.optionSelected && !Array.isArray(this.optionSelected)) {
7238
- this.menu.updateActiveOption(this.optionSelected);
7239
- } else if (this.multiSelect && Array.isArray(this.optionSelected) && this.optionSelected.length > 0) {
7240
- this.menu.updateActiveOption(this.optionSelected[0]);
7241
- }
7242
-
7243
- // Scroll the selected option into view when dropdown opens
7244
- this.scrollSelectedOptionIntoView();
7245
7241
  });
7246
7242
  } else {
7247
7243
  // wait til the bib gets fully rendered
@@ -7488,7 +7484,7 @@ class AuroSelect extends AuroElement$1 {
7488
7484
  configureSelect() {
7489
7485
  this.nativeSelect = this.shadowRoot.querySelector('select');
7490
7486
 
7491
- applyKeyboardStrategy(this, selectKeyboardStrategy);
7487
+ applyKeyboardStrategy$1(this, selectKeyboardStrategy);
7492
7488
 
7493
7489
  this.addEventListener('focusin', this.handleFocusin);
7494
7490
 
@@ -1,8 +1,10 @@
1
1
  export namespace selectKeyboardStrategy {
2
2
  export function ArrowUp(component: any, evt: any, ctx: any): void;
3
3
  export function ArrowDown(component: any, evt: any, ctx: any): void;
4
- export function Enter(component: any, evt: any): void;
4
+ export function Enter(component: any, evt: any, ctx: any): void;
5
5
  export function Tab(component: any, evt: any, ctx: any): void;
6
+ export function Home(component: any, evt: any): void;
7
+ export function End(component: any, evt: any): void;
6
8
  function _default(component: any, evt: any): void;
7
9
  export { _default as default };
8
10
  }