@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
|
@@ -3,7 +3,6 @@ import { deepContains } from './utils/deep-contains.js';
|
|
|
3
3
|
import { overlayShadowDomStyle } from './overlayShadowDomStyle.js';
|
|
4
4
|
import { _adoptStyleUtils } from './utils/adopt-styles.js';
|
|
5
5
|
import { getFocusableElements } from './utils/get-focusable-elements.js';
|
|
6
|
-
import { isEqualConfig } from './utils/is-equal-config.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* @typedef {import('@lion/ui/types/overlays.js').OverlayPhase} OverlayPhase
|
|
@@ -33,37 +32,27 @@ import { isEqualConfig } from './utils/is-equal-config.js';
|
|
|
33
32
|
* `<slot name="my-content">` belonging to `<div slot="content"/>` will be wrapped with wrappingDialogNodeL1 and contentWrapperNodeL2
|
|
34
33
|
* inside shadow dom. With the help of temp markers, `<slot name="my-content">`'s original position will be respected.
|
|
35
34
|
*
|
|
36
|
-
* @param {{
|
|
37
|
-
* wrappingDialogNodeL1: HTMLDialogElement|HTMLDivElement;
|
|
38
|
-
* contentWrapperNodeL2:Element;
|
|
39
|
-
* contentNodeL3: Element;
|
|
40
|
-
* }} opts
|
|
35
|
+
* @param {{ wrappingDialogNodeL1:HTMLDialogElement|HTMLDivElement; contentWrapperNodeL2:Element; contentNodeL3: Element }} opts
|
|
41
36
|
*/
|
|
42
37
|
function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNodeL3 }) {
|
|
43
|
-
|
|
44
|
-
// we assume it lives in shadow dom around a slot.
|
|
45
|
-
const hasLegacyMethodOfProvidingWrapperNode = Boolean(contentWrapperNodeL2.isConnected);
|
|
46
|
-
// We could be initialized via a directive (in offline dom). It's important that we know about the parents,
|
|
47
|
-
// as we cannot deal with single content nodes
|
|
48
|
-
const hasContentNodeAttachmentPoints = Boolean(contentNodeL3.parentNode);
|
|
49
|
-
|
|
50
|
-
if (!hasLegacyMethodOfProvidingWrapperNode && !hasContentNodeAttachmentPoints) {
|
|
38
|
+
if (!(contentWrapperNodeL2.isConnected || contentNodeL3.isConnected)) {
|
|
51
39
|
throw new Error(
|
|
52
|
-
'[OverlayController] Could not find a render target,
|
|
40
|
+
'[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.',
|
|
53
41
|
);
|
|
54
42
|
}
|
|
55
43
|
|
|
56
|
-
/** @type {Node} */
|
|
57
44
|
let parentElement;
|
|
58
|
-
const tempMarker = document.createComment('
|
|
45
|
+
const tempMarker = document.createComment('tempMarker');
|
|
59
46
|
|
|
60
|
-
if (
|
|
47
|
+
if (contentWrapperNodeL2.isConnected) {
|
|
61
48
|
// This is the case when contentWrapperNode (living in shadow dom, wrapping <slot name="my-content-outlet">) is already provided via controller.
|
|
62
49
|
parentElement = contentWrapperNodeL2.parentElement || contentWrapperNodeL2.getRootNode();
|
|
63
50
|
parentElement.insertBefore(tempMarker, contentWrapperNodeL2);
|
|
64
51
|
// Wrap...
|
|
65
52
|
wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
|
|
66
|
-
}
|
|
53
|
+
}
|
|
54
|
+
// if contentNodeL3.isConnected
|
|
55
|
+
else {
|
|
67
56
|
const contentIsProjected = contentNodeL3.assignedSlot;
|
|
68
57
|
if (contentIsProjected) {
|
|
69
58
|
parentElement =
|
|
@@ -104,22 +93,7 @@ function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNod
|
|
|
104
93
|
* ```
|
|
105
94
|
*/
|
|
106
95
|
parentElement.insertBefore(wrappingDialogNodeL1, tempMarker);
|
|
107
|
-
|
|
108
|
-
return function cleanup() {
|
|
109
|
-
if (hasLegacyMethodOfProvidingWrapperNode) {
|
|
110
|
-
parentElement?.insertBefore(contentWrapperNodeL2, tempMarker);
|
|
111
|
-
} else {
|
|
112
|
-
parentElement?.insertBefore(contentNodeL3, tempMarker);
|
|
113
|
-
if (parentElement.contains(contentWrapperNodeL2)) {
|
|
114
|
-
contentWrapperNodeL2.remove();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
parentElement?.removeChild(tempMarker);
|
|
118
|
-
|
|
119
|
-
if (parentElement.contains(wrappingDialogNodeL1)) {
|
|
120
|
-
parentElement?.removeChild(wrappingDialogNodeL1);
|
|
121
|
-
}
|
|
122
|
-
};
|
|
96
|
+
parentElement?.removeChild(tempMarker);
|
|
123
97
|
}
|
|
124
98
|
|
|
125
99
|
/**
|
|
@@ -132,21 +106,6 @@ async function preloadPopper() {
|
|
|
132
106
|
|
|
133
107
|
const childDialogsClosedInEventLoopWeakmap = new WeakMap();
|
|
134
108
|
|
|
135
|
-
/**
|
|
136
|
-
* @param {HTMLElement | null} el
|
|
137
|
-
* @param {string} selector
|
|
138
|
-
* @returns {HTMLElement | null}
|
|
139
|
-
*/
|
|
140
|
-
function deepClosest(el, selector) {
|
|
141
|
-
// @ts-ignore - comparing HTMLElement to document/window for safety
|
|
142
|
-
return (
|
|
143
|
-
// @ts-ignore - type comparison check
|
|
144
|
-
(el && el !== document && el !== window && el.closest(selector)) ||
|
|
145
|
-
// @ts-ignore - host property on ShadowRoot
|
|
146
|
-
deepClosest(el.getRootNode().host, selector)
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
109
|
/**
|
|
151
110
|
* OverlayController is the fundament for every single type of overlay. With the right
|
|
152
111
|
* configuration, it can be used to build (modal) dialogs, tooltips, dropdowns, popovers,
|
|
@@ -237,25 +196,10 @@ export class OverlayController extends EventTarget {
|
|
|
237
196
|
placement: 'center',
|
|
238
197
|
},
|
|
239
198
|
zIndex: 9999,
|
|
240
|
-
isActivated: true,
|
|
241
|
-
focusContentOnOpen: false,
|
|
242
|
-
// This means that content will have visually-hidden / sr-only styles. This is handy for:
|
|
243
|
-
// - hidden menus that should be "indexable" by screen readers (like the Links list in VO: https://support.apple.com/en-gb/guide/voiceover/mchlp2719/mac)
|
|
244
|
-
// - "more" menus that put content in a dropdown that do not fit in the current row
|
|
245
|
-
// - menus that should generally open on tab.
|
|
246
|
-
// @ts-ignore - hideVisually is an extension property
|
|
247
|
-
hideVisually: false,
|
|
248
|
-
requireConnectedNodes: true,
|
|
249
|
-
|
|
250
|
-
// hides children overlays when parent is closed...
|
|
251
|
-
syncChildrenCloseState: false,
|
|
252
|
-
// // In next major, we remove this prop. Now we disable it for backwards compatibility and enable it in the places we need it internally
|
|
253
|
-
// _shouldTeardownDomStructure: false,
|
|
254
199
|
};
|
|
255
200
|
|
|
256
201
|
/** @protected */
|
|
257
202
|
this._contentId = `overlay-content--${Math.random().toString(36).slice(2, 10)}`;
|
|
258
|
-
|
|
259
203
|
/** @private */
|
|
260
204
|
this.__originalAttrs = new Map();
|
|
261
205
|
/** @private */
|
|
@@ -276,8 +220,6 @@ export class OverlayController extends EventTarget {
|
|
|
276
220
|
this.__escKeyHandlerCalled = false;
|
|
277
221
|
}
|
|
278
222
|
|
|
279
|
-
__hasSetup = false;
|
|
280
|
-
|
|
281
223
|
/**
|
|
282
224
|
* The invokerNode
|
|
283
225
|
* @type {HTMLElement | undefined}
|
|
@@ -296,7 +238,7 @@ export class OverlayController extends EventTarget {
|
|
|
296
238
|
|
|
297
239
|
/**
|
|
298
240
|
* Determines the connection point in DOM (body vs next to invoker).
|
|
299
|
-
* @type {'global' | 'local' |
|
|
241
|
+
* @type {'global' | 'local' | undefined}
|
|
300
242
|
*/
|
|
301
243
|
get placementMode() {
|
|
302
244
|
return this.config?.placementMode;
|
|
@@ -521,14 +463,17 @@ export class OverlayController extends EventTarget {
|
|
|
521
463
|
* @param { OverlayConfig } cfgToAdd
|
|
522
464
|
*/
|
|
523
465
|
updateConfig(cfgToAdd) {
|
|
466
|
+
// Teardown all previous configs
|
|
467
|
+
this.teardown();
|
|
468
|
+
|
|
524
469
|
/**
|
|
525
470
|
* @type {OverlayConfig}
|
|
526
471
|
* @private
|
|
527
472
|
*/
|
|
528
|
-
|
|
473
|
+
this.__prevConfig = this.config;
|
|
529
474
|
|
|
530
475
|
/** @type {OverlayConfig} */
|
|
531
|
-
|
|
476
|
+
this.config = {
|
|
532
477
|
...this._defaultConfig, // our basic ingredients
|
|
533
478
|
...this.__sharedConfig, // the initial configured overlayController
|
|
534
479
|
...cfgToAdd, // the added config
|
|
@@ -544,18 +489,12 @@ export class OverlayController extends EventTarget {
|
|
|
544
489
|
},
|
|
545
490
|
};
|
|
546
491
|
|
|
547
|
-
const shouldUpdate = !this.__hasSetup || !isEqualConfig(prevConfig, newConfig);
|
|
548
|
-
if (!shouldUpdate) return;
|
|
549
|
-
// Teardown all previous configs
|
|
550
|
-
|
|
551
|
-
this.teardown();
|
|
552
|
-
|
|
553
|
-
this.config = newConfig;
|
|
554
|
-
|
|
555
492
|
/** @private */
|
|
556
493
|
this.__validateConfiguration(this.config);
|
|
557
494
|
/** @protected */
|
|
558
495
|
this._init();
|
|
496
|
+
/** @private */
|
|
497
|
+
this.__elementToFocusAfterHide = undefined;
|
|
559
498
|
|
|
560
499
|
if (!this.#isRegisteredOnManager()) {
|
|
561
500
|
this.manager.add(this);
|
|
@@ -577,7 +516,7 @@ export class OverlayController extends EventTarget {
|
|
|
577
516
|
'[OverlayController] You need to provide a .placementMode ("global"|"local")',
|
|
578
517
|
);
|
|
579
518
|
}
|
|
580
|
-
if (!['global', 'local'
|
|
519
|
+
if (!['global', 'local'].includes(newConfig.placementMode)) {
|
|
581
520
|
throw new Error(
|
|
582
521
|
`[OverlayController] "${newConfig.placementMode}" is not a valid .placementMode, use ("global"|"local")`,
|
|
583
522
|
);
|
|
@@ -596,23 +535,14 @@ export class OverlayController extends EventTarget {
|
|
|
596
535
|
* @protected
|
|
597
536
|
*/
|
|
598
537
|
_init() {
|
|
599
|
-
if (!this.
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
// and popper.js, (use popover and anchor positioning and popperjs as fallback, but we can put styles on contentNode),
|
|
604
|
-
// we dont need to create complex wrappers
|
|
605
|
-
// if (!this.__contentHasBeenInitialized) {
|
|
606
|
-
this.__initContentDomStructure();
|
|
607
|
-
// this.__contentHasBeenInitialized = true;
|
|
608
|
-
// }
|
|
609
|
-
this.__initVisibility();
|
|
538
|
+
if (!this.__contentHasBeenInitialized) {
|
|
539
|
+
this.__initContentDomStructure();
|
|
540
|
+
this.__contentHasBeenInitialized = true;
|
|
541
|
+
}
|
|
610
542
|
|
|
611
543
|
// Reset all positioning styles (local, c.q. Popper) and classes (global)
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
this.contentWrapperNode.removeAttribute('class');
|
|
615
|
-
}
|
|
544
|
+
this.contentWrapperNode.removeAttribute('style');
|
|
545
|
+
this.contentWrapperNode.removeAttribute('class');
|
|
616
546
|
|
|
617
547
|
if (this.placementMode === 'local') {
|
|
618
548
|
// Lazily load Popper as soon as the first local overlay is used...
|
|
@@ -622,27 +552,8 @@ export class OverlayController extends EventTarget {
|
|
|
622
552
|
}
|
|
623
553
|
this.__handleOverlayStyles({ phase: 'init' });
|
|
624
554
|
this._handleFeatures({ phase: 'init' });
|
|
625
|
-
|
|
626
|
-
/** @private */
|
|
627
|
-
this.__elementToFocusAfterHide = undefined;
|
|
628
|
-
|
|
629
|
-
this.contentNode.dataset.content = '';
|
|
630
|
-
|
|
631
|
-
// Use event delegation to listen for clicks on close buttons...
|
|
632
|
-
this.contentNode.addEventListener('click', this.#hideOnCloseButtonClick);
|
|
633
|
-
|
|
634
|
-
this.__hasSetup = true;
|
|
635
555
|
}
|
|
636
556
|
|
|
637
|
-
#hideOnCloseButtonClick = (/** @type {{ target: any; }} */ ev) => {
|
|
638
|
-
const isOurCloseButton =
|
|
639
|
-
ev.target.hasAttribute('data-close') &&
|
|
640
|
-
deepClosest(ev.target, '[data-content]') === this.contentNode;
|
|
641
|
-
if (!isOurCloseButton) return;
|
|
642
|
-
|
|
643
|
-
this.hide();
|
|
644
|
-
};
|
|
645
|
-
|
|
646
557
|
/**
|
|
647
558
|
* @param {{ phase: OverlayPhase }} config
|
|
648
559
|
* @private
|
|
@@ -683,108 +594,84 @@ export class OverlayController extends EventTarget {
|
|
|
683
594
|
* @private
|
|
684
595
|
*/
|
|
685
596
|
__initContentDomStructure() {
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
// @ts-ignore - 'custom' is a valid extension of placementMode
|
|
704
|
-
if (this.config.placementMode === 'custom') {
|
|
705
|
-
// The user should have full freedom to control the content node, so its wrapper nodes should remain neutral.
|
|
706
|
-
wrappingDialogElement.style.cssText += `position: static;`;
|
|
707
|
-
}
|
|
708
|
-
this.__wrappingDialogNode = wrappingDialogElement;
|
|
597
|
+
const wrappingDialogElement = document.createElement('dialog');
|
|
598
|
+
// We use a dialog for its visual capabilities: it renders to the top layer.
|
|
599
|
+
// A11y will depend on the type of overlay and is arranged on contentNode level.
|
|
600
|
+
// Also see: https://www.scottohara.me/blog/2019/03/05/open-dialog.html
|
|
601
|
+
//
|
|
602
|
+
// The role="dialog" is set on the contentNode (or another role), so role="none"
|
|
603
|
+
// is valid here, although AXE complains about this setup.
|
|
604
|
+
// For now we need to add `ignoredRules: ['aria-allowed-role']` in your AXE tests.
|
|
605
|
+
// see: https://lion.js.org/fundamentals/systems/overlays/rationale/#considerations
|
|
606
|
+
wrappingDialogElement.setAttribute('role', 'none');
|
|
607
|
+
wrappingDialogElement.setAttribute('data-overlay-outer-wrapper', '');
|
|
608
|
+
// N.B. position: fixed is needed to escape out of 'overflow: hidden'
|
|
609
|
+
// We give a high z-index for non-modal dialogs, so that we at least win from all siblings of our
|
|
610
|
+
// parent stacking context
|
|
611
|
+
// padding reset so we don't get a weird dialog visual square showing up
|
|
612
|
+
wrappingDialogElement.style.cssText = `display:none; z-index: ${this.config.zIndex}; padding: 0;`;
|
|
613
|
+
this.__wrappingDialogNode = wrappingDialogElement;
|
|
709
614
|
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
this.__rearrangeNodesCleanup = rearrangeNodes({
|
|
722
|
-
wrappingDialogNodeL1: wrappingDialogElement,
|
|
723
|
-
contentWrapperNodeL2: this.contentWrapperNode,
|
|
724
|
-
contentNodeL3: this.contentNode,
|
|
725
|
-
// requireConnectedNodes: Boolean(this.config.requireConnectedNodes),
|
|
726
|
-
});
|
|
727
|
-
wrappingDialogElement.open = true;
|
|
615
|
+
/**
|
|
616
|
+
* Based on the configuration of the developer, multiple scenarios are accounted for
|
|
617
|
+
* A. We already have a contentWrapperNode ()
|
|
618
|
+
*/
|
|
619
|
+
if (!this.config?.contentWrapperNode) {
|
|
620
|
+
this.__contentWrapperNode = document.createElement('div');
|
|
621
|
+
}
|
|
622
|
+
this.contentWrapperNode.setAttribute('data-id', 'content-wrapper');
|
|
623
|
+
// 'hack' that makes sure popperjs (that is applied one level lower) works correctly in deeply nested shadow roots
|
|
624
|
+
this.contentWrapperNode.style.transform = 'translateZ(0px)';
|
|
728
625
|
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
// Having a _contWrapperNode and a contentNode with 'position:absolute' results in
|
|
736
|
-
// computed height of 0...
|
|
737
|
-
this.contentNode.style.position = 'static';
|
|
738
|
-
}
|
|
626
|
+
rearrangeNodes({
|
|
627
|
+
wrappingDialogNodeL1: wrappingDialogElement,
|
|
628
|
+
contentWrapperNodeL2: this.contentWrapperNode,
|
|
629
|
+
contentNodeL3: this.contentNode,
|
|
630
|
+
});
|
|
631
|
+
wrappingDialogElement.open = true;
|
|
739
632
|
|
|
740
|
-
|
|
741
|
-
//
|
|
742
|
-
|
|
743
|
-
const hasClosedBySupport = HTMLDialogElement && 'closedBy' in HTMLDialogElement.prototype;
|
|
744
|
-
if (hasClosedBySupport) {
|
|
745
|
-
// @ts-ignore - closedBy is a newer property not in all TypeScript versions
|
|
746
|
-
wrappingDialogElement.closedBy = 'none';
|
|
747
|
-
} else {
|
|
748
|
-
wrappingDialogElement.addEventListener(
|
|
749
|
-
'keydown',
|
|
750
|
-
(/** @type {* & KeyboardEvent} */ event) => {
|
|
751
|
-
if (event.key === 'Escape') {
|
|
752
|
-
event.preventDefault();
|
|
753
|
-
}
|
|
754
|
-
},
|
|
755
|
-
);
|
|
756
|
-
wrappingDialogElement.addEventListener(
|
|
757
|
-
'keyup',
|
|
758
|
-
(/** @type {* & KeyboardEvent} */ event) => {
|
|
759
|
-
if (event.key === 'Escape') {
|
|
760
|
-
event.preventDefault();
|
|
761
|
-
}
|
|
762
|
-
},
|
|
763
|
-
);
|
|
764
|
-
wrappingDialogElement.addEventListener('cancel', event => {
|
|
765
|
-
event.stopPropagation();
|
|
766
|
-
});
|
|
767
|
-
wrappingDialogElement.addEventListener('close', event => {
|
|
768
|
-
event.stopPropagation();
|
|
769
|
-
});
|
|
770
|
-
}
|
|
771
|
-
} else {
|
|
772
|
-
// quick hack to make none-popper/global flows work...
|
|
773
|
-
this.__contentWrapperNode = this.contentNode;
|
|
774
|
-
this.__wrappingDialogNode = this.contentNode;
|
|
633
|
+
if (this.isTooltip) {
|
|
634
|
+
// needed to prevent tooltip getting focus in Safari and Firefox
|
|
635
|
+
wrappingDialogElement.setAttribute('tabindex', '-1');
|
|
775
636
|
}
|
|
776
|
-
}
|
|
777
637
|
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
/** @type {HTMLDialogElement} */ (this.__wrappingDialogNode).style.display = 'none';
|
|
781
|
-
}
|
|
638
|
+
this.__wrappingDialogNode.style.display = 'none';
|
|
639
|
+
this.contentWrapperNode.style.zIndex = '1';
|
|
782
640
|
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
641
|
+
if (getComputedStyle(this.contentNode).position === 'absolute') {
|
|
642
|
+
// Having a _contWrapperNode and a contentNode with 'position:absolute' results in
|
|
643
|
+
// computed height of 0...
|
|
644
|
+
this.contentNode.style.position = 'static';
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// Here we prevent any interference of the native <dialog> element with the keyboard behavior
|
|
648
|
+
// as defined by the OverlayController. This is needed until we can configure `closedby="none"`
|
|
649
|
+
// on the native dialog for all browsers: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby
|
|
650
|
+
const hasClosedBySupport = HTMLDialogElement && 'closedBy' in HTMLDialogElement.prototype;
|
|
651
|
+
if (hasClosedBySupport) {
|
|
652
|
+
// @ts-expect-error
|
|
653
|
+
wrappingDialogElement.closedBy = 'none';
|
|
654
|
+
} else {
|
|
655
|
+
wrappingDialogElement.addEventListener(
|
|
656
|
+
'keydown',
|
|
657
|
+
(/** @type {* & KeyboardEvent} */ event) => {
|
|
658
|
+
if (event.key === 'Escape') {
|
|
659
|
+
event.preventDefault();
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
);
|
|
663
|
+
wrappingDialogElement.addEventListener('keyup', (/** @type {* & KeyboardEvent} */ event) => {
|
|
664
|
+
if (event.key === 'Escape') {
|
|
665
|
+
event.preventDefault();
|
|
666
|
+
}
|
|
667
|
+
});
|
|
668
|
+
wrappingDialogElement.addEventListener('cancel', event => {
|
|
669
|
+
event.stopPropagation();
|
|
670
|
+
});
|
|
671
|
+
wrappingDialogElement.addEventListener('close', event => {
|
|
672
|
+
event.stopPropagation();
|
|
673
|
+
});
|
|
674
|
+
}
|
|
788
675
|
}
|
|
789
676
|
|
|
790
677
|
/**
|
|
@@ -855,7 +742,6 @@ export class OverlayController extends EventTarget {
|
|
|
855
742
|
* @private
|
|
856
743
|
*/
|
|
857
744
|
__storeOriginalAttrs(node, attrs) {
|
|
858
|
-
/** @type {Record<string, string | null>} */
|
|
859
745
|
const attrMap = {};
|
|
860
746
|
attrs.forEach(attrName => {
|
|
861
747
|
attrMap[attrName] = node.getAttribute(attrName);
|
|
@@ -912,7 +798,6 @@ export class OverlayController extends EventTarget {
|
|
|
912
798
|
if ('HTMLDialogElement' in window && this.__wrappingDialogNode instanceof HTMLDialogElement) {
|
|
913
799
|
this.__wrappingDialogNode.open = true;
|
|
914
800
|
}
|
|
915
|
-
|
|
916
801
|
// @ts-ignore
|
|
917
802
|
this.__wrappingDialogNode.style.display = '';
|
|
918
803
|
this._keepBodySize({ phase: 'before-show' });
|
|
@@ -926,14 +811,6 @@ export class OverlayController extends EventTarget {
|
|
|
926
811
|
contentNode: this.contentNode,
|
|
927
812
|
});
|
|
928
813
|
}
|
|
929
|
-
|
|
930
|
-
// a styling/debug hook for open state
|
|
931
|
-
this.contentNode.setAttribute('data-open', '');
|
|
932
|
-
|
|
933
|
-
if (this.config.focusContentOnOpen) {
|
|
934
|
-
this.contentNode.focus({ preventScroll: true });
|
|
935
|
-
}
|
|
936
|
-
|
|
937
814
|
/** @type {function} */
|
|
938
815
|
(this._showResolve)();
|
|
939
816
|
}
|
|
@@ -966,7 +843,6 @@ export class OverlayController extends EventTarget {
|
|
|
966
843
|
await this.__createPopperInstance();
|
|
967
844
|
this._popper.forceUpdate();
|
|
968
845
|
}
|
|
969
|
-
// N.B. leave it up to the user if placementMode === 'custom'
|
|
970
846
|
}
|
|
971
847
|
|
|
972
848
|
/**
|
|
@@ -974,7 +850,9 @@ export class OverlayController extends EventTarget {
|
|
|
974
850
|
* @protected
|
|
975
851
|
*/
|
|
976
852
|
_keepBodySize({ phase }) {
|
|
977
|
-
if (!this.preventsScroll)
|
|
853
|
+
if (!this.preventsScroll) {
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
978
856
|
|
|
979
857
|
this.manager.requestToKeepBodySize({ phase });
|
|
980
858
|
}
|
|
@@ -984,9 +862,6 @@ export class OverlayController extends EventTarget {
|
|
|
984
862
|
* @event hide right after the overlay is hidden
|
|
985
863
|
*/
|
|
986
864
|
async hide() {
|
|
987
|
-
// Function like a no-op for dynamic edge cases...
|
|
988
|
-
if (!this.config.isActivated) return;
|
|
989
|
-
|
|
990
865
|
this._hideComplete = new Promise(resolve => {
|
|
991
866
|
this._hideResolve = resolve;
|
|
992
867
|
});
|
|
@@ -1019,6 +894,7 @@ export class OverlayController extends EventTarget {
|
|
|
1019
894
|
if ('HTMLDialogElement' in window && this.__wrappingDialogNode instanceof HTMLDialogElement) {
|
|
1020
895
|
this.__wrappingDialogNode.close();
|
|
1021
896
|
}
|
|
897
|
+
|
|
1022
898
|
// @ts-ignore
|
|
1023
899
|
this.__wrappingDialogNode.style.display = 'none';
|
|
1024
900
|
this._handleFeatures({ phase: 'hide' });
|
|
@@ -1027,8 +903,6 @@ export class OverlayController extends EventTarget {
|
|
|
1027
903
|
this._restoreFocus();
|
|
1028
904
|
}
|
|
1029
905
|
/** @type {function} */ (this._hideResolve)();
|
|
1030
|
-
|
|
1031
|
-
this.contentNode.removeAttribute('data-open');
|
|
1032
906
|
}
|
|
1033
907
|
|
|
1034
908
|
/**
|
|
@@ -1139,53 +1013,23 @@ export class OverlayController extends EventTarget {
|
|
|
1139
1013
|
if (this.visibilityTriggerFunction) {
|
|
1140
1014
|
this._handleVisibilityTriggers({ phase });
|
|
1141
1015
|
}
|
|
1142
|
-
if (this.config.syncChildrenCloseState) {
|
|
1143
|
-
this._handleSyncChildrenCloseState({ phase });
|
|
1144
|
-
}
|
|
1145
|
-
if (this.config.focusContentOnOpen) {
|
|
1146
|
-
this._handleFocusContentOnOpen({ phase });
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
/**
|
|
1151
|
-
* @param {{phase: OverlayPhase}} opts
|
|
1152
|
-
* @returns {void}
|
|
1153
|
-
*/
|
|
1154
|
-
_handleFocusContentOnOpen({ phase }) {
|
|
1155
|
-
if (phase === 'init') {
|
|
1156
|
-
this.contentNode?.setAttribute('tabindex', '-1');
|
|
1157
|
-
} else if (phase === 'teardown') {
|
|
1158
|
-
// TODO: capture initial attr, use Resettable mechanism of VisibilityToggleCtrl in whole Controller
|
|
1159
|
-
this.contentNode?.removeAttribute('tabindex');
|
|
1160
|
-
}
|
|
1161
|
-
}
|
|
1162
|
-
|
|
1163
|
-
/**
|
|
1164
|
-
* @param {{phase: OverlayPhase}} opts
|
|
1165
|
-
* @returns {void}
|
|
1166
|
-
*/
|
|
1167
|
-
_handleSyncChildrenCloseState({ phase }) {
|
|
1168
|
-
if (phase !== 'hide') return;
|
|
1169
|
-
|
|
1170
|
-
const visibleChildren = this.manager.shownList.filter(
|
|
1171
|
-
ctrl => ctrl !== this && deepContains(this.contentNode, ctrl.contentNode),
|
|
1172
|
-
);
|
|
1173
|
-
visibleChildren.forEach(ctrl => ctrl.hide());
|
|
1174
1016
|
}
|
|
1175
1017
|
|
|
1176
1018
|
/**
|
|
1177
1019
|
* @param {{ phase: OverlayPhase }} config
|
|
1178
1020
|
*/
|
|
1179
1021
|
_handleVisibilityTriggers({ phase }) {
|
|
1180
|
-
if (typeof this.visibilityTriggerFunction
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1022
|
+
if (typeof this.visibilityTriggerFunction === 'function') {
|
|
1023
|
+
if (phase === 'init') {
|
|
1024
|
+
this.__visibilityTriggerHandler = this.visibilityTriggerFunction({
|
|
1025
|
+
phase,
|
|
1026
|
+
controller: this,
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
if (this.__visibilityTriggerHandler[phase]) {
|
|
1030
|
+
this.__visibilityTriggerHandler[phase]();
|
|
1031
|
+
}
|
|
1186
1032
|
}
|
|
1187
|
-
// Here we run the appropriate lifecycle, if defined in our handler
|
|
1188
|
-
this.__visibilityTriggerHandler[phase]?.();
|
|
1189
1033
|
}
|
|
1190
1034
|
|
|
1191
1035
|
/**
|
|
@@ -1342,9 +1186,7 @@ export class OverlayController extends EventTarget {
|
|
|
1342
1186
|
if (phase === 'show') {
|
|
1343
1187
|
this.#handleShiftKeyPress();
|
|
1344
1188
|
this.#handleFocusInsideDialog();
|
|
1345
|
-
// @ts-ignore - HTMLDialogElement methods
|
|
1346
1189
|
this.__wrappingDialogNode?.close();
|
|
1347
|
-
// @ts-ignore - HTMLDialogElement methods
|
|
1348
1190
|
this.__wrappingDialogNode?.showModal();
|
|
1349
1191
|
/**
|
|
1350
1192
|
* At this moment `#handleFocusInsideDialog` should handle the focus.
|
|
@@ -1595,7 +1437,6 @@ export class OverlayController extends EventTarget {
|
|
|
1595
1437
|
}
|
|
1596
1438
|
|
|
1597
1439
|
teardown() {
|
|
1598
|
-
if (!this.__hasSetup) return;
|
|
1599
1440
|
this.__handleOverlayStyles({ phase: 'teardown' });
|
|
1600
1441
|
if (this.isShown) {
|
|
1601
1442
|
this._keepBodySize({ phase: 'teardown' });
|
|
@@ -1604,15 +1445,6 @@ export class OverlayController extends EventTarget {
|
|
|
1604
1445
|
if (this.#isRegisteredOnManager()) {
|
|
1605
1446
|
this.manager.remove(this);
|
|
1606
1447
|
}
|
|
1607
|
-
|
|
1608
|
-
this.contentNode?.removeEventListener('click', this.#hideOnCloseButtonClick);
|
|
1609
|
-
|
|
1610
|
-
// if (this.config._shouldTeardownDomStructure) {
|
|
1611
|
-
this.__rearrangeNodesCleanup?.();
|
|
1612
|
-
// }
|
|
1613
|
-
this.__teardownVisibility();
|
|
1614
|
-
|
|
1615
|
-
this.__hasSetup = false;
|
|
1616
1448
|
}
|
|
1617
1449
|
|
|
1618
1450
|
/** @private */
|