@lion/ui 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/components/accordion/src/LionAccordion.js +31 -42
- package/components/accordion/test/lion-accordion.test.js +108 -134
- package/components/button/src/LionButton.js +9 -12
- package/components/button/src/LionButtonReset.js +0 -5
- package/components/button/src/LionButtonSubmit.js +7 -12
- package/components/button/test/demos.screenshots-test.js +50 -11
- package/components/button/test/lion-button.test.js +0 -1
- package/components/button/test-suites/LionButton.suite.js +135 -145
- package/components/button/test-suites/LionButtonReset.suite.js +54 -72
- package/components/button/test-suites/LionButtonSubmit.suite.js +49 -68
- package/components/calendar/src/LionCalendar.js +151 -104
- package/components/calendar/src/calendarStyle.js +0 -1
- package/components/calendar/src/utils/createMonth.js +3 -4
- package/components/calendar/src/utils/createMultipleMonth.js +15 -7
- package/components/calendar/src/utils/createWeek.js +0 -2
- package/components/calendar/src/utils/dataTemplate.js +8 -4
- package/components/calendar/src/utils/dayTemplate.js +0 -6
- package/components/calendar/src/utils/getDayMonthYear.js +6 -2
- package/components/calendar/test/demos.screenshots-test.js +40 -9
- package/components/calendar/test/lion-calendar.test.js +171 -282
- package/components/calendar/test/utils/createMonth.test.js +61 -22
- package/components/calendar/test/utils/createMultipleMonth.test.js +14 -7
- package/components/calendar/test/utils/createWeek.test.js +51 -17
- package/components/calendar/test/utils/dataTemplate.test.js +3 -4
- package/components/calendar/test/utils/dayTemplate.test.js +106 -34
- package/components/calendar/test/utils/getFirstDayNextMonth.test.js +0 -1
- package/components/calendar/test/utils/getLastDayPreviousMonth.test.js +0 -1
- package/components/calendar/test/utils/isSameDate.test.js +0 -1
- package/components/calendar/test/utils/snapshots/monthTemplate_en-GB_Sunday_2018-12.js +1 -2
- package/components/calendar/test-helpers/CalendarObject.js +31 -62
- package/components/calendar/test-helpers/DayObject.js +7 -15
- package/components/calendar/test-suites/LionCalendar.suite.js +7 -9
- package/components/checkbox-group/src/LionCheckboxIndeterminate.js +17 -30
- package/components/checkbox-group/test/lion-checkbox-group-integrations.test.js +0 -1
- package/components/checkbox-group/test/lion-checkbox-group.test.js +21 -16
- package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +3 -3
- package/components/checkbox-group/test/lion-checkbox-integrations.test.js +3 -2
- package/components/checkbox-group/test/lion-checkbox.test.js +30 -16
- package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +147 -191
- package/components/collapsible/src/LionCollapsible.js +10 -15
- package/components/collapsible/test/lion-collapsible.test.js +4 -18
- package/components/combobox/src/LionCombobox.js +45 -55
- package/components/combobox/src/utils/makeMatchingTextBold.js +2 -5
- package/components/combobox/src/validators.js +0 -1
- package/components/combobox/test/lion-combobox-integrations.test.js +6 -6
- package/components/combobox/test/lion-combobox.test.js +598 -860
- package/components/combobox/test/validators.test.js +6 -13
- package/components/combobox/test-helpers/combobox-helpers.js +24 -11
- package/components/core/src/DisabledMixin.js +61 -66
- package/components/core/src/DisabledWithTabIndexMixin.js +76 -83
- package/components/core/src/EventTargetShim.js +1 -4
- package/components/core/src/ScopedElementsMixin.js +4 -15
- package/components/core/src/ScopedStylesController.js +1 -5
- package/components/core/src/SlotMixin.js +236 -239
- package/components/core/src/browserDetection.js +5 -12
- package/components/core/test/DisabledMixin.test.js +24 -39
- package/components/core/test/DisabledWithTabIndexMixin.test.js +21 -34
- package/components/core/test/EventTargetShim.test.js +0 -8
- package/components/core/test/ScopedElementsMixin.test.js +22 -38
- package/components/core/test/ScopedStylesController.test.js +11 -20
- package/components/core/test/SlotMixin.test.js +102 -154
- package/components/core/test-helpers/getCachedFixture.js +5 -11
- package/components/core/types/SlotMixinTypes.ts +8 -3
- package/components/dialog/src/LionDialog.js +4 -3
- package/components/dialog/test/lion-dialog.integration.test.js +10 -20
- package/components/dialog/test/lion-dialog.test.js +48 -62
- package/components/dialog/test-helpers/test-router.js +4 -6
- package/components/drawer/src/LionDrawer.js +18 -34
- package/components/drawer/src/drawerStyle.js +0 -1
- package/components/drawer/test/lion-drawer.test.js +1 -17
- package/components/fieldset/test/lion-fieldset.test.js +6 -4
- package/components/form/src/LionForm.js +18 -13
- package/components/form/test/lion-form.test.js +22 -52
- package/components/form-core/src/FocusMixin.js +172 -174
- package/components/form-core/src/FormControlMixin.js +811 -813
- package/components/form-core/src/FormatMixin.js +537 -537
- package/components/form-core/src/InteractionStateMixin.js +196 -183
- package/components/form-core/src/LionField.js +9 -5
- package/components/form-core/src/NativeTextFieldMixin.js +114 -116
- package/components/form-core/src/choice-group/ChoiceGroupMixin.js +322 -357
- package/components/form-core/src/choice-group/ChoiceInputMixin.js +306 -296
- package/components/form-core/src/choice-group/CustomChoiceGroupMixin.js +114 -139
- package/components/form-core/src/form-group/FormElementsHaveNoError.js +0 -2
- package/components/form-core/src/form-group/FormGroupMixin.js +551 -557
- package/components/form-core/src/registration/FormRegisteringMixin.js +72 -71
- package/components/form-core/src/registration/FormRegistrarMixin.js +201 -217
- package/components/form-core/src/registration/FormRegistrarPortalMixin.js +31 -37
- package/components/form-core/src/utils/SyncUpdatableMixin.js +106 -117
- package/components/form-core/src/utils/getAriaElementsInRightDomOrder.js +1 -2
- package/components/form-core/src/validate/LionValidationFeedback.js +12 -8
- package/components/form-core/src/validate/Unparseable.js +4 -2
- package/components/form-core/src/validate/ValidateMixin.js +829 -883
- package/components/form-core/src/validate/Validator.js +3 -6
- package/components/form-core/src/validate/resultValidators/DefaultSuccess.js +1 -2
- package/components/form-core/src/validate/validators/DateValidators.js +0 -5
- package/components/form-core/src/validate/validators/NumberValidators.js +1 -5
- package/components/form-core/src/validate/validators/Required.js +1 -1
- package/components/form-core/src/validate/validators/StringValidators.js +1 -8
- package/components/form-core/test/FocusMixin.test.js +96 -82
- package/components/form-core/test/FormControlMixin.test.js +120 -176
- package/components/form-core/test/FormRegistrationMixins.test.js +0 -2
- package/components/form-core/test/FormatMixin.test.js +0 -1
- package/components/form-core/test/InteractionStateMixin.test.js +0 -1
- package/components/form-core/test/NativeTextFieldMixin.test.js +0 -1
- package/components/form-core/test/choice-group/ChoiceGroupMixin.test.js +0 -1
- package/components/form-core/test/choice-group/ChoiceInputMixin.test.js +0 -1
- package/components/form-core/test/choice-group/CustomChoiceGroupMixin.integrations.test.js +6 -8
- package/components/form-core/test/choice-group/CustomChoiceGroupMixin.test.js +0 -3
- package/components/form-core/test/form-group/FormGroupMixin.test.js +0 -1
- package/components/form-core/test/lion-field.test.js +88 -98
- package/components/form-core/test/utils/SyncUpdatableMixin.test.js +51 -65
- package/components/form-core/test/utils/getAriaElementsInRightDomOrder.test.js +3 -3
- package/components/form-core/test/validate/DateValidators.test.js +5 -27
- package/components/form-core/test/validate/NumberValidators.test.js +4 -16
- package/components/form-core/test/validate/Required.test.js +8 -21
- package/components/form-core/test/validate/ResultValidator.test.js +1 -2
- package/components/form-core/test/validate/StringValidators.test.js +4 -35
- package/components/form-core/test/validate/ValidateMixin.test.js +0 -1
- package/components/form-core/test/validate/ValidateMixinFeedbackPart.test.js +0 -1
- package/components/form-core/test/validate/Validator.test.js +39 -34
- package/components/form-core/test/validate/lion-validation-feedback.test.js +81 -43
- package/components/form-core/test-helpers/ExampleValidators.js +0 -5
- package/components/form-core/test-helpers/getFormControlMembers.js +2 -2
- package/components/form-core/test-helpers/mimicUserInput.js +5 -1
- package/components/form-core/test-suites/FormRegistrationMixins.suite.js +65 -122
- package/components/form-core/test-suites/FormatMixin.suite.js +202 -227
- package/components/form-core/test-suites/InteractionStateMixin.suite.js +47 -60
- package/components/form-core/test-suites/NativeTextFieldMixin.suite.js +8 -11
- package/components/form-core/test-suites/ValidateMixin.suite.js +280 -359
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +112 -163
- package/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.js +185 -218
- package/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.js +116 -109
- package/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.js +36 -70
- package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +57 -65
- package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +664 -523
- package/components/form-core/translations/bg-BG.js +0 -1
- package/components/form-core/translations/cs-CZ.js +0 -1
- package/components/form-core/translations/de-DE.js +0 -1
- package/components/form-core/translations/en-AU.js +0 -1
- package/components/form-core/translations/en-GB.js +0 -1
- package/components/form-core/translations/en-US.js +0 -1
- package/components/form-core/translations/es-ES.js +0 -1
- package/components/form-core/translations/fr-BE.js +0 -1
- package/components/form-core/translations/fr-FR.js +0 -1
- package/components/form-core/translations/hu-HU.js +0 -1
- package/components/form-core/translations/it-IT.js +0 -1
- package/components/form-core/translations/nl-BE.js +0 -1
- package/components/form-core/translations/nl-NL.js +0 -1
- package/components/form-core/translations/pl-PL.js +0 -1
- package/components/form-core/translations/ro-RO.js +0 -1
- package/components/form-core/translations/ru-RU.js +0 -1
- package/components/form-core/translations/sk-SK.js +0 -1
- package/components/form-core/translations/tr-TR.js +0 -1
- package/components/form-core/translations/uk-UA.js +0 -1
- package/components/form-core/types/choice-group/ChoiceGroupMixinTypes.ts +5 -0
- package/components/form-integrations/test/dialog-integrations.test.js +1 -4
- package/components/form-integrations/test/form-group-methods.test.js +28 -31
- package/components/form-integrations/test/form-integrations.test.js +27 -28
- package/components/form-integrations/test/form-validation-integrations.test.js +21 -29
- package/components/form-integrations/test/helpers/umbrella-form.js +3 -5
- package/components/form-integrations/test/model-value-consistency.test.js +75 -77
- package/components/form-integrations/test/model-value-event.test.js +10 -20
- package/components/helpers/src/SbActionLogger.js +13 -17
- package/components/helpers/src/SbLocaleSwitcher.js +5 -5
- package/components/helpers/src/sortEachDepth.js +0 -2
- package/components/helpers/test/renderLitAsNode.test.js +0 -4
- package/components/helpers/test/sb-action-logger.test.js +24 -55
- package/components/icon/src/IconManager.js +0 -2
- package/components/icon/src/LionIcon.js +2 -7
- package/components/icon/src/icons.js +0 -2
- package/components/icon/test/IconManager.test.js +0 -15
- package/components/icon/test/hammer.svg.js +3 -4
- package/components/icon/test/heart.svg.js +3 -4
- package/components/icon/test/lion-icon.test.js +14 -43
- package/components/input/src/LionInput.js +2 -8
- package/components/input/test/input-integrations.test.js +0 -5
- package/components/input/test/lion-input-integrations.test.js +0 -4
- package/components/input/test/lion-input.test.js +28 -58
- package/components/input/test-helpers/getInputMembers.js +2 -2
- package/components/input-amount/src/LionInputAmount.js +37 -26
- package/components/input-amount/src/formatters.js +4 -5
- package/components/input-amount/src/parsers.js +0 -3
- package/components/input-amount/test/formatters.test.js +102 -80
- package/components/input-amount/test/lion-input-amount-integrations.test.js +0 -4
- package/components/input-amount/test/lion-input-amount.test.js +155 -164
- package/components/input-amount/test/parsers.test.js +33 -17
- package/components/input-amount/test/preprocessors.test.js +0 -3
- package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +49 -59
- package/components/input-amount-dropdown/src/currencyUtil.js +8 -7
- package/components/input-amount-dropdown/src/parsers.js +0 -1
- package/components/input-amount-dropdown/src/validators.js +0 -1
- package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +34 -36
- package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +18 -13
- package/components/input-amount-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
- package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +132 -107
- package/components/input-date/src/LionInputDate.js +4 -3
- package/components/input-date/test/lion-input-date-integrations.test.js +0 -3
- package/components/input-date/test/lion-input-date.test.js +19 -32
- package/components/input-datepicker/src/LionInputDatepicker.js +17 -29
- package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -2
- package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +0 -3
- package/components/input-datepicker/test/lion-input-datepicker.test.js +88 -153
- package/components/input-datepicker/test-helpers/DatepickerInputObject.js +9 -12
- package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +6 -4
- package/components/input-datepicker/translations/bg-BG.js +0 -1
- package/components/input-datepicker/translations/cs-CZ.js +0 -1
- package/components/input-datepicker/translations/de-DE.js +0 -1
- package/components/input-datepicker/translations/en-AU.js +0 -1
- package/components/input-datepicker/translations/en-GB.js +0 -1
- package/components/input-datepicker/translations/en-US.js +0 -1
- package/components/input-datepicker/translations/es-ES.js +0 -1
- package/components/input-datepicker/translations/fr-BE.js +0 -1
- package/components/input-datepicker/translations/fr-FR.js +0 -1
- package/components/input-datepicker/translations/hu-HU.js +0 -1
- package/components/input-datepicker/translations/it-IT.js +0 -1
- package/components/input-datepicker/translations/nl-BE.js +0 -1
- package/components/input-datepicker/translations/nl-NL.js +0 -1
- package/components/input-datepicker/translations/pl-PL.js +0 -1
- package/components/input-datepicker/translations/ro-RO.js +0 -1
- package/components/input-datepicker/translations/ru-RU.js +0 -1
- package/components/input-datepicker/translations/sk-SK.js +0 -1
- package/components/input-datepicker/translations/tr-TR.js +0 -1
- package/components/input-datepicker/translations/uk-UA.js +0 -1
- package/components/input-email/test/lion-input-email-integrations.test.js +0 -2
- package/components/input-email/test/lion-input-email.test.js +1 -7
- package/components/input-file/src/FileHandle.js +0 -3
- package/components/input-file/src/LionInputFile.js +85 -83
- package/components/input-file/src/LionSelectedFileList.js +12 -12
- package/components/input-file/src/validators.js +10 -9
- package/components/input-file/test/FileValidators.test.js +170 -80
- package/components/input-file/test/lion-input-file.test.js +160 -244
- package/components/input-file/test/lion-selected-file-list.test.js +13 -22
- package/components/input-file/translations/bg-BG.js +0 -1
- package/components/input-file/translations/cs-CZ.js +0 -1
- package/components/input-file/translations/de-DE.js +0 -1
- package/components/input-file/translations/en-AU.js +0 -1
- package/components/input-file/translations/en-GB.js +0 -1
- package/components/input-file/translations/en-PH.js +0 -1
- package/components/input-file/translations/en-US.js +0 -1
- package/components/input-file/translations/en.js +2 -1
- package/components/input-file/translations/es-ES.js +0 -1
- package/components/input-file/translations/fr-BE.js +0 -1
- package/components/input-file/translations/fr-FR.js +0 -1
- package/components/input-file/translations/hu-HU.js +0 -1
- package/components/input-file/translations/id-ID.js +0 -1
- package/components/input-file/translations/id.js +2 -1
- package/components/input-file/translations/it-IT.js +0 -1
- package/components/input-file/translations/nl-BE.js +0 -1
- package/components/input-file/translations/nl-NL.js +0 -1
- package/components/input-file/translations/pl-PL.js +0 -1
- package/components/input-file/translations/ro-RO.js +0 -1
- package/components/input-file/translations/ru-RU.js +0 -1
- package/components/input-file/translations/sk-SK.js +0 -1
- package/components/input-file/translations/uk-UA.js +0 -1
- package/components/input-file/translations/zh-CN.js +0 -1
- package/components/input-iban/src/validators.js +6 -11
- package/components/input-iban/test/formatters.test.js +0 -3
- package/components/input-iban/test/lion-input-iban-integrations.test.js +0 -2
- package/components/input-iban/test/lion-input-iban.test.js +1 -9
- package/components/input-iban/test/parsers.test.js +0 -2
- package/components/input-iban/test/validators.test.js +0 -12
- package/components/input-iban/translations/bg-BG.js +0 -1
- package/components/input-iban/translations/cs-CZ.js +0 -1
- package/components/input-iban/translations/de-DE.js +0 -1
- package/components/input-iban/translations/en-AU.js +0 -1
- package/components/input-iban/translations/en-GB.js +0 -1
- package/components/input-iban/translations/en-US.js +0 -1
- package/components/input-iban/translations/es-ES.js +0 -1
- package/components/input-iban/translations/fr-BE.js +0 -1
- package/components/input-iban/translations/fr-FR.js +0 -1
- package/components/input-iban/translations/hu-HU.js +0 -1
- package/components/input-iban/translations/it-IT.js +0 -1
- package/components/input-iban/translations/nl-BE.js +0 -1
- package/components/input-iban/translations/nl-NL.js +0 -1
- package/components/input-iban/translations/pl-PL.js +0 -1
- package/components/input-iban/translations/ro-RO.js +0 -1
- package/components/input-iban/translations/ru-RU.js +0 -1
- package/components/input-iban/translations/sk-SK.js +0 -1
- package/components/input-iban/translations/uk-UA.js +0 -1
- package/components/input-range/src/LionInputRange.js +18 -19
- package/components/input-range/test/lion-input-range.test.js +23 -48
- package/components/input-range/translations/bg-BG.js +0 -1
- package/components/input-range/translations/cs-CZ.js +0 -1
- package/components/input-range/translations/de-DE.js +0 -1
- package/components/input-range/translations/en-AU.js +0 -1
- package/components/input-range/translations/en-GB.js +0 -1
- package/components/input-range/translations/en-PH.js +0 -1
- package/components/input-range/translations/en-US.js +0 -1
- package/components/input-range/translations/es-ES.js +0 -1
- package/components/input-range/translations/fr-BE.js +0 -1
- package/components/input-range/translations/fr-FR.js +0 -1
- package/components/input-range/translations/hu-HU.js +0 -1
- package/components/input-range/translations/it-IT.js +0 -1
- package/components/input-range/translations/nl-BE.js +0 -1
- package/components/input-range/translations/nl-NL.js +0 -1
- package/components/input-range/translations/pl-PL.js +0 -1
- package/components/input-range/translations/ro-RO.js +0 -1
- package/components/input-range/translations/ru-RU.js +0 -1
- package/components/input-range/translations/sk-SK.js +0 -1
- package/components/input-range/translations/uk-UA.js +0 -1
- package/components/input-range/translations/zh-CN.js +0 -1
- package/components/input-stepper/src/LionInputStepper.js +19 -38
- package/components/input-stepper/test/lion-input-stepper-integrations.test.js +0 -1
- package/components/input-stepper/test/lion-input-stepper.test.js +0 -1
- package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +0 -2
- package/components/input-stepper/test-suites/lion-input-stepper.suite.js +56 -105
- package/components/input-stepper/translations/bg-BG.js +0 -1
- package/components/input-stepper/translations/cs-CZ.js +0 -1
- package/components/input-stepper/translations/de-DE.js +0 -1
- package/components/input-stepper/translations/en-AU.js +0 -1
- package/components/input-stepper/translations/en-GB.js +0 -1
- package/components/input-stepper/translations/en-US.js +0 -1
- package/components/input-stepper/translations/es-ES.js +0 -1
- package/components/input-stepper/translations/fr-BE.js +0 -1
- package/components/input-stepper/translations/fr-FR.js +0 -1
- package/components/input-stepper/translations/hu-HU.js +0 -1
- package/components/input-stepper/translations/it-IT.js +0 -1
- package/components/input-stepper/translations/nl-BE.js +0 -1
- package/components/input-stepper/translations/nl-NL.js +0 -1
- package/components/input-stepper/translations/pl-PL.js +0 -1
- package/components/input-stepper/translations/ro-RO.js +0 -1
- package/components/input-stepper/translations/ru-RU.js +0 -1
- package/components/input-stepper/translations/sk-SK.js +0 -1
- package/components/input-stepper/translations/uk-UA.js +0 -1
- package/components/input-tel/src/LionInputTel.js +53 -37
- package/components/input-tel/src/PhoneUtilManager.js +6 -4
- package/components/input-tel/src/formatters.js +12 -10
- package/components/input-tel/src/parsers.js +3 -3
- package/components/input-tel/src/preprocessors.js +15 -7
- package/components/input-tel/src/validators.js +4 -6
- package/components/input-tel/test/LionInputTel.test.js +4 -2
- package/components/input-tel/test/formatters.test.js +22 -10
- package/components/input-tel/test/parsers.test.js +40 -11
- package/components/input-tel/test/preprocessors.test.js +24 -13
- package/components/input-tel/test/validators.test.js +15 -13
- package/components/input-tel/test-helpers/mockPhoneUtilManager.js +7 -6
- package/components/input-tel/test-suites/LionInputTel.suite.js +33 -73
- package/components/input-tel/translations/bg-BG.js +0 -1
- package/components/input-tel/translations/cs-CZ.js +0 -1
- package/components/input-tel/translations/de-DE.js +0 -1
- package/components/input-tel/translations/en-AU.js +0 -1
- package/components/input-tel/translations/en-GB.js +0 -1
- package/components/input-tel/translations/en-US.js +0 -1
- package/components/input-tel/translations/es-ES.js +0 -1
- package/components/input-tel/translations/fr-BE.js +0 -1
- package/components/input-tel/translations/fr-FR.js +0 -1
- package/components/input-tel/translations/hu-HU.js +0 -1
- package/components/input-tel/translations/it-IT.js +0 -1
- package/components/input-tel/translations/nl-BE.js +0 -1
- package/components/input-tel/translations/nl-NL.js +0 -1
- package/components/input-tel/translations/pl-PL.js +0 -1
- package/components/input-tel/translations/ro-RO.js +0 -1
- package/components/input-tel/translations/ru-RU.js +0 -1
- package/components/input-tel/translations/sk-SK.js +0 -1
- package/components/input-tel/translations/uk-UA.js +0 -1
- package/components/input-tel-dropdown/src/LionInputTelDropdown.js +10 -28
- package/components/input-tel-dropdown/src/regionCodeToLocale.js +3 -1
- package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +31 -38
- package/components/input-tel-dropdown/test/regionCodeToLocale.test.js +0 -1
- package/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
- package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +16 -11
- package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +54 -79
- package/components/listbox/src/LionListbox.js +4 -1
- package/components/listbox/src/LionOption.js +8 -7
- package/components/listbox/src/LionOptions.js +0 -3
- package/components/listbox/src/ListboxMixin.js +801 -819
- package/components/listbox/test/lion-listbox.test.js +0 -1
- package/components/listbox/test/lion-option.test.js +53 -64
- package/components/listbox/test/lion-options.test.js +3 -4
- package/components/listbox/test-helpers/getListboxMembers.js +6 -3
- package/components/listbox/test-suites/ListboxMixin.suite.js +101 -261
- package/components/listbox/types/ListboxMixinTypes.ts +7 -1
- package/components/localize/src/LocalizeManager.js +40 -40
- package/components/localize/src/LocalizeMixin.js +130 -157
- package/components/localize/src/date/formatDate.js +1 -5
- package/components/localize/src/date/getDateFormatBasedOnLocale.js +5 -3
- package/components/localize/src/date/getMonthNames.js +3 -5
- package/components/localize/src/date/getWeekdayNames.js +1 -5
- package/components/localize/src/date/parseDate.js +5 -20
- package/components/localize/src/date/utils/normalizeIntlDate.js +0 -7
- package/components/localize/src/getLocalizeManager.js +0 -3
- package/components/localize/src/number/formatNumber.js +3 -7
- package/components/localize/src/number/formatNumberToParts.js +52 -18
- package/components/localize/src/number/getCurrencyName.js +5 -5
- package/components/localize/src/number/getFractionDigits.js +4 -4
- package/components/localize/src/number/getSeparatorsFromNumber.js +1 -3
- package/components/localize/src/number/parseNumber.js +0 -3
- package/components/localize/src/number/utils/normalize-format-number-to-parts/forceAddGroupSeparators.js +0 -1
- package/components/localize/src/number/utils/normalize-format-number-to-parts/forceSpaceBetweenCurrencyCodeAndNumber.js +4 -1
- package/components/localize/test/LocalizeManager.test.js +385 -278
- package/components/localize/test/LocalizeMixin.test.js +28 -112
- package/components/localize/test/date/formatDate.test.js +18 -48
- package/components/localize/test/date/getDateFormatBasedOnLocale.test.js +0 -3
- package/components/localize/test/date/getMonthNames.test.js +27 -12
- package/components/localize/test/date/getWeekdayNames.test.js +93 -49
- package/components/localize/test/date/normalizeDateTime.test.js +0 -2
- package/components/localize/test/date/parseDate.test.js +12 -16
- package/components/localize/test/getLocalizeManager.test.js +0 -3
- package/components/localize/test/isLocalizeESModule.test.js +32 -13
- package/components/localize/test/localize.test.js +0 -4
- package/components/localize/test/number/formatNumber.test.js +215 -106
- package/components/localize/test/number/formatNumberToParts.test.js +31 -38
- package/components/localize/test/number/getCurrencyName.test.js +20 -6
- package/components/localize/test/number/getDecimalSeparator.test.js +5 -4
- package/components/localize/test/number/getFractionDigits.test.js +0 -2
- package/components/localize/test/number/getGroupSeparator.test.js +0 -2
- package/components/localize/test/number/getSeparatorsFromNumber.test.js +5 -3
- package/components/localize/test/number/parseNumber.test.js +123 -56
- package/components/localize/test/side-effect-free-entrypoint.test.js +0 -6
- package/components/localize/test-helpers/fake-imports.js +11 -6
- package/components/localize/test-helpers/localizeTearDown.js +0 -1
- package/components/menu/README.md +360 -0
- package/components/menu/src/InteractiveListMixin.js +866 -0
- package/components/menu/src/LionMenu.js +423 -0
- package/components/menu/src/MoreButtonMenuMixin.js +272 -0
- package/components/menu/src/MultiLevelListMixin.js +306 -0
- package/components/menu/src/utils/isInView.js +25 -0
- package/components/menu/src/utils/listItemInteractions.js +124 -0
- package/components/menu/test/InteractiveListMixin.test.js +2 -0
- package/components/menu/test/MoreButtonMenuMixin.test.js +5 -0
- package/components/menu/test/MultiLevelListMixin.test.js +2 -0
- package/components/menu/test/lion-menu-interactions.test.js +2 -0
- package/components/menu/test/lion-menu.test.js +18 -0
- package/components/menu/test-helpers/mimicKeyPress.js +19 -0
- package/components/menu/test-suites/InteractiveListMixin.suite.js +498 -0
- package/components/menu/test-suites/LionMenu.suite.js +107 -0
- package/components/menu/test-suites/LionMenuInteractions.suite.js +561 -0
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +365 -0
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +291 -0
- package/components/menu/types/InteractiveListMixinTypes.ts +126 -0
- package/components/menu/types/MoreButtonMenuMixinTypes.ts +51 -0
- package/components/menu/types/MultiLevelListMixinTypes.ts +28 -0
- package/components/menu/types/OverlayWithListInvokerMixinTypes.ts +61 -0
- package/components/overlays/NEXT.md +49 -0
- package/components/overlays/src/ArrowMixin.js +111 -127
- package/components/overlays/src/OverlayController.js +440 -246
- package/components/overlays/src/OverlayMixin.js +130 -68
- package/components/overlays/src/OverlaysManager.js +30 -32
- package/components/overlays/src/configurations/visibility-trigger-partials/withClickInteraction.js +0 -1
- package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +11 -11
- package/components/overlays/src/configurations/withBottomSheetConfig.js +12 -13
- package/components/overlays/src/configurations/withDropdownConfig.js +4 -2
- package/components/overlays/src/configurations/withModalDialogConfig.js +12 -13
- package/components/overlays/src/configurations/withPopoverConfig.js +27 -25
- package/components/overlays/src/configurations/withTooltipConfig.js +15 -13
- package/components/overlays/src/overlayDocumentStyle.js +1 -1
- package/components/overlays/src/overlayShadowDomStyle.js +0 -1
- package/components/overlays/src/singleton.js +0 -2
- package/components/overlays/src/utils/adopt-styles.js +19 -19
- package/components/overlays/src/utils/deep-contains.js +7 -6
- package/components/overlays/src/utils/get-focusable-elements.js +7 -10
- package/components/overlays/src/utils/inert-siblings.js +2 -4
- package/components/overlays/src/utils/is-equal-config.js +14 -6
- package/components/overlays/src/utils/is-visible.js +0 -1
- package/components/overlays/src/utils/simulate-tab.js +1 -4
- package/components/overlays/src/utils/sort-by-tabindex.js +2 -4
- package/components/overlays/test/ArrowMixin.test.js +18 -30
- package/components/overlays/test/OverlayController.test.js +551 -533
- package/components/overlays/test/OverlayMixin.test.js +0 -2
- package/components/overlays/test/OverlaysManager.test.js +30 -35
- package/components/overlays/test/global-positioning.test.js +6 -10
- package/components/overlays/test/local-positioning.test.js +101 -103
- package/components/overlays/test/utils-tests/active-element.test.js +12 -27
- package/components/overlays/test/utils-tests/adopt-styles.test.js +25 -56
- package/components/overlays/test/utils-tests/deep-contains.test.js +73 -74
- package/components/overlays/test/utils-tests/get-focusable-elements.test.js +6 -23
- package/components/overlays/test/utils-tests/is-equal-config.test.js +32 -13
- package/components/overlays/test/utils-tests/visibility.test.js +44 -79
- package/components/overlays/test-helpers/createShadowHost.js +5 -3
- package/components/overlays/test-helpers/normalizeTransformStyle.js +2 -4
- package/components/overlays/test-suites/OverlayMixin.suite.js +159 -188
- package/components/overlays/test-suites/WithHoverInteraction.suite.js +96 -79
- package/components/overlays/translations/bg-BG.js +0 -1
- package/components/overlays/translations/cs-CZ.js +0 -1
- package/components/overlays/translations/de-DE.js +0 -1
- package/components/overlays/translations/en-AU.js +0 -1
- package/components/overlays/translations/en-GB.js +0 -1
- package/components/overlays/translations/en-US.js +0 -1
- package/components/overlays/translations/es-ES.js +0 -1
- package/components/overlays/translations/fr-BE.js +0 -1
- package/components/overlays/translations/fr-FR.js +0 -1
- package/components/overlays/translations/hu-HU.js +0 -1
- package/components/overlays/translations/it-IT.js +0 -1
- package/components/overlays/translations/nl-BE.js +0 -1
- package/components/overlays/translations/nl-NL.js +0 -1
- package/components/overlays/translations/pl-PL.js +0 -1
- package/components/overlays/translations/ro-RO.js +0 -1
- package/components/overlays/translations/ru-RU.js +0 -1
- package/components/overlays/translations/sk-SK.js +0 -1
- package/components/overlays/translations/tr-TR.js +0 -1
- package/components/overlays/translations/uk-UA.js +0 -1
- package/components/overlays/types/ArrowMixinTypes.ts +1 -3
- package/components/overlays/types/OverlayConfig.ts +20 -5
- package/components/overlays/types/OverlayMixinTypes.ts +2 -0
- package/components/pagination/src/LionPagination.js +9 -12
- package/components/pagination/test/lion-pagination.test.js +18 -50
- package/components/progress-indicator/src/LionProgressIndicator.js +10 -12
- package/components/progress-indicator/test/lion-progress-indicator.test.js +1 -22
- package/components/radio-group/src/LionRadioGroup.js +1 -2
- package/components/radio-group/test/lion-radio-group-integrations.test.js +0 -1
- package/components/radio-group/test/lion-radio-group.test.js +27 -27
- package/components/radio-group/test/lion-radio-integrations.test.js +3 -2
- package/components/radio-group/test/lion-radio.test.js +30 -16
- package/components/select/src/LionSelect.js +12 -13
- package/components/select/test/lion-select.test.js +7 -12
- package/components/select-rich/src/LionSelectInvoker.js +18 -11
- package/components/select-rich/src/LionSelectRich.js +32 -43
- package/components/select-rich/test/demos.screenshots-test.js +40 -9
- package/components/select-rich/test/lion-select-invoker.test.js +26 -43
- package/components/select-rich/test/lion-select-listbox-suite-integration.test.js +3 -3
- package/components/select-rich/test/lion-select-rich-dialog-integration.test.js +4 -9
- package/components/select-rich/test/lion-select-rich-interaction.test.js +154 -101
- package/components/select-rich/test/lion-select-rich-upgrade.test.js +26 -0
- package/components/select-rich/test/lion-select-rich.test.js +153 -195
- package/components/select-rich/test-helpers/getSelectRichMembers.js +4 -1
- package/components/steps/src/LionStep.js +21 -12
- package/components/steps/src/LionSteps.js +25 -25
- package/components/steps/test/lion-step.test.js +18 -25
- package/components/steps/test/lion-steps.test.js +45 -78
- package/components/switch/src/LionSwitch.js +2 -7
- package/components/switch/src/LionSwitchButton.js +5 -6
- package/components/switch/test/lion-switch-button.test.js +16 -28
- package/components/switch/test/lion-switch.test.js +17 -31
- package/components/tabs/src/LionTabs.js +25 -28
- package/components/tabs/test/lion-tabs.test.js +156 -154
- package/components/textarea/src/LionTextarea.js +4 -23
- package/components/textarea/test/lion-textarea-integrations.test.js +0 -5
- package/components/textarea/test/lion-textarea.test.js +2 -28
- package/components/tooltip/src/LionTooltip.js +6 -6
- package/components/tooltip/test/lion-tooltip.test.js +75 -102
- package/components/validate-messages/src/getLocalizedMessage.js +8 -7
- package/components/validate-messages/src/loadDefaultFeedbackMessages.js +3 -1
- package/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.js +9 -5
- package/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.js +5 -2
- package/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.js +99 -35
- package/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.js +4 -3
- package/components/validate-messages/test/loadDefaultFeedbackMessages.test.js +5 -3
- package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.js +80 -45
- package/components/validate-messages/translations/bg-BG.js +0 -1
- package/components/validate-messages/translations/cs-CZ.js +0 -1
- package/components/validate-messages/translations/de-DE.js +0 -1
- package/components/validate-messages/translations/en-AU.js +0 -1
- package/components/validate-messages/translations/en-GB.js +0 -1
- package/components/validate-messages/translations/en-PH.js +0 -1
- package/components/validate-messages/translations/en-US.js +0 -1
- package/components/validate-messages/translations/es-ES.js +0 -1
- package/components/validate-messages/translations/fr-BE.js +0 -1
- package/components/validate-messages/translations/fr-FR.js +0 -1
- package/components/validate-messages/translations/hu-HU.js +0 -1
- package/components/validate-messages/translations/it-IT.js +0 -1
- package/components/validate-messages/translations/nl-BE.js +0 -1
- package/components/validate-messages/translations/nl-NL.js +0 -1
- package/components/validate-messages/translations/pl-PL.js +0 -1
- package/components/validate-messages/translations/ro-RO.js +0 -1
- package/components/validate-messages/translations/ru-RU.js +0 -1
- package/components/validate-messages/translations/sk-SK.js +0 -1
- package/components/validate-messages/translations/tr-TR.js +0 -1
- package/components/validate-messages/translations/uk-UA.js +0 -1
- package/custom-elements.json +3312 -206
- package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
- package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
- package/dist-types/components/core/src/SlotMixin.d.ts +6 -1
- package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
- package/dist-types/components/core/types/SlotMixinTypes.d.ts +5 -1
- package/dist-types/components/core/types/SlotMixinTypes.d.ts.map +1 -1
- package/dist-types/components/dialog/src/LionDialog.d.ts +6 -2
- package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
- package/dist-types/components/form-core/src/LionField.d.ts +3 -1
- package/dist-types/components/form-core/src/LionField.d.ts.map +1 -1
- package/dist-types/components/form-core/src/choice-group/ChoiceGroupMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts +5 -0
- package/dist-types/components/form-core/types/choice-group/ChoiceGroupMixinTypes.d.ts.map +1 -1
- package/dist-types/components/input-amount/src/LionInputAmount.d.ts +3 -1
- package/dist-types/components/input-amount/src/LionInputAmount.d.ts.map +1 -1
- package/dist-types/components/input-amount/src/formatters.d.ts +6 -4
- package/dist-types/components/input-amount/src/formatters.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +1 -1
- package/dist-types/components/input-tel/src/LionInputTel.d.ts +6 -6
- package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts +2 -2
- package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/formatters.d.ts +2 -2
- package/dist-types/components/input-tel/src/formatters.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/preprocessors.d.ts +2 -2
- package/dist-types/components/input-tel/src/preprocessors.d.ts.map +1 -1
- package/dist-types/components/input-tel/test/validators.test.d.ts +1 -1
- package/dist-types/components/input-tel/test/validators.test.d.ts.map +1 -1
- package/dist-types/components/listbox/src/LionOption.d.ts +5 -2
- package/dist-types/components/listbox/src/LionOption.d.ts.map +1 -1
- package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
- package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts +7 -1
- package/dist-types/components/listbox/types/ListboxMixinTypes.d.ts.map +1 -1
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +35 -0
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenu.d.ts +129 -0
- package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +8 -0
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +7 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/isInView.d.ts +9 -0
- package/dist-types/components/menu/src/utils/isInView.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +48 -0
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +1 -0
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +2 -0
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +2 -0
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +2 -0
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts.map +1 -0
- package/dist-types/components/menu/test/lion-menu.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-menu.test.d.ts.map +1 -0
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +7 -0
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +11 -0
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +9 -0
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +5 -0
- package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +11 -0
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +11 -0
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +1 -0
- package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts +72 -0
- package/dist-types/components/menu/types/InteractiveListMixinTypes.d.ts.map +1 -0
- package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts +30 -0
- package/dist-types/components/menu/types/MoreButtonMenuMixinTypes.d.ts.map +1 -0
- package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts +16 -0
- package/dist-types/components/menu/types/MultiLevelListMixinTypes.d.ts.map +1 -0
- package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts +35 -0
- package/dist-types/components/menu/types/OverlayWithListInvokerMixinTypes.d.ts.map +1 -0
- package/dist-types/components/overlays/src/OverlayController.d.ts +22 -5
- package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
- package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
- package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayConfig.d.ts +12 -2
- package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +1 -0
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts +3 -1
- package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +13 -2
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts.map +1 -1
- package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts +2 -0
- package/dist-types/components/select-rich/test/lion-select-rich-upgrade.test.d.ts.map +1 -0
- package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
- package/dist-types/exports/define/lion-item.d.ts +2 -0
- package/dist-types/exports/define/lion-item.d.ts.map +1 -0
- package/dist-types/exports/define/lion-menu.d.ts +2 -0
- package/dist-types/exports/define/lion-menu.d.ts.map +1 -0
- package/dist-types/exports/define/lion-menuitem.d.ts +2 -0
- package/dist-types/exports/define/lion-menuitem.d.ts.map +1 -0
- package/dist-types/exports/menu-test-suites.d.ts +4 -0
- package/dist-types/exports/menu-test-suites.d.ts.map +1 -0
- package/dist-types/exports/menu.d.ts +3 -0
- package/dist-types/exports/menu.d.ts.map +1 -0
- package/dist-types/exports/overlays.d.ts +6 -0
- package/dist-types/exports/overlays.d.ts.map +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/accordion/overview.md +2 -2
- package/docs/components/accordion/reference.md +2 -2
- package/docs/components/accordion/use-cases.md +2 -2
- package/docs/components/button/examples.md +2 -2
- package/docs/components/button/extensions.md +2 -2
- package/docs/components/button/overview.md +2 -2
- package/docs/components/button/use-cases.md +2 -2
- package/docs/components/calendar/overview.md +2 -2
- package/docs/components/calendar/use-cases.md +2 -2
- package/docs/components/checkbox-group/overview.md +4 -4
- package/docs/components/checkbox-group/use-cases.md +2 -2
- package/docs/components/collapsible/examples.md +2 -2
- package/docs/components/collapsible/overview.md +3 -3
- package/docs/components/collapsible/use-cases.md +2 -2
- package/docs/components/combobox/api-table.md +53 -39
- package/docs/components/combobox/extensions.md +2 -2
- package/docs/components/combobox/overview.md +3 -3
- package/docs/components/combobox/use-cases.md +3 -3
- package/docs/components/dialog/api-table.md +32 -6
- package/docs/components/dialog/overview.md +3 -3
- package/docs/components/dialog/use-cases.md +2 -2
- package/docs/components/drawer/overview.md +2 -2
- package/docs/components/drawer/use-cases.md +2 -2
- package/docs/components/fieldset/overview.md +7 -7
- package/docs/components/fieldset/use-cases.md +2 -2
- package/docs/components/form/overview.md +5 -5
- package/docs/components/form/use-cases.md +4 -4
- package/docs/components/icon/overview.md +2 -2
- package/docs/components/icon/use-cases.md +3 -3
- package/docs/components/input/overview.md +3 -3
- package/docs/components/input/use-cases.md +2 -2
- package/docs/components/input-amount/api-table.md +9 -7
- package/docs/components/input-amount/overview.md +5 -5
- package/docs/components/input-amount/use-cases.md +17 -6
- package/docs/components/input-amount-dropdown/api-table.md +2 -0
- package/docs/components/input-amount-dropdown/use-cases.md +2 -2
- package/docs/components/input-date/overview.md +5 -5
- package/docs/components/input-date/use-cases.md +2 -2
- package/docs/components/input-datepicker/api-table.md +63 -45
- package/docs/components/input-datepicker/overview.md +7 -7
- package/docs/components/input-datepicker/use-cases.md +2 -2
- package/docs/components/input-email/overview.md +4 -4
- package/docs/components/input-email/use-cases.md +2 -2
- package/docs/components/input-file/overview.md +3 -3
- package/docs/components/input-file/use-cases.md +2 -2
- package/docs/components/input-iban/overview.md +4 -4
- package/docs/components/input-iban/use-cases.md +2 -2
- package/docs/components/input-range/overview.md +4 -4
- package/docs/components/input-range/use-cases.md +2 -2
- package/docs/components/input-stepper/overview.md +3 -3
- package/docs/components/input-stepper/use-cases.md +2 -2
- package/docs/components/input-tel/overview.md +3 -3
- package/docs/components/input-tel/use-cases.md +8 -8
- package/docs/components/input-tel-dropdown/extensions.md +2 -2
- package/docs/components/input-tel-dropdown/overview.md +3 -3
- package/docs/components/input-tel-dropdown/use-cases.md +2 -2
- package/docs/components/listbox/overview.md +2 -2
- package/docs/components/listbox/use-cases.md +3 -3
- package/docs/components/menu/api-table.md +44 -0
- package/docs/components/menu/applyMenuDemoStyles.js +173 -0
- package/docs/components/menu/extensions.md +262 -0
- package/docs/components/menu/index.md +13 -0
- package/docs/components/menu/migration.md +129 -0
- package/docs/components/menu/overview.md +448 -0
- package/docs/components/menu/src/DemoNavigationBar.js +441 -0
- package/docs/components/menu/src/DemoSpinButton.js +215 -0
- package/docs/components/menu/src/DemoToolbar.js +101 -0
- package/docs/components/menu/src/DemoTree.js +55 -0
- package/docs/components/menu/src/navigation-bar-types.js +41 -0
- package/docs/components/menu/use-cases.md +74 -0
- package/docs/components/pagination/overview.md +2 -2
- package/docs/components/pagination/use-cases.md +2 -2
- package/docs/components/progress-indicator/examples.md +2 -2
- package/docs/components/progress-indicator/overview.md +2 -2
- package/docs/components/radio-group/overview.md +5 -5
- package/docs/components/radio-group/use-cases.md +2 -2
- package/docs/components/select/overview.md +2 -2
- package/docs/components/select/use-cases.md +3 -3
- package/docs/components/select-rich/api-table.md +51 -33
- package/docs/components/select-rich/examples.md +2 -2
- package/docs/components/select-rich/overview.md +2 -2
- package/docs/components/select-rich/use-cases.md +4 -4
- package/docs/components/steps/overview.md +2 -2
- package/docs/components/steps/use-cases.md +2 -2
- package/docs/components/switch/overview.md +2 -2
- package/docs/components/switch/reference.md +2 -2
- package/docs/components/switch/use-cases.md +2 -2
- package/docs/components/tabs/examples.md +3 -3
- package/docs/components/tabs/overview.md +2 -2
- package/docs/components/tabs/use-cases.md +2 -2
- package/docs/components/textarea/overview.md +2 -2
- package/docs/components/textarea/use-cases.md +2 -2
- package/docs/components/tooltip/api-table.md +33 -7
- package/docs/components/tooltip/examples.md +2 -2
- package/docs/components/tooltip/overview.md +2 -2
- package/docs/components/tooltip/use-cases.md +2 -2
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +2 -2
- package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +2 -2
- package/docs/fundamentals/node-tools/providence-analytics/index.md +2 -2
- package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
- package/docs/fundamentals/node-tools/publish-docs/index.md +2 -2
- package/docs/fundamentals/node-tools/publish-docs/overview.md +5 -5
- package/docs/fundamentals/node-tools/remark-extend/index.md +2 -2
- package/docs/fundamentals/node-tools/remark-extend/overview.md +2 -2
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +2 -2
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +4 -4
- package/docs/fundamentals/rationales/TypeScript.md +62 -2
- package/docs/fundamentals/rationales/accessibility.md +5 -5
- package/docs/fundamentals/rationales/side-effects.md +2 -2
- package/docs/fundamentals/rationales/versioning.md +2 -2
- package/docs/fundamentals/systems/core/SlotMixin.md +3 -3
- package/docs/fundamentals/systems/core/index.md +2 -2
- package/docs/fundamentals/systems/core/overview.md +3 -3
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +6 -6
- package/docs/fundamentals/systems/form/index.md +2 -2
- package/docs/fundamentals/systems/form/interaction-states.md +2 -2
- package/docs/fundamentals/systems/form/model-value.md +3 -3
- package/docs/fundamentals/systems/form/overview.md +30 -30
- package/docs/fundamentals/systems/form/styling.md +2 -2
- package/docs/fundamentals/systems/form/use-cases.md +2 -2
- package/docs/fundamentals/systems/form/validate.md +4 -4
- package/docs/fundamentals/systems/icon/index.md +2 -2
- package/docs/fundamentals/systems/icon/overview.md +2 -2
- package/docs/fundamentals/systems/localize/dates.md +2 -2
- package/docs/fundamentals/systems/localize/index.md +2 -2
- package/docs/fundamentals/systems/localize/numbers.md +2 -2
- package/docs/fundamentals/systems/localize/overview.md +6 -6
- package/docs/fundamentals/systems/localize/rationale.md +2 -2
- package/docs/fundamentals/systems/localize/text.md +2 -2
- package/docs/fundamentals/systems/localize/use-cases.md +2 -2
- package/docs/fundamentals/systems/overlays/_edge-cases.md +2 -2
- package/docs/fundamentals/systems/overlays/api-table.md +46 -43
- package/docs/fundamentals/systems/overlays/configuration.md +4 -4
- package/docs/fundamentals/systems/overlays/index.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +7 -7
- package/docs/fundamentals/systems/overlays/rationale.md +2 -2
- package/docs/fundamentals/systems/overlays/use-cases.md +4 -4
- package/docs/fundamentals/tools/ajax/index.md +2 -2
- package/docs/fundamentals/tools/ajax/overview.md +2 -2
- package/docs/fundamentals/tools/ajax/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/action-logger.md +2 -2
- package/docs/fundamentals/tools/helpers/index.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +3 -3
- package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/example-success/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/overview.md +6 -6
- package/docs/guides/how-to/create-a-custom-field.md +7 -7
- package/docs/guides/how-to/create-a-form.md +6 -6
- package/docs/guides/how-to/extend-a-native-input.md +4 -4
- package/docs/guides/how-to/get-started.md +2 -2
- package/docs/guides/how-to/index.md +1 -1
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/definitions-and-terms.md +2 -2
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/scoped-elements.md +2 -2
- package/docs/guides/principles/styling.md +3 -3
- package/docs/guides/principles/subclasser-apis.md +2 -2
- package/exports/define/lion-accordion.js +0 -1
- package/exports/define/lion-button-reset.js +0 -1
- package/exports/define/lion-button-submit.js +0 -1
- package/exports/define/lion-button.js +0 -1
- package/exports/define/lion-calendar.js +0 -1
- package/exports/define/lion-checkbox-group.js +0 -1
- package/exports/define/lion-checkbox-indeterminate.js +0 -1
- package/exports/define/lion-checkbox.js +0 -1
- package/exports/define/lion-collapsible.js +0 -1
- package/exports/define/lion-combobox.js +0 -1
- package/exports/define/lion-dialog.js +0 -1
- package/exports/define/lion-drawer.js +0 -1
- package/exports/define/lion-field.js +0 -1
- package/exports/define/lion-fieldset.js +0 -1
- package/exports/define/lion-form.js +0 -1
- package/exports/define/lion-icon.js +0 -1
- package/exports/define/lion-input-amount-dropdown.js +0 -1
- package/exports/define/lion-input-amount.js +0 -1
- package/exports/define/lion-input-date.js +0 -1
- package/exports/define/lion-input-datepicker.js +0 -1
- package/exports/define/lion-input-email.js +0 -1
- package/exports/define/lion-input-file.js +0 -1
- package/exports/define/lion-input-iban.js +0 -1
- package/exports/define/lion-input-range.js +0 -1
- package/exports/define/lion-input-stepper.js +0 -1
- package/exports/define/lion-input-tel-dropdown.js +0 -1
- package/exports/define/lion-input-tel.js +0 -1
- package/exports/define/lion-input.js +0 -1
- package/exports/define/lion-item.js +2 -0
- package/exports/define/lion-listbox.js +0 -1
- package/exports/define/lion-menu.js +2 -0
- package/exports/define/lion-menuitem.js +2 -0
- package/exports/define/lion-option.js +0 -1
- package/exports/define/lion-options.js +0 -1
- package/exports/define/lion-pagination.js +0 -1
- package/exports/define/lion-progress-indicator.js +0 -1
- package/exports/define/lion-radio-group.js +0 -1
- package/exports/define/lion-radio.js +0 -1
- package/exports/define/lion-select-invoker.js +0 -1
- package/exports/define/lion-select-rich.js +0 -1
- package/exports/define/lion-select.js +0 -1
- package/exports/define/lion-selected-file-list.js +0 -1
- package/exports/define/lion-step.js +0 -1
- package/exports/define/lion-steps.js +0 -1
- package/exports/define/lion-switch-button.js +0 -1
- package/exports/define/lion-switch.js +0 -1
- package/exports/define/lion-tabs.js +0 -1
- package/exports/define/lion-textarea.js +0 -1
- package/exports/define/lion-tooltip.js +0 -1
- package/exports/define/lion-validation-feedback.js +0 -1
- package/exports/define-helpers/sb-action-logger.js +0 -1
- package/exports/define-helpers/sb-locale-switcher.js +0 -1
- package/exports/form-core.js +0 -8
- package/exports/localize-no-side-effects.js +0 -1
- package/exports/localize.js +0 -2
- package/exports/menu-test-suites.js +4 -0
- package/exports/menu.js +3 -0
- package/exports/overlays.js +6 -4
- package/generated/awesome-phonenumber/LICENSE +22 -0
- package/generated/awesome-phonenumber/LICENSE.closure-library +176 -0
- package/generated/awesome-phonenumber/LICENSE.libphonenumber +176 -0
- package/generated/awesome-phonenumber/checksums.json +6 -0
- package/generated/awesome-phonenumber/index-esm.mjs +817 -0
- package/generated/awesome-phonenumber/index.d.ts +227 -0
- package/generated/awesome-phonenumber/index.js +45 -0
- package/generated/awesome-phonenumber/lib/index.js +710 -0
- package/generated/awesome-phonenumber/package.json +9 -0
- package/generated/awesome-phonenumber/provenance.json +13 -0
- package/menu-test-suites.js +4 -0
- package/menu.js +3 -0
- package/overlays.js +6 -0
- package/package.json +35 -6
- package/vscode.html-custom-data.json +76 -8
- package/web-types.json +202 -17
|
@@ -3,6 +3,7 @@ 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';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @typedef {import('@lion/ui/types/overlays.js').OverlayPhase} OverlayPhase
|
|
@@ -32,41 +33,43 @@ import { getFocusableElements } from './utils/get-focusable-elements.js';
|
|
|
32
33
|
* `<slot name="my-content">` belonging to `<div slot="content"/>` will be wrapped with wrappingDialogNodeL1 and contentWrapperNodeL2
|
|
33
34
|
* inside shadow dom. With the help of temp markers, `<slot name="my-content">`'s original position will be respected.
|
|
34
35
|
*
|
|
35
|
-
* @param {{
|
|
36
|
+
* @param {{
|
|
37
|
+
* wrappingDialogNodeL1: HTMLDialogElement|HTMLDivElement;
|
|
38
|
+
* contentWrapperNodeL2:Element;
|
|
39
|
+
* contentNodeL3: Element;
|
|
40
|
+
* }} opts
|
|
36
41
|
*/
|
|
37
42
|
function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNodeL3 }) {
|
|
38
|
-
if
|
|
43
|
+
// if contentWrapperNode is provided by the user,
|
|
44
|
+
// we assume it lives in shadow dom around a slot.
|
|
45
|
+
const hasLegacyMethodOfProvidingWrapperNode = Boolean(contentWrapperNodeL2.parentNode);
|
|
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
|
+
if (!hasLegacyMethodOfProvidingWrapperNode && !hasContentNodeAttachmentPoints) {
|
|
39
50
|
throw new Error(
|
|
40
|
-
'[OverlayController] Could not find a render target,
|
|
51
|
+
'[OverlayController] Could not find a render target, makes sure contentNode has a parent element (or contentWrapperNode is connected)',
|
|
41
52
|
);
|
|
42
53
|
}
|
|
43
54
|
|
|
55
|
+
/** @type {Node} */
|
|
44
56
|
let parentElement;
|
|
45
|
-
const tempMarker = document.createComment('
|
|
46
|
-
|
|
47
|
-
|
|
57
|
+
const tempMarker = document.createComment('overlay-insertion-marker');
|
|
58
|
+
// Moving the wrapper can change slot assignment, so capture the node we relocate up front
|
|
59
|
+
// and restore that same node during cleanup.
|
|
60
|
+
const contentNodeOrSlot = contentNodeL3.assignedSlot || contentNodeL3;
|
|
61
|
+
if (hasLegacyMethodOfProvidingWrapperNode) {
|
|
48
62
|
// This is the case when contentWrapperNode (living in shadow dom, wrapping <slot name="my-content-outlet">) is already provided via controller.
|
|
49
63
|
parentElement = contentWrapperNodeL2.parentElement || contentWrapperNodeL2.getRootNode();
|
|
50
64
|
parentElement.insertBefore(tempMarker, contentWrapperNodeL2);
|
|
51
65
|
// Wrap...
|
|
52
66
|
wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
contentNodeL3.assignedSlot.parentElement || contentNodeL3.assignedSlot.getRootNode();
|
|
60
|
-
parentElement.insertBefore(tempMarker, contentNodeL3.assignedSlot);
|
|
61
|
-
wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
|
|
62
|
-
// Important: we do not move around contentNodeL3, but the assigned slot
|
|
63
|
-
contentWrapperNodeL2.appendChild(contentNodeL3.assignedSlot);
|
|
64
|
-
} else {
|
|
65
|
-
parentElement = contentNodeL3.parentElement || contentNodeL3.getRootNode();
|
|
66
|
-
parentElement.insertBefore(tempMarker, contentNodeL3);
|
|
67
|
-
wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
|
|
68
|
-
contentWrapperNodeL2.appendChild(contentNodeL3);
|
|
69
|
-
}
|
|
67
|
+
} else {
|
|
68
|
+
parentElement = contentNodeOrSlot.parentElement || contentNodeOrSlot.getRootNode();
|
|
69
|
+
parentElement.insertBefore(tempMarker, contentNodeOrSlot);
|
|
70
|
+
wrappingDialogNodeL1.appendChild(contentWrapperNodeL2);
|
|
71
|
+
// Important: for projected content we do not move contentNodeL3, but its assigned slot
|
|
72
|
+
contentWrapperNodeL2.appendChild(contentNodeOrSlot);
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
/**
|
|
@@ -93,7 +96,20 @@ function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNod
|
|
|
93
96
|
* ```
|
|
94
97
|
*/
|
|
95
98
|
parentElement.insertBefore(wrappingDialogNodeL1, tempMarker);
|
|
96
|
-
|
|
99
|
+
return function cleanup() {
|
|
100
|
+
if (hasLegacyMethodOfProvidingWrapperNode) {
|
|
101
|
+
parentElement?.insertBefore(contentWrapperNodeL2, tempMarker);
|
|
102
|
+
} else {
|
|
103
|
+
parentElement?.insertBefore(contentNodeOrSlot, tempMarker);
|
|
104
|
+
if (parentElement.contains(contentWrapperNodeL2)) {
|
|
105
|
+
contentWrapperNodeL2.remove();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
parentElement?.removeChild(tempMarker);
|
|
109
|
+
if (parentElement.contains(wrappingDialogNodeL1)) {
|
|
110
|
+
parentElement?.removeChild(wrappingDialogNodeL1);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
97
113
|
}
|
|
98
114
|
|
|
99
115
|
/**
|
|
@@ -101,11 +117,25 @@ function rearrangeNodes({ wrappingDialogNodeL1, contentWrapperNodeL2, contentNod
|
|
|
101
117
|
*/
|
|
102
118
|
async function preloadPopper() {
|
|
103
119
|
// @ts-ignore [external]: import complains about untyped module, but we typecast it ourselves
|
|
104
|
-
return /** @type {* & Promise<PopperModule>} */
|
|
120
|
+
return /** @type {* & Promise<PopperModule>} */ import('@popperjs/core/dist/esm/popper.js');
|
|
105
121
|
}
|
|
106
|
-
|
|
107
122
|
const childDialogsClosedInEventLoopWeakmap = new WeakMap();
|
|
108
123
|
|
|
124
|
+
/**
|
|
125
|
+
* @param {HTMLElement | null} el
|
|
126
|
+
* @param {string} selector
|
|
127
|
+
* @returns {HTMLElement | null}
|
|
128
|
+
*/
|
|
129
|
+
function deepClosest(el, selector) {
|
|
130
|
+
// @ts-ignore - comparing HTMLElement to document/window for safety
|
|
131
|
+
return (
|
|
132
|
+
// @ts-ignore - type comparison check
|
|
133
|
+
(el && el !== document && el !== window && el.closest(selector)) ||
|
|
134
|
+
// @ts-ignore - host property on ShadowRoot
|
|
135
|
+
deepClosest(el.getRootNode().host, selector)
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
109
139
|
/**
|
|
110
140
|
* OverlayController is the fundament for every single type of overlay. With the right
|
|
111
141
|
* configuration, it can be used to build (modal) dialogs, tooltips, dropdowns, popovers,
|
|
@@ -173,12 +203,10 @@ export class OverlayController extends EventTarget {
|
|
|
173
203
|
super();
|
|
174
204
|
this.manager = manager;
|
|
175
205
|
this.__sharedConfig = config;
|
|
176
|
-
|
|
177
206
|
this.__activeElementRightBeforeHide = null;
|
|
178
207
|
|
|
179
208
|
/** @type {OverlayConfig} */
|
|
180
209
|
this.config = {};
|
|
181
|
-
|
|
182
210
|
this._defaultConfig = {
|
|
183
211
|
placementMode: undefined,
|
|
184
212
|
contentNode: config.contentNode,
|
|
@@ -236,8 +264,20 @@ export class OverlayController extends EventTarget {
|
|
|
236
264
|
placement: 'center',
|
|
237
265
|
},
|
|
238
266
|
zIndex: 9999,
|
|
267
|
+
isActivated: true,
|
|
268
|
+
elementToFocusOnShow: false,
|
|
269
|
+
// This means that content will have visually-hidden / sr-only styles. This is handy for:
|
|
270
|
+
// - 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)
|
|
271
|
+
// - "more" menus that put content in a dropdown that do not fit in the current row
|
|
272
|
+
// - menus that should generally open on tab.
|
|
273
|
+
// @ts-ignore - hideVisually is an extension property
|
|
274
|
+
hideVisually: false,
|
|
275
|
+
requireConnectedNodes: true,
|
|
276
|
+
// hides children overlays when parent is closed...
|
|
277
|
+
syncChildrenCloseState: false,
|
|
278
|
+
// // In next major, we remove this prop. Now we disable it for backwards compatibility and enable it in the places we need it internally
|
|
279
|
+
// _shouldTeardownDomStructure: false,
|
|
239
280
|
};
|
|
240
|
-
|
|
241
281
|
this._contentId = `overlay-content--${Math.random().toString(36).slice(2, 10)}`;
|
|
242
282
|
this.__originalAttrs = new Map();
|
|
243
283
|
/** @private */
|
|
@@ -248,6 +288,7 @@ export class OverlayController extends EventTarget {
|
|
|
248
288
|
this.__cancelHandler = this.__cancelHandler.bind(this);
|
|
249
289
|
this.__escKeyHandlerCalled = false;
|
|
250
290
|
}
|
|
291
|
+
__hasSetup = false;
|
|
251
292
|
|
|
252
293
|
/**
|
|
253
294
|
* The invokerNode
|
|
@@ -262,12 +303,12 @@ export class OverlayController extends EventTarget {
|
|
|
262
303
|
* @type {HTMLDialogElement | HTMLDivElement}
|
|
263
304
|
*/
|
|
264
305
|
get content() {
|
|
265
|
-
return /** @type {HTMLDialogElement | HTMLDivElement} */
|
|
306
|
+
return /** @type {HTMLDialogElement | HTMLDivElement} */ this.__wrappingDialogNode;
|
|
266
307
|
}
|
|
267
308
|
|
|
268
309
|
/**
|
|
269
310
|
* Determines the connection point in DOM (body vs next to invoker).
|
|
270
|
-
* @type {'global' | 'local' | undefined}
|
|
311
|
+
* @type {'global' | 'local' | 'custom' | undefined}
|
|
271
312
|
*/
|
|
272
313
|
get placementMode() {
|
|
273
314
|
return this.config?.placementMode;
|
|
@@ -288,7 +329,7 @@ export class OverlayController extends EventTarget {
|
|
|
288
329
|
* @type {HTMLElement}
|
|
289
330
|
*/
|
|
290
331
|
get referenceNode() {
|
|
291
|
-
return /** @type {HTMLElement} */
|
|
332
|
+
return /** @type {HTMLElement} */ this.config?.referenceNode;
|
|
292
333
|
}
|
|
293
334
|
|
|
294
335
|
/**
|
|
@@ -296,7 +337,7 @@ export class OverlayController extends EventTarget {
|
|
|
296
337
|
* @type {HTMLElement}
|
|
297
338
|
*/
|
|
298
339
|
get contentNode() {
|
|
299
|
-
return /** @type {HTMLElement} */
|
|
340
|
+
return /** @type {HTMLElement} */ this.config?.contentNode;
|
|
300
341
|
}
|
|
301
342
|
|
|
302
343
|
/**
|
|
@@ -307,9 +348,7 @@ export class OverlayController extends EventTarget {
|
|
|
307
348
|
* @type {HTMLElement}
|
|
308
349
|
*/
|
|
309
350
|
get contentWrapperNode() {
|
|
310
|
-
return /** @type {HTMLElement} */
|
|
311
|
-
this.__contentWrapperNode || this.config?.contentWrapperNode
|
|
312
|
-
);
|
|
351
|
+
return /** @type {HTMLElement} */ this.__contentWrapperNode || this.config?.contentWrapperNode;
|
|
313
352
|
}
|
|
314
353
|
|
|
315
354
|
/**
|
|
@@ -318,7 +357,7 @@ export class OverlayController extends EventTarget {
|
|
|
318
357
|
* @type {HTMLElement}
|
|
319
358
|
*/
|
|
320
359
|
get backdropNode() {
|
|
321
|
-
return /** @type {HTMLElement} */
|
|
360
|
+
return /** @type {HTMLElement} */ this.__backdropNode || this.config?.backdropNode;
|
|
322
361
|
}
|
|
323
362
|
|
|
324
363
|
/**
|
|
@@ -326,8 +365,9 @@ export class OverlayController extends EventTarget {
|
|
|
326
365
|
* @type {HTMLElement}
|
|
327
366
|
*/
|
|
328
367
|
get elementToFocusAfterHide() {
|
|
329
|
-
return
|
|
330
|
-
this.__elementToFocusAfterHide ||
|
|
368
|
+
return (
|
|
369
|
+
/** @type {HTMLElement} */ this.__elementToFocusAfterHide ||
|
|
370
|
+
this.config?.elementToFocusAfterHide
|
|
331
371
|
);
|
|
332
372
|
}
|
|
333
373
|
|
|
@@ -336,7 +376,7 @@ export class OverlayController extends EventTarget {
|
|
|
336
376
|
* @type {boolean}
|
|
337
377
|
*/
|
|
338
378
|
get hasBackdrop() {
|
|
339
|
-
return /** @type {boolean} */
|
|
379
|
+
return /** @type {boolean} */ !!this.backdropNode || this.config?.hasBackdrop;
|
|
340
380
|
}
|
|
341
381
|
|
|
342
382
|
/**
|
|
@@ -344,7 +384,7 @@ export class OverlayController extends EventTarget {
|
|
|
344
384
|
* @type {boolean}
|
|
345
385
|
*/
|
|
346
386
|
get isBlocking() {
|
|
347
|
-
return /** @type {boolean} */
|
|
387
|
+
return /** @type {boolean} */ this.config?.isBlocking;
|
|
348
388
|
}
|
|
349
389
|
|
|
350
390
|
/**
|
|
@@ -352,7 +392,7 @@ export class OverlayController extends EventTarget {
|
|
|
352
392
|
* @type {boolean}
|
|
353
393
|
*/
|
|
354
394
|
get preventsScroll() {
|
|
355
|
-
return /** @type {boolean} */
|
|
395
|
+
return /** @type {boolean} */ this.config?.preventsScroll;
|
|
356
396
|
}
|
|
357
397
|
|
|
358
398
|
/**
|
|
@@ -360,7 +400,7 @@ export class OverlayController extends EventTarget {
|
|
|
360
400
|
* @type {boolean}
|
|
361
401
|
*/
|
|
362
402
|
get trapsKeyboardFocus() {
|
|
363
|
-
return /** @type {boolean} */
|
|
403
|
+
return /** @type {boolean} */ this.config?.trapsKeyboardFocus;
|
|
364
404
|
}
|
|
365
405
|
|
|
366
406
|
/**
|
|
@@ -368,7 +408,7 @@ export class OverlayController extends EventTarget {
|
|
|
368
408
|
* @type {boolean}
|
|
369
409
|
*/
|
|
370
410
|
get hidesOnEsc() {
|
|
371
|
-
return /** @type {boolean} */
|
|
411
|
+
return /** @type {boolean} */ this.config?.hidesOnEsc;
|
|
372
412
|
}
|
|
373
413
|
|
|
374
414
|
/**
|
|
@@ -376,7 +416,7 @@ export class OverlayController extends EventTarget {
|
|
|
376
416
|
* @type {boolean}
|
|
377
417
|
*/
|
|
378
418
|
get hidesOnOutsideClick() {
|
|
379
|
-
return /** @type {boolean} */
|
|
419
|
+
return /** @type {boolean} */ this.config?.hidesOnOutsideClick;
|
|
380
420
|
}
|
|
381
421
|
|
|
382
422
|
/**
|
|
@@ -384,7 +424,7 @@ export class OverlayController extends EventTarget {
|
|
|
384
424
|
* @type {boolean}
|
|
385
425
|
*/
|
|
386
426
|
get hidesOnOutsideEsc() {
|
|
387
|
-
return /** @type {boolean} */
|
|
427
|
+
return /** @type {boolean} */ this.config?.hidesOnOutsideEsc;
|
|
388
428
|
}
|
|
389
429
|
|
|
390
430
|
/**
|
|
@@ -411,7 +451,7 @@ export class OverlayController extends EventTarget {
|
|
|
411
451
|
* @type {boolean}
|
|
412
452
|
*/
|
|
413
453
|
get handlesAccessibility() {
|
|
414
|
-
return /** @type {boolean} */
|
|
454
|
+
return /** @type {boolean} */ this.config?.handlesAccessibility;
|
|
415
455
|
}
|
|
416
456
|
|
|
417
457
|
/**
|
|
@@ -420,7 +460,7 @@ export class OverlayController extends EventTarget {
|
|
|
420
460
|
* @type {boolean}
|
|
421
461
|
*/
|
|
422
462
|
get isTooltip() {
|
|
423
|
-
return /** @type {boolean} */
|
|
463
|
+
return /** @type {boolean} */ this.config?.isTooltip;
|
|
424
464
|
}
|
|
425
465
|
|
|
426
466
|
/**
|
|
@@ -428,7 +468,7 @@ export class OverlayController extends EventTarget {
|
|
|
428
468
|
* to communicate an important message and require a response.
|
|
429
469
|
*/
|
|
430
470
|
get isAlertDialog() {
|
|
431
|
-
return /** @type {boolean} */
|
|
471
|
+
return /** @type {boolean} */ this.config?.isAlertDialog;
|
|
432
472
|
}
|
|
433
473
|
|
|
434
474
|
/**
|
|
@@ -445,7 +485,7 @@ export class OverlayController extends EventTarget {
|
|
|
445
485
|
* @type {PopperOptions}
|
|
446
486
|
*/
|
|
447
487
|
get popperConfig() {
|
|
448
|
-
return /** @type {PopperOptions} */
|
|
488
|
+
return /** @type {PopperOptions} */ this.config?.popperConfig;
|
|
449
489
|
}
|
|
450
490
|
|
|
451
491
|
/**
|
|
@@ -453,11 +493,10 @@ export class OverlayController extends EventTarget {
|
|
|
453
493
|
* @type {ViewportConfig}
|
|
454
494
|
*/
|
|
455
495
|
get viewportConfig() {
|
|
456
|
-
return /** @type {ViewportConfig} */
|
|
496
|
+
return /** @type {ViewportConfig} */ this.config?.viewportConfig;
|
|
457
497
|
}
|
|
458
|
-
|
|
459
498
|
get visibilityTriggerFunction() {
|
|
460
|
-
return /** @type {function} */
|
|
499
|
+
return /** @type {function} */ this.config?.visibilityTriggerFunction;
|
|
461
500
|
}
|
|
462
501
|
|
|
463
502
|
/**
|
|
@@ -492,20 +531,20 @@ export class OverlayController extends EventTarget {
|
|
|
492
531
|
* @param { OverlayConfig } cfgToAdd
|
|
493
532
|
*/
|
|
494
533
|
updateConfig(cfgToAdd) {
|
|
495
|
-
// Teardown all previous configs
|
|
496
|
-
this.teardown();
|
|
497
|
-
|
|
498
534
|
/**
|
|
499
535
|
* @type {OverlayConfig}
|
|
500
536
|
* @private
|
|
501
537
|
*/
|
|
502
|
-
|
|
538
|
+
const prevConfig = this.config;
|
|
503
539
|
|
|
504
540
|
/** @type {OverlayConfig} */
|
|
505
|
-
|
|
506
|
-
...this._defaultConfig,
|
|
507
|
-
|
|
508
|
-
...
|
|
541
|
+
const newConfig = {
|
|
542
|
+
...this._defaultConfig,
|
|
543
|
+
// our basic ingredients
|
|
544
|
+
...this.__sharedConfig,
|
|
545
|
+
// the initial configured overlayController
|
|
546
|
+
...cfgToAdd,
|
|
547
|
+
// the added config
|
|
509
548
|
popperConfig: {
|
|
510
549
|
...(this._defaultConfig.popperConfig || {}),
|
|
511
550
|
...(this.__sharedConfig.popperConfig || {}),
|
|
@@ -517,21 +556,23 @@ export class OverlayController extends EventTarget {
|
|
|
517
556
|
],
|
|
518
557
|
},
|
|
519
558
|
};
|
|
559
|
+
const shouldUpdate = !this.__hasSetup || !isEqualConfig(prevConfig, newConfig);
|
|
560
|
+
if (!shouldUpdate) return;
|
|
561
|
+
// Teardown all previous configs
|
|
562
|
+
|
|
563
|
+
this.teardown();
|
|
564
|
+
this.config = newConfig;
|
|
520
565
|
|
|
521
566
|
/** @private */
|
|
522
567
|
this.__validateConfiguration(this.config);
|
|
523
568
|
/** @protected */
|
|
524
569
|
this._init();
|
|
525
|
-
/** @private */
|
|
526
|
-
this.__elementToFocusAfterHide = undefined;
|
|
527
|
-
|
|
528
570
|
if (!this.#isRegisteredOnManager()) {
|
|
529
571
|
this.manager.add(this);
|
|
530
572
|
}
|
|
531
573
|
}
|
|
532
|
-
|
|
533
574
|
#isRegisteredOnManager() {
|
|
534
|
-
return Boolean(this.manager.list.find(ctrl => this === ctrl));
|
|
575
|
+
return Boolean(this.manager.list.find((ctrl) => this === ctrl));
|
|
535
576
|
}
|
|
536
577
|
|
|
537
578
|
/**
|
|
@@ -545,7 +586,7 @@ export class OverlayController extends EventTarget {
|
|
|
545
586
|
'[OverlayController] You need to provide a .placementMode ("global"|"local")',
|
|
546
587
|
);
|
|
547
588
|
}
|
|
548
|
-
if (!['global', 'local'].includes(newConfig.placementMode)) {
|
|
589
|
+
if (!['global', 'local', 'custom'].includes(newConfig.placementMode)) {
|
|
549
590
|
throw new Error(
|
|
550
591
|
`[OverlayController] "${newConfig.placementMode}" is not a valid .placementMode, use ("global"|"local")`,
|
|
551
592
|
);
|
|
@@ -564,35 +605,64 @@ export class OverlayController extends EventTarget {
|
|
|
564
605
|
* @protected
|
|
565
606
|
*/
|
|
566
607
|
_init() {
|
|
567
|
-
if (!this.
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
608
|
+
if (!this.config.isActivated) return;
|
|
609
|
+
|
|
610
|
+
// TODO: should not be behind a flag when we are fully tearing down...
|
|
611
|
+
// TODO 2: When we move away from dialog (use popover to paint to top layer)
|
|
612
|
+
// and popper.js, (use popover and anchor positioning and popperjs as fallback, but we can put styles on contentNode),
|
|
613
|
+
// we dont need to create complex wrappers
|
|
614
|
+
// if (!this.__contentHasBeenInitialized) {
|
|
615
|
+
this.__initContentDomStructure();
|
|
616
|
+
// this.__contentHasBeenInitialized = true;
|
|
617
|
+
// }
|
|
618
|
+
this.__initVisibility();
|
|
571
619
|
|
|
572
620
|
// Reset all positioning styles (local, c.q. Popper) and classes (global)
|
|
573
|
-
this.contentWrapperNode.
|
|
574
|
-
|
|
575
|
-
|
|
621
|
+
if (this.contentWrapperNode !== this.contentNode) {
|
|
622
|
+
this.contentWrapperNode.removeAttribute('style');
|
|
623
|
+
this.contentWrapperNode.removeAttribute('class');
|
|
624
|
+
}
|
|
576
625
|
if (this.placementMode === 'local') {
|
|
577
626
|
// Lazily load Popper as soon as the first local overlay is used...
|
|
578
627
|
if (!OverlayController.popperModule) {
|
|
579
628
|
OverlayController.popperModule = preloadPopper();
|
|
580
629
|
}
|
|
581
630
|
}
|
|
582
|
-
this.__handleOverlayStyles({
|
|
583
|
-
|
|
631
|
+
this.__handleOverlayStyles({
|
|
632
|
+
phase: 'init',
|
|
633
|
+
});
|
|
634
|
+
this._handleFeatures({
|
|
635
|
+
phase: 'init',
|
|
636
|
+
});
|
|
637
|
+
|
|
638
|
+
/** @private */
|
|
639
|
+
this.__elementToFocusAfterHide = undefined;
|
|
640
|
+
this.contentNode.dataset.content = '';
|
|
641
|
+
|
|
642
|
+
// Use event delegation to listen for clicks on close buttons...
|
|
643
|
+
this.contentNode.addEventListener('click', this.#hideOnCloseButtonClick);
|
|
644
|
+
this.__hasSetup = true;
|
|
584
645
|
}
|
|
646
|
+
#hideOnCloseButtonClick = (/** @type {{ target: any; }} */ ev) => {
|
|
647
|
+
const isOurCloseButton =
|
|
648
|
+
ev.target.hasAttribute('data-close') &&
|
|
649
|
+
deepClosest(ev.target, '[data-content]') === this.contentNode;
|
|
650
|
+
if (!isOurCloseButton) return;
|
|
651
|
+
this.hide();
|
|
652
|
+
};
|
|
585
653
|
|
|
586
654
|
/**
|
|
587
655
|
* @param {{ phase: OverlayPhase }} config
|
|
588
656
|
* @private
|
|
589
657
|
*/
|
|
590
658
|
__handleOverlayStyles({ phase }) {
|
|
591
|
-
const rootNode = /** @type {ShadowRoot} */
|
|
659
|
+
const rootNode = /** @type {ShadowRoot} */ this.contentWrapperNode?.getRootNode();
|
|
592
660
|
if (phase === 'init') {
|
|
593
661
|
_adoptStyleUtils.adoptStyle(rootNode, overlayShadowDomStyle);
|
|
594
662
|
} else if (phase === 'teardown') {
|
|
595
|
-
_adoptStyleUtils.adoptStyle(rootNode, overlayShadowDomStyle, {
|
|
663
|
+
_adoptStyleUtils.adoptStyle(rootNode, overlayShadowDomStyle, {
|
|
664
|
+
teardown: true,
|
|
665
|
+
});
|
|
596
666
|
}
|
|
597
667
|
}
|
|
598
668
|
|
|
@@ -623,84 +693,107 @@ export class OverlayController extends EventTarget {
|
|
|
623
693
|
* @private
|
|
624
694
|
*/
|
|
625
695
|
__initContentDomStructure() {
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
this.__contentWrapperNode = document.createElement('div');
|
|
650
|
-
}
|
|
651
|
-
this.contentWrapperNode.setAttribute('data-id', 'content-wrapper');
|
|
652
|
-
// 'hack' that makes sure popperjs (that is applied one level lower) works correctly in deeply nested shadow roots
|
|
653
|
-
this.contentWrapperNode.style.transform = 'translateZ(0px)';
|
|
696
|
+
if (this.placementMode !== 'custom') {
|
|
697
|
+
const wrappingDialogElement = document.createElement('dialog');
|
|
698
|
+
// We use a dialog for its visual capabilities: it renders to the top layer.
|
|
699
|
+
// A11y will depend on the type of overlay and is arranged on contentNode level.
|
|
700
|
+
// Also see: https://www.scottohara.me/blog/2019/03/05/open-dialog.html
|
|
701
|
+
//
|
|
702
|
+
// The role="dialog" is set on the contentNode (or another role), so role="none"
|
|
703
|
+
// is valid here, although AXE complains about this setup.
|
|
704
|
+
// For now we need to add `ignoredRules: ['aria-allowed-role']` in your AXE tests.
|
|
705
|
+
// see: https://lion.js.org/fundamentals/systems/overlays/rationale/#considerations
|
|
706
|
+
wrappingDialogElement.setAttribute('role', 'none');
|
|
707
|
+
wrappingDialogElement.setAttribute('data-overlay-outer-wrapper', '');
|
|
708
|
+
// N.B. position: fixed is needed to escape out of 'overflow: hidden'
|
|
709
|
+
// We give a high z-index for non-modal dialogs, so that we at least win from all siblings of our
|
|
710
|
+
// parent stacking context
|
|
711
|
+
// padding reset so we don't get a weird dialog visual square showing up
|
|
712
|
+
wrappingDialogElement.style.cssText = `display:none; z-index: ${this.config.zIndex}; padding: 0;`;
|
|
713
|
+
// @ts-ignore - 'custom' is a valid extension of placementMode
|
|
714
|
+
if (this.config.placementMode === 'custom') {
|
|
715
|
+
// The user should have full freedom to control the content node, so its wrapper nodes should remain neutral.
|
|
716
|
+
wrappingDialogElement.style.cssText += `position: static;`;
|
|
717
|
+
}
|
|
718
|
+
this.__wrappingDialogNode = wrappingDialogElement;
|
|
654
719
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
720
|
+
/**
|
|
721
|
+
* Based on the configuration of the developer, multiple scenarios are accounted for
|
|
722
|
+
* A. We already have a contentWrapperNode ()
|
|
723
|
+
*/
|
|
724
|
+
if (!this.config?.contentWrapperNode) {
|
|
725
|
+
this.__contentWrapperNode = document.createElement('div');
|
|
726
|
+
}
|
|
727
|
+
this.contentWrapperNode.setAttribute('data-id', 'content-wrapper');
|
|
728
|
+
// 'hack' that makes sure popperjs (that is applied one level lower) works correctly in deeply nested shadow roots
|
|
729
|
+
this.contentWrapperNode.style.transform = 'translateZ(0px)';
|
|
730
|
+
this.__rearrangeNodesCleanup = rearrangeNodes({
|
|
731
|
+
wrappingDialogNodeL1: wrappingDialogElement,
|
|
732
|
+
contentWrapperNodeL2: this.contentWrapperNode,
|
|
733
|
+
contentNodeL3: this.contentNode,
|
|
734
|
+
// requireConnectedNodes: Boolean(this.config.requireConnectedNodes),
|
|
735
|
+
});
|
|
736
|
+
wrappingDialogElement.open = true;
|
|
737
|
+
if (this.isTooltip) {
|
|
738
|
+
// needed to prevent tooltip getting focus in Safari and Firefox
|
|
739
|
+
wrappingDialogElement.setAttribute('tabindex', '-1');
|
|
740
|
+
}
|
|
741
|
+
this.contentWrapperNode.style.zIndex = '1';
|
|
742
|
+
if (getComputedStyle(this.contentNode).position === 'absolute') {
|
|
743
|
+
// Having a _contWrapperNode and a contentNode with 'position:absolute' results in
|
|
744
|
+
// computed height of 0...
|
|
745
|
+
this.contentNode.style.position = 'static';
|
|
746
|
+
}
|
|
661
747
|
|
|
662
|
-
|
|
663
|
-
//
|
|
664
|
-
|
|
748
|
+
// Here we prevent any interference of the native <dialog> element with the keyboard behavior
|
|
749
|
+
// as defined by the OverlayController. This is needed until we can configure `closedby="none"`
|
|
750
|
+
// on the native dialog for all browsers: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby
|
|
751
|
+
const hasClosedBySupport = HTMLDialogElement && 'closedBy' in HTMLDialogElement.prototype;
|
|
752
|
+
if (hasClosedBySupport) {
|
|
753
|
+
// @ts-ignore - closedBy is a newer property not in all TypeScript versions
|
|
754
|
+
wrappingDialogElement.closedBy = 'none';
|
|
755
|
+
} else {
|
|
756
|
+
wrappingDialogElement.addEventListener(
|
|
757
|
+
'keydown',
|
|
758
|
+
(/** @type {* & KeyboardEvent} */ event) => {
|
|
759
|
+
if (event.key === 'Escape') {
|
|
760
|
+
event.preventDefault();
|
|
761
|
+
}
|
|
762
|
+
},
|
|
763
|
+
);
|
|
764
|
+
wrappingDialogElement.addEventListener(
|
|
765
|
+
'keyup',
|
|
766
|
+
(/** @type {* & KeyboardEvent} */ event) => {
|
|
767
|
+
if (event.key === 'Escape') {
|
|
768
|
+
event.preventDefault();
|
|
769
|
+
}
|
|
770
|
+
},
|
|
771
|
+
);
|
|
772
|
+
wrappingDialogElement.addEventListener('cancel', (event) => {
|
|
773
|
+
event.stopPropagation();
|
|
774
|
+
});
|
|
775
|
+
wrappingDialogElement.addEventListener('close', (event) => {
|
|
776
|
+
event.stopPropagation();
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
} else {
|
|
780
|
+
// quick hack to make none-popper/global flows work...
|
|
781
|
+
this.__contentWrapperNode = this.contentNode;
|
|
782
|
+
this.__wrappingDialogNode = this.contentNode;
|
|
665
783
|
}
|
|
666
|
-
|
|
784
|
+
}
|
|
785
|
+
__initVisibility() {
|
|
786
|
+
// TODO: allow defaultOpen?
|
|
787
|
+
/** @type {HTMLDialogElement} */
|
|
667
788
|
this.__wrappingDialogNode.style.display = 'none';
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
if (getComputedStyle(this.contentNode).position === 'absolute') {
|
|
671
|
-
// Having a _contWrapperNode and a contentNode with 'position:absolute' results in
|
|
672
|
-
// computed height of 0...
|
|
673
|
-
this.contentNode.style.position = 'static';
|
|
674
|
-
}
|
|
789
|
+
}
|
|
675
790
|
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
wrappingDialogElement.closedBy = 'none';
|
|
683
|
-
} else {
|
|
684
|
-
wrappingDialogElement.addEventListener(
|
|
685
|
-
'keydown',
|
|
686
|
-
(/** @type {* & KeyboardEvent} */ event) => {
|
|
687
|
-
if (event.key === 'Escape') {
|
|
688
|
-
event.preventDefault();
|
|
689
|
-
}
|
|
690
|
-
},
|
|
691
|
-
);
|
|
692
|
-
wrappingDialogElement.addEventListener('keyup', (/** @type {* & KeyboardEvent} */ event) => {
|
|
693
|
-
if (event.key === 'Escape') {
|
|
694
|
-
event.preventDefault();
|
|
695
|
-
}
|
|
696
|
-
});
|
|
697
|
-
wrappingDialogElement.addEventListener('cancel', event => {
|
|
698
|
-
event.stopPropagation();
|
|
699
|
-
});
|
|
700
|
-
wrappingDialogElement.addEventListener('close', event => {
|
|
701
|
-
event.stopPropagation();
|
|
702
|
-
});
|
|
703
|
-
}
|
|
791
|
+
// Clean up the DOM structure, leaving it as we found it.
|
|
792
|
+
// TODO: __teardownContentDomStructure method... use Resettable (rename ro Restorable) found in VisibilitToggleCtrl
|
|
793
|
+
__teardownVisibility() {
|
|
794
|
+
// TODO: full structure. For now we just reset display prop...
|
|
795
|
+
/** @type {HTMLDialogElement} */
|
|
796
|
+
this.__wrappingDialogNode.style.display = '';
|
|
704
797
|
}
|
|
705
798
|
|
|
706
799
|
/**
|
|
@@ -712,7 +805,6 @@ export class OverlayController extends EventTarget {
|
|
|
712
805
|
if (this.placementMode !== 'local') {
|
|
713
806
|
return;
|
|
714
807
|
}
|
|
715
|
-
|
|
716
808
|
if (phase === 'setup') {
|
|
717
809
|
const zIndexNumber = Number(getComputedStyle(this.contentNode).zIndex);
|
|
718
810
|
if (zIndexNumber < 1 || Number.isNaN(zIndexNumber)) {
|
|
@@ -729,7 +821,6 @@ export class OverlayController extends EventTarget {
|
|
|
729
821
|
if (phase === 'init') {
|
|
730
822
|
this.__storeOriginalAttrs(this.contentNode, ['role', 'id']);
|
|
731
823
|
const isModal = this.trapsKeyboardFocus;
|
|
732
|
-
|
|
733
824
|
if (this.invokerNode) {
|
|
734
825
|
const attributesToStore = ['aria-labelledby', 'aria-describedby'];
|
|
735
826
|
if (!isModal) {
|
|
@@ -737,7 +828,6 @@ export class OverlayController extends EventTarget {
|
|
|
737
828
|
}
|
|
738
829
|
this.__storeOriginalAttrs(this.invokerNode, attributesToStore);
|
|
739
830
|
}
|
|
740
|
-
|
|
741
831
|
if (!this.contentNode.id) {
|
|
742
832
|
this.contentNode.setAttribute('id', this._contentId);
|
|
743
833
|
}
|
|
@@ -773,7 +863,7 @@ export class OverlayController extends EventTarget {
|
|
|
773
863
|
__storeOriginalAttrs(node, attrs) {
|
|
774
864
|
/** @type {Record<string, any>} */
|
|
775
865
|
const attrMap = {};
|
|
776
|
-
attrs.forEach(attrName => {
|
|
866
|
+
attrs.forEach((attrName) => {
|
|
777
867
|
attrMap[attrName] = node.getAttribute(attrName);
|
|
778
868
|
});
|
|
779
869
|
this.__originalAttrs.set(node, attrMap);
|
|
@@ -792,9 +882,8 @@ export class OverlayController extends EventTarget {
|
|
|
792
882
|
}
|
|
793
883
|
this.__originalAttrs.clear();
|
|
794
884
|
}
|
|
795
|
-
|
|
796
885
|
get isShown() {
|
|
797
|
-
return Boolean(this.__wrappingDialogNode
|
|
886
|
+
return Boolean(this.__wrappingDialogNode && this.__wrappingDialogNode.style.display !== 'none');
|
|
798
887
|
}
|
|
799
888
|
|
|
800
889
|
/**
|
|
@@ -808,32 +897,47 @@ export class OverlayController extends EventTarget {
|
|
|
808
897
|
if (this._showComplete) {
|
|
809
898
|
await this._showComplete;
|
|
810
899
|
}
|
|
811
|
-
this._showComplete = new Promise(resolve => {
|
|
900
|
+
this._showComplete = new Promise((resolve) => {
|
|
812
901
|
this._showResolve = resolve;
|
|
813
902
|
});
|
|
814
903
|
|
|
904
|
+
// Teardown() removes the content dom structure we created (contentWrapperNode +
|
|
905
|
+
// wrapping <dialog>). Make sure it exists again before the manager (which sets
|
|
906
|
+
// our elevation on the wrapping node) and the show logic below touch it.
|
|
907
|
+
if (!this.__wrappingDialogNode) {
|
|
908
|
+
this._init();
|
|
909
|
+
}
|
|
815
910
|
if (this.manager) {
|
|
816
911
|
this.manager.show(this);
|
|
817
912
|
}
|
|
818
|
-
|
|
819
913
|
if (this.isShown) {
|
|
820
914
|
/** @type {function} */
|
|
821
|
-
|
|
915
|
+
this._showResolve();
|
|
822
916
|
return;
|
|
823
917
|
}
|
|
824
|
-
|
|
825
|
-
|
|
918
|
+
const event = new CustomEvent('before-show', {
|
|
919
|
+
cancelable: true,
|
|
920
|
+
});
|
|
826
921
|
this.dispatchEvent(event);
|
|
827
922
|
if (!event.defaultPrevented) {
|
|
828
923
|
if ('HTMLDialogElement' in window && this.__wrappingDialogNode instanceof HTMLDialogElement) {
|
|
829
924
|
this.__wrappingDialogNode.open = true;
|
|
830
925
|
}
|
|
926
|
+
|
|
831
927
|
// @ts-ignore
|
|
832
928
|
this.__wrappingDialogNode.style.display = '';
|
|
833
|
-
this._keepBodySize({
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
await this.
|
|
929
|
+
this._keepBodySize({
|
|
930
|
+
phase: 'before-show',
|
|
931
|
+
});
|
|
932
|
+
await this._handleFeatures({
|
|
933
|
+
phase: 'show',
|
|
934
|
+
});
|
|
935
|
+
this._keepBodySize({
|
|
936
|
+
phase: 'show',
|
|
937
|
+
});
|
|
938
|
+
await this._handlePosition({
|
|
939
|
+
phase: 'show',
|
|
940
|
+
});
|
|
837
941
|
this.__elementToFocusAfterHide = elementToFocusAfterHide;
|
|
838
942
|
this.dispatchEvent(new Event('show'));
|
|
839
943
|
await this._transitionShow({
|
|
@@ -841,8 +945,17 @@ export class OverlayController extends EventTarget {
|
|
|
841
945
|
contentNode: this.contentNode,
|
|
842
946
|
});
|
|
843
947
|
}
|
|
948
|
+
|
|
949
|
+
// a styling/debug hook for open state
|
|
950
|
+
this.contentNode.setAttribute('data-open', '');
|
|
951
|
+
if (this.config.elementToFocusOnShow) {
|
|
952
|
+
this.contentNode.focus({
|
|
953
|
+
preventScroll: true,
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
|
|
844
957
|
/** @type {function} */
|
|
845
|
-
|
|
958
|
+
this._showResolve();
|
|
846
959
|
}
|
|
847
960
|
|
|
848
961
|
/**
|
|
@@ -852,7 +965,6 @@ export class OverlayController extends EventTarget {
|
|
|
852
965
|
async _handlePosition({ phase }) {
|
|
853
966
|
if (this.placementMode === 'global') {
|
|
854
967
|
const placementClass = `overlays__overlay-container--${this.viewportConfig.placement}`;
|
|
855
|
-
|
|
856
968
|
if (phase === 'show') {
|
|
857
969
|
this.contentWrapperNode.classList.add('overlays__overlay-container');
|
|
858
970
|
this.contentWrapperNode.classList.add(placementClass);
|
|
@@ -871,8 +983,10 @@ export class OverlayController extends EventTarget {
|
|
|
871
983
|
* This is however necessary for initial placement.
|
|
872
984
|
*/
|
|
873
985
|
await this.__createPopperInstance();
|
|
874
|
-
/** @type {import('@popperjs/core').Instance} */
|
|
986
|
+
/** @type {import('@popperjs/core').Instance} */
|
|
987
|
+
this._popper.forceUpdate();
|
|
875
988
|
}
|
|
989
|
+
// N.B. leave it up to the user if placementMode === 'custom'
|
|
876
990
|
}
|
|
877
991
|
|
|
878
992
|
/**
|
|
@@ -880,11 +994,10 @@ export class OverlayController extends EventTarget {
|
|
|
880
994
|
* @protected
|
|
881
995
|
*/
|
|
882
996
|
_keepBodySize({ phase }) {
|
|
883
|
-
if (!this.preventsScroll)
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
this.manager.requestToKeepBodySize({ phase });
|
|
997
|
+
if (!this.preventsScroll) return;
|
|
998
|
+
this.manager.requestToKeepBodySize({
|
|
999
|
+
phase,
|
|
1000
|
+
});
|
|
888
1001
|
}
|
|
889
1002
|
|
|
890
1003
|
/**
|
|
@@ -892,7 +1005,9 @@ export class OverlayController extends EventTarget {
|
|
|
892
1005
|
* @event hide right after the overlay is hidden
|
|
893
1006
|
*/
|
|
894
1007
|
async hide() {
|
|
895
|
-
|
|
1008
|
+
// Function like a no-op for dynamic edge cases...
|
|
1009
|
+
if (!this.config.isActivated) return;
|
|
1010
|
+
this._hideComplete = new Promise((resolve) => {
|
|
896
1011
|
this._hideResolve = resolve;
|
|
897
1012
|
});
|
|
898
1013
|
|
|
@@ -900,39 +1015,41 @@ export class OverlayController extends EventTarget {
|
|
|
900
1015
|
// while the dialog was open.
|
|
901
1016
|
// We need this in the _restoreFocus method to determine if we should focus this.elementToFocusAfterHide when the
|
|
902
1017
|
// dialog is closed or keep focus on the element that the user deliberately gave focus
|
|
903
|
-
this.__activeElementRightBeforeHide =
|
|
904
|
-
this.contentNode.getRootNode()
|
|
905
|
-
).activeElement;
|
|
906
|
-
|
|
1018
|
+
this.__activeElementRightBeforeHide =
|
|
1019
|
+
/** @type {ShadowRoot} */ this.contentNode.getRootNode().activeElement;
|
|
907
1020
|
if (this.manager && this.#isRegisteredOnManager()) {
|
|
908
1021
|
this.manager.hide(this);
|
|
909
1022
|
}
|
|
910
|
-
|
|
911
1023
|
if (!this.isShown) {
|
|
912
|
-
/** @type {function} */
|
|
1024
|
+
/** @type {function} */ this._hideResolve();
|
|
913
1025
|
return;
|
|
914
1026
|
}
|
|
915
|
-
|
|
916
|
-
|
|
1027
|
+
const event = new CustomEvent('before-hide', {
|
|
1028
|
+
cancelable: true,
|
|
1029
|
+
});
|
|
917
1030
|
this.dispatchEvent(event);
|
|
918
1031
|
if (!event.defaultPrevented) {
|
|
919
1032
|
await this._transitionHide({
|
|
920
1033
|
backdropNode: this.backdropNode,
|
|
921
1034
|
contentNode: this.contentNode,
|
|
922
1035
|
});
|
|
923
|
-
|
|
924
1036
|
if ('HTMLDialogElement' in window && this.__wrappingDialogNode instanceof HTMLDialogElement) {
|
|
925
1037
|
this.__wrappingDialogNode.close();
|
|
926
1038
|
}
|
|
927
|
-
|
|
928
1039
|
// @ts-ignore
|
|
929
1040
|
this.__wrappingDialogNode.style.display = 'none';
|
|
930
|
-
this._handleFeatures({
|
|
931
|
-
|
|
1041
|
+
this._handleFeatures({
|
|
1042
|
+
phase: 'hide',
|
|
1043
|
+
});
|
|
1044
|
+
this._keepBodySize({
|
|
1045
|
+
phase: 'hide',
|
|
1046
|
+
});
|
|
932
1047
|
this.dispatchEvent(new Event('hide'));
|
|
933
1048
|
this._restoreFocus();
|
|
934
1049
|
}
|
|
935
|
-
/** @type {function} */
|
|
1050
|
+
/** @type {function} */
|
|
1051
|
+
this._hideResolve();
|
|
1052
|
+
this.contentNode.removeAttribute('data-open');
|
|
936
1053
|
}
|
|
937
1054
|
|
|
938
1055
|
/**
|
|
@@ -951,8 +1068,13 @@ export class OverlayController extends EventTarget {
|
|
|
951
1068
|
// eslint-disable-next-line class-methods-use-this, no-empty-function, no-unused-vars
|
|
952
1069
|
async _transitionHide({ backdropNode, contentNode }) {
|
|
953
1070
|
// `this.transitionHide` is a hook for our users
|
|
954
|
-
await this.transitionHide({
|
|
955
|
-
|
|
1071
|
+
await this.transitionHide({
|
|
1072
|
+
backdropNode,
|
|
1073
|
+
contentNode,
|
|
1074
|
+
});
|
|
1075
|
+
this._handlePosition({
|
|
1076
|
+
phase: 'hide',
|
|
1077
|
+
});
|
|
956
1078
|
if (!backdropNode) {
|
|
957
1079
|
return;
|
|
958
1080
|
}
|
|
@@ -974,8 +1096,10 @@ export class OverlayController extends EventTarget {
|
|
|
974
1096
|
// eslint-disable-next-line class-methods-use-this, no-empty-function, no-unused-vars
|
|
975
1097
|
async _transitionShow(showConfig) {
|
|
976
1098
|
// `this.transitionShow` is a hook for our users
|
|
977
|
-
await this.transitionShow({
|
|
978
|
-
|
|
1099
|
+
await this.transitionShow({
|
|
1100
|
+
backdropNode: this.backdropNode,
|
|
1101
|
+
contentNode: this.contentNode,
|
|
1102
|
+
});
|
|
979
1103
|
if (showConfig.backdropNode) {
|
|
980
1104
|
showConfig.backdropNode.classList.add(`overlays__backdrop--animation-in`);
|
|
981
1105
|
}
|
|
@@ -988,19 +1112,18 @@ export class OverlayController extends EventTarget {
|
|
|
988
1112
|
const weStillOwnActiveElement =
|
|
989
1113
|
this.__activeElementRightBeforeHide instanceof HTMLElement &&
|
|
990
1114
|
this.contentNode.contains(this.__activeElementRightBeforeHide);
|
|
991
|
-
|
|
992
1115
|
if (!weStillOwnActiveElement) {
|
|
993
1116
|
return;
|
|
994
1117
|
}
|
|
995
|
-
|
|
996
1118
|
if (this.elementToFocusAfterHide instanceof HTMLElement) {
|
|
997
1119
|
this.elementToFocusAfterHide.focus();
|
|
998
|
-
this.elementToFocusAfterHide.scrollIntoView({
|
|
1120
|
+
this.elementToFocusAfterHide.scrollIntoView({
|
|
1121
|
+
block: 'nearest',
|
|
1122
|
+
});
|
|
999
1123
|
} else {
|
|
1000
|
-
/** @type {HTMLElement} */
|
|
1124
|
+
/** @type {HTMLElement} */ this.__activeElementRightBeforeHide.blur();
|
|
1001
1125
|
}
|
|
1002
1126
|
}
|
|
1003
|
-
|
|
1004
1127
|
async toggle() {
|
|
1005
1128
|
return this.isShown ? this.hide() : this.show();
|
|
1006
1129
|
}
|
|
@@ -1011,55 +1134,109 @@ export class OverlayController extends EventTarget {
|
|
|
1011
1134
|
* @protected
|
|
1012
1135
|
*/
|
|
1013
1136
|
_handleFeatures({ phase }) {
|
|
1014
|
-
this._handleZIndex({
|
|
1015
|
-
|
|
1137
|
+
this._handleZIndex({
|
|
1138
|
+
phase,
|
|
1139
|
+
});
|
|
1016
1140
|
if (this.preventsScroll) {
|
|
1017
|
-
this._handlePreventsScroll({
|
|
1141
|
+
this._handlePreventsScroll({
|
|
1142
|
+
phase,
|
|
1143
|
+
});
|
|
1018
1144
|
}
|
|
1019
1145
|
if (this.isBlocking) {
|
|
1020
|
-
this._handleBlocking({
|
|
1146
|
+
this._handleBlocking({
|
|
1147
|
+
phase,
|
|
1148
|
+
});
|
|
1021
1149
|
}
|
|
1022
1150
|
if (this.hasBackdrop) {
|
|
1023
|
-
this._handleBackdrop({
|
|
1151
|
+
this._handleBackdrop({
|
|
1152
|
+
phase,
|
|
1153
|
+
});
|
|
1024
1154
|
}
|
|
1025
1155
|
if (this.trapsKeyboardFocus) {
|
|
1026
|
-
this._handleTrapsKeyboardFocus({
|
|
1156
|
+
this._handleTrapsKeyboardFocus({
|
|
1157
|
+
phase,
|
|
1158
|
+
});
|
|
1027
1159
|
}
|
|
1028
1160
|
if (this.hidesOnEsc) {
|
|
1029
|
-
this._handleHidesOnEsc({
|
|
1161
|
+
this._handleHidesOnEsc({
|
|
1162
|
+
phase,
|
|
1163
|
+
});
|
|
1030
1164
|
}
|
|
1031
1165
|
if (this.hidesOnOutsideEsc) {
|
|
1032
|
-
this._handleHidesOnOutsideEsc({
|
|
1166
|
+
this._handleHidesOnOutsideEsc({
|
|
1167
|
+
phase,
|
|
1168
|
+
});
|
|
1033
1169
|
}
|
|
1034
1170
|
if (this.hidesOnOutsideClick) {
|
|
1035
|
-
this._handleHidesOnOutsideClick({
|
|
1171
|
+
this._handleHidesOnOutsideClick({
|
|
1172
|
+
phase,
|
|
1173
|
+
});
|
|
1036
1174
|
}
|
|
1037
1175
|
if (this.handlesAccessibility) {
|
|
1038
|
-
this._handleAccessibility({
|
|
1176
|
+
this._handleAccessibility({
|
|
1177
|
+
phase,
|
|
1178
|
+
});
|
|
1039
1179
|
}
|
|
1040
1180
|
if (this.inheritsReferenceWidth) {
|
|
1041
1181
|
this._handleInheritsReferenceWidth();
|
|
1042
1182
|
}
|
|
1043
1183
|
if (this.visibilityTriggerFunction) {
|
|
1044
|
-
this._handleVisibilityTriggers({
|
|
1184
|
+
this._handleVisibilityTriggers({
|
|
1185
|
+
phase,
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
if (this.config.syncChildrenCloseState) {
|
|
1189
|
+
this._handleSyncChildrenCloseState({
|
|
1190
|
+
phase,
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
if (this.config.elementToFocusOnShow) {
|
|
1194
|
+
this._handleElementToFocusOnShow({
|
|
1195
|
+
phase,
|
|
1196
|
+
});
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
* @param {{phase: OverlayPhase}} opts
|
|
1202
|
+
* @returns {void}
|
|
1203
|
+
*/
|
|
1204
|
+
_handleElementToFocusOnShow({ phase }) {
|
|
1205
|
+
if (phase === 'init') {
|
|
1206
|
+
this.contentNode?.setAttribute('tabindex', '-1');
|
|
1207
|
+
} else if (phase === 'teardown') {
|
|
1208
|
+
// TODO: capture initial attr, use Resettable mechanism of VisibilityToggleCtrl in whole Controller
|
|
1209
|
+
this.contentNode?.removeAttribute('tabindex');
|
|
1045
1210
|
}
|
|
1046
1211
|
}
|
|
1047
1212
|
|
|
1213
|
+
/**
|
|
1214
|
+
* @param {{phase: OverlayPhase}} opts
|
|
1215
|
+
* @returns {void}
|
|
1216
|
+
*/
|
|
1217
|
+
_handleSyncChildrenCloseState({ phase }) {
|
|
1218
|
+
if (phase !== 'hide') return;
|
|
1219
|
+
const visibleChildren = this.manager.shownList.filter(
|
|
1220
|
+
(ctrl) => ctrl !== this && deepContains(this.contentNode, ctrl.contentNode),
|
|
1221
|
+
);
|
|
1222
|
+
visibleChildren.forEach((ctrl) => ctrl.hide());
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1048
1225
|
/**
|
|
1049
1226
|
* @param {{ phase: OverlayPhase }} config
|
|
1050
1227
|
*/
|
|
1051
1228
|
_handleVisibilityTriggers({ phase }) {
|
|
1052
|
-
if (typeof this.visibilityTriggerFunction
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
this.__visibilityTriggerHandler[phase]();
|
|
1061
|
-
}
|
|
1229
|
+
if (typeof this.visibilityTriggerFunction !== 'function') return;
|
|
1230
|
+
|
|
1231
|
+
// Here we initialize the __visibilityTriggerHandler of our invokerNode. It's important that we ONLY do this on init,
|
|
1232
|
+
// otherwise we risk not being able to properly clean up listeners...
|
|
1233
|
+
if (phase === 'init') {
|
|
1234
|
+
this.__visibilityTriggerHandler = this.visibilityTriggerFunction({
|
|
1235
|
+
controller: this,
|
|
1236
|
+
});
|
|
1062
1237
|
}
|
|
1238
|
+
// Here we run the appropriate lifecycle, if defined in our handler
|
|
1239
|
+
this.__visibilityTriggerHandler[phase]?.();
|
|
1063
1240
|
}
|
|
1064
1241
|
|
|
1065
1242
|
/**
|
|
@@ -1096,7 +1273,6 @@ export class OverlayController extends EventTarget {
|
|
|
1096
1273
|
/* no default */
|
|
1097
1274
|
}
|
|
1098
1275
|
}
|
|
1099
|
-
|
|
1100
1276
|
get hasActiveBackdrop() {
|
|
1101
1277
|
return this.__hasActiveBackdrop;
|
|
1102
1278
|
}
|
|
@@ -1141,7 +1317,7 @@ export class OverlayController extends EventTarget {
|
|
|
1141
1317
|
/**
|
|
1142
1318
|
* @param {KeyboardEvent} event
|
|
1143
1319
|
*/
|
|
1144
|
-
#isShiftPressedOnKeyDownHandler = event => {
|
|
1320
|
+
#isShiftPressedOnKeyDownHandler = (event) => {
|
|
1145
1321
|
if (event.key === 'Shift') {
|
|
1146
1322
|
this.#isShiftPressed = true;
|
|
1147
1323
|
}
|
|
@@ -1150,26 +1326,23 @@ export class OverlayController extends EventTarget {
|
|
|
1150
1326
|
/**
|
|
1151
1327
|
* @param {KeyboardEvent} event
|
|
1152
1328
|
*/
|
|
1153
|
-
#isShiftPressedOnKeyUpHandler = event => {
|
|
1329
|
+
#isShiftPressedOnKeyUpHandler = (event) => {
|
|
1154
1330
|
if (event.key === 'Shift') {
|
|
1155
1331
|
this.#isShiftPressed = false;
|
|
1156
1332
|
}
|
|
1157
1333
|
};
|
|
1158
|
-
|
|
1159
1334
|
#handleShiftKeyPress = () => {
|
|
1160
1335
|
window.addEventListener('keydown', this.#isShiftPressedOnKeyDownHandler);
|
|
1161
1336
|
window.addEventListener('keyup', this.#isShiftPressedOnKeyUpHandler);
|
|
1162
1337
|
};
|
|
1163
|
-
|
|
1164
1338
|
#stopHandlingShiftKeyPress = () => {
|
|
1165
1339
|
window.removeEventListener('keydown', this.#isShiftPressedOnKeyDownHandler);
|
|
1166
1340
|
window.removeEventListener('keyup', this.#isShiftPressedOnKeyUpHandler);
|
|
1167
1341
|
};
|
|
1168
|
-
|
|
1169
1342
|
#getInitialElementToFocus = () => {
|
|
1170
1343
|
const focusableElements = getFocusableElements(this.contentNode);
|
|
1171
1344
|
// Initial focus goes to first element with autofocus, or `contentNode`
|
|
1172
|
-
return focusableElements.find(e => e.hasAttribute('autofocus')) || this.contentNode;
|
|
1345
|
+
return focusableElements.find((e) => e.hasAttribute('autofocus')) || this.contentNode;
|
|
1173
1346
|
};
|
|
1174
1347
|
|
|
1175
1348
|
/**
|
|
@@ -1204,7 +1377,6 @@ export class OverlayController extends EventTarget {
|
|
|
1204
1377
|
if (phase === 'init') {
|
|
1205
1378
|
this.contentNode.style.outline = 'none';
|
|
1206
1379
|
this.contentNode.tabIndex = -1;
|
|
1207
|
-
|
|
1208
1380
|
const isContentShadowHost = Boolean(this.contentNode.shadowRoot);
|
|
1209
1381
|
if (isContentShadowHost) {
|
|
1210
1382
|
// eslint-disable-next-line no-console
|
|
@@ -1216,7 +1388,9 @@ export class OverlayController extends EventTarget {
|
|
|
1216
1388
|
if (phase === 'show') {
|
|
1217
1389
|
this.#handleShiftKeyPress();
|
|
1218
1390
|
this.#handleFocusInsideDialog();
|
|
1391
|
+
// @ts-ignore - HTMLDialogElement methods
|
|
1219
1392
|
this.__wrappingDialogNode?.close();
|
|
1393
|
+
// @ts-ignore - HTMLDialogElement methods
|
|
1220
1394
|
this.__wrappingDialogNode?.showModal();
|
|
1221
1395
|
/**
|
|
1222
1396
|
* At this moment `#handleFocusInsideDialog` should handle the focus.
|
|
@@ -1255,7 +1429,6 @@ export class OverlayController extends EventTarget {
|
|
|
1255
1429
|
) {
|
|
1256
1430
|
return;
|
|
1257
1431
|
}
|
|
1258
|
-
|
|
1259
1432
|
if (this.#hasPressedInside(event)) {
|
|
1260
1433
|
this.__escKeyHandlerCalled = true;
|
|
1261
1434
|
this.hide();
|
|
@@ -1270,18 +1443,17 @@ export class OverlayController extends EventTarget {
|
|
|
1270
1443
|
* @param {KeyboardEvent} event
|
|
1271
1444
|
* @returns {boolean}
|
|
1272
1445
|
*/
|
|
1273
|
-
#hasPressedInside = event =>
|
|
1274
|
-
event.composedPath().includes(/** @type {EventTarget} */
|
|
1446
|
+
#hasPressedInside = (event) =>
|
|
1447
|
+
event.composedPath().includes(/** @type {EventTarget} */ this.__wrappingDialogNode) ||
|
|
1275
1448
|
(this.invokerNode && event.composedPath().includes(this.invokerNode)) ||
|
|
1276
|
-
deepContains(this.contentNode, /** @type {HTMLElement|ShadowRoot} */
|
|
1449
|
+
deepContains(this.contentNode, /** @type {HTMLElement|ShadowRoot} */ event.target);
|
|
1277
1450
|
|
|
1278
1451
|
/**
|
|
1279
1452
|
* @param {KeyboardEvent} event
|
|
1280
1453
|
* @returns {void}
|
|
1281
1454
|
*/
|
|
1282
|
-
#outsideEscKeyHandler = event => {
|
|
1455
|
+
#outsideEscKeyHandler = (event) => {
|
|
1283
1456
|
if (event.key !== 'Escape') return;
|
|
1284
|
-
|
|
1285
1457
|
if (this.#hasPressedInside(event)) return;
|
|
1286
1458
|
this.hide();
|
|
1287
1459
|
};
|
|
@@ -1353,7 +1525,6 @@ export class OverlayController extends EventTarget {
|
|
|
1353
1525
|
*/
|
|
1354
1526
|
_handleHidesOnOutsideClick({ phase }) {
|
|
1355
1527
|
const addOrRemoveListener = phase === 'show' ? 'addEventListener' : 'removeEventListener';
|
|
1356
|
-
|
|
1357
1528
|
if (phase === 'show') {
|
|
1358
1529
|
/**
|
|
1359
1530
|
* We listen to click (more specifically mouseup and mousedown) events
|
|
@@ -1381,7 +1552,6 @@ export class OverlayController extends EventTarget {
|
|
|
1381
1552
|
// [1]. was mousedown inside content or invoker
|
|
1382
1553
|
wasMouseDownInside = true;
|
|
1383
1554
|
};
|
|
1384
|
-
|
|
1385
1555
|
this.__onInsideMouseUp = () => {
|
|
1386
1556
|
// [3]. was mouseup inside content or invoker
|
|
1387
1557
|
wasMouseUpInside = true;
|
|
@@ -1410,7 +1580,6 @@ export class OverlayController extends EventTarget {
|
|
|
1410
1580
|
});
|
|
1411
1581
|
};
|
|
1412
1582
|
}
|
|
1413
|
-
|
|
1414
1583
|
this.contentWrapperNode[addOrRemoveListener](
|
|
1415
1584
|
'mousedown',
|
|
1416
1585
|
/** @type {EventListenerOrEventListenerObject} */
|
|
@@ -1421,7 +1590,7 @@ export class OverlayController extends EventTarget {
|
|
|
1421
1590
|
this.contentWrapperNode[addOrRemoveListener](
|
|
1422
1591
|
'mouseup',
|
|
1423
1592
|
/** @type {EventListenerOrEventListenerObject} */
|
|
1424
|
-
|
|
1593
|
+
this.__onInsideMouseUp,
|
|
1425
1594
|
true,
|
|
1426
1595
|
);
|
|
1427
1596
|
if (this.invokerNode) {
|
|
@@ -1437,7 +1606,7 @@ export class OverlayController extends EventTarget {
|
|
|
1437
1606
|
this.invokerNode[addOrRemoveListener](
|
|
1438
1607
|
'mouseup',
|
|
1439
1608
|
/** @type {EventListenerOrEventListenerObject} */
|
|
1440
|
-
|
|
1609
|
+
this.__onInsideMouseUp,
|
|
1441
1610
|
true,
|
|
1442
1611
|
);
|
|
1443
1612
|
}
|
|
@@ -1462,23 +1631,50 @@ export class OverlayController extends EventTarget {
|
|
|
1462
1631
|
*/
|
|
1463
1632
|
_handleAccessibility({ phase }) {
|
|
1464
1633
|
if (phase === 'init' || phase === 'teardown') {
|
|
1465
|
-
this.__setupTeardownAccessibility({
|
|
1634
|
+
this.__setupTeardownAccessibility({
|
|
1635
|
+
phase,
|
|
1636
|
+
});
|
|
1466
1637
|
}
|
|
1467
1638
|
const isModal = this.trapsKeyboardFocus;
|
|
1468
1639
|
if (this.invokerNode && !this.isTooltip && !isModal) {
|
|
1469
1640
|
this.invokerNode.setAttribute('aria-expanded', `${phase === 'show'}`);
|
|
1470
1641
|
}
|
|
1471
1642
|
}
|
|
1472
|
-
|
|
1473
1643
|
teardown() {
|
|
1474
|
-
this.
|
|
1644
|
+
if (!this.__hasSetup) return;
|
|
1645
|
+
this.__handleOverlayStyles({
|
|
1646
|
+
phase: 'teardown',
|
|
1647
|
+
});
|
|
1475
1648
|
if (this.isShown) {
|
|
1476
|
-
this._keepBodySize({
|
|
1649
|
+
this._keepBodySize({
|
|
1650
|
+
phase: 'teardown',
|
|
1651
|
+
});
|
|
1477
1652
|
}
|
|
1478
|
-
this._handleFeatures({
|
|
1653
|
+
this._handleFeatures({
|
|
1654
|
+
phase: 'teardown',
|
|
1655
|
+
});
|
|
1479
1656
|
if (this.#isRegisteredOnManager()) {
|
|
1480
1657
|
this.manager.remove(this);
|
|
1481
1658
|
}
|
|
1659
|
+
this.contentNode?.removeEventListener('click', this.#hideOnCloseButtonClick);
|
|
1660
|
+
|
|
1661
|
+
// if (this.config._shouldTeardownDomStructure) {
|
|
1662
|
+
this.__rearrangeNodesCleanup?.();
|
|
1663
|
+
this.__rearrangeNodesCleanup = undefined;
|
|
1664
|
+
// }
|
|
1665
|
+
this.__teardownVisibility();
|
|
1666
|
+
|
|
1667
|
+
// When we created the contentWrapperNode/wrapping <dialog> ourselves, restore the
|
|
1668
|
+
// original dom structure and drop the (now detached) references, so that a
|
|
1669
|
+
// subsequent setup recreates them and `contentWrapperNode`/`content` no longer
|
|
1670
|
+
// expose stale nodes.
|
|
1671
|
+
if (this.contentWrapperNode !== this.contentNode) {
|
|
1672
|
+
this.contentWrapperNode?.removeAttribute('style');
|
|
1673
|
+
this.contentWrapperNode?.removeAttribute('class');
|
|
1674
|
+
this.__contentWrapperNode = undefined;
|
|
1675
|
+
this.__wrappingDialogNode = undefined;
|
|
1676
|
+
}
|
|
1677
|
+
this.__hasSetup = false;
|
|
1482
1678
|
}
|
|
1483
1679
|
|
|
1484
1680
|
/** @private */
|
|
@@ -1487,11 +1683,10 @@ export class OverlayController extends EventTarget {
|
|
|
1487
1683
|
this._popper.destroy();
|
|
1488
1684
|
this._popper = undefined;
|
|
1489
1685
|
}
|
|
1490
|
-
|
|
1491
1686
|
if (OverlayController.popperModule !== undefined) {
|
|
1492
1687
|
const { createPopper } = await OverlayController.popperModule;
|
|
1493
1688
|
this._popper = createPopper(
|
|
1494
|
-
/** @type {HTMLElement} */
|
|
1689
|
+
/** @type {HTMLElement} */ this._referenceNode,
|
|
1495
1690
|
this.contentWrapperNode,
|
|
1496
1691
|
{
|
|
1497
1692
|
...this.config?.popperConfig,
|
|
@@ -1499,11 +1694,10 @@ export class OverlayController extends EventTarget {
|
|
|
1499
1694
|
);
|
|
1500
1695
|
}
|
|
1501
1696
|
}
|
|
1502
|
-
|
|
1503
1697
|
_hasDisabledInvoker() {
|
|
1504
1698
|
if (this.invokerNode) {
|
|
1505
1699
|
return (
|
|
1506
|
-
/** @type {HTMLElement & { disabled: boolean }} */
|
|
1700
|
+
/** @type {HTMLElement & { disabled: boolean }} */ this.invokerNode.disabled ||
|
|
1507
1701
|
this.invokerNode.getAttribute('aria-disabled') === 'true'
|
|
1508
1702
|
);
|
|
1509
1703
|
}
|