@lion/ui 0.19.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 +3 -1
- package/components/calendar/test/lion-calendar.test.js +47 -67
- 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-datepicker/src/localizeNamespaceLoader.js +1 -0
- package/components/input-datepicker/test/lion-input-datepicker.test.js +9 -19
- package/components/input-email/src/LionInputEmail.js +0 -2
- package/components/input-email/test/lion-input-email.test.js +0 -6
- package/components/input-file/src/validators.js +1 -31
- package/components/input-file/test/FileValidators.test.js +0 -31
- package/components/input-file/translations/bg.js +0 -1
- package/components/input-file/translations/cs.js +0 -1
- package/components/input-file/translations/de.js +0 -2
- package/components/input-file/translations/en.js +0 -1
- package/components/input-file/translations/es.js +0 -1
- package/components/input-file/translations/fr.js +0 -1
- package/components/input-file/translations/hu.js +0 -1
- package/components/input-file/translations/id.js +0 -1
- package/components/input-file/translations/it.js +0 -1
- package/components/input-file/translations/nl.js +0 -1
- package/components/input-file/translations/pl.js +0 -1
- package/components/input-file/translations/ro.js +0 -1
- package/components/input-file/translations/ru.js +0 -1
- package/components/input-file/translations/sk.js +0 -1
- package/components/input-file/translations/uk.js +0 -1
- package/components/input-file/translations/zh.js +0 -1
- package/components/input-tel/src/LionInputTel.js +1 -1
- package/components/input-tel/test-suites/LionInputTel.suite.js +0 -7
- 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 +9 -41
- 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 +0 -28
- 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 +30458 -17734
- 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/calendar/test/lion-calendar.test.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-datepicker/src/LionInputDatepicker.d.ts +1 -1
- package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts.map +1 -1
- package/dist-types/components/input-email/src/LionInputEmail.d.ts.map +1 -1
- package/dist-types/components/input-file/src/validators.d.ts +0 -11
- package/dist-types/components/input-file/src/validators.d.ts.map +1 -1
- package/dist-types/components/input-file/translations/bg-BG.d.ts +0 -1
- package/dist-types/components/input-file/translations/bg.d.ts +0 -1
- package/dist-types/components/input-file/translations/cs-CZ.d.ts +0 -1
- package/dist-types/components/input-file/translations/cs.d.ts +0 -1
- package/dist-types/components/input-file/translations/de-DE.d.ts +0 -1
- package/dist-types/components/input-file/translations/de.d.ts +0 -1
- package/dist-types/components/input-file/translations/en-AU.d.ts +0 -1
- package/dist-types/components/input-file/translations/en-GB.d.ts +0 -1
- package/dist-types/components/input-file/translations/en-PH.d.ts +0 -1
- package/dist-types/components/input-file/translations/en-US.d.ts +0 -1
- package/dist-types/components/input-file/translations/en.d.ts +0 -1
- package/dist-types/components/input-file/translations/es-ES.d.ts +0 -1
- package/dist-types/components/input-file/translations/es.d.ts +0 -1
- package/dist-types/components/input-file/translations/fr-BE.d.ts +0 -1
- package/dist-types/components/input-file/translations/fr-FR.d.ts +0 -1
- package/dist-types/components/input-file/translations/fr.d.ts +0 -1
- package/dist-types/components/input-file/translations/hu-HU.d.ts +0 -1
- package/dist-types/components/input-file/translations/hu.d.ts +0 -1
- package/dist-types/components/input-file/translations/id-ID.d.ts +0 -1
- package/dist-types/components/input-file/translations/id.d.ts +0 -1
- package/dist-types/components/input-file/translations/it-IT.d.ts +0 -1
- package/dist-types/components/input-file/translations/it.d.ts +0 -1
- package/dist-types/components/input-file/translations/nl-BE.d.ts +0 -1
- package/dist-types/components/input-file/translations/nl-NL.d.ts +0 -1
- package/dist-types/components/input-file/translations/nl.d.ts +0 -1
- package/dist-types/components/input-file/translations/pl-PL.d.ts +0 -1
- package/dist-types/components/input-file/translations/pl.d.ts +0 -1
- package/dist-types/components/input-file/translations/ro-RO.d.ts +0 -1
- package/dist-types/components/input-file/translations/ro.d.ts +0 -1
- package/dist-types/components/input-file/translations/ru-RU.d.ts +0 -1
- package/dist-types/components/input-file/translations/ru.d.ts +0 -1
- package/dist-types/components/input-file/translations/sk-SK.d.ts +0 -1
- package/dist-types/components/input-file/translations/sk.d.ts +0 -1
- package/dist-types/components/input-file/translations/uk-UA.d.ts +0 -1
- package/dist-types/components/input-file/translations/uk.d.ts +0 -1
- package/dist-types/components/input-file/translations/zh-CN.d.ts +0 -1
- package/dist-types/components/input-file/translations/zh.d.ts +0 -1
- package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
- package/dist-types/components/input-tel/test-suites/LionInputTel.suite.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.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/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/input-file.d.ts +1 -1
- 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-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/api-table.md +1 -1
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-file/use-cases.md +0 -18
- 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/api-table.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/api-table.md +1 -1
- 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 +1 -34
- 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/input-file.js +1 -5
- 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/input-file.js +1 -5
- 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 +2 -2
- package/components/calendar/test-suites/LionCalendar.suite.js +0 -79
- package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +0 -35
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts +0 -5
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts.map +0 -1
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts +0 -7
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts.map +0 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Constructor } from '@open-wc/dedupe-mixin';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
import { SlotHost } from '../../core/types/SlotMixinTypes.js';
|
|
4
|
+
import { DisabledHost } from '../../core/types/DisabledMixinTypes.js';
|
|
5
|
+
|
|
6
|
+
export type InteractiveListItemRole =
|
|
7
|
+
| 'menuitem'
|
|
8
|
+
| 'menuitemcheckbox'
|
|
9
|
+
| 'menuitemradio'
|
|
10
|
+
| 'option'
|
|
11
|
+
| 'treeitem'
|
|
12
|
+
| 'radio'
|
|
13
|
+
| 'checkbox';
|
|
14
|
+
|
|
15
|
+
export declare class InteractiveListHost {
|
|
16
|
+
/**
|
|
17
|
+
* When true, will synchronize activedescendant and selected element on
|
|
18
|
+
* arrow key navigation.
|
|
19
|
+
* This behavior can usually be seen on <select> on the Windows platform.
|
|
20
|
+
* Note that this behavior cannot be used when multiple-choice is true.
|
|
21
|
+
* See: https://www.w3.org/TR/wai-aria-practices/#kbd_selection_follows_focus
|
|
22
|
+
*/
|
|
23
|
+
public selectionFollowsFocus: Boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Will give first option active state when navigated to the next option from
|
|
26
|
+
* last option.
|
|
27
|
+
*/
|
|
28
|
+
public rotateKeyboardNavigation: Boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Informs screen reader and affects keyboard navigation.
|
|
31
|
+
* By default 'vertical'
|
|
32
|
+
*/
|
|
33
|
+
public orientation: 'vertical' | 'horizontal';
|
|
34
|
+
|
|
35
|
+
public hasNoDefaultSelected: boolean;
|
|
36
|
+
|
|
37
|
+
public singleOption: boolean;
|
|
38
|
+
|
|
39
|
+
public checkedIndex: number | number[];
|
|
40
|
+
|
|
41
|
+
public activeIndex: number;
|
|
42
|
+
|
|
43
|
+
public listItems: HTMLElement[];
|
|
44
|
+
|
|
45
|
+
public setCheckedIndex(index: number): void;
|
|
46
|
+
|
|
47
|
+
protected _scrollTargetNode: HTMLElement;
|
|
48
|
+
|
|
49
|
+
protected _invokerNode: HTMLElement;
|
|
50
|
+
|
|
51
|
+
protected _listNode: HTMLElement;
|
|
52
|
+
|
|
53
|
+
// private __setupListboxNode(): void;
|
|
54
|
+
|
|
55
|
+
protected _getPreviousEnabledOption(currentIndex: number, offset?: number): number;
|
|
56
|
+
|
|
57
|
+
protected _getNextEnabledOption(currentIndex: number, offset?: number): number;
|
|
58
|
+
|
|
59
|
+
protected _onListKeyDown(ev: KeyboardEvent): void;
|
|
60
|
+
|
|
61
|
+
protected _onListKeyUp(ev: KeyboardEvent): void;
|
|
62
|
+
|
|
63
|
+
// protected _setupListboxNode(): void;
|
|
64
|
+
|
|
65
|
+
// protected _teardownListboxNode(): void;
|
|
66
|
+
|
|
67
|
+
protected _onListClick(ev: MouseEvent): void;
|
|
68
|
+
|
|
69
|
+
// protected _setupListboxInteractions(): void;
|
|
70
|
+
|
|
71
|
+
// protected _onChildActiveChanged(ev: Event): void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export declare function InteractiveListHostImplementation<T extends Constructor<LitElement>>(
|
|
75
|
+
superclass: T,
|
|
76
|
+
): T &
|
|
77
|
+
Constructor<InteractiveListHost> &
|
|
78
|
+
InteractiveListHost &
|
|
79
|
+
Constructor<DisabledHost> &
|
|
80
|
+
typeof DisabledHost &
|
|
81
|
+
Constructor<SlotHost> &
|
|
82
|
+
typeof SlotHost;
|
|
83
|
+
|
|
84
|
+
export type InteractiveListMixin = typeof InteractiveListHostImplementation;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
N.B. api is very very beta
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/* eslint-disable class-methods-use-this */
|
|
3
|
+
import { LitElement, html, css, nothing } from 'lit';
|
|
4
|
+
import { LionMenuHybrid } from '@lion/ui/menu.js';
|
|
5
|
+
import { ScopedElementsMixin } from '../../core/src/ScopedElementsMixin.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {import('./types.js').NavBarResponsiveMode} NavBarResponsiveMode
|
|
9
|
+
* @typedef {import('./types.js').MenuItem} MenuItem
|
|
10
|
+
* @typedef {import('./types.js').CtaLink} CtaLink
|
|
11
|
+
* @typedef {import('./types.js').Logo} Logo
|
|
12
|
+
* @typedef {import('./types.js').LevelConfig} LevelConfig
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export class LionNavigationBar extends ScopedElementsMixin(LitElement) {
|
|
16
|
+
static get properties() {
|
|
17
|
+
return {
|
|
18
|
+
responsiveMode: { type: String, reflect: true, attribute: 'responsive-mode' },
|
|
19
|
+
// logo: { type: String },
|
|
20
|
+
menuItems: { type: Array },
|
|
21
|
+
menuSupportItems: { type: Array },
|
|
22
|
+
ctaPrimary: { type: Object },
|
|
23
|
+
ctaSecondary: { type: Object },
|
|
24
|
+
suggestions: { type: Array },
|
|
25
|
+
showOnMobile: { type: Array, attribute: 'show-on-mobile', reflect: true },
|
|
26
|
+
|
|
27
|
+
_levelCfg: { state: true },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static get scopedElements() {
|
|
32
|
+
return {
|
|
33
|
+
// 'lion-menu-overlay': LionMenuOverlay,
|
|
34
|
+
'lion-menu-hybrid': LionMenuHybrid,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static get styles() {
|
|
39
|
+
return [
|
|
40
|
+
css`
|
|
41
|
+
/** specific styles */
|
|
42
|
+
|
|
43
|
+
:host([responsive-mode='desktop']) [data-has-full-width-flyout] > [slot='list'] {
|
|
44
|
+
/** make sure that we give the right styles */
|
|
45
|
+
position: relative;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:host([responsive-mode='desktop'])
|
|
49
|
+
[data-has-full-width-flyout]
|
|
50
|
+
> [slot='list']
|
|
51
|
+
[level='2']
|
|
52
|
+
> [slot='list'] {
|
|
53
|
+
position: absolute;
|
|
54
|
+
width: 100%;
|
|
55
|
+
left: 0;
|
|
56
|
+
right: 0;
|
|
57
|
+
min-height: 300px;
|
|
58
|
+
padding: 1em;
|
|
59
|
+
background-color: white;
|
|
60
|
+
border: 1px solid gray;
|
|
61
|
+
box-sizing: border-box;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
:host([responsive-mode='desktop']) [level='3'] > [slot='list'] {
|
|
65
|
+
position: absolute;
|
|
66
|
+
left: 33.333%;
|
|
67
|
+
width: 33.333%;
|
|
68
|
+
top: 0;
|
|
69
|
+
padding: 1em;
|
|
70
|
+
background-color: white;
|
|
71
|
+
box-sizing: border-box;
|
|
72
|
+
height: 100%;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
:host([responsive-mode='mobile']) nav {
|
|
76
|
+
border: 1px solid black;
|
|
77
|
+
display: block;
|
|
78
|
+
position: fixed;
|
|
79
|
+
top: 0;
|
|
80
|
+
bottom: 0;
|
|
81
|
+
right: 0;
|
|
82
|
+
min-width: 500px;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
:host([responsive-mode='mobile']) [level][opened] > [slot='list'] {
|
|
86
|
+
left: 0;
|
|
87
|
+
width: 100%;
|
|
88
|
+
top: 0;
|
|
89
|
+
box-sizing: border-box;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
:host([responsive-mode='mobile']) [slot='list'] {
|
|
93
|
+
position: relative;
|
|
94
|
+
padding: 1em;
|
|
95
|
+
background-color: white;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
:host([responsive-mode='mobile']) [level='2'] > [slot='list'],
|
|
99
|
+
:host([responsive-mode='mobile']) [level='3'] > [slot='list'] {
|
|
100
|
+
position: absolute;
|
|
101
|
+
left: 100%;
|
|
102
|
+
top: 0;
|
|
103
|
+
box-sizing: border-box;
|
|
104
|
+
padding-bottom: 200%;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* TODO remove it. Use it now for testing More button feature
|
|
109
|
+
*/
|
|
110
|
+
:host([responsive-mode='desktop']) [level='1'] > [slot='list'] > [role='listitem'],
|
|
111
|
+
:host([responsive-mode='desktop'])
|
|
112
|
+
[level='1']
|
|
113
|
+
> [slot='list']
|
|
114
|
+
> [data-more-button-wrapper] {
|
|
115
|
+
margin-right: 180px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:host([responsive-mode='mobile']) nav {
|
|
119
|
+
display: flex;
|
|
120
|
+
flex-direction: column;
|
|
121
|
+
/* height: 100%;
|
|
122
|
+
justify-content: space-between; */
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* :host([responsive-mode='mobile']) .cta-items {
|
|
126
|
+
position: absolute;
|
|
127
|
+
bottom: 0;
|
|
128
|
+
width: 100%;
|
|
129
|
+
padding: 1em;
|
|
130
|
+
background-color: white;
|
|
131
|
+
box-sizing: border-box;
|
|
132
|
+
} */
|
|
133
|
+
|
|
134
|
+
:host([responsive-mode='mobile']) .logo-and-close {
|
|
135
|
+
padding: 1em;
|
|
136
|
+
}
|
|
137
|
+
`,
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
constructor() {
|
|
142
|
+
super();
|
|
143
|
+
|
|
144
|
+
/** @type {Logo} */
|
|
145
|
+
this.logo = { type: 'ing', alt: 'ING homepage', href: '/' };
|
|
146
|
+
/** @type {MenuItem[]} */
|
|
147
|
+
this.menuSupportItems = [];
|
|
148
|
+
// /**
|
|
149
|
+
// * @type {string[]}
|
|
150
|
+
// * @description Choose which items to show on mobile when in default mode, maximum of two. Possible values: 'search', 'ctaPrimary', 'ctaSecondary', 'avatarMenu'
|
|
151
|
+
// */
|
|
152
|
+
// this.showOnMobile = [];
|
|
153
|
+
/**
|
|
154
|
+
* @type {CtaLink}
|
|
155
|
+
*/
|
|
156
|
+
// @ts-ignore
|
|
157
|
+
this.ctaPrimary = {};
|
|
158
|
+
/**
|
|
159
|
+
* @type {CtaLink}
|
|
160
|
+
*/
|
|
161
|
+
// @ts-ignore
|
|
162
|
+
this.ctaSecondary = {};
|
|
163
|
+
/** @type {MenuItem[]} */
|
|
164
|
+
this.menuItems = [];
|
|
165
|
+
// /** @type {Boolean} */
|
|
166
|
+
// this.searchDisabled = false;
|
|
167
|
+
this.breakpointMin = 1400; // force desktop
|
|
168
|
+
/** @type {string[]} */
|
|
169
|
+
this.suggestions = [];
|
|
170
|
+
|
|
171
|
+
this.prefilledSuggestion = '';
|
|
172
|
+
|
|
173
|
+
const mql = window.matchMedia(`(width <= ${this.breakpointMin}px)`);
|
|
174
|
+
/** @type {NavBarResponsiveMode} */
|
|
175
|
+
this.responsiveMode = mql.matches ? 'mobile' : 'desktop';
|
|
176
|
+
this._levelCfg = this._getLevelCfg(this.responsiveMode);
|
|
177
|
+
this._levelSecondaryCfg = this._getSecondaryLevelCfg(this.responsiveMode);
|
|
178
|
+
|
|
179
|
+
mql.addEventListener('change', () => {
|
|
180
|
+
this.responsiveMode = mql.matches ? 'mobile' : 'desktop';
|
|
181
|
+
this._levelCfg = this._getLevelCfg(this.responsiveMode);
|
|
182
|
+
this._levelSecondaryCfg = this._getSecondaryLevelCfg(this.responsiveMode);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
this.#storeLatestFocusedElementId();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @param {NavBarResponsiveMode} responsiveMode
|
|
190
|
+
*/
|
|
191
|
+
_getLevelCfg(responsiveMode) {
|
|
192
|
+
// N.B. we're fighting some of the overlay configs provided by LionMenuOverlay here,
|
|
193
|
+
// the idea is to take over all of that when depending on LionMenu, after removing LonMenuOverlay and LionMenuHybrid components altogether.
|
|
194
|
+
|
|
195
|
+
if (responsiveMode === 'mobile') {
|
|
196
|
+
return {
|
|
197
|
+
l1: {
|
|
198
|
+
isBar: false,
|
|
199
|
+
openableConfig: {
|
|
200
|
+
// We want to do the absolute positioning ourselves, popper is not suited for this...
|
|
201
|
+
placementMode: 'custom',
|
|
202
|
+
isActivated: false,
|
|
203
|
+
hidesOnOutsideClick: false,
|
|
204
|
+
inheritsReferenceWidth: 'none',
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
l2: {
|
|
208
|
+
openableConfig: {
|
|
209
|
+
// We want disclosure behavior
|
|
210
|
+
placementMode: 'custom',
|
|
211
|
+
hidesOnOutsideClick: false,
|
|
212
|
+
inheritsReferenceWidth: 'none',
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
l3: {
|
|
216
|
+
openableConfig: {
|
|
217
|
+
// We want disclosure behavior
|
|
218
|
+
placementMode: 'custom',
|
|
219
|
+
hidesOnOutsideClick: false,
|
|
220
|
+
inheritsReferenceWidth: 'none',
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return {
|
|
227
|
+
l1: {
|
|
228
|
+
isBar: true,
|
|
229
|
+
hasFullWidthFlyout: true,
|
|
230
|
+
openableConfig: {
|
|
231
|
+
// We want disclosure behavior
|
|
232
|
+
placementMode: 'custom',
|
|
233
|
+
// N.B. we don't have an invoker...
|
|
234
|
+
isActivated: false,
|
|
235
|
+
inheritsReferenceWidth: 'none',
|
|
236
|
+
focusContentOnOpen: true,
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
l2: {
|
|
240
|
+
openableConfig: {
|
|
241
|
+
// We want disclosure behavior
|
|
242
|
+
placementMode: 'custom',
|
|
243
|
+
hidesOnOutsideClick: true,
|
|
244
|
+
hidesOnEscape: true,
|
|
245
|
+
inheritsReferenceWidth: 'none',
|
|
246
|
+
focusContentOnOpen: true,
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
l3: {
|
|
250
|
+
openableConfig: {
|
|
251
|
+
// We want disclosure behavior
|
|
252
|
+
placementMode: 'custom',
|
|
253
|
+
inheritsReferenceWidth: 'none',
|
|
254
|
+
focusContentOnOpen: true,
|
|
255
|
+
// TODO: implement in OverlayController
|
|
256
|
+
hideVisually: true,
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
_getSecondaryLevelCfg(responsiveMode) {
|
|
263
|
+
if (responsiveMode === 'mobile') {
|
|
264
|
+
return {
|
|
265
|
+
l1: {
|
|
266
|
+
isBar: true,
|
|
267
|
+
},
|
|
268
|
+
l2: {
|
|
269
|
+
isBar: false,
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return {
|
|
275
|
+
l1: {
|
|
276
|
+
isBar: true,
|
|
277
|
+
},
|
|
278
|
+
l2: {
|
|
279
|
+
isBar: false,
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** @type {string | null} */
|
|
285
|
+
#latestFocusedElementId = null;
|
|
286
|
+
|
|
287
|
+
#storeLatestFocusedElementId() {
|
|
288
|
+
this.addEventListener('focusin', ({ target }) => {
|
|
289
|
+
// @ts-ignore
|
|
290
|
+
this.#latestFocusedElementId = target.id;
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
#syncLatestFocusedElementForNewResponsiveMode() {
|
|
295
|
+
// We might show/hide or rerender some elements (with same ids) in different positions in the DOM.
|
|
296
|
+
// As these are physically different elements, we must move focus (as otherwise it would be reset to body)
|
|
297
|
+
if (!this.#latestFocusedElementId) return;
|
|
298
|
+
const newFocusedElement = this.shadowRoot?.querySelector(`#${this.#latestFocusedElementId}`);
|
|
299
|
+
if (newFocusedElement instanceof HTMLElement) {
|
|
300
|
+
newFocusedElement.focus();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @param {import("./types.js").MenuItem}
|
|
306
|
+
* @param {number} level
|
|
307
|
+
*/
|
|
308
|
+
_getId(menuItem, level) {
|
|
309
|
+
if (menuItem.id) return menuItem.id;
|
|
310
|
+
const title = menuItem.title || menuItem.label || 'item';
|
|
311
|
+
return `${
|
|
312
|
+
Number.isInteger(level) ? `l${level}-${title}` : title
|
|
313
|
+
}-${Math.random().toString(16).slice(2)}`;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @param {import('lit').PropertyValues} changedProperties
|
|
318
|
+
*/
|
|
319
|
+
updated(changedProperties) {
|
|
320
|
+
if (changedProperties.has('responsiveMode')) {
|
|
321
|
+
this._levelCfg = this._getLevelCfg(this.responsiveMode);
|
|
322
|
+
this.#syncLatestFocusedElementForNewResponsiveMode();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
render() {
|
|
327
|
+
return html`
|
|
328
|
+
<nav>
|
|
329
|
+
<div class="nav-header">
|
|
330
|
+
<div class="logo-and-close">
|
|
331
|
+
<a href="${this.logo.href || '#'}">
|
|
332
|
+
<img src="${this.logo.src || ''}" alt="${this.logo.alt || ''}" />
|
|
333
|
+
</a>
|
|
334
|
+
${this.responsiveMode === 'mobile'
|
|
335
|
+
? html`<button data-close data-level="1">✖️</button>`
|
|
336
|
+
: ''}
|
|
337
|
+
</div>
|
|
338
|
+
${this._searchTemplate()}
|
|
339
|
+
</div>
|
|
340
|
+
<div class="nav-body">
|
|
341
|
+
${this._menulevelTemplate(this.menuSupportItems, 1, '')}
|
|
342
|
+
${this.responsiveMode === 'desktop'
|
|
343
|
+
? this._ctasTemplate(this.ctaPrimary, this.ctaSecondary)
|
|
344
|
+
: ''}
|
|
345
|
+
${this._menulevelTemplate(this.menuItems, 1, '', true)}
|
|
346
|
+
</div>
|
|
347
|
+
${this.responsiveMode === 'mobile'
|
|
348
|
+
? html`<div class="nav-footer">
|
|
349
|
+
${this._ctasTemplate(this.ctaPrimary, this.ctaSecondary)}
|
|
350
|
+
</div>`
|
|
351
|
+
: ''}
|
|
352
|
+
</nav>
|
|
353
|
+
`;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* @param {string[]} suggestions
|
|
358
|
+
* @returns {import('lit').TemplateResult}
|
|
359
|
+
*/
|
|
360
|
+
_searchTemplate(suggestions = this.suggestions, prefilledSuggestion = this.prefilledSuggestion) {
|
|
361
|
+
return html` <form role="search">
|
|
362
|
+
<input
|
|
363
|
+
type="search"
|
|
364
|
+
list="search-list"
|
|
365
|
+
placeholder="What are you looking for?"
|
|
366
|
+
.value="${prefilledSuggestion}"
|
|
367
|
+
/>
|
|
368
|
+
<datalist id="search-list">
|
|
369
|
+
${suggestions.map(suggestion => html`<option value="${suggestion}"></option>`)}
|
|
370
|
+
</datalist>
|
|
371
|
+
<input type="submit" value="Search" />
|
|
372
|
+
</form>`;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* @param {CtaLink} ctaPrimary
|
|
377
|
+
* @param {CtaLink} ctaSecondary
|
|
378
|
+
* @returns {import('lit').TemplateResult}
|
|
379
|
+
*/
|
|
380
|
+
_ctasTemplate(ctaPrimary, ctaSecondary) {
|
|
381
|
+
return html`<div class="cta-items">
|
|
382
|
+
${ctaSecondary?.href
|
|
383
|
+
? html`<div class="cta-secondary">
|
|
384
|
+
<a id="${this._getId(ctaSecondary)}" href="${ctaSecondary.href}"
|
|
385
|
+
>${ctaSecondary.label}
|
|
386
|
+
</a>
|
|
387
|
+
</div>`
|
|
388
|
+
: ''}
|
|
389
|
+
${ctaPrimary?.href
|
|
390
|
+
? html`<div class="cta-primary">
|
|
391
|
+
<a id="${this._getId(ctaPrimary)}" href="${ctaPrimary.href}"> ${ctaPrimary.label}</a>
|
|
392
|
+
</div>`
|
|
393
|
+
: ''}
|
|
394
|
+
</div>`;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* @param {MenuItem[]} menuItemsForLevel
|
|
399
|
+
* @param {number} level
|
|
400
|
+
* @returns {import('lit').TemplateResult}
|
|
401
|
+
*/
|
|
402
|
+
_menulevelTemplate(menuItemsForLevel, level, prevText = '', itemWrap = false) {
|
|
403
|
+
// @ts-ignore
|
|
404
|
+
const cfgForLevel = this._levelCfg[`l${level}`];
|
|
405
|
+
|
|
406
|
+
return html`<lion-menu-hybrid
|
|
407
|
+
?item-wrap=${itemWrap}
|
|
408
|
+
.config="${cfgForLevel.openableConfig || {}}"
|
|
409
|
+
.bar="${cfgForLevel.isBar}"
|
|
410
|
+
?data-has-full-width-flyout="${cfgForLevel.hasFullWidthFlyout}"
|
|
411
|
+
._activeMode="${'tabbable-disclosure'}"
|
|
412
|
+
>
|
|
413
|
+
${level > 1 && this.responsiveMode === 'mobile'
|
|
414
|
+
? html` <div role="listitem">
|
|
415
|
+
<button data-close data-level="${level}">< ${prevText}</button>
|
|
416
|
+
</div>`
|
|
417
|
+
: ''}
|
|
418
|
+
${menuItemsForLevel.map(
|
|
419
|
+
menuItem => html`
|
|
420
|
+
<div role="listitem">
|
|
421
|
+
${menuItem.sub
|
|
422
|
+
? html` <button id="${this._getId(menuItem)}" data-invoker>${menuItem.title}</button>
|
|
423
|
+
${menuItem.sub
|
|
424
|
+
? this._menulevelTemplate(menuItem.sub, level + 1, menuItem.title)
|
|
425
|
+
: ''}`
|
|
426
|
+
: html` <a id="${this._getId(menuItem)}" href="${menuItem.link || ''}"
|
|
427
|
+
>${menuItem.title}</a
|
|
428
|
+
>`}
|
|
429
|
+
</div>
|
|
430
|
+
`,
|
|
431
|
+
)}
|
|
432
|
+
${itemWrap
|
|
433
|
+
? html`<div slot="more-button">
|
|
434
|
+
<button>More</button>
|
|
435
|
+
</div>`
|
|
436
|
+
: nothing}
|
|
437
|
+
</lion-menu-hybrid> `;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {'mobile' | 'desktop'} NavBarResponsiveMode
|
|
3
|
+
* Responsive mode for the navigation bar
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {Object} MenuItem
|
|
8
|
+
* Navigation menu item
|
|
9
|
+
* @property {string} [id] - Optional unique identifier
|
|
10
|
+
* @property {string} title - Display title of the menu item
|
|
11
|
+
* @property {string} [link] - URL for the menu item (for leaf items)
|
|
12
|
+
* @property {MenuItem[]} [sub] - Submenu items (for parent items)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} CtaLink
|
|
17
|
+
* Call-to-action link
|
|
18
|
+
* @property {string} [id] - Optional unique identifier
|
|
19
|
+
* @property {string} [href] - URL for the CTA
|
|
20
|
+
* @property {string} [text] - Display text for the CTA
|
|
21
|
+
* @property {string} [label] - Accessible label for the CTA
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {Object} Logo
|
|
26
|
+
* Logo configuration for the navigation bar
|
|
27
|
+
* @property {string} type - Logo type (e.g., 'ing')
|
|
28
|
+
* @property {string} alt - Alternative text for the logo
|
|
29
|
+
* @property {string} href - URL the logo links to
|
|
30
|
+
* @property {string} [src] - Optional custom logo source URL
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @typedef {Object} LevelConfig
|
|
35
|
+
* Configuration for a menu level
|
|
36
|
+
* @property {boolean} [isBar] - Whether this level is displayed as a bar
|
|
37
|
+
* @property {boolean} [hasFullWidthFlyout] - Whether this level has a full-width flyout
|
|
38
|
+
* @property {object} [openableConfig] - Configuration for the openable overlay
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
- Redesign goals OverlayController
|
|
2
|
+
- Simplicity
|
|
3
|
+
- One primitive to (controller to) rule them all
|
|
4
|
+
- Aligned api with all disclosure mechanisms (openables: <https://open-ui.org/components/openable.explainer/>)
|
|
5
|
+
- Aligned with platform overlay primitives (popover, dialog and tooltip)
|
|
6
|
+
- Controller will be elegantly aligned with host
|
|
7
|
+
- Controller props will be mapped to a host via a mixin, w/o requiring lots of boilerplate
|
|
8
|
+
- No race conditions due to unaligned heart beats: both hook in to the same "tick": the reactive update cycle of lit (which can theoretically be swapped by other cycles, see <https://lit.dev/docs/frameworks/react/#usecontroller>)
|
|
9
|
+
- In general, all property effects / events / reactivity should be aligned as much as possible with the update cycle (for predictability and perf. We only need
|
|
10
|
+
- All components will just be configuration (no need to redefine a lot of logic)
|
|
11
|
+
- OverlayController (or OpenableController, or DisclosureController, or VisitibilityToggleController) will be the biggest common denominator. Having all logic in one place, makes it a lot easier to erase about then having it scattered across many mixin and/or controller levels
|
|
12
|
+
- Even though the amount of logic is large (and might feel a bit monolithic), this is just needed when we want to have a stable, battle tested abstraction around all edge cases that building accessible disclosures should handle
|
|
13
|
+
- However, this does not come at an extra performance cost (see performance, you will only load what you need)
|
|
14
|
+
- The current OverlayController is a long file that can benefit from some modularity and cleanup
|
|
15
|
+
- Every overlay feature can be provided in a separate file with knowledge about the overlay lifecycle
|
|
16
|
+
- We can provide/reuse some utils like Resettable from VisibilityToggleCtrl ()
|
|
17
|
+
- Flexibility
|
|
18
|
+
- Re-use your markup for different screen sizes and/or devices (that may have different appearances, but the same functionality/semantics)
|
|
19
|
+
- Think of:
|
|
20
|
+
- a datepicker that opens as dropdown on desktop and as centered modal dialog on mobile
|
|
21
|
+
- a menubutton that opens as dropdown on desktop and as bottomsheet
|
|
22
|
+
- A menu that opens as dropdown on desktop and a collapsible (or even a plain list) on mobile
|
|
23
|
+
- As explained above, controllers are the most re-usable primitives, as a web component/mixin does not always provide the flexibility we need
|
|
24
|
+
- Controllers can be easliy mapped to directives (giving the same flexibility as "platform attributes" like popover). Forward compatible with <https://github.com/WICG/webcomponents/issues/1029>
|
|
25
|
+
- Controllers can be easily mapped to web components or mixins
|
|
26
|
+
- Contrary to mixins, it’s easy to conditionally load a controller
|
|
27
|
+
- Contrary to mixins, it’s easy to “undo” a controller (which is helpful in edge cases)
|
|
28
|
+
- Performance
|
|
29
|
+
- Will leverage the platform where possible:
|
|
30
|
+
- Use popover
|
|
31
|
+
- Forward compatibility
|
|
32
|
+
- Aligns as much as possible with (future) platform apis
|
|
33
|
+
- This leverages existing dev knowledge (api familiarity)
|
|
34
|
+
- This allows to build drop in replacements
|
|
35
|
+
- This allows to rely on the platform (reducing maintenance costs, increasing performance)
|
|
36
|
+
- Completeness
|
|
37
|
+
- Supports all use cases to build every UI thinkable:
|
|
38
|
+
- Will have optional dependency to menu controllers and interactive list controllers
|
|
39
|
+
- Supports visually hidden scenarios, hides
|
|
40
|
+
- Backward compatibility
|
|
41
|
+
- Since the amount of consumers of our overlay system (directly or indirectly) is large, we should provide a compatibility mechanism where possible. At the same time, we want to create an api as clean/aligned/forward compatible as possible. We could consider an optional compat-layer (a global import at the top of an app extending OverlayController prototype). Think of:
|
|
42
|
+
- Mapping popper api to popover concepts
|
|
43
|
+
-
|
|
44
|
+
|
|
45
|
+
# Why start with OverlayController?
|
|
46
|
+
|
|
47
|
+
- there is a lot of value in cleaning it up as there are many platform improvements
|
|
48
|
+
- it's used by many
|
|
49
|
+
- It is already a controller (we created it before Lit controllers existed) and therefore impact is minimal
|