@lion/ui 0.20.0-menu-system.0 → 0.20.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/calendar-suites.js +1 -0
- package/collapsible.js +0 -1
- package/components/button/src/LionButton.js +0 -4
- package/components/button/test-suites/LionButton.suite.js +0 -1
- package/components/calendar/src/LionCalendar.js +1 -3
- package/components/calendar/test/lion-calendar.test.js +67 -47
- package/components/calendar/test-suites/LionCalendar.suite.js +79 -0
- package/components/combobox/test/lion-combobox.test.js +0 -1
- package/components/form-core/src/FormatMixin.js +7 -2
- package/components/form-core/src/form-group/FormGroupMixin.js +0 -7
- package/components/form-core/src/registration/FormRegistrarMixin.js +0 -11
- package/components/form-core/test/FormControlMixin.test.js +0 -1
- package/components/form-core/test/FormatMixin.test.js +4 -1
- package/components/form-core/test/validate/Validator.test.js +0 -2
- package/components/form-core/test-suites/FormatMixin.suite.js +242 -65
- package/components/form-core/test-suites/ValidateMixin.suite.js +0 -2
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +0 -1
- package/components/input/test/input-integrations.test.js +3 -2
- package/components/input/test/lion-input-integrations.test.js +2 -1
- package/components/input-amount/test/lion-input-amount-integrations.test.js +1 -1
- package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +22 -4
- package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +22 -0
- package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +59 -3
- package/components/input-date/test/lion-input-date-integrations.test.js +1 -1
- package/components/input-datepicker/src/localizeNamespaceLoader.js +0 -1
- package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +1 -1
- package/components/input-datepicker/test/lion-input-datepicker.test.js +19 -9
- package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +35 -0
- package/components/input-email/src/LionInputEmail.js +2 -0
- package/components/input-email/test/lion-input-email-integrations.test.js +1 -1
- package/components/input-email/test/lion-input-email.test.js +6 -0
- package/components/input-file/src/validators.js +31 -1
- package/components/input-file/test/FileValidators.test.js +31 -0
- package/components/input-file/translations/bg.js +1 -0
- package/components/input-file/translations/cs.js +1 -0
- package/components/input-file/translations/de.js +2 -0
- package/components/input-file/translations/en.js +1 -0
- package/components/input-file/translations/es.js +1 -0
- package/components/input-file/translations/fr.js +1 -0
- package/components/input-file/translations/hu.js +1 -0
- package/components/input-file/translations/id.js +1 -0
- package/components/input-file/translations/it.js +1 -0
- package/components/input-file/translations/nl.js +1 -0
- package/components/input-file/translations/pl.js +1 -0
- package/components/input-file/translations/ro.js +1 -0
- package/components/input-file/translations/ru.js +1 -0
- package/components/input-file/translations/sk.js +1 -0
- package/components/input-file/translations/uk.js +1 -0
- package/components/input-file/translations/zh.js +1 -0
- package/components/input-iban/test/lion-input-iban-integrations.test.js +1 -1
- package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +2 -2
- package/components/input-tel/src/LionInputTel.js +1 -1
- package/components/input-tel/test-suites/LionInputTel.suite.js +7 -0
- package/components/localize/test/date/formatDate.test.js +0 -1
- package/components/overlays/src/OverlayController.js +110 -278
- package/components/overlays/src/OverlayMixin.js +11 -58
- package/components/overlays/src/OverlaysManager.js +2 -2
- package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +41 -9
- package/components/overlays/src/utils/adopt-styles.js +2 -3
- package/components/overlays/src/utils/get-focusable-elements.js +0 -4
- package/components/overlays/src/utils/is-equal-config.js +6 -10
- package/components/overlays/test/OverlayController.test.js +14 -127
- package/components/overlays/test/utils-tests/is-equal-config.test.js +1 -1
- package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
- package/components/overlays/test-suites/WithHoverInteraction.suite.js +212 -0
- package/components/overlays/types/ArrowMixinTypes.ts +1 -3
- package/components/overlays/types/OverlayConfig.ts +5 -20
- package/components/overlays/types/OverlayMixinTypes.ts +0 -2
- package/components/select-rich/test/lion-select-rich.test.js +0 -3
- package/components/textarea/test/lion-textarea-integrations.test.js +2 -1
- package/components/tooltip/test/lion-tooltip.test.js +9 -1
- package/custom-elements.json +18086 -30683
- package/dist-types/components/button/src/LionButton.d.ts +0 -1
- 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/calendar/test-suites/LionCalendar.suite.d.ts +5 -0
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.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 +2 -6
- package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
- package/dist-types/components/form-core/src/FormatMixin.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/FormatMixin.suite.d.ts +50 -5
- package/dist-types/components/form-core/test-suites/FormatMixin.suite.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/icon/src/LionIcon.d.ts +2 -2
- package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts.map +1 -1
- package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts +2 -0
- package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts.map +1 -0
- 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/input-datepicker/test/lion-input-datepicker.test.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts +7 -0
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts.map +1 -0
- package/dist-types/components/input-email/src/LionInputEmail.d.ts.map +1 -1
- package/dist-types/components/input-file/src/validators.d.ts +11 -0
- package/dist-types/components/input-file/src/validators.d.ts.map +1 -1
- package/dist-types/components/input-file/translations/bg-BG.d.ts +1 -0
- package/dist-types/components/input-file/translations/bg.d.ts +1 -0
- package/dist-types/components/input-file/translations/cs-CZ.d.ts +1 -0
- package/dist-types/components/input-file/translations/cs.d.ts +1 -0
- package/dist-types/components/input-file/translations/de-DE.d.ts +1 -0
- package/dist-types/components/input-file/translations/de.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-AU.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-GB.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-PH.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-US.d.ts +1 -0
- package/dist-types/components/input-file/translations/en.d.ts +1 -0
- package/dist-types/components/input-file/translations/es-ES.d.ts +1 -0
- package/dist-types/components/input-file/translations/es.d.ts +1 -0
- package/dist-types/components/input-file/translations/fr-BE.d.ts +1 -0
- package/dist-types/components/input-file/translations/fr-FR.d.ts +1 -0
- package/dist-types/components/input-file/translations/fr.d.ts +1 -0
- package/dist-types/components/input-file/translations/hu-HU.d.ts +1 -0
- package/dist-types/components/input-file/translations/hu.d.ts +1 -0
- package/dist-types/components/input-file/translations/id-ID.d.ts +1 -0
- package/dist-types/components/input-file/translations/id.d.ts +1 -0
- package/dist-types/components/input-file/translations/it-IT.d.ts +1 -0
- package/dist-types/components/input-file/translations/it.d.ts +1 -0
- package/dist-types/components/input-file/translations/nl-BE.d.ts +1 -0
- package/dist-types/components/input-file/translations/nl-NL.d.ts +1 -0
- package/dist-types/components/input-file/translations/nl.d.ts +1 -0
- package/dist-types/components/input-file/translations/pl-PL.d.ts +1 -0
- package/dist-types/components/input-file/translations/pl.d.ts +1 -0
- package/dist-types/components/input-file/translations/ro-RO.d.ts +1 -0
- package/dist-types/components/input-file/translations/ro.d.ts +1 -0
- package/dist-types/components/input-file/translations/ru-RU.d.ts +1 -0
- package/dist-types/components/input-file/translations/ru.d.ts +1 -0
- package/dist-types/components/input-file/translations/sk-SK.d.ts +1 -0
- package/dist-types/components/input-file/translations/sk.d.ts +1 -0
- package/dist-types/components/input-file/translations/uk-UA.d.ts +1 -0
- package/dist-types/components/input-file/translations/uk.d.ts +1 -0
- package/dist-types/components/input-file/translations/zh-CN.d.ts +1 -0
- package/dist-types/components/input-file/translations/zh.d.ts +1 -0
- 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/overlays/src/OverlayController.d.ts +12 -24
- 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/test-suites/WithHoverInteraction.suite.d.ts +17 -0
- package/dist-types/components/overlays/test-suites/WithHoverInteraction.suite.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 +2 -12
- package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +0 -1
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +3 -11
- 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/components/tooltip/test/lion-tooltip.test.d.ts.map +1 -1
- package/dist-types/exports/calendar-suites.d.ts +2 -0
- package/dist-types/exports/calendar-suites.d.ts.map +1 -0
- package/dist-types/exports/input-datepicker-suites.d.ts +2 -0
- package/dist-types/exports/input-datepicker-suites.d.ts.map +1 -0
- package/dist-types/exports/input-file.d.ts +1 -1
- package/dist-types/exports/overlays-test-suites.d.ts +1 -0
- package/dist-types/exports/overlays.d.ts +0 -3
- 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 +8 -21
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/api-table.md +6 -31
- 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 +2 -2
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/api-table.md +4 -21
- 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 +18 -0
- 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/radio-group/overview.md +3 -3
- package/docs/components/select/use-cases.md +1 -1
- package/docs/components/select-rich/api-table.md +5 -21
- 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 +11 -36
- package/docs/components/tooltip/use-cases.md +34 -1
- 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 +34 -36
- 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/calendar-suites.js +1 -0
- package/exports/collapsible.js +0 -1
- package/exports/input-datepicker-suites.js +1 -0
- package/exports/input-file.js +5 -1
- package/exports/overlays-test-suites.js +1 -0
- package/exports/overlays.js +0 -6
- package/input-datepicker-suites.js +1 -0
- package/input-file.js +5 -1
- package/overlays-test-suites.js +1 -0
- package/overlays.js +0 -6
- package/package.json +2 -2
- package/components/collapsible/src/DisclosureMixin.js +0 -313
- package/components/collapsible/test-suites/DisclosureMixin.suite.js +0 -30
- package/components/collapsible/types/DisclosureMixinTypes.ts +0 -48
- package/components/menu/CHANGELOG.md +0 -37
- package/components/menu/README.md +0 -335
- package/components/menu/index.js +0 -2
- package/components/menu/lion-menu-overlay.js +0 -3
- package/components/menu/lion-menu.js +0 -3
- package/components/menu/lion-spinbutton.js +0 -3
- package/components/menu/lion-toolbar.js +0 -3
- package/components/menu/lion-tree.js +0 -3
- package/components/menu/package.json +0 -46
- package/components/menu/requirements.temp.md +0 -12
- package/components/menu/src/InteractiveListMixin.js +0 -840
- package/components/menu/src/LionMenu.js +0 -250
- package/components/menu/src/LionMenuHybrid.js +0 -46
- package/components/menu/src/LionMenuOverlay.js +0 -155
- package/components/menu/src/LionSpinbutton.js +0 -213
- package/components/menu/src/LionToolbar.js +0 -94
- package/components/menu/src/LionTree.js +0 -52
- package/components/menu/src/MoreButtonMenuMixin.js +0 -278
- package/components/menu/src/MultiLevelListMixin.js +0 -311
- package/components/menu/src/utils/isInView.js +0 -26
- package/components/menu/src/utils/listItemInteractions.js +0 -124
- package/components/menu/test/InteractiveListMixin.test.js +0 -3
- package/components/menu/test/MoreButtonMenuMixin.test.js +0 -4
- package/components/menu/test/MultiLevelListMixin.test.js +0 -3
- package/components/menu/test/lion-menu-hybrid.test.js +0 -3
- package/components/menu/test/lion-menu.test.js +0 -11
- package/components/menu/test/lion-toolbar.test.js +0 -8
- package/components/menu/test/lion-tree.test.js +0 -7
- package/components/menu/test-helpers/mimicKeyPress.js +0 -9
- package/components/menu/test-suites/InteractiveListMixin.suite.js +0 -454
- package/components/menu/test-suites/LionMenu.suite.js +0 -113
- package/components/menu/test-suites/LionMenuHybrid.suite.js +0 -583
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +0 -372
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +0 -303
- package/components/menu/types/InteractiveListMixinTypes.d.ts +0 -84
- package/components/navigation-bar/README.md +0 -1
- package/components/navigation-bar/src/LionNavigationBar.js +0 -439
- package/components/navigation-bar/src/types.js +0 -41
- package/components/overlays/NEXT.md +0 -49
- package/components/overlays/test/withHoverInteraction.test.js +0 -90
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts +0 -3
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +0 -1
- package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts +0 -2
- package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts.map +0 -1
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +0 -24
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +0 -1
- package/dist-types/components/menu/index.d.ts +0 -3
- package/dist-types/components/menu/index.d.ts.map +0 -1
- package/dist-types/components/menu/lion-menu-overlay.d.ts +0 -2
- package/dist-types/components/menu/lion-menu-overlay.d.ts.map +0 -1
- package/dist-types/components/menu/lion-menu.d.ts +0 -2
- package/dist-types/components/menu/lion-menu.d.ts.map +0 -1
- package/dist-types/components/menu/lion-spinbutton.d.ts +0 -2
- package/dist-types/components/menu/lion-spinbutton.d.ts.map +0 -1
- package/dist-types/components/menu/lion-toolbar.d.ts +0 -2
- package/dist-types/components/menu/lion-toolbar.d.ts.map +0 -1
- package/dist-types/components/menu/lion-tree.d.ts +0 -2
- package/dist-types/components/menu/lion-tree.d.ts.map +0 -1
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +0 -617
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenu.d.ts +0 -635
- package/dist-types/components/menu/src/LionMenu.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts +0 -19
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts +0 -1015
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionSpinbutton.d.ts +0 -58
- package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionToolbar.d.ts +0 -8
- package/dist-types/components/menu/src/LionToolbar.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionTree.d.ts +0 -447
- package/dist-types/components/menu/src/LionTree.d.ts.map +0 -1
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +0 -39
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +0 -503
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/isInView.d.ts +0 -9
- package/dist-types/components/menu/src/utils/isInView.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +0 -48
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +0 -1
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +0 -2
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +0 -2
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +0 -2
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-menu-hybrid.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-menu-hybrid.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-menu.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-menu.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-toolbar.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-toolbar.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-tree.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-tree.test.d.ts.map +0 -1
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +0 -7
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +0 -14
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +0 -9
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts +0 -5
- package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +0 -14
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +0 -11
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +0 -1
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts +0 -238
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +0 -1
- package/dist-types/components/navigation-bar/src/types.d.ts +0 -85
- package/dist-types/components/navigation-bar/src/types.d.ts.map +0 -1
- package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts +0 -2
- package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts.map +0 -1
- package/dist-types/exports/define/lion-item.d.ts +0 -2
- package/dist-types/exports/define/lion-item.d.ts.map +0 -1
- package/dist-types/exports/define/lion-menu-overlay.d.ts +0 -2
- package/dist-types/exports/define/lion-menu-overlay.d.ts.map +0 -1
- package/dist-types/exports/define/lion-menu.d.ts +0 -2
- package/dist-types/exports/define/lion-menu.d.ts.map +0 -1
- package/dist-types/exports/define/lion-navigation-bar.d.ts +0 -2
- package/dist-types/exports/define/lion-navigation-bar.d.ts.map +0 -1
- package/dist-types/exports/define/lion-toolbar.d.ts +0 -2
- package/dist-types/exports/define/lion-toolbar.d.ts.map +0 -1
- package/dist-types/exports/define/lion-tree.d.ts +0 -2
- package/dist-types/exports/define/lion-tree.d.ts.map +0 -1
- package/dist-types/exports/menu-test-suites.d.ts +0 -4
- package/dist-types/exports/menu-test-suites.d.ts.map +0 -1
- package/dist-types/exports/menu.d.ts +0 -7
- package/dist-types/exports/menu.d.ts.map +0 -1
- package/dist-types/exports/navigation-bar.d.ts +0 -2
- package/dist-types/exports/navigation-bar.d.ts.map +0 -1
- package/docs/components/menu/api-table.md +0 -460
- package/docs/components/menu/applyMenuDemoStyles.js +0 -173
- package/docs/components/menu/extensions.md +0 -262
- package/docs/components/menu/index.md +0 -13
- package/docs/components/menu/overview.md +0 -422
- package/docs/components/menu/use-cases.md +0 -77
- package/exports/define/lion-item.js +0 -3
- package/exports/define/lion-menu-overlay.js +0 -3
- package/exports/define/lion-menu.js +0 -3
- package/exports/define/lion-navigation-bar.js +0 -3
- package/exports/define/lion-toolbar.js +0 -3
- package/exports/define/lion-tree.js +0 -3
- package/exports/menu-test-suites.js +0 -4
- package/exports/menu.js +0 -7
- package/exports/navigation-bar.js +0 -1
- package/menu-test-suites.js +0 -4
- package/menu.js +0 -7
- package/navigation-bar.js +0 -1
|
@@ -33,7 +33,10 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
33
33
|
class OverlayMixin extends superclass {
|
|
34
34
|
static get properties() {
|
|
35
35
|
return {
|
|
36
|
-
opened: {
|
|
36
|
+
opened: {
|
|
37
|
+
type: Boolean,
|
|
38
|
+
reflect: true,
|
|
39
|
+
},
|
|
37
40
|
};
|
|
38
41
|
}
|
|
39
42
|
|
|
@@ -59,17 +62,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
59
62
|
this.open = this.open.bind(this);
|
|
60
63
|
/** @type {EventListener} */
|
|
61
64
|
this.close = this.close.bind(this);
|
|
62
|
-
|
|
63
|
-
// // By default, we go for disclosure behavior
|
|
64
|
-
// // TODO: in the future, bring disclosure behavior to a controller (and therefore directive).
|
|
65
|
-
// // Take inspiration from VisibilityToggleCtrl of portal elements
|
|
66
|
-
// /**
|
|
67
|
-
// * Terminology aligned with https://open-ui.org/components/openable.explainer/
|
|
68
|
-
// * @type {'disclosure'|'overlay'}
|
|
69
|
-
// */
|
|
70
|
-
// this.openableMode = 'disclosure';
|
|
71
|
-
|
|
72
|
-
// allow hybrid disclosure/overlay components
|
|
73
65
|
}
|
|
74
66
|
|
|
75
67
|
get config() {
|
|
@@ -78,7 +70,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
78
70
|
|
|
79
71
|
/** @param {OverlayConfig} value */
|
|
80
72
|
set config(value) {
|
|
81
|
-
// TODO: built-in in overlayCtrl now... delete here
|
|
82
73
|
const shouldUpdate = !isEqualConfig(this.config, value);
|
|
83
74
|
|
|
84
75
|
if (this._overlayCtrl && shouldUpdate) {
|
|
@@ -170,8 +161,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
170
161
|
*/
|
|
171
162
|
// eslint-disable-next-line class-methods-use-this
|
|
172
163
|
_setupOpenCloseListeners() {
|
|
173
|
-
// Keeps the close-overlay event private for the controller.
|
|
174
|
-
// (we already have )
|
|
175
164
|
/**
|
|
176
165
|
* @param {{ stopPropagation: () => void; }} ev
|
|
177
166
|
*/
|
|
@@ -229,11 +218,11 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
229
218
|
// @ts-expect-error
|
|
230
219
|
static enabledWarnings = super.enabledWarnings?.filter(w => w !== 'change-in-update') || [];
|
|
231
220
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
221
|
+
get _overlayInvokerNode() {
|
|
222
|
+
return /** @type {HTMLElement | undefined} */ (
|
|
223
|
+
Array.from(this.children).find(child => child.slot === 'invoker')
|
|
224
|
+
);
|
|
225
|
+
}
|
|
237
226
|
|
|
238
227
|
/**
|
|
239
228
|
* @overridable
|
|
@@ -267,46 +256,13 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
267
256
|
);
|
|
268
257
|
}
|
|
269
258
|
|
|
270
|
-
/**
|
|
271
|
-
* @param {Element} focusableElOrWrapper
|
|
272
|
-
* @returns {Element|null}
|
|
273
|
-
*/
|
|
274
|
-
static _getFocusableInvokerEl(focusableElOrWrapper) {
|
|
275
|
-
// return focusableElOrWrapper;
|
|
276
|
-
return (
|
|
277
|
-
focusableElOrWrapper &&
|
|
278
|
-
(focusableElOrWrapper.hasAttribute('tabindex') || focusableElOrWrapper.tagName === 'BUTTON'
|
|
279
|
-
? focusableElOrWrapper
|
|
280
|
-
: focusableElOrWrapper.querySelector('[role=button], button'))
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
get _overlayInvokerNode() {
|
|
285
|
-
const ctor = /** @type {typeof OverlayMixin} */ (this.constructor);
|
|
286
|
-
if (!this.__invokerNode) {
|
|
287
|
-
const slottedNode = Array.from(this.children).find(child => child.slot === 'invoker');
|
|
288
|
-
if (slottedNode) {
|
|
289
|
-
this.__invokerNode = ctor._getFocusableInvokerEl(slottedNode);
|
|
290
|
-
} else {
|
|
291
|
-
// Look for preceeding sibling with [data-invoker] attribute, and try to find a focusable element in it (either itself or a child)
|
|
292
|
-
this.__invokerNode =
|
|
293
|
-
this.previousElementSibling?.hasAttribute('data-invoker') &&
|
|
294
|
-
ctor._getFocusableInvokerEl(this.previousElementSibling);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return this.__invokerNode;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
259
|
/** @protected */
|
|
301
260
|
_setupOverlayCtrl() {
|
|
302
261
|
if (this.#hasSetup) return;
|
|
303
|
-
|
|
304
|
-
const invokerNode = this._overlayInvokerNode;
|
|
305
|
-
|
|
306
262
|
const config = {
|
|
307
263
|
contentNode: this._overlayContentNode,
|
|
308
264
|
contentWrapperNode: this._overlayContentWrapperNode,
|
|
309
|
-
invokerNode:
|
|
265
|
+
invokerNode: this._overlayInvokerNode,
|
|
310
266
|
referenceNode: this._overlayReferenceNode,
|
|
311
267
|
backdropNode: this._overlayBackdropNode,
|
|
312
268
|
};
|
|
@@ -326,8 +282,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
326
282
|
|
|
327
283
|
/** @protected */
|
|
328
284
|
_teardownOverlayCtrl() {
|
|
329
|
-
// Make sure that dynamic behavior (e.g. responsive) is possible by allowing multiple setups and teardowns of the overlay controller.
|
|
330
|
-
this.#hasSetup = false;
|
|
331
285
|
if (!this._overlayCtrl) return;
|
|
332
286
|
|
|
333
287
|
this._teardownOpenCloseListeners();
|
|
@@ -480,7 +434,6 @@ export const OverlayMixinImplementation = superclass => {
|
|
|
480
434
|
for (const postProcessor of overlayMixinPostProcessors) {
|
|
481
435
|
postProcessor(OverlayMixin);
|
|
482
436
|
}
|
|
483
|
-
|
|
484
|
-
return OverlayMixin;
|
|
437
|
+
return /** @type {* & OverlayMixin} */ (OverlayMixin);
|
|
485
438
|
};
|
|
486
439
|
export const OverlayMixin = dedupeMixin(OverlayMixinImplementation);
|
|
@@ -209,9 +209,9 @@ export class OverlaysManager {
|
|
|
209
209
|
const newMarginBottom = this.__bodySizeVars.marginBottom + scrollbarHeight;
|
|
210
210
|
// @ts-expect-error [external]: CSS not yet typed
|
|
211
211
|
if (window.CSS?.number && document.body.attributeStyleMap?.set) {
|
|
212
|
-
// @ts-ignore
|
|
212
|
+
// @ts-ignore
|
|
213
213
|
document.body.attributeStyleMap.set('margin-right', CSS.px(newMarginRight));
|
|
214
|
-
// @ts-ignore
|
|
214
|
+
// @ts-ignore
|
|
215
215
|
document.body.attributeStyleMap.set('margin-bottom', CSS.px(newMarginBottom));
|
|
216
216
|
} else {
|
|
217
217
|
document.body.style.marginRight = `${newMarginRight}px`;
|
package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js
CHANGED
|
@@ -37,11 +37,29 @@ export function withHoverInteraction({
|
|
|
37
37
|
/** @type {NodeJS.Timeout} */
|
|
38
38
|
let pendingLongpressTimeout;
|
|
39
39
|
let longpressCompleted = false;
|
|
40
|
+
// A tap fires pointerdown → pointerup → focusin because the browser moves keyboard focus to
|
|
41
|
+
// the tapped element. We only want focusin to open the tooltip when triggered by keyboard (Tab),
|
|
42
|
+
// not by tap. isLastPointerTouch marks that the preceding pointer event was a touch so the
|
|
43
|
+
// focusin handler can skip it.
|
|
44
|
+
let isLastPointerTouch = false;
|
|
45
|
+
// A tap fires the full mouse compatibility sequence: pointerdown → pointerup → mousedown → mouseup → click.
|
|
46
|
+
// Browsers generate these compatibility events automatically so touch works with mouse-only code.
|
|
47
|
+
// After a longpress the same click fires, which would trigger any click handler on the invoker
|
|
48
|
+
// e.g. opening a dialog alongside the tooltip. We register a capture-phase listener at longpress
|
|
49
|
+
// completion to intercept it, as capture runs before bubble so we stop it regardless of registration order.
|
|
50
|
+
/** @type {((e: Event) => void) | null} */
|
|
51
|
+
let pendingClickSuppressor = null;
|
|
40
52
|
|
|
41
53
|
function resetActive() {
|
|
42
54
|
isFocused = false;
|
|
43
55
|
isHovered = false;
|
|
44
56
|
longpressCompleted = false;
|
|
57
|
+
if (pendingClickSuppressor) {
|
|
58
|
+
controller.invokerNode?.removeEventListener('click', pendingClickSuppressor, {
|
|
59
|
+
capture: true,
|
|
60
|
+
});
|
|
61
|
+
pendingClickSuppressor = null;
|
|
62
|
+
}
|
|
45
63
|
}
|
|
46
64
|
|
|
47
65
|
/**
|
|
@@ -59,17 +77,17 @@ export function withHoverInteraction({
|
|
|
59
77
|
/**
|
|
60
78
|
* @param {Event|PointerEvent} event
|
|
61
79
|
*/
|
|
62
|
-
|
|
80
|
+
function handleHoverAndFocus(event) {
|
|
63
81
|
const { type } = event;
|
|
64
82
|
isFocused = type === 'focusout' ? false : isFocused || type === 'focusin';
|
|
65
83
|
isHovered = type === 'mouseleave' ? false : isHovered || type === 'mouseenter';
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
if (!isHoverSupported && type === 'focusin') {
|
|
85
|
+
if (isLastPointerTouch) {
|
|
86
|
+
isLastPointerTouch = false;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (!controller.invokerNode?.matches(':focus-visible')) return;
|
|
90
|
+
}
|
|
73
91
|
const shouldOpen = isFocused || isHovered;
|
|
74
92
|
openClose({ shouldOpen, openTimeout: delayIn, closeTimeout: delayOut });
|
|
75
93
|
}
|
|
@@ -80,15 +98,23 @@ export function withHoverInteraction({
|
|
|
80
98
|
}
|
|
81
99
|
|
|
82
100
|
/** @param {PointerEvent} event */
|
|
83
|
-
|
|
101
|
+
function handleLongpress(event) {
|
|
84
102
|
clearTimeout(pendingLongpressTimeout);
|
|
85
103
|
if (event.pointerType !== 'touch') return;
|
|
86
104
|
const { type } = event;
|
|
87
105
|
|
|
88
106
|
if (type === 'pointerdown') {
|
|
89
107
|
longpressCompleted = false;
|
|
108
|
+
isLastPointerTouch = true;
|
|
90
109
|
pendingLongpressTimeout = setTimeout(() => {
|
|
91
110
|
longpressCompleted = true;
|
|
111
|
+
// Intercept the compatibility click the browser generates at the end of the touch sequence.
|
|
112
|
+
// Capture phase ensures we run before any bubble-phase handler (e.g. a dialog opener).
|
|
113
|
+
pendingClickSuppressor = e => e.stopImmediatePropagation();
|
|
114
|
+
controller.invokerNode?.addEventListener('click', pendingClickSuppressor, {
|
|
115
|
+
once: true, // auto-removes after first click
|
|
116
|
+
capture: true,
|
|
117
|
+
});
|
|
92
118
|
openClose({ shouldOpen: true });
|
|
93
119
|
}, longpressDuration);
|
|
94
120
|
} else {
|
|
@@ -140,6 +166,12 @@ export function withHoverInteraction({
|
|
|
140
166
|
controller.invokerNode?.removeEventListener('pointerdown', handleLongpress);
|
|
141
167
|
controller.invokerNode?.removeEventListener('pointerup', handleLongpress);
|
|
142
168
|
controller.invokerNode?.removeEventListener('pointerleave', handleLongpress);
|
|
169
|
+
if (pendingClickSuppressor) {
|
|
170
|
+
controller.invokerNode?.removeEventListener('click', pendingClickSuppressor, {
|
|
171
|
+
capture: true,
|
|
172
|
+
});
|
|
173
|
+
pendingClickSuppressor = null;
|
|
174
|
+
}
|
|
143
175
|
}
|
|
144
176
|
},
|
|
145
177
|
};
|
|
@@ -56,8 +56,7 @@ function adoptStyleWhenAdoptedStylesheetsNotSupported(
|
|
|
56
56
|
const styleEl = document.createElement('style');
|
|
57
57
|
// keep notation, so it's not renamed in minification/build
|
|
58
58
|
// eslint-disable-next-line dot-notation
|
|
59
|
-
|
|
60
|
-
const nonce = window.litNonce;
|
|
59
|
+
const nonce = window['litNonce'];
|
|
61
60
|
if (nonce !== undefined) {
|
|
62
61
|
styleEl.setAttribute('nonce', nonce);
|
|
63
62
|
}
|
|
@@ -125,7 +124,7 @@ export function adoptStyle(renderRoot, style, { teardown = false } = {}) {
|
|
|
125
124
|
if (!teardown) {
|
|
126
125
|
// @ts-ignore
|
|
127
126
|
// eslint-disable-next-line no-param-reassign
|
|
128
|
-
renderRoot.adoptedStyleSheets = [...
|
|
127
|
+
renderRoot.adoptedStyleSheets = [...renderRoot.adoptedStyleSheets, sheet];
|
|
129
128
|
} else if (renderRoot.adoptedStyleSheets.includes(sheet)) {
|
|
130
129
|
// @ts-ignore
|
|
131
130
|
// eslint-disable-next-line no-param-reassign
|
|
@@ -8,7 +8,6 @@ import { isVisible } from './is-visible.js';
|
|
|
8
8
|
import { sortByTabIndex } from './sort-by-tabindex.js';
|
|
9
9
|
|
|
10
10
|
// IE11 supports matches as 'msMatchesSelector'
|
|
11
|
-
/** @type {'matches' | 'msMatchesSelector'} */
|
|
12
11
|
const matchesFunc = 'matches' in Element.prototype ? 'matches' : 'msMatchesSelector';
|
|
13
12
|
|
|
14
13
|
/**
|
|
@@ -17,14 +16,11 @@ const matchesFunc = 'matches' in Element.prototype ? 'matches' : 'msMatchesSelec
|
|
|
17
16
|
*/
|
|
18
17
|
function isFocusable(element) {
|
|
19
18
|
// Elements that cannot be focused if they have [disabled] attribute.
|
|
20
|
-
// @ts-ignore - msMatchesSelector is legacy
|
|
21
19
|
if (element[matchesFunc]('input, select, textarea, button, object')) {
|
|
22
|
-
// @ts-ignore
|
|
23
20
|
return element[matchesFunc](':not([disabled])');
|
|
24
21
|
}
|
|
25
22
|
|
|
26
23
|
// Elements that can be focused even if they have [disabled] attribute.
|
|
27
|
-
// @ts-ignore
|
|
28
24
|
return element[matchesFunc]('a[href], area[href], iframe, [tabindex], [contentEditable]');
|
|
29
25
|
}
|
|
30
26
|
|
|
@@ -12,17 +12,13 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export function isEqualConfig(a, b) {
|
|
14
14
|
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
|
|
15
|
-
if (typeof a === 'function' && typeof b === 'function') {
|
|
16
|
-
return /** @type {Function} */ (a).toString() === /** @type {Function} */ (b).toString();
|
|
17
|
-
}
|
|
18
15
|
return a === b;
|
|
19
16
|
}
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
const aProps = Object.keys(a);
|
|
18
|
+
const bProps = Object.keys(b);
|
|
19
|
+
if (aProps.length !== bProps.length) {
|
|
20
|
+
return false;
|
|
22
21
|
}
|
|
23
|
-
|
|
24
|
-
return
|
|
25
|
-
// @ts-ignore - dynamic property access
|
|
26
|
-
isEqualConfig(a[prop], b[prop], prop),
|
|
27
|
-
);
|
|
22
|
+
const isEqual = /** @param {string} prop */ prop => isEqualConfig(a[prop], b[prop]);
|
|
23
|
+
return aProps.every(isEqual);
|
|
28
24
|
}
|
|
@@ -115,35 +115,26 @@ const withLocalTestConfig = () =>
|
|
|
115
115
|
*/
|
|
116
116
|
async function createNestedEscControllers(parentContent) {
|
|
117
117
|
const childContent = /** @type {HTMLDivElement} */ (parentContent.querySelector('div[id]'));
|
|
118
|
+
// Assert valid fixure
|
|
119
|
+
const isValidFixture =
|
|
120
|
+
(parentContent.id.startsWith('parent-overlay--hidesOnEsc') ||
|
|
121
|
+
parentContent.id.startsWith('parent-overlay--hidesOnOutsideEsc')) &&
|
|
122
|
+
(childContent.id.startsWith('child-overlay--hidesOnEsc') ||
|
|
123
|
+
childContent.id.startsWith('child-overlay--hidesOnOutsideEsc'));
|
|
124
|
+
if (!isValidFixture) {
|
|
125
|
+
throw new Error('Provide a valid fixture');
|
|
126
|
+
}
|
|
118
127
|
|
|
119
128
|
if (parentContent.hasAttribute('data-convert-to-shadow-root')) {
|
|
120
129
|
const shadowRootParent = parentContent.attachShadow({ mode: 'open' });
|
|
121
130
|
shadowRootParent.appendChild(childContent);
|
|
122
131
|
}
|
|
123
132
|
|
|
124
|
-
const parentConfig = {};
|
|
125
|
-
const childConfig = {};
|
|
126
|
-
|
|
127
133
|
const parentHasOutsideOnEsc = parentContent.id.startsWith('parent-overlay--hidesOnOutsideEsc');
|
|
128
134
|
const childHasOutsideOnEsc = childContent.id.startsWith('child-overlay--hidesOnOutsideEsc');
|
|
129
135
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
} else {
|
|
133
|
-
parentConfig.hidesOnEsc = true;
|
|
134
|
-
}
|
|
135
|
-
if (childHasOutsideOnEsc) {
|
|
136
|
-
childConfig.hidesOnOutsideEsc = true;
|
|
137
|
-
} else {
|
|
138
|
-
childConfig.hidesOnEsc = true;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const parentHasSyncChildrenCloseState =
|
|
142
|
-
parentContent.dataset.syncChildrenCloseState !== undefined;
|
|
143
|
-
|
|
144
|
-
if (parentHasSyncChildrenCloseState) {
|
|
145
|
-
parentConfig.syncChildrenCloseState = true;
|
|
146
|
-
}
|
|
136
|
+
const parentConfig = parentHasOutsideOnEsc ? { hidesOnOutsideEsc: true } : { hidesOnEsc: true };
|
|
137
|
+
const childConfig = childHasOutsideOnEsc ? { hidesOnOutsideEsc: true } : { hidesOnEsc: true };
|
|
147
138
|
|
|
148
139
|
const parentOverlay = new OverlayController({
|
|
149
140
|
...withGlobalTestConfig(),
|
|
@@ -292,9 +283,8 @@ describe('OverlayController', () => {
|
|
|
292
283
|
contentNode,
|
|
293
284
|
});
|
|
294
285
|
};
|
|
295
|
-
|
|
296
286
|
expect(createOverlayController).to.throw(
|
|
297
|
-
'[OverlayController] Could not find a render target,
|
|
287
|
+
'[OverlayController] Could not find a render target, since the provided contentNode is not connected to the DOM. Make sure that it is connected, e.g. by doing "document.body.appendChild(contentNode)", before passing it on.',
|
|
298
288
|
);
|
|
299
289
|
});
|
|
300
290
|
|
|
@@ -356,21 +346,6 @@ describe('OverlayController', () => {
|
|
|
356
346
|
await ctrl.hide();
|
|
357
347
|
expect(ctrl.isShown).to.be.false;
|
|
358
348
|
});
|
|
359
|
-
|
|
360
|
-
// it('cleans up the dom structure it created', async () => {
|
|
361
|
-
// const contentNode = /** @type {HTMLElement} */ (fixtureSync(html`<div>my content</div>`));
|
|
362
|
-
// const ctrl = new OverlayController({
|
|
363
|
-
// placementMode: 'global',
|
|
364
|
-
// contentNode,
|
|
365
|
-
// });
|
|
366
|
-
// await ctrl.show();
|
|
367
|
-
// expect(ctrl.contentWrapperNode).to.exist;
|
|
368
|
-
// expect(ctrl.__wrappingDialogNode).to.exist;
|
|
369
|
-
|
|
370
|
-
// await ctrl.teardown();
|
|
371
|
-
// expect(ctrl.contentWrapperNode).to.not.exist;
|
|
372
|
-
// expect(ctrl.__wrappingDialogNode).to.not.exist;
|
|
373
|
-
// });
|
|
374
349
|
});
|
|
375
350
|
|
|
376
351
|
describe('Node Configuration', () => {
|
|
@@ -428,7 +403,7 @@ describe('OverlayController', () => {
|
|
|
428
403
|
{ ignoreAttributes: ['closedby'] },
|
|
429
404
|
);
|
|
430
405
|
|
|
431
|
-
expect(el).lightDom.to.equal(`<div
|
|
406
|
+
expect(el).lightDom.to.equal(`<div slot="content">projected</div>`);
|
|
432
407
|
});
|
|
433
408
|
});
|
|
434
409
|
|
|
@@ -450,7 +425,7 @@ describe('OverlayController', () => {
|
|
|
450
425
|
`
|
|
451
426
|
<dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
|
|
452
427
|
<div data-id="content-wrapper">
|
|
453
|
-
<div
|
|
428
|
+
<div id="content">non projected</div>
|
|
454
429
|
</div>
|
|
455
430
|
</dialog>
|
|
456
431
|
`,
|
|
@@ -645,7 +620,6 @@ describe('OverlayController', () => {
|
|
|
645
620
|
});
|
|
646
621
|
});
|
|
647
622
|
|
|
648
|
-
// TODO: make features modular (so they can be treeshaken) and test their lifecycle within this desrcibe
|
|
649
623
|
describe('Feature Configuration', () => {
|
|
650
624
|
describe('trapsKeyboardFocus', () => {
|
|
651
625
|
it('focuses the overlay on show', async () => {
|
|
@@ -1014,7 +988,6 @@ describe('OverlayController', () => {
|
|
|
1014
988
|
});
|
|
1015
989
|
});
|
|
1016
990
|
});
|
|
1017
|
-
|
|
1018
991
|
describe('hidesOnOutsideClick', () => {
|
|
1019
992
|
it('hides on outside click', async () => {
|
|
1020
993
|
const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
|
|
@@ -1735,91 +1708,6 @@ describe('OverlayController', () => {
|
|
|
1735
1708
|
expect(ctrl1.hasActiveBackdrop).to.be.true;
|
|
1736
1709
|
});
|
|
1737
1710
|
});
|
|
1738
|
-
|
|
1739
|
-
describe('focusContentOnOpen', () => {
|
|
1740
|
-
it('adds tabindex="-1" to the content node when focusContentOnOpen is true', async () => {
|
|
1741
|
-
const ctrl = new OverlayController({
|
|
1742
|
-
...withGlobalTestConfig(),
|
|
1743
|
-
isBlocking: false,
|
|
1744
|
-
focusContentOnOpen: true,
|
|
1745
|
-
});
|
|
1746
|
-
const contentNode = /** @type {HTMLElement} */ (await fixture('<div>Content</div>'));
|
|
1747
|
-
ctrl.updateConfig({ contentNode });
|
|
1748
|
-
await ctrl.show();
|
|
1749
|
-
expect(contentNode.getAttribute('tabindex')).to.equal('-1');
|
|
1750
|
-
});
|
|
1751
|
-
|
|
1752
|
-
it('makes contentNode the root of "next tab flow"', async () => {
|
|
1753
|
-
const ctrl = new OverlayController({
|
|
1754
|
-
...withGlobalTestConfig(),
|
|
1755
|
-
isBlocking: false,
|
|
1756
|
-
focusContentOnOpen: true,
|
|
1757
|
-
});
|
|
1758
|
-
const contentNode = /** @type {HTMLElement} */ (
|
|
1759
|
-
await fixture('<div><button>Button</button></div>')
|
|
1760
|
-
);
|
|
1761
|
-
ctrl.updateConfig({ contentNode });
|
|
1762
|
-
await ctrl.show();
|
|
1763
|
-
const button = /** @type {HTMLButtonElement} */ (contentNode.querySelector('button'));
|
|
1764
|
-
button.focus();
|
|
1765
|
-
expect(isActiveElement(button)).to.be.true;
|
|
1766
|
-
});
|
|
1767
|
-
});
|
|
1768
|
-
|
|
1769
|
-
describe('syncChildrenCloseState', () => {
|
|
1770
|
-
it('does not close all children of nested controllers when syncChildrenCloseState is false', async () => {
|
|
1771
|
-
const parentContent = /** @type {HTMLDivElement} */ (
|
|
1772
|
-
await fixture(
|
|
1773
|
-
html` <!-- -->
|
|
1774
|
-
<div data-sync-children-close-state id="parent-overlay">
|
|
1775
|
-
<div id="child-overlay">we open our child and it will close when parent does</div>
|
|
1776
|
-
</div>`,
|
|
1777
|
-
)
|
|
1778
|
-
);
|
|
1779
|
-
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1780
|
-
expect(parentOverlay.isShown).to.be.true;
|
|
1781
|
-
expect(childOverlay.isShown).to.be.true;
|
|
1782
|
-
|
|
1783
|
-
await parentOverlay.hide();
|
|
1784
|
-
await childOverlay._hideComplete;
|
|
1785
|
-
expect(parentOverlay.isShown).to.be.false;
|
|
1786
|
-
expect(childOverlay.isShown).to.be.false;
|
|
1787
|
-
});
|
|
1788
|
-
|
|
1789
|
-
it('does not close all children of nested controllers when syncChildrenCloseState is false', async () => {
|
|
1790
|
-
const parentContent = /** @type {HTMLDivElement} */ (
|
|
1791
|
-
await fixture(
|
|
1792
|
-
html` <!-- -->
|
|
1793
|
-
<div id="parent-overlay">
|
|
1794
|
-
<div id="child-overlay">
|
|
1795
|
-
we open our child and it will not close when parent does
|
|
1796
|
-
</div>
|
|
1797
|
-
</div>`,
|
|
1798
|
-
)
|
|
1799
|
-
);
|
|
1800
|
-
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1801
|
-
expect(parentOverlay.isShown).to.be.true;
|
|
1802
|
-
expect(childOverlay.isShown).to.be.true;
|
|
1803
|
-
|
|
1804
|
-
await parentOverlay.hide();
|
|
1805
|
-
expect(parentOverlay.isShown).to.be.false;
|
|
1806
|
-
expect(childOverlay.isShown).to.be.true;
|
|
1807
|
-
});
|
|
1808
|
-
});
|
|
1809
|
-
|
|
1810
|
-
describe('isActivated', () => {
|
|
1811
|
-
it('allows to conditionally disable overlay/openable functionality (for responsive context like nav menus, accordions/collapsibles vs plain headings/content etc.)', async () => {
|
|
1812
|
-
const ctrl = new OverlayController({
|
|
1813
|
-
...withGlobalTestConfig(),
|
|
1814
|
-
isActivated: false,
|
|
1815
|
-
});
|
|
1816
|
-
expect(ctrl.__hasSetup).to.be.false;
|
|
1817
|
-
ctrl.updateConfig({
|
|
1818
|
-
isActivated: true,
|
|
1819
|
-
});
|
|
1820
|
-
expect(ctrl.__hasSetup).to.be.true;
|
|
1821
|
-
});
|
|
1822
|
-
});
|
|
1823
1711
|
});
|
|
1824
1712
|
|
|
1825
1713
|
describe('Show / Hide / Toggle', () => {
|
|
@@ -2410,7 +2298,6 @@ describe('OverlayController', () => {
|
|
|
2410
2298
|
});
|
|
2411
2299
|
|
|
2412
2300
|
it('should run with scroll prevention', async () => {
|
|
2413
|
-
await overlayControllerPreventsScroll.hide();
|
|
2414
2301
|
await overlayControllerPreventsScroll.show();
|
|
2415
2302
|
|
|
2416
2303
|
expect(
|
|
@@ -48,7 +48,7 @@ describe('isEqualConfig()', () => {
|
|
|
48
48
|
expect(isEqualConfig({ ...config, isBlocking: true }, config)).eql(false);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
it
|
|
51
|
+
it('regards missing props different from ones with undefined value', () => {
|
|
52
52
|
const config = TestConfig();
|
|
53
53
|
expect(isEqualConfig(config, { ...config, referenceNode: undefined })).eql(false);
|
|
54
54
|
});
|
|
@@ -537,13 +537,13 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
537
537
|
it('works with cache directive when reconnected', async () => {
|
|
538
538
|
class CachingContext extends LitElement {
|
|
539
539
|
static properties = {
|
|
540
|
-
|
|
540
|
+
switched: { type: Boolean },
|
|
541
541
|
};
|
|
542
542
|
|
|
543
543
|
constructor() {
|
|
544
544
|
super();
|
|
545
545
|
|
|
546
|
-
this.
|
|
546
|
+
this.switched = false;
|
|
547
547
|
}
|
|
548
548
|
|
|
549
549
|
get overlayEl() {
|
|
@@ -552,12 +552,12 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
552
552
|
|
|
553
553
|
render() {
|
|
554
554
|
return html`${cache(
|
|
555
|
-
this.
|
|
556
|
-
? html
|
|
555
|
+
this.switched
|
|
556
|
+
? html`something else`
|
|
557
|
+
: html`<${tag} id="myOverlay">
|
|
557
558
|
<div slot="content">content b</div>
|
|
558
559
|
<button slot="invoker">invoker button b</button>
|
|
559
|
-
</${tag}
|
|
560
|
-
: html`something else`,
|
|
560
|
+
</${tag}>`,
|
|
561
561
|
)}`;
|
|
562
562
|
}
|
|
563
563
|
}
|
|
@@ -578,7 +578,7 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
578
578
|
// @ts-expect-error [allow-protected] in tests
|
|
579
579
|
const setupSpy = sinon.spy(el.overlayEl, '_setupOverlayCtrl');
|
|
580
580
|
|
|
581
|
-
el.
|
|
581
|
+
el.switched = true;
|
|
582
582
|
// render the new content
|
|
583
583
|
await el.updateComplete;
|
|
584
584
|
// wait for the teardown to complete
|
|
@@ -588,7 +588,7 @@ export function runOverlayMixinSuite({ tagString, tag, suffix = '' }) {
|
|
|
588
588
|
expect(teardownSpy.callCount).to.equal(1);
|
|
589
589
|
expect(setupSpy.callCount).to.equal(0);
|
|
590
590
|
|
|
591
|
-
el.
|
|
591
|
+
el.switched = false;
|
|
592
592
|
await el.updateComplete;
|
|
593
593
|
expect(setupSpy.callCount).to.equal(1);
|
|
594
594
|
|