@lion/ui 0.18.1 → 0.20.0-menu-system.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/collapsible.js +1 -0
- package/components/button/src/LionButton.js +4 -0
- package/components/button/test-suites/LionButton.suite.js +1 -0
- package/components/calendar/src/LionCalendar.js +2 -0
- package/components/collapsible/src/DisclosureMixin.js +313 -0
- package/components/collapsible/test-suites/DisclosureMixin.suite.js +30 -0
- package/components/collapsible/types/DisclosureMixinTypes.ts +48 -0
- package/components/combobox/test/lion-combobox.test.js +1 -0
- package/components/form-core/src/form-group/FormGroupMixin.js +7 -0
- package/components/form-core/src/registration/FormRegistrarMixin.js +11 -0
- package/components/form-core/test/FormControlMixin.test.js +1 -0
- package/components/form-core/test/validate/Validator.test.js +2 -0
- package/components/form-core/test-suites/ValidateMixin.suite.js +2 -0
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +1 -0
- package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +6 -4
- package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +20 -1
- package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +24 -0
- package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -0
- package/components/input-datepicker/test/lion-input-datepicker.test.js +5 -6
- package/components/localize/test/date/formatDate.test.js +1 -0
- package/components/menu/CHANGELOG.md +37 -0
- package/components/menu/README.md +335 -0
- package/components/menu/index.js +2 -0
- package/components/menu/lion-menu-overlay.js +3 -0
- package/components/menu/lion-menu.js +3 -0
- package/components/menu/lion-spinbutton.js +3 -0
- package/components/menu/lion-toolbar.js +3 -0
- package/components/menu/lion-tree.js +3 -0
- package/components/menu/package.json +46 -0
- package/components/menu/requirements.temp.md +12 -0
- package/components/menu/src/InteractiveListMixin.js +840 -0
- package/components/menu/src/LionMenu.js +250 -0
- package/components/menu/src/LionMenuHybrid.js +46 -0
- package/components/menu/src/LionMenuOverlay.js +155 -0
- package/components/menu/src/LionSpinbutton.js +213 -0
- package/components/menu/src/LionToolbar.js +94 -0
- package/components/menu/src/LionTree.js +52 -0
- package/components/menu/src/MoreButtonMenuMixin.js +278 -0
- package/components/menu/src/MultiLevelListMixin.js +311 -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-hybrid.test.js +3 -0
- package/components/menu/test/lion-menu.test.js +11 -0
- package/components/menu/test/lion-toolbar.test.js +8 -0
- package/components/menu/test/lion-tree.test.js +7 -0
- package/components/menu/test-helpers/mimicKeyPress.js +9 -0
- package/components/menu/test-suites/InteractiveListMixin.suite.js +454 -0
- package/components/menu/test-suites/LionMenu.suite.js +113 -0
- package/components/menu/test-suites/LionMenuHybrid.suite.js +583 -0
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +372 -0
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +303 -0
- package/components/menu/types/InteractiveListMixinTypes.d.ts +84 -0
- package/components/navigation-bar/README.md +1 -0
- package/components/navigation-bar/src/LionNavigationBar.js +439 -0
- package/components/navigation-bar/src/types.js +41 -0
- package/components/overlays/NEXT.md +49 -0
- package/components/overlays/src/OverlayController.js +278 -110
- package/components/overlays/src/OverlayMixin.js +58 -11
- package/components/overlays/src/OverlaysManager.js +2 -2
- package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +100 -26
- package/components/overlays/src/utils/adopt-styles.js +3 -2
- package/components/overlays/src/utils/get-focusable-elements.js +4 -0
- package/components/overlays/src/utils/is-equal-config.js +10 -6
- package/components/overlays/test/OverlayController.test.js +127 -14
- package/components/overlays/test/utils-tests/is-equal-config.test.js +1 -1
- package/components/overlays/test/withHoverInteraction.test.js +90 -0
- package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
- package/components/overlays/types/ArrowMixinTypes.ts +3 -1
- package/components/overlays/types/OverlayConfig.ts +20 -5
- package/components/overlays/types/OverlayMixinTypes.ts +2 -0
- package/components/select-rich/test/lion-select-rich.test.js +3 -0
- package/custom-elements.json +30446 -17381
- package/dist-types/components/button/src/LionButton.d.ts +1 -0
- package/dist-types/components/button/src/LionButton.d.ts.map +1 -1
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
- package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts +3 -0
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +1 -0
- package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts +2 -0
- package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts.map +1 -0
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +24 -0
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +1 -0
- package/dist-types/components/combobox/src/LionCombobox.d.ts +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/form-group/FormGroupMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/src/registration/FormRegistrarMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
- package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts +0 -9
- package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts.map +1 -1
- package/dist-types/components/input-amount-dropdown/test/LionInputAmountDropdown.test.d.ts.map +1 -1
- package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +1 -1
- package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
- package/dist-types/components/menu/index.d.ts +3 -0
- package/dist-types/components/menu/index.d.ts.map +1 -0
- package/dist-types/components/menu/lion-menu-overlay.d.ts +2 -0
- package/dist-types/components/menu/lion-menu-overlay.d.ts.map +1 -0
- package/dist-types/components/menu/lion-menu.d.ts +2 -0
- package/dist-types/components/menu/lion-menu.d.ts.map +1 -0
- package/dist-types/components/menu/lion-spinbutton.d.ts +2 -0
- package/dist-types/components/menu/lion-spinbutton.d.ts.map +1 -0
- package/dist-types/components/menu/lion-toolbar.d.ts +2 -0
- package/dist-types/components/menu/lion-toolbar.d.ts.map +1 -0
- package/dist-types/components/menu/lion-tree.d.ts +2 -0
- package/dist-types/components/menu/lion-tree.d.ts.map +1 -0
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +617 -0
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenu.d.ts +635 -0
- package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts +19 -0
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts +1015 -0
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionSpinbutton.d.ts +58 -0
- package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionToolbar.d.ts +8 -0
- package/dist-types/components/menu/src/LionToolbar.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionTree.d.ts +447 -0
- package/dist-types/components/menu/src/LionTree.d.ts.map +1 -0
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +39 -0
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +503 -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-hybrid.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-menu-hybrid.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/lion-toolbar.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-toolbar.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/lion-tree.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-tree.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 +14 -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/LionMenuHybrid.suite.d.ts +5 -0
- package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +14 -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/navigation-bar/src/LionNavigationBar.d.ts +238 -0
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +1 -0
- package/dist-types/components/navigation-bar/src/types.d.ts +85 -0
- package/dist-types/components/navigation-bar/src/types.d.ts.map +1 -0
- package/dist-types/components/overlays/src/OverlayController.d.ts +24 -12
- 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/configurations/visibility-trigger-partials/withHoverInteraction.d.ts +8 -2
- package/dist-types/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/get-focusable-elements.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/test/withHoverInteraction.test.d.ts +2 -0
- package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts.map +1 -0
- 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 +11 -3
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- 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-overlay.d.ts +2 -0
- package/dist-types/exports/define/lion-menu-overlay.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-navigation-bar.d.ts +2 -0
- package/dist-types/exports/define/lion-navigation-bar.d.ts.map +1 -0
- package/dist-types/exports/define/lion-toolbar.d.ts +2 -0
- package/dist-types/exports/define/lion-toolbar.d.ts.map +1 -0
- package/dist-types/exports/define/lion-tree.d.ts +2 -0
- package/dist-types/exports/define/lion-tree.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 +7 -0
- package/dist-types/exports/menu.d.ts.map +1 -0
- package/dist-types/exports/navigation-bar.d.ts +2 -0
- package/dist-types/exports/navigation-bar.d.ts.map +1 -0
- package/dist-types/exports/overlays.d.ts +3 -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 +21 -8
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/api-table.md +31 -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/overview.md +3 -3
- package/docs/components/input-amount-dropdown/api-table.md +1 -1
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/api-table.md +21 -4
- 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 +460 -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/overview.md +422 -0
- package/docs/components/menu/use-cases.md +77 -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 +21 -5
- 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 +36 -11
- package/docs/components/tooltip/use-cases.md +22 -0
- package/docs/fundamentals/index.md +4 -4
- 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 +36 -34
- 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/collapsible.js +1 -0
- package/exports/define/lion-item.js +3 -0
- package/exports/define/lion-menu-overlay.js +3 -0
- package/exports/define/lion-menu.js +3 -0
- package/exports/define/lion-navigation-bar.js +3 -0
- package/exports/define/lion-toolbar.js +3 -0
- package/exports/define/lion-tree.js +3 -0
- package/exports/menu-test-suites.js +4 -0
- package/exports/menu.js +7 -0
- package/exports/navigation-bar.js +1 -0
- package/exports/overlays.js +6 -0
- package/menu-test-suites.js +4 -0
- package/menu.js +7 -0
- package/navigation-bar.js +1 -0
- package/overlays.js +6 -0
- package/package.json +1 -1
|
@@ -597,12 +597,11 @@ describe('<lion-input-datepicker>', () => {
|
|
|
597
597
|
<lion-input-datepicker label="End date" name="endDate"></lion-input-datepicker>
|
|
598
598
|
`);
|
|
599
599
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
const endLabel = elements.endDate.querySelector('button').ariaLabel;
|
|
600
|
+
const elements = el.parentElement?.children;
|
|
601
|
+
// @ts-ignore - accessing by name property
|
|
602
|
+
const startLabel = elements?.startDate?.querySelector('button')?.ariaLabel;
|
|
603
|
+
// @ts-ignore - accessing by name property
|
|
604
|
+
const endLabel = elements?.endDate?.querySelector('button')?.ariaLabel;
|
|
606
605
|
|
|
607
606
|
expect(startLabel).to.not.equal(endLabel);
|
|
608
607
|
});
|
|
@@ -210,6 +210,7 @@ describe('formatDate', () => {
|
|
|
210
210
|
locale,
|
|
211
211
|
};
|
|
212
212
|
const parsedDate = /** @type {Date} */ (parseDate('12.10.2019'));
|
|
213
|
+
// @ts-ignore - dynamic locale key access
|
|
213
214
|
expect(formatDate(parsedDate, options)).to.equal(LOCALE_FORMATTED_DATE_MAP[locale]);
|
|
214
215
|
});
|
|
215
216
|
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Allow advanced preprocessing
|
|
2
|
+
|
|
3
|
+
- Turn '1' into '01-__-____'
|
|
4
|
+
- Turn ’20’ into ’20-’, -> ’20-4’ into ’20-04’ etc…
|
|
5
|
+
|
|
6
|
+
See: https://nosir.github.io/cleave.js/(But we should enhance the UX when editing the middle of a date)So:
|
|
7
|
+
|
|
8
|
+
```js
|
|
9
|
+
/** * @returns {string | { viewValue:string, caretIndex:number } } */
|
|
10
|
+
preprocessor(viewValue, { previousViewValue = ‘’, currentCaretIndex }) {
|
|
11
|
+
const diff = viewValue.length - previousViewValue.length;
|
|
12
|
+
if (diff === -1) && !isNaN(Number(previousViewValue[currentCaretIndex]))) {
|
|
13
|
+
// don’t respond to delete actions
|
|
14
|
+
return viewValue;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let newValue = '';
|
|
18
|
+
const strippedVal = viewValue.replace('-', '');
|
|
19
|
+
let dashesPlaced = 0;
|
|
20
|
+
let newCaretIndex;
|
|
21
|
+
for (let i = 0; i < 10; i+= 1) {
|
|
22
|
+
if (i === 2 || i === 4) {
|
|
23
|
+
newValue += ‘-’;
|
|
24
|
+
dashesPlaced += 1;
|
|
25
|
+
}
|
|
26
|
+
else if (i < strippedVal.length + dashesPlaced) {
|
|
27
|
+
newValue += strippedVal[i];
|
|
28
|
+
} else {
|
|
29
|
+
newValue += ‘_’;
|
|
30
|
+
if (newCaretIndex === undefined) {
|
|
31
|
+
newCaretIndex = i;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { viewValue: newValue, caretIndex: newCaretIndex };
|
|
36
|
+
}
|
|
37
|
+
```
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# Menu
|
|
2
|
+
|
|
3
|
+
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.
|
|
4
|
+
|
|
5
|
+
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.
|
|
6
|
+
|
|
7
|
+
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 …".
|
|
8
|
+
|
|
9
|
+
> From [menu wai-aria best practices](https://www.w3.org/TR/wai-aria-practices/#menu)
|
|
10
|
+
|
|
11
|
+
```js script
|
|
12
|
+
import { html } from 'lit-html';
|
|
13
|
+
import './lion-menu.js';
|
|
14
|
+
import './lion-menu-overlay.js';
|
|
15
|
+
import './lion-tree.js';
|
|
16
|
+
import './lion-toolbar.js';
|
|
17
|
+
import './lion-spinbutton.js';
|
|
18
|
+
import { applyMenuDemoStyles } from './applyMenuDemoStyles.js';
|
|
19
|
+
|
|
20
|
+
applyMenuDemoStyles();
|
|
21
|
+
|
|
22
|
+
export default {
|
|
23
|
+
title: 'Navigation/Menu',
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```js preview-story
|
|
28
|
+
export const menuButton = () => html`
|
|
29
|
+
<nav>
|
|
30
|
+
<button data-invoker>Open menu</button>
|
|
31
|
+
<lion-menu>
|
|
32
|
+
<div role="menuitem">Go to Definition</div>
|
|
33
|
+
<div role="menuitem">Go to Type Definition</div>
|
|
34
|
+
<div>
|
|
35
|
+
<div role="menuitem" data-invoker>Peek</div>
|
|
36
|
+
<lion-menu>
|
|
37
|
+
<div role="menuitem">Peek Call Hierarchy</div>
|
|
38
|
+
<div role="separator"></div>
|
|
39
|
+
<div role="menuitem">Peek Definition</div>
|
|
40
|
+
</lion-menu>
|
|
41
|
+
</div>
|
|
42
|
+
<div role="separator"></div>
|
|
43
|
+
<div role="menuitem">Find all References</div>
|
|
44
|
+
</lion-menu>
|
|
45
|
+
</nav>
|
|
46
|
+
`;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```js preview-story
|
|
50
|
+
export const menuButtonZ = () => html`
|
|
51
|
+
<nav>
|
|
52
|
+
<button data-invoker for="menu">Open menu</button>
|
|
53
|
+
<lion-menu id="menu">
|
|
54
|
+
<lion-menuitem> Go to Definition </lion-menuitem>
|
|
55
|
+
<lion-menuitem> Go to Type Definition </lion-menuitem>
|
|
56
|
+
<lion-menuitem>
|
|
57
|
+
<button slot="invoker">Peek</button>
|
|
58
|
+
<lion-menu>
|
|
59
|
+
<lion-menuitem type="radio"> Peek Call Hierarchy </lion-menuitem>
|
|
60
|
+
<div role="separator"></div>
|
|
61
|
+
<lion-menuitem type="radio"> Peek Definition </lion-menuitem>
|
|
62
|
+
</lion-menu>
|
|
63
|
+
</lion-menuitem>
|
|
64
|
+
<div role="separator"></div>
|
|
65
|
+
<lion-menuitem type="checkbox"> Find all References </lion-menuitem>
|
|
66
|
+
</lion-menu>
|
|
67
|
+
</nav>
|
|
68
|
+
`;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Groups, menuitemradios and menuitemcheckboxes
|
|
72
|
+
|
|
73
|
+
From [wai aria menu fragment](https://www.w3.org/TR/wai-aria-practices-1.1/examples/menubar/menubar-2/menubar-2.html)
|
|
74
|
+
|
|
75
|
+
```js preview-story
|
|
76
|
+
export const groups = () => html`
|
|
77
|
+
<lion-menu bar invoker-interaction="hover">
|
|
78
|
+
<div>
|
|
79
|
+
<div role="menuitem">Font</div>
|
|
80
|
+
<lion-menu-overlay aria-label="Font">
|
|
81
|
+
<div role="menuitemradio">Sans-serif</div>
|
|
82
|
+
<div role="menuitemradio">Serif</div>
|
|
83
|
+
<div role="menuitemradio">Monospace</div>
|
|
84
|
+
<div role="menuitemradio">Fantasy</div>
|
|
85
|
+
</lion-menu-overlay>
|
|
86
|
+
</div>
|
|
87
|
+
<div>
|
|
88
|
+
<div role="menuitem">Style/Color</div>
|
|
89
|
+
<lion-menu-overlay aria-label="Style/Color">
|
|
90
|
+
<div role="menuitemcheckbox" aria-checked="true">Bold</div>
|
|
91
|
+
<div role="menuitemcheckbox" aria-checked="true">Italic</div>
|
|
92
|
+
<div role="separator"></div>
|
|
93
|
+
<div role="group" aria-label="Text Color">
|
|
94
|
+
<div role="menuitemradio" aria-checked="false">Black</div>
|
|
95
|
+
<div role="menuitemradio" aria-checked="false">Blue</div>
|
|
96
|
+
<div role="menuitemradio" aria-checked="true">Red</div>
|
|
97
|
+
<div role="menuitemradio" aria-checked="false">Green</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div role="separator"></div>
|
|
100
|
+
<div role="group" aria-label="Text Decoration">
|
|
101
|
+
<div role="menuitemradio" aria-checked="true">None</div>
|
|
102
|
+
<div role="menuitemradio" aria-checked="false">Overline</div>
|
|
103
|
+
<div role="menuitemradio" aria-checked="false">Line-through</div>
|
|
104
|
+
<div role="menuitemradio" aria-checked="false">Underline</div>
|
|
105
|
+
</div>
|
|
106
|
+
</lion-menu-overlay>
|
|
107
|
+
</div>
|
|
108
|
+
</lion-menu>
|
|
109
|
+
`;
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Tree
|
|
113
|
+
|
|
114
|
+
```js preview-story
|
|
115
|
+
export const tree = () => html`
|
|
116
|
+
<lion-tree>
|
|
117
|
+
<div>
|
|
118
|
+
<div role="treeitem">Fruits</div>
|
|
119
|
+
<lion-tree>
|
|
120
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
121
|
+
<div role="treeitem">Peek Definition</div>
|
|
122
|
+
</lion-tree>
|
|
123
|
+
</div>
|
|
124
|
+
<div>
|
|
125
|
+
<div role="treeitem">Vegetables</div>
|
|
126
|
+
<lion-tree>
|
|
127
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
128
|
+
<div>
|
|
129
|
+
<div role="treeitem">Peek</div>
|
|
130
|
+
<lion-tree>
|
|
131
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
132
|
+
<div role="treeitem">Peek Definition</div>
|
|
133
|
+
</lion-tree>
|
|
134
|
+
</div>
|
|
135
|
+
</lion-tree>
|
|
136
|
+
</div>
|
|
137
|
+
<div>
|
|
138
|
+
<div role="treeitem">Grains</div>
|
|
139
|
+
<lion-tree>
|
|
140
|
+
<div role="treeitem">Peek Call Hierarchy</div>
|
|
141
|
+
<div role="treeitem">Peek Definition</div>
|
|
142
|
+
</lion-tree>
|
|
143
|
+
</div>
|
|
144
|
+
</lion-tree>
|
|
145
|
+
`;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Disclosure menu
|
|
149
|
+
|
|
150
|
+
See [disclosure navigation](https://www.w3.org/TR/wai-aria-practices-1.1/examples/disclosure/disclosure-navigation.html)
|
|
151
|
+
|
|
152
|
+
```js preview-story
|
|
153
|
+
export const disclosureMenu = () => html`
|
|
154
|
+
<nav aria-label="Mythical University">
|
|
155
|
+
<lion-menu bar>
|
|
156
|
+
<div role="listitem">
|
|
157
|
+
<button data-invoker>About</button>
|
|
158
|
+
<lion-menu>
|
|
159
|
+
<div role="listitem">
|
|
160
|
+
<a href="#mythical-page-content">Overview</a>
|
|
161
|
+
</div>
|
|
162
|
+
<div role="listitem">
|
|
163
|
+
<a href="#mythical-page-content">Administration</a>
|
|
164
|
+
</div>
|
|
165
|
+
<div role="listitem">
|
|
166
|
+
<a href="#mythical-page-content">Facts</a>
|
|
167
|
+
</div>
|
|
168
|
+
<div role="listitem">
|
|
169
|
+
<a href="#mythical-page-content">Campus Tours</a>
|
|
170
|
+
</div>
|
|
171
|
+
</ul>
|
|
172
|
+
</div>
|
|
173
|
+
<div role="listitem">
|
|
174
|
+
<button data-invoker>
|
|
175
|
+
Admissions
|
|
176
|
+
</button>
|
|
177
|
+
<lion-menu id="id_admissions_menu">
|
|
178
|
+
<div role="listitem">
|
|
179
|
+
<a href="#mythical-page-content">Apply</a>
|
|
180
|
+
</div>
|
|
181
|
+
<div role="listitem">
|
|
182
|
+
<a href="#mythical-page-content">Tuition</a>
|
|
183
|
+
</div>
|
|
184
|
+
<div role="listitem">
|
|
185
|
+
<a href="#mythical-page-content">Sign Up</a>
|
|
186
|
+
</div>
|
|
187
|
+
<div role="listitem">
|
|
188
|
+
<a href="#mythical-page-content">Visit</a>
|
|
189
|
+
</div>
|
|
190
|
+
<div role="listitem">
|
|
191
|
+
<a href="#mythical-page-content">Photo Tour</a>
|
|
192
|
+
</div>
|
|
193
|
+
<div role="listitem">
|
|
194
|
+
<a href="#mythical-page-content">Connect</a>
|
|
195
|
+
</div>
|
|
196
|
+
</ul>
|
|
197
|
+
</div>
|
|
198
|
+
<div role="listitem">
|
|
199
|
+
<button data-invoker>Academics</button>
|
|
200
|
+
<lion-menu>
|
|
201
|
+
<div role="listitem">
|
|
202
|
+
<a href="#mythical-page-content">Colleges & Schools</a>
|
|
203
|
+
</div>
|
|
204
|
+
<div role="listitem">
|
|
205
|
+
<a href="#mythical-page-content">Programs of Study</a>
|
|
206
|
+
</div>
|
|
207
|
+
<div role="listitem">
|
|
208
|
+
<a href="#mythical-page-content">Honors Programs</a>
|
|
209
|
+
</div>
|
|
210
|
+
<div role="listitem">
|
|
211
|
+
<a href="#mythical-page-content">Online Courses</a>
|
|
212
|
+
</div>
|
|
213
|
+
<div role="listitem">
|
|
214
|
+
<a href="#mythical-page-content">Course Explorer</a>
|
|
215
|
+
</div>
|
|
216
|
+
<div role="listitem">
|
|
217
|
+
<a href="#mythical-page-content">Register for Class</a>
|
|
218
|
+
</div>
|
|
219
|
+
<div role="listitem">
|
|
220
|
+
<a href="#mythical-page-content">Academic Calendar</a>
|
|
221
|
+
</div>
|
|
222
|
+
<div role="listitem">
|
|
223
|
+
<a href="#mythical-page-content">Transcripts</a>
|
|
224
|
+
</div>
|
|
225
|
+
</ul>
|
|
226
|
+
</div>
|
|
227
|
+
</ul>
|
|
228
|
+
</nav>
|
|
229
|
+
`;
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Toolbar
|
|
233
|
+
|
|
234
|
+
From [wai aria toolbar](https://www.w3.org/TR/wai-aria-practices-1.2/examples/toolbar/toolbar.html)
|
|
235
|
+
|
|
236
|
+
```js preview-story
|
|
237
|
+
export const toolbar = () => html`
|
|
238
|
+
<lion-toolbar>
|
|
239
|
+
<div>
|
|
240
|
+
<button data-item title="bold" aria-label="Bold">
|
|
241
|
+
<span class="fas fa-bold" aria-hidden="true"></span>
|
|
242
|
+
</button>
|
|
243
|
+
<button data-item title="italic" aria-label="Italic">
|
|
244
|
+
<span class="fas fa-italic" aria-hidden="true"></span>
|
|
245
|
+
</button>
|
|
246
|
+
<button data-item title="underline" aria-label="Underline">
|
|
247
|
+
<span class="fas fa-underline" aria-hidden="true"></span>
|
|
248
|
+
</button>
|
|
249
|
+
</div>
|
|
250
|
+
<div role="separator"></div>
|
|
251
|
+
<div role="radiogroup" aria-label="Text Alignment">
|
|
252
|
+
<button data-item role="radio" aria-label="Text Align Left">
|
|
253
|
+
<span class="fas fa-align-left" aria-hidden="true"></span>
|
|
254
|
+
</button>
|
|
255
|
+
<button data-item role="radio" aria-label="Text Align Center">
|
|
256
|
+
<span class="fas fa-align-center" aria-hidden="true"></span>
|
|
257
|
+
</button>
|
|
258
|
+
<button data-item role="radio" aria-label="Text Align Right">
|
|
259
|
+
<span class="fas fa-align-right" aria-hidden="true"></span>
|
|
260
|
+
</button>
|
|
261
|
+
</div>
|
|
262
|
+
<div role="separator"></div>
|
|
263
|
+
|
|
264
|
+
<lion-spinbutton data-item now="20" min="12" max="40" unit="px"></lion-spinbutton>
|
|
265
|
+
<div role="separator"></div>
|
|
266
|
+
|
|
267
|
+
<div>
|
|
268
|
+
<div role="menuitem">Font</div>
|
|
269
|
+
<lion-menu-overlay aria-label="Font">
|
|
270
|
+
<div role="menuitemradio">Sans-serif</div>
|
|
271
|
+
<div role="menuitemradio">Serif</div>
|
|
272
|
+
<div role="menuitemradio">Monospace</div>
|
|
273
|
+
<div role="menuitemradio">Fantasy</div>
|
|
274
|
+
</lion-menu-overlay>
|
|
275
|
+
</div>
|
|
276
|
+
<div>
|
|
277
|
+
<div role="menuitem">Style/Color</div>
|
|
278
|
+
<lion-menu-overlay aria-label="Style/Color">
|
|
279
|
+
<div role="menuitemcheckbox" aria-checked="true">Bold</div>
|
|
280
|
+
<div role="menuitemcheckbox" aria-checked="true">Italic</div>
|
|
281
|
+
<div role="separator"></div>
|
|
282
|
+
<div role="group" aria-label="Text Color">
|
|
283
|
+
<div role="menuitemradio" aria-checked="false">Black</div>
|
|
284
|
+
<div role="menuitemradio" aria-checked="false">Blue</div>
|
|
285
|
+
<div role="menuitemradio" aria-checked="true">Red</div>
|
|
286
|
+
<div role="menuitemradio" aria-checked="false">Green</div>
|
|
287
|
+
</div>
|
|
288
|
+
<div role="separator"></div>
|
|
289
|
+
<div role="group" aria-label="Text Decoration">
|
|
290
|
+
<div role="menuitemradio" aria-checked="true">None</div>
|
|
291
|
+
<div role="menuitemradio" aria-checked="false">Overline</div>
|
|
292
|
+
<div role="menuitemradio" aria-checked="false">Line-through</div>
|
|
293
|
+
<div role="menuitemradio" aria-checked="false">Underline</div>
|
|
294
|
+
</div>
|
|
295
|
+
</lion-menu-overlay>
|
|
296
|
+
</div>
|
|
297
|
+
</lion-toolbar>
|
|
298
|
+
`;
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Tree lion-item
|
|
302
|
+
|
|
303
|
+
```js preview-storyb
|
|
304
|
+
export const tree = () => html`
|
|
305
|
+
<lion-tree>
|
|
306
|
+
<lion-item>
|
|
307
|
+
<div>Fruits</div>
|
|
308
|
+
<lion-tree>
|
|
309
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
310
|
+
<lion-item>Peek Definition</lion-item>
|
|
311
|
+
</lion-tree>
|
|
312
|
+
</lion-item>
|
|
313
|
+
<lion-item>
|
|
314
|
+
<div>Vegetables</div>
|
|
315
|
+
<lion-tree>
|
|
316
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
317
|
+
<lion-item>
|
|
318
|
+
<div>Peek</div>
|
|
319
|
+
<lion-tree>
|
|
320
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
321
|
+
<lion-item>Peek Definition</lion-item>
|
|
322
|
+
</lion-tree>
|
|
323
|
+
</lion-item>
|
|
324
|
+
</lion-tree>
|
|
325
|
+
</lion-item>
|
|
326
|
+
<lion-item>
|
|
327
|
+
<div>Grains</div>
|
|
328
|
+
<lion-tree>
|
|
329
|
+
<lion-item>Peek Call Hierarchy</lion-item>
|
|
330
|
+
<lion-item>Peek Definition</lion-item>
|
|
331
|
+
</lion-tree>
|
|
332
|
+
</lion-item>
|
|
333
|
+
</lion-tree>
|
|
334
|
+
`;
|
|
335
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lion/menu",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "A menu is a widget that offers a list of choices to the user, such as a set of actions or functions",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "ing-bank",
|
|
7
|
+
"homepage": "https://github.com/ing-bank/lion/",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/ing-bank/lion.git",
|
|
11
|
+
"directory": "packages/menu"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "index.js",
|
|
15
|
+
"module": "index.js",
|
|
16
|
+
"files": [
|
|
17
|
+
"*.d.ts",
|
|
18
|
+
"*.js",
|
|
19
|
+
"docs",
|
|
20
|
+
"src",
|
|
21
|
+
"test",
|
|
22
|
+
"test-suites",
|
|
23
|
+
"translations",
|
|
24
|
+
"types"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"prepublishOnly": "../../scripts/npm-prepublish.js",
|
|
28
|
+
"test": "cd ../../ && yarn test:browser --grep \"packages/menu/test/**/*.test.js\"",
|
|
29
|
+
"test:watch": "cd ../../ && yarn test:browser:watch --grep \"packages/menu/test/**/*.test.js\""
|
|
30
|
+
},
|
|
31
|
+
"sideEffects": [
|
|
32
|
+
"lion-menu.js"
|
|
33
|
+
],
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@lion/core": "0.11.0",
|
|
36
|
+
"@lion/form-core": "0.6.0"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"lion",
|
|
40
|
+
"menu",
|
|
41
|
+
"web-components"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## Menu
|
|
2
|
+
|
|
3
|
+
### Assumptions
|
|
4
|
+
|
|
5
|
+
1. Menus are not always overlays (same holds for selects and comboboxes).Although often an overlay, a menu can be defined in the document flow as well: - a menu inside a left dialog sheet/ sidebar - a combobox like: <https://lion-web-components.netlify.app/?path=/docs/forms-combobox-extensions--whatsapp>Concretely, this means that the disclosure
|
|
6
|
+
|
|
7
|
+
2. The api for a menu should follow platform and community standards as closely as possible- for instance: dialog / details / new popup spec (invoker is sibling of collapsible menu)
|
|
8
|
+
|
|
9
|
+
3. It should be possible to add ‘lightweight’ menu items (like a div with [role=menuitemradio] or [role=separator])
|
|
10
|
+
|
|
11
|
+
4. We want to reuse existing interaction patterns for all ‘’interactive lists’ (horizontal and vertical): listbox/select/combobox/menu/toolbar/tree
|
|
12
|
+
- Deprecated menu spec (with the exception that menu items should always allow html (avoid label and icon attrs)
|