@aurodesignsystem-dev/auro-formkit 0.0.0-pr1408.15 → 0.0.0-pr1408.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/checkbox/demo/api.min.js +1 -1
- package/components/checkbox/demo/index.min.js +1 -1
- package/components/checkbox/demo/keyboardBehavior.md +0 -0
- package/components/checkbox/dist/index.js +1 -1
- package/components/checkbox/dist/registered.js +1 -1
- package/components/combobox/demo/api.min.js +320 -282
- package/components/combobox/demo/index.min.js +320 -282
- package/components/combobox/demo/keyboardBehavior.md +9 -36
- package/components/combobox/dist/auro-combobox.d.ts +17 -0
- package/components/combobox/dist/comboboxKeyboardStrategy.d.ts +6 -3
- package/components/combobox/dist/index.js +286 -255
- package/components/combobox/dist/registered.js +286 -255
- package/components/counter/demo/api.md +1 -1
- package/components/counter/demo/api.min.js +202 -146
- package/components/counter/demo/index.min.js +202 -146
- package/components/counter/dist/auro-counter.d.ts +11 -8
- package/components/counter/dist/index.js +202 -146
- package/components/counter/dist/keyboardStrategy.d.ts +4 -0
- package/components/counter/dist/registered.js +202 -146
- package/components/datepicker/demo/api.min.js +148 -137
- package/components/datepicker/demo/index.min.js +148 -137
- package/components/datepicker/dist/index.js +143 -132
- package/components/datepicker/dist/registered.js +143 -132
- package/components/dropdown/demo/api.md +29 -29
- package/components/dropdown/demo/api.min.js +117 -121
- package/components/dropdown/demo/index.min.js +117 -121
- package/components/dropdown/dist/auro-dropdown.d.ts +3 -3
- package/components/dropdown/dist/auro-dropdownBib.d.ts +1 -40
- package/components/dropdown/dist/dropdownBibKeyboardStrategy.d.ts +7 -0
- package/components/dropdown/dist/index.js +101 -109
- package/components/dropdown/dist/registered.js +101 -109
- package/components/form/demo/api.min.js +958 -788
- package/components/form/demo/index.min.js +958 -788
- package/components/form/demo/keyboardBehavior.md +0 -0
- package/components/input/demo/api.min.js +102 -77
- package/components/input/demo/index.min.js +102 -77
- package/components/input/demo/keyboardBehavior.md +0 -0
- package/components/input/dist/auro-input.d.ts +11 -0
- package/components/input/dist/base-input.d.ts +1 -0
- package/components/input/dist/index.js +32 -18
- package/components/input/dist/registered.js +32 -18
- package/components/menu/demo/api.min.js +34 -27
- package/components/menu/demo/index.min.js +34 -27
- package/components/menu/dist/auro-menu.d.ts +0 -6
- package/components/menu/dist/index.js +34 -27
- package/components/menu/dist/registered.js +34 -27
- package/components/radio/demo/api.min.js +1 -1
- package/components/radio/demo/index.min.js +1 -1
- package/components/radio/dist/index.js +1 -1
- package/components/radio/dist/registered.js +1 -1
- package/components/select/demo/api.min.js +225 -166
- package/components/select/demo/index.min.js +225 -166
- package/components/select/demo/keyboardBehavior.md +3 -3
- package/components/select/dist/index.js +191 -139
- package/components/select/dist/registered.js +191 -139
- package/components/select/dist/selectKeyboardStrategy.d.ts +5 -2
- package/custom-elements.json +1547 -1466
- package/package.json +8 -6
|
@@ -1125,7 +1125,13 @@ function guardTouchPassthrough(element) {
|
|
|
1125
1125
|
}
|
|
1126
1126
|
|
|
1127
1127
|
/**
|
|
1128
|
-
* Restores the dropdown trigger after a fullscreen dialog closes
|
|
1128
|
+
* Restores the dropdown trigger after a fullscreen dialog closes
|
|
1129
|
+
* when focus doesn't leave the component (e.g. using Esc or Enter keys).
|
|
1130
|
+
* When leaving the component (e.g., tabbing out of the combobox after closing
|
|
1131
|
+
* the fullscreen dialog), focus restoration is handled by the browser's native
|
|
1132
|
+
* dialog focus restoration behavior, so this function only restores focus
|
|
1133
|
+
* when focus remains inside the component after the dialog closes.
|
|
1134
|
+
|
|
1129
1135
|
*
|
|
1130
1136
|
* Removes the `inert` attribute from the trigger so it is accessible again,
|
|
1131
1137
|
* and restores focus to the given target after one animation frame. The rAF
|
|
@@ -1141,8 +1147,11 @@ function guardTouchPassthrough(element) {
|
|
|
1141
1147
|
function restoreTriggerAfterClose(dropdown, focusTarget) {
|
|
1142
1148
|
dropdown.trigger.inert = false;
|
|
1143
1149
|
|
|
1150
|
+
// Wait a frame so that dialog.close() has completed and the browser's
|
|
1151
|
+
// native focus restoration has run before we attempt to focus the
|
|
1152
|
+
// trigger / input programmatically.
|
|
1144
1153
|
requestAnimationFrame(() => {
|
|
1145
|
-
if (!dropdown.isPopoverVisible) {
|
|
1154
|
+
if (!dropdown.isPopoverVisible && dropdown.trigger.contains(document.activeElement)) {
|
|
1146
1155
|
focusTarget.focus();
|
|
1147
1156
|
}
|
|
1148
1157
|
});
|
|
@@ -1165,7 +1174,7 @@ function restoreTriggerAfterClose(dropdown, focusTarget) {
|
|
|
1165
1174
|
* @returns {{isExpanded: boolean, isModal: boolean, isPopover: boolean, activeInput: HTMLElement|null}}
|
|
1166
1175
|
* isModal and isPopover reflect the display mode (fullscreen vs not) regardless of expanded state.
|
|
1167
1176
|
*/
|
|
1168
|
-
function createDisplayContext(component, options = {}) {
|
|
1177
|
+
function createDisplayContext$1(component, options = {}) {
|
|
1169
1178
|
const dd = options.dropdown || component.dropdown;
|
|
1170
1179
|
// isPopoverVisible reflects as the `open` attribute.
|
|
1171
1180
|
// It reports whether the bib is open in any mode (popover or modal).
|
|
@@ -1195,11 +1204,11 @@ function createDisplayContext(component, options = {}) {
|
|
|
1195
1204
|
* @param {Object} strategy - Map of key names to handler functions.
|
|
1196
1205
|
* @param {Object} [options] - Optional config passed to createDisplayContext.
|
|
1197
1206
|
*/
|
|
1198
|
-
function applyKeyboardStrategy(component, strategy, options = {}) {
|
|
1207
|
+
function applyKeyboardStrategy$1(component, strategy, options = {}) {
|
|
1199
1208
|
component.addEventListener('keydown', async (evt) => {
|
|
1200
1209
|
const handler = strategy[evt.key] || strategy.default;
|
|
1201
1210
|
if (typeof handler === 'function') {
|
|
1202
|
-
const ctx = createDisplayContext(component, options);
|
|
1211
|
+
const ctx = createDisplayContext$1(component, options);
|
|
1203
1212
|
await handler(component, evt, ctx);
|
|
1204
1213
|
}
|
|
1205
1214
|
});
|
|
@@ -1249,102 +1258,32 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
|
|
|
1249
1258
|
if (!clearBtn) {
|
|
1250
1259
|
return false;
|
|
1251
1260
|
}
|
|
1252
|
-
|
|
1261
|
+
const isFocused = Boolean(clearBtn.shadowRoot && clearBtn.shadowRoot.activeElement !== null);
|
|
1262
|
+
return isFocused;
|
|
1253
1263
|
}
|
|
1254
1264
|
|
|
1255
1265
|
const comboboxKeyboardStrategy = {
|
|
1256
|
-
|
|
1257
|
-
// If the clear button has focus, let the browser
|
|
1258
|
-
// stopPropagation prevents parent containers (e.g., forms) from treating
|
|
1259
|
-
// Enter as a submit, but we must NOT call preventDefault — that would
|
|
1260
|
-
// block the browser's built-in "Enter activates focused button" behavior.
|
|
1266
|
+
ArrowDown(component, evt, ctx) {
|
|
1267
|
+
// If the clear button has focus, let the browser handle ArrowDown normally.
|
|
1261
1268
|
if (isClearBtnFocused(ctx)) {
|
|
1262
|
-
evt.stopPropagation();
|
|
1263
1269
|
return;
|
|
1264
1270
|
}
|
|
1265
1271
|
|
|
1266
|
-
if
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
component.setClearBtnFocus();
|
|
1272
|
-
} else {
|
|
1273
|
-
// Prevent the keypress from bubbling to parent containers (e.g., forms)
|
|
1274
|
-
// which could interpret Enter as a submit or trigger other unintended behavior.
|
|
1275
|
-
// This is safe because showBib() opens the dialog programmatically,
|
|
1276
|
-
// not via event propagation.
|
|
1277
|
-
evt.preventDefault();
|
|
1278
|
-
evt.stopPropagation();
|
|
1279
|
-
component.showBib();
|
|
1280
|
-
}
|
|
1281
|
-
},
|
|
1282
|
-
|
|
1283
|
-
Tab(component, evt, ctx) {
|
|
1284
|
-
if (!ctx.isExpanded) {
|
|
1285
|
-
return;
|
|
1286
|
-
}
|
|
1287
|
-
|
|
1288
|
-
// Shift+Tab moves the highlight to the first non-disabled option
|
|
1289
|
-
// without making a selection or closing the bib.
|
|
1290
|
-
if (evt.shiftKey) {
|
|
1291
|
-
evt.preventDefault();
|
|
1292
|
-
const firstActive = component.menu.menuService.menuOptions.find((option) => option.isActive);
|
|
1293
|
-
if (firstActive) {
|
|
1294
|
-
component.menu.updateActiveOption(firstActive);
|
|
1295
|
-
}
|
|
1296
|
-
return;
|
|
1297
|
-
}
|
|
1298
|
-
|
|
1299
|
-
if (ctx.isModal) {
|
|
1300
|
-
if (!ctx.activeInput) {
|
|
1301
|
-
return;
|
|
1302
|
-
}
|
|
1303
|
-
const clearBtn = getClearBtn(ctx);
|
|
1304
|
-
const clearBtnHasFocus = isClearBtnFocused(ctx, clearBtn);
|
|
1305
|
-
|
|
1306
|
-
// Tab from input: if clear button exists and doesn't have focus, focus it
|
|
1307
|
-
if (clearBtn && !clearBtnHasFocus && ctx.activeInput.value) {
|
|
1308
|
-
// Force clear button container visible to work around Safari not
|
|
1309
|
-
// propagating :focus-within through shadow DOM boundaries, which
|
|
1310
|
-
// causes .wrapper:not(:focus-within) to hide .notification.clear.
|
|
1311
|
-
const clearContainer = clearBtn.closest('.clear');
|
|
1312
|
-
if (clearContainer) {
|
|
1313
|
-
clearContainer.style.display = 'flex';
|
|
1314
|
-
clearBtn.addEventListener('focusout', () => {
|
|
1315
|
-
// Delay cleanup so :focus-within settles when focus moves
|
|
1316
|
-
// to a sibling (e.g., Shift+Tab back to the input).
|
|
1317
|
-
requestAnimationFrame(() => {
|
|
1318
|
-
clearContainer.style.display = '';
|
|
1319
|
-
});
|
|
1320
|
-
}, { once: true });
|
|
1321
|
-
}
|
|
1272
|
+
// option display and navigation are prevented if there are no available options
|
|
1273
|
+
if (component.availableOptions.length > 0) {
|
|
1274
|
+
// navigate if bib is open otherwise open it
|
|
1275
|
+
if (component.dropdown.isPopoverVisible) {
|
|
1276
|
+
evt.preventDefault();
|
|
1322
1277
|
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
const nativeBtn = clearBtn.shadowRoot && clearBtn.shadowRoot.querySelector('button');
|
|
1326
|
-
if (nativeBtn) {
|
|
1327
|
-
nativeBtn.focus();
|
|
1278
|
+
if (evt.altKey || evt.metaKey) {
|
|
1279
|
+
component.activateLastEnabledAvailableOption();
|
|
1328
1280
|
} else {
|
|
1329
|
-
|
|
1281
|
+
navigateArrow(component, 'down');
|
|
1330
1282
|
}
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
// Tab from clear button (or no clear button / no value) →
|
|
1335
|
-
// select the highlighted option if any, then close
|
|
1336
|
-
if (component.optionActive) {
|
|
1337
|
-
component.menu.makeSelection();
|
|
1283
|
+
} else {
|
|
1284
|
+
component.showBib();
|
|
1338
1285
|
}
|
|
1339
|
-
component.hideBib();
|
|
1340
|
-
return;
|
|
1341
|
-
}
|
|
1342
|
-
|
|
1343
|
-
// Non-fullscreen: select + close
|
|
1344
|
-
if (component.menu.optionActive && component.menu.optionActive.value) {
|
|
1345
|
-
component.menu.value = component.menu.optionActive.value;
|
|
1346
1286
|
}
|
|
1347
|
-
component.hideBib();
|
|
1348
1287
|
},
|
|
1349
1288
|
|
|
1350
1289
|
ArrowUp(component, evt, ctx) {
|
|
@@ -1353,31 +1292,85 @@ const comboboxKeyboardStrategy = {
|
|
|
1353
1292
|
return;
|
|
1354
1293
|
}
|
|
1355
1294
|
|
|
1295
|
+
// option display and navigation are prevented if there are no available options
|
|
1356
1296
|
if (component.availableOptions.length > 0) {
|
|
1357
|
-
|
|
1297
|
+
// navigate if bib is open otherwise open it
|
|
1298
|
+
if (component.dropdown.isPopoverVisible) {
|
|
1299
|
+
evt.preventDefault();
|
|
1300
|
+
|
|
1301
|
+
if (evt.altKey || evt.metaKey) {
|
|
1302
|
+
component.activateFirstEnabledAvailableOption();
|
|
1303
|
+
} else {
|
|
1304
|
+
navigateArrow(component, 'up');
|
|
1305
|
+
}
|
|
1306
|
+
} else {
|
|
1307
|
+
component.showBib();
|
|
1308
|
+
}
|
|
1358
1309
|
}
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1310
|
+
},
|
|
1311
|
+
|
|
1312
|
+
End(component, evt, ctx) {
|
|
1313
|
+
if (ctx.isExpanded) {
|
|
1362
1314
|
evt.preventDefault();
|
|
1363
|
-
|
|
1315
|
+
evt.stopPropagation();
|
|
1316
|
+
component.activateLastEnabledAvailableOption();
|
|
1364
1317
|
}
|
|
1365
1318
|
},
|
|
1366
1319
|
|
|
1367
|
-
|
|
1368
|
-
// If the clear button has focus, let the browser handle ArrowDown normally.
|
|
1320
|
+
Enter(component, evt, ctx) {
|
|
1369
1321
|
if (isClearBtnFocused(ctx)) {
|
|
1370
|
-
|
|
1371
|
-
|
|
1322
|
+
// If the clear button has focus, let the browser activate it normally.
|
|
1323
|
+
// stopPropagation prevents parent containers (e.g., forms) from treating
|
|
1324
|
+
// Enter as a submit, but we must NOT call preventDefault — that would
|
|
1325
|
+
// block the browser's built-in "Enter activates focused button" behavior.
|
|
1326
|
+
evt.stopPropagation();
|
|
1327
|
+
} else if (ctx.isExpanded && component.menu.optionActive) {
|
|
1328
|
+
component.menu.makeSelection();
|
|
1372
1329
|
|
|
1373
|
-
|
|
1330
|
+
if (ctx.isModal) {
|
|
1331
|
+
component.setTriggerInputFocus();
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
evt.preventDefault();
|
|
1335
|
+
evt.stopPropagation();
|
|
1336
|
+
} else {
|
|
1337
|
+
// Prevent the keypress from bubbling to parent containers (e.g., forms)
|
|
1338
|
+
// which could interpret Enter as a submit or trigger other unintended behavior.
|
|
1339
|
+
// This is safe because showBib() opens the dialog programmatically,
|
|
1340
|
+
// not via event propagation.
|
|
1341
|
+
evt.preventDefault();
|
|
1342
|
+
evt.stopPropagation();
|
|
1374
1343
|
component.showBib();
|
|
1375
1344
|
}
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1345
|
+
},
|
|
1346
|
+
|
|
1347
|
+
Escape(component, _evt, ctx) {
|
|
1348
|
+
if (ctx.isExpanded && ctx.isModal) {
|
|
1349
|
+
component.setTriggerInputFocus();
|
|
1350
|
+
}
|
|
1351
|
+
},
|
|
1352
|
+
|
|
1353
|
+
Home(component, evt, ctx) {
|
|
1354
|
+
if (ctx.isExpanded) {
|
|
1379
1355
|
evt.preventDefault();
|
|
1380
|
-
|
|
1356
|
+
evt.stopPropagation();
|
|
1357
|
+
component.activateFirstEnabledAvailableOption();
|
|
1358
|
+
}
|
|
1359
|
+
},
|
|
1360
|
+
|
|
1361
|
+
Tab(component, evt, ctx) {
|
|
1362
|
+
if (ctx.isExpanded && !isClearBtnFocused(ctx)) {
|
|
1363
|
+
// ClearBtn will not bubble up tab key events when it's focused, so need to manage it here when focused
|
|
1364
|
+
component.menu.makeSelection();
|
|
1365
|
+
component.hideBib();
|
|
1366
|
+
|
|
1367
|
+
// In fullscreen modal mode, closing the dialog does not
|
|
1368
|
+
// automatically restores focus to the input. In the tab case,
|
|
1369
|
+
// Explicitly move focus to the trigger's clear button so the
|
|
1370
|
+
// user can continues tabbing through the page normally.
|
|
1371
|
+
if (ctx.isModal && !evt.shiftKey) {
|
|
1372
|
+
component.setClearBtnFocus();
|
|
1373
|
+
}
|
|
1381
1374
|
}
|
|
1382
1375
|
},
|
|
1383
1376
|
};
|
|
@@ -3195,6 +3188,11 @@ class AuroFloatingUI {
|
|
|
3195
3188
|
this.clickHandler = null;
|
|
3196
3189
|
this.keyDownHandler = null;
|
|
3197
3190
|
|
|
3191
|
+
/**
|
|
3192
|
+
* @private
|
|
3193
|
+
*/
|
|
3194
|
+
this.enableKeyboardHandling = true;
|
|
3195
|
+
|
|
3198
3196
|
/**
|
|
3199
3197
|
* @private
|
|
3200
3198
|
*/
|
|
@@ -3455,11 +3453,10 @@ class AuroFloatingUI {
|
|
|
3455
3453
|
return;
|
|
3456
3454
|
}
|
|
3457
3455
|
|
|
3458
|
-
const { activeElement } = document;
|
|
3459
3456
|
// if focus is still inside of trigger or bib, do not close
|
|
3460
3457
|
if (
|
|
3461
|
-
this.element.
|
|
3462
|
-
this.element.
|
|
3458
|
+
this.element.matches(":focus") ||
|
|
3459
|
+
this.element.matches(":focus-within")
|
|
3463
3460
|
) {
|
|
3464
3461
|
return;
|
|
3465
3462
|
}
|
|
@@ -3530,7 +3527,9 @@ class AuroFloatingUI {
|
|
|
3530
3527
|
document.addEventListener("focusin", this.focusHandler);
|
|
3531
3528
|
}
|
|
3532
3529
|
|
|
3533
|
-
|
|
3530
|
+
if (this.enableKeyboardHandling) {
|
|
3531
|
+
document.addEventListener("keydown", this.keyDownHandler);
|
|
3532
|
+
}
|
|
3534
3533
|
|
|
3535
3534
|
// send this task to the end of queue to prevent conflicting
|
|
3536
3535
|
// it conflicts if showBib gets call from a button that's not this.element.trigger
|
|
@@ -3786,8 +3785,9 @@ class AuroFloatingUI {
|
|
|
3786
3785
|
this.element.bib.setAttribute("id", `${this.id}-floater-bib`);
|
|
3787
3786
|
}
|
|
3788
3787
|
|
|
3789
|
-
configure(elem, eventPrefix) {
|
|
3788
|
+
configure(elem, eventPrefix, enableKeyboardHandling = true) {
|
|
3790
3789
|
AuroFloatingUI.setupMousePressChecker();
|
|
3790
|
+
this.enableKeyboardHandling = enableKeyboardHandling;
|
|
3791
3791
|
|
|
3792
3792
|
this.eventPrefix = eventPrefix;
|
|
3793
3793
|
if (this.element !== elem) {
|
|
@@ -3820,7 +3820,9 @@ class AuroFloatingUI {
|
|
|
3820
3820
|
|
|
3821
3821
|
this.handleEvent = this.handleEvent.bind(this);
|
|
3822
3822
|
if (this.element.trigger) {
|
|
3823
|
-
|
|
3823
|
+
if (this.enableKeyboardHandling) {
|
|
3824
|
+
this.element.trigger.addEventListener("keydown", this.handleEvent);
|
|
3825
|
+
}
|
|
3824
3826
|
this.element.trigger.addEventListener("click", this.handleEvent);
|
|
3825
3827
|
this.element.trigger.addEventListener("mouseenter", this.handleEvent);
|
|
3826
3828
|
this.element.trigger.addEventListener("mouseleave", this.handleEvent);
|
|
@@ -4298,12 +4300,83 @@ let p$4 = class p{registerComponent(t,a){customElements.get(t)||customElements.d
|
|
|
4298
4300
|
|
|
4299
4301
|
var iconVersion$3 = '9.1.2';
|
|
4300
4302
|
|
|
4303
|
+
/**
|
|
4304
|
+
* Computes display state once per keydown event.
|
|
4305
|
+
* Centralizes null-safety checks and makes the shared/modal/popover branching explicit.
|
|
4306
|
+
*
|
|
4307
|
+
* @param {HTMLElement} component - The component with a dropdown reference.
|
|
4308
|
+
* @param {Object} [options] - Optional config.
|
|
4309
|
+
* @param {HTMLElement} [options.dropdown] - Explicit dropdown reference. Falls back to component.dropdown.
|
|
4310
|
+
* @param {Function} [options.inputResolver] - Called with (component, ctx) to resolve the active input element.
|
|
4311
|
+
* @returns {{isExpanded: boolean, isModal: boolean, isPopover: boolean, activeInput: HTMLElement|null}}
|
|
4312
|
+
* isModal and isPopover reflect the display mode (fullscreen vs not) regardless of expanded state.
|
|
4313
|
+
*/
|
|
4314
|
+
function createDisplayContext(component, options = {}) {
|
|
4315
|
+
const dd = options.dropdown || component.dropdown;
|
|
4316
|
+
// isPopoverVisible reflects as the `open` attribute.
|
|
4317
|
+
// It reports whether the bib is open in any mode (popover or modal).
|
|
4318
|
+
const isExpanded = Boolean(dd && dd.isPopoverVisible);
|
|
4319
|
+
const isFullscreen = Boolean(dd && dd.isBibFullscreen);
|
|
4320
|
+
|
|
4321
|
+
const ctx = {
|
|
4322
|
+
isExpanded,
|
|
4323
|
+
isModal: isFullscreen,
|
|
4324
|
+
isPopover: !isFullscreen,
|
|
4325
|
+
activeInput: null,
|
|
4326
|
+
};
|
|
4327
|
+
|
|
4328
|
+
if (options.inputResolver) {
|
|
4329
|
+
const resolvedInput = options.inputResolver(component, ctx);
|
|
4330
|
+
// Guard against resolvers returning undefined or non-HTMLElement values.
|
|
4331
|
+
ctx.activeInput = resolvedInput instanceof HTMLElement ? resolvedInput : null;
|
|
4332
|
+
}
|
|
4333
|
+
|
|
4334
|
+
return ctx;
|
|
4335
|
+
}
|
|
4336
|
+
|
|
4337
|
+
/**
|
|
4338
|
+
* Wires up a keydown listener that dispatches to strategy[evt.key] or strategy.default.
|
|
4339
|
+
* Handles both sync and async handlers.
|
|
4340
|
+
* @param {HTMLElement} component - The component to attach the listener to.
|
|
4341
|
+
* @param {Object} strategy - Map of key names to handler functions.
|
|
4342
|
+
* @param {Object} [options] - Optional config passed to createDisplayContext.
|
|
4343
|
+
*/
|
|
4344
|
+
function applyKeyboardStrategy(component, strategy, options = {}) {
|
|
4345
|
+
component.addEventListener('keydown', async (evt) => {
|
|
4346
|
+
const handler = strategy[evt.key] || strategy.default;
|
|
4347
|
+
if (typeof handler === 'function') {
|
|
4348
|
+
const ctx = createDisplayContext(component, options);
|
|
4349
|
+
await handler(component, evt, ctx);
|
|
4350
|
+
}
|
|
4351
|
+
});
|
|
4352
|
+
}
|
|
4353
|
+
|
|
4301
4354
|
var styleCss$2$1 = i$7`: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}`;
|
|
4302
4355
|
|
|
4303
4356
|
var colorCss$2$1 = i$7`.container{background-color:var(--ds-auro-dropdownbib-container-color);box-shadow:var(--ds-auro-dropdownbib-boxshadow-color);color:var(--ds-auro-dropdownbib-text-color)}`;
|
|
4304
4357
|
|
|
4305
4358
|
var tokensCss$1$2 = i$7`: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)}`;
|
|
4306
4359
|
|
|
4360
|
+
/**
|
|
4361
|
+
* Creates a keyboard strategy for dialog-specific key handling.
|
|
4362
|
+
* All other keydown behavior is left to the browser's native bubbling path.
|
|
4363
|
+
* @param {HTMLElement} bib - The dropdown bib element.
|
|
4364
|
+
* @returns {Object} Keyboard handlers keyed by `event.key`.
|
|
4365
|
+
*/
|
|
4366
|
+
// eslint-disable-next-line no-unused-vars
|
|
4367
|
+
function createDropdownBibKeyboardStrategy(bib) {
|
|
4368
|
+
return {
|
|
4369
|
+
// eslint-disable-next-line no-unused-vars
|
|
4370
|
+
Enter(_dialog, event) {
|
|
4371
|
+
// Floating UI handles Enter key to open the dropdown
|
|
4372
|
+
},
|
|
4373
|
+
// eslint-disable-next-line no-unused-vars
|
|
4374
|
+
Escape(_dialog, event) {
|
|
4375
|
+
// Floating UI handles Escape key to close the dropdown
|
|
4376
|
+
}
|
|
4377
|
+
};
|
|
4378
|
+
}
|
|
4379
|
+
|
|
4307
4380
|
// Copyright (c) 2020 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
|
|
4308
4381
|
// See LICENSE in the project root for license information.
|
|
4309
4382
|
/* eslint-disable max-lines */
|
|
@@ -4428,11 +4501,7 @@ class AuroDropdownBib extends i$4 {
|
|
|
4428
4501
|
},
|
|
4429
4502
|
|
|
4430
4503
|
/**
|
|
4431
|
-
*
|
|
4432
|
-
* aria-activedescendant. The dialog keyboard bridge checks this
|
|
4433
|
-
* flag so that Enter selects the highlighted option instead of
|
|
4434
|
-
* activating the focused interactive element (e.g. the trigger
|
|
4435
|
-
* button, or the bibtemplate close button in fullscreen).
|
|
4504
|
+
* Tracks whether a menu option is currently highlighted.
|
|
4436
4505
|
* @private
|
|
4437
4506
|
*/
|
|
4438
4507
|
hasActiveDescendant: {
|
|
@@ -4506,7 +4575,7 @@ class AuroDropdownBib extends i$4 {
|
|
|
4506
4575
|
|
|
4507
4576
|
const dialog = this.shadowRoot.querySelector('dialog');
|
|
4508
4577
|
this._setupCancelHandler(dialog);
|
|
4509
|
-
|
|
4578
|
+
applyKeyboardStrategy(dialog, createDropdownBibKeyboardStrategy());
|
|
4510
4579
|
|
|
4511
4580
|
this.dispatchEvent(new CustomEvent('auro-dropdownbib-connected', {
|
|
4512
4581
|
bubbles: true,
|
|
@@ -4533,92 +4602,6 @@ class AuroDropdownBib extends i$4 {
|
|
|
4533
4602
|
});
|
|
4534
4603
|
}
|
|
4535
4604
|
|
|
4536
|
-
/**
|
|
4537
|
-
* showModal() creates a closed focus scope — keyboard events inside
|
|
4538
|
-
* the dialog's shadow DOM do NOT bubble out to the combobox/select
|
|
4539
|
-
* keydown handlers in the parent shadow DOM. This handler bridges
|
|
4540
|
-
* that gap by re-dispatching navigation keys so they cross the
|
|
4541
|
-
* shadow boundary and reach the menu navigation logic in the parent
|
|
4542
|
-
* component.
|
|
4543
|
-
*
|
|
4544
|
-
* The trade-off: intercepting these keys means native keyboard
|
|
4545
|
-
* behaviors that would normally "just work" must be manually
|
|
4546
|
-
* re-implemented here:
|
|
4547
|
-
*
|
|
4548
|
-
* - Enter on buttons: Custom elements (auro-button) don't get the
|
|
4549
|
-
* native Enter→click that <button> provides, so we call .click()
|
|
4550
|
-
* directly when Enter is pressed on a button-like element.
|
|
4551
|
-
*
|
|
4552
|
-
* - Tab: Intercepted and re-dispatched so parent components
|
|
4553
|
-
* (select/combobox) can select the active option and close the
|
|
4554
|
-
* dialog. The <dialog> provides containment and isolation
|
|
4555
|
-
* (inert background, VoiceOver focus trapping, top layer), while
|
|
4556
|
-
* the content inside is a role="listbox" navigated via
|
|
4557
|
-
* aria-activedescendant (options are not focusable). Tab keyboard
|
|
4558
|
-
* behavior follows listbox conventions (select + close) because
|
|
4559
|
-
* the dialog's native Tab trap only cycles between the close
|
|
4560
|
-
* button and browser chrome.
|
|
4561
|
-
*
|
|
4562
|
-
* - Escape: The native <dialog> fires a `cancel` event on ESC
|
|
4563
|
-
* (handled by _setupCancelHandler), so the re-dispatched Escape
|
|
4564
|
-
* is a secondary path for parent components that also listen for
|
|
4565
|
-
* Escape keydown.
|
|
4566
|
-
*
|
|
4567
|
-
* @param {HTMLDialogElement} dialog - The dialog element to attach the keyboard bridge to.
|
|
4568
|
-
* @private
|
|
4569
|
-
*/
|
|
4570
|
-
_setupKeyboardBridge(dialog) {
|
|
4571
|
-
const navKeys = new Set([
|
|
4572
|
-
'ArrowUp',
|
|
4573
|
-
'ArrowDown',
|
|
4574
|
-
'Enter',
|
|
4575
|
-
'Escape',
|
|
4576
|
-
'Tab'
|
|
4577
|
-
]);
|
|
4578
|
-
|
|
4579
|
-
dialog.addEventListener('keydown', (event) => {
|
|
4580
|
-
if (!navKeys.has(event.key)) {
|
|
4581
|
-
return;
|
|
4582
|
-
}
|
|
4583
|
-
|
|
4584
|
-
// Custom elements (auro-button) don't get the native Enter→click
|
|
4585
|
-
// behavior that <button> has. Find the button in the composed path
|
|
4586
|
-
// and click it directly — but only when no menu option is
|
|
4587
|
-
// highlighted. In fullscreen mode focus stays on the close button
|
|
4588
|
-
// while arrow keys move the active-descendant highlight through
|
|
4589
|
-
// the listbox. If the user presses Enter with an option
|
|
4590
|
-
// highlighted, the intent is to select that option, not to click
|
|
4591
|
-
// the close button. In that case we fall through and bridge the
|
|
4592
|
-
// Enter key to the parent component's keyboard strategy.
|
|
4593
|
-
if (event.key === 'Enter') {
|
|
4594
|
-
if (!this.hasActiveDescendant) {
|
|
4595
|
-
const buttonSelector = 'button, [role="button"], auro-button, [auro-button]';
|
|
4596
|
-
const btn = event.composedPath().find((el) => el.matches && el.matches(buttonSelector));
|
|
4597
|
-
if (btn) {
|
|
4598
|
-
event.preventDefault();
|
|
4599
|
-
event.stopPropagation();
|
|
4600
|
-
btn.click();
|
|
4601
|
-
return;
|
|
4602
|
-
}
|
|
4603
|
-
}
|
|
4604
|
-
}
|
|
4605
|
-
|
|
4606
|
-
event.preventDefault();
|
|
4607
|
-
event.stopPropagation();
|
|
4608
|
-
const newEvent = new KeyboardEvent('keydown', {
|
|
4609
|
-
key: event.key,
|
|
4610
|
-
code: event.code,
|
|
4611
|
-
shiftKey: event.shiftKey,
|
|
4612
|
-
altKey: event.altKey,
|
|
4613
|
-
ctrlKey: event.ctrlKey,
|
|
4614
|
-
metaKey: event.metaKey,
|
|
4615
|
-
bubbles: true,
|
|
4616
|
-
composed: true,
|
|
4617
|
-
cancelable: true
|
|
4618
|
-
});
|
|
4619
|
-
this.dispatchEvent(newEvent);
|
|
4620
|
-
});
|
|
4621
|
-
}
|
|
4622
4605
|
|
|
4623
4606
|
/**
|
|
4624
4607
|
* Blocks touch-driven page scroll while a fullscreen modal dialog is open.
|
|
@@ -4993,7 +4976,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$4 {
|
|
|
4993
4976
|
}
|
|
4994
4977
|
};
|
|
4995
4978
|
|
|
4996
|
-
var formkitVersion$2 = '
|
|
4979
|
+
var formkitVersion$2 = '202604031704';
|
|
4997
4980
|
|
|
4998
4981
|
let AuroElement$2 = class AuroElement extends i$4 {
|
|
4999
4982
|
static get properties() {
|
|
@@ -5174,7 +5157,7 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5174
5157
|
this.appearance = 'default';
|
|
5175
5158
|
this.chevron = false;
|
|
5176
5159
|
this.disabled = false;
|
|
5177
|
-
this.
|
|
5160
|
+
this.disableKeyboardHandling = false;
|
|
5178
5161
|
this.error = false;
|
|
5179
5162
|
this.tabIndex = 0;
|
|
5180
5163
|
this.noToggle = false;
|
|
@@ -5272,9 +5255,8 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5272
5255
|
// showModal() fires asynchronously via Lit's update cycle, which
|
|
5273
5256
|
// falls outside the user activation window and causes iOS to
|
|
5274
5257
|
// dismiss the keyboard.
|
|
5275
|
-
if (this.
|
|
5276
|
-
|
|
5277
|
-
this.bibElement.value.open(useModal);
|
|
5258
|
+
if (this.bibElement && this.bibElement.value) {
|
|
5259
|
+
this.bibElement.value.open(this.isBibFullscreen);
|
|
5278
5260
|
}
|
|
5279
5261
|
}
|
|
5280
5262
|
|
|
@@ -5388,9 +5370,9 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5388
5370
|
},
|
|
5389
5371
|
|
|
5390
5372
|
/**
|
|
5391
|
-
* If declared, the
|
|
5373
|
+
* If declared, the dropdown will not handle keyboard events and will require the consumer to manage this behavior.
|
|
5392
5374
|
*/
|
|
5393
|
-
|
|
5375
|
+
disableKeyboardHandling: {
|
|
5394
5376
|
type: Boolean,
|
|
5395
5377
|
reflect: true
|
|
5396
5378
|
},
|
|
@@ -5668,7 +5650,7 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5668
5650
|
if (this.isPopoverVisible) {
|
|
5669
5651
|
// Fullscreen: use showModal() for native accessibility (inert outside, focus trap)
|
|
5670
5652
|
// Desktop: use show() for Floating UI positioning + FocusTrap for focus management
|
|
5671
|
-
const useModal = this.isBibFullscreen
|
|
5653
|
+
const useModal = this.isBibFullscreen;
|
|
5672
5654
|
this.bibElement.value.open(useModal);
|
|
5673
5655
|
} else {
|
|
5674
5656
|
this.bibElement.value.close();
|
|
@@ -5678,7 +5660,7 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5678
5660
|
// When fullscreen strategy changes while open, re-open dialog with correct mode
|
|
5679
5661
|
// (e.g. resizing from desktop → mobile while dropdown is open)
|
|
5680
5662
|
if (changedProperties.has('isBibFullscreen') && this.isPopoverVisible && this.bibElement.value) {
|
|
5681
|
-
const useModal = this.isBibFullscreen
|
|
5663
|
+
const useModal = this.isBibFullscreen;
|
|
5682
5664
|
this.bibElement.value.close();
|
|
5683
5665
|
this.bibElement.value.open(useModal);
|
|
5684
5666
|
}
|
|
@@ -5700,7 +5682,7 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5700
5682
|
|
|
5701
5683
|
firstUpdated() {
|
|
5702
5684
|
// Configure the floater to, this will generate the ID for the bib
|
|
5703
|
-
this.floater.configure(this, 'auroDropdown');
|
|
5685
|
+
this.floater.configure(this, 'auroDropdown', !this.disableKeyboardHandling);
|
|
5704
5686
|
|
|
5705
5687
|
// Prevent `contain: layout` on the dropdown host. Layout containment
|
|
5706
5688
|
// creates a containing block for position:fixed descendants (the bib),
|
|
@@ -5790,7 +5772,7 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
5790
5772
|
* @private
|
|
5791
5773
|
*/
|
|
5792
5774
|
updateFocusTrap() {
|
|
5793
|
-
if (this.isPopoverVisible
|
|
5775
|
+
if (this.isPopoverVisible) {
|
|
5794
5776
|
if (!this.isBibFullscreen) {
|
|
5795
5777
|
// Desktop: show() doesn't trap focus, so use FocusTrap
|
|
5796
5778
|
this.focusTrap = new FocusTrap(this.bibContent);
|
|
@@ -6008,6 +5990,7 @@ class AuroDropdown extends AuroElement$2 {
|
|
|
6008
5990
|
aria-expanded="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
|
|
6009
5991
|
aria-controls="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
|
|
6010
5992
|
aria-labelledby="${o(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
|
|
5993
|
+
aria-disabled="${o(this.disabled ? 'true' : undefined)}"
|
|
6011
5994
|
@focusin="${this.handleFocusin}"
|
|
6012
5995
|
@blur="${this.handleFocusOut}">
|
|
6013
5996
|
<div class="triggerContentWrapper" id="triggerLabel">
|
|
@@ -11734,6 +11717,12 @@ class BaseInput extends AuroElement$1 {
|
|
|
11734
11717
|
this.wrapperElement = this.shadowRoot.querySelector('.wrapper');
|
|
11735
11718
|
this.inputElement = this.renderRoot.querySelector('input');
|
|
11736
11719
|
this.labelElement = this.shadowRoot.querySelector('label');
|
|
11720
|
+
this.clearBtn = this.clearButtonRef.value;
|
|
11721
|
+
|
|
11722
|
+
// This must get moved into inputKeyboardStrategy when implemented
|
|
11723
|
+
this.clearBtn.addEventListener('keydown', (evt) => {
|
|
11724
|
+
evt.stopPropagation();
|
|
11725
|
+
});
|
|
11737
11726
|
|
|
11738
11727
|
this.patchInputEvent(this.inputElement);
|
|
11739
11728
|
|
|
@@ -12757,7 +12746,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$4 {
|
|
|
12757
12746
|
}
|
|
12758
12747
|
};
|
|
12759
12748
|
|
|
12760
|
-
var formkitVersion$1 = '
|
|
12749
|
+
var formkitVersion$1 = '202604031704';
|
|
12761
12750
|
|
|
12762
12751
|
// Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
|
|
12763
12752
|
// See LICENSE in the project root for license information.
|
|
@@ -12814,6 +12803,11 @@ class AuroInput extends BaseInput {
|
|
|
12814
12803
|
* @private
|
|
12815
12804
|
*/
|
|
12816
12805
|
this.iconTag = versioning.generateTag('auro-formkit-input-icon', iconVersion$2, _$2);
|
|
12806
|
+
|
|
12807
|
+
/**
|
|
12808
|
+
* @private
|
|
12809
|
+
*/
|
|
12810
|
+
this.clearButtonRef = e$1();
|
|
12817
12811
|
}
|
|
12818
12812
|
|
|
12819
12813
|
static get styles() {
|
|
@@ -12831,6 +12825,19 @@ class AuroInput extends BaseInput {
|
|
|
12831
12825
|
];
|
|
12832
12826
|
}
|
|
12833
12827
|
|
|
12828
|
+
/**
|
|
12829
|
+
* Returns classmap configuration for the clear button visibility.
|
|
12830
|
+
* The button is hidden when the input has no value, is read-only, or is disabled.
|
|
12831
|
+
* @private
|
|
12832
|
+
* @returns {Record<string, boolean>} - Classmap object controlling clear button display state.
|
|
12833
|
+
*/
|
|
12834
|
+
get clearBtnClassMap() {
|
|
12835
|
+
return {
|
|
12836
|
+
'util_displayHidden': !this.hasValue || this.readyOnly || this.disabled
|
|
12837
|
+
};
|
|
12838
|
+
}
|
|
12839
|
+
|
|
12840
|
+
|
|
12834
12841
|
/**
|
|
12835
12842
|
* Determines if the HTML input element should be visually hidden.
|
|
12836
12843
|
* Returns true when display value content exists without focus and has a value,
|
|
@@ -13150,10 +13157,11 @@ class AuroInput extends BaseInput {
|
|
|
13150
13157
|
<${this.buttonTag}
|
|
13151
13158
|
@click="${this.handleClickClear}"
|
|
13152
13159
|
appearance="${this.onDark ? 'inverse' : this.appearance}"
|
|
13153
|
-
class="notificationBtn clearBtn"
|
|
13160
|
+
class="notificationBtn clearBtn ${e$3(this.clearBtnClassMap)}"
|
|
13154
13161
|
shape="circle"
|
|
13155
13162
|
size="sm"
|
|
13156
|
-
variant="ghost"
|
|
13163
|
+
variant="ghost"
|
|
13164
|
+
${n$2(this.clearButtonRef)}>
|
|
13157
13165
|
<span><slot name="ariaLabel.clear">Clear Input</slot></span>
|
|
13158
13166
|
<${this.iconTag}
|
|
13159
13167
|
aria-hidden="true"
|
|
@@ -13298,11 +13306,7 @@ class AuroInput extends BaseInput {
|
|
|
13298
13306
|
<div part="accent-right" class="accents right">
|
|
13299
13307
|
${this.renderValidationErrorIconHtml()}
|
|
13300
13308
|
${this.hasValue && this.type === 'password' ? this.renderHtmlNotificationPassword() : undefined}
|
|
13301
|
-
${this.
|
|
13302
|
-
${!this.disabled && !this.readonly ? u$7`
|
|
13303
|
-
${this.renderHtmlActionClear()}
|
|
13304
|
-
` : undefined}
|
|
13305
|
-
` : undefined}
|
|
13309
|
+
${this.renderHtmlActionClear()}
|
|
13306
13310
|
</div>
|
|
13307
13311
|
</div>
|
|
13308
13312
|
<div class="helpTextWrapper leftIndent rightIndent" part="inputHelpText">
|
|
@@ -13334,11 +13338,7 @@ class AuroInput extends BaseInput {
|
|
|
13334
13338
|
${this.layout.includes('right') || this.layout === "emphasized" ? u$7`
|
|
13335
13339
|
${this.renderValidationErrorIconHtml()}
|
|
13336
13340
|
` : undefined}
|
|
13337
|
-
${this.
|
|
13338
|
-
${!this.disabled && !this.readonly ? u$7`
|
|
13339
|
-
${this.renderHtmlActionClear()}
|
|
13340
|
-
` : undefined}
|
|
13341
|
-
` : undefined}
|
|
13341
|
+
${this.renderHtmlActionClear()}
|
|
13342
13342
|
</div>
|
|
13343
13343
|
</div>
|
|
13344
13344
|
<div class="${e$3(this.helpTextClasses)}" part="inputHelpText">
|
|
@@ -13366,11 +13366,7 @@ class AuroInput extends BaseInput {
|
|
|
13366
13366
|
</div>
|
|
13367
13367
|
<div class="accents right">
|
|
13368
13368
|
${this.renderValidationErrorIconHtml()}
|
|
13369
|
-
${this.
|
|
13370
|
-
${!this.disabled && !this.readonly ? u$7`
|
|
13371
|
-
${this.renderHtmlActionClear()}
|
|
13372
|
-
` : undefined}
|
|
13373
|
-
` : undefined}
|
|
13369
|
+
${this.renderHtmlActionClear()}
|
|
13374
13370
|
</div>
|
|
13375
13371
|
</div>
|
|
13376
13372
|
<div class="helpTextWrapper leftIndent rightIndent" part="inputHelpText">
|
|
@@ -13796,7 +13792,7 @@ class AuroBibtemplate extends i$4 {
|
|
|
13796
13792
|
}
|
|
13797
13793
|
}
|
|
13798
13794
|
|
|
13799
|
-
var formkitVersion = '
|
|
13795
|
+
var formkitVersion = '202604031704';
|
|
13800
13796
|
|
|
13801
13797
|
var styleCss$3 = i$7`.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}`;
|
|
13802
13798
|
|
|
@@ -14275,6 +14271,7 @@ class AuroCombobox extends AuroElement {
|
|
|
14275
14271
|
|
|
14276
14272
|
/**
|
|
14277
14273
|
* Array of available options to display in the dropdown.
|
|
14274
|
+
* This array contains all non-hidden options (e.g., hidden by filtering on input value).
|
|
14278
14275
|
* @private
|
|
14279
14276
|
*/
|
|
14280
14277
|
availableOptions: {
|
|
@@ -14652,12 +14649,40 @@ class AuroCombobox extends AuroElement {
|
|
|
14652
14649
|
AuroLibraryRuntimeUtils$4.prototype.registerComponent(name, AuroCombobox);
|
|
14653
14650
|
}
|
|
14654
14651
|
|
|
14652
|
+
/**
|
|
14653
|
+
* Mark the first available (non-hidden), enabled option as `active`.
|
|
14654
|
+
* @private
|
|
14655
|
+
* @returns {void}
|
|
14656
|
+
*/
|
|
14657
|
+
activateFirstEnabledAvailableOption() {
|
|
14658
|
+
const firstEnabledOptionIndex = this.availableOptions.findIndex((opt) => !opt.disabled);
|
|
14659
|
+
this.updateActiveOption(firstEnabledOptionIndex);
|
|
14660
|
+
}
|
|
14661
|
+
|
|
14662
|
+
/**
|
|
14663
|
+
* Mark the last available (non-hidden), enabled option as `active`.
|
|
14664
|
+
* @private
|
|
14665
|
+
* @returns {void}
|
|
14666
|
+
*/
|
|
14667
|
+
activateLastEnabledAvailableOption() {
|
|
14668
|
+
let lastEnabledOptionIndex = -1;
|
|
14669
|
+
|
|
14670
|
+
// Work backwards through the available options array to find the last enabled option
|
|
14671
|
+
for (let index = this.availableOptions.length - 1; index >= 0; index -= 1) {
|
|
14672
|
+
if (!this.availableOptions[index].disabled) {
|
|
14673
|
+
lastEnabledOptionIndex = index;
|
|
14674
|
+
break;
|
|
14675
|
+
}
|
|
14676
|
+
}
|
|
14677
|
+
|
|
14678
|
+
this.updateActiveOption(lastEnabledOptionIndex);
|
|
14679
|
+
}
|
|
14680
|
+
|
|
14655
14681
|
/**
|
|
14656
14682
|
* Updates the filter for the available options based on the input value.
|
|
14657
14683
|
* @private
|
|
14658
14684
|
*/
|
|
14659
14685
|
updateFilter() {
|
|
14660
|
-
|
|
14661
14686
|
// Reset available options if noFilter is set to false after being true.
|
|
14662
14687
|
if (this.noFilter) {
|
|
14663
14688
|
this.availableOptions = [...this.options];
|
|
@@ -14776,6 +14801,10 @@ class AuroCombobox extends AuroElement {
|
|
|
14776
14801
|
if (this.value && this.input.value && !this.menu.value) {
|
|
14777
14802
|
this.syncValuesAndStates();
|
|
14778
14803
|
}
|
|
14804
|
+
|
|
14805
|
+
if (!this.availableOptions.includes(this.menu.optionActive)) {
|
|
14806
|
+
this.activateFirstEnabledAvailableOption();
|
|
14807
|
+
}
|
|
14779
14808
|
}
|
|
14780
14809
|
|
|
14781
14810
|
/**
|
|
@@ -14849,9 +14878,6 @@ class AuroCombobox extends AuroElement {
|
|
|
14849
14878
|
if (this.dropdownOpen) {
|
|
14850
14879
|
const expandedDelay = 150;
|
|
14851
14880
|
this._expandedTimeout = setTimeout(() => {
|
|
14852
|
-
if (!this.value) {
|
|
14853
|
-
this.updateActiveOption(0);
|
|
14854
|
-
}
|
|
14855
14881
|
this.triggerExpandedState = true;
|
|
14856
14882
|
}, expandedDelay);
|
|
14857
14883
|
} else {
|
|
@@ -14861,22 +14887,16 @@ class AuroCombobox extends AuroElement {
|
|
|
14861
14887
|
// Clear aria-activedescendant when dropdown closes
|
|
14862
14888
|
if (!this.dropdownOpen && this.input) {
|
|
14863
14889
|
this.input.setActiveDescendant(null);
|
|
14864
|
-
this.optionActive = null;
|
|
14865
|
-
|
|
14866
|
-
// Remove the highlighted state from all menu options so re-opening
|
|
14867
|
-
// the dropdown doesn't show a stale highlight.
|
|
14868
|
-
if (this.options) {
|
|
14869
|
-
this.options.forEach((opt) => {
|
|
14870
|
-
opt.active = false;
|
|
14871
|
-
opt.classList.remove('active');
|
|
14872
|
-
});
|
|
14873
|
-
}
|
|
14874
14890
|
|
|
14875
14891
|
// Restore pointer events on the menu in case they were disabled
|
|
14876
14892
|
// during fullscreen open to prevent touch pass-through.
|
|
14877
14893
|
this.menu.style.pointerEvents = '';
|
|
14878
14894
|
|
|
14879
|
-
|
|
14895
|
+
// When closing a fullscreen bib, restore focus to the trigger so that
|
|
14896
|
+
// keyboard navigation continues from the correct place in the page
|
|
14897
|
+
if (this.dropdown.isBibFullscreen) {
|
|
14898
|
+
restoreTriggerAfterClose(this.dropdown, this.input);
|
|
14899
|
+
}
|
|
14880
14900
|
}
|
|
14881
14901
|
|
|
14882
14902
|
if (this.dropdownOpen) {
|
|
@@ -14911,13 +14931,6 @@ class AuroCombobox extends AuroElement {
|
|
|
14911
14931
|
this.setInputFocus();
|
|
14912
14932
|
this._inFullscreenTransition = false;
|
|
14913
14933
|
});
|
|
14914
|
-
} else {
|
|
14915
|
-
// wait a frame in case the bib gets hidden immediately after showing because there is no value
|
|
14916
|
-
setTimeout(() => {
|
|
14917
|
-
if (this.componentHasFocus) {
|
|
14918
|
-
this.setInputFocus();
|
|
14919
|
-
}
|
|
14920
|
-
}, 0);
|
|
14921
14934
|
}
|
|
14922
14935
|
}
|
|
14923
14936
|
});
|
|
@@ -14967,7 +14980,25 @@ class AuroCombobox extends AuroElement {
|
|
|
14967
14980
|
setClearBtnFocus() {
|
|
14968
14981
|
const clearBtn = this.input.shadowRoot.querySelector('.clearBtn');
|
|
14969
14982
|
if (clearBtn) {
|
|
14970
|
-
|
|
14983
|
+
// Wait for the element to fully render across
|
|
14984
|
+
// multiple Lit update cycles before moving focus
|
|
14985
|
+
doubleRaf(() => {
|
|
14986
|
+
clearBtn.focus();
|
|
14987
|
+
});
|
|
14988
|
+
}
|
|
14989
|
+
}
|
|
14990
|
+
|
|
14991
|
+
/**
|
|
14992
|
+
* @private
|
|
14993
|
+
*/
|
|
14994
|
+
setTriggerInputFocus() {
|
|
14995
|
+
const input = this.input.shadowRoot.querySelector('input');
|
|
14996
|
+
if (input) {
|
|
14997
|
+
// Wait for the element to fully render across
|
|
14998
|
+
// multiple Lit update cycles before moving focus
|
|
14999
|
+
doubleRaf(() => {
|
|
15000
|
+
input.focus();
|
|
15001
|
+
});
|
|
14971
15002
|
}
|
|
14972
15003
|
}
|
|
14973
15004
|
|
|
@@ -15290,7 +15321,7 @@ class AuroCombobox extends AuroElement {
|
|
|
15290
15321
|
* @returns {void}
|
|
15291
15322
|
*/
|
|
15292
15323
|
configureCombobox() {
|
|
15293
|
-
applyKeyboardStrategy(this, comboboxKeyboardStrategy, {
|
|
15324
|
+
applyKeyboardStrategy$1(this, comboboxKeyboardStrategy, {
|
|
15294
15325
|
// In modal mode the input moves into the bib; route keyboard events to that element instead.
|
|
15295
15326
|
inputResolver: (comp, ctx) => (ctx.isModal && comp.inputInBib ? comp.inputInBib : comp.input),
|
|
15296
15327
|
});
|
|
@@ -16299,7 +16330,7 @@ class AuroMenuOption extends AuroElement {
|
|
|
16299
16330
|
});
|
|
16300
16331
|
|
|
16301
16332
|
return u$7`
|
|
16302
|
-
<div class="${classes}">
|
|
16333
|
+
<div class="${classes}" aria-disabled="${this.disabled ? 'true' : 'false'}">
|
|
16303
16334
|
${this.selected && !this.noCheckmark
|
|
16304
16335
|
? this.generateIconHtml(checkmarkIcon.svg)
|
|
16305
16336
|
: undefined}
|
|
@@ -17070,10 +17101,10 @@ class AuroMenu extends AuroElement {
|
|
|
17070
17101
|
|
|
17071
17102
|
// Event Bindings
|
|
17072
17103
|
|
|
17073
|
-
/**
|
|
17074
|
-
|
|
17075
|
-
|
|
17076
|
-
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
17104
|
+
// /**
|
|
17105
|
+
// * @private
|
|
17106
|
+
// */
|
|
17107
|
+
// this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
17077
17108
|
|
|
17078
17109
|
|
|
17079
17110
|
/**
|
|
@@ -17422,7 +17453,7 @@ class AuroMenu extends AuroElement {
|
|
|
17422
17453
|
|
|
17423
17454
|
this.provideContext();
|
|
17424
17455
|
|
|
17425
|
-
this.addEventListener('keydown', this.handleKeyDown);
|
|
17456
|
+
// this.addEventListener('keydown', this.handleKeyDown);
|
|
17426
17457
|
this.addEventListener('auroMenuOption-click', this.handleMouseSelect);
|
|
17427
17458
|
this.addEventListener('auroMenuOption-mouseover', this.handleOptionHover);
|
|
17428
17459
|
this.addEventListener('slotchange', this.handleSlotChange);
|
|
@@ -17430,7 +17461,7 @@ class AuroMenu extends AuroElement {
|
|
|
17430
17461
|
}
|
|
17431
17462
|
|
|
17432
17463
|
disconnectedCallback() {
|
|
17433
|
-
this.removeEventListener('keydown', this.handleKeyDown);
|
|
17464
|
+
// this.removeEventListener('keydown', this.handleKeyDown);
|
|
17434
17465
|
this.removeEventListener('auroMenuOption-click', this.handleMouseSelect);
|
|
17435
17466
|
this.removeEventListener('auroMenuOption-mouseover', this.handleOptionHover);
|
|
17436
17467
|
this.removeEventListener('slotchange', this.handleSlotChange);
|
|
@@ -17571,26 +17602,33 @@ class AuroMenu extends AuroElement {
|
|
|
17571
17602
|
|
|
17572
17603
|
// Event Handlers
|
|
17573
17604
|
|
|
17574
|
-
/**
|
|
17575
|
-
|
|
17576
|
-
|
|
17577
|
-
|
|
17578
|
-
|
|
17579
|
-
handleKeyDown(event) {
|
|
17580
|
-
|
|
17581
|
-
|
|
17582
|
-
|
|
17583
|
-
|
|
17584
|
-
|
|
17585
|
-
|
|
17586
|
-
|
|
17587
|
-
|
|
17588
|
-
|
|
17589
|
-
|
|
17590
|
-
|
|
17591
|
-
|
|
17592
|
-
|
|
17593
|
-
|
|
17605
|
+
// /**
|
|
17606
|
+
// * Handles keyboard navigation.
|
|
17607
|
+
// * @private
|
|
17608
|
+
// * @param {KeyboardEvent} event - Event object from the browser.
|
|
17609
|
+
// */
|
|
17610
|
+
// handleKeyDown(event) {
|
|
17611
|
+
// // Update to Chris keyboard handler
|
|
17612
|
+
// // We have a new "navigateArrow" function in that handler, maybe that replaces those keys here?
|
|
17613
|
+
// event.preventDefault();
|
|
17614
|
+
// switch (event.key) {
|
|
17615
|
+
// case "ArrowDown":
|
|
17616
|
+
// console.warn("ArrowDown key is pressed and heard from menu");
|
|
17617
|
+
// this.menuService.highlightNext();
|
|
17618
|
+
// break;
|
|
17619
|
+
// case "ArrowUp":
|
|
17620
|
+
// console.warn("ArrowUp key is pressed and heard from menu");
|
|
17621
|
+
// this.menuService.highlightPrevious();
|
|
17622
|
+
// break;
|
|
17623
|
+
// case "Tab":
|
|
17624
|
+
// case "Enter":
|
|
17625
|
+
// this.menuService.selectHighlightedOption();
|
|
17626
|
+
// // Does this need to get separated into two cases to handle the different expected behavior of tab vs enter?
|
|
17627
|
+
// break;
|
|
17628
|
+
// default:
|
|
17629
|
+
// break;
|
|
17630
|
+
// }
|
|
17631
|
+
// }
|
|
17594
17632
|
|
|
17595
17633
|
/**
|
|
17596
17634
|
* Navigates the menu options in the specified direction.
|