@ni/nimble-components 30.1.3 → 30.1.5
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/dist/all-components-bundle.js +438 -370
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +3354 -3347
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/combobox/index.d.ts +17 -1
- package/dist/esm/combobox/index.js +64 -21
- package/dist/esm/combobox/index.js.map +1 -1
- package/dist/esm/combobox/testing/combobox.pageobject.d.ts +4 -0
- package/dist/esm/combobox/testing/combobox.pageobject.js +7 -1
- package/dist/esm/combobox/testing/combobox.pageobject.js.map +1 -1
- package/dist/esm/menu/index.d.ts +1 -1
- package/dist/esm/menu/index.js +3 -1
- package/dist/esm/menu/index.js.map +1 -1
- package/dist/esm/menu/menu.foundation.d.ts +83 -0
- package/dist/esm/menu/menu.foundation.js +306 -0
- package/dist/esm/menu/menu.foundation.js.map +1 -0
- package/dist/esm/menu/template.d.ts +4 -0
- package/dist/esm/menu/template.js +21 -0
- package/dist/esm/menu/template.js.map +1 -0
- package/package.json +1 -1
|
@@ -5281,14 +5281,14 @@
|
|
|
5281
5281
|
/**
|
|
5282
5282
|
* A test that ensures that all arguments are HTML Elements
|
|
5283
5283
|
*/
|
|
5284
|
-
function isHTMLElement(...args) {
|
|
5284
|
+
function isHTMLElement$1(...args) {
|
|
5285
5285
|
return args.every((arg) => arg instanceof HTMLElement);
|
|
5286
5286
|
}
|
|
5287
5287
|
/**
|
|
5288
5288
|
* Returns all displayed elements inside of a root node that match a provided selector
|
|
5289
5289
|
*/
|
|
5290
5290
|
function getDisplayedNodes(rootNode, selector) {
|
|
5291
|
-
if (!rootNode || !selector || !isHTMLElement(rootNode)) {
|
|
5291
|
+
if (!rootNode || !selector || !isHTMLElement$1(rootNode)) {
|
|
5292
5292
|
return;
|
|
5293
5293
|
}
|
|
5294
5294
|
const nodes = Array.from(rootNode.querySelectorAll(selector));
|
|
@@ -7687,7 +7687,7 @@
|
|
|
7687
7687
|
* @public
|
|
7688
7688
|
*/
|
|
7689
7689
|
function isListboxOption(el) {
|
|
7690
|
-
return (isHTMLElement(el) &&
|
|
7690
|
+
return (isHTMLElement$1(el) &&
|
|
7691
7691
|
(el.getAttribute("role") === "option" ||
|
|
7692
7692
|
el instanceof HTMLOptionElement));
|
|
7693
7693
|
}
|
|
@@ -11098,307 +11098,6 @@
|
|
|
11098
11098
|
</template>
|
|
11099
11099
|
`;
|
|
11100
11100
|
|
|
11101
|
-
/**
|
|
11102
|
-
* The template for the {@link @microsoft/fast-foundation#Menu} component.
|
|
11103
|
-
* @public
|
|
11104
|
-
*/
|
|
11105
|
-
const menuTemplate = (context, definition) => html `
|
|
11106
|
-
<template
|
|
11107
|
-
slot="${x => (x.slot ? x.slot : x.isNestedMenu() ? "submenu" : void 0)}"
|
|
11108
|
-
role="menu"
|
|
11109
|
-
@keydown="${(x, c) => x.handleMenuKeyDown(c.event)}"
|
|
11110
|
-
@focusout="${(x, c) => x.handleFocusOut(c.event)}"
|
|
11111
|
-
>
|
|
11112
|
-
<slot ${slotted("items")}></slot>
|
|
11113
|
-
</template>
|
|
11114
|
-
`;
|
|
11115
|
-
|
|
11116
|
-
/**
|
|
11117
|
-
* A Menu Custom HTML Element.
|
|
11118
|
-
* Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#menu | ARIA menu }.
|
|
11119
|
-
*
|
|
11120
|
-
* @slot - The default slot for the menu items
|
|
11121
|
-
*
|
|
11122
|
-
* @public
|
|
11123
|
-
*/
|
|
11124
|
-
let Menu$1 = class Menu extends FoundationElement {
|
|
11125
|
-
constructor() {
|
|
11126
|
-
super(...arguments);
|
|
11127
|
-
this.expandedItem = null;
|
|
11128
|
-
/**
|
|
11129
|
-
* The index of the focusable element in the items array
|
|
11130
|
-
* defaults to -1
|
|
11131
|
-
*/
|
|
11132
|
-
this.focusIndex = -1;
|
|
11133
|
-
/**
|
|
11134
|
-
* @internal
|
|
11135
|
-
*/
|
|
11136
|
-
this.isNestedMenu = () => {
|
|
11137
|
-
return (this.parentElement !== null &&
|
|
11138
|
-
isHTMLElement(this.parentElement) &&
|
|
11139
|
-
this.parentElement.getAttribute("role") === "menuitem");
|
|
11140
|
-
};
|
|
11141
|
-
/**
|
|
11142
|
-
* if focus is moving out of the menu, reset to a stable initial state
|
|
11143
|
-
* @internal
|
|
11144
|
-
*/
|
|
11145
|
-
this.handleFocusOut = (e) => {
|
|
11146
|
-
if (!this.contains(e.relatedTarget) && this.menuItems !== undefined) {
|
|
11147
|
-
this.collapseExpandedItem();
|
|
11148
|
-
// find our first focusable element
|
|
11149
|
-
const focusIndex = this.menuItems.findIndex(this.isFocusableElement);
|
|
11150
|
-
// set the current focus index's tabindex to -1
|
|
11151
|
-
this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
|
|
11152
|
-
// set the first focusable element tabindex to 0
|
|
11153
|
-
this.menuItems[focusIndex].setAttribute("tabindex", "0");
|
|
11154
|
-
// set the focus index
|
|
11155
|
-
this.focusIndex = focusIndex;
|
|
11156
|
-
}
|
|
11157
|
-
};
|
|
11158
|
-
this.handleItemFocus = (e) => {
|
|
11159
|
-
const targetItem = e.target;
|
|
11160
|
-
if (this.menuItems !== undefined &&
|
|
11161
|
-
targetItem !== this.menuItems[this.focusIndex]) {
|
|
11162
|
-
this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
|
|
11163
|
-
this.focusIndex = this.menuItems.indexOf(targetItem);
|
|
11164
|
-
targetItem.setAttribute("tabindex", "0");
|
|
11165
|
-
}
|
|
11166
|
-
};
|
|
11167
|
-
this.handleExpandedChanged = (e) => {
|
|
11168
|
-
if (e.defaultPrevented ||
|
|
11169
|
-
e.target === null ||
|
|
11170
|
-
this.menuItems === undefined ||
|
|
11171
|
-
this.menuItems.indexOf(e.target) < 0) {
|
|
11172
|
-
return;
|
|
11173
|
-
}
|
|
11174
|
-
e.preventDefault();
|
|
11175
|
-
const changedItem = e.target;
|
|
11176
|
-
// closing an expanded item without opening another
|
|
11177
|
-
if (this.expandedItem !== null &&
|
|
11178
|
-
changedItem === this.expandedItem &&
|
|
11179
|
-
changedItem.expanded === false) {
|
|
11180
|
-
this.expandedItem = null;
|
|
11181
|
-
return;
|
|
11182
|
-
}
|
|
11183
|
-
if (changedItem.expanded) {
|
|
11184
|
-
if (this.expandedItem !== null && this.expandedItem !== changedItem) {
|
|
11185
|
-
this.expandedItem.expanded = false;
|
|
11186
|
-
}
|
|
11187
|
-
this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
|
|
11188
|
-
this.expandedItem = changedItem;
|
|
11189
|
-
this.focusIndex = this.menuItems.indexOf(changedItem);
|
|
11190
|
-
changedItem.setAttribute("tabindex", "0");
|
|
11191
|
-
}
|
|
11192
|
-
};
|
|
11193
|
-
this.removeItemListeners = () => {
|
|
11194
|
-
if (this.menuItems !== undefined) {
|
|
11195
|
-
this.menuItems.forEach((item) => {
|
|
11196
|
-
item.removeEventListener("expanded-change", this.handleExpandedChanged);
|
|
11197
|
-
item.removeEventListener("focus", this.handleItemFocus);
|
|
11198
|
-
});
|
|
11199
|
-
}
|
|
11200
|
-
};
|
|
11201
|
-
this.setItems = () => {
|
|
11202
|
-
const newItems = this.domChildren();
|
|
11203
|
-
this.removeItemListeners();
|
|
11204
|
-
this.menuItems = newItems;
|
|
11205
|
-
const menuItems = this.menuItems.filter(this.isMenuItemElement);
|
|
11206
|
-
// if our focus index is not -1 we have items
|
|
11207
|
-
if (menuItems.length) {
|
|
11208
|
-
this.focusIndex = 0;
|
|
11209
|
-
}
|
|
11210
|
-
function elementIndent(el) {
|
|
11211
|
-
const role = el.getAttribute("role");
|
|
11212
|
-
const startSlot = el.querySelector("[slot=start]");
|
|
11213
|
-
if (role !== MenuItemRole.menuitem && startSlot === null) {
|
|
11214
|
-
return 1;
|
|
11215
|
-
}
|
|
11216
|
-
else if (role === MenuItemRole.menuitem && startSlot !== null) {
|
|
11217
|
-
return 1;
|
|
11218
|
-
}
|
|
11219
|
-
else if (role !== MenuItemRole.menuitem && startSlot !== null) {
|
|
11220
|
-
return 2;
|
|
11221
|
-
}
|
|
11222
|
-
else {
|
|
11223
|
-
return 0;
|
|
11224
|
-
}
|
|
11225
|
-
}
|
|
11226
|
-
const indent = menuItems.reduce((accum, current) => {
|
|
11227
|
-
const elementValue = elementIndent(current);
|
|
11228
|
-
return accum > elementValue ? accum : elementValue;
|
|
11229
|
-
}, 0);
|
|
11230
|
-
menuItems.forEach((item, index) => {
|
|
11231
|
-
item.setAttribute("tabindex", index === 0 ? "0" : "-1");
|
|
11232
|
-
item.addEventListener("expanded-change", this.handleExpandedChanged);
|
|
11233
|
-
item.addEventListener("focus", this.handleItemFocus);
|
|
11234
|
-
if (item instanceof MenuItem$1 || "startColumnCount" in item) {
|
|
11235
|
-
item.startColumnCount = indent;
|
|
11236
|
-
}
|
|
11237
|
-
});
|
|
11238
|
-
};
|
|
11239
|
-
/**
|
|
11240
|
-
* handle change from child element
|
|
11241
|
-
*/
|
|
11242
|
-
this.changeHandler = (e) => {
|
|
11243
|
-
if (this.menuItems === undefined) {
|
|
11244
|
-
return;
|
|
11245
|
-
}
|
|
11246
|
-
const changedMenuItem = e.target;
|
|
11247
|
-
const changeItemIndex = this.menuItems.indexOf(changedMenuItem);
|
|
11248
|
-
if (changeItemIndex === -1) {
|
|
11249
|
-
return;
|
|
11250
|
-
}
|
|
11251
|
-
if (changedMenuItem.role === "menuitemradio" &&
|
|
11252
|
-
changedMenuItem.checked === true) {
|
|
11253
|
-
for (let i = changeItemIndex - 1; i >= 0; --i) {
|
|
11254
|
-
const item = this.menuItems[i];
|
|
11255
|
-
const role = item.getAttribute("role");
|
|
11256
|
-
if (role === MenuItemRole.menuitemradio) {
|
|
11257
|
-
item.checked = false;
|
|
11258
|
-
}
|
|
11259
|
-
if (role === "separator") {
|
|
11260
|
-
break;
|
|
11261
|
-
}
|
|
11262
|
-
}
|
|
11263
|
-
const maxIndex = this.menuItems.length - 1;
|
|
11264
|
-
for (let i = changeItemIndex + 1; i <= maxIndex; ++i) {
|
|
11265
|
-
const item = this.menuItems[i];
|
|
11266
|
-
const role = item.getAttribute("role");
|
|
11267
|
-
if (role === MenuItemRole.menuitemradio) {
|
|
11268
|
-
item.checked = false;
|
|
11269
|
-
}
|
|
11270
|
-
if (role === "separator") {
|
|
11271
|
-
break;
|
|
11272
|
-
}
|
|
11273
|
-
}
|
|
11274
|
-
}
|
|
11275
|
-
};
|
|
11276
|
-
/**
|
|
11277
|
-
* check if the item is a menu item
|
|
11278
|
-
*/
|
|
11279
|
-
this.isMenuItemElement = (el) => {
|
|
11280
|
-
return (isHTMLElement(el) &&
|
|
11281
|
-
Menu.focusableElementRoles.hasOwnProperty(el.getAttribute("role")));
|
|
11282
|
-
};
|
|
11283
|
-
/**
|
|
11284
|
-
* check if the item is focusable
|
|
11285
|
-
*/
|
|
11286
|
-
this.isFocusableElement = (el) => {
|
|
11287
|
-
return this.isMenuItemElement(el);
|
|
11288
|
-
};
|
|
11289
|
-
}
|
|
11290
|
-
itemsChanged(oldValue, newValue) {
|
|
11291
|
-
// only update children after the component is connected and
|
|
11292
|
-
// the setItems has run on connectedCallback
|
|
11293
|
-
// (menuItems is undefined until then)
|
|
11294
|
-
if (this.$fastController.isConnected && this.menuItems !== undefined) {
|
|
11295
|
-
this.setItems();
|
|
11296
|
-
}
|
|
11297
|
-
}
|
|
11298
|
-
/**
|
|
11299
|
-
* @internal
|
|
11300
|
-
*/
|
|
11301
|
-
connectedCallback() {
|
|
11302
|
-
super.connectedCallback();
|
|
11303
|
-
DOM.queueUpdate(() => {
|
|
11304
|
-
// wait until children have had a chance to
|
|
11305
|
-
// connect before setting/checking their props/attributes
|
|
11306
|
-
this.setItems();
|
|
11307
|
-
});
|
|
11308
|
-
this.addEventListener("change", this.changeHandler);
|
|
11309
|
-
}
|
|
11310
|
-
/**
|
|
11311
|
-
* @internal
|
|
11312
|
-
*/
|
|
11313
|
-
disconnectedCallback() {
|
|
11314
|
-
super.disconnectedCallback();
|
|
11315
|
-
this.removeItemListeners();
|
|
11316
|
-
this.menuItems = undefined;
|
|
11317
|
-
this.removeEventListener("change", this.changeHandler);
|
|
11318
|
-
}
|
|
11319
|
-
/**
|
|
11320
|
-
* Focuses the first item in the menu.
|
|
11321
|
-
*
|
|
11322
|
-
* @public
|
|
11323
|
-
*/
|
|
11324
|
-
focus() {
|
|
11325
|
-
this.setFocus(0, 1);
|
|
11326
|
-
}
|
|
11327
|
-
/**
|
|
11328
|
-
* Collapses any expanded menu items.
|
|
11329
|
-
*
|
|
11330
|
-
* @public
|
|
11331
|
-
*/
|
|
11332
|
-
collapseExpandedItem() {
|
|
11333
|
-
if (this.expandedItem !== null) {
|
|
11334
|
-
this.expandedItem.expanded = false;
|
|
11335
|
-
this.expandedItem = null;
|
|
11336
|
-
}
|
|
11337
|
-
}
|
|
11338
|
-
/**
|
|
11339
|
-
* @internal
|
|
11340
|
-
*/
|
|
11341
|
-
handleMenuKeyDown(e) {
|
|
11342
|
-
if (e.defaultPrevented || this.menuItems === undefined) {
|
|
11343
|
-
return;
|
|
11344
|
-
}
|
|
11345
|
-
switch (e.key) {
|
|
11346
|
-
case keyArrowDown$1:
|
|
11347
|
-
// go forward one index
|
|
11348
|
-
this.setFocus(this.focusIndex + 1, 1);
|
|
11349
|
-
return;
|
|
11350
|
-
case keyArrowUp$1:
|
|
11351
|
-
// go back one index
|
|
11352
|
-
this.setFocus(this.focusIndex - 1, -1);
|
|
11353
|
-
return;
|
|
11354
|
-
case keyEnd$1:
|
|
11355
|
-
// set focus on last item
|
|
11356
|
-
this.setFocus(this.menuItems.length - 1, -1);
|
|
11357
|
-
return;
|
|
11358
|
-
case keyHome$1:
|
|
11359
|
-
// set focus on first item
|
|
11360
|
-
this.setFocus(0, 1);
|
|
11361
|
-
return;
|
|
11362
|
-
default:
|
|
11363
|
-
// if we are not handling the event, do not prevent default
|
|
11364
|
-
return true;
|
|
11365
|
-
}
|
|
11366
|
-
}
|
|
11367
|
-
/**
|
|
11368
|
-
* get an array of valid DOM children
|
|
11369
|
-
*/
|
|
11370
|
-
domChildren() {
|
|
11371
|
-
return Array.from(this.children).filter(child => !child.hasAttribute("hidden"));
|
|
11372
|
-
}
|
|
11373
|
-
setFocus(focusIndex, adjustment) {
|
|
11374
|
-
if (this.menuItems === undefined) {
|
|
11375
|
-
return;
|
|
11376
|
-
}
|
|
11377
|
-
while (focusIndex >= 0 && focusIndex < this.menuItems.length) {
|
|
11378
|
-
const child = this.menuItems[focusIndex];
|
|
11379
|
-
if (this.isFocusableElement(child)) {
|
|
11380
|
-
// change the previous index to -1
|
|
11381
|
-
if (this.focusIndex > -1 &&
|
|
11382
|
-
this.menuItems.length >= this.focusIndex - 1) {
|
|
11383
|
-
this.menuItems[this.focusIndex].setAttribute("tabindex", "-1");
|
|
11384
|
-
}
|
|
11385
|
-
// update the focus index
|
|
11386
|
-
this.focusIndex = focusIndex;
|
|
11387
|
-
// update the tabindex of next focusable element
|
|
11388
|
-
child.setAttribute("tabindex", "0");
|
|
11389
|
-
// focus the element
|
|
11390
|
-
child.focus();
|
|
11391
|
-
break;
|
|
11392
|
-
}
|
|
11393
|
-
focusIndex += adjustment;
|
|
11394
|
-
}
|
|
11395
|
-
}
|
|
11396
|
-
};
|
|
11397
|
-
Menu$1.focusableElementRoles = roleForMenuItem;
|
|
11398
|
-
__decorate([
|
|
11399
|
-
observable
|
|
11400
|
-
], Menu$1.prototype, "items", void 0);
|
|
11401
|
-
|
|
11402
11101
|
/**
|
|
11403
11102
|
* The template for the {@link @microsoft/fast-foundation#(NumberField:class)} component.
|
|
11404
11103
|
* @public
|
|
@@ -14779,7 +14478,7 @@
|
|
|
14779
14478
|
* determines if element is an HTMLElement and if it has the role treeitem
|
|
14780
14479
|
*/
|
|
14781
14480
|
function isTreeItemElement(el) {
|
|
14782
|
-
return isHTMLElement(el) && el.getAttribute("role") === "treeitem";
|
|
14481
|
+
return isHTMLElement$1(el) && el.getAttribute("role") === "treeitem";
|
|
14783
14482
|
}
|
|
14784
14483
|
/**
|
|
14785
14484
|
* A Tree item Custom HTML Element.
|
|
@@ -15139,7 +14838,7 @@
|
|
|
15139
14838
|
return;
|
|
15140
14839
|
}
|
|
15141
14840
|
const focusItem = visibleNodes[visibleNodes.indexOf(item) + delta];
|
|
15142
|
-
if (isHTMLElement(focusItem)) {
|
|
14841
|
+
if (isHTMLElement$1(focusItem)) {
|
|
15143
14842
|
TreeItem$1.focusItem(focusItem);
|
|
15144
14843
|
}
|
|
15145
14844
|
}
|
|
@@ -16333,7 +16032,7 @@
|
|
|
16333
16032
|
|
|
16334
16033
|
/**
|
|
16335
16034
|
* Do not edit directly
|
|
16336
|
-
* Generated on Tue, 30 Jul 2024
|
|
16035
|
+
* Generated on Tue, 30 Jul 2024 18:01:26 GMT
|
|
16337
16036
|
*/
|
|
16338
16037
|
|
|
16339
16038
|
const Information100DarkUi = "#a46eff";
|
|
@@ -16734,6 +16433,13 @@
|
|
|
16734
16433
|
return -1;
|
|
16735
16434
|
}
|
|
16736
16435
|
|
|
16436
|
+
/**
|
|
16437
|
+
* A test that ensures that all arguments are HTML Elements
|
|
16438
|
+
*/
|
|
16439
|
+
function isHTMLElement(...args) {
|
|
16440
|
+
return args.every((arg) => arg instanceof HTMLElement);
|
|
16441
|
+
}
|
|
16442
|
+
|
|
16737
16443
|
/**
|
|
16738
16444
|
* This set of exported strings reference https://developer.mozilla.org/en-US/docs/Web/Events
|
|
16739
16445
|
* and should include all non-deprecated and non-experimental Standard events
|
|
@@ -16788,7 +16494,7 @@
|
|
|
16788
16494
|
return `${prefix}${uniqueIdCounter++}`;
|
|
16789
16495
|
}
|
|
16790
16496
|
|
|
16791
|
-
const template$
|
|
16497
|
+
const template$L = html `<slot></slot>`;
|
|
16792
16498
|
|
|
16793
16499
|
const styles$10 = css `
|
|
16794
16500
|
${display('contents')}
|
|
@@ -16906,7 +16612,7 @@
|
|
|
16906
16612
|
const nimbleDesignSystemProvider = ThemeProvider.compose({
|
|
16907
16613
|
baseName: 'theme-provider',
|
|
16908
16614
|
styles: styles$10,
|
|
16909
|
-
template: template$
|
|
16615
|
+
template: template$L
|
|
16910
16616
|
});
|
|
16911
16617
|
DesignSystem.getOrCreate()
|
|
16912
16618
|
.withPrefix('nimble')
|
|
@@ -17178,7 +16884,7 @@
|
|
|
17178
16884
|
`;
|
|
17179
16885
|
|
|
17180
16886
|
// prettier-ignore
|
|
17181
|
-
const template$
|
|
16887
|
+
const template$K = (_context, definition) => html `${
|
|
17182
16888
|
/* top-container div is necessary because setting contenteditable directly on the native anchor instead
|
|
17183
16889
|
leaves it focusable, unlike the behavior you get when the anchor is _within_ a contenteditable element.
|
|
17184
16890
|
*/ ''}<div
|
|
@@ -17281,7 +16987,7 @@
|
|
|
17281
16987
|
const nimbleAnchor = Anchor.compose({
|
|
17282
16988
|
baseName: 'anchor',
|
|
17283
16989
|
baseClass: Anchor$1,
|
|
17284
|
-
template: template$
|
|
16990
|
+
template: template$K,
|
|
17285
16991
|
styles: styles$$,
|
|
17286
16992
|
shadowOptions: {
|
|
17287
16993
|
delegatesFocus: true
|
|
@@ -17698,7 +17404,7 @@
|
|
|
17698
17404
|
}
|
|
17699
17405
|
`;
|
|
17700
17406
|
|
|
17701
|
-
const template$
|
|
17407
|
+
const template$J = (context, definition) => html `
|
|
17702
17408
|
<a
|
|
17703
17409
|
class="control"
|
|
17704
17410
|
part="control"
|
|
@@ -17780,7 +17486,7 @@
|
|
|
17780
17486
|
], AnchorButton.prototype, "disabled", void 0);
|
|
17781
17487
|
const nimbleAnchorButton = AnchorButton.compose({
|
|
17782
17488
|
baseName: 'anchor-button',
|
|
17783
|
-
template: template$
|
|
17489
|
+
template: template$J,
|
|
17784
17490
|
styles: styles$Z,
|
|
17785
17491
|
shadowOptions: {
|
|
17786
17492
|
delegatesFocus: true
|
|
@@ -17872,7 +17578,7 @@
|
|
|
17872
17578
|
}
|
|
17873
17579
|
`;
|
|
17874
17580
|
|
|
17875
|
-
const template$
|
|
17581
|
+
const template$I = (context, definition) => html `
|
|
17876
17582
|
<template
|
|
17877
17583
|
role="menuitem"
|
|
17878
17584
|
class="${x => (typeof x.startColumnCount === 'number'
|
|
@@ -17973,7 +17679,7 @@
|
|
|
17973
17679
|
// FoundationAnchor already applies the StartEnd mixin, so we don't need to do it here.
|
|
17974
17680
|
const nimbleAnchorMenuItem = AnchorMenuItem.compose({
|
|
17975
17681
|
baseName: 'anchor-menu-item',
|
|
17976
|
-
template: template$
|
|
17682
|
+
template: template$I,
|
|
17977
17683
|
styles: styles$Y,
|
|
17978
17684
|
shadowOptions: {
|
|
17979
17685
|
delegatesFocus: true
|
|
@@ -18100,7 +17806,7 @@
|
|
|
18100
17806
|
}
|
|
18101
17807
|
`;
|
|
18102
17808
|
|
|
18103
|
-
const template$
|
|
17809
|
+
const template$H = (context, definition) => html `
|
|
18104
17810
|
<template slot="anchortab" role="tab" aria-disabled="${x => x.disabled}">
|
|
18105
17811
|
<a
|
|
18106
17812
|
download="${x => x.download}"
|
|
@@ -18152,7 +17858,7 @@
|
|
|
18152
17858
|
// FoundationAnchor already applies the StartEnd mixin, so we don't need to do it here.
|
|
18153
17859
|
const nimbleAnchorTab = AnchorTab.compose({
|
|
18154
17860
|
baseName: 'anchor-tab',
|
|
18155
|
-
template: template$
|
|
17861
|
+
template: template$H,
|
|
18156
17862
|
styles: styles$X,
|
|
18157
17863
|
shadowOptions: {
|
|
18158
17864
|
delegatesFocus: true
|
|
@@ -18181,7 +17887,7 @@
|
|
|
18181
17887
|
}
|
|
18182
17888
|
`;
|
|
18183
17889
|
|
|
18184
|
-
const template$
|
|
17890
|
+
const template$G = (context, definition) => html `
|
|
18185
17891
|
${startSlotTemplate(context, definition)}
|
|
18186
17892
|
<div ${ref('tablist')} class="tablist" part="tablist" role="tablist">
|
|
18187
17893
|
<slot name="anchortab" ${slotted('tabs')}></slot>
|
|
@@ -18387,7 +18093,7 @@
|
|
|
18387
18093
|
applyMixins(AnchorTabs, StartEnd);
|
|
18388
18094
|
const nimbleAnchorTabs = AnchorTabs.compose({
|
|
18389
18095
|
baseName: 'anchor-tabs',
|
|
18390
|
-
template: template$
|
|
18096
|
+
template: template$G,
|
|
18391
18097
|
styles: styles$W,
|
|
18392
18098
|
shadowOptions: {
|
|
18393
18099
|
delegatesFocus: false
|
|
@@ -18509,7 +18215,7 @@
|
|
|
18509
18215
|
}
|
|
18510
18216
|
`;
|
|
18511
18217
|
|
|
18512
|
-
const template$
|
|
18218
|
+
const template$F = (context, definition) => html `
|
|
18513
18219
|
<template
|
|
18514
18220
|
role="treeitem"
|
|
18515
18221
|
slot="${x => (x.isNestedItem() ? 'item' : null)}"
|
|
@@ -18646,7 +18352,7 @@
|
|
|
18646
18352
|
// FoundationAnchor already applies the StartEnd mixin, so we don't need to do it here.
|
|
18647
18353
|
const nimbleAnchorTreeItem = AnchorTreeItem.compose({
|
|
18648
18354
|
baseName: 'anchor-tree-item',
|
|
18649
|
-
template: template$
|
|
18355
|
+
template: template$F,
|
|
18650
18356
|
styles: styles$V,
|
|
18651
18357
|
shadowOptions: {
|
|
18652
18358
|
delegatesFocus: true
|
|
@@ -18895,7 +18601,7 @@
|
|
|
18895
18601
|
${buttonAppearanceVariantStyles}
|
|
18896
18602
|
`;
|
|
18897
18603
|
|
|
18898
|
-
const template$
|
|
18604
|
+
const template$E = (context, definition) => html `
|
|
18899
18605
|
<button
|
|
18900
18606
|
class="control"
|
|
18901
18607
|
part="control"
|
|
@@ -18986,7 +18692,7 @@
|
|
|
18986
18692
|
const nimbleButton = Button.compose({
|
|
18987
18693
|
baseName: 'button',
|
|
18988
18694
|
baseClass: Button$1,
|
|
18989
|
-
template: template$
|
|
18695
|
+
template: template$E,
|
|
18990
18696
|
styles: styles$S,
|
|
18991
18697
|
shadowOptions: {
|
|
18992
18698
|
delegatesFocus: true
|
|
@@ -19790,7 +19496,7 @@
|
|
|
19790
19496
|
};
|
|
19791
19497
|
|
|
19792
19498
|
// Avoiding any whitespace in the template because this is an inline element
|
|
19793
|
-
const template$
|
|
19499
|
+
const template$D = html `<div
|
|
19794
19500
|
class="icon"
|
|
19795
19501
|
aria-hidden="true"
|
|
19796
19502
|
:innerHTML=${x => x.icon.data}
|
|
@@ -19849,7 +19555,7 @@
|
|
|
19849
19555
|
const registerIcon = (baseName, iconClass) => {
|
|
19850
19556
|
const composedIcon = iconClass.compose({
|
|
19851
19557
|
baseName,
|
|
19852
|
-
template: template$
|
|
19558
|
+
template: template$D,
|
|
19853
19559
|
styles: styles$R
|
|
19854
19560
|
});
|
|
19855
19561
|
DesignSystem.getOrCreate().withPrefix('nimble').register(composedIcon());
|
|
@@ -19968,7 +19674,7 @@
|
|
|
19968
19674
|
}).withDefault(coreLabelDefaults.loadingLabel);
|
|
19969
19675
|
|
|
19970
19676
|
// prettier-ignore
|
|
19971
|
-
const template$
|
|
19677
|
+
const template$C = html `
|
|
19972
19678
|
<${themeProviderTag} theme="${Theme.color}">
|
|
19973
19679
|
<div class="container"
|
|
19974
19680
|
role="status"
|
|
@@ -20086,7 +19792,7 @@
|
|
|
20086
19792
|
applyMixins(Banner, ARIAGlobalStatesAndProperties);
|
|
20087
19793
|
const nimbleBanner = Banner.compose({
|
|
20088
19794
|
baseName: 'banner',
|
|
20089
|
-
template: template$
|
|
19795
|
+
template: template$C,
|
|
20090
19796
|
styles: styles$T
|
|
20091
19797
|
});
|
|
20092
19798
|
DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleBanner());
|
|
@@ -20253,7 +19959,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
20253
19959
|
}
|
|
20254
19960
|
`;
|
|
20255
19961
|
|
|
20256
|
-
const template$
|
|
19962
|
+
const template$B = html `
|
|
20257
19963
|
<section aria-labelledby="title-slot">
|
|
20258
19964
|
<span id="title-slot"><slot name="title"></slot></span>
|
|
20259
19965
|
<slot></slot>
|
|
@@ -20268,7 +19974,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
20268
19974
|
const nimbleCard = Card.compose({
|
|
20269
19975
|
baseName: 'card',
|
|
20270
19976
|
baseClass: Card$1,
|
|
20271
|
-
template: template$
|
|
19977
|
+
template: template$B,
|
|
20272
19978
|
styles: styles$O
|
|
20273
19979
|
});
|
|
20274
19980
|
DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleCard());
|
|
@@ -20546,7 +20252,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
20546
20252
|
}
|
|
20547
20253
|
`;
|
|
20548
20254
|
|
|
20549
|
-
const template$
|
|
20255
|
+
const template$A = (_context, definition) => html `
|
|
20550
20256
|
<template
|
|
20551
20257
|
role="checkbox"
|
|
20552
20258
|
aria-checked="${x => x.checked}"
|
|
@@ -20595,7 +20301,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
20595
20301
|
const nimbleCheckbox = Checkbox.compose({
|
|
20596
20302
|
baseName: 'checkbox',
|
|
20597
20303
|
baseClass: Checkbox$1,
|
|
20598
|
-
template: template$
|
|
20304
|
+
template: template$A,
|
|
20599
20305
|
styles: styles$M,
|
|
20600
20306
|
checkedIndicator: checkLarge16X16.data,
|
|
20601
20307
|
indeterminateIndicator: minus16X16.data
|
|
@@ -20653,7 +20359,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
20653
20359
|
|
|
20654
20360
|
/* eslint-disable @typescript-eslint/indent */
|
|
20655
20361
|
// prettier-ignore
|
|
20656
|
-
const template$
|
|
20362
|
+
const template$z = (context, definition) => html `
|
|
20657
20363
|
<div
|
|
20658
20364
|
role="button"
|
|
20659
20365
|
part="control"
|
|
@@ -20749,7 +20455,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
20749
20455
|
applyMixins(ToggleButton, StartEnd, DelegatesARIAButton);
|
|
20750
20456
|
const nimbleToggleButton = ToggleButton.compose({
|
|
20751
20457
|
baseName: 'toggle-button',
|
|
20752
|
-
template: template$
|
|
20458
|
+
template: template$z,
|
|
20753
20459
|
styles: styles$L,
|
|
20754
20460
|
shadowOptions: {
|
|
20755
20461
|
delegatesFocus: true
|
|
@@ -21230,7 +20936,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21230
20936
|
|
|
21231
20937
|
/* eslint-disable @typescript-eslint/indent */
|
|
21232
20938
|
// prettier-ignore
|
|
21233
|
-
const template$
|
|
20939
|
+
const template$y = (context, definition) => html `
|
|
21234
20940
|
<template
|
|
21235
20941
|
aria-disabled="${x => x.ariaDisabled}"
|
|
21236
20942
|
autocomplete="${x => x.autocomplete}"
|
|
@@ -21376,16 +21082,16 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21376
21082
|
return this._value;
|
|
21377
21083
|
}
|
|
21378
21084
|
set value(next) {
|
|
21379
|
-
const prev =
|
|
21085
|
+
const prev = this._value;
|
|
21380
21086
|
let updatedValue = next;
|
|
21381
21087
|
if (this.$fastController.isConnected && this.options) {
|
|
21382
|
-
const selectedIndex = this.
|
|
21088
|
+
const selectedIndex = this.findIndexOfValidOption(next);
|
|
21383
21089
|
const prevSelectedValue = this.options[this.selectedIndex]?.text;
|
|
21384
21090
|
const nextSelectedValue = this.options[selectedIndex]?.text;
|
|
21385
|
-
|
|
21386
|
-
|
|
21387
|
-
|
|
21388
|
-
updatedValue = this.firstSelectedOption?.text ||
|
|
21091
|
+
if (prevSelectedValue !== nextSelectedValue) {
|
|
21092
|
+
this.selectedIndex = selectedIndex;
|
|
21093
|
+
}
|
|
21094
|
+
updatedValue = this.firstSelectedOption?.text || updatedValue;
|
|
21389
21095
|
}
|
|
21390
21096
|
if (prev !== updatedValue) {
|
|
21391
21097
|
this._value = updatedValue;
|
|
@@ -21395,9 +21101,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21395
21101
|
// Can remove when following resolved: https://github.com/microsoft/fast/issues/6749
|
|
21396
21102
|
this.filter = next;
|
|
21397
21103
|
this.filterOptions();
|
|
21398
|
-
this.selectedIndex = this.
|
|
21399
|
-
.map(option => option.text)
|
|
21400
|
-
.indexOf(this.value);
|
|
21104
|
+
this.selectedIndex = this.findIndexOfValidOption(this.value);
|
|
21401
21105
|
}
|
|
21402
21106
|
/**
|
|
21403
21107
|
* The list of options.
|
|
@@ -21406,7 +21110,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21406
21110
|
*/
|
|
21407
21111
|
get options() {
|
|
21408
21112
|
Observable.track(this, 'options');
|
|
21409
|
-
return this.filteredOptions
|
|
21113
|
+
return this.filteredOptions && this.filter
|
|
21410
21114
|
? this.filteredOptions
|
|
21411
21115
|
: this._options;
|
|
21412
21116
|
}
|
|
@@ -21510,8 +21214,6 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21510
21214
|
o.visuallyHidden = !this.filteredOptions.includes(o);
|
|
21511
21215
|
});
|
|
21512
21216
|
}
|
|
21513
|
-
const enabledOptions = this.filteredOptions.filter(o => !o.disabled);
|
|
21514
|
-
this.filteredOptions = enabledOptions;
|
|
21515
21217
|
}
|
|
21516
21218
|
/**
|
|
21517
21219
|
* @internal
|
|
@@ -21520,11 +21222,9 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21520
21222
|
this.filter = this.control.value;
|
|
21521
21223
|
this.filterOptions();
|
|
21522
21224
|
if (!this.isAutocompleteInline) {
|
|
21523
|
-
this.selectedIndex = this.
|
|
21524
|
-
.map(option => option.text)
|
|
21525
|
-
.indexOf(this.control.value);
|
|
21225
|
+
this.selectedIndex = this.findIndexOfValidOption(this.control.value);
|
|
21526
21226
|
}
|
|
21527
|
-
if (!
|
|
21227
|
+
if (!e.inputType.includes('deleteContent') && this.filter.length) {
|
|
21528
21228
|
if (this.isAutocompleteList && !this.open) {
|
|
21529
21229
|
this.open = true;
|
|
21530
21230
|
}
|
|
@@ -21669,7 +21369,8 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21669
21369
|
*/
|
|
21670
21370
|
setDefaultSelectedOption() {
|
|
21671
21371
|
if (this.$fastController.isConnected && this.options) {
|
|
21672
|
-
const selectedIndex = this.options.findIndex(el => el.
|
|
21372
|
+
const selectedIndex = this.options.findIndex(el => !el.disabled
|
|
21373
|
+
&& (el.getAttribute('selected') !== null || el.selected));
|
|
21673
21374
|
this.selectedIndex = selectedIndex;
|
|
21674
21375
|
if (!this.dirtyValue && this.firstSelectedOption) {
|
|
21675
21376
|
this.value = this.firstSelectedOption.text;
|
|
@@ -21682,13 +21383,21 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21682
21383
|
*/
|
|
21683
21384
|
selectedIndexChanged(prev, next) {
|
|
21684
21385
|
if (this.$fastController.isConnected) {
|
|
21685
|
-
|
|
21386
|
+
let pinnedSelectedIndex = limit(-1, this.options.length - 1, next);
|
|
21387
|
+
// Ensure selectedIndex doesn't get set to a disabled option
|
|
21388
|
+
if (this.options[pinnedSelectedIndex]?.disabled) {
|
|
21389
|
+
pinnedSelectedIndex = -1;
|
|
21390
|
+
}
|
|
21686
21391
|
// we only want to call the super method when the selectedIndex is in range
|
|
21687
21392
|
if (pinnedSelectedIndex !== this.selectedIndex) {
|
|
21688
21393
|
this.selectedIndex = pinnedSelectedIndex;
|
|
21689
21394
|
return;
|
|
21690
21395
|
}
|
|
21691
21396
|
super.selectedIndexChanged(prev, pinnedSelectedIndex);
|
|
21397
|
+
// the base class doesn't call this when no option is selected, but we need to,
|
|
21398
|
+
// otherwise selectedOptions, ariaActiveDescendant, and the previously selected
|
|
21399
|
+
// option's selected state won't be updated
|
|
21400
|
+
this.setSelectedOptions();
|
|
21692
21401
|
}
|
|
21693
21402
|
}
|
|
21694
21403
|
/**
|
|
@@ -21702,16 +21411,42 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21702
21411
|
}
|
|
21703
21412
|
this.ariaDisabled = this.disabled ? 'true' : 'false';
|
|
21704
21413
|
}
|
|
21414
|
+
/**
|
|
21415
|
+
* Move focus to the next selectable option.
|
|
21416
|
+
*
|
|
21417
|
+
* @internal
|
|
21418
|
+
* @remarks Has the same behavior as `Listbox.selectNextOption` except it skips disabled options.
|
|
21419
|
+
* Overrides `Listbox.selectNextOption`
|
|
21420
|
+
*/
|
|
21421
|
+
selectNextOption() {
|
|
21422
|
+
if (!this.disabled) {
|
|
21423
|
+
let newIndex = this.selectedIndex;
|
|
21424
|
+
do {
|
|
21425
|
+
if (newIndex + 1 >= this.options.length) {
|
|
21426
|
+
return;
|
|
21427
|
+
}
|
|
21428
|
+
newIndex += 1;
|
|
21429
|
+
} while (this.options[newIndex].disabled);
|
|
21430
|
+
this.selectedIndex = newIndex;
|
|
21431
|
+
}
|
|
21432
|
+
}
|
|
21705
21433
|
/**
|
|
21706
21434
|
* Move focus to the previous selectable option.
|
|
21707
21435
|
*
|
|
21708
21436
|
* @internal
|
|
21709
|
-
* @remarks
|
|
21437
|
+
* @remarks Has the same behavior as `Listbox.selectPreviousOption` except it skips disabled options and allows moving focus to the input.
|
|
21710
21438
|
* Overrides `Listbox.selectPreviousOption`
|
|
21711
21439
|
*/
|
|
21712
21440
|
selectPreviousOption() {
|
|
21713
|
-
if (!this.disabled
|
|
21714
|
-
this.selectedIndex
|
|
21441
|
+
if (!this.disabled) {
|
|
21442
|
+
let newIndex = this.selectedIndex;
|
|
21443
|
+
do {
|
|
21444
|
+
newIndex -= 1;
|
|
21445
|
+
if (newIndex < 0) {
|
|
21446
|
+
break;
|
|
21447
|
+
}
|
|
21448
|
+
} while (this.options[newIndex].disabled);
|
|
21449
|
+
this.selectedIndex = newIndex;
|
|
21715
21450
|
}
|
|
21716
21451
|
}
|
|
21717
21452
|
/**
|
|
@@ -21786,6 +21521,17 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21786
21521
|
this.proxy.placeholder = this.placeholder ?? '';
|
|
21787
21522
|
}
|
|
21788
21523
|
}
|
|
21524
|
+
/**
|
|
21525
|
+
* Need to update even when options is empty.
|
|
21526
|
+
* @internal
|
|
21527
|
+
* @remarks Same as `Listbox.setSelectedOptions` except does not check if options is non-empty.
|
|
21528
|
+
* Overrides: `Listbox.setSelectedOptions`
|
|
21529
|
+
*/
|
|
21530
|
+
setSelectedOptions() {
|
|
21531
|
+
this.selectedOptions = this.selectedIndex > -1 ? [this.options[this.selectedIndex]] : [];
|
|
21532
|
+
this.ariaActiveDescendant = this.firstSelectedOption?.id ?? '';
|
|
21533
|
+
this.focusAndScrollOptionIntoView();
|
|
21534
|
+
}
|
|
21789
21535
|
/**
|
|
21790
21536
|
* Ensure that the entire list of options is used when setting the selected property.
|
|
21791
21537
|
* @internal
|
|
@@ -21887,6 +21633,9 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21887
21633
|
this.valueUpdatedByInput = false;
|
|
21888
21634
|
}
|
|
21889
21635
|
}
|
|
21636
|
+
findIndexOfValidOption(optionText) {
|
|
21637
|
+
return this.options.findIndex(o => !o.disabled && o.text === optionText);
|
|
21638
|
+
}
|
|
21890
21639
|
}
|
|
21891
21640
|
__decorate$1([
|
|
21892
21641
|
attr
|
|
@@ -21939,7 +21688,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
21939
21688
|
const nimbleCombobox = Combobox.compose({
|
|
21940
21689
|
baseName: 'combobox',
|
|
21941
21690
|
baseClass: FormAssociatedCombobox,
|
|
21942
|
-
template: template$
|
|
21691
|
+
template: template$y,
|
|
21943
21692
|
styles: styles$I,
|
|
21944
21693
|
shadowOptions: {
|
|
21945
21694
|
delegatesFocus: true
|
|
@@ -22091,7 +21840,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
22091
21840
|
}
|
|
22092
21841
|
`));
|
|
22093
21842
|
|
|
22094
|
-
const template$
|
|
21843
|
+
const template$x = html `
|
|
22095
21844
|
<template>
|
|
22096
21845
|
<dialog
|
|
22097
21846
|
${ref('dialogElement')}
|
|
@@ -22239,7 +21988,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
22239
21988
|
applyMixins(Dialog, ARIAGlobalStatesAndProperties);
|
|
22240
21989
|
const nimbleDialog = Dialog.compose({
|
|
22241
21990
|
baseName: 'dialog',
|
|
22242
|
-
template: template$
|
|
21991
|
+
template: template$x,
|
|
22243
21992
|
styles: styles$H,
|
|
22244
21993
|
baseClass: Dialog
|
|
22245
21994
|
});
|
|
@@ -22397,7 +22146,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
22397
22146
|
}
|
|
22398
22147
|
`));
|
|
22399
22148
|
|
|
22400
|
-
const template$
|
|
22149
|
+
const template$w = html `
|
|
22401
22150
|
<dialog
|
|
22402
22151
|
${ref('dialog')}
|
|
22403
22152
|
aria-label="${x => x.ariaLabel}"
|
|
@@ -22540,7 +22289,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
22540
22289
|
applyMixins(Drawer, ARIAGlobalStatesAndProperties);
|
|
22541
22290
|
const nimbleDrawer = Drawer.compose({
|
|
22542
22291
|
baseName: 'drawer',
|
|
22543
|
-
template: template$
|
|
22292
|
+
template: template$w,
|
|
22544
22293
|
styles: styles$G
|
|
22545
22294
|
});
|
|
22546
22295
|
DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleDrawer());
|
|
@@ -25230,7 +24979,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25230
24979
|
* @public
|
|
25231
24980
|
*/
|
|
25232
24981
|
// prettier-ignore
|
|
25233
|
-
const template$
|
|
24982
|
+
const template$v = (context, definition) => html `
|
|
25234
24983
|
<template
|
|
25235
24984
|
aria-checked="${x => x.ariaChecked}"
|
|
25236
24985
|
aria-disabled="${x => x.ariaDisabled}"
|
|
@@ -25335,7 +25084,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25335
25084
|
const nimbleListOption = ListOption.compose({
|
|
25336
25085
|
baseName: 'list-option',
|
|
25337
25086
|
baseClass: ListboxOption,
|
|
25338
|
-
template: template$
|
|
25087
|
+
template: template$v,
|
|
25339
25088
|
styles: styles$E
|
|
25340
25089
|
});
|
|
25341
25090
|
DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleListOption());
|
|
@@ -25404,7 +25153,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25404
25153
|
return n instanceof ListOption;
|
|
25405
25154
|
};
|
|
25406
25155
|
// prettier-ignore
|
|
25407
|
-
const template$
|
|
25156
|
+
const template$u = html `
|
|
25408
25157
|
<template
|
|
25409
25158
|
role="group"
|
|
25410
25159
|
aria-label="${x => x.labelContent}"
|
|
@@ -25550,7 +25299,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25550
25299
|
const nimbleListOptionGroup = ListOptionGroup.compose({
|
|
25551
25300
|
baseName: 'list-option-group',
|
|
25552
25301
|
baseClass: FoundationElement,
|
|
25553
|
-
template: template$
|
|
25302
|
+
template: template$u,
|
|
25554
25303
|
styles: styles$D
|
|
25555
25304
|
});
|
|
25556
25305
|
DesignSystem.getOrCreate()
|
|
@@ -25566,7 +25315,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25566
25315
|
attr()
|
|
25567
25316
|
], Mapping$1.prototype, "key", void 0);
|
|
25568
25317
|
|
|
25569
|
-
const template$
|
|
25318
|
+
const template$t = html `<template slot="mapping"></template>`;
|
|
25570
25319
|
|
|
25571
25320
|
const styles$C = css `
|
|
25572
25321
|
${display('none')}
|
|
@@ -25584,7 +25333,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25584
25333
|
], MappingEmpty.prototype, "text", void 0);
|
|
25585
25334
|
const emptyMapping = MappingEmpty.compose({
|
|
25586
25335
|
baseName: 'mapping-empty',
|
|
25587
|
-
template: template$
|
|
25336
|
+
template: template$t,
|
|
25588
25337
|
styles: styles$C
|
|
25589
25338
|
});
|
|
25590
25339
|
DesignSystem.getOrCreate().withPrefix('nimble').register(emptyMapping());
|
|
@@ -25655,7 +25404,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25655
25404
|
], MappingIcon.prototype, "resolvedIcon", void 0);
|
|
25656
25405
|
const iconMapping = MappingIcon.compose({
|
|
25657
25406
|
baseName: 'mapping-icon',
|
|
25658
|
-
template: template$
|
|
25407
|
+
template: template$t,
|
|
25659
25408
|
styles: styles$C
|
|
25660
25409
|
});
|
|
25661
25410
|
DesignSystem.getOrCreate().withPrefix('nimble').register(iconMapping());
|
|
@@ -25679,7 +25428,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25679
25428
|
], MappingSpinner.prototype, "textHidden", void 0);
|
|
25680
25429
|
const spinnerMapping = MappingSpinner.compose({
|
|
25681
25430
|
baseName: 'mapping-spinner',
|
|
25682
|
-
template: template$
|
|
25431
|
+
template: template$t,
|
|
25683
25432
|
styles: styles$C
|
|
25684
25433
|
});
|
|
25685
25434
|
DesignSystem.getOrCreate().withPrefix('nimble').register(spinnerMapping());
|
|
@@ -25696,11 +25445,330 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25696
25445
|
], MappingText.prototype, "text", void 0);
|
|
25697
25446
|
const textMapping = MappingText.compose({
|
|
25698
25447
|
baseName: 'mapping-text',
|
|
25699
|
-
template: template$
|
|
25448
|
+
template: template$t,
|
|
25700
25449
|
styles: styles$C
|
|
25701
25450
|
});
|
|
25702
25451
|
DesignSystem.getOrCreate().withPrefix('nimble').register(textMapping());
|
|
25703
25452
|
|
|
25453
|
+
/**
|
|
25454
|
+
* A Menu Custom HTML Element.
|
|
25455
|
+
* Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#menu | ARIA menu }.
|
|
25456
|
+
*
|
|
25457
|
+
* @slot - The default slot for the menu items
|
|
25458
|
+
*
|
|
25459
|
+
* @public
|
|
25460
|
+
*/
|
|
25461
|
+
let Menu$1 = class Menu extends FoundationElement {
|
|
25462
|
+
constructor() {
|
|
25463
|
+
super(...arguments);
|
|
25464
|
+
this.expandedItem = null;
|
|
25465
|
+
/**
|
|
25466
|
+
* The index of the focusable element in the items array
|
|
25467
|
+
* defaults to -1
|
|
25468
|
+
*/
|
|
25469
|
+
this.focusIndex = -1;
|
|
25470
|
+
/**
|
|
25471
|
+
* @internal
|
|
25472
|
+
*/
|
|
25473
|
+
this.isNestedMenu = () => {
|
|
25474
|
+
return (this.parentElement !== null
|
|
25475
|
+
&& isHTMLElement(this.parentElement)
|
|
25476
|
+
&& this.parentElement.getAttribute('role') === 'menuitem');
|
|
25477
|
+
};
|
|
25478
|
+
/**
|
|
25479
|
+
* if focus is moving out of the menu, reset to a stable initial state
|
|
25480
|
+
* @internal
|
|
25481
|
+
*/
|
|
25482
|
+
this.handleFocusOut = (e) => {
|
|
25483
|
+
if (!this.contains(e.relatedTarget)
|
|
25484
|
+
&& this.menuItems !== undefined) {
|
|
25485
|
+
this.collapseExpandedItem();
|
|
25486
|
+
// find our first focusable element
|
|
25487
|
+
const focusIndex = this.menuItems.findIndex(this.isFocusableElement);
|
|
25488
|
+
// set the current focus index's tabindex to -1
|
|
25489
|
+
this.menuItems[this.focusIndex]?.setAttribute('tabindex', '-1');
|
|
25490
|
+
// set the first focusable element tabindex to 0
|
|
25491
|
+
this.menuItems[focusIndex]?.setAttribute('tabindex', '0');
|
|
25492
|
+
// set the focus index
|
|
25493
|
+
this.focusIndex = focusIndex;
|
|
25494
|
+
}
|
|
25495
|
+
};
|
|
25496
|
+
this.handleItemFocus = (e) => {
|
|
25497
|
+
const targetItem = e.target;
|
|
25498
|
+
if (this.menuItems !== undefined
|
|
25499
|
+
&& targetItem !== this.menuItems[this.focusIndex]) {
|
|
25500
|
+
this.menuItems[this.focusIndex]?.setAttribute('tabindex', '-1');
|
|
25501
|
+
this.focusIndex = this.menuItems.indexOf(targetItem);
|
|
25502
|
+
targetItem.setAttribute('tabindex', '0');
|
|
25503
|
+
}
|
|
25504
|
+
};
|
|
25505
|
+
this.handleExpandedChanged = (e) => {
|
|
25506
|
+
if (e.defaultPrevented
|
|
25507
|
+
|| e.target === null
|
|
25508
|
+
|| this.menuItems === undefined
|
|
25509
|
+
|| !this.menuItems.includes(e.target)) {
|
|
25510
|
+
return;
|
|
25511
|
+
}
|
|
25512
|
+
e.preventDefault();
|
|
25513
|
+
const changedItem = e.target;
|
|
25514
|
+
// closing an expanded item without opening another
|
|
25515
|
+
if (this.expandedItem !== null
|
|
25516
|
+
&& changedItem === this.expandedItem
|
|
25517
|
+
&& changedItem.expanded === false) {
|
|
25518
|
+
this.expandedItem = null;
|
|
25519
|
+
return;
|
|
25520
|
+
}
|
|
25521
|
+
if (changedItem.expanded) {
|
|
25522
|
+
if (this.expandedItem !== null
|
|
25523
|
+
&& this.expandedItem !== changedItem) {
|
|
25524
|
+
this.expandedItem.expanded = false;
|
|
25525
|
+
}
|
|
25526
|
+
this.menuItems[this.focusIndex]?.setAttribute('tabindex', '-1');
|
|
25527
|
+
this.expandedItem = changedItem;
|
|
25528
|
+
this.focusIndex = this.menuItems.indexOf(changedItem);
|
|
25529
|
+
changedItem.setAttribute('tabindex', '0');
|
|
25530
|
+
}
|
|
25531
|
+
};
|
|
25532
|
+
this.removeItemListeners = () => {
|
|
25533
|
+
if (this.menuItems !== undefined) {
|
|
25534
|
+
this.menuItems.forEach((item) => {
|
|
25535
|
+
item.removeEventListener('expanded-change', this.handleExpandedChanged);
|
|
25536
|
+
item.removeEventListener('focus', this.handleItemFocus);
|
|
25537
|
+
});
|
|
25538
|
+
}
|
|
25539
|
+
};
|
|
25540
|
+
this.setItems = () => {
|
|
25541
|
+
const newItems = this.domChildren();
|
|
25542
|
+
this.removeItemListeners();
|
|
25543
|
+
this.menuItems = newItems;
|
|
25544
|
+
const menuItems = this.menuItems.filter(this.isMenuItemElement);
|
|
25545
|
+
// if our focus index is not -1 we have items
|
|
25546
|
+
if (menuItems.length) {
|
|
25547
|
+
this.focusIndex = 0;
|
|
25548
|
+
}
|
|
25549
|
+
function elementIndent(el) {
|
|
25550
|
+
const role = el.getAttribute('role');
|
|
25551
|
+
const startSlot = el.querySelector('[slot=start]');
|
|
25552
|
+
if (role !== MenuItemRole.menuitem && startSlot === null) {
|
|
25553
|
+
return 1;
|
|
25554
|
+
}
|
|
25555
|
+
if (role === MenuItemRole.menuitem && startSlot !== null) {
|
|
25556
|
+
return 1;
|
|
25557
|
+
}
|
|
25558
|
+
if (role !== MenuItemRole.menuitem && startSlot !== null) {
|
|
25559
|
+
return 2;
|
|
25560
|
+
}
|
|
25561
|
+
return 0;
|
|
25562
|
+
}
|
|
25563
|
+
const indent = menuItems.reduce((accum, current) => {
|
|
25564
|
+
const elementValue = elementIndent(current);
|
|
25565
|
+
return accum > elementValue ? accum : elementValue;
|
|
25566
|
+
}, 0);
|
|
25567
|
+
menuItems.forEach((item, index) => {
|
|
25568
|
+
item.setAttribute('tabindex', index === 0 ? '0' : '-1');
|
|
25569
|
+
item.addEventListener('expanded-change', this.handleExpandedChanged);
|
|
25570
|
+
item.addEventListener('focus', this.handleItemFocus);
|
|
25571
|
+
if (item instanceof MenuItem$1 || 'startColumnCount' in item) {
|
|
25572
|
+
item.startColumnCount = indent;
|
|
25573
|
+
}
|
|
25574
|
+
});
|
|
25575
|
+
};
|
|
25576
|
+
/**
|
|
25577
|
+
* handle change from child element
|
|
25578
|
+
*/
|
|
25579
|
+
this.changeHandler = (e) => {
|
|
25580
|
+
if (this.menuItems === undefined) {
|
|
25581
|
+
return;
|
|
25582
|
+
}
|
|
25583
|
+
const changedMenuItem = e.target;
|
|
25584
|
+
const changeItemIndex = this.menuItems.indexOf(changedMenuItem);
|
|
25585
|
+
if (changeItemIndex === -1) {
|
|
25586
|
+
return;
|
|
25587
|
+
}
|
|
25588
|
+
if (changedMenuItem.role === 'menuitemradio'
|
|
25589
|
+
&& changedMenuItem.checked === true) {
|
|
25590
|
+
for (let i = changeItemIndex - 1; i >= 0; --i) {
|
|
25591
|
+
const item = this.menuItems[i];
|
|
25592
|
+
const role = item.getAttribute('role');
|
|
25593
|
+
if (role === MenuItemRole.menuitemradio) {
|
|
25594
|
+
item.checked = false;
|
|
25595
|
+
}
|
|
25596
|
+
if (role === 'separator') {
|
|
25597
|
+
break;
|
|
25598
|
+
}
|
|
25599
|
+
}
|
|
25600
|
+
const maxIndex = this.menuItems.length - 1;
|
|
25601
|
+
for (let i = changeItemIndex + 1; i <= maxIndex; ++i) {
|
|
25602
|
+
const item = this.menuItems[i];
|
|
25603
|
+
const role = item.getAttribute('role');
|
|
25604
|
+
if (role === MenuItemRole.menuitemradio) {
|
|
25605
|
+
item.checked = false;
|
|
25606
|
+
}
|
|
25607
|
+
if (role === 'separator') {
|
|
25608
|
+
break;
|
|
25609
|
+
}
|
|
25610
|
+
}
|
|
25611
|
+
}
|
|
25612
|
+
};
|
|
25613
|
+
/**
|
|
25614
|
+
* check if the item is a menu item
|
|
25615
|
+
*/
|
|
25616
|
+
this.isMenuItemElement = (el) => {
|
|
25617
|
+
return (isHTMLElement(el)
|
|
25618
|
+
&& Object.prototype.hasOwnProperty.call(Menu.focusableElementRoles, el.getAttribute('role')));
|
|
25619
|
+
};
|
|
25620
|
+
/**
|
|
25621
|
+
* check if the item is focusable
|
|
25622
|
+
*/
|
|
25623
|
+
this.isFocusableElement = (el) => {
|
|
25624
|
+
return this.isMenuItemElement(el);
|
|
25625
|
+
};
|
|
25626
|
+
}
|
|
25627
|
+
/**
|
|
25628
|
+
* @internal
|
|
25629
|
+
*/
|
|
25630
|
+
connectedCallback() {
|
|
25631
|
+
super.connectedCallback();
|
|
25632
|
+
DOM.queueUpdate(() => {
|
|
25633
|
+
// wait until children have had a chance to
|
|
25634
|
+
// connect before setting/checking their props/attributes
|
|
25635
|
+
this.setItems();
|
|
25636
|
+
});
|
|
25637
|
+
this.addEventListener('change', this.changeHandler);
|
|
25638
|
+
}
|
|
25639
|
+
/**
|
|
25640
|
+
* @internal
|
|
25641
|
+
*/
|
|
25642
|
+
disconnectedCallback() {
|
|
25643
|
+
super.disconnectedCallback();
|
|
25644
|
+
this.removeItemListeners();
|
|
25645
|
+
this.menuItems = undefined;
|
|
25646
|
+
this.removeEventListener('change', this.changeHandler);
|
|
25647
|
+
}
|
|
25648
|
+
/**
|
|
25649
|
+
* Focuses the first item in the menu.
|
|
25650
|
+
*
|
|
25651
|
+
* @public
|
|
25652
|
+
*/
|
|
25653
|
+
focus() {
|
|
25654
|
+
this.setFocus(0, 1);
|
|
25655
|
+
}
|
|
25656
|
+
/**
|
|
25657
|
+
* Collapses any expanded menu items.
|
|
25658
|
+
*
|
|
25659
|
+
* @public
|
|
25660
|
+
*/
|
|
25661
|
+
collapseExpandedItem() {
|
|
25662
|
+
if (this.expandedItem !== null) {
|
|
25663
|
+
this.expandedItem.expanded = false;
|
|
25664
|
+
this.expandedItem = null;
|
|
25665
|
+
}
|
|
25666
|
+
}
|
|
25667
|
+
/**
|
|
25668
|
+
* @internal
|
|
25669
|
+
*/
|
|
25670
|
+
handleMenuKeyDown(e) {
|
|
25671
|
+
if (e.defaultPrevented || this.menuItems === undefined) {
|
|
25672
|
+
return false;
|
|
25673
|
+
}
|
|
25674
|
+
switch (e.key) {
|
|
25675
|
+
case keyArrowDown:
|
|
25676
|
+
// go forward one index
|
|
25677
|
+
this.setFocus(this.focusIndex + 1, 1);
|
|
25678
|
+
return false;
|
|
25679
|
+
case keyArrowUp:
|
|
25680
|
+
// go back one index
|
|
25681
|
+
this.setFocus(this.focusIndex - 1, -1);
|
|
25682
|
+
return false;
|
|
25683
|
+
case keyEnd:
|
|
25684
|
+
// set focus on last item
|
|
25685
|
+
this.setFocus(this.menuItems.length - 1, -1);
|
|
25686
|
+
return false;
|
|
25687
|
+
case keyHome:
|
|
25688
|
+
// set focus on first item
|
|
25689
|
+
this.setFocus(0, 1);
|
|
25690
|
+
return false;
|
|
25691
|
+
default:
|
|
25692
|
+
// if we are not handling the event, do not prevent default
|
|
25693
|
+
return true;
|
|
25694
|
+
}
|
|
25695
|
+
}
|
|
25696
|
+
itemsChanged() {
|
|
25697
|
+
// only update children after the component is connected and
|
|
25698
|
+
// the setItems has run on connectedCallback
|
|
25699
|
+
// (menuItems is undefined until then)
|
|
25700
|
+
if (this.$fastController.isConnected && this.menuItems !== undefined) {
|
|
25701
|
+
this.setItems();
|
|
25702
|
+
}
|
|
25703
|
+
}
|
|
25704
|
+
itemIconsChanged(oldIcons, newIcons) {
|
|
25705
|
+
// must check if set of icon elements is actually different
|
|
25706
|
+
if (this.$fastController.isConnected
|
|
25707
|
+
&& this.menuItems !== undefined
|
|
25708
|
+
&& (oldIcons.length !== newIcons.length
|
|
25709
|
+
|| new Set(oldIcons.concat(newIcons)).size !== oldIcons.length)) {
|
|
25710
|
+
this.setItems();
|
|
25711
|
+
}
|
|
25712
|
+
}
|
|
25713
|
+
/**
|
|
25714
|
+
* get an array of valid DOM children
|
|
25715
|
+
*/
|
|
25716
|
+
domChildren() {
|
|
25717
|
+
return Array.from(this.children).filter(child => !child.hasAttribute('hidden'));
|
|
25718
|
+
}
|
|
25719
|
+
setFocus(focusIndex, adjustment) {
|
|
25720
|
+
if (this.menuItems === undefined) {
|
|
25721
|
+
return;
|
|
25722
|
+
}
|
|
25723
|
+
let updatedIndex = focusIndex;
|
|
25724
|
+
while (updatedIndex >= 0 && updatedIndex < this.menuItems.length) {
|
|
25725
|
+
const child = this.menuItems[updatedIndex];
|
|
25726
|
+
if (this.isFocusableElement(child)) {
|
|
25727
|
+
// change the previous index to -1
|
|
25728
|
+
if (this.focusIndex > -1
|
|
25729
|
+
&& this.menuItems.length >= this.focusIndex - 1) {
|
|
25730
|
+
this.menuItems[this.focusIndex]?.setAttribute('tabindex', '-1');
|
|
25731
|
+
}
|
|
25732
|
+
// update the focus index
|
|
25733
|
+
this.focusIndex = updatedIndex;
|
|
25734
|
+
// update the tabindex of next focusable element
|
|
25735
|
+
child.setAttribute('tabindex', '0');
|
|
25736
|
+
// focus the element
|
|
25737
|
+
child.focus();
|
|
25738
|
+
break;
|
|
25739
|
+
}
|
|
25740
|
+
updatedIndex += adjustment;
|
|
25741
|
+
}
|
|
25742
|
+
}
|
|
25743
|
+
};
|
|
25744
|
+
Menu$1.focusableElementRoles = roleForMenuItem;
|
|
25745
|
+
__decorate$1([
|
|
25746
|
+
observable
|
|
25747
|
+
], Menu$1.prototype, "items", void 0);
|
|
25748
|
+
__decorate$1([
|
|
25749
|
+
observable
|
|
25750
|
+
], Menu$1.prototype, "itemIcons", void 0);
|
|
25751
|
+
|
|
25752
|
+
/* eslint-disable @typescript-eslint/indent */
|
|
25753
|
+
// prettier-ignore
|
|
25754
|
+
const template$s = () => html `
|
|
25755
|
+
<template
|
|
25756
|
+
slot="${x => {
|
|
25757
|
+
if (x.slot) {
|
|
25758
|
+
return x.slot;
|
|
25759
|
+
}
|
|
25760
|
+
return x.isNestedMenu() ? 'submenu' : undefined;
|
|
25761
|
+
}}"
|
|
25762
|
+
role="menu"
|
|
25763
|
+
@keydown="${(x, c) => x.handleMenuKeyDown(c.event)}"
|
|
25764
|
+
@focusout="${(x, c) => x.handleFocusOut(c.event)}"
|
|
25765
|
+
${children$1({ property: 'itemIcons', subtree: true, attributeFilter: ['slot'], selector: ':scope > * > [slot="start"]' })}
|
|
25766
|
+
>
|
|
25767
|
+
<slot ${slotted('items')}></slot>
|
|
25768
|
+
</template>
|
|
25769
|
+
`;
|
|
25770
|
+
/* eslint-enable @typescript-eslint/indent */
|
|
25771
|
+
|
|
25704
25772
|
const styles$B = css `
|
|
25705
25773
|
${display('grid')}
|
|
25706
25774
|
|
|
@@ -25772,7 +25840,7 @@ so this becomes the fallback color for the slot */ ''}
|
|
|
25772
25840
|
const nimbleMenu = Menu.compose({
|
|
25773
25841
|
baseName: 'menu',
|
|
25774
25842
|
baseClass: Menu$1,
|
|
25775
|
-
template:
|
|
25843
|
+
template: template$s,
|
|
25776
25844
|
styles: styles$B
|
|
25777
25845
|
});
|
|
25778
25846
|
DesignSystem.getOrCreate().withPrefix('nimble').register(nimbleMenu());
|