@aurodesignsystem-dev/auro-formkit 0.0.0-pr1540.0 → 0.0.0-pr1541.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/checkbox/demo/customize.min.js +1 -1
- package/components/checkbox/demo/getting-started.min.js +1 -1
- package/components/checkbox/demo/index.min.js +1 -1
- package/components/checkbox/dist/index.js +1 -1
- package/components/checkbox/dist/registered.js +1 -1
- package/components/combobox/demo/customize.min.js +22 -4
- package/components/combobox/demo/getting-started.min.js +22 -4
- package/components/combobox/demo/index.min.js +22 -4
- package/components/combobox/dist/index.js +3 -3
- package/components/combobox/dist/registered.js +3 -3
- package/components/counter/demo/customize.min.js +2 -2
- package/components/counter/demo/index.min.js +2 -2
- package/components/counter/dist/index.js +2 -2
- package/components/counter/dist/registered.js +2 -2
- package/components/datepicker/demo/customize.min.js +3 -3
- package/components/datepicker/demo/index.min.js +3 -3
- package/components/datepicker/dist/index.js +3 -3
- package/components/datepicker/dist/registered.js +3 -3
- package/components/dropdown/demo/customize.min.js +1 -1
- package/components/dropdown/demo/getting-started.min.js +1 -1
- package/components/dropdown/demo/index.min.js +1 -1
- package/components/dropdown/dist/index.js +1 -1
- package/components/dropdown/dist/registered.js +1 -1
- package/components/form/demo/customize.min.js +34 -16
- package/components/form/demo/getting-started.min.js +34 -16
- package/components/form/demo/index.min.js +34 -16
- package/components/form/demo/registerDemoDeps.min.js +34 -16
- package/components/input/demo/customize.min.js +1 -1
- package/components/input/demo/getting-started.min.js +1 -1
- package/components/input/demo/index.min.js +1 -1
- package/components/input/dist/index.js +1 -1
- package/components/input/dist/registered.js +1 -1
- package/components/menu/demo/accessibility.md +9 -4
- package/components/menu/demo/api.md +3 -2
- package/components/menu/demo/css-only.md +26 -19
- package/components/menu/demo/customize.md +306 -46
- package/components/menu/demo/design.md +1 -1
- package/components/menu/demo/getting-started.md +143 -6
- package/components/menu/demo/index.min.js +144 -1
- package/components/menu/demo/keyboard-behavior.md +77 -4
- package/components/menu/demo/voiceover.md +12 -9
- package/components/menu/demo/why-menu.md +8 -9
- package/components/menu/dist/auro-menu.d.ts +1 -1
- package/components/menu/dist/auro-menuoption.d.ts +11 -0
- package/components/menu/dist/index.js +19 -1
- package/components/menu/dist/registered.js +19 -1
- package/components/radio/demo/customize.min.js +1 -1
- package/components/radio/demo/getting-started.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/accessibility.md +5 -0
- package/components/select/demo/customize.md +2 -2
- package/components/select/demo/customize.min.js +23 -5
- package/components/select/demo/design.md +10 -10
- package/components/select/demo/getting-started.min.js +23 -5
- package/components/select/demo/index.md +1 -1
- package/components/select/demo/index.min.js +23 -5
- package/components/select/demo/keyboard-behavior.md +63 -68
- package/components/select/demo/voiceover.md +28 -15
- package/components/select/dist/index.js +4 -4
- package/components/select/dist/registered.js +4 -4
- package/custom-elements.json +1795 -1770
- package/package.json +1 -1
|
@@ -22,10 +22,13 @@
|
|
|
22
22
|
<auro-anchorlink fluid href="#options" class="level2 body-xs">options</auro-anchorlink>
|
|
23
23
|
<auro-anchorlink fluid href="#index" class="level2 body-xs">index</auro-anchorlink>
|
|
24
24
|
<auro-anchorlink fluid href="#functions">Functions</auro-anchorlink>
|
|
25
|
-
<auro-anchorlink fluid href="#makeSelection" class="level2 body-xs">makeSelection()</auro-anchorlink>
|
|
26
25
|
<auro-anchorlink fluid href="#reset" class="level2 body-xs">reset()</auro-anchorlink>
|
|
26
|
+
<auro-anchorlink fluid href="#selectByValue" class="level2 body-xs">selectByValue()</auro-anchorlink>
|
|
27
27
|
<auro-anchorlink fluid href="#updateActiveOption" class="level2 body-xs">updateActiveOption()</auro-anchorlink>
|
|
28
28
|
<auro-anchorlink fluid href="#navigateOptions" class="level2 body-xs">navigateOptions()</auro-anchorlink>
|
|
29
|
+
<auro-anchorlink fluid href="#events">Events</auro-anchorlink>
|
|
30
|
+
<auro-anchorlink fluid href="#eventList" class="level2 body-xs">Event List</auro-anchorlink>
|
|
31
|
+
<auro-anchorlink fluid href="#eventAttribute" class="level2 body-xs">Option event attribute</auro-anchorlink>
|
|
29
32
|
</auro-nav>
|
|
30
33
|
</nav>
|
|
31
34
|
<div class="mainContent">
|
|
@@ -308,14 +311,148 @@ Ensure your `tsconfig.json` uses `"moduleResolution": "bundler"` so TypeScript c
|
|
|
308
311
|
<section>
|
|
309
312
|
<auro-header level="2" id="functions">Functions</auro-header>
|
|
310
313
|
<p>The following public methods are available on the <code><auro-menu></code> element.</p>
|
|
311
|
-
<auro-header level="3" id="makeSelection">makeSelection()</auro-header>
|
|
312
|
-
<p>Selects the currently active menu option. This is the programmatic equivalent of clicking on an option or pressing Enter while an option is focused.</p>
|
|
313
314
|
<auro-header level="3" id="reset">reset()</auro-header>
|
|
314
315
|
<p>Resets the menu to its initial state, clearing all selected options and restoring the value to <code>undefined</code>.</p>
|
|
315
|
-
<
|
|
316
|
-
|
|
316
|
+
<div class="exampleWrapper">
|
|
317
|
+
<!-- AURO-GENERATED-CONTENT:START (FILE:src=./../apiExamples/reset.html) -->
|
|
318
|
+
<!-- The below content is automatically added from ./../apiExamples/reset.html -->
|
|
319
|
+
<auro-menu id="resetExample" value="duration">
|
|
320
|
+
<auro-menuoption value="stops">Stops</auro-menuoption>
|
|
321
|
+
<auro-menuoption value="price">Price</auro-menuoption>
|
|
322
|
+
<auro-menuoption value="duration">Duration</auro-menuoption>
|
|
323
|
+
<auro-menuoption value="departure">Departure</auro-menuoption>
|
|
324
|
+
<auro-menuoption value="arrival">Arrival</auro-menuoption>
|
|
325
|
+
</auro-menu>
|
|
326
|
+
<br/><br/>
|
|
327
|
+
<auro-button id="resetExampleBtn">RESET</auro-button>
|
|
328
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
329
|
+
</div>
|
|
330
|
+
<auro-accordion alignRight>
|
|
331
|
+
<span slot="trigger">See code</span>
|
|
332
|
+
<!-- AURO-GENERATED-CONTENT:START (CODE:src=./../apiExamples/reset.html) -->
|
|
333
|
+
<!-- The below code snippet is automatically added from ./../apiExamples/reset.html -->
|
|
334
|
+
<pre class="language-html"><code class="language-html"><auro-menu id="resetExample" value="duration">
|
|
335
|
+
<auro-menuoption value="stops">Stops</auro-menuoption>
|
|
336
|
+
<auro-menuoption value="price">Price</auro-menuoption>
|
|
337
|
+
<auro-menuoption value="duration">Duration</auro-menuoption>
|
|
338
|
+
<auro-menuoption value="departure">Departure</auro-menuoption>
|
|
339
|
+
<auro-menuoption value="arrival">Arrival</auro-menuoption>
|
|
340
|
+
</auro-menu>
|
|
341
|
+
<br/><br/>
|
|
342
|
+
<auro-button id="resetExampleBtn">RESET</auro-button></code></pre>
|
|
343
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
344
|
+
</auro-accordion>
|
|
345
|
+
<auro-header level="3" id="selectByValue">selectByValue(value)</auro-header>
|
|
346
|
+
<p>Selects the option(s) whose <code>value</code> matches the argument. Accepts a string in single-select mode or an array of strings in multi-select mode; passing <code>undefined</code>, <code>null</code>, an empty string, or an empty array clears the selection.</p>
|
|
347
|
+
<div class="exampleWrapper">
|
|
348
|
+
<!-- AURO-GENERATED-CONTENT:START (FILE:src=./../apiExamples/select-by-value.html) -->
|
|
349
|
+
<!-- The below content is automatically added from ./../apiExamples/select-by-value.html -->
|
|
350
|
+
<auro-menu id="selectByValueMenu">
|
|
351
|
+
<auro-menuoption value="stops">Stops</auro-menuoption>
|
|
352
|
+
<auro-menuoption value="price">Price</auro-menuoption>
|
|
353
|
+
<auro-menuoption value="duration">Duration</auro-menuoption>
|
|
354
|
+
<auro-menuoption value="departure">Departure</auro-menuoption>
|
|
355
|
+
<auro-menuoption value="arrival">Arrival</auro-menuoption>
|
|
356
|
+
</auro-menu>
|
|
357
|
+
<br />
|
|
358
|
+
<auro-button id="selectByValueStops">Select "Stops"</auro-button>
|
|
359
|
+
<auro-button id="selectByValueDuration">Select "Duration"</auro-button>
|
|
360
|
+
<auro-button id="selectByValueClear">Clear selection</auro-button>
|
|
361
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
362
|
+
</div>
|
|
363
|
+
<auro-accordion alignRight>
|
|
364
|
+
<span slot="trigger">See code</span>
|
|
365
|
+
<!-- AURO-GENERATED-CONTENT:START (CODE:src=./../apiExamples/select-by-value.html) -->
|
|
366
|
+
<!-- The below code snippet is automatically added from ./../apiExamples/select-by-value.html -->
|
|
367
|
+
<pre class="language-html"><code class="language-html"><auro-menu id="selectByValueMenu">
|
|
368
|
+
<auro-menuoption value="stops">Stops</auro-menuoption>
|
|
369
|
+
<auro-menuoption value="price">Price</auro-menuoption>
|
|
370
|
+
<auro-menuoption value="duration">Duration</auro-menuoption>
|
|
371
|
+
<auro-menuoption value="departure">Departure</auro-menuoption>
|
|
372
|
+
<auro-menuoption value="arrival">Arrival</auro-menuoption>
|
|
373
|
+
</auro-menu>
|
|
374
|
+
<br />
|
|
375
|
+
<auro-button id="selectByValueStops">Select "Stops"</auro-button>
|
|
376
|
+
<auro-button id="selectByValueDuration">Select "Duration"</auro-button>
|
|
377
|
+
<auro-button id="selectByValueClear">Clear selection</auro-button></code></pre>
|
|
378
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
379
|
+
</auro-accordion>
|
|
380
|
+
<auro-header level="3" id="updateActiveOption">updateActiveOption(indexOrOption)</auro-header>
|
|
381
|
+
<p>Sets the specified option as the currently active (highlighted) option. Accepts either a numeric index into <code>options</code> or an <code><auro-menuoption></code> element reference.</p>
|
|
317
382
|
<auro-header level="3" id="navigateOptions">navigateOptions(direction)</auro-header>
|
|
318
|
-
<p>Moves the
|
|
383
|
+
<p>Moves the active option to the next or previous option. Accepts <code>'up'</code> or <code>'down'</code> as the direction parameter.</p>
|
|
384
|
+
</section>
|
|
385
|
+
<section>
|
|
386
|
+
<auro-header level="2" id="events">Events</auro-header>
|
|
387
|
+
<p>The <code><auro-menu></code> element dispatches custom events that consumers can subscribe to via <code>addEventListener</code>. The example below wires listeners for the full event set and logs each firing.</p>
|
|
388
|
+
<auro-header level="3" id="eventList">Event List</auro-header>
|
|
389
|
+
<ul>
|
|
390
|
+
<li><code>auroMenu-selectedOption</code> — a new selection has been made.</li>
|
|
391
|
+
<li><code>auroMenu-activatedOption</code> — the active (highlighted) option changed via keyboard or hover.</li>
|
|
392
|
+
<li><code>auroMenu-optionsChange</code> — the set of available options was updated (e.g., after a slot change).</li>
|
|
393
|
+
<li><code>auroMenu-selectValueReset</code> — the menu's <code>value</code> was reset via <code>reset()</code>.</li>
|
|
394
|
+
<li><code>auroMenu-selectValueFailure</code> — a call to <code>selectByValue()</code> found no matching option.</li>
|
|
395
|
+
</ul>
|
|
396
|
+
<div class="exampleWrapper">
|
|
397
|
+
<!-- AURO-GENERATED-CONTENT:START (FILE:src=./../apiExamples/events.html) -->
|
|
398
|
+
<!-- The below content is automatically added from ./../apiExamples/events.html -->
|
|
399
|
+
<auro-menu id="eventsExampleMenu">
|
|
400
|
+
<auro-menuoption value="stops">Stops</auro-menuoption>
|
|
401
|
+
<auro-menuoption value="price">Price</auro-menuoption>
|
|
402
|
+
<auro-menuoption value="duration">Duration</auro-menuoption>
|
|
403
|
+
<auro-menuoption value="departure">Departure</auro-menuoption>
|
|
404
|
+
<auro-menuoption value="arrival">Arrival</auro-menuoption>
|
|
405
|
+
</auro-menu>
|
|
406
|
+
<br />
|
|
407
|
+
<auro-button id="eventsExampleReset">reset()</auro-button>
|
|
408
|
+
<auro-button id="eventsExampleBadValue">selectByValue("nonexistent")</auro-button>
|
|
409
|
+
<auro-button id="eventsExampleClearLog">Clear log</auro-button>
|
|
410
|
+
<pre id="eventsExampleLog" style="max-height: 200px; overflow: auto; padding: var(--ds-size-100, 8px); background: var(--ds-color-container-secondary, #f5f5f5); border-radius: 4px;">(interact with the menu above)</pre>
|
|
411
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
412
|
+
</div>
|
|
413
|
+
<auro-accordion alignRight>
|
|
414
|
+
<span slot="trigger">See code</span>
|
|
415
|
+
<!-- AURO-GENERATED-CONTENT:START (CODE:src=./../apiExamples/events.html) -->
|
|
416
|
+
<!-- The below code snippet is automatically added from ./../apiExamples/events.html -->
|
|
417
|
+
<pre class="language-html"><code class="language-html"><auro-menu id="eventsExampleMenu">
|
|
418
|
+
<auro-menuoption value="stops">Stops</auro-menuoption>
|
|
419
|
+
<auro-menuoption value="price">Price</auro-menuoption>
|
|
420
|
+
<auro-menuoption value="duration">Duration</auro-menuoption>
|
|
421
|
+
<auro-menuoption value="departure">Departure</auro-menuoption>
|
|
422
|
+
<auro-menuoption value="arrival">Arrival</auro-menuoption>
|
|
423
|
+
</auro-menu>
|
|
424
|
+
<br />
|
|
425
|
+
<auro-button id="eventsExampleReset">reset()</auro-button>
|
|
426
|
+
<auro-button id="eventsExampleBadValue">selectByValue("nonexistent")</auro-button>
|
|
427
|
+
<auro-button id="eventsExampleClearLog">Clear log</auro-button>
|
|
428
|
+
<pre id="eventsExampleLog" style="max-height: 200px; overflow: auto; padding: var(--ds-size-100, 8px); background: var(--ds-color-container-secondary, #f5f5f5); border-radius: 4px;">(interact with the menu above)</pre></code></pre>
|
|
429
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
430
|
+
</auro-accordion>
|
|
431
|
+
<auro-header level="3" id="eventAttribute">Option event attribute</auro-header>
|
|
432
|
+
<p>Attach an <code>event</code> attribute to any <code>auro-menuoption</code> to dispatch a named custom event from the menu when that option is selected. The generic <code>auroMenu-customEventFired</code> event is also dispatched on every firing — its <code>detail.option</code> references the option that triggered it, so a single listener can route on the <code>event</code> attribute value.</p>
|
|
433
|
+
<div class="exampleWrapper">
|
|
434
|
+
<!-- AURO-GENERATED-CONTENT:START (FILE:src=./../apiExamples/event-attribute.html) -->
|
|
435
|
+
<!-- The below content is automatically added from ./../apiExamples/event-attribute.html -->
|
|
436
|
+
<auro-menu id="eventAttrExample">
|
|
437
|
+
<auro-menuoption value="search" event="custom-flight-search">Search flights</auro-menuoption>
|
|
438
|
+
<auro-menuoption value="clear" event="custom-clear-filters">Clear filters</auro-menuoption>
|
|
439
|
+
<auro-menuoption value="save" event="custom-save-preferences">Save preferences</auro-menuoption>
|
|
440
|
+
</auro-menu>
|
|
441
|
+
<p>Last custom event: <output id="eventAttrOutput">(none)</output></p>
|
|
442
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
443
|
+
</div>
|
|
444
|
+
<auro-accordion alignRight>
|
|
445
|
+
<span slot="trigger">See code</span>
|
|
446
|
+
<!-- AURO-GENERATED-CONTENT:START (CODE:src=./../apiExamples/event-attribute.html) -->
|
|
447
|
+
<!-- The below code snippet is automatically added from ./../apiExamples/event-attribute.html -->
|
|
448
|
+
<pre class="language-html"><code class="language-html"><auro-menu id="eventAttrExample">
|
|
449
|
+
<auro-menuoption value="search" event="custom-flight-search">Search flights</auro-menuoption>
|
|
450
|
+
<auro-menuoption value="clear" event="custom-clear-filters">Clear filters</auro-menuoption>
|
|
451
|
+
<auro-menuoption value="save" event="custom-save-preferences">Save preferences</auro-menuoption>
|
|
452
|
+
</auro-menu>
|
|
453
|
+
<p>Last custom event: <output id="eventAttrOutput">(none)</output></p></code></pre>
|
|
454
|
+
<!-- AURO-GENERATED-CONTENT:END -->
|
|
455
|
+
</auro-accordion>
|
|
319
456
|
</section>
|
|
320
457
|
</div>
|
|
321
458
|
</div>
|
|
@@ -422,7 +422,7 @@ class AuroMenu extends AuroElement {
|
|
|
422
422
|
},
|
|
423
423
|
|
|
424
424
|
/**
|
|
425
|
-
*
|
|
425
|
+
* The currently selected menu option(s). In single-select mode this is a single `HTMLElement` (or `undefined` when nothing is selected). In multi-select mode this is an array of `HTMLElement`s.
|
|
426
426
|
*/
|
|
427
427
|
optionSelected: {
|
|
428
428
|
// Allow HTMLElement, HTMLElement[] arrays and undefined
|
|
@@ -992,6 +992,11 @@ class AuroMenu extends AuroElement {
|
|
|
992
992
|
this.optionSelected = undefined;
|
|
993
993
|
this._index = -1;
|
|
994
994
|
|
|
995
|
+
// Clear active option state so a follow-up open/navigation starts fresh
|
|
996
|
+
// rather than reusing a stale reference from before the reset.
|
|
997
|
+
this.items?.forEach((item) => item.classList.remove('active'));
|
|
998
|
+
this.optionActive = undefined;
|
|
999
|
+
|
|
995
1000
|
// Reset UI state
|
|
996
1001
|
this.updateItemsState(new Map([
|
|
997
1002
|
[
|
|
@@ -1483,6 +1488,7 @@ class AuroMenuOption extends AuroElement {
|
|
|
1483
1488
|
this.noCheckmark = false;
|
|
1484
1489
|
this.disabled = false;
|
|
1485
1490
|
this.noMatch = false;
|
|
1491
|
+
this.persistent = false;
|
|
1486
1492
|
|
|
1487
1493
|
/**
|
|
1488
1494
|
* @private
|
|
@@ -1504,6 +1510,12 @@ class AuroMenuOption extends AuroElement {
|
|
|
1504
1510
|
type: Boolean,
|
|
1505
1511
|
reflect: true
|
|
1506
1512
|
},
|
|
1513
|
+
|
|
1514
|
+
/**
|
|
1515
|
+
* **Deprecated.** Use the `value` attribute on `auro-menu` to set the selected option when the menu renders (or call `menu.selectByValue(value)` programmatically). Support for the child-level `selected` attribute will be removed in a future major release.
|
|
1516
|
+
*
|
|
1517
|
+
* @deprecated Use the `value` attribute on `auro-menu` instead.
|
|
1518
|
+
*/
|
|
1507
1519
|
selected: {
|
|
1508
1520
|
type: Boolean,
|
|
1509
1521
|
reflect: true
|
|
@@ -1538,6 +1550,12 @@ class AuroMenuOption extends AuroElement {
|
|
|
1538
1550
|
reflect: true,
|
|
1539
1551
|
attribute: 'nomatch'
|
|
1540
1552
|
},
|
|
1553
|
+
|
|
1554
|
+
/** When true, this option is excluded from `matchWord` DOM rewriting — useful for utility rows (e.g., "Add new…") that must render identically regardless of the current filter. */
|
|
1555
|
+
persistent: {
|
|
1556
|
+
type: Boolean,
|
|
1557
|
+
reflect: true
|
|
1558
|
+
},
|
|
1541
1559
|
};
|
|
1542
1560
|
}
|
|
1543
1561
|
|
|
@@ -1712,6 +1730,103 @@ class AuroMenuOption extends AuroElement {
|
|
|
1712
1730
|
}
|
|
1713
1731
|
}
|
|
1714
1732
|
|
|
1733
|
+
function auroMenuLoadingExample() {
|
|
1734
|
+
document.querySelector("#loadingExampleToggleButton").addEventListener("click", () => {
|
|
1735
|
+
document.querySelectorAll("#loadingExampleTable auro-menu").forEach(menu => menu.toggleAttribute("loading"));
|
|
1736
|
+
});
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
function updateMatch() {
|
|
1740
|
+
let matchWordMenu = document.querySelector('#matchWordMenu');
|
|
1741
|
+
|
|
1742
|
+
matchWordMenu.matchWord = matchWordInput.value;
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
function auroMenuMatchWordExample() {
|
|
1746
|
+
let matchWordInput = document.querySelector('#matchWordInput');
|
|
1747
|
+
|
|
1748
|
+
matchWordInput.addEventListener('keyup', updateMatch);
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
function auroMenuResetExample() {
|
|
1752
|
+
const resetExampleBtnElem = document.querySelector('#resetExampleBtn');
|
|
1753
|
+
const resetExampleElem = document.querySelector('#resetExample');
|
|
1754
|
+
|
|
1755
|
+
if (resetExampleElem && resetExampleBtnElem) {
|
|
1756
|
+
resetExampleBtnElem.addEventListener('click', () => {
|
|
1757
|
+
resetExampleElem.reset();
|
|
1758
|
+
});
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
function auroMenuEventAttributeExample() {
|
|
1763
|
+
const menu = document.querySelector('#eventAttrExample');
|
|
1764
|
+
const output = document.querySelector('#eventAttrOutput');
|
|
1765
|
+
|
|
1766
|
+
menu.addEventListener('auroMenu-customEventFired', (evt) => {
|
|
1767
|
+
const eventName = evt.detail.option.getAttribute('event');
|
|
1768
|
+
output.textContent = `${eventName} (from "${evt.detail.option.textContent}")`;
|
|
1769
|
+
});
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
function auroMenuEventsExample() {
|
|
1773
|
+
const menu = document.querySelector('#eventsExampleMenu');
|
|
1774
|
+
const log = document.querySelector('#eventsExampleLog');
|
|
1775
|
+
const resetBtn = document.querySelector('#eventsExampleReset');
|
|
1776
|
+
const badValueBtn = document.querySelector('#eventsExampleBadValue');
|
|
1777
|
+
const clearBtn = document.querySelector('#eventsExampleClearLog');
|
|
1778
|
+
|
|
1779
|
+
let entries = [];
|
|
1780
|
+
const write = (name, detail) => {
|
|
1781
|
+
const label = detail && detail.tagName ? detail.tagName.toLowerCase() : JSON.stringify(detail);
|
|
1782
|
+
entries.unshift(`${name}: ${label}`);
|
|
1783
|
+
log.textContent = entries.slice(0, 10).join('\n');
|
|
1784
|
+
};
|
|
1785
|
+
|
|
1786
|
+
menu.addEventListener('auroMenu-selectedOption', () => {
|
|
1787
|
+
write('auroMenu-selectedOption', menu.optionSelected);
|
|
1788
|
+
});
|
|
1789
|
+
menu.addEventListener('auroMenu-activatedOption', (evt) => {
|
|
1790
|
+
write('auroMenu-activatedOption', evt.detail);
|
|
1791
|
+
});
|
|
1792
|
+
menu.addEventListener('auroMenu-optionsChange', (evt) => {
|
|
1793
|
+
write('auroMenu-optionsChange', { count: (evt.detail.options || []).length });
|
|
1794
|
+
});
|
|
1795
|
+
menu.addEventListener('auroMenu-selectValueReset', () => {
|
|
1796
|
+
write('auroMenu-selectValueReset', { value: menu.value });
|
|
1797
|
+
});
|
|
1798
|
+
menu.addEventListener('auroMenu-selectValueFailure', (evt) => {
|
|
1799
|
+
write('auroMenu-selectValueFailure', evt.detail);
|
|
1800
|
+
});
|
|
1801
|
+
|
|
1802
|
+
resetBtn.addEventListener('click', () => menu.reset());
|
|
1803
|
+
badValueBtn.addEventListener('click', () => menu.selectByValue('nonexistent'));
|
|
1804
|
+
clearBtn.addEventListener('click', () => {
|
|
1805
|
+
entries = [];
|
|
1806
|
+
log.textContent = '(interact with the menu above)';
|
|
1807
|
+
});
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
function auroMenuPersistentExample() {
|
|
1811
|
+
const input = document.querySelector('#persistentExampleInput');
|
|
1812
|
+
const menu = document.querySelector('#persistentExampleMenu');
|
|
1813
|
+
|
|
1814
|
+
input.addEventListener('keyup', () => {
|
|
1815
|
+
menu.matchWord = input.value;
|
|
1816
|
+
});
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
function auroMenuSelectByValueExample() {
|
|
1820
|
+
const menu = document.querySelector('#selectByValueMenu');
|
|
1821
|
+
const stopsBtn = document.querySelector('#selectByValueStops');
|
|
1822
|
+
const durationBtn = document.querySelector('#selectByValueDuration');
|
|
1823
|
+
const clearBtn = document.querySelector('#selectByValueClear');
|
|
1824
|
+
|
|
1825
|
+
stopsBtn.addEventListener('click', () => menu.selectByValue('stops'));
|
|
1826
|
+
durationBtn.addEventListener('click', () => menu.selectByValue('duration'));
|
|
1827
|
+
clearBtn.addEventListener('click', () => menu.selectByValue(undefined));
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1715
1830
|
/* eslint-disable jsdoc/require-jsdoc, no-magic-numbers, no-param-reassign */
|
|
1716
1831
|
|
|
1717
1832
|
|
|
@@ -1720,7 +1835,35 @@ AuroMenuOption.register();
|
|
|
1720
1835
|
AuroMenu.register('custom-menu');
|
|
1721
1836
|
AuroMenuOption.register('custom-menuoption');
|
|
1722
1837
|
|
|
1838
|
+
const examples = [
|
|
1839
|
+
auroMenuLoadingExample,
|
|
1840
|
+
auroMenuMatchWordExample,
|
|
1841
|
+
auroMenuResetExample,
|
|
1842
|
+
auroMenuEventAttributeExample,
|
|
1843
|
+
auroMenuEventsExample,
|
|
1844
|
+
auroMenuPersistentExample,
|
|
1845
|
+
auroMenuSelectByValueExample
|
|
1846
|
+
];
|
|
1847
|
+
|
|
1723
1848
|
function initExamples(initCount) {
|
|
1849
|
+
initCount = initCount || 0;
|
|
1850
|
+
let anyFailed = false;
|
|
1851
|
+
|
|
1852
|
+
for (const fn of examples) {
|
|
1853
|
+
try {
|
|
1854
|
+
fn();
|
|
1855
|
+
} catch (err) {
|
|
1856
|
+
anyFailed = true;
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
if (anyFailed && initCount <= 20) {
|
|
1861
|
+
setTimeout(() => {
|
|
1862
|
+
initExamples(initCount + 1);
|
|
1863
|
+
}, 100);
|
|
1864
|
+
}
|
|
1724
1865
|
}
|
|
1725
1866
|
|
|
1867
|
+
initExamples();
|
|
1868
|
+
|
|
1726
1869
|
export { initExamples };
|
|
@@ -7,11 +7,84 @@
|
|
|
7
7
|
<auro-header level="2" id="keyEvents">Key Events</auro-header>
|
|
8
8
|
<!-- AURO-GENERATED-CONTENT:START (FILE:src=./../docs/partials/keyEvents.md) -->
|
|
9
9
|
<!-- The below content is automatically added from ./../docs/partials/keyEvents.md -->
|
|
10
|
-
<!-- auro-menu does not implement direct keyboard event handling. -->
|
|
11
|
-
<!-- Keyboard navigation is delegated to parent components (auro-select, auro-combobox) via their keyboard strategy files. -->
|
|
12
10
|
<div class="note">
|
|
13
|
-
<p><strong>Note:</strong>
|
|
14
|
-
</div>
|
|
11
|
+
<p><strong>Note:</strong> <code><auro-menu></code> handles the keys below directly on its own element via a <code>keydown</code> listener. When the menu is used inside <code><auro-select></code> or <code><auro-combobox></code>, the parent component also captures keys on its trigger and drives the same menu behaviors (for example by calling <code>navigateOptions()</code>). Keys not listed below (<code>Home</code>, <code>End</code>, <code>Escape</code>, type-ahead) are handled by the parent — see the <code><auro-select></code> and <code><auro-combobox></code> keyboard behavior docs. An "interactive option" is one that is not <code>disabled</code>, <code>hidden</code>, or <code>static</code> — these are always skipped during navigation and selection, along with <code><hr></code> dividers.</p>
|
|
12
|
+
</div>
|
|
13
|
+
<table>
|
|
14
|
+
<thead>
|
|
15
|
+
<tr>
|
|
16
|
+
<th>Key</th>
|
|
17
|
+
<th>Current State</th>
|
|
18
|
+
<th>Behavior</th>
|
|
19
|
+
</tr>
|
|
20
|
+
</thead>
|
|
21
|
+
<tbody>
|
|
22
|
+
<tr>
|
|
23
|
+
<td rowspan="5">ArrowDown</td>
|
|
24
|
+
<td>No option is active</td>
|
|
25
|
+
<td>The first interactive option becomes active.</td>
|
|
26
|
+
</tr>
|
|
27
|
+
<tr>
|
|
28
|
+
<td>An option is active, followed by interactive options</td>
|
|
29
|
+
<td>Advances the active option to the next interactive option.</td>
|
|
30
|
+
</tr>
|
|
31
|
+
<tr>
|
|
32
|
+
<td>The last interactive option is active</td>
|
|
33
|
+
<td>Wraps to the first interactive option.</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<tr>
|
|
36
|
+
<td>Menu has no options or all options are non-interactive</td>
|
|
37
|
+
<td>No option becomes active; no <code>auroMenu-activatedOption</code> event fires.</td>
|
|
38
|
+
</tr>
|
|
39
|
+
<tr>
|
|
40
|
+
<td>Menu is in <code>loading</code> state</td>
|
|
41
|
+
<td>The rendered loading placeholder is inert (marked <code>disabled</code>) and is not part of <code>items</code>, so it cannot become active.</td>
|
|
42
|
+
</tr>
|
|
43
|
+
<tr>
|
|
44
|
+
<td rowspan="4">ArrowUp</td>
|
|
45
|
+
<td>No option is active</td>
|
|
46
|
+
<td>The last interactive option becomes active.</td>
|
|
47
|
+
</tr>
|
|
48
|
+
<tr>
|
|
49
|
+
<td>An option is active, preceded by interactive options</td>
|
|
50
|
+
<td>Advances the active option to the previous interactive option.</td>
|
|
51
|
+
</tr>
|
|
52
|
+
<tr>
|
|
53
|
+
<td>The first interactive option is active</td>
|
|
54
|
+
<td>Wraps to the last interactive option.</td>
|
|
55
|
+
</tr>
|
|
56
|
+
<tr>
|
|
57
|
+
<td>Menu has no options or all options are non-interactive</td>
|
|
58
|
+
<td>No option becomes active.</td>
|
|
59
|
+
</tr>
|
|
60
|
+
<tr>
|
|
61
|
+
<td rowspan="4">Enter</td>
|
|
62
|
+
<td>Single-select, active option is not currently selected</td>
|
|
63
|
+
<td>The active option is selected. Any previous selection is cleared. <code>auroMenu-selectedOption</code> fires.</td>
|
|
64
|
+
</tr>
|
|
65
|
+
<tr>
|
|
66
|
+
<td>Single-select, active option is already selected</td>
|
|
67
|
+
<td>No selection change, but <code>auroMenu-selectedOption</code> still fires so the parent can react (for example, close the dropdown).</td>
|
|
68
|
+
</tr>
|
|
69
|
+
<tr>
|
|
70
|
+
<td>Multi-select</td>
|
|
71
|
+
<td>The active option toggles selected. Other selections are preserved.</td>
|
|
72
|
+
</tr>
|
|
73
|
+
<tr>
|
|
74
|
+
<td>Active option is disabled, hidden, or static</td>
|
|
75
|
+
<td>Selection is a no-op.</td>
|
|
76
|
+
</tr>
|
|
77
|
+
<tr>
|
|
78
|
+
<td rowspan="2">Tab</td>
|
|
79
|
+
<td>An option is active</td>
|
|
80
|
+
<td>The active option is selected (same behavior as <code>Enter</code>).<div class="note"><strong>Note:</strong> <code>Tab</code> does not <code>preventDefault</code>, so focus continues to the next element in the tabindex sequence after selection.</div></td>
|
|
81
|
+
</tr>
|
|
82
|
+
<tr>
|
|
83
|
+
<td>No option is active</td>
|
|
84
|
+
<td>Focus moves to the next tabbable element; no selection change.</td>
|
|
85
|
+
</tr>
|
|
86
|
+
</tbody>
|
|
87
|
+
</table>
|
|
15
88
|
<!-- AURO-GENERATED-CONTENT:END -->
|
|
16
89
|
</div>
|
|
17
90
|
</div>
|
|
@@ -4,20 +4,23 @@
|
|
|
4
4
|
<auro-header level="3" id="voiceOverMenuContainer">Menu Container</auro-header>
|
|
5
5
|
<p>When focus enters the menu, VoiceOver announces:</p>
|
|
6
6
|
<ol>
|
|
7
|
-
<li><strong>Role:</strong> <em>"list box"</em
|
|
7
|
+
<li><strong>Role:</strong> <em>"list box"</em> — set on the root <code><auro-menu></code>; nested menus use <code>role="group"</code> with <code>aria-label="submenu"</code>.</li>
|
|
8
8
|
<li><strong>Item count:</strong> The number of visible options (e.g., <em>"5 items"</em>)</li>
|
|
9
|
+
<li><strong>Multi-select:</strong> When <code>multiSelect</code> is set on the root menu, <code>aria-multiselectable="true"</code> is exposed so VoiceOver announces the listbox as multi-selectable.</li>
|
|
10
|
+
<li><strong>Loading:</strong> While <code>loading</code> is set, <code>aria-busy="true"</code> is exposed so VoiceOver signals that the option set is not yet stable.</li>
|
|
9
11
|
</ol>
|
|
10
12
|
<auro-header level="3" id="voiceOverMenuOptions">Menu Options</auro-header>
|
|
11
|
-
<p>Each <code>auro-menuoption</code> announces the following when
|
|
13
|
+
<p>Each <code>auro-menuoption</code> announces the following when the parent field points at it (via <code>aria-activedescendant</code>) or when the user reads through the listbox:</p>
|
|
12
14
|
<ol>
|
|
13
15
|
<li><strong>Label:</strong> The option's text content</li>
|
|
14
16
|
<li><strong>Role:</strong> <em>"option"</em></li>
|
|
15
|
-
<li><strong>Position:</strong> Position in the list (e.g., <em>"3 of 5"</em>)</li>
|
|
16
|
-
<li><strong>Selected state:</strong> <em>"selected"</em> if
|
|
17
|
-
<li><strong>Disabled state:</strong> <em>"dimmed"</em> if the option
|
|
18
|
-
</ol>
|
|
17
|
+
<li><strong>Position:</strong> Position in the list (e.g., <em>"3 of 5"</em>) — when the menu is used inside <code><auro-select></code> (or another host that stamps them), each option receives <code>aria-setsize</code> and <code>aria-posinset</code>. Standalone <code><auro-menu></code> does not set these attributes itself; positional announcements outside a select/combobox host rely on VoiceOver's own listbox item count.</li>
|
|
18
|
+
<li><strong>Selected state:</strong> <em>"selected"</em> if <code>aria-selected="true"</code> is set on the option</li>
|
|
19
|
+
<li><strong>Disabled state:</strong> <em>"dimmed"</em> if <code>aria-disabled="true"</code> is set on the option</li>
|
|
20
|
+
</ol>
|
|
21
|
+
<div class="note"><strong>Note:</strong> <code><auro-menuoption></code> is not directly focusable — <code>tabindex="-1"</code> keeps it out of the tab order. In a select or combobox context, focus stays on the parent trigger and the active option is pointed at via <code>aria-activedescendant</code> (using <code>ariaActiveDescendantElement</code> to cross the shadow-root boundary).</div>
|
|
19
22
|
<auro-header level="3" id="voiceOverSelection">Selection</auro-header>
|
|
20
|
-
<p>When an option is selected via Enter or
|
|
23
|
+
<p>When an option is selected via Enter (or Tab, which selects and moves focus out of the menu):</p>
|
|
21
24
|
<ul>
|
|
22
25
|
<li>VoiceOver announces the option label followed by <em>"selected"</em></li>
|
|
23
26
|
<li>In multi-select mode, previously selected options remain selected and their state is preserved</li>
|
|
@@ -26,8 +29,8 @@
|
|
|
26
29
|
<ol>
|
|
27
30
|
<li><strong>Enter the menu:</strong> Focus moves into the listbox; VoiceOver announces role and item count</li>
|
|
28
31
|
<li><strong>Navigate options:</strong> Use Arrow Down/Up keys; VoiceOver announces each option's label, role, and position</li>
|
|
29
|
-
<li><strong>Select an option:</strong> Press Enter
|
|
30
|
-
<li><strong>Exit:</strong> Tab out of the menu
|
|
32
|
+
<li><strong>Select an option:</strong> Press Enter; VoiceOver confirms the selection</li>
|
|
33
|
+
<li><strong>Exit:</strong> Tab out of the menu (Tab also selects the active option). When the menu is used inside a dropdown context, the parent handles Escape.</li>
|
|
31
34
|
</ol>
|
|
32
35
|
<auro-header level="2" id="voiceOverNestedMenus">Nested Menus</auro-header>
|
|
33
36
|
<p>When a nested <code>auro-menu</code> is encountered, VoiceOver announces a new listbox context. Each nested menu maintains its own option count and position tracking.</p>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<p>Custom list implementations often fail to provide correct ARIA semantics, keyboard navigation, or screen reader announcements.</p>
|
|
5
5
|
<p><code>auro-menu</code> provides:</p>
|
|
6
6
|
<ul>
|
|
7
|
-
<li><strong>Keyboard navigation</strong> — Arrow
|
|
7
|
+
<li><strong>Keyboard navigation</strong> — Arrow Up/Down move the active option; Enter selects it; Tab selects and moves focus out of the menu.</li>
|
|
8
8
|
<li><strong>Active option tracking</strong> — The currently highlighted option is tracked programmatically, enabling <code>aria-activedescendant</code> patterns in parent components like <code>auro-select</code> and <code>auro-combobox</code>.</li>
|
|
9
9
|
<li><strong>Multi-select semantics</strong> — When <code>multiSelect</code> is enabled, <code>aria-multiselectable</code> is set on the menu.</li>
|
|
10
10
|
<li><strong>Loading state</strong> — <code>aria-busy</code> is set during loading, with customizable loading icon and text slots.</li>
|
|
@@ -24,15 +24,14 @@
|
|
|
24
24
|
<ul>
|
|
25
25
|
<li>Checkmark indicators for each selected option</li>
|
|
26
26
|
<li>A <code>value</code> that returns a JSON-stringified array of selections</li>
|
|
27
|
-
<li
|
|
28
|
-
<li><code>
|
|
29
|
-
<li><code>clearSelection()</code> and <code>reset()</code> methods for programmatic control</li>
|
|
27
|
+
<li>Click-to-toggle behavior that deselects an already-selected option</li>
|
|
28
|
+
<li><code>reset()</code> method for programmatic control</li>
|
|
30
29
|
</ul>
|
|
31
30
|
<auro-header level="2" id="searchAndFiltering">Search and filtering</auro-header>
|
|
32
31
|
<p>Native menus have no concept of filtering or highlighting matched text.</p>
|
|
33
32
|
<p><code>auro-menu</code> supports:</p>
|
|
34
33
|
<ul>
|
|
35
|
-
<li><code>matchWord</code> to highlight matching portions of option text as the user types (used by <code>auro-combobox</code> for real-time filtering)</li>
|
|
34
|
+
<li><auro-hyperlink href="customize#matchWord"><code>matchWord</code></auro-hyperlink> to highlight matching portions of option text as the user types (used by <code>auro-combobox</code> for real-time filtering)</li>
|
|
36
35
|
<li>Programmatic <code>navigateOptions(direction)</code> for keyboard-driven traversal</li>
|
|
37
36
|
</ul>
|
|
38
37
|
<auro-header level="2" id="loadingState">Loading state</auro-header>
|
|
@@ -88,7 +87,7 @@
|
|
|
88
87
|
<tr>
|
|
89
88
|
<td>Keyboard navigation</td>
|
|
90
89
|
<td>Browser-dependent</td>
|
|
91
|
-
<td>
|
|
90
|
+
<td>Arrow Up/Down, Enter, Tab</td>
|
|
92
91
|
</tr>
|
|
93
92
|
<tr>
|
|
94
93
|
<td>Composable primitive</td>
|
|
@@ -96,9 +95,9 @@
|
|
|
96
95
|
<td>Foundation for select and combobox</td>
|
|
97
96
|
</tr>
|
|
98
97
|
<tr>
|
|
99
|
-
<td>
|
|
100
|
-
<td>
|
|
101
|
-
<td
|
|
98
|
+
<td>Multi-select deselect</td>
|
|
99
|
+
<td>Ctrl+click list box</td>
|
|
100
|
+
<td>Click-to-toggle in multi-select</td>
|
|
102
101
|
</tr>
|
|
103
102
|
</tbody>
|
|
104
103
|
</table>
|
|
@@ -68,7 +68,7 @@ export class AuroMenu extends AuroElement {
|
|
|
68
68
|
attribute: string;
|
|
69
69
|
};
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
71
|
+
* The currently selected menu option(s). In single-select mode this is a single `HTMLElement` (or `undefined` when nothing is selected). In multi-select mode this is an array of `HTMLElement`s.
|
|
72
72
|
*/
|
|
73
73
|
optionSelected: {
|
|
74
74
|
type: ObjectConstructor;
|
|
@@ -13,6 +13,11 @@ export class AuroMenuOption extends AuroElement {
|
|
|
13
13
|
type: BooleanConstructor;
|
|
14
14
|
reflect: boolean;
|
|
15
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* **Deprecated.** Use the `value` attribute on `auro-menu` to set the selected option when the menu renders (or call `menu.selectByValue(value)` programmatically). Support for the child-level `selected` attribute will be removed in a future major release.
|
|
18
|
+
*
|
|
19
|
+
* @deprecated Use the `value` attribute on `auro-menu` instead.
|
|
20
|
+
*/
|
|
16
21
|
selected: {
|
|
17
22
|
type: BooleanConstructor;
|
|
18
23
|
reflect: boolean;
|
|
@@ -45,6 +50,11 @@ export class AuroMenuOption extends AuroElement {
|
|
|
45
50
|
reflect: boolean;
|
|
46
51
|
attribute: string;
|
|
47
52
|
};
|
|
53
|
+
/** When true, this option is excluded from `matchWord` DOM rewriting — useful for utility rows (e.g., "Add new…") that must render identically regardless of the current filter. */
|
|
54
|
+
persistent: {
|
|
55
|
+
type: BooleanConstructor;
|
|
56
|
+
reflect: boolean;
|
|
57
|
+
};
|
|
48
58
|
layout: {
|
|
49
59
|
type: StringConstructor;
|
|
50
60
|
attribute: string;
|
|
@@ -74,6 +84,7 @@ export class AuroMenuOption extends AuroElement {
|
|
|
74
84
|
noCheckmark: boolean;
|
|
75
85
|
disabled: boolean;
|
|
76
86
|
noMatch: boolean;
|
|
87
|
+
persistent: boolean;
|
|
77
88
|
/**
|
|
78
89
|
* @private
|
|
79
90
|
*/
|
|
@@ -429,7 +429,7 @@ class AuroMenu extends AuroElement {
|
|
|
429
429
|
},
|
|
430
430
|
|
|
431
431
|
/**
|
|
432
|
-
*
|
|
432
|
+
* The currently selected menu option(s). In single-select mode this is a single `HTMLElement` (or `undefined` when nothing is selected). In multi-select mode this is an array of `HTMLElement`s.
|
|
433
433
|
*/
|
|
434
434
|
optionSelected: {
|
|
435
435
|
// Allow HTMLElement, HTMLElement[] arrays and undefined
|
|
@@ -999,6 +999,11 @@ class AuroMenu extends AuroElement {
|
|
|
999
999
|
this.optionSelected = undefined;
|
|
1000
1000
|
this._index = -1;
|
|
1001
1001
|
|
|
1002
|
+
// Clear active option state so a follow-up open/navigation starts fresh
|
|
1003
|
+
// rather than reusing a stale reference from before the reset.
|
|
1004
|
+
this.items?.forEach((item) => item.classList.remove('active'));
|
|
1005
|
+
this.optionActive = undefined;
|
|
1006
|
+
|
|
1002
1007
|
// Reset UI state
|
|
1003
1008
|
this.updateItemsState(new Map([
|
|
1004
1009
|
[
|
|
@@ -1477,6 +1482,7 @@ class AuroMenuOption extends AuroElement {
|
|
|
1477
1482
|
this.noCheckmark = false;
|
|
1478
1483
|
this.disabled = false;
|
|
1479
1484
|
this.noMatch = false;
|
|
1485
|
+
this.persistent = false;
|
|
1480
1486
|
|
|
1481
1487
|
/**
|
|
1482
1488
|
* @private
|
|
@@ -1498,6 +1504,12 @@ class AuroMenuOption extends AuroElement {
|
|
|
1498
1504
|
type: Boolean,
|
|
1499
1505
|
reflect: true
|
|
1500
1506
|
},
|
|
1507
|
+
|
|
1508
|
+
/**
|
|
1509
|
+
* **Deprecated.** Use the `value` attribute on `auro-menu` to set the selected option when the menu renders (or call `menu.selectByValue(value)` programmatically). Support for the child-level `selected` attribute will be removed in a future major release.
|
|
1510
|
+
*
|
|
1511
|
+
* @deprecated Use the `value` attribute on `auro-menu` instead.
|
|
1512
|
+
*/
|
|
1501
1513
|
selected: {
|
|
1502
1514
|
type: Boolean,
|
|
1503
1515
|
reflect: true
|
|
@@ -1532,6 +1544,12 @@ class AuroMenuOption extends AuroElement {
|
|
|
1532
1544
|
reflect: true,
|
|
1533
1545
|
attribute: 'nomatch'
|
|
1534
1546
|
},
|
|
1547
|
+
|
|
1548
|
+
/** When true, this option is excluded from `matchWord` DOM rewriting — useful for utility rows (e.g., "Add new…") that must render identically regardless of the current filter. */
|
|
1549
|
+
persistent: {
|
|
1550
|
+
type: Boolean,
|
|
1551
|
+
reflect: true
|
|
1552
|
+
},
|
|
1535
1553
|
};
|
|
1536
1554
|
}
|
|
1537
1555
|
|