@lion/ui 0.23.0 → 0.25.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 +50 -20
- 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 +35 -53
- 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 +576 -869
- 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 -364
- 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-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 +20 -20
- package/components/input-amount/src/formatters.js +0 -3
- package/components/input-amount/src/parsers.js +0 -3
- package/components/input-amount/test/formatters.test.js +24 -16
- package/components/input-amount/test/lion-input-amount-integrations.test.js +0 -4
- package/components/input-amount/test/lion-input-amount.test.js +123 -147
- 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 +127 -11
- package/components/input-tel/test/preprocessors.test.js +24 -13
- package/components/input-tel/test/validators.test.js +7 -14
- package/components/input-tel/test-helpers/mockPhoneUtilManager.js +20 -8
- 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 +5 -2
- package/components/listbox/src/LionOption.js +8 -7
- package/components/listbox/src/LionOptions.js +0 -3
- package/components/listbox/src/ListboxMixin.js +786 -820
- 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/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/src/InteractiveListMixin.js +637 -638
- package/components/menu/src/LionMenu.js +46 -59
- package/components/menu/src/MoreButtonMenuMixin.js +215 -238
- package/components/menu/src/MultiLevelListMixin.js +240 -246
- package/components/menu/src/utils/isInView.js +0 -1
- package/components/menu/src/utils/listItemInteractions.js +4 -4
- package/components/menu/test/InteractiveListMixin.test.js +0 -1
- package/components/menu/test/MoreButtonMenuMixin.test.js +3 -2
- package/components/menu/test/MultiLevelListMixin.test.js +0 -1
- package/components/menu/test/lion-menu-interactions.test.js +0 -1
- package/components/menu/test/lion-menu.test.js +6 -2
- package/components/menu/test-helpers/mimicKeyPress.js +12 -2
- package/components/menu/test-suites/InteractiveListMixin.suite.js +4 -43
- package/components/menu/test-suites/LionMenu.suite.js +1 -8
- package/components/menu/test-suites/LionMenuInteractions.suite.js +22 -44
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +34 -41
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +5 -23
- package/components/overlays/src/ArrowMixin.js +111 -127
- package/components/overlays/src/OverlayController.js +172 -152
- package/components/overlays/src/OverlayMixin.js +64 -69
- 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 +18 -18
- 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 +2 -3
- 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 +406 -555
- 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/invoker-compatibility.test.js +37 -0
- 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 +152 -181
- 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/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 +22 -44
- 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 +116 -116
- package/components/select-rich/test/lion-select-rich-upgrade.test.js +3 -7
- 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 +229 -85
- 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/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/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/input-tel/test-helpers/mockPhoneUtilManager.d.ts +5 -0
- package/dist-types/components/input-tel/test-helpers/mockPhoneUtilManager.d.ts.map +1 -1
- package/dist-types/components/listbox/src/LionListbox.d.ts +2 -2
- package/dist-types/components/listbox/src/LionListbox.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/overlays/src/OverlayController.d.ts +3 -1
- 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/test/invoker-compatibility.test.d.ts +3 -0
- package/dist-types/components/overlays/test/invoker-compatibility.test.d.ts.map +1 -0
- 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 +6 -5
- package/dist-types/components/select-rich/src/LionSelectRich.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 +1 -1
- 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/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/overview.md +5 -5
- package/docs/components/input-amount/use-cases.md +2 -2
- 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/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/api-table.md +4 -4
- package/docs/components/listbox/overview.md +2 -2
- package/docs/components/listbox/use-cases.md +3 -3
- package/docs/components/menu/extensions.md +2 -2
- package/docs/components/menu/migration.md +2 -2
- package/docs/components/menu/overview.md +2 -2
- package/docs/components/menu/use-cases.md +1 -1
- 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 +1 -1
- 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/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 +2 -2
- 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 +1 -1
- 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 +0 -1
- package/exports/define/lion-listbox.js +0 -1
- package/exports/define/lion-menu.js +0 -1
- package/exports/define/lion-menuitem.js +0 -1
- 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/overlays.js +0 -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/package.json +38 -15
- package/vscode.html-custom-data.json +5 -5
- package/web-types.json +1 -1
- package/vendor/README.md +0 -61
- package/vendor/awesome-phonenumber-7.9.0-tlouisse.libphonenumber-9.0.41.tgz +0 -0
|
@@ -14,7 +14,6 @@ import {
|
|
|
14
14
|
html,
|
|
15
15
|
waitUntil,
|
|
16
16
|
} from '@open-wc/testing';
|
|
17
|
-
|
|
18
17
|
import { isActiveElement } from '../../core/test-helpers/isActiveElement.js';
|
|
19
18
|
import { createShadowHost } from '../test-helpers/createShadowHost.js';
|
|
20
19
|
import { _adoptStyleUtils } from '../src/utils/adopt-styles.js';
|
|
@@ -45,7 +44,9 @@ async function mimicEscapePress(element) {
|
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
// Send the event
|
|
48
|
-
await sendKeys({
|
|
47
|
+
await sendKeys({
|
|
48
|
+
press: 'Escape',
|
|
49
|
+
});
|
|
49
50
|
// Wait for at least a microtask, so that possible property effects are performed
|
|
50
51
|
await aTimeout(0);
|
|
51
52
|
}
|
|
@@ -55,7 +56,7 @@ async function mimicEscapePress(element) {
|
|
|
55
56
|
* @returns {boolean}
|
|
56
57
|
*/
|
|
57
58
|
function isRegisteredOnManager(ctrlToFind) {
|
|
58
|
-
return Boolean(ctrlToFind.manager?.list?.find(ctrl => ctrlToFind === ctrl));
|
|
59
|
+
return Boolean(ctrlToFind.manager?.list?.find((ctrl) => ctrlToFind === ctrl));
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
/**
|
|
@@ -84,7 +85,7 @@ function getProtectedMembers(overlayControllerEl) {
|
|
|
84
85
|
/**
|
|
85
86
|
* @param {HTMLElement} element
|
|
86
87
|
* */
|
|
87
|
-
const isInViewport = element => {
|
|
88
|
+
const isInViewport = (element) => {
|
|
88
89
|
const rect = element.getBoundingClientRect();
|
|
89
90
|
return (
|
|
90
91
|
rect.top >= 0 &&
|
|
@@ -93,40 +94,34 @@ const isInViewport = element => {
|
|
|
93
94
|
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
|
|
94
95
|
);
|
|
95
96
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
/** @type {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
invokerNode: /** @type {HTMLElement} */ (
|
|
108
|
-
fixtureSync(html` <div role="button" style="width: 100px; height: 20px;">Invoker</div> `)
|
|
109
|
-
),
|
|
110
|
-
});
|
|
97
|
+
const withGlobalTestConfig = () => /** @type {OverlayConfig} */ ({
|
|
98
|
+
placementMode: 'global',
|
|
99
|
+
contentNode: /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`),
|
|
100
|
+
});
|
|
101
|
+
const withLocalTestConfig = () => /** @type {OverlayConfig} */ ({
|
|
102
|
+
placementMode: 'local',
|
|
103
|
+
contentNode: /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`),
|
|
104
|
+
invokerNode:
|
|
105
|
+
/** @type {HTMLElement} */
|
|
106
|
+
fixtureSync(html` <div role="button" style="width: 100px; height: 20px;">Invoker</div> `),
|
|
107
|
+
});
|
|
111
108
|
|
|
112
109
|
/**
|
|
113
110
|
* @param {HTMLDivElement} parentContent
|
|
114
111
|
* @returns {Promise<{parentOverlay: OverlayController; childOverlay: OverlayController}>}
|
|
115
112
|
*/
|
|
116
113
|
async function createNestedEscControllers(parentContent) {
|
|
117
|
-
const childContent = /** @type {HTMLDivElement} */
|
|
118
|
-
|
|
114
|
+
const childContent = /** @type {HTMLDivElement} */ parentContent.querySelector('div[id]');
|
|
119
115
|
if (parentContent.hasAttribute('data-convert-to-shadow-root')) {
|
|
120
|
-
const shadowRootParent = parentContent.attachShadow({
|
|
116
|
+
const shadowRootParent = parentContent.attachShadow({
|
|
117
|
+
mode: 'open',
|
|
118
|
+
});
|
|
121
119
|
shadowRootParent.appendChild(childContent);
|
|
122
120
|
}
|
|
123
|
-
|
|
124
121
|
const parentConfig = {};
|
|
125
122
|
const childConfig = {};
|
|
126
|
-
|
|
127
123
|
const parentHasOutsideOnEsc = parentContent.id.startsWith('parent-overlay--hidesOnOutsideEsc');
|
|
128
124
|
const childHasOutsideOnEsc = childContent.id.startsWith('child-overlay--hidesOnOutsideEsc');
|
|
129
|
-
|
|
130
125
|
if (parentHasOutsideOnEsc) {
|
|
131
126
|
parentConfig.hidesOnOutsideEsc = true;
|
|
132
127
|
} else {
|
|
@@ -137,14 +132,11 @@ async function createNestedEscControllers(parentContent) {
|
|
|
137
132
|
} else {
|
|
138
133
|
childConfig.hidesOnEsc = true;
|
|
139
134
|
}
|
|
140
|
-
|
|
141
135
|
const parentHasSyncChildrenCloseState =
|
|
142
136
|
parentContent.dataset.syncChildrenCloseState !== undefined;
|
|
143
|
-
|
|
144
137
|
if (parentHasSyncChildrenCloseState) {
|
|
145
138
|
parentConfig.syncChildrenCloseState = true;
|
|
146
139
|
}
|
|
147
|
-
|
|
148
140
|
const parentOverlay = new OverlayController({
|
|
149
141
|
...withGlobalTestConfig(),
|
|
150
142
|
contentNode: parentContent,
|
|
@@ -155,19 +147,18 @@ async function createNestedEscControllers(parentContent) {
|
|
|
155
147
|
contentNode: childContent,
|
|
156
148
|
...childConfig,
|
|
157
149
|
});
|
|
158
|
-
|
|
159
150
|
await parentOverlay.show();
|
|
160
151
|
await childOverlay.show();
|
|
161
|
-
|
|
162
|
-
|
|
152
|
+
return {
|
|
153
|
+
parentOverlay,
|
|
154
|
+
childOverlay,
|
|
155
|
+
};
|
|
163
156
|
}
|
|
164
|
-
|
|
165
157
|
afterEach(() => {
|
|
166
158
|
overlays.teardown();
|
|
167
159
|
// clean document.body from the DOM nodes left by previous tests
|
|
168
160
|
document.body.innerHTML = '';
|
|
169
161
|
});
|
|
170
|
-
|
|
171
162
|
describe('OverlayController', () => {
|
|
172
163
|
describe('Init', () => {
|
|
173
164
|
it('adds OverlayController instance to OverlayManager', async () => {
|
|
@@ -177,7 +168,6 @@ describe('OverlayController', () => {
|
|
|
177
168
|
expect(ctrl.manager).to.equal(overlays);
|
|
178
169
|
expect(overlays.list).to.include(ctrl);
|
|
179
170
|
});
|
|
180
|
-
|
|
181
171
|
it('prepares a content node wrapper', async () => {
|
|
182
172
|
const ctrl = new OverlayController({
|
|
183
173
|
...withGlobalTestConfig(),
|
|
@@ -185,12 +175,11 @@ describe('OverlayController', () => {
|
|
|
185
175
|
expect(ctrl.content).not.to.be.undefined;
|
|
186
176
|
expect(ctrl.contentNode.parentElement).to.equal(ctrl.contentWrapperNode);
|
|
187
177
|
});
|
|
188
|
-
|
|
189
178
|
describe('Stylesheets', () => {
|
|
190
179
|
it('calls adoptStyles', async () => {
|
|
191
180
|
const spy = sinon.spy(_adoptStyleUtils, 'adoptStyle');
|
|
192
181
|
const { shadowHost, cleanupShadowHost } = createShadowHost();
|
|
193
|
-
const contentNode = /** @type {HTMLElement} */
|
|
182
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>contentful</div>');
|
|
194
183
|
shadowHost.appendChild(contentNode);
|
|
195
184
|
new OverlayController({
|
|
196
185
|
...withLocalTestConfig(),
|
|
@@ -200,7 +189,6 @@ describe('OverlayController', () => {
|
|
|
200
189
|
cleanupShadowHost();
|
|
201
190
|
});
|
|
202
191
|
});
|
|
203
|
-
|
|
204
192
|
describe('Z-index on local overlays', () => {
|
|
205
193
|
/** @type {HTMLElement} */
|
|
206
194
|
let contentNode;
|
|
@@ -210,7 +198,8 @@ describe('OverlayController', () => {
|
|
|
210
198
|
*/
|
|
211
199
|
async function createZNode(zIndexVal, { mode } = {}) {
|
|
212
200
|
if (mode === 'global') {
|
|
213
|
-
contentNode =
|
|
201
|
+
contentNode =
|
|
202
|
+
/** @type {HTMLElement} */
|
|
214
203
|
await fixture(html`
|
|
215
204
|
<div class="z-index--${zIndexVal}">
|
|
216
205
|
<style>
|
|
@@ -220,69 +209,92 @@ describe('OverlayController', () => {
|
|
|
220
209
|
</style>
|
|
221
210
|
I should be on top
|
|
222
211
|
</div>
|
|
223
|
-
`)
|
|
224
|
-
);
|
|
212
|
+
`);
|
|
225
213
|
}
|
|
226
214
|
if (mode === 'inline') {
|
|
227
|
-
contentNode =
|
|
228
|
-
|
|
229
|
-
|
|
215
|
+
contentNode =
|
|
216
|
+
/** @type {HTMLElement} */
|
|
217
|
+
await fixture(html` <div>I should be on top</div> `);
|
|
230
218
|
contentNode.style.zIndex = zIndexVal;
|
|
231
219
|
}
|
|
232
220
|
return contentNode;
|
|
233
221
|
}
|
|
234
|
-
|
|
235
222
|
it('sets a z-index to make sure overlay is painted on top of siblings', async () => {
|
|
236
223
|
const ctrl = new OverlayController({
|
|
237
224
|
...withLocalTestConfig(),
|
|
238
|
-
contentNode: await createZNode('auto', {
|
|
225
|
+
contentNode: await createZNode('auto', {
|
|
226
|
+
mode: 'global',
|
|
227
|
+
}),
|
|
239
228
|
});
|
|
240
229
|
await ctrl.show();
|
|
241
230
|
// @ts-expect-error find out why config would/could be undfined
|
|
242
231
|
expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
|
|
243
|
-
ctrl.updateConfig({
|
|
232
|
+
ctrl.updateConfig({
|
|
233
|
+
contentNode: await createZNode('auto', {
|
|
234
|
+
mode: 'inline',
|
|
235
|
+
}),
|
|
236
|
+
});
|
|
244
237
|
await ctrl.show();
|
|
245
238
|
// @ts-expect-error find out why config would/could be undfined
|
|
246
239
|
expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
|
|
247
|
-
|
|
248
|
-
|
|
240
|
+
ctrl.updateConfig({
|
|
241
|
+
contentNode: await createZNode('0', {
|
|
242
|
+
mode: 'global',
|
|
243
|
+
}),
|
|
244
|
+
});
|
|
249
245
|
await ctrl.show();
|
|
250
246
|
// @ts-expect-error find out why config would/could be undfined
|
|
251
247
|
expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
|
|
252
|
-
ctrl.updateConfig({
|
|
248
|
+
ctrl.updateConfig({
|
|
249
|
+
contentNode: await createZNode('0', {
|
|
250
|
+
mode: 'inline',
|
|
251
|
+
}),
|
|
252
|
+
});
|
|
253
253
|
await ctrl.show();
|
|
254
254
|
// @ts-expect-error find out why config would/could be undfined
|
|
255
255
|
expect(ctrl.content.style.zIndex).to.equal(`${ctrl.config.zIndex + 1}`);
|
|
256
256
|
});
|
|
257
|
-
|
|
258
257
|
it.skip("doesn't set a z-index when contentNode already has >= 1", async () => {
|
|
259
258
|
const ctrl = new OverlayController({
|
|
260
259
|
...withLocalTestConfig(),
|
|
261
|
-
contentNode: await createZNode('1', {
|
|
260
|
+
contentNode: await createZNode('1', {
|
|
261
|
+
mode: 'global',
|
|
262
|
+
}),
|
|
262
263
|
});
|
|
263
264
|
await ctrl.show();
|
|
264
265
|
expect(ctrl.content.style.zIndex).to.equal('');
|
|
265
|
-
ctrl.updateConfig({
|
|
266
|
+
ctrl.updateConfig({
|
|
267
|
+
contentNode: await createZNode('auto', {
|
|
268
|
+
mode: 'inline',
|
|
269
|
+
}),
|
|
270
|
+
});
|
|
266
271
|
await ctrl.show();
|
|
267
272
|
expect(ctrl.content.style.zIndex).to.equal('');
|
|
268
|
-
|
|
269
|
-
|
|
273
|
+
ctrl.updateConfig({
|
|
274
|
+
contentNode: await createZNode('2', {
|
|
275
|
+
mode: 'global',
|
|
276
|
+
}),
|
|
277
|
+
});
|
|
270
278
|
await ctrl.show();
|
|
271
279
|
expect(ctrl.content.style.zIndex).to.equal('');
|
|
272
|
-
ctrl.updateConfig({
|
|
280
|
+
ctrl.updateConfig({
|
|
281
|
+
contentNode: await createZNode('2', {
|
|
282
|
+
mode: 'inline',
|
|
283
|
+
}),
|
|
284
|
+
});
|
|
273
285
|
await ctrl.show();
|
|
274
286
|
expect(ctrl.content.style.zIndex).to.equal('');
|
|
275
287
|
});
|
|
276
|
-
|
|
277
288
|
it("doesn't touch the value of .contentNode", async () => {
|
|
278
289
|
const ctrl = new OverlayController({
|
|
279
290
|
...withLocalTestConfig(),
|
|
280
|
-
contentNode: await createZNode('auto', {
|
|
291
|
+
contentNode: await createZNode('auto', {
|
|
292
|
+
mode: 'global',
|
|
293
|
+
}),
|
|
281
294
|
});
|
|
282
295
|
expect(ctrl.contentNode.style.zIndex).to.equal('');
|
|
283
296
|
});
|
|
284
297
|
});
|
|
285
|
-
|
|
286
298
|
describe('Offline content', () => {
|
|
287
299
|
it('throws when passing a content node that was created "offline"', async () => {
|
|
288
300
|
const contentNode = document.createElement('div');
|
|
@@ -292,14 +304,12 @@ describe('OverlayController', () => {
|
|
|
292
304
|
contentNode,
|
|
293
305
|
});
|
|
294
306
|
};
|
|
295
|
-
|
|
296
307
|
expect(createOverlayController).to.throw(
|
|
297
308
|
'[OverlayController] Could not find a render target, makes sure contentNode has a parent element (or contentWrapperNode is connected)',
|
|
298
309
|
);
|
|
299
310
|
});
|
|
300
|
-
|
|
301
311
|
it('succeeds when passing a content node that was created "online"', async () => {
|
|
302
|
-
const contentNode = /** @type {HTMLElement} */
|
|
312
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync('<div>');
|
|
303
313
|
const overlay = new OverlayController({
|
|
304
314
|
...withLocalTestConfig(),
|
|
305
315
|
contentNode,
|
|
@@ -311,18 +321,45 @@ describe('OverlayController', () => {
|
|
|
311
321
|
|
|
312
322
|
// TODO: Add more teardown feature tests
|
|
313
323
|
describe('Teardown', () => {
|
|
324
|
+
it('allows removing content after teardown without leaving nodes in the DOM', async () => {
|
|
325
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync('<div>notification</div>');
|
|
326
|
+
const ctrl = new OverlayController({
|
|
327
|
+
placementMode: 'global',
|
|
328
|
+
contentNode,
|
|
329
|
+
});
|
|
330
|
+
const wrapper = ctrl.content;
|
|
331
|
+
await ctrl.show();
|
|
332
|
+
ctrl.teardown();
|
|
333
|
+
ctrl.content.remove();
|
|
334
|
+
expect(contentNode.isConnected).to.be.false;
|
|
335
|
+
expect(wrapper.isConnected).to.be.false;
|
|
336
|
+
expect(isRegisteredOnManager(ctrl)).to.be.false;
|
|
337
|
+
ctrl.teardown();
|
|
338
|
+
});
|
|
339
|
+
it('recreates wrappers after teardown while keeping content available', () => {
|
|
340
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync('<div>notification</div>');
|
|
341
|
+
const ctrl = new OverlayController({
|
|
342
|
+
placementMode: 'global',
|
|
343
|
+
contentNode,
|
|
344
|
+
});
|
|
345
|
+
const wrapper = ctrl.content;
|
|
346
|
+
ctrl.teardown();
|
|
347
|
+
expect(ctrl.content).to.equal(contentNode);
|
|
348
|
+
ctrl.updateConfig({
|
|
349
|
+
placementMode: 'global',
|
|
350
|
+
contentNode,
|
|
351
|
+
});
|
|
352
|
+
expect(ctrl.content).not.to.equal(wrapper);
|
|
353
|
+
expect(ctrl.content.contains(contentNode)).to.be.true;
|
|
354
|
+
});
|
|
314
355
|
it('unregisters itself from overlayManager', async () => {
|
|
315
356
|
const ctrl = new OverlayController(withGlobalTestConfig());
|
|
316
|
-
|
|
317
357
|
expect(isRegisteredOnManager(ctrl)).to.be.true;
|
|
318
|
-
|
|
319
358
|
ctrl.teardown();
|
|
320
|
-
|
|
321
359
|
expect(isRegisteredOnManager(ctrl)).to.be.false;
|
|
322
360
|
});
|
|
323
|
-
|
|
324
361
|
it('handles removal from DOM gracefully when overlay is open', async () => {
|
|
325
|
-
const contentNode = /** @type {HTMLElement} */
|
|
362
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
|
|
326
363
|
const ctrl = new OverlayController({
|
|
327
364
|
placementMode: 'global',
|
|
328
365
|
contentNode,
|
|
@@ -340,7 +377,6 @@ describe('OverlayController', () => {
|
|
|
340
377
|
// Teardown should complete without errors
|
|
341
378
|
expect(isRegisteredOnManager(ctrl)).to.be.false;
|
|
342
379
|
});
|
|
343
|
-
|
|
344
380
|
it('does not throw when hide() is called after teardown() on a shown controller', async () => {
|
|
345
381
|
const ctrl = new OverlayController({
|
|
346
382
|
...withGlobalTestConfig(),
|
|
@@ -356,9 +392,8 @@ describe('OverlayController', () => {
|
|
|
356
392
|
await ctrl.hide();
|
|
357
393
|
expect(ctrl.isShown).to.be.false;
|
|
358
394
|
});
|
|
359
|
-
|
|
360
395
|
it('cleans up the dom structure it created', async () => {
|
|
361
|
-
const contentNode = /** @type {HTMLElement} */
|
|
396
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
|
|
362
397
|
const ctrl = new OverlayController({
|
|
363
398
|
placementMode: 'global',
|
|
364
399
|
contentNode,
|
|
@@ -366,17 +401,15 @@ describe('OverlayController', () => {
|
|
|
366
401
|
await ctrl.show();
|
|
367
402
|
expect(ctrl.contentWrapperNode).to.exist;
|
|
368
403
|
expect(ctrl.__wrappingDialogNode).to.exist;
|
|
369
|
-
|
|
370
404
|
await ctrl.teardown();
|
|
371
405
|
expect(ctrl.contentWrapperNode).to.not.exist;
|
|
372
406
|
expect(ctrl.__wrappingDialogNode).to.not.exist;
|
|
373
407
|
});
|
|
374
408
|
});
|
|
375
|
-
|
|
376
409
|
describe('Node Configuration', () => {
|
|
377
410
|
describe('Content', async () => {
|
|
378
411
|
it('accepts a .contentNode for displaying content of the overlay', async () => {
|
|
379
|
-
const myContentNode = /** @type {HTMLElement} */
|
|
412
|
+
const myContentNode = /** @type {HTMLElement} */ fixtureSync('<p>direct node</p>');
|
|
380
413
|
const ctrl = new OverlayController({
|
|
381
414
|
...withGlobalTestConfig(),
|
|
382
415
|
contentNode: myContentNode,
|
|
@@ -384,7 +417,6 @@ describe('OverlayController', () => {
|
|
|
384
417
|
expect(ctrl.contentNode).to.have.trimmed.text('direct node');
|
|
385
418
|
expect(ctrl.contentNode).to.equal(myContentNode);
|
|
386
419
|
});
|
|
387
|
-
|
|
388
420
|
describe('Embedded dom structure', async () => {
|
|
389
421
|
describe('When projected in shadow dom', async () => {
|
|
390
422
|
it('wraps a .contentWrapperNode for style application and a <dialog role="none"> for top layer paints', async () => {
|
|
@@ -392,27 +424,25 @@ describe('OverlayController', () => {
|
|
|
392
424
|
class extends HTMLElement {
|
|
393
425
|
constructor() {
|
|
394
426
|
super();
|
|
395
|
-
this.attachShadow({
|
|
427
|
+
this.attachShadow({
|
|
428
|
+
mode: 'open',
|
|
429
|
+
});
|
|
396
430
|
}
|
|
397
|
-
|
|
398
431
|
connectedCallback() {
|
|
399
432
|
/** @type {ShadowRoot} */
|
|
400
|
-
|
|
433
|
+
this.shadowRoot.innerHTML = '<slot name="content"></slot>';
|
|
401
434
|
this.innerHTML = '<div slot="content">projected</div>';
|
|
402
435
|
}
|
|
403
436
|
},
|
|
404
437
|
);
|
|
405
|
-
|
|
406
|
-
const
|
|
407
|
-
const myContentNode = /** @type {HTMLElement} */ (el.querySelector('[slot=content]'));
|
|
438
|
+
const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
|
|
439
|
+
const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
|
|
408
440
|
const ctrl = new OverlayController({
|
|
409
441
|
...withGlobalTestConfig(),
|
|
410
442
|
contentNode: myContentNode,
|
|
411
443
|
});
|
|
412
|
-
|
|
413
444
|
expect(ctrl.contentNode.assignedSlot?.parentElement).to.equal(ctrl.contentWrapperNode);
|
|
414
445
|
expect(ctrl.contentWrapperNode.parentElement?.tagName).to.equal('DIALOG');
|
|
415
|
-
|
|
416
446
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
417
447
|
|
|
418
448
|
// The total dom structure created...
|
|
@@ -425,24 +455,23 @@ describe('OverlayController', () => {
|
|
|
425
455
|
</div>
|
|
426
456
|
</dialog>
|
|
427
457
|
`,
|
|
428
|
-
{
|
|
458
|
+
{
|
|
459
|
+
ignoreAttributes: ['closedby'],
|
|
460
|
+
},
|
|
429
461
|
);
|
|
430
|
-
|
|
431
462
|
expect(el).lightDom.to.equal(`<div data-content="" slot="content">projected</div>`);
|
|
432
463
|
});
|
|
433
464
|
});
|
|
434
|
-
|
|
435
465
|
describe('When in light dom', async () => {
|
|
436
466
|
it('wraps a .contentWrapperNode for style application and a <dialog role="none"> for top layer paints', async () => {
|
|
437
467
|
const el = fixtureSync('<section><div id="content">non projected</div></section>');
|
|
438
|
-
const myContentNode = /** @type {HTMLElement} */
|
|
468
|
+
const myContentNode = /** @type {HTMLElement} */ el.querySelector('#content');
|
|
439
469
|
const ctrl = new OverlayController({
|
|
440
470
|
...withGlobalTestConfig(),
|
|
441
471
|
contentNode: myContentNode,
|
|
442
472
|
});
|
|
443
473
|
expect(ctrl.contentNode.parentElement).to.equal(ctrl.contentWrapperNode);
|
|
444
474
|
expect(ctrl.contentWrapperNode.parentElement?.tagName).to.equal('DIALOG');
|
|
445
|
-
|
|
446
475
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
447
476
|
|
|
448
477
|
// The total dom structure created...
|
|
@@ -454,16 +483,19 @@ describe('OverlayController', () => {
|
|
|
454
483
|
</div>
|
|
455
484
|
</dialog>
|
|
456
485
|
`,
|
|
457
|
-
{
|
|
486
|
+
{
|
|
487
|
+
ignoreAttributes: ['closedby'],
|
|
488
|
+
},
|
|
458
489
|
);
|
|
459
490
|
});
|
|
460
491
|
});
|
|
461
|
-
|
|
462
492
|
describe('When .contentWrapperNode is provided in a host that is not connected yet', () => {
|
|
463
493
|
/** @param {{ nested?: boolean }} [opts] */
|
|
464
494
|
function createDisconnectedHost({ nested = false } = {}) {
|
|
465
495
|
const host = document.createElement('div');
|
|
466
|
-
const shadowRoot = host.attachShadow({
|
|
496
|
+
const shadowRoot = host.attachShadow({
|
|
497
|
+
mode: 'open',
|
|
498
|
+
});
|
|
467
499
|
const wrapper = document.createElement('div');
|
|
468
500
|
wrapper.setAttribute('data-id', 'content-wrapper');
|
|
469
501
|
wrapper.innerHTML = '<slot name="content"></slot>';
|
|
@@ -478,93 +510,95 @@ describe('OverlayController', () => {
|
|
|
478
510
|
content.slot = 'content';
|
|
479
511
|
content.textContent = 'projected';
|
|
480
512
|
host.appendChild(content);
|
|
481
|
-
return {
|
|
513
|
+
return {
|
|
514
|
+
host,
|
|
515
|
+
shadowRoot,
|
|
516
|
+
wrapper,
|
|
517
|
+
content,
|
|
518
|
+
};
|
|
482
519
|
}
|
|
483
|
-
|
|
484
520
|
it('does not throw and keeps the projected slot inside the wrapper', async () => {
|
|
485
521
|
const { host, shadowRoot, wrapper, content } = createDisconnectedHost();
|
|
486
522
|
expect(wrapper.isConnected).to.be.false;
|
|
487
|
-
const slot = /** @type {HTMLSlotElement} */
|
|
488
|
-
|
|
523
|
+
const slot = /** @type {HTMLSlotElement} */ content.assignedSlot;
|
|
489
524
|
const ctrl = new OverlayController({
|
|
490
525
|
...withGlobalTestConfig(),
|
|
491
526
|
contentNode: content,
|
|
492
527
|
contentWrapperNode: wrapper,
|
|
493
528
|
});
|
|
494
|
-
|
|
495
529
|
expect(ctrl.contentWrapperNode).to.equal(wrapper);
|
|
496
530
|
expect(wrapper.parentElement?.tagName).to.equal('DIALOG');
|
|
497
531
|
expect(slot.parentElement).to.equal(wrapper);
|
|
498
532
|
expect(content.parentElement).to.equal(host);
|
|
499
533
|
expect(shadowRoot.querySelectorAll('slot').length).to.equal(1);
|
|
500
534
|
});
|
|
501
|
-
|
|
502
535
|
it('restores the same relocated slot at its original position on teardown', async () => {
|
|
503
|
-
const { host, shadowRoot, wrapper, content } = createDisconnectedHost({
|
|
504
|
-
|
|
505
|
-
|
|
536
|
+
const { host, shadowRoot, wrapper, content } = createDisconnectedHost({
|
|
537
|
+
nested: true,
|
|
538
|
+
});
|
|
539
|
+
const section = /** @type {HTMLElement} */ shadowRoot.querySelector('section');
|
|
540
|
+
const slot = /** @type {HTMLSlotElement} */ content.assignedSlot;
|
|
506
541
|
const ctrl = new OverlayController({
|
|
507
542
|
...withGlobalTestConfig(),
|
|
508
543
|
contentNode: content,
|
|
509
544
|
contentWrapperNode: wrapper,
|
|
510
545
|
});
|
|
511
|
-
|
|
512
546
|
ctrl.teardown();
|
|
513
|
-
|
|
514
547
|
expect(content.parentElement).to.equal(host);
|
|
515
548
|
expect(wrapper.parentElement).to.equal(section);
|
|
516
549
|
expect(slot.parentElement).to.equal(wrapper);
|
|
517
550
|
expect(shadowRoot.querySelector('dialog')).to.be.null;
|
|
518
551
|
expect(shadowRoot.querySelector('slot')).to.equal(slot);
|
|
519
552
|
});
|
|
520
|
-
|
|
521
553
|
it('survives repeated updateConfig calls and keeps slot ownership', async () => {
|
|
522
554
|
const { host, shadowRoot, wrapper, content } = createDisconnectedHost();
|
|
523
|
-
const slot = /** @type {HTMLSlotElement} */
|
|
555
|
+
const slot = /** @type {HTMLSlotElement} */ content.assignedSlot;
|
|
524
556
|
const ctrl = new OverlayController({
|
|
525
557
|
...withGlobalTestConfig(),
|
|
526
558
|
contentNode: content,
|
|
527
559
|
contentWrapperNode: wrapper,
|
|
528
560
|
});
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
561
|
+
expect(() =>
|
|
562
|
+
ctrl.updateConfig({
|
|
563
|
+
trapsKeyboardFocus: true,
|
|
564
|
+
}),
|
|
565
|
+
).to.not.throw();
|
|
566
|
+
expect(() =>
|
|
567
|
+
ctrl.updateConfig({
|
|
568
|
+
trapsKeyboardFocus: false,
|
|
569
|
+
}),
|
|
570
|
+
).to.not.throw();
|
|
533
571
|
expect(content.parentElement).to.equal(host);
|
|
534
572
|
expect(shadowRoot.querySelectorAll('slot').length).to.equal(1);
|
|
535
573
|
expect(shadowRoot.querySelector('slot')).to.equal(slot);
|
|
536
574
|
expect(wrapper.contains(slot)).to.be.true;
|
|
537
575
|
});
|
|
538
576
|
});
|
|
539
|
-
|
|
540
577
|
describe('When .contenWrapperNode provided', async () => {
|
|
541
578
|
it('keeps the .contentWrapperNode for style application and wraps a <dialog role="none"> for top layer paints', async () => {
|
|
542
579
|
const tagString = defineCE(
|
|
543
580
|
class extends HTMLElement {
|
|
544
581
|
constructor() {
|
|
545
582
|
super();
|
|
546
|
-
this.attachShadow({
|
|
583
|
+
this.attachShadow({
|
|
584
|
+
mode: 'open',
|
|
585
|
+
});
|
|
547
586
|
}
|
|
548
|
-
|
|
549
587
|
connectedCallback() {
|
|
550
588
|
/** @type {ShadowRoot} */
|
|
551
|
-
|
|
589
|
+
this.shadowRoot.innerHTML = '<div><slot name="content"></slot></div>';
|
|
552
590
|
this.innerHTML = '<div slot="content">projected</div>';
|
|
553
591
|
}
|
|
554
592
|
},
|
|
555
593
|
);
|
|
556
|
-
|
|
557
|
-
const
|
|
558
|
-
const
|
|
559
|
-
const myContentWrapper = /** @type {HTMLElement} */ (
|
|
560
|
-
el.shadowRoot?.querySelector('div')
|
|
561
|
-
);
|
|
594
|
+
const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
|
|
595
|
+
const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
|
|
596
|
+
const myContentWrapper = /** @type {HTMLElement} */ el.shadowRoot?.querySelector('div');
|
|
562
597
|
const ctrl = new OverlayController({
|
|
563
598
|
...withGlobalTestConfig(),
|
|
564
599
|
contentNode: myContentNode,
|
|
565
600
|
contentWrapperNode: myContentWrapper,
|
|
566
601
|
});
|
|
567
|
-
|
|
568
602
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
569
603
|
|
|
570
604
|
// The total dom structure created...
|
|
@@ -576,21 +610,23 @@ describe('OverlayController', () => {
|
|
|
576
610
|
</div>
|
|
577
611
|
</dialog>
|
|
578
612
|
`,
|
|
579
|
-
{
|
|
613
|
+
{
|
|
614
|
+
ignoreAttributes: ['closedby'],
|
|
615
|
+
},
|
|
580
616
|
);
|
|
581
617
|
});
|
|
582
|
-
|
|
583
618
|
it("uses the .contentWrapperNode as container for Popper's arrow", async () => {
|
|
584
619
|
const tagString = defineCE(
|
|
585
620
|
class extends HTMLElement {
|
|
586
621
|
constructor() {
|
|
587
622
|
super();
|
|
588
|
-
this.attachShadow({
|
|
623
|
+
this.attachShadow({
|
|
624
|
+
mode: 'open',
|
|
625
|
+
});
|
|
589
626
|
}
|
|
590
|
-
|
|
591
627
|
connectedCallback() {
|
|
592
628
|
/** @type {ShadowRoot} */
|
|
593
|
-
|
|
629
|
+
this.shadowRoot.innerHTML = `
|
|
594
630
|
<div>
|
|
595
631
|
<div id="arrow"></div>
|
|
596
632
|
<slot name="content"></slot>
|
|
@@ -599,18 +635,14 @@ describe('OverlayController', () => {
|
|
|
599
635
|
}
|
|
600
636
|
},
|
|
601
637
|
);
|
|
602
|
-
|
|
603
|
-
const
|
|
604
|
-
const
|
|
605
|
-
const myContentWrapper = /** @type {HTMLElement} */ (
|
|
606
|
-
el.shadowRoot?.querySelector('div')
|
|
607
|
-
);
|
|
638
|
+
const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
|
|
639
|
+
const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
|
|
640
|
+
const myContentWrapper = /** @type {HTMLElement} */ el.shadowRoot?.querySelector('div');
|
|
608
641
|
const ctrl = new OverlayController({
|
|
609
642
|
...withLocalTestConfig(),
|
|
610
643
|
contentNode: myContentNode,
|
|
611
644
|
contentWrapperNode: myContentWrapper,
|
|
612
645
|
});
|
|
613
|
-
|
|
614
646
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
615
647
|
|
|
616
648
|
// The total dom structure created...
|
|
@@ -623,16 +655,17 @@ describe('OverlayController', () => {
|
|
|
623
655
|
</div>
|
|
624
656
|
</dialog>
|
|
625
657
|
`,
|
|
626
|
-
{
|
|
658
|
+
{
|
|
659
|
+
ignoreAttributes: ['closedby'],
|
|
660
|
+
},
|
|
627
661
|
);
|
|
628
662
|
});
|
|
629
663
|
});
|
|
630
664
|
});
|
|
631
665
|
});
|
|
632
|
-
|
|
633
666
|
describe('Invoker / Reference', async () => {
|
|
634
667
|
it('accepts a .invokerNode to directly set invoker', async () => {
|
|
635
|
-
const myInvokerNode = /** @type {HTMLElement} */
|
|
668
|
+
const myInvokerNode = /** @type {HTMLElement} */ fixtureSync('<button>invoke</button>');
|
|
636
669
|
const ctrl = new OverlayController({
|
|
637
670
|
...withGlobalTestConfig(),
|
|
638
671
|
invokerNode: myInvokerNode,
|
|
@@ -640,10 +673,9 @@ describe('OverlayController', () => {
|
|
|
640
673
|
expect(ctrl.invokerNode).to.equal(myInvokerNode);
|
|
641
674
|
expect(ctrl.referenceNode).to.equal(undefined);
|
|
642
675
|
});
|
|
643
|
-
|
|
644
676
|
it('accepts a .referenceNode as positioning anchor different from .invokerNode', async () => {
|
|
645
|
-
const myInvokerNode = /** @type {HTMLElement} */
|
|
646
|
-
const myReferenceNode = /** @type {HTMLElement} */
|
|
677
|
+
const myInvokerNode = /** @type {HTMLElement} */ fixtureSync('<button>invoke</button>');
|
|
678
|
+
const myReferenceNode = /** @type {HTMLElement} */ fixtureSync('<div>anchor</div>');
|
|
647
679
|
const ctrl = new OverlayController({
|
|
648
680
|
...withGlobalTestConfig(),
|
|
649
681
|
invokerNode: myInvokerNode,
|
|
@@ -653,33 +685,30 @@ describe('OverlayController', () => {
|
|
|
653
685
|
expect(ctrl.invokerNode).to.not.equal(ctrl.referenceNode);
|
|
654
686
|
});
|
|
655
687
|
});
|
|
656
|
-
|
|
657
688
|
describe('Backdrop', () => {
|
|
658
689
|
it('creates a .backdropNode inside <dialog> for guaranteed top layer paints and positioning opportunities', async () => {
|
|
659
690
|
const tagString = defineCE(
|
|
660
691
|
class extends HTMLElement {
|
|
661
692
|
constructor() {
|
|
662
693
|
super();
|
|
663
|
-
this.attachShadow({
|
|
694
|
+
this.attachShadow({
|
|
695
|
+
mode: 'open',
|
|
696
|
+
});
|
|
664
697
|
}
|
|
665
|
-
|
|
666
698
|
connectedCallback() {
|
|
667
699
|
/** @type {ShadowRoot} */
|
|
668
|
-
|
|
700
|
+
this.shadowRoot.innerHTML = '<slot name="content"></slot>';
|
|
669
701
|
this.innerHTML = '<div slot="content">projected</div>';
|
|
670
702
|
}
|
|
671
703
|
},
|
|
672
704
|
);
|
|
673
|
-
|
|
674
|
-
const
|
|
675
|
-
const myContentNode = /** @type {HTMLElement} */ (el.querySelector('[slot=content]'));
|
|
676
|
-
|
|
705
|
+
const el = /** @type {HTMLElement} */ fixtureSync(`<${tagString}></${tagString}>`);
|
|
706
|
+
const myContentNode = /** @type {HTMLElement} */ el.querySelector('[slot=content]');
|
|
677
707
|
const ctrl = new OverlayController({
|
|
678
708
|
...withGlobalTestConfig(),
|
|
679
709
|
contentNode: myContentNode,
|
|
680
710
|
hasBackdrop: true,
|
|
681
711
|
});
|
|
682
|
-
|
|
683
712
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
684
713
|
|
|
685
714
|
// The total dom structure created...
|
|
@@ -693,31 +722,29 @@ describe('OverlayController', () => {
|
|
|
693
722
|
</div>
|
|
694
723
|
</dialog>
|
|
695
724
|
`,
|
|
696
|
-
{
|
|
725
|
+
{
|
|
726
|
+
ignoreAttributes: ['closedby'],
|
|
727
|
+
},
|
|
697
728
|
);
|
|
698
729
|
});
|
|
699
730
|
});
|
|
700
|
-
|
|
701
731
|
describe('When contentWrapperNode needs to be provided for correct arrow positioning', () => {
|
|
702
732
|
it('uses contentWrapperNode as provided for local positioning', async () => {
|
|
703
|
-
const el =
|
|
733
|
+
const el =
|
|
734
|
+
/** @type {HTMLElement} */
|
|
704
735
|
await fixture(html`
|
|
705
736
|
<div id="contentWrapperNode">
|
|
706
737
|
<div id="contentNode"></div>
|
|
707
738
|
<my-arrow></my-arrow>
|
|
708
739
|
</div>
|
|
709
|
-
`)
|
|
710
|
-
);
|
|
711
|
-
|
|
712
|
-
const contentNode = /** @type {HTMLElement} */ (el.querySelector('#contentNode'));
|
|
740
|
+
`);
|
|
741
|
+
const contentNode = /** @type {HTMLElement} */ el.querySelector('#contentNode');
|
|
713
742
|
const contentWrapperNode = el;
|
|
714
|
-
|
|
715
743
|
const ctrl = new OverlayController({
|
|
716
744
|
...withLocalTestConfig(),
|
|
717
745
|
contentNode,
|
|
718
746
|
contentWrapperNode,
|
|
719
747
|
});
|
|
720
|
-
|
|
721
748
|
expect(ctrl.contentWrapperNode).to.equal(contentWrapperNode);
|
|
722
749
|
});
|
|
723
750
|
});
|
|
@@ -734,27 +761,28 @@ describe('OverlayController', () => {
|
|
|
734
761
|
await ctrl.show();
|
|
735
762
|
expect(isActiveElement(ctrl.contentNode)).to.be.true;
|
|
736
763
|
});
|
|
737
|
-
|
|
738
764
|
it('keeps focus within the overlay e.g. you can not tab out by accident', async () => {
|
|
739
|
-
const contentNode =
|
|
740
|
-
|
|
741
|
-
|
|
765
|
+
const contentNode =
|
|
766
|
+
/** @type {HTMLElement} */
|
|
767
|
+
await fixture(html` <div><input id="input1" /><input id="input2" /></div> `);
|
|
742
768
|
const ctrl = new OverlayController({
|
|
743
769
|
...withGlobalTestConfig(),
|
|
744
770
|
trapsKeyboardFocus: true,
|
|
745
771
|
contentNode,
|
|
746
772
|
});
|
|
747
773
|
await ctrl.show();
|
|
748
|
-
|
|
749
774
|
await fixture(html`<button>click me</button>`);
|
|
750
775
|
const input1 = ctrl.contentNode.querySelectorAll('input')[0];
|
|
751
776
|
const input2 = ctrl.contentNode.querySelectorAll('input')[1];
|
|
752
777
|
input2.focus();
|
|
753
|
-
await sendKeys({
|
|
754
|
-
|
|
778
|
+
await sendKeys({
|
|
779
|
+
press: 'Tab',
|
|
780
|
+
});
|
|
755
781
|
if (browserDetection.isChrome) {
|
|
756
782
|
expect(isActiveElement(document.body)).to.be.true;
|
|
757
|
-
await sendKeys({
|
|
783
|
+
await sendKeys({
|
|
784
|
+
press: 'Tab',
|
|
785
|
+
});
|
|
758
786
|
expect(isActiveElement(input1)).to.be.true;
|
|
759
787
|
}
|
|
760
788
|
if (browserDetection.isFirefox) {
|
|
@@ -762,37 +790,40 @@ describe('OverlayController', () => {
|
|
|
762
790
|
// once we focus on the latest focusable element, `input2` in this case,
|
|
763
791
|
// any further Tab presses keeps the focus on `input2` element
|
|
764
792
|
expect(isActiveElement(input2)).to.be.true;
|
|
765
|
-
await sendKeys({
|
|
793
|
+
await sendKeys({
|
|
794
|
+
press: 'Tab',
|
|
795
|
+
});
|
|
766
796
|
expect(isActiveElement(input2)).to.be.true;
|
|
767
797
|
}
|
|
768
798
|
if (browserDetection.isMacSafari) {
|
|
769
799
|
expect(isActiveElement(document.body)).to.be.true;
|
|
770
|
-
await sendKeys({
|
|
800
|
+
await sendKeys({
|
|
801
|
+
press: 'Tab',
|
|
802
|
+
});
|
|
771
803
|
expect(isActiveElement(ctrl.contentNode)).to.be.true;
|
|
772
|
-
await sendKeys({
|
|
804
|
+
await sendKeys({
|
|
805
|
+
press: 'Tab',
|
|
806
|
+
});
|
|
773
807
|
expect(isActiveElement(input1)).to.be.true;
|
|
774
808
|
}
|
|
775
809
|
});
|
|
776
|
-
|
|
777
810
|
it('focuses the element with [autofocus] when dialog gets opened', async () => {
|
|
778
|
-
const contentNode =
|
|
779
|
-
|
|
780
|
-
|
|
811
|
+
const contentNode =
|
|
812
|
+
/** @type {HTMLElement} */
|
|
813
|
+
await fixture(html` <div><input id="input1" /><input id="input2" autofocus /></div> `);
|
|
781
814
|
const ctrl = new OverlayController({
|
|
782
815
|
...withGlobalTestConfig(),
|
|
783
816
|
trapsKeyboardFocus: true,
|
|
784
817
|
contentNode,
|
|
785
818
|
});
|
|
786
819
|
await ctrl.show();
|
|
787
|
-
|
|
788
820
|
const input2 = ctrl.contentNode.querySelectorAll('input')[1];
|
|
789
821
|
expect(isActiveElement(input2)).to.be.true;
|
|
790
822
|
});
|
|
791
|
-
|
|
792
823
|
it('focuses the contentNode when dialog gets opened and there is no [autofocus]', async () => {
|
|
793
|
-
const contentNode =
|
|
794
|
-
|
|
795
|
-
|
|
824
|
+
const contentNode =
|
|
825
|
+
/** @type {HTMLElement} */
|
|
826
|
+
await fixture(html` <div><input id="input1" /><input id="input2" /></div> `);
|
|
796
827
|
const ctrl = new OverlayController({
|
|
797
828
|
...withGlobalTestConfig(),
|
|
798
829
|
trapsKeyboardFocus: true,
|
|
@@ -801,57 +832,48 @@ describe('OverlayController', () => {
|
|
|
801
832
|
await ctrl.show();
|
|
802
833
|
expect(isActiveElement(contentNode)).to.be.true;
|
|
803
834
|
});
|
|
804
|
-
|
|
805
835
|
it('allows to move the focus outside of the overlay if trapsKeyboardFocus is disabled', async () => {
|
|
806
|
-
const contentNode = /** @type {HTMLElement} */
|
|
807
|
-
|
|
836
|
+
const contentNode = /** @type {HTMLElement} */ await fixture(html`<div><input /></div>`);
|
|
808
837
|
const ctrl = new OverlayController({
|
|
809
838
|
...withGlobalTestConfig(),
|
|
810
839
|
contentNode,
|
|
811
840
|
trapsKeyboardFocus: false,
|
|
812
841
|
});
|
|
813
842
|
// add element to dom to allow focus
|
|
814
|
-
/** @type {HTMLElement} */
|
|
843
|
+
/** @type {HTMLElement} */
|
|
844
|
+
await fixture(html`${ctrl.content}`);
|
|
815
845
|
await ctrl.show();
|
|
816
|
-
|
|
817
|
-
const
|
|
818
|
-
const input = /** @type {HTMLInputElement} */ (ctrl.contentNode.querySelector('input'));
|
|
819
|
-
|
|
846
|
+
const elOutside = /** @type {HTMLElement} */ await fixture(html`<input />`);
|
|
847
|
+
const input = /** @type {HTMLInputElement} */ ctrl.contentNode.querySelector('input');
|
|
820
848
|
input.focus();
|
|
821
849
|
simulateTab();
|
|
822
|
-
|
|
823
850
|
expect(isActiveElement(elOutside)).to.be.true;
|
|
824
851
|
});
|
|
825
|
-
|
|
826
852
|
it('keeps focus within overlay with multiple overlays with all traps on true', async () => {
|
|
827
853
|
const ctrl0 = new OverlayController({
|
|
828
854
|
...withGlobalTestConfig(),
|
|
829
855
|
trapsKeyboardFocus: true,
|
|
830
856
|
});
|
|
831
|
-
|
|
832
857
|
const ctrl1 = new OverlayController({
|
|
833
858
|
...withGlobalTestConfig(),
|
|
834
859
|
trapsKeyboardFocus: true,
|
|
835
860
|
});
|
|
836
|
-
|
|
837
861
|
await ctrl0.show();
|
|
838
862
|
await ctrl1.show();
|
|
839
863
|
expect(isActiveElement(ctrl1.contentNode)).to.be.true;
|
|
840
|
-
|
|
841
864
|
await ctrl1.hide();
|
|
842
865
|
expect(isActiveElement(ctrl0.contentNode)).to.be.true;
|
|
843
866
|
});
|
|
844
|
-
|
|
845
867
|
it('warns when contentNode is a host for a shadowRoot', async () => {
|
|
846
868
|
const warnSpy = sinon.spy(console, 'warn');
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
869
|
+
const contentNode = /** @type {HTMLDivElement} */ await fixture(html` <div></div> `);
|
|
870
|
+
contentNode.attachShadow({
|
|
871
|
+
mode: 'open',
|
|
872
|
+
});
|
|
873
|
+
const shadowRootContentNode =
|
|
874
|
+
/** @type {HTMLElement} */
|
|
875
|
+
await fixture(html` <div><input id="input1" /><input id="input2" /></div> `);
|
|
853
876
|
contentNode.shadowRoot?.appendChild(shadowRootContentNode);
|
|
854
|
-
|
|
855
877
|
const ctrl = new OverlayController({
|
|
856
878
|
...withGlobalTestConfig(),
|
|
857
879
|
trapsKeyboardFocus: true,
|
|
@@ -866,7 +888,6 @@ describe('OverlayController', () => {
|
|
|
866
888
|
warnSpy.restore();
|
|
867
889
|
});
|
|
868
890
|
});
|
|
869
|
-
|
|
870
891
|
describe('hidesOnEsc', () => {
|
|
871
892
|
it('hides on [Escape] press', async () => {
|
|
872
893
|
const ctrl = new OverlayController({
|
|
@@ -877,7 +898,6 @@ describe('OverlayController', () => {
|
|
|
877
898
|
await mimicEscapePress(ctrl.contentNode);
|
|
878
899
|
expect(ctrl.isShown).to.be.false;
|
|
879
900
|
});
|
|
880
|
-
|
|
881
901
|
it('stays shown on [Escape] press with `.hidesOnEsc` set to false', async () => {
|
|
882
902
|
const ctrl = new OverlayController({
|
|
883
903
|
...withGlobalTestConfig(),
|
|
@@ -887,7 +907,6 @@ describe('OverlayController', () => {
|
|
|
887
907
|
await mimicEscapePress(ctrl.contentNode);
|
|
888
908
|
expect(ctrl.isShown).to.be.true;
|
|
889
909
|
});
|
|
890
|
-
|
|
891
910
|
it('stays shown on [Escape] press on outside element', async () => {
|
|
892
911
|
const ctrl = new OverlayController({
|
|
893
912
|
...withGlobalTestConfig(),
|
|
@@ -897,7 +916,6 @@ describe('OverlayController', () => {
|
|
|
897
916
|
await mimicEscapePress(document);
|
|
898
917
|
expect(ctrl.isShown).to.be.true;
|
|
899
918
|
});
|
|
900
|
-
|
|
901
919
|
it('stays shown on [Escape] press with modal <dialog> and `.hidesOnEsc` is false', async () => {
|
|
902
920
|
const ctrl = new OverlayController({
|
|
903
921
|
...withGlobalTestConfig(),
|
|
@@ -908,25 +926,21 @@ describe('OverlayController', () => {
|
|
|
908
926
|
await mimicEscapePress(ctrl.contentNode);
|
|
909
927
|
expect(ctrl.isShown).to.be.true;
|
|
910
928
|
});
|
|
911
|
-
|
|
912
929
|
it('parent stays shown on [Escape] press in a nested overlay', async () => {
|
|
913
|
-
const parentContent =
|
|
930
|
+
const parentContent =
|
|
931
|
+
/** @type {HTMLDivElement} */
|
|
914
932
|
await fixture(
|
|
915
933
|
html` <!-- -->
|
|
916
934
|
<div id="parent-overlay--hidesOnEsc">
|
|
917
935
|
<div id="child-overlay--hidesOnEsc">we press [Escape] here</div>
|
|
918
936
|
</div>`,
|
|
919
|
-
)
|
|
920
|
-
);
|
|
937
|
+
);
|
|
921
938
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
922
|
-
|
|
923
939
|
await mimicEscapePress(childOverlay.contentNode);
|
|
924
|
-
|
|
925
940
|
expect(parentOverlay.isShown).to.be.true;
|
|
926
941
|
expect(childOverlay.isShown).to.be.false;
|
|
927
942
|
});
|
|
928
943
|
});
|
|
929
|
-
|
|
930
944
|
describe('hidesOnOutsideEsc', () => {
|
|
931
945
|
it('hides on [Escape] press on outside element', async () => {
|
|
932
946
|
const ctrl = new OverlayController({
|
|
@@ -937,7 +951,6 @@ describe('OverlayController', () => {
|
|
|
937
951
|
await mimicEscapePress(document);
|
|
938
952
|
expect(ctrl.isShown).to.be.false;
|
|
939
953
|
});
|
|
940
|
-
|
|
941
954
|
it('stays shown on [Escape] press on inside element', async () => {
|
|
942
955
|
const ctrl = new OverlayController({
|
|
943
956
|
...withGlobalTestConfig(),
|
|
@@ -947,35 +960,32 @@ describe('OverlayController', () => {
|
|
|
947
960
|
await mimicEscapePress(ctrl.contentNode);
|
|
948
961
|
expect(ctrl.isShown).to.be.true;
|
|
949
962
|
});
|
|
950
|
-
|
|
951
963
|
it('stays shown on [Escape] press in a nested overlay', async () => {
|
|
952
|
-
const parentContent =
|
|
964
|
+
const parentContent =
|
|
965
|
+
/** @type {HTMLDivElement} */
|
|
953
966
|
await fixture(
|
|
954
967
|
html` <!-- -->
|
|
955
968
|
<div id="parent-overlay--hidesOnOutsideEsc">
|
|
956
969
|
<div id="child-overlay--hidesOnOutsideEsc">we press [Escape] here</div>
|
|
957
970
|
</div>`,
|
|
958
|
-
)
|
|
959
|
-
);
|
|
971
|
+
);
|
|
960
972
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
961
973
|
await mimicEscapePress(childOverlay.contentNode);
|
|
962
|
-
|
|
963
974
|
expect(parentOverlay.isShown).to.be.true;
|
|
964
975
|
expect(childOverlay.isShown).to.be.true;
|
|
965
976
|
});
|
|
966
977
|
});
|
|
967
|
-
|
|
968
978
|
describe('Nested hidesOnEsc / hidesOnOutsideEsc', () => {
|
|
969
979
|
describe('Parent has hidesOnEsc and child has hidesOnOutsideEsc', () => {
|
|
970
980
|
it('on [Escape] press in child overlay: parent hides, child stays shown', async () => {
|
|
971
|
-
const parentContent =
|
|
981
|
+
const parentContent =
|
|
982
|
+
/** @type {HTMLDivElement} */
|
|
972
983
|
await fixture(
|
|
973
984
|
html` <!-- -->
|
|
974
985
|
<div id="parent-overlay--hidesOnEsc">
|
|
975
986
|
<div id="child-overlay--hidesOnOutsideEsc">we press [Escape] here</div>
|
|
976
987
|
</div>`,
|
|
977
|
-
)
|
|
978
|
-
);
|
|
988
|
+
);
|
|
979
989
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
980
990
|
await mimicEscapePress(childOverlay.contentNode);
|
|
981
991
|
await childOverlay._showComplete;
|
|
@@ -991,112 +1001,100 @@ describe('OverlayController', () => {
|
|
|
991
1001
|
await childOverlay.teardown();
|
|
992
1002
|
await parentOverlay.teardown();
|
|
993
1003
|
});
|
|
994
|
-
|
|
995
1004
|
it('on [Escape] press outside overlays: parent stays shown, child hides', async () => {
|
|
996
|
-
const parentContent =
|
|
1005
|
+
const parentContent =
|
|
1006
|
+
/** @type {HTMLDivElement} */
|
|
997
1007
|
await fixture(
|
|
998
1008
|
html` <!-- we press [Escape] here -->
|
|
999
1009
|
<div id="parent-overlay--hidesOnEsc">
|
|
1000
1010
|
<div id="child-overlay--hidesOnOutsideEsc"></div>
|
|
1001
1011
|
</div>`,
|
|
1002
|
-
)
|
|
1003
|
-
);
|
|
1012
|
+
);
|
|
1004
1013
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1005
1014
|
await mimicEscapePress(document);
|
|
1006
|
-
|
|
1007
1015
|
expect(parentOverlay.isShown).to.be.true;
|
|
1008
1016
|
expect(childOverlay.isShown).to.be.false;
|
|
1009
1017
|
});
|
|
1010
|
-
|
|
1011
1018
|
it('on [Escape] press in parent overlay: parent is hidden, child is hidden', async () => {
|
|
1012
|
-
const parentContent =
|
|
1019
|
+
const parentContent =
|
|
1020
|
+
/** @type {HTMLDivElement} */
|
|
1013
1021
|
await fixture(
|
|
1014
1022
|
html` <!-- -->
|
|
1015
1023
|
<div id="parent-overlay--hidesOnEsc">
|
|
1016
1024
|
we press [Escape] here
|
|
1017
1025
|
<div id="child-overlay--hidesOnOutsideEsc"></div>
|
|
1018
1026
|
</div>`,
|
|
1019
|
-
)
|
|
1020
|
-
);
|
|
1027
|
+
);
|
|
1021
1028
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1022
1029
|
await mimicEscapePress(parentContent);
|
|
1023
|
-
|
|
1024
1030
|
expect(parentOverlay.isShown).to.be.false;
|
|
1025
1031
|
expect(childOverlay.isShown).to.be.false;
|
|
1026
1032
|
});
|
|
1027
1033
|
});
|
|
1028
1034
|
describe('Parent has hidesOnOutsideEsc and child has hidesOnEsc', () => {
|
|
1029
1035
|
it('on [Escape] press in child overlay: parent stays shown, child hides', async () => {
|
|
1030
|
-
const parentContent =
|
|
1036
|
+
const parentContent =
|
|
1037
|
+
/** @type {HTMLDivElement} */
|
|
1031
1038
|
await fixture(
|
|
1032
1039
|
html` <!-- -->
|
|
1033
1040
|
<div id="parent-overlay--hidesOnOutsideEsc">
|
|
1034
1041
|
<div id="child-overlay--hidesOnEsc">we press [Escape] here</div>
|
|
1035
1042
|
</div>`,
|
|
1036
|
-
)
|
|
1037
|
-
);
|
|
1043
|
+
);
|
|
1038
1044
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1039
1045
|
await mimicEscapePress(childOverlay.contentNode);
|
|
1040
|
-
|
|
1041
1046
|
expect(parentOverlay.isShown).to.be.true;
|
|
1042
1047
|
expect(childOverlay.isShown).to.be.false;
|
|
1043
1048
|
});
|
|
1044
|
-
|
|
1045
1049
|
it('on [Escape] press outside overlays: parent hides, child stays shown', async () => {
|
|
1046
|
-
const parentContent =
|
|
1050
|
+
const parentContent =
|
|
1051
|
+
/** @type {HTMLDivElement} */
|
|
1047
1052
|
await fixture(
|
|
1048
1053
|
html` <!-- we press [Escape] here -->
|
|
1049
1054
|
<div id="parent-overlay--hidesOnOutsideEsc">
|
|
1050
1055
|
<div id="child-overlay--hidesOnEsc"></div>
|
|
1051
1056
|
</div>`,
|
|
1052
|
-
)
|
|
1053
|
-
);
|
|
1057
|
+
);
|
|
1054
1058
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1055
1059
|
await mimicEscapePress(document);
|
|
1056
|
-
|
|
1057
1060
|
expect(parentOverlay.isShown).to.be.false;
|
|
1058
1061
|
expect(childOverlay.isShown).to.be.true;
|
|
1059
1062
|
});
|
|
1060
|
-
|
|
1061
1063
|
it('on [Escape] press in parent overlay: parent hides, child stays shown', async () => {
|
|
1062
|
-
const parentContent =
|
|
1064
|
+
const parentContent =
|
|
1065
|
+
/** @type {HTMLDivElement} */
|
|
1063
1066
|
await fixture(
|
|
1064
1067
|
html` <!-- we press [Escape] here -->
|
|
1065
1068
|
<div id="parent-overlay--hidesOnOutsideEsc">
|
|
1066
1069
|
<div id="child-overlay--hidesOnEsc"></div>
|
|
1067
1070
|
</div>`,
|
|
1068
|
-
)
|
|
1069
|
-
);
|
|
1071
|
+
);
|
|
1070
1072
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1071
1073
|
await mimicEscapePress(document);
|
|
1072
|
-
|
|
1073
1074
|
expect(parentOverlay.isShown).to.be.false;
|
|
1074
1075
|
expect(childOverlay.isShown).to.be.true;
|
|
1075
1076
|
});
|
|
1076
1077
|
});
|
|
1077
|
-
|
|
1078
1078
|
describe('With shadow dom', () => {
|
|
1079
1079
|
it('on [Escape] press in child overlay in shadow root: parent hides, child stays shown', async () => {
|
|
1080
|
-
const parentContent =
|
|
1080
|
+
const parentContent =
|
|
1081
|
+
/** @type {HTMLDivElement} */
|
|
1081
1082
|
await fixture(
|
|
1082
1083
|
html` <!-- -->
|
|
1083
1084
|
<div id="parent-overlay--hidesOnEsc" data-convert-to-shadow-root>
|
|
1084
1085
|
<div id="child-overlay--hidesOnOutsideEsc">we press [Escape] here</div>
|
|
1085
1086
|
</div>`,
|
|
1086
|
-
)
|
|
1087
|
-
);
|
|
1087
|
+
);
|
|
1088
1088
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1089
1089
|
await mimicEscapePress(childOverlay.contentNode);
|
|
1090
|
-
|
|
1091
1090
|
expect(parentOverlay.isShown).to.be.false;
|
|
1092
1091
|
expect(childOverlay.isShown).to.be.true;
|
|
1093
1092
|
});
|
|
1094
1093
|
});
|
|
1095
1094
|
});
|
|
1096
|
-
|
|
1097
1095
|
describe('hidesOnOutsideClick', () => {
|
|
1098
1096
|
it('hides on outside click', async () => {
|
|
1099
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1097
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1100
1098
|
const ctrl = new OverlayController({
|
|
1101
1099
|
...withGlobalTestConfig(),
|
|
1102
1100
|
hidesOnOutsideClick: true,
|
|
@@ -1106,16 +1104,16 @@ describe('OverlayController', () => {
|
|
|
1106
1104
|
mimicClick(document.body);
|
|
1107
1105
|
await aTimeout(0);
|
|
1108
1106
|
expect(ctrl.isShown).to.be.false;
|
|
1109
|
-
|
|
1110
1107
|
await ctrl.show();
|
|
1111
|
-
await mimicClick(document.body, {
|
|
1108
|
+
await mimicClick(document.body, {
|
|
1109
|
+
isAsync: true,
|
|
1110
|
+
});
|
|
1112
1111
|
await aTimeout(0);
|
|
1113
1112
|
expect(ctrl.isShown).to.be.false;
|
|
1114
1113
|
});
|
|
1115
|
-
|
|
1116
1114
|
it('doesn\'t hide on "inside" click', async () => {
|
|
1117
|
-
const invokerNode = /** @type {HTMLElement} */
|
|
1118
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1115
|
+
const invokerNode = /** @type {HTMLElement} */ await fixture('<button>Invoker</button>');
|
|
1116
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1119
1117
|
const ctrl = new OverlayController({
|
|
1120
1118
|
...withGlobalTestConfig(),
|
|
1121
1119
|
hidesOnOutsideClick: true,
|
|
@@ -1132,12 +1130,13 @@ describe('OverlayController', () => {
|
|
|
1132
1130
|
// Don't hide on inside (content) click
|
|
1133
1131
|
ctrl.contentNode.click();
|
|
1134
1132
|
await aTimeout(0);
|
|
1135
|
-
|
|
1136
1133
|
expect(ctrl.isShown).to.be.true;
|
|
1137
1134
|
|
|
1138
1135
|
// Don't hide on inside mousedown & outside mouseup
|
|
1139
|
-
await mimicClick(ctrl.contentNode, {
|
|
1140
|
-
|
|
1136
|
+
await mimicClick(ctrl.contentNode, {
|
|
1137
|
+
releaseElement: document.body,
|
|
1138
|
+
isAsync: true,
|
|
1139
|
+
});
|
|
1141
1140
|
await aTimeout(0);
|
|
1142
1141
|
expect(ctrl.isShown).to.be.true;
|
|
1143
1142
|
|
|
@@ -1147,48 +1146,46 @@ describe('OverlayController', () => {
|
|
|
1147
1146
|
await ctrl.show();
|
|
1148
1147
|
expect(ctrl.isShown).to.be.true;
|
|
1149
1148
|
});
|
|
1150
|
-
|
|
1151
1149
|
it('only hides when both mousedown and mouseup events are outside', async () => {
|
|
1152
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1150
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1153
1151
|
const ctrl = new OverlayController({
|
|
1154
1152
|
...withGlobalTestConfig(),
|
|
1155
1153
|
hidesOnOutsideClick: true,
|
|
1156
1154
|
contentNode,
|
|
1157
|
-
invokerNode:
|
|
1155
|
+
invokerNode:
|
|
1156
|
+
/** @type {HTMLElement} */
|
|
1158
1157
|
fixtureSync(html`
|
|
1159
1158
|
<div role="button" style="width: 100px; height: 20px;">Invoker</div>
|
|
1160
|
-
`)
|
|
1161
|
-
),
|
|
1159
|
+
`),
|
|
1162
1160
|
});
|
|
1163
1161
|
await ctrl.show();
|
|
1164
|
-
mimicClick(document.body, {
|
|
1162
|
+
mimicClick(document.body, {
|
|
1163
|
+
releaseElement: contentNode,
|
|
1164
|
+
});
|
|
1165
1165
|
await aTimeout(0);
|
|
1166
1166
|
expect(ctrl.isShown).to.be.true;
|
|
1167
|
-
|
|
1168
|
-
|
|
1167
|
+
mimicClick(contentNode, {
|
|
1168
|
+
releaseElement: document.body,
|
|
1169
|
+
});
|
|
1169
1170
|
await aTimeout(0);
|
|
1170
1171
|
expect(ctrl.isShown).to.be.true;
|
|
1171
|
-
|
|
1172
1172
|
mimicClick(document.body, {
|
|
1173
|
-
releaseElement: /** @type {HTMLElement} */
|
|
1173
|
+
releaseElement: /** @type {HTMLElement} */ ctrl.invokerNode,
|
|
1174
1174
|
});
|
|
1175
1175
|
await aTimeout(0);
|
|
1176
1176
|
expect(ctrl.isShown).to.be.true;
|
|
1177
|
-
|
|
1178
|
-
mimicClick(/** @type {HTMLElement} */ (ctrl.invokerNode), {
|
|
1177
|
+
mimicClick(/** @type {HTMLElement} */ ctrl.invokerNode, {
|
|
1179
1178
|
releaseElement: document.body,
|
|
1180
1179
|
});
|
|
1181
1180
|
await aTimeout(0);
|
|
1182
1181
|
expect(ctrl.isShown).to.be.true;
|
|
1183
|
-
|
|
1184
1182
|
mimicClick(document.body);
|
|
1185
1183
|
await aTimeout(0);
|
|
1186
1184
|
expect(ctrl.isShown).to.be.false;
|
|
1187
1185
|
});
|
|
1188
|
-
|
|
1189
1186
|
it('doesn\'t hide on "inside sub shadow dom" click', async () => {
|
|
1190
|
-
const invokerNode = /** @type {HTMLElement} */
|
|
1191
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1187
|
+
const invokerNode = /** @type {HTMLElement} */ await fixture('<button>Invoker</button>');
|
|
1188
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1192
1189
|
const ctrl = new OverlayController({
|
|
1193
1190
|
...withGlobalTestConfig(),
|
|
1194
1191
|
hidesOnOutsideClick: true,
|
|
@@ -1202,25 +1199,26 @@ describe('OverlayController', () => {
|
|
|
1202
1199
|
class extends HTMLElement {
|
|
1203
1200
|
constructor() {
|
|
1204
1201
|
super();
|
|
1205
|
-
this.attachShadow({
|
|
1202
|
+
this.attachShadow({
|
|
1203
|
+
mode: 'open',
|
|
1204
|
+
});
|
|
1206
1205
|
}
|
|
1207
|
-
|
|
1208
1206
|
connectedCallback() {
|
|
1209
1207
|
/** @type {ShadowRoot} */
|
|
1210
|
-
|
|
1208
|
+
this.shadowRoot.innerHTML = '<div><button>click me</button></div>';
|
|
1211
1209
|
}
|
|
1212
1210
|
},
|
|
1213
1211
|
);
|
|
1214
1212
|
const tag = unsafeStatic(tagString);
|
|
1215
1213
|
ctrl.updateConfig({
|
|
1216
|
-
contentNode:
|
|
1214
|
+
contentNode:
|
|
1215
|
+
/** @type {HTMLElement} */
|
|
1217
1216
|
await fixture(html`
|
|
1218
1217
|
<div>
|
|
1219
1218
|
<div>Content</div>
|
|
1220
1219
|
<${tag}></${tag}>
|
|
1221
1220
|
</div>
|
|
1222
|
-
`)
|
|
1223
|
-
),
|
|
1221
|
+
`),
|
|
1224
1222
|
});
|
|
1225
1223
|
await ctrl.show();
|
|
1226
1224
|
|
|
@@ -1228,7 +1226,6 @@ describe('OverlayController', () => {
|
|
|
1228
1226
|
/** @type {ShadowRoot} */
|
|
1229
1227
|
// @ts-expect-error
|
|
1230
1228
|
ctrl.contentNode.querySelector(tagString).shadowRoot.querySelector('button').click();
|
|
1231
|
-
|
|
1232
1229
|
await aTimeout(0);
|
|
1233
1230
|
expect(ctrl.isShown).to.be.true;
|
|
1234
1231
|
|
|
@@ -1238,12 +1235,11 @@ describe('OverlayController', () => {
|
|
|
1238
1235
|
await ctrl.show();
|
|
1239
1236
|
expect(ctrl.isShown).to.be.true;
|
|
1240
1237
|
});
|
|
1241
|
-
|
|
1242
1238
|
it('works with 3rd party code using "event.stopPropagation()" on bubble phase', async () => {
|
|
1243
|
-
const invokerNode =
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1239
|
+
const invokerNode =
|
|
1240
|
+
/** @type {HTMLElement} */
|
|
1241
|
+
await fixture('<div role="button">Invoker</div>');
|
|
1242
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1247
1243
|
const ctrl = new OverlayController({
|
|
1248
1244
|
...withLocalTestConfig(),
|
|
1249
1245
|
hidesOnOutsideClick: true,
|
|
@@ -1251,22 +1247,17 @@ describe('OverlayController', () => {
|
|
|
1251
1247
|
invokerNode,
|
|
1252
1248
|
});
|
|
1253
1249
|
const stopProp = (/** @type {Event} */ e) => e.stopPropagation();
|
|
1254
|
-
const dom = await fixture(
|
|
1255
|
-
`
|
|
1250
|
+
const dom = await fixture(`
|
|
1256
1251
|
<div>
|
|
1257
1252
|
<div id="popup">${invokerNode}${contentNode}</div>
|
|
1258
1253
|
<div id="third-party-noise" @click="${stopProp}" @mousedown="${stopProp}" @mouseup="${stopProp}">
|
|
1259
1254
|
This element prevents our handlers from reaching the document click handler.
|
|
1260
1255
|
</div>
|
|
1261
1256
|
</div>
|
|
1262
|
-
|
|
1263
|
-
);
|
|
1264
|
-
|
|
1257
|
+
`);
|
|
1265
1258
|
await ctrl.show();
|
|
1266
1259
|
expect(ctrl.isShown).to.equal(true);
|
|
1267
|
-
|
|
1268
|
-
const noiseEl = /** @type {HTMLElement} */ (dom.querySelector('#third-party-noise'));
|
|
1269
|
-
|
|
1260
|
+
const noiseEl = /** @type {HTMLElement} */ dom.querySelector('#third-party-noise');
|
|
1270
1261
|
mimicClick(noiseEl);
|
|
1271
1262
|
await aTimeout(0);
|
|
1272
1263
|
expect(ctrl.isShown).to.equal(false);
|
|
@@ -1275,12 +1266,11 @@ describe('OverlayController', () => {
|
|
|
1275
1266
|
await ctrl.show();
|
|
1276
1267
|
expect(ctrl.isShown).to.equal(true);
|
|
1277
1268
|
});
|
|
1278
|
-
|
|
1279
1269
|
it('works with 3rd party code using "event.stopPropagation()" on capture phase', async () => {
|
|
1280
|
-
const invokerNode =
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1270
|
+
const invokerNode =
|
|
1271
|
+
/** @type {HTMLElement} */
|
|
1272
|
+
await fixture(html`<div role="button">Invoker</div>`);
|
|
1273
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1284
1274
|
const ctrl = new OverlayController({
|
|
1285
1275
|
...withLocalTestConfig(),
|
|
1286
1276
|
hidesOnOutsideClick: true,
|
|
@@ -1288,7 +1278,8 @@ describe('OverlayController', () => {
|
|
|
1288
1278
|
invokerNode,
|
|
1289
1279
|
});
|
|
1290
1280
|
const stopProp = (/** @type {Event} */ e) => e.stopPropagation();
|
|
1291
|
-
const dom =
|
|
1281
|
+
const dom =
|
|
1282
|
+
/** @type {HTMLElement} */
|
|
1292
1283
|
await fixture(`
|
|
1293
1284
|
<div>
|
|
1294
1285
|
<div id="popup">${invokerNode}${ctrl.content}</div>
|
|
@@ -1296,18 +1287,13 @@ describe('OverlayController', () => {
|
|
|
1296
1287
|
This element prevents our handlers from reaching the document click handler.
|
|
1297
1288
|
</div>
|
|
1298
1289
|
</div>
|
|
1299
|
-
`)
|
|
1300
|
-
);
|
|
1301
|
-
|
|
1302
|
-
const noiseEl = /** @type {HTMLElement} */ (dom.querySelector('#third-party-noise'));
|
|
1303
|
-
|
|
1290
|
+
`);
|
|
1291
|
+
const noiseEl = /** @type {HTMLElement} */ dom.querySelector('#third-party-noise');
|
|
1304
1292
|
noiseEl.addEventListener('click', stopProp, true);
|
|
1305
1293
|
noiseEl.addEventListener('mousedown', stopProp, true);
|
|
1306
1294
|
noiseEl.addEventListener('mouseup', stopProp, true);
|
|
1307
|
-
|
|
1308
1295
|
await ctrl.show();
|
|
1309
1296
|
expect(ctrl.isShown).to.equal(true);
|
|
1310
|
-
|
|
1311
1297
|
mimicClick(noiseEl);
|
|
1312
1298
|
await aTimeout(0);
|
|
1313
1299
|
expect(ctrl.isShown).to.equal(false);
|
|
@@ -1316,17 +1302,16 @@ describe('OverlayController', () => {
|
|
|
1316
1302
|
await ctrl.show();
|
|
1317
1303
|
expect(ctrl.isShown).to.equal(true);
|
|
1318
1304
|
});
|
|
1319
|
-
|
|
1320
1305
|
it('doesn\'t hide on "inside label" click', async () => {
|
|
1321
|
-
const contentNode =
|
|
1306
|
+
const contentNode =
|
|
1307
|
+
/** @type {HTMLElement} */
|
|
1322
1308
|
await fixture(`
|
|
1323
1309
|
<div>
|
|
1324
1310
|
<label for="test">test</label>
|
|
1325
1311
|
<input id="test">
|
|
1326
1312
|
Content
|
|
1327
|
-
</div>`)
|
|
1328
|
-
);
|
|
1329
|
-
const labelNode = /** @type {HTMLElement} */ (contentNode.querySelector('label[for=test]'));
|
|
1313
|
+
</div>`);
|
|
1314
|
+
const labelNode = /** @type {HTMLElement} */ contentNode.querySelector('label[for=test]');
|
|
1330
1315
|
const ctrl = new OverlayController({
|
|
1331
1316
|
...withGlobalTestConfig(),
|
|
1332
1317
|
hidesOnOutsideClick: true,
|
|
@@ -1337,27 +1322,22 @@ describe('OverlayController', () => {
|
|
|
1337
1322
|
// Don't hide on label click
|
|
1338
1323
|
labelNode.click();
|
|
1339
1324
|
await aTimeout(0);
|
|
1340
|
-
|
|
1341
1325
|
expect(ctrl.isShown).to.be.true;
|
|
1342
1326
|
});
|
|
1343
|
-
|
|
1344
1327
|
it('hides when window is blurred (useful for iframes)', async () => {
|
|
1345
1328
|
const ctrl = new OverlayController({
|
|
1346
1329
|
...withGlobalTestConfig(),
|
|
1347
1330
|
hidesOnOutsideClick: true,
|
|
1348
1331
|
});
|
|
1349
1332
|
await ctrl.show();
|
|
1350
|
-
|
|
1351
1333
|
window.dispatchEvent(new Event('blur'));
|
|
1352
1334
|
await aTimeout(0);
|
|
1353
|
-
|
|
1354
1335
|
expect(ctrl.isShown).to.be.false;
|
|
1355
1336
|
});
|
|
1356
1337
|
});
|
|
1357
|
-
|
|
1358
1338
|
describe('elementToFocusAfterHide', () => {
|
|
1359
1339
|
it('focuses body when hiding by default', async () => {
|
|
1360
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1340
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div><input /></div>');
|
|
1361
1341
|
const ctrl = new OverlayController({
|
|
1362
1342
|
...withGlobalTestConfig(),
|
|
1363
1343
|
viewportConfig: {
|
|
@@ -1365,90 +1345,78 @@ describe('OverlayController', () => {
|
|
|
1365
1345
|
},
|
|
1366
1346
|
contentNode,
|
|
1367
1347
|
});
|
|
1368
|
-
|
|
1369
1348
|
await ctrl.show();
|
|
1370
|
-
const input = /** @type {HTMLInputElement} */
|
|
1349
|
+
const input = /** @type {HTMLInputElement} */ contentNode.querySelector('input');
|
|
1371
1350
|
input.focus();
|
|
1372
1351
|
expect(isActiveElement(input)).to.be.true;
|
|
1373
|
-
|
|
1374
1352
|
await ctrl.hide();
|
|
1375
1353
|
expect(isActiveElement(document.body)).to.be.true;
|
|
1376
1354
|
});
|
|
1377
|
-
|
|
1378
1355
|
it('supports elementToFocusAfterHide option to focus it when hiding', async () => {
|
|
1379
|
-
const input = /** @type {HTMLElement} */
|
|
1380
|
-
const contentNode =
|
|
1381
|
-
|
|
1382
|
-
|
|
1356
|
+
const input = /** @type {HTMLElement} */ await fixture('<input />');
|
|
1357
|
+
const contentNode =
|
|
1358
|
+
/** @type {HTMLElement} */
|
|
1359
|
+
await fixture('<div><textarea></textarea></div>');
|
|
1383
1360
|
const ctrl = new OverlayController({
|
|
1384
1361
|
...withGlobalTestConfig(),
|
|
1385
1362
|
elementToFocusAfterHide: input,
|
|
1386
1363
|
contentNode,
|
|
1387
1364
|
});
|
|
1388
|
-
|
|
1389
1365
|
await ctrl.show();
|
|
1390
|
-
const textarea = /** @type {HTMLTextAreaElement} */
|
|
1366
|
+
const textarea = /** @type {HTMLTextAreaElement} */ contentNode.querySelector('textarea');
|
|
1391
1367
|
textarea.focus();
|
|
1392
1368
|
expect(isActiveElement(textarea)).to.be.true;
|
|
1393
|
-
|
|
1394
1369
|
await ctrl.hide();
|
|
1395
1370
|
expect(isActiveElement(input)).to.be.true;
|
|
1396
1371
|
expect(isInViewport(input)).to.be.true;
|
|
1397
1372
|
});
|
|
1398
|
-
|
|
1399
1373
|
it('supports elementToFocusAfterHide option when shadowRoot involved', async () => {
|
|
1400
|
-
const input = /** @type {HTMLElement} */
|
|
1401
|
-
const contentNode =
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1374
|
+
const input = /** @type {HTMLElement} */ await fixture('<input />');
|
|
1375
|
+
const contentNode =
|
|
1376
|
+
/** @type {HTMLElement} */
|
|
1377
|
+
await fixture('<div><textarea></textarea></div>');
|
|
1405
1378
|
const shadowHost = document.createElement('div');
|
|
1406
|
-
shadowHost.attachShadow({
|
|
1407
|
-
|
|
1379
|
+
shadowHost.attachShadow({
|
|
1380
|
+
mode: 'open',
|
|
1381
|
+
});
|
|
1382
|
+
/** @type {ShadowRoot} */
|
|
1383
|
+
shadowHost.shadowRoot.innerHTML = `<slot></slot>`;
|
|
1408
1384
|
shadowHost.appendChild(contentNode);
|
|
1409
1385
|
document.body.appendChild(shadowHost);
|
|
1410
|
-
|
|
1411
1386
|
const ctrl = new OverlayController({
|
|
1412
1387
|
...withGlobalTestConfig(),
|
|
1413
1388
|
elementToFocusAfterHide: input,
|
|
1414
1389
|
contentNode,
|
|
1415
1390
|
});
|
|
1416
|
-
|
|
1417
1391
|
await ctrl.show();
|
|
1418
|
-
const textarea = /** @type {HTMLTextAreaElement} */
|
|
1392
|
+
const textarea = /** @type {HTMLTextAreaElement} */ contentNode.querySelector('textarea');
|
|
1419
1393
|
textarea.focus();
|
|
1420
1394
|
expect(isActiveElement(textarea)).to.be.true;
|
|
1421
|
-
|
|
1422
1395
|
await ctrl.hide();
|
|
1423
1396
|
expect(isActiveElement(input)).to.be.true;
|
|
1424
|
-
|
|
1425
1397
|
document.body.removeChild(shadowHost);
|
|
1426
1398
|
});
|
|
1427
|
-
|
|
1428
1399
|
it(`only sets focus when outside world didn't take over already`, async () => {
|
|
1429
|
-
const input = /** @type {HTMLElement} */
|
|
1430
|
-
const outsideButton = /** @type {HTMLButtonElement} */
|
|
1431
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1400
|
+
const input = /** @type {HTMLElement} */ await fixture('<input />');
|
|
1401
|
+
const outsideButton = /** @type {HTMLButtonElement} */ await fixture('<button></button>');
|
|
1402
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>/div>');
|
|
1432
1403
|
const ctrl = new OverlayController({
|
|
1433
1404
|
...withGlobalTestConfig(),
|
|
1434
1405
|
elementToFocusAfterHide: input,
|
|
1435
1406
|
contentNode,
|
|
1436
1407
|
});
|
|
1437
|
-
|
|
1438
1408
|
await ctrl.show();
|
|
1439
1409
|
// an outside element has taken over focus
|
|
1440
1410
|
outsideButton.focus();
|
|
1441
1411
|
expect(isActiveElement(outsideButton)).to.be.true;
|
|
1442
|
-
|
|
1443
1412
|
await ctrl.hide();
|
|
1444
1413
|
expect(isActiveElement(outsideButton)).to.be.true;
|
|
1445
1414
|
});
|
|
1446
|
-
|
|
1447
1415
|
it('allows to set elementToFocusAfterHide on show', async () => {
|
|
1448
|
-
const input = /** @type {HTMLElement} */
|
|
1449
|
-
const contentNode =
|
|
1450
|
-
|
|
1451
|
-
|
|
1416
|
+
const input = /** @type {HTMLElement} */ await fixture('<input />');
|
|
1417
|
+
const contentNode =
|
|
1418
|
+
/** @type {HTMLElement} */
|
|
1419
|
+
await fixture('<div><textarea></textarea></div>');
|
|
1452
1420
|
const ctrl = new OverlayController({
|
|
1453
1421
|
...withGlobalTestConfig(),
|
|
1454
1422
|
viewportConfig: {
|
|
@@ -1456,31 +1424,25 @@ describe('OverlayController', () => {
|
|
|
1456
1424
|
},
|
|
1457
1425
|
contentNode,
|
|
1458
1426
|
});
|
|
1459
|
-
|
|
1460
1427
|
await ctrl.show(input);
|
|
1461
|
-
const textarea = /** @type {HTMLTextAreaElement} */
|
|
1428
|
+
const textarea = /** @type {HTMLTextAreaElement} */ contentNode.querySelector('textarea');
|
|
1462
1429
|
textarea.focus();
|
|
1463
1430
|
expect(isActiveElement(textarea)).to.be.true;
|
|
1464
|
-
|
|
1465
1431
|
await ctrl.hide();
|
|
1466
1432
|
expect(isActiveElement(input)).to.be.true;
|
|
1467
1433
|
});
|
|
1468
1434
|
});
|
|
1469
|
-
|
|
1470
1435
|
describe('preventsScroll', () => {
|
|
1471
1436
|
it('prevent scrolling the background', async () => {
|
|
1472
1437
|
const ctrl = new OverlayController({
|
|
1473
1438
|
...withGlobalTestConfig(),
|
|
1474
1439
|
preventsScroll: true,
|
|
1475
1440
|
});
|
|
1476
|
-
|
|
1477
1441
|
await ctrl.show();
|
|
1478
1442
|
expect(Array.from(document.body.classList)).to.contain('overlays-scroll-lock');
|
|
1479
|
-
|
|
1480
1443
|
await ctrl.hide();
|
|
1481
1444
|
expect(Array.from(document.body.classList)).to.not.contain('overlays-scroll-lock');
|
|
1482
1445
|
});
|
|
1483
|
-
|
|
1484
1446
|
it('keeps preventing of scrolling when multiple overlays are opened and closed', async () => {
|
|
1485
1447
|
const ctrl0 = new OverlayController({
|
|
1486
1448
|
...withGlobalTestConfig(),
|
|
@@ -1490,13 +1452,11 @@ describe('OverlayController', () => {
|
|
|
1490
1452
|
...withGlobalTestConfig(),
|
|
1491
1453
|
preventsScroll: true,
|
|
1492
1454
|
});
|
|
1493
|
-
|
|
1494
1455
|
await ctrl0.show();
|
|
1495
1456
|
await ctrl1.show();
|
|
1496
1457
|
await ctrl1.hide();
|
|
1497
1458
|
expect(Array.from(document.body.classList)).to.contain('overlays-scroll-lock');
|
|
1498
1459
|
});
|
|
1499
|
-
|
|
1500
1460
|
it('does not accumulate body margins when nested overlays have preventsScroll', async () => {
|
|
1501
1461
|
const ctrl0 = new OverlayController({
|
|
1502
1462
|
...withGlobalTestConfig(),
|
|
@@ -1506,45 +1466,35 @@ describe('OverlayController', () => {
|
|
|
1506
1466
|
...withGlobalTestConfig(),
|
|
1507
1467
|
preventsScroll: true,
|
|
1508
1468
|
});
|
|
1509
|
-
|
|
1510
1469
|
const originalMarginRight = document.body.style.marginRight;
|
|
1511
|
-
|
|
1512
1470
|
await ctrl0.show();
|
|
1513
1471
|
const marginAfterFirst = document.body.style.marginRight;
|
|
1514
|
-
|
|
1515
1472
|
await ctrl1.show();
|
|
1516
1473
|
const marginAfterSecond = document.body.style.marginRight;
|
|
1517
1474
|
|
|
1518
1475
|
// The margin should NOT increase further when second overlay opens
|
|
1519
1476
|
expect(marginAfterSecond).to.equal(marginAfterFirst);
|
|
1520
|
-
|
|
1521
1477
|
await ctrl1.hide();
|
|
1522
1478
|
// After hiding second, first still prevents scroll — margin stays
|
|
1523
1479
|
expect(document.body.style.marginRight).to.equal(marginAfterFirst);
|
|
1524
|
-
|
|
1525
1480
|
await ctrl0.hide();
|
|
1526
1481
|
// After hiding all, original margin is restored
|
|
1527
1482
|
expect(document.body.style.marginRight).to.equal(originalMarginRight);
|
|
1528
1483
|
});
|
|
1529
|
-
|
|
1530
1484
|
it('restores body margin when overlay with preventsScroll is torn down while shown', async () => {
|
|
1531
1485
|
const ctrl = new OverlayController({
|
|
1532
1486
|
...withGlobalTestConfig(),
|
|
1533
1487
|
preventsScroll: true,
|
|
1534
1488
|
});
|
|
1535
|
-
|
|
1536
1489
|
const originalMarginRight = document.body.style.marginRight;
|
|
1537
|
-
|
|
1538
1490
|
await ctrl.show();
|
|
1539
1491
|
const marginAfterShow = document.body.style.marginRight;
|
|
1540
1492
|
// Margin should be set after show
|
|
1541
1493
|
expect(marginAfterShow).to.not.equal(originalMarginRight);
|
|
1542
|
-
|
|
1543
1494
|
ctrl.teardown();
|
|
1544
1495
|
// Margin should be restored after teardown
|
|
1545
1496
|
expect(document.body.style.marginRight).to.equal(originalMarginRight);
|
|
1546
1497
|
});
|
|
1547
|
-
|
|
1548
1498
|
it('does not break body margin when teardown() is called on a hidden overlay', async () => {
|
|
1549
1499
|
const ctrl0 = new OverlayController({
|
|
1550
1500
|
...withGlobalTestConfig(),
|
|
@@ -1554,7 +1504,6 @@ describe('OverlayController', () => {
|
|
|
1554
1504
|
...withGlobalTestConfig(),
|
|
1555
1505
|
preventsScroll: true,
|
|
1556
1506
|
});
|
|
1557
|
-
|
|
1558
1507
|
const originalMarginRight = document.body.style.marginRight;
|
|
1559
1508
|
|
|
1560
1509
|
// Show first overlay
|
|
@@ -1572,13 +1521,11 @@ describe('OverlayController', () => {
|
|
|
1572
1521
|
// Now margin should be restored
|
|
1573
1522
|
expect(document.body.style.marginRight).to.equal(originalMarginRight);
|
|
1574
1523
|
});
|
|
1575
|
-
|
|
1576
1524
|
it('does not break body margin when updateConfig() is called on a hidden overlay', async () => {
|
|
1577
1525
|
const ctrl = new OverlayController({
|
|
1578
1526
|
...withGlobalTestConfig(),
|
|
1579
1527
|
preventsScroll: true,
|
|
1580
1528
|
});
|
|
1581
|
-
|
|
1582
1529
|
const originalMarginRight = document.body.style.marginRight;
|
|
1583
1530
|
|
|
1584
1531
|
// updateConfig calls teardown internally
|
|
@@ -1600,7 +1547,6 @@ describe('OverlayController', () => {
|
|
|
1600
1547
|
expect(document.body.style.marginRight).to.equal(originalMarginRight);
|
|
1601
1548
|
});
|
|
1602
1549
|
});
|
|
1603
|
-
|
|
1604
1550
|
describe('hasBackdrop', () => {
|
|
1605
1551
|
it('has no backdrop by default', async () => {
|
|
1606
1552
|
const ctrl = new OverlayController({
|
|
@@ -1609,7 +1555,6 @@ describe('OverlayController', () => {
|
|
|
1609
1555
|
await ctrl.show();
|
|
1610
1556
|
expect(ctrl.backdropNode).to.be.undefined;
|
|
1611
1557
|
});
|
|
1612
|
-
|
|
1613
1558
|
it('supports a backdrop option', async () => {
|
|
1614
1559
|
const ctrl = new OverlayController({
|
|
1615
1560
|
...withGlobalTestConfig(),
|
|
@@ -1618,7 +1563,6 @@ describe('OverlayController', () => {
|
|
|
1618
1563
|
await ctrl.show();
|
|
1619
1564
|
expect(ctrl.backdropNode).to.be.undefined;
|
|
1620
1565
|
await ctrl.hide();
|
|
1621
|
-
|
|
1622
1566
|
const controllerWithBackdrop = new OverlayController({
|
|
1623
1567
|
...withGlobalTestConfig(),
|
|
1624
1568
|
hasBackdrop: true,
|
|
@@ -1626,7 +1570,6 @@ describe('OverlayController', () => {
|
|
|
1626
1570
|
await controllerWithBackdrop.show();
|
|
1627
1571
|
expect(controllerWithBackdrop.backdropNode).to.have.class('overlays__backdrop');
|
|
1628
1572
|
});
|
|
1629
|
-
|
|
1630
1573
|
it('reenables the backdrop when shown/hidden/shown', async () => {
|
|
1631
1574
|
const ctrl = new OverlayController({
|
|
1632
1575
|
...withGlobalTestConfig(),
|
|
@@ -1638,7 +1581,6 @@ describe('OverlayController', () => {
|
|
|
1638
1581
|
await ctrl.show();
|
|
1639
1582
|
expect(ctrl.backdropNode).to.have.class('overlays__backdrop');
|
|
1640
1583
|
});
|
|
1641
|
-
|
|
1642
1584
|
it('adds and stacks backdrops if .hasBackdrop is enabled', async () => {
|
|
1643
1585
|
const ctrl0 = new OverlayController({
|
|
1644
1586
|
...withGlobalTestConfig(),
|
|
@@ -1646,7 +1588,6 @@ describe('OverlayController', () => {
|
|
|
1646
1588
|
});
|
|
1647
1589
|
await ctrl0.show();
|
|
1648
1590
|
expect(ctrl0.backdropNode).to.have.class('overlays__backdrop');
|
|
1649
|
-
|
|
1650
1591
|
const ctrl1 = new OverlayController({
|
|
1651
1592
|
...withGlobalTestConfig(),
|
|
1652
1593
|
hasBackdrop: false,
|
|
@@ -1654,19 +1595,16 @@ describe('OverlayController', () => {
|
|
|
1654
1595
|
await ctrl1.show();
|
|
1655
1596
|
expect(ctrl0.backdropNode).to.have.class('overlays__backdrop');
|
|
1656
1597
|
expect(ctrl1.backdropNode).to.be.undefined;
|
|
1657
|
-
|
|
1658
1598
|
const ctrl2 = new OverlayController({
|
|
1659
1599
|
...withGlobalTestConfig(),
|
|
1660
1600
|
hasBackdrop: true,
|
|
1661
1601
|
});
|
|
1662
1602
|
await ctrl2.show();
|
|
1663
|
-
|
|
1664
1603
|
expect(ctrl0.backdropNode).to.have.class('overlays__backdrop');
|
|
1665
1604
|
expect(ctrl1.backdropNode).to.be.undefined;
|
|
1666
1605
|
expect(ctrl2.backdropNode).to.have.class('overlays__backdrop');
|
|
1667
1606
|
});
|
|
1668
1607
|
});
|
|
1669
|
-
|
|
1670
1608
|
describe('locally placed overlay with hasBackdrop', () => {
|
|
1671
1609
|
it('has no backdrop by default', async () => {
|
|
1672
1610
|
const ctrl = new OverlayController({
|
|
@@ -1675,7 +1613,6 @@ describe('OverlayController', () => {
|
|
|
1675
1613
|
await ctrl.show();
|
|
1676
1614
|
expect(ctrl.backdropNode).to.be.undefined;
|
|
1677
1615
|
});
|
|
1678
|
-
|
|
1679
1616
|
it('supports a backdrop option', async () => {
|
|
1680
1617
|
const ctrl = new OverlayController({
|
|
1681
1618
|
...withLocalTestConfig(),
|
|
@@ -1684,10 +1621,8 @@ describe('OverlayController', () => {
|
|
|
1684
1621
|
await ctrl.show();
|
|
1685
1622
|
expect(ctrl.backdropNode).to.be.undefined;
|
|
1686
1623
|
await ctrl.hide();
|
|
1687
|
-
|
|
1688
1624
|
const backdropNode = document.createElement('div');
|
|
1689
1625
|
backdropNode.classList.add('custom-backdrop');
|
|
1690
|
-
|
|
1691
1626
|
const controllerWithBackdrop = new OverlayController({
|
|
1692
1627
|
...withLocalTestConfig(),
|
|
1693
1628
|
hasBackdrop: true,
|
|
@@ -1696,11 +1631,9 @@ describe('OverlayController', () => {
|
|
|
1696
1631
|
await controllerWithBackdrop.show();
|
|
1697
1632
|
expect(controllerWithBackdrop.backdropNode).to.have.class('custom-backdrop');
|
|
1698
1633
|
});
|
|
1699
|
-
|
|
1700
1634
|
it('reenables the backdrop when shown/hidden/shown', async () => {
|
|
1701
1635
|
const backdropNode = document.createElement('div');
|
|
1702
1636
|
backdropNode.classList.add('custom-backdrop');
|
|
1703
|
-
|
|
1704
1637
|
const ctrl = new OverlayController({
|
|
1705
1638
|
...withLocalTestConfig(),
|
|
1706
1639
|
hasBackdrop: true,
|
|
@@ -1712,11 +1645,9 @@ describe('OverlayController', () => {
|
|
|
1712
1645
|
await ctrl.show();
|
|
1713
1646
|
expect(ctrl.backdropNode).to.have.class('custom-backdrop');
|
|
1714
1647
|
});
|
|
1715
|
-
|
|
1716
1648
|
it('adds and stacks backdrops if .hasBackdrop is enabled', async () => {
|
|
1717
1649
|
const backdropNode = document.createElement('div');
|
|
1718
1650
|
backdropNode.classList.add('custom-backdrop-zero');
|
|
1719
|
-
|
|
1720
1651
|
const ctrl0 = new OverlayController({
|
|
1721
1652
|
...withLocalTestConfig(),
|
|
1722
1653
|
hasBackdrop: true,
|
|
@@ -1724,7 +1655,6 @@ describe('OverlayController', () => {
|
|
|
1724
1655
|
});
|
|
1725
1656
|
await ctrl0.show();
|
|
1726
1657
|
expect(ctrl0.backdropNode).to.have.class('custom-backdrop-zero');
|
|
1727
|
-
|
|
1728
1658
|
const ctrl1 = new OverlayController({
|
|
1729
1659
|
...withLocalTestConfig(),
|
|
1730
1660
|
hasBackdrop: false,
|
|
@@ -1732,23 +1662,19 @@ describe('OverlayController', () => {
|
|
|
1732
1662
|
await ctrl1.show();
|
|
1733
1663
|
expect(ctrl0.backdropNode).to.have.class('custom-backdrop-zero');
|
|
1734
1664
|
expect(ctrl1.backdropNode).to.be.undefined;
|
|
1735
|
-
|
|
1736
1665
|
const anotherBackdropNode = document.createElement('div');
|
|
1737
1666
|
anotherBackdropNode.classList.add('custom-backdrop-two');
|
|
1738
|
-
|
|
1739
1667
|
const ctrl2 = new OverlayController({
|
|
1740
1668
|
...withLocalTestConfig(),
|
|
1741
1669
|
hasBackdrop: true,
|
|
1742
1670
|
backdropNode: anotherBackdropNode,
|
|
1743
1671
|
});
|
|
1744
1672
|
await ctrl2.show();
|
|
1745
|
-
|
|
1746
1673
|
expect(ctrl0.backdropNode).to.have.class('custom-backdrop-zero');
|
|
1747
1674
|
expect(ctrl1.backdropNode).to.be.undefined;
|
|
1748
1675
|
expect(ctrl2.backdropNode).to.have.class('custom-backdrop-two');
|
|
1749
1676
|
});
|
|
1750
1677
|
});
|
|
1751
|
-
|
|
1752
1678
|
describe('isBlocking', () => {
|
|
1753
1679
|
it('prevents showing of other overlays', async () => {
|
|
1754
1680
|
const ctrl0 = new OverlayController({
|
|
@@ -1767,30 +1693,25 @@ describe('OverlayController', () => {
|
|
|
1767
1693
|
...withGlobalTestConfig(),
|
|
1768
1694
|
isBlocking: false,
|
|
1769
1695
|
});
|
|
1770
|
-
|
|
1771
1696
|
await ctrl0.show();
|
|
1772
1697
|
await ctrl1.show();
|
|
1773
1698
|
await ctrl2.show(); // blocking
|
|
1774
1699
|
expect(ctrl0.__wrappingDialogNode).to.not.be.displayed;
|
|
1775
1700
|
expect(ctrl1.__wrappingDialogNode).to.not.be.displayed;
|
|
1776
1701
|
expect(ctrl2.__wrappingDialogNode).to.be.displayed;
|
|
1777
|
-
|
|
1778
1702
|
await ctrl3.show();
|
|
1779
1703
|
await ctrl3._showComplete;
|
|
1780
1704
|
expect(ctrl3.__wrappingDialogNode).to.be.displayed;
|
|
1781
|
-
|
|
1782
1705
|
await ctrl2.hide();
|
|
1783
1706
|
await ctrl2._hideComplete;
|
|
1784
1707
|
expect(ctrl0.__wrappingDialogNode).to.be.displayed;
|
|
1785
1708
|
expect(ctrl1.__wrappingDialogNode).to.be.displayed;
|
|
1786
|
-
|
|
1787
1709
|
await ctrl2.show(); // blocking
|
|
1788
1710
|
expect(ctrl0.__wrappingDialogNode).to.not.be.displayed;
|
|
1789
1711
|
expect(ctrl1.__wrappingDialogNode).to.not.be.displayed;
|
|
1790
1712
|
expect(ctrl2.__wrappingDialogNode).to.be.displayed;
|
|
1791
1713
|
expect(ctrl3.__wrappingDialogNode).to.not.be.displayed;
|
|
1792
1714
|
});
|
|
1793
|
-
|
|
1794
1715
|
it('keeps backdrop status when used in combination with blocking', async () => {
|
|
1795
1716
|
const ctrl0 = new OverlayController({
|
|
1796
1717
|
...withGlobalTestConfig(),
|
|
@@ -1798,7 +1719,6 @@ describe('OverlayController', () => {
|
|
|
1798
1719
|
hasBackdrop: true,
|
|
1799
1720
|
});
|
|
1800
1721
|
await ctrl0.show();
|
|
1801
|
-
|
|
1802
1722
|
const ctrl1 = new OverlayController({
|
|
1803
1723
|
...withGlobalTestConfig(),
|
|
1804
1724
|
isBlocking: false,
|
|
@@ -1808,13 +1728,11 @@ describe('OverlayController', () => {
|
|
|
1808
1728
|
await ctrl1.hide();
|
|
1809
1729
|
expect(ctrl0.hasActiveBackdrop).to.be.true;
|
|
1810
1730
|
expect(ctrl1.hasActiveBackdrop).to.be.false;
|
|
1811
|
-
|
|
1812
1731
|
await ctrl1.show();
|
|
1813
1732
|
expect(ctrl0.hasActiveBackdrop).to.be.true;
|
|
1814
1733
|
expect(ctrl1.hasActiveBackdrop).to.be.true;
|
|
1815
1734
|
});
|
|
1816
1735
|
});
|
|
1817
|
-
|
|
1818
1736
|
describe('elementToFocusOnShow', () => {
|
|
1819
1737
|
it('adds tabindex="-1" to the content node when elementToFocusOnShow is true', async () => {
|
|
1820
1738
|
const ctrl = new OverlayController({
|
|
@@ -1822,51 +1740,52 @@ describe('OverlayController', () => {
|
|
|
1822
1740
|
isBlocking: false,
|
|
1823
1741
|
elementToFocusOnShow: true,
|
|
1824
1742
|
});
|
|
1825
|
-
const contentNode = /** @type {HTMLElement} */
|
|
1826
|
-
ctrl.updateConfig({
|
|
1743
|
+
const contentNode = /** @type {HTMLElement} */ await fixture('<div>Content</div>');
|
|
1744
|
+
ctrl.updateConfig({
|
|
1745
|
+
contentNode,
|
|
1746
|
+
});
|
|
1827
1747
|
await ctrl.show();
|
|
1828
1748
|
expect(contentNode.getAttribute('tabindex')).to.equal('-1');
|
|
1829
1749
|
});
|
|
1830
|
-
|
|
1831
1750
|
it('makes contentNode the root of "next tab flow"', async () => {
|
|
1832
1751
|
const ctrl = new OverlayController({
|
|
1833
1752
|
...withGlobalTestConfig(),
|
|
1834
1753
|
isBlocking: false,
|
|
1835
1754
|
elementToFocusOnShow: true,
|
|
1836
1755
|
});
|
|
1837
|
-
const contentNode =
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
ctrl.updateConfig({
|
|
1756
|
+
const contentNode =
|
|
1757
|
+
/** @type {HTMLElement} */
|
|
1758
|
+
await fixture('<div><button>Button</button></div>');
|
|
1759
|
+
ctrl.updateConfig({
|
|
1760
|
+
contentNode,
|
|
1761
|
+
});
|
|
1841
1762
|
await ctrl.show();
|
|
1842
|
-
const button = /** @type {HTMLButtonElement} */
|
|
1763
|
+
const button = /** @type {HTMLButtonElement} */ contentNode.querySelector('button');
|
|
1843
1764
|
button.focus();
|
|
1844
1765
|
expect(isActiveElement(button)).to.be.true;
|
|
1845
1766
|
});
|
|
1846
1767
|
});
|
|
1847
|
-
|
|
1848
1768
|
describe('syncChildrenCloseState', () => {
|
|
1849
1769
|
it('does not close all children of nested controllers when syncChildrenCloseState is false', async () => {
|
|
1850
|
-
const parentContent =
|
|
1770
|
+
const parentContent =
|
|
1771
|
+
/** @type {HTMLDivElement} */
|
|
1851
1772
|
await fixture(
|
|
1852
1773
|
html` <!-- -->
|
|
1853
1774
|
<div data-sync-children-close-state id="parent-overlay">
|
|
1854
1775
|
<div id="child-overlay">we open our child and it will close when parent does</div>
|
|
1855
1776
|
</div>`,
|
|
1856
|
-
)
|
|
1857
|
-
);
|
|
1777
|
+
);
|
|
1858
1778
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1859
1779
|
expect(parentOverlay.isShown).to.be.true;
|
|
1860
1780
|
expect(childOverlay.isShown).to.be.true;
|
|
1861
|
-
|
|
1862
1781
|
await parentOverlay.hide();
|
|
1863
1782
|
await childOverlay._hideComplete;
|
|
1864
1783
|
expect(parentOverlay.isShown).to.be.false;
|
|
1865
1784
|
expect(childOverlay.isShown).to.be.false;
|
|
1866
1785
|
});
|
|
1867
|
-
|
|
1868
1786
|
it('does not close all children of nested controllers when syncChildrenCloseState is false', async () => {
|
|
1869
|
-
const parentContent =
|
|
1787
|
+
const parentContent =
|
|
1788
|
+
/** @type {HTMLDivElement} */
|
|
1870
1789
|
await fixture(
|
|
1871
1790
|
html` <!-- -->
|
|
1872
1791
|
<div id="parent-overlay">
|
|
@@ -1874,18 +1793,15 @@ describe('OverlayController', () => {
|
|
|
1874
1793
|
we open our child and it will not close when parent does
|
|
1875
1794
|
</div>
|
|
1876
1795
|
</div>`,
|
|
1877
|
-
)
|
|
1878
|
-
);
|
|
1796
|
+
);
|
|
1879
1797
|
const { parentOverlay, childOverlay } = await createNestedEscControllers(parentContent);
|
|
1880
1798
|
expect(parentOverlay.isShown).to.be.true;
|
|
1881
1799
|
expect(childOverlay.isShown).to.be.true;
|
|
1882
|
-
|
|
1883
1800
|
await parentOverlay.hide();
|
|
1884
1801
|
expect(parentOverlay.isShown).to.be.false;
|
|
1885
1802
|
expect(childOverlay.isShown).to.be.true;
|
|
1886
1803
|
});
|
|
1887
1804
|
});
|
|
1888
|
-
|
|
1889
1805
|
describe('isActivated', () => {
|
|
1890
1806
|
it('allows to conditionally disable overlay/openable functionality (for responsive context like nav menus, accordions/collapsibles vs plain headings/content etc.)', async () => {
|
|
1891
1807
|
const ctrl = new OverlayController({
|
|
@@ -1906,7 +1822,6 @@ describe('OverlayController', () => {
|
|
|
1906
1822
|
// TODO
|
|
1907
1823
|
describe('requireConnectedNodes', () => {});
|
|
1908
1824
|
});
|
|
1909
|
-
|
|
1910
1825
|
describe('Show / Hide / Toggle', () => {
|
|
1911
1826
|
it('has .isShown which defaults to false', async () => {
|
|
1912
1827
|
const ctrl = new OverlayController({
|
|
@@ -1914,7 +1829,6 @@ describe('OverlayController', () => {
|
|
|
1914
1829
|
});
|
|
1915
1830
|
expect(ctrl.isShown).to.be.false;
|
|
1916
1831
|
});
|
|
1917
|
-
|
|
1918
1832
|
it('has async show() which shows the overlay', async () => {
|
|
1919
1833
|
const ctrl = new OverlayController({
|
|
1920
1834
|
...withGlobalTestConfig(),
|
|
@@ -1923,55 +1837,44 @@ describe('OverlayController', () => {
|
|
|
1923
1837
|
expect(ctrl.isShown).to.be.true;
|
|
1924
1838
|
expect(ctrl.show()).to.be.instanceOf(Promise);
|
|
1925
1839
|
});
|
|
1926
|
-
|
|
1927
1840
|
it('has async hide() which hides the overlay', async () => {
|
|
1928
1841
|
const ctrl = new OverlayController({
|
|
1929
1842
|
...withGlobalTestConfig(),
|
|
1930
1843
|
});
|
|
1931
|
-
|
|
1932
1844
|
await ctrl.hide();
|
|
1933
1845
|
expect(ctrl.isShown).to.be.false;
|
|
1934
1846
|
expect(ctrl.hide()).to.be.instanceOf(Promise);
|
|
1935
1847
|
});
|
|
1936
|
-
|
|
1937
1848
|
it('fires "show" event once overlay becomes shown', async () => {
|
|
1938
1849
|
const showSpy = sinon.spy();
|
|
1939
1850
|
const ctrl = new OverlayController({
|
|
1940
1851
|
...withGlobalTestConfig(),
|
|
1941
1852
|
});
|
|
1942
|
-
|
|
1943
1853
|
ctrl.addEventListener('show', showSpy);
|
|
1944
1854
|
await ctrl.show();
|
|
1945
1855
|
expect(showSpy.callCount).to.equal(1);
|
|
1946
1856
|
await ctrl.show();
|
|
1947
1857
|
expect(showSpy.callCount).to.equal(1);
|
|
1948
1858
|
});
|
|
1949
|
-
|
|
1950
1859
|
it('fires "before-show" event right before overlay becomes shown', async () => {
|
|
1951
1860
|
const ctrl = new OverlayController({
|
|
1952
1861
|
...withGlobalTestConfig(),
|
|
1953
1862
|
});
|
|
1954
|
-
|
|
1955
1863
|
const eventSpy = sinon.spy();
|
|
1956
|
-
|
|
1957
1864
|
ctrl.addEventListener('before-show', eventSpy);
|
|
1958
1865
|
ctrl.addEventListener('show', eventSpy);
|
|
1959
|
-
|
|
1960
1866
|
await ctrl.show();
|
|
1961
1867
|
expect(eventSpy.getCall(0).args[0].type).to.equal('before-show');
|
|
1962
1868
|
expect(eventSpy.getCall(1).args[0].type).to.equal('show');
|
|
1963
|
-
|
|
1964
1869
|
expect(eventSpy.callCount).to.equal(2);
|
|
1965
1870
|
await ctrl.show();
|
|
1966
1871
|
expect(eventSpy.callCount).to.equal(2);
|
|
1967
1872
|
});
|
|
1968
|
-
|
|
1969
1873
|
it('fires "hide" event once overlay becomes hidden', async () => {
|
|
1970
1874
|
const hideSpy = sinon.spy();
|
|
1971
1875
|
const ctrl = new OverlayController({
|
|
1972
1876
|
...withGlobalTestConfig(),
|
|
1973
1877
|
});
|
|
1974
|
-
|
|
1975
1878
|
ctrl.addEventListener('hide', hideSpy);
|
|
1976
1879
|
await ctrl.show();
|
|
1977
1880
|
await ctrl.hide();
|
|
@@ -1979,38 +1882,29 @@ describe('OverlayController', () => {
|
|
|
1979
1882
|
await ctrl.hide();
|
|
1980
1883
|
expect(hideSpy.callCount).to.equal(1);
|
|
1981
1884
|
});
|
|
1982
|
-
|
|
1983
1885
|
it('fires "before-hide" event right before overlay becomes hidden', async () => {
|
|
1984
1886
|
const ctrl = new OverlayController({
|
|
1985
1887
|
...withGlobalTestConfig(),
|
|
1986
1888
|
});
|
|
1987
|
-
|
|
1988
1889
|
const eventSpy = sinon.spy();
|
|
1989
|
-
|
|
1990
1890
|
ctrl.addEventListener('before-hide', eventSpy);
|
|
1991
1891
|
ctrl.addEventListener('hide', eventSpy);
|
|
1992
|
-
|
|
1993
1892
|
await ctrl.show();
|
|
1994
1893
|
await ctrl.hide();
|
|
1995
1894
|
expect(eventSpy.getCall(0).args[0].type).to.equal('before-hide');
|
|
1996
1895
|
expect(eventSpy.getCall(1).args[0].type).to.equal('hide');
|
|
1997
|
-
|
|
1998
1896
|
expect(eventSpy.callCount).to.equal(2);
|
|
1999
1897
|
await ctrl.hide();
|
|
2000
1898
|
expect(eventSpy.callCount).to.equal(2);
|
|
2001
1899
|
});
|
|
2002
|
-
|
|
2003
1900
|
it('can be toggled', async () => {
|
|
2004
1901
|
const ctrl = new OverlayController({
|
|
2005
1902
|
...withGlobalTestConfig(),
|
|
2006
1903
|
});
|
|
2007
|
-
|
|
2008
1904
|
await ctrl.toggle();
|
|
2009
1905
|
expect(ctrl.isShown).to.be.true;
|
|
2010
|
-
|
|
2011
1906
|
await ctrl.toggle();
|
|
2012
1907
|
expect(ctrl.isShown).to.be.false;
|
|
2013
|
-
|
|
2014
1908
|
await ctrl.toggle();
|
|
2015
1909
|
expect(ctrl.isShown).to.be.true;
|
|
2016
1910
|
|
|
@@ -2019,7 +1913,6 @@ describe('OverlayController', () => {
|
|
|
2019
1913
|
// check for show
|
|
2020
1914
|
expect(ctrl.toggle()).to.be.instanceOf(Promise);
|
|
2021
1915
|
});
|
|
2022
|
-
|
|
2023
1916
|
it('makes sure the latest shown overlay is visible', async () => {
|
|
2024
1917
|
const ctrl0 = new OverlayController({
|
|
2025
1918
|
...withGlobalTestConfig(),
|
|
@@ -2030,18 +1923,14 @@ describe('OverlayController', () => {
|
|
|
2030
1923
|
await ctrl0.show();
|
|
2031
1924
|
const rect = ctrl0.contentNode.getBoundingClientRect();
|
|
2032
1925
|
const getTopEl = () => document.elementFromPoint(Math.ceil(rect.left), Math.ceil(rect.top));
|
|
2033
|
-
|
|
2034
1926
|
await ctrl0.show();
|
|
2035
1927
|
expect(getTopEl()).to.equal(ctrl0.contentNode);
|
|
2036
|
-
|
|
2037
1928
|
await ctrl1.show();
|
|
2038
1929
|
expect(getTopEl()).to.equal(ctrl1.contentNode);
|
|
2039
|
-
|
|
2040
1930
|
await ctrl0.show();
|
|
2041
1931
|
expect(getTopEl()).to.equal(ctrl0.contentNode);
|
|
2042
1932
|
});
|
|
2043
|
-
|
|
2044
|
-
it('awaits a "transitionHide" hook before hiding for real', done => {
|
|
1933
|
+
it('awaits a "transitionHide" hook before hiding for real', (done) => {
|
|
2045
1934
|
const ctrl = new OverlayController({
|
|
2046
1935
|
...withGlobalTestConfig(),
|
|
2047
1936
|
});
|
|
@@ -2050,12 +1939,10 @@ describe('OverlayController', () => {
|
|
|
2050
1939
|
/** @type {{ (): void; (value?: void | PromiseLike<void> | undefined): void; }} */
|
|
2051
1940
|
let hideTransitionFinished;
|
|
2052
1941
|
ctrl.transitionHide = () =>
|
|
2053
|
-
new Promise(resolve => {
|
|
1942
|
+
new Promise((resolve) => {
|
|
2054
1943
|
hideTransitionFinished = resolve;
|
|
2055
1944
|
});
|
|
2056
|
-
|
|
2057
1945
|
ctrl.hide();
|
|
2058
|
-
|
|
2059
1946
|
expect(getComputedStyle(ctrl.content).display).to.equal('block');
|
|
2060
1947
|
setTimeout(() => {
|
|
2061
1948
|
hideTransitionFinished();
|
|
@@ -2065,8 +1952,7 @@ describe('OverlayController', () => {
|
|
|
2065
1952
|
}, 0);
|
|
2066
1953
|
}, 0);
|
|
2067
1954
|
});
|
|
2068
|
-
|
|
2069
|
-
it('awaits a "transitionShow" hook before finishing the show method', done => {
|
|
1955
|
+
it('awaits a "transitionShow" hook before finishing the show method', (done) => {
|
|
2070
1956
|
const ctrl = new OverlayController({
|
|
2071
1957
|
...withGlobalTestConfig(),
|
|
2072
1958
|
});
|
|
@@ -2074,17 +1960,16 @@ describe('OverlayController', () => {
|
|
|
2074
1960
|
/** @type {{ (): void; (value?: void | PromiseLike<void> | undefined): void; }} */
|
|
2075
1961
|
let showTransitionFinished;
|
|
2076
1962
|
ctrl.transitionShow = () =>
|
|
2077
|
-
new Promise(resolve => {
|
|
1963
|
+
new Promise((resolve) => {
|
|
2078
1964
|
showTransitionFinished = resolve;
|
|
2079
1965
|
});
|
|
2080
1966
|
ctrl.show();
|
|
2081
|
-
|
|
2082
1967
|
let showIsDone = false;
|
|
2083
1968
|
|
|
2084
|
-
/** @type {Promise<void>} */
|
|
1969
|
+
/** @type {Promise<void>} */
|
|
1970
|
+
ctrl._showComplete.then(() => {
|
|
2085
1971
|
showIsDone = true;
|
|
2086
1972
|
});
|
|
2087
|
-
|
|
2088
1973
|
expect(showIsDone).to.be.false;
|
|
2089
1974
|
setTimeout(() => {
|
|
2090
1975
|
showTransitionFinished();
|
|
@@ -2095,27 +1980,23 @@ describe('OverlayController', () => {
|
|
|
2095
1980
|
}, 0);
|
|
2096
1981
|
});
|
|
2097
1982
|
});
|
|
2098
|
-
|
|
2099
1983
|
describe('Update Configuration', () => {
|
|
2100
1984
|
it('reinitializes content', async () => {
|
|
2101
1985
|
const ctrl = new OverlayController({
|
|
2102
1986
|
...withLocalTestConfig(),
|
|
2103
|
-
contentNode: /** @type {HTMLElement} */
|
|
1987
|
+
contentNode: /** @type {HTMLElement} */ await fixture(html`<div>content1</div>`),
|
|
2104
1988
|
});
|
|
2105
1989
|
await ctrl.show(); // Popper adds inline styles
|
|
2106
1990
|
expect(ctrl.content.style.transform).not.to.be.undefined;
|
|
2107
1991
|
expect(ctrl.contentNode.textContent).to.include('content1');
|
|
2108
|
-
|
|
2109
1992
|
ctrl.updateConfig({
|
|
2110
1993
|
placementMode: 'local',
|
|
2111
|
-
contentNode: /** @type {HTMLElement} */
|
|
1994
|
+
contentNode: /** @type {HTMLElement} */ await fixture(html`<div>content2</div>`),
|
|
2112
1995
|
});
|
|
2113
1996
|
expect(ctrl.contentNode.textContent).to.include('content2');
|
|
2114
1997
|
});
|
|
2115
|
-
|
|
2116
1998
|
it('respects the initial config provided to new OverlayController(initialConfig)', async () => {
|
|
2117
|
-
const contentNode = /** @type {HTMLElement} */
|
|
2118
|
-
|
|
1999
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
|
|
2119
2000
|
const ctrl = new OverlayController({
|
|
2120
2001
|
// This is the shared config
|
|
2121
2002
|
placementMode: 'global',
|
|
@@ -2134,46 +2015,44 @@ describe('OverlayController', () => {
|
|
|
2134
2015
|
|
|
2135
2016
|
// Currently not working, enable again when we fix updateConfig
|
|
2136
2017
|
it.skip('allows for updating viewport config placement only, while keeping the content shown', async () => {
|
|
2137
|
-
const contentNode = /** @type {HTMLElement} */
|
|
2138
|
-
|
|
2018
|
+
const contentNode = /** @type {HTMLElement} */ fixtureSync(html`<div>my content</div>`);
|
|
2139
2019
|
const ctrl = new OverlayController({
|
|
2140
2020
|
// This is the shared config
|
|
2141
2021
|
placementMode: 'global',
|
|
2142
2022
|
handlesAccessibility: true,
|
|
2143
2023
|
contentNode,
|
|
2144
2024
|
});
|
|
2145
|
-
|
|
2146
2025
|
ctrl.show();
|
|
2147
2026
|
expect(ctrl.contentWrapperNode.classList.contains('overlays__overlay-container--center'));
|
|
2148
2027
|
expect(ctrl.isShown).to.be.true;
|
|
2149
|
-
|
|
2150
|
-
|
|
2028
|
+
ctrl.updateConfig({
|
|
2029
|
+
viewportConfig: {
|
|
2030
|
+
placement: 'top-right',
|
|
2031
|
+
},
|
|
2032
|
+
});
|
|
2151
2033
|
expect(ctrl.contentWrapperNode.classList.contains('overlays__overlay-container--top-right'));
|
|
2152
2034
|
expect(ctrl.isShown).to.be.true;
|
|
2153
2035
|
});
|
|
2154
|
-
|
|
2155
2036
|
it('disables backdrop when switching to hasBackrop "false"', async () => {
|
|
2156
2037
|
const ctrl = new OverlayController({
|
|
2157
2038
|
...withLocalTestConfig(),
|
|
2158
|
-
contentNode: /** @type {HTMLElement} */
|
|
2039
|
+
contentNode: /** @type {HTMLElement} */ await fixture(html`<div>content1</div>`),
|
|
2159
2040
|
hasBackdrop: true,
|
|
2160
2041
|
});
|
|
2161
2042
|
await ctrl.show(); // Popper adds inline styles
|
|
2162
2043
|
expect(ctrl.backdropNode).not.to.be.undefined;
|
|
2163
2044
|
expect(Array.from(ctrl.backdropNode.classList)).to.include('overlays__backdrop--visible');
|
|
2164
|
-
|
|
2165
2045
|
ctrl.updateConfig({
|
|
2166
2046
|
hasBackdrop: false,
|
|
2167
2047
|
});
|
|
2168
2048
|
expect(Array.from(ctrl.backdropNode.classList)).to.not.include('overlays__backdrop--visible');
|
|
2169
2049
|
});
|
|
2170
2050
|
});
|
|
2171
|
-
|
|
2172
2051
|
describe('Accessibility', () => {
|
|
2173
2052
|
it('synchronizes [aria-expanded] on invoker', async () => {
|
|
2174
|
-
const invokerNode =
|
|
2175
|
-
|
|
2176
|
-
|
|
2053
|
+
const invokerNode =
|
|
2054
|
+
/** @type {HTMLElement} */
|
|
2055
|
+
await fixture('<div role="button">invoker</div>');
|
|
2177
2056
|
const ctrl = new OverlayController({
|
|
2178
2057
|
...withLocalTestConfig(),
|
|
2179
2058
|
handlesAccessibility: true,
|
|
@@ -2185,11 +2064,10 @@ describe('OverlayController', () => {
|
|
|
2185
2064
|
await ctrl.hide();
|
|
2186
2065
|
expect(ctrl.invokerNode?.getAttribute('aria-expanded')).to.equal('false');
|
|
2187
2066
|
});
|
|
2188
|
-
|
|
2189
2067
|
it('does not synchronize [aria-expanded] on invoker when the overlay is modal', async () => {
|
|
2190
|
-
const invokerNode =
|
|
2191
|
-
|
|
2192
|
-
|
|
2068
|
+
const invokerNode =
|
|
2069
|
+
/** @type {HTMLElement} */
|
|
2070
|
+
await fixture('<div role="button">invoker</div>');
|
|
2193
2071
|
const ctrl = new OverlayController({
|
|
2194
2072
|
...withLocalTestConfig(),
|
|
2195
2073
|
trapsKeyboardFocus: true,
|
|
@@ -2202,7 +2080,6 @@ describe('OverlayController', () => {
|
|
|
2202
2080
|
await ctrl.hide();
|
|
2203
2081
|
expect(ctrl.invokerNode?.getAttribute('aria-expanded')).to.equal(null);
|
|
2204
2082
|
});
|
|
2205
|
-
|
|
2206
2083
|
it('creates unique id for content', async () => {
|
|
2207
2084
|
const ctrl = new OverlayController({
|
|
2208
2085
|
...withLocalTestConfig(),
|
|
@@ -2211,11 +2088,10 @@ describe('OverlayController', () => {
|
|
|
2211
2088
|
const { contentId } = getProtectedMembers(ctrl);
|
|
2212
2089
|
expect(ctrl.contentNode.id).to.contain(contentId);
|
|
2213
2090
|
});
|
|
2214
|
-
|
|
2215
2091
|
it('preserves content id when present', async () => {
|
|
2216
|
-
const contentNode =
|
|
2217
|
-
|
|
2218
|
-
|
|
2092
|
+
const contentNode =
|
|
2093
|
+
/** @type {HTMLElement} */
|
|
2094
|
+
await fixture('<div id="preserved">content</div>');
|
|
2219
2095
|
const ctrl = new OverlayController({
|
|
2220
2096
|
...withLocalTestConfig(),
|
|
2221
2097
|
handlesAccessibility: true,
|
|
@@ -2223,11 +2099,10 @@ describe('OverlayController', () => {
|
|
|
2223
2099
|
});
|
|
2224
2100
|
expect(ctrl.contentNode.id).to.contain('preserved');
|
|
2225
2101
|
});
|
|
2226
|
-
|
|
2227
2102
|
it('adds [role=dialog] on content', async () => {
|
|
2228
|
-
const invokerNode =
|
|
2229
|
-
|
|
2230
|
-
|
|
2103
|
+
const invokerNode =
|
|
2104
|
+
/** @type {HTMLElement} */
|
|
2105
|
+
await fixture('<div role="button">invoker</div>');
|
|
2231
2106
|
const ctrl = new OverlayController({
|
|
2232
2107
|
...withLocalTestConfig(),
|
|
2233
2108
|
handlesAccessibility: true,
|
|
@@ -2235,14 +2110,13 @@ describe('OverlayController', () => {
|
|
|
2235
2110
|
});
|
|
2236
2111
|
expect(ctrl.contentNode.getAttribute('role')).to.equal('dialog');
|
|
2237
2112
|
});
|
|
2238
|
-
|
|
2239
2113
|
it('preserves [role] on content when present', async () => {
|
|
2240
|
-
const invokerNode =
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
const contentNode =
|
|
2244
|
-
|
|
2245
|
-
|
|
2114
|
+
const invokerNode =
|
|
2115
|
+
/** @type {HTMLElement} */
|
|
2116
|
+
await fixture('<div role="button">invoker</div>');
|
|
2117
|
+
const contentNode =
|
|
2118
|
+
/** @type {HTMLElement} */
|
|
2119
|
+
await fixture('<div role="menu">invoker</div>');
|
|
2246
2120
|
const ctrl = new OverlayController({
|
|
2247
2121
|
...withLocalTestConfig(),
|
|
2248
2122
|
handlesAccessibility: true,
|
|
@@ -2251,7 +2125,6 @@ describe('OverlayController', () => {
|
|
|
2251
2125
|
});
|
|
2252
2126
|
expect(ctrl.contentNode.getAttribute('role')).to.equal('menu');
|
|
2253
2127
|
});
|
|
2254
|
-
|
|
2255
2128
|
it('allows to not provide an invokerNode', async () => {
|
|
2256
2129
|
let properlyInstantiated = false;
|
|
2257
2130
|
try {
|
|
@@ -2262,7 +2135,7 @@ describe('OverlayController', () => {
|
|
|
2262
2135
|
});
|
|
2263
2136
|
properlyInstantiated = true;
|
|
2264
2137
|
} catch (e) {
|
|
2265
|
-
throw new Error(/** @type {Error} */
|
|
2138
|
+
throw new Error(/** @type {Error} */ e.message);
|
|
2266
2139
|
}
|
|
2267
2140
|
expect(properlyInstantiated).to.be.true;
|
|
2268
2141
|
});
|
|
@@ -2270,28 +2143,25 @@ describe('OverlayController', () => {
|
|
|
2270
2143
|
// TODO: check if we covered all functionality. "Inertness" should be handled by the platform with a modal overlay...
|
|
2271
2144
|
it.skip('adds attributes inert and aria-hidden="true" on all siblings of rootNode if an overlay is shown', async () => {});
|
|
2272
2145
|
it.skip('disables pointer events and selection on inert elements', async () => {});
|
|
2273
|
-
|
|
2274
2146
|
describe('Alert dialog', () => {
|
|
2275
2147
|
it('sets role="alertdialog" when isAlertDialog is set', async () => {
|
|
2276
|
-
const invokerNode =
|
|
2277
|
-
|
|
2278
|
-
|
|
2148
|
+
const invokerNode =
|
|
2149
|
+
/** @type {HTMLElement} */
|
|
2150
|
+
await fixture('<div role="button">invoker</div>');
|
|
2279
2151
|
const ctrl = new OverlayController({
|
|
2280
2152
|
...withLocalTestConfig(),
|
|
2281
2153
|
handlesAccessibility: true,
|
|
2282
2154
|
isAlertDialog: true,
|
|
2283
2155
|
invokerNode,
|
|
2284
2156
|
});
|
|
2285
|
-
|
|
2286
2157
|
expect(ctrl.contentNode?.getAttribute('role')).to.equal('alertdialog');
|
|
2287
2158
|
});
|
|
2288
2159
|
});
|
|
2289
|
-
|
|
2290
2160
|
describe('Tooltip', () => {
|
|
2291
2161
|
it('adds [aria-describedby] on invoker', async () => {
|
|
2292
|
-
const invokerNode =
|
|
2293
|
-
|
|
2294
|
-
|
|
2162
|
+
const invokerNode =
|
|
2163
|
+
/** @type {HTMLElement} */
|
|
2164
|
+
await fixture('<div role="button">invoker</div>');
|
|
2295
2165
|
const ctrl = new OverlayController({
|
|
2296
2166
|
...withLocalTestConfig(),
|
|
2297
2167
|
handlesAccessibility: true,
|
|
@@ -2299,14 +2169,12 @@ describe('OverlayController', () => {
|
|
|
2299
2169
|
invokerNode,
|
|
2300
2170
|
});
|
|
2301
2171
|
const { contentId } = getProtectedMembers(ctrl);
|
|
2302
|
-
|
|
2303
2172
|
expect(ctrl.invokerNode?.getAttribute('aria-describedby')).to.equal(contentId);
|
|
2304
2173
|
});
|
|
2305
|
-
|
|
2306
2174
|
it('adds [aria-labelledby] on invoker when invokerRelation is label', async () => {
|
|
2307
|
-
const invokerNode =
|
|
2308
|
-
|
|
2309
|
-
|
|
2175
|
+
const invokerNode =
|
|
2176
|
+
/** @type {HTMLElement} */
|
|
2177
|
+
await fixture('<div role="button">invoker</div>');
|
|
2310
2178
|
const ctrl = new OverlayController({
|
|
2311
2179
|
...withLocalTestConfig(),
|
|
2312
2180
|
handlesAccessibility: true,
|
|
@@ -2315,15 +2183,13 @@ describe('OverlayController', () => {
|
|
|
2315
2183
|
invokerNode,
|
|
2316
2184
|
});
|
|
2317
2185
|
const { contentId } = getProtectedMembers(ctrl);
|
|
2318
|
-
|
|
2319
2186
|
expect(ctrl.invokerNode?.getAttribute('aria-describedby')).to.equal(null);
|
|
2320
2187
|
expect(ctrl.invokerNode?.getAttribute('aria-labelledby')).to.equal(contentId);
|
|
2321
2188
|
});
|
|
2322
|
-
|
|
2323
2189
|
it('adds [role=tooltip] on content', async () => {
|
|
2324
|
-
const invokerNode =
|
|
2325
|
-
|
|
2326
|
-
|
|
2190
|
+
const invokerNode =
|
|
2191
|
+
/** @type {HTMLElement} */
|
|
2192
|
+
await fixture('<div role="button">invoker</div>');
|
|
2327
2193
|
const ctrl = new OverlayController({
|
|
2328
2194
|
...withLocalTestConfig(),
|
|
2329
2195
|
handlesAccessibility: true,
|
|
@@ -2332,11 +2198,10 @@ describe('OverlayController', () => {
|
|
|
2332
2198
|
});
|
|
2333
2199
|
expect(ctrl.contentNode.getAttribute('role')).to.equal('tooltip');
|
|
2334
2200
|
});
|
|
2335
|
-
|
|
2336
2201
|
it('adds tabindex="-1" to the wrappingDialog element', async () => {
|
|
2337
|
-
const invokerNode =
|
|
2338
|
-
|
|
2339
|
-
|
|
2202
|
+
const invokerNode =
|
|
2203
|
+
/** @type {HTMLElement} */
|
|
2204
|
+
await fixture('<div role="button">invoker</div>');
|
|
2340
2205
|
const ctrl = new OverlayController({
|
|
2341
2206
|
...withLocalTestConfig(),
|
|
2342
2207
|
handlesAccessibility: true,
|
|
@@ -2345,12 +2210,11 @@ describe('OverlayController', () => {
|
|
|
2345
2210
|
});
|
|
2346
2211
|
expect(ctrl.__wrappingDialogNode?.getAttribute('tabindex')).to.equal('-1');
|
|
2347
2212
|
});
|
|
2348
|
-
|
|
2349
2213
|
describe('Teardown', () => {
|
|
2350
2214
|
it('restores [role] on dialog content', async () => {
|
|
2351
|
-
const invokerNode =
|
|
2352
|
-
|
|
2353
|
-
|
|
2215
|
+
const invokerNode =
|
|
2216
|
+
/** @type {HTMLElement} */
|
|
2217
|
+
await fixture('<div role="button">invoker</div>');
|
|
2354
2218
|
const ctrl = new OverlayController({
|
|
2355
2219
|
...withLocalTestConfig(),
|
|
2356
2220
|
handlesAccessibility: true,
|
|
@@ -2360,14 +2224,13 @@ describe('OverlayController', () => {
|
|
|
2360
2224
|
ctrl.teardown();
|
|
2361
2225
|
expect(ctrl.contentNode.getAttribute('role')).to.equal(null);
|
|
2362
2226
|
});
|
|
2363
|
-
|
|
2364
2227
|
it('restores [role] on tooltip content', async () => {
|
|
2365
|
-
const invokerNode =
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
const contentNode =
|
|
2369
|
-
|
|
2370
|
-
|
|
2228
|
+
const invokerNode =
|
|
2229
|
+
/** @type {HTMLElement} */
|
|
2230
|
+
await fixture('<div role="button">invoker</div>');
|
|
2231
|
+
const contentNode =
|
|
2232
|
+
/** @type {HTMLElement} */
|
|
2233
|
+
await fixture('<div role="presentation">content</div>');
|
|
2371
2234
|
const ctrl = new OverlayController({
|
|
2372
2235
|
...withLocalTestConfig(),
|
|
2373
2236
|
handlesAccessibility: true,
|
|
@@ -2379,14 +2242,13 @@ describe('OverlayController', () => {
|
|
|
2379
2242
|
ctrl.teardown();
|
|
2380
2243
|
expect(contentNode.getAttribute('role')).to.equal('presentation');
|
|
2381
2244
|
});
|
|
2382
|
-
|
|
2383
2245
|
it('restores [aria-describedby] on content', async () => {
|
|
2384
|
-
const invokerNode =
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
const contentNode =
|
|
2388
|
-
|
|
2389
|
-
|
|
2246
|
+
const invokerNode =
|
|
2247
|
+
/** @type {HTMLElement} */
|
|
2248
|
+
await fixture('<div role="button">invoker</div>');
|
|
2249
|
+
const contentNode =
|
|
2250
|
+
/** @type {HTMLElement} */
|
|
2251
|
+
await fixture('<div role="presentation">content</div>');
|
|
2390
2252
|
const ctrl = new OverlayController({
|
|
2391
2253
|
...withLocalTestConfig(),
|
|
2392
2254
|
handlesAccessibility: true,
|
|
@@ -2398,14 +2260,13 @@ describe('OverlayController', () => {
|
|
|
2398
2260
|
ctrl.teardown();
|
|
2399
2261
|
expect(invokerNode.getAttribute('aria-describedby')).to.equal(null);
|
|
2400
2262
|
});
|
|
2401
|
-
|
|
2402
2263
|
it('restores [aria-labelledby] on content', async () => {
|
|
2403
|
-
const invokerNode =
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
const contentNode =
|
|
2407
|
-
|
|
2408
|
-
|
|
2264
|
+
const invokerNode =
|
|
2265
|
+
/** @type {HTMLElement} */
|
|
2266
|
+
await fixture('<div role="button">invoker</div>');
|
|
2267
|
+
const contentNode =
|
|
2268
|
+
/** @type {HTMLElement} */
|
|
2269
|
+
await fixture('<div role="presentation">content</div>');
|
|
2409
2270
|
const ctrl = new OverlayController({
|
|
2410
2271
|
...withLocalTestConfig(),
|
|
2411
2272
|
handlesAccessibility: true,
|
|
@@ -2421,7 +2282,6 @@ describe('OverlayController', () => {
|
|
|
2421
2282
|
});
|
|
2422
2283
|
});
|
|
2423
2284
|
});
|
|
2424
|
-
|
|
2425
2285
|
describe('Exception handling', () => {
|
|
2426
2286
|
it('throws if no .placementMode gets passed on', async () => {
|
|
2427
2287
|
const contentNode = document.createElement('div');
|
|
@@ -2433,7 +2293,6 @@ describe('OverlayController', () => {
|
|
|
2433
2293
|
});
|
|
2434
2294
|
}).to.throw('[OverlayController] You need to provide a .placementMode ("global"|"local")');
|
|
2435
2295
|
});
|
|
2436
|
-
|
|
2437
2296
|
it('throws if invalid .placementMode gets passed on', async () => {
|
|
2438
2297
|
expect(() => {
|
|
2439
2298
|
new OverlayController({
|
|
@@ -2444,7 +2303,6 @@ describe('OverlayController', () => {
|
|
|
2444
2303
|
'[OverlayController] "invalid" is not a valid .placementMode, use ("global"|"local")',
|
|
2445
2304
|
);
|
|
2446
2305
|
});
|
|
2447
|
-
|
|
2448
2306
|
it('throws if no .contentNode gets passed on', async () => {
|
|
2449
2307
|
expect(() => {
|
|
2450
2308
|
new OverlayController({
|
|
@@ -2452,7 +2310,6 @@ describe('OverlayController', () => {
|
|
|
2452
2310
|
});
|
|
2453
2311
|
}).to.throw('[OverlayController] You need to provide a .contentNode');
|
|
2454
2312
|
});
|
|
2455
|
-
|
|
2456
2313
|
it('throws if handlesAccessibility is false for a tooltip', async () => {
|
|
2457
2314
|
const contentNode = document.createElement('div');
|
|
2458
2315
|
document.body.appendChild(contentNode);
|
|
@@ -2468,7 +2325,6 @@ describe('OverlayController', () => {
|
|
|
2468
2325
|
);
|
|
2469
2326
|
});
|
|
2470
2327
|
});
|
|
2471
|
-
|
|
2472
2328
|
describe('run _keepBodySize only with scroll prevention', () => {
|
|
2473
2329
|
/**
|
|
2474
2330
|
* @type {OverlayController}
|
|
@@ -2477,15 +2333,12 @@ describe('OverlayController', () => {
|
|
|
2477
2333
|
...withLocalTestConfig(),
|
|
2478
2334
|
preventsScroll: false,
|
|
2479
2335
|
});
|
|
2480
|
-
|
|
2481
2336
|
const overlayControllerPreventsScroll = new OverlayController({
|
|
2482
2337
|
...withLocalTestConfig(),
|
|
2483
2338
|
preventsScroll: true,
|
|
2484
2339
|
});
|
|
2485
|
-
|
|
2486
2340
|
it('should not run with scroll prevention', async () => {
|
|
2487
2341
|
await overlayControllerNoPrevent.show();
|
|
2488
|
-
|
|
2489
2342
|
expect(
|
|
2490
2343
|
overlayControllerNoPrevent.manager.__forTesting.bodySizeVars.marginRightInline,
|
|
2491
2344
|
).to.equal(undefined);
|
|
@@ -2493,11 +2346,9 @@ describe('OverlayController', () => {
|
|
|
2493
2346
|
undefined,
|
|
2494
2347
|
);
|
|
2495
2348
|
});
|
|
2496
|
-
|
|
2497
2349
|
it('should run with scroll prevention', async () => {
|
|
2498
2350
|
await overlayControllerPreventsScroll.hide();
|
|
2499
2351
|
await overlayControllerPreventsScroll.show();
|
|
2500
|
-
|
|
2501
2352
|
expect(
|
|
2502
2353
|
overlayControllerPreventsScroll.manager.__forTesting.bodySizeVars.marginRightInline,
|
|
2503
2354
|
).to.not.equal(undefined);
|