@lion/ui 0.22.0 → 0.23.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/README.md +35 -0
- package/components/combobox/src/LionCombobox.js +10 -2
- package/components/combobox/test/lion-combobox.test.js +31 -0
- package/components/form-core/src/choice-group/ChoiceGroupMixin.js +7 -0
- package/components/form-core/types/choice-group/ChoiceGroupMixinTypes.ts +5 -0
- package/components/input-amount/src/LionInputAmount.js +17 -6
- package/components/input-amount/src/formatters.js +5 -3
- package/components/input-amount/test/formatters.test.js +88 -74
- package/components/input-amount/test/lion-input-amount.test.js +51 -36
- package/components/input-tel/test/validators.test.js +9 -0
- package/components/listbox/src/ListboxMixin.js +19 -3
- package/components/listbox/types/ListboxMixinTypes.ts +7 -1
- package/components/menu/README.md +360 -0
- package/components/menu/src/InteractiveListMixin.js +867 -0
- package/components/menu/src/LionMenu.js +436 -0
- package/components/menu/src/MoreButtonMenuMixin.js +295 -0
- package/components/menu/src/MultiLevelListMixin.js +312 -0
- package/components/menu/src/utils/isInView.js +26 -0
- package/components/menu/src/utils/listItemInteractions.js +124 -0
- package/components/menu/test/InteractiveListMixin.test.js +3 -0
- package/components/menu/test/MoreButtonMenuMixin.test.js +4 -0
- package/components/menu/test/MultiLevelListMixin.test.js +3 -0
- package/components/menu/test/lion-menu-interactions.test.js +3 -0
- package/components/menu/test/lion-menu.test.js +14 -0
- package/components/menu/test-helpers/mimicKeyPress.js +9 -0
- package/components/menu/test-suites/InteractiveListMixin.suite.js +537 -0
- package/components/menu/test-suites/LionMenu.suite.js +114 -0
- package/components/menu/test-suites/LionMenuInteractions.suite.js +583 -0
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +372 -0
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +309 -0
- package/components/menu/types/InteractiveListMixinTypes.ts +126 -0
- package/components/menu/types/MoreButtonMenuMixinTypes.ts +51 -0
- package/components/menu/types/MultiLevelListMixinTypes.ts +28 -0
- package/components/menu/types/OverlayWithListInvokerMixinTypes.ts +61 -0
- package/components/overlays/NEXT.md +49 -0
- package/components/overlays/src/OverlayController.js +304 -125
- package/components/overlays/src/OverlayMixin.js +81 -17
- package/components/overlays/src/utils/adopt-styles.js +1 -1
- package/components/overlays/src/utils/is-equal-config.js +15 -6
- package/components/overlays/test/OverlayController.test.js +223 -25
- package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
- package/components/overlays/types/ArrowMixinTypes.ts +1 -3
- package/components/overlays/types/OverlayConfig.ts +20 -5
- package/components/overlays/types/OverlayMixinTypes.ts +2 -0
- package/components/select-rich/src/LionSelectRich.js +12 -0
- package/components/select-rich/test/lion-select-rich-interaction.test.js +53 -0
- package/components/select-rich/test/lion-select-rich-upgrade.test.js +30 -0
- package/custom-elements.json +3120 -149
- package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
- package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
- package/dist-types/components/dialog/src/LionDialog.d.ts +6 -2
- package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
- package/dist-types/components/form-core/src/choice-group/ChoiceGroupMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts +5 -0
- package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts.map +1 -1
- package/dist-types/components/input-amount/src/LionInputAmount.d.ts +3 -1
- package/dist-types/components/input-amount/src/LionInputAmount.d.ts.map +1 -1
- package/dist-types/components/input-amount/src/formatters.d.ts +6 -4
- package/dist-types/components/input-amount/src/formatters.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +1 -1
- package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
- package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts +7 -1
- package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts.map +1 -1
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +35 -0
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenu.d.ts +129 -0
- package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +8 -0
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +7 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/isInView.d.ts +9 -0
- package/dist-types/components/menu/src/utils/isInView.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +48 -0
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +1 -0
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +2 -0
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +2 -0
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +2 -0
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/lion-menu.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-menu.test.d.ts.map +1 -0
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +7 -0
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +11 -0
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +9 -0
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +5 -0
- package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +11 -0
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +11 -0
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +1 -0
- package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts +72 -0
- package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts.map +1 -0
- package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts +30 -0
- package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts.map +1 -0
- package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts +16 -0
- package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts.map +1 -0
- package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts +35 -0
- package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts.map +1 -0
- package/dist-types/components/overlays/src/OverlayController.d.ts +22 -5
- package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
- package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayConfig.d.ts +12 -2
- package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +1 -0
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +13 -2
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts.map +1 -1
- package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts +2 -0
- package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts.map +1 -0
- package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
- package/dist-types/exports/define/lion-item.d.ts +2 -0
- package/dist-types/exports/define/lion-item.d.ts.map +1 -0
- package/dist-types/exports/define/lion-menu.d.ts +2 -0
- package/dist-types/exports/define/lion-menu.d.ts.map +1 -0
- package/dist-types/exports/define/lion-menuitem.d.ts +2 -0
- package/dist-types/exports/define/lion-menuitem.d.ts.map +1 -0
- package/dist-types/exports/menu-test-suites.d.ts +4 -0
- package/dist-types/exports/menu-test-suites.d.ts.map +1 -0
- package/dist-types/exports/menu.d.ts +3 -0
- package/dist-types/exports/menu.d.ts.map +1 -0
- package/dist-types/exports/overlays.d.ts +6 -0
- package/dist-types/exports/overlays.d.ts.map +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/checkbox-group/overview.md +2 -2
- package/docs/components/collapsible/overview.md +1 -1
- package/docs/components/combobox/api-table.md +53 -39
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/api-table.md +32 -6
- package/docs/components/dialog/overview.md +1 -1
- package/docs/components/fieldset/overview.md +5 -5
- package/docs/components/form/overview.md +3 -3
- package/docs/components/form/use-cases.md +2 -2
- package/docs/components/icon/use-cases.md +1 -1
- package/docs/components/input/overview.md +1 -1
- package/docs/components/input-amount/api-table.md +9 -7
- package/docs/components/input-amount/overview.md +3 -3
- package/docs/components/input-amount/use-cases.md +15 -4
- package/docs/components/input-amount-dropdown/api-table.md +2 -0
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/api-table.md +63 -45
- package/docs/components/input-datepicker/overview.md +5 -5
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-iban/overview.md +2 -2
- package/docs/components/input-range/overview.md +2 -2
- package/docs/components/input-stepper/overview.md +1 -1
- package/docs/components/input-tel/overview.md +1 -1
- package/docs/components/input-tel/use-cases.md +6 -6
- package/docs/components/input-tel-dropdown/overview.md +1 -1
- package/docs/components/listbox/use-cases.md +1 -1
- package/docs/components/menu/api-table.md +44 -0
- package/docs/components/menu/applyMenuDemoStyles.js +173 -0
- package/docs/components/menu/extensions.md +262 -0
- package/docs/components/menu/index.md +13 -0
- package/docs/components/menu/migration.md +129 -0
- package/docs/components/menu/overview.md +448 -0
- package/docs/components/menu/src/DemoNavigationBar.js +441 -0
- package/docs/components/menu/src/DemoSpinButton.js +215 -0
- package/docs/components/menu/src/DemoToolbar.js +101 -0
- package/docs/components/menu/src/DemoTree.js +55 -0
- package/docs/components/menu/src/navigation-bar-types.js +41 -0
- package/docs/components/menu/use-cases.md +74 -0
- package/docs/components/radio-group/overview.md +3 -3
- package/docs/components/select/use-cases.md +1 -1
- package/docs/components/select-rich/api-table.md +51 -33
- package/docs/components/select-rich/use-cases.md +2 -2
- package/docs/components/tabs/examples.md +1 -1
- package/docs/components/tooltip/api-table.md +33 -7
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/providence-analytics/overview.md +1 -1
- package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
- package/docs/fundamentals/rationales/accessibility.md +1 -1
- package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
- package/docs/fundamentals/systems/core/overview.md +1 -1
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
- package/docs/fundamentals/systems/form/model-value.md +1 -1
- package/docs/fundamentals/systems/form/overview.md +28 -28
- package/docs/fundamentals/systems/form/validate.md +2 -2
- package/docs/fundamentals/systems/localize/overview.md +4 -4
- package/docs/fundamentals/systems/overlays/api-table.md +46 -43
- package/docs/fundamentals/systems/overlays/configuration.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +5 -5
- package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +1 -1
- package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
- package/docs/guides/how-to/create-a-custom-field.md +5 -5
- package/docs/guides/how-to/create-a-form.md +4 -4
- package/docs/guides/how-to/extend-a-native-input.md +2 -2
- package/docs/guides/how-to/index.md +1 -1
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/styling.md +1 -1
- package/exports/define/lion-item.js +3 -0
- package/exports/define/lion-menu.js +3 -0
- package/exports/define/lion-menuitem.js +3 -0
- package/exports/menu-test-suites.js +4 -0
- package/exports/menu.js +3 -0
- package/exports/overlays.js +6 -0
- package/menu-test-suites.js +4 -0
- package/menu.js +3 -0
- package/overlays.js +6 -0
- package/package.json +11 -4
- package/vendor/README.md +61 -0
- package/vendor/awesome-phonenumber-7.9.0-tlouisse.libphonenumber-9.0.41.tgz +0 -0
- package/vscode.html-custom-data.json +76 -8
- package/web-types.json +202 -17
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 'Menu: Overview'
|
|
3
|
+
parts:
|
|
4
|
+
- Menu
|
|
5
|
+
- Overview
|
|
6
|
+
eleventyNavigation:
|
|
7
|
+
key: 'Menu: Overview'
|
|
8
|
+
order: 10
|
|
9
|
+
parent: Menu
|
|
10
|
+
title: Overview
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Menu: Overview
|
|
14
|
+
|
|
15
|
+
A menu is a widget that offers a list of choices to the user, such as a set of actions or functions. A menu is usually opened, or made visible, by activating a menu button, choosing an item in a menu that opens a sub menu, or by invoking a command, such as Shift + F10 in Windows, that opens a context specific menu. When a user activates a choice in a menu, the menu usually closes unless the choice opened a submenu.
|
|
16
|
+
|
|
17
|
+
A menu that is visually persistent is a menubar. A menubar is typically horizontal and is often used to create a menu bar similar to those found near the top of the window in many desktop applications, offering the user quick access to a consistent set of commands.
|
|
18
|
+
|
|
19
|
+
A common convention for indicating that a menu item launches a dialog box is to append "…" (ellipsis) to the menu item label, e.g., "Save as …".
|
|
20
|
+
|
|
21
|
+
> From [menu wai-aria best practices](https://www.w3.org/TR/wai-aria-practices/#menu)
|
|
22
|
+
|
|
23
|
+
```js script
|
|
24
|
+
import { html } from 'lit';
|
|
25
|
+
import '@lion/ui/define/lion-item.js';
|
|
26
|
+
import '@lion/ui/define/lion-menu.js';
|
|
27
|
+
import '@lion/ui/define/lion-menuitem.js';
|
|
28
|
+
import './src/DemoTree.js';
|
|
29
|
+
import './src/DemoToolbar.js';
|
|
30
|
+
import './src/DemoSpinButton.js';
|
|
31
|
+
import { applyMenuDemoStyles } from './applyMenuDemoStyles.js';
|
|
32
|
+
|
|
33
|
+
applyMenuDemoStyles();
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```js preview-story
|
|
37
|
+
export const menuButton = () => html`
|
|
38
|
+
<nav>
|
|
39
|
+
<button data-invoker>Open menu</button>
|
|
40
|
+
<lion-menu>
|
|
41
|
+
<div role="menuitem">Go to Definition</div>
|
|
42
|
+
<div role="menuitem">Go to Type Definition</div>
|
|
43
|
+
<div>
|
|
44
|
+
<button role="menuitem" data-invoker>Peek</button>
|
|
45
|
+
<lion-menu>
|
|
46
|
+
<div role="menuitem">Peek Call Hierarchy</div>
|
|
47
|
+
<div role="separator"></div>
|
|
48
|
+
<div role="menuitem">Peek Definition</div>
|
|
49
|
+
</lion-menu>
|
|
50
|
+
</div>
|
|
51
|
+
<div role="separator"></div>
|
|
52
|
+
<div role="menuitem">Find all References</div>
|
|
53
|
+
</lion-menu>
|
|
54
|
+
</nav>
|
|
55
|
+
`;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```js preview-story
|
|
59
|
+
export const menuButtonZ = () => html`
|
|
60
|
+
<nav>
|
|
61
|
+
<button data-invoker for="menu">Open menu</button>
|
|
62
|
+
<lion-menu id="menu">
|
|
63
|
+
<lion-menuitem> Go to Definition </lion-menuitem>
|
|
64
|
+
<lion-menuitem> Go to Type Definition </lion-menuitem>
|
|
65
|
+
<lion-menuitem>
|
|
66
|
+
<button slot="invoker">Peek</button>
|
|
67
|
+
<lion-menu>
|
|
68
|
+
<lion-menuitem type="radio"> Peek Call Hierarchy </lion-menuitem>
|
|
69
|
+
<div role="separator"></div>
|
|
70
|
+
<lion-menuitem type="radio"> Peek Definition </lion-menuitem>
|
|
71
|
+
</lion-menu>
|
|
72
|
+
</lion-menuitem>
|
|
73
|
+
<div role="separator"></div>
|
|
74
|
+
<lion-menuitem type="checkbox"> Find all References </lion-menuitem>
|
|
75
|
+
</lion-menu>
|
|
76
|
+
</nav>
|
|
77
|
+
`;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Groups, menuitemradios and menuitemcheckboxes
|
|
81
|
+
|
|
82
|
+
From [wai aria menu fragment](https://www.w3.org/TR/wai-aria-practices-1.1/examples/menubar/menubar-2/menubar-2.html)
|
|
83
|
+
|
|
84
|
+
```js preview-story
|
|
85
|
+
export const groups = () => html`
|
|
86
|
+
<lion-menu bar invoker-interaction="hover">
|
|
87
|
+
<div>
|
|
88
|
+
<div role="menuitem">Font</div>
|
|
89
|
+
<lion-menu aria-label="Font">
|
|
90
|
+
<div role="menuitemradio">Sans-serif</div>
|
|
91
|
+
<div role="menuitemradio">Serif</div>
|
|
92
|
+
<div role="menuitemradio">Monospace</div>
|
|
93
|
+
<div role="menuitemradio">Fantasy</div>
|
|
94
|
+
</lion-menu>
|
|
95
|
+
</div>
|
|
96
|
+
<div>
|
|
97
|
+
<div role="menuitem">Style/Color</div>
|
|
98
|
+
<lion-menu aria-label="Style/Color">
|
|
99
|
+
<div role="menuitemcheckbox" aria-checked="true">Bold</div>
|
|
100
|
+
<div role="menuitemcheckbox" aria-checked="true">Italic</div>
|
|
101
|
+
<div role="separator"></div>
|
|
102
|
+
<div role="group" aria-label="Text Color">
|
|
103
|
+
<div role="menuitemradio" aria-checked="false">Black</div>
|
|
104
|
+
<div role="menuitemradio" aria-checked="false">Blue</div>
|
|
105
|
+
<div role="menuitemradio" aria-checked="true">Red</div>
|
|
106
|
+
<div role="menuitemradio" aria-checked="false">Green</div>
|
|
107
|
+
</div>
|
|
108
|
+
<div role="separator"></div>
|
|
109
|
+
<div role="group" aria-label="Text Decoration">
|
|
110
|
+
<div role="menuitemradio" aria-checked="true">None</div>
|
|
111
|
+
<div role="menuitemradio" aria-checked="false">Overline</div>
|
|
112
|
+
<div role="menuitemradio" aria-checked="false">Line-through</div>
|
|
113
|
+
<div role="menuitemradio" aria-checked="false">Underline</div>
|
|
114
|
+
</div>
|
|
115
|
+
</lion-menu>
|
|
116
|
+
</div>
|
|
117
|
+
</lion-menu>
|
|
118
|
+
`;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Tree
|
|
122
|
+
|
|
123
|
+
```js preview-story
|
|
124
|
+
export const tree = () => html`
|
|
125
|
+
<demo-tree>
|
|
126
|
+
<div role="treeitem">Fruits</div>
|
|
127
|
+
<demo-tree>
|
|
128
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
129
|
+
<div role="treeitem">Peek Definition</div>
|
|
130
|
+
</demo-tree>
|
|
131
|
+
<div role="treeitem">Vegetables</div>
|
|
132
|
+
<demo-tree>
|
|
133
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
134
|
+
<div>
|
|
135
|
+
<div role="treeitem">Peek</div>
|
|
136
|
+
<demo-tree>
|
|
137
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
138
|
+
<div role="treeitem">Peek Definition</div>
|
|
139
|
+
</demo-tree>
|
|
140
|
+
</div>
|
|
141
|
+
</demo-tree>
|
|
142
|
+
<div role="treeitem">Grains</div>
|
|
143
|
+
<demo-tree>
|
|
144
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
145
|
+
<div role="treeitem">Peek Definition</div>
|
|
146
|
+
</demo-tree>
|
|
147
|
+
</demo-tree>
|
|
148
|
+
`;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Disclosure menu
|
|
152
|
+
|
|
153
|
+
See <https://www.w3.org/TR/wai-aria-practices-1.1/examples/disclosure/disclosure-navigation.html>
|
|
154
|
+
|
|
155
|
+
```js preview-story
|
|
156
|
+
export const disclosureMenu = () => html`
|
|
157
|
+
<nav aria-label="Mythical University">
|
|
158
|
+
<lion-menu bar ._activeMode="${'tabbable-disclosure'}">
|
|
159
|
+
<div role="listitem">
|
|
160
|
+
<button data-invoker>About</button>
|
|
161
|
+
<lion-menu>
|
|
162
|
+
<div role="listitem">
|
|
163
|
+
<a href="/about/overview">Overview</a>
|
|
164
|
+
</div>
|
|
165
|
+
<div role="listitem">
|
|
166
|
+
<a href="/about/administration">Administration</a>
|
|
167
|
+
</div>
|
|
168
|
+
<div role="listitem">
|
|
169
|
+
<a href="/about/facts">Facts</a>
|
|
170
|
+
</div>
|
|
171
|
+
<div role="listitem">
|
|
172
|
+
<a href="/about/campus-tours">Campus Tours</a>
|
|
173
|
+
</div>
|
|
174
|
+
</lion-menu>
|
|
175
|
+
</div>
|
|
176
|
+
<div role="listitem">
|
|
177
|
+
<button data-invoker>Admissions</button>
|
|
178
|
+
<lion-menu id="id_admissions_menu">
|
|
179
|
+
<div role="listitem">
|
|
180
|
+
<a href="/admissions/apply">Apply</a>
|
|
181
|
+
</div>
|
|
182
|
+
<div role="listitem">
|
|
183
|
+
<a href="/admissions/tuition">Tuition</a>
|
|
184
|
+
</div>
|
|
185
|
+
<div role="listitem">
|
|
186
|
+
<a href="/admissions/sign-up">Sign Up</a>
|
|
187
|
+
</div>
|
|
188
|
+
<div role="listitem">
|
|
189
|
+
<a href="/admissions/visit">Visit</a>
|
|
190
|
+
</div>
|
|
191
|
+
<div role="listitem">
|
|
192
|
+
<a href="/admissions/photo-tour">Photo Tour</a>
|
|
193
|
+
</div>
|
|
194
|
+
<div role="listitem">
|
|
195
|
+
<a href="/admissions/connect">Connect</a>
|
|
196
|
+
</div>
|
|
197
|
+
</lion-menu>
|
|
198
|
+
</div>
|
|
199
|
+
<div role="listitem">
|
|
200
|
+
<button data-invoker>Academics</button>
|
|
201
|
+
<lion-menu>
|
|
202
|
+
<div role="listitem">
|
|
203
|
+
<a href="/academics/colleges-and-schools">Colleges & Schools</a>
|
|
204
|
+
</div>
|
|
205
|
+
<div role="listitem">
|
|
206
|
+
<a href="/academics/programs-of-study">Programs of Study</a>
|
|
207
|
+
</div>
|
|
208
|
+
<div role="listitem">
|
|
209
|
+
<a href="/academics/honors-programs">Honors Programs</a>
|
|
210
|
+
</div>
|
|
211
|
+
<div role="listitem">
|
|
212
|
+
<a href="/academics/online-courses">Online Courses</a>
|
|
213
|
+
</div>
|
|
214
|
+
<div role="listitem">
|
|
215
|
+
<a href="/academics/course-explorer">Course Explorer</a>
|
|
216
|
+
</div>
|
|
217
|
+
<div role="listitem">
|
|
218
|
+
<a href="/academics/register-for-class">Register for Class</a>
|
|
219
|
+
</div>
|
|
220
|
+
<div role="listitem">
|
|
221
|
+
<a href="/academics/academic-calendar">Academic Calendar</a>
|
|
222
|
+
</div>
|
|
223
|
+
<div role="listitem">
|
|
224
|
+
<a href="/academics/transcripts">Transcripts</a>
|
|
225
|
+
</div>
|
|
226
|
+
</lion-menu>
|
|
227
|
+
</div>
|
|
228
|
+
</lion-menu>
|
|
229
|
+
</nav>
|
|
230
|
+
`;
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Disclosure menu with anchors on L1
|
|
234
|
+
|
|
235
|
+
See <https://codepen.io/aardrian/pen/abyXxGw>
|
|
236
|
+
|
|
237
|
+
```js preview-story
|
|
238
|
+
export const disclosureMenuWithAnchorsOnL1 = () => html`
|
|
239
|
+
<nav aria-label="Mythical University">
|
|
240
|
+
<lion-menu bar ._activeMode="${'tabbable-disclosure'}">
|
|
241
|
+
<div role="listitem">
|
|
242
|
+
<a href="/about">About</a>
|
|
243
|
+
<button data-invoker aria-label="More About Pages">▼</button>
|
|
244
|
+
<lion-menu>
|
|
245
|
+
<div role="listitem">
|
|
246
|
+
<a href="/about/overview">Overview</a>
|
|
247
|
+
</div>
|
|
248
|
+
<div role="listitem">
|
|
249
|
+
<a href="/about/administration">Administration</a>
|
|
250
|
+
</div>
|
|
251
|
+
<div role="listitem">
|
|
252
|
+
<a href="/about/facts">Facts</a>
|
|
253
|
+
</div>
|
|
254
|
+
<div role="listitem">
|
|
255
|
+
<a href="/about/campus-tours">Campus Tours</a>
|
|
256
|
+
</div>
|
|
257
|
+
</lion-menu>
|
|
258
|
+
</div>
|
|
259
|
+
<div role="listitem">
|
|
260
|
+
<a href="/admissions">Admissions</a>
|
|
261
|
+
<button data-invoker aria-label="More Admissions Pages">
|
|
262
|
+
▼
|
|
263
|
+
</button>
|
|
264
|
+
<lion-menu id="id_admissions_menu">
|
|
265
|
+
<div role="listitem">
|
|
266
|
+
<a href="/admissions/apply">Apply</a>
|
|
267
|
+
</div>
|
|
268
|
+
<div role="listitem">
|
|
269
|
+
<a href="/admissions/tuition">Tuition</a>
|
|
270
|
+
</div>
|
|
271
|
+
<div role="listitem">
|
|
272
|
+
<a href="/admissions/sign-up">Sign Up</a>
|
|
273
|
+
</div>
|
|
274
|
+
<div role="listitem">
|
|
275
|
+
<a href="/admissions/visit">Visit</a>
|
|
276
|
+
</div>
|
|
277
|
+
<div role="listitem">
|
|
278
|
+
<a href="/admissions/photo-tour">Photo Tour</a>
|
|
279
|
+
</div>
|
|
280
|
+
<div role="listitem">
|
|
281
|
+
<a href="/admissions/connect">Connect</a>
|
|
282
|
+
</div>
|
|
283
|
+
</lion-menu>
|
|
284
|
+
</div>
|
|
285
|
+
<div role="listitem">
|
|
286
|
+
<a href="/academics">Academics</a>
|
|
287
|
+
<button data-invoker aria-label="More Academics Pages">▼</button>
|
|
288
|
+
<lion-menu>
|
|
289
|
+
<div role="listitem">
|
|
290
|
+
<a href="/academics/colleges-and-schools">Colleges & Schools</a>
|
|
291
|
+
</div>
|
|
292
|
+
<div role="listitem">
|
|
293
|
+
<a href="/academics/programs-of-study">Programs of Study</a>
|
|
294
|
+
</div>
|
|
295
|
+
<div role="listitem">
|
|
296
|
+
<a href="/academics/honors-programs">Honors Programs</a>
|
|
297
|
+
</div>
|
|
298
|
+
<div role="listitem">
|
|
299
|
+
<a href="/academics/online-courses">Online Courses</a>
|
|
300
|
+
</div>
|
|
301
|
+
<div role="listitem">
|
|
302
|
+
<a href="/academics/course-explorer">Course Explorer</a>
|
|
303
|
+
</div>
|
|
304
|
+
<div role="listitem">
|
|
305
|
+
<a href="/academics/register-for-class">Register for Class</a>
|
|
306
|
+
</div>
|
|
307
|
+
<div role="listitem">
|
|
308
|
+
<a href="/academics/academic-calendar">Academic Calendar</a>
|
|
309
|
+
</div>
|
|
310
|
+
<div role="listitem">
|
|
311
|
+
<a href="/academics/transcripts">Transcripts</a>
|
|
312
|
+
</div>
|
|
313
|
+
</lion-menu>
|
|
314
|
+
</div>
|
|
315
|
+
</ul>
|
|
316
|
+
</nav>
|
|
317
|
+
`;
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## Toolbar
|
|
321
|
+
|
|
322
|
+
From [wai aria toolbar](https://www.w3.org/TR/wai-aria-practices-1.2/examples/toolbar/toolbar.html)
|
|
323
|
+
|
|
324
|
+
```js preview-story
|
|
325
|
+
export const toolbar = () => html`
|
|
326
|
+
<demo-toolbar>
|
|
327
|
+
<div>
|
|
328
|
+
<button data-item title="bold" aria-label="Bold">
|
|
329
|
+
<span class="fas fa-bold" aria-hidden="true"></span>
|
|
330
|
+
</button>
|
|
331
|
+
<button data-item title="italic" aria-label="Italic">
|
|
332
|
+
<span class="fas fa-italic" aria-hidden="true"></span>
|
|
333
|
+
</button>
|
|
334
|
+
<button data-item title="underline" aria-label="Underline">
|
|
335
|
+
<span class="fas fa-underline" aria-hidden="true"></span>
|
|
336
|
+
</button>
|
|
337
|
+
</div>
|
|
338
|
+
<div role="separator"></div>
|
|
339
|
+
<div role="radiogroup" aria-label="Text Alignment">
|
|
340
|
+
<button data-item role="radio" aria-label="Text Align Left">
|
|
341
|
+
<span class="fas fa-align-left" aria-hidden="true"></span>
|
|
342
|
+
</button>
|
|
343
|
+
<button data-item role="radio" aria-label="Text Align Center">
|
|
344
|
+
<span class="fas fa-align-center" aria-hidden="true"></span>
|
|
345
|
+
</button>
|
|
346
|
+
<button data-item role="radio" aria-label="Text Align Right">
|
|
347
|
+
<span class="fas fa-align-right" aria-hidden="true"></span>
|
|
348
|
+
</button>
|
|
349
|
+
</div>
|
|
350
|
+
<div role="separator"></div>
|
|
351
|
+
|
|
352
|
+
<demo-spin-button data-item now="20" min="12" max="40" unit="px"></demo-spin-button>
|
|
353
|
+
<div role="separator"></div>
|
|
354
|
+
|
|
355
|
+
<div>
|
|
356
|
+
<div role="menuitem">Font</div>
|
|
357
|
+
<lion-menu aria-label="Font">
|
|
358
|
+
<div role="menuitemradio">Sans-serif</div>
|
|
359
|
+
<div role="menuitemradio">Serif</div>
|
|
360
|
+
<div role="menuitemradio">Monospace</div>
|
|
361
|
+
<div role="menuitemradio">Fantasy</div>
|
|
362
|
+
</lion-menu>
|
|
363
|
+
</div>
|
|
364
|
+
<div>
|
|
365
|
+
<div role="menuitem">Style/Color</div>
|
|
366
|
+
<lion-menu aria-label="Style/Color">
|
|
367
|
+
<div role="menuitemcheckbox" aria-checked="true">Bold</div>
|
|
368
|
+
<div role="menuitemcheckbox" aria-checked="true">Italic</div>
|
|
369
|
+
<div role="separator"></div>
|
|
370
|
+
<div role="group" aria-label="Text Color">
|
|
371
|
+
<div role="menuitemradio" aria-checked="false">Black</div>
|
|
372
|
+
<div role="menuitemradio" aria-checked="false">Blue</div>
|
|
373
|
+
<div role="menuitemradio" aria-checked="true">Red</div>
|
|
374
|
+
<div role="menuitemradio" aria-checked="false">Green</div>
|
|
375
|
+
</div>
|
|
376
|
+
<div role="separator"></div>
|
|
377
|
+
<div role="group" aria-label="Text Decoration">
|
|
378
|
+
<div role="menuitemradio" aria-checked="true">None</div>
|
|
379
|
+
<div role="menuitemradio" aria-checked="false">Overline</div>
|
|
380
|
+
<div role="menuitemradio" aria-checked="false">Line-through</div>
|
|
381
|
+
<div role="menuitemradio" aria-checked="false">Underline</div>
|
|
382
|
+
</div>
|
|
383
|
+
</lion-menu>
|
|
384
|
+
</div>
|
|
385
|
+
</demo-toolbar>
|
|
386
|
+
`;
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Tree lion-item
|
|
390
|
+
|
|
391
|
+
```js preview-story
|
|
392
|
+
export const treeItem = () => html`
|
|
393
|
+
<demo-tree>
|
|
394
|
+
<lion-item>
|
|
395
|
+
<div>Fruits</div>
|
|
396
|
+
<demo-tree>
|
|
397
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
398
|
+
<lion-item>Peek Definition</lion-item>
|
|
399
|
+
</demo-tree>
|
|
400
|
+
</lion-item>
|
|
401
|
+
<lion-item>
|
|
402
|
+
<div>Vegetables</div>
|
|
403
|
+
<demo-tree>
|
|
404
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
405
|
+
<lion-item>
|
|
406
|
+
<div>Peek</div>
|
|
407
|
+
<demo-tree>
|
|
408
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
409
|
+
<lion-item>Peek Definition</lion-item>
|
|
410
|
+
</demo-tree>
|
|
411
|
+
</lion-item>
|
|
412
|
+
</demo-tree>
|
|
413
|
+
</lion-item>
|
|
414
|
+
<lion-item>
|
|
415
|
+
<div>Grains</div>
|
|
416
|
+
<demo-tree>
|
|
417
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
418
|
+
<lion-item>Peek Definition</lion-item>
|
|
419
|
+
</demo-tree>
|
|
420
|
+
</lion-item>
|
|
421
|
+
</demo-tree>
|
|
422
|
+
`;
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
## Platform vocabulary (focusgroup)
|
|
426
|
+
|
|
427
|
+
Arrow key navigation inside a composite widget (menu, menubar, toolbar, tree, listbox) is what the
|
|
428
|
+
[focusgroup attribute](https://open-ui.org/components/focusgroup.explainer/) does on the platform
|
|
429
|
+
(Open UI; shipping in Chrome 150, not part of the HTML spec yet). This component uses the same
|
|
430
|
+
vocabulary, so an implementation that follows the platform proposal finds the same names here:
|
|
431
|
+
|
|
432
|
+
| api | focusgroup term | note |
|
|
433
|
+
| --- | --- | --- |
|
|
434
|
+
| `axis` | axis: `inline` / `block` | `'block'` (default, up/down) or `'inline'` (left/right) |
|
|
435
|
+
| `wrap` | modifier: `wrap` | arrow keys wrap around at the first/last item |
|
|
436
|
+
| `multiple` | `multiple` in `<select multiple>` | whether more than one item can be checked; selection is not part of the focusgroup api |
|
|
437
|
+
| `selectionFollowsFocus` | - | ARIA/APG vocabulary; selection is out of scope for focusgroup |
|
|
438
|
+
| `hasNoDefaultSelected` | default selected (`HTMLOptionElement.defaultSelected`) | opt-out of the automatic selection of the first item; same property and attribute as `ListboxMixin` |
|
|
439
|
+
|
|
440
|
+
```html
|
|
441
|
+
<lion-menu axis="inline" wrap>
|
|
442
|
+
<lion-menuitem>Item 1</lion-menuitem>
|
|
443
|
+
<lion-menuitem>Item 2</lion-menuitem>
|
|
444
|
+
</lion-menu>
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
The focusgroup behavior token (`menu`, `menubar`, `toolbar`, `listbox`, `tablist`, ...) is not an api
|
|
448
|
+
here: the role and active mode stay the component's own configuration (`_listRole`/`_activeMode`).
|