@lion/ui 0.25.0 → 0.26.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 +25 -7
- package/accordion-test-suites.js +2 -0
- package/collapsible-test-suites.js +1 -0
- package/combobox-test-suites.js +2 -0
- package/components/accordion/test/lion-accordion.test.js +2 -565
- package/components/accordion/test-suites/lion-accordion.suite.js +596 -0
- package/components/button/test-suites/LionButton.suite.js +13 -11
- package/components/button/test-suites/LionButtonReset.suite.js +11 -3
- package/components/button/test-suites/LionButtonSubmit.suite.js +11 -3
- package/components/calendar/test/lion-calendar.test.js +1 -1570
- package/components/calendar/test-suites/LionCalendar.suite.js +1617 -5
- package/components/checkbox-group/test/lion-checkbox-group-integrations.test.js +5 -2
- package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +13 -4
- package/components/checkbox-group/test/lion-checkbox-integrations.test.js +4 -1
- package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +54 -54
- package/components/collapsible/test/lion-collapsible.test.js +2 -126
- package/components/collapsible/test-suites/LionCollapsible.suite.js +147 -0
- package/components/combobox/test/lion-combobox-integrations.test.js +11 -4
- package/components/combobox/test/lion-combobox.test.js +2 -3622
- package/components/combobox/test-suites/lion-combobox.suite.js +3665 -0
- package/components/core/src/ScopedElementsMixin.js +16 -1
- package/components/core/test-helpers/isElementVisible.js +21 -0
- package/components/core/test-helpers/resolveSuiteTag.js +97 -0
- package/components/core/types/TestSuiteTypes.ts +43 -0
- package/components/dialog/test/lion-dialog.integration.test.js +9 -10
- package/components/dialog/test/lion-dialog.test.js +2 -399
- package/components/dialog/test-suites/lion-dialog.suite.js +412 -0
- package/components/drawer/test/lion-drawer.test.js +2 -84
- package/components/drawer/test-suites/LionDrawer.suite.js +108 -0
- package/components/fieldset/test/lion-fieldset.test.js +7 -2
- package/components/form/test/lion-form.test.js +2 -348
- package/components/form/test-suites/lion-form.suite.js +398 -0
- package/components/form-core/test/FormatMixin.test.js +4 -1
- package/components/form-core/test/choice-group/CustomChoiceGroupMixin.integrations.test.js +13 -0
- package/components/form-core/test-suites/FormRegistrationMixins.suite.js +21 -26
- package/components/form-core/test-suites/FormatMixin.suite.js +45 -43
- package/components/form-core/test-suites/InteractionStateMixin.suite.js +19 -15
- package/components/form-core/test-suites/NativeTextFieldMixin.suite.js +8 -9
- package/components/form-core/test-suites/ValidateMixin.suite.js +14 -10
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +15 -2
- package/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.js +55 -33
- package/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.js +7 -6
- package/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.js +19 -22
- package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +14 -5
- package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +13 -4
- package/components/icon/test/lion-icon.test.js +2 -188
- package/components/icon/test-suites/lion-icon.suite.js +206 -0
- package/components/input/test/input-integrations.test.js +18 -15
- package/components/input/test/lion-input-integrations.test.js +7 -3
- package/components/input/test/lion-input.test.js +2 -198
- package/components/input/test-suites/lion-input.suite.js +214 -0
- package/components/input-amount/src/parsers.js +5 -1
- package/components/input-amount/test/lion-input-amount-integrations.test.js +7 -3
- package/components/input-amount/test/lion-input-amount.test.js +2 -421
- package/components/input-amount/test/parsers.test.js +12 -0
- package/components/input-amount/test-suites/lion-input-amount.suite.js +418 -0
- package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +3 -2
- package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +4 -2
- package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +6 -4
- package/components/input-date/test/lion-input-date-integrations.test.js +7 -3
- package/components/input-date/test/lion-input-date.test.js +2 -177
- package/components/input-date/test-suites/lion-input-date.suite.js +195 -0
- package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +7 -3
- package/components/input-datepicker/test/lion-input-datepicker.test.js +1 -844
- package/components/input-datepicker/test-helpers/DatepickerInputObject.js +26 -0
- package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +899 -14
- package/components/input-email/test/lion-input-email-integrations.test.js +4 -2
- package/components/input-email/test/lion-input-email.test.js +2 -46
- package/components/input-email/test-suites/lion-input-email.suite.js +63 -0
- package/components/input-file/test/lion-input-file.test.js +2 -1274
- package/components/input-file/test-suites/lion-input-file.suite.js +1505 -0
- package/components/input-iban/test/lion-input-iban-integrations.test.js +4 -2
- package/components/input-iban/test/lion-input-iban.test.js +2 -73
- package/components/input-iban/test-suites/lion-input-iban.suite.js +88 -0
- package/components/input-range/test/lion-input-range.test.js +2 -176
- package/components/input-range/test-suites/lion-input-range.suite.js +195 -0
- package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +14 -3
- package/components/input-stepper/test-suites/lion-input-stepper.suite.js +14 -10
- package/components/input-tel/test/LionInputTel.test.js +3 -1
- package/components/input-tel/test-suites/LionInputTel.suite.js +9 -4
- package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +6 -4
- package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +10 -13
- package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +6 -5
- package/components/listbox/test-suites/ListboxMixin.suite.js +19 -19
- package/components/menu/test-suites/InteractiveListMixin.suite.js +6 -9
- package/components/menu/test-suites/LionMenu.suite.js +6 -10
- package/components/menu/test-suites/LionMenuInteractions.suite.js +13 -4
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +6 -9
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +15 -11
- package/components/overlays/test/OverlayController.test.js +6 -1
- package/components/overlays/test-suites/OverlayMixin.suite.js +3 -5
- package/components/pagination/test/lion-pagination.test.js +2 -176
- package/components/pagination/test-suites/LionPagination.suite.js +201 -0
- package/components/progress-indicator/test/lion-progress-indicator.test.js +2 -203
- package/components/progress-indicator/test-suites/lion-progress-indicator.suite.js +214 -0
- package/components/radio-group/test/lion-radio-group.test.js +2 -162
- package/components/radio-group/test/lion-radio.test.js +2 -54
- package/components/radio-group/test-suites/lion-radio-group.suite.js +173 -0
- package/components/radio-group/test-suites/lion-radio.suite.js +70 -0
- package/components/select/test/lion-select.test.js +2 -79
- package/components/select/test-suites/LionSelect.suite.js +94 -0
- package/components/select-rich/test/lion-select-invoker.test.js +2 -86
- package/components/select-rich/test/lion-select-rich-interaction.test.js +2 -430
- package/components/select-rich/test/lion-select-rich.test.js +2 -1193
- package/components/select-rich/test-suites/lion-select-invoker.suite.js +98 -0
- package/components/select-rich/test-suites/lion-select-rich-interaction.suite.js +452 -0
- package/components/select-rich/test-suites/lion-select-rich.suite.js +1236 -0
- package/components/steps/test/lion-step.test.js +2 -97
- package/components/steps/test/lion-steps.test.js +2 -433
- package/components/steps/test-suites/lion-step.suite.js +113 -0
- package/components/steps/test-suites/lion-steps.suite.js +445 -0
- package/components/switch/test/lion-switch.test.js +2 -232
- package/components/switch/test-suites/lion-switch.suite.js +450 -0
- package/components/tabs/test/lion-tabs.test.js +2 -596
- package/components/tabs/test-suites/lion-tabs.suite.js +617 -0
- package/components/textarea/src/LionTextarea.js +5 -2
- package/components/textarea/test/lion-textarea.test.js +2 -159
- package/components/textarea/test-suites/lion-textarea.suite.js +192 -0
- package/components/tooltip/test/lion-tooltip.test.js +2 -393
- package/components/tooltip/test-suites/lion-tooltip.suite.js +409 -0
- package/custom-elements.json +14855 -10161
- package/dialog-test-suites.js +2 -0
- package/dist-types/components/accordion/test/lion-accordion.test.d.ts +1 -2
- package/dist-types/components/accordion/test/lion-accordion.test.d.ts.map +1 -1
- package/dist-types/components/accordion/test-suites/lion-accordion.suite.d.ts +18 -0
- package/dist-types/components/accordion/test-suites/lion-accordion.suite.d.ts.map +1 -0
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts +10 -4
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
- package/dist-types/components/button/test-suites/LionButtonReset.suite.d.ts +10 -4
- package/dist-types/components/button/test-suites/LionButtonReset.suite.d.ts.map +1 -1
- package/dist-types/components/button/test-suites/LionButtonSubmit.suite.d.ts +10 -4
- package/dist-types/components/button/test-suites/LionButtonSubmit.suite.d.ts.map +1 -1
- package/dist-types/components/calendar/test/lion-calendar.test.d.ts +1 -3
- package/dist-types/components/calendar/test/lion-calendar.test.d.ts.map +1 -1
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts +13 -4
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts.map +1 -1
- package/dist-types/components/checkbox-group/test/lion-checkbox-group-integrations.test.d.ts.map +1 -1
- package/dist-types/components/checkbox-group/test/lion-checkbox-integrations.test.d.ts.map +1 -1
- package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts +12 -9
- package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts.map +1 -1
- package/dist-types/components/collapsible/test/lion-collapsible.test.d.ts +1 -3
- package/dist-types/components/collapsible/test/lion-collapsible.test.d.ts.map +1 -1
- package/dist-types/components/collapsible/test-suites/LionCollapsible.suite.d.ts +18 -0
- package/dist-types/components/collapsible/test-suites/LionCollapsible.suite.d.ts.map +1 -0
- package/dist-types/components/combobox/test/lion-combobox.test.d.ts +1 -5
- package/dist-types/components/combobox/test/lion-combobox.test.d.ts.map +1 -1
- package/dist-types/components/combobox/test-suites/lion-combobox.suite.d.ts +17 -0
- package/dist-types/components/combobox/test-suites/lion-combobox.suite.d.ts.map +1 -0
- package/dist-types/components/core/src/ScopedElementsMixin.d.ts.map +1 -1
- package/dist-types/components/core/test-helpers/isElementVisible.d.ts +12 -0
- package/dist-types/components/core/test-helpers/isElementVisible.d.ts.map +1 -0
- package/dist-types/components/core/test-helpers/resolveSuiteTag.d.ts +29 -0
- package/dist-types/components/core/test-helpers/resolveSuiteTag.d.ts.map +1 -0
- package/dist-types/components/core/types/TestSuiteTypes.d.ts +40 -0
- package/dist-types/components/core/types/TestSuiteTypes.d.ts.map +1 -0
- package/dist-types/components/dialog/test/lion-dialog.integration.test.d.ts.map +1 -1
- package/dist-types/components/dialog/test/lion-dialog.test.d.ts +1 -5
- package/dist-types/components/dialog/test/lion-dialog.test.d.ts.map +1 -1
- package/dist-types/components/dialog/test-suites/lion-dialog.suite.d.ts +19 -0
- package/dist-types/components/dialog/test-suites/lion-dialog.suite.d.ts.map +1 -0
- package/dist-types/components/drawer/test/lion-drawer.test.d.ts +1 -3
- package/dist-types/components/drawer/test/lion-drawer.test.d.ts.map +1 -1
- package/dist-types/components/drawer/test-suites/LionDrawer.suite.d.ts +20 -0
- package/dist-types/components/drawer/test-suites/LionDrawer.suite.d.ts.map +1 -0
- package/dist-types/components/fieldset/test/lion-fieldset.test.d.ts.map +1 -1
- package/dist-types/components/form/test/lion-form.test.d.ts +1 -12
- package/dist-types/components/form/test/lion-form.test.d.ts.map +1 -1
- package/dist-types/components/form/test-suites/lion-form.suite.d.ts +39 -0
- package/dist-types/components/form/test-suites/lion-form.suite.d.ts.map +1 -0
- package/dist-types/components/form-core/test-suites/FormRegistrationMixins.suite.d.ts +14 -17
- package/dist-types/components/form-core/test-suites/FormRegistrationMixins.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts +22 -38
- package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/InteractionStateMixin.suite.d.ts +11 -5
- package/dist-types/components/form-core/test-suites/InteractionStateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/NativeTextFieldMixin.suite.d.ts +9 -4
- package/dist-types/components/form-core/test-suites/NativeTextFieldMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts +9 -4
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts +10 -1
- package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.d.ts +17 -6
- package/dist-types/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.d.ts +5 -2
- package/dist-types/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.d.ts +10 -5
- package/dist-types/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.d.ts +10 -5
- package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin.suite.d.ts +10 -5
- package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin.suite.d.ts.map +1 -1
- package/dist-types/components/icon/test/lion-icon.test.d.ts +1 -4
- package/dist-types/components/icon/test/lion-icon.test.d.ts.map +1 -1
- package/dist-types/components/icon/test-suites/lion-icon.suite.d.ts +16 -0
- package/dist-types/components/icon/test-suites/lion-icon.suite.d.ts.map +1 -0
- package/dist-types/components/input/test/lion-input-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input/test/lion-input.test.d.ts +1 -2
- package/dist-types/components/input/test/lion-input.test.d.ts.map +1 -1
- package/dist-types/components/input/test-suites/lion-input.suite.d.ts +17 -0
- package/dist-types/components/input/test-suites/lion-input.suite.d.ts.map +1 -0
- package/dist-types/components/input-amount/src/parsers.d.ts.map +1 -1
- package/dist-types/components/input-amount/test/lion-input-amount-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input-amount/test/lion-input-amount.test.d.ts +1 -2
- package/dist-types/components/input-amount/test/lion-input-amount.test.d.ts.map +1 -1
- package/dist-types/components/input-amount/test-suites/lion-input-amount.suite.d.ts +19 -0
- package/dist-types/components/input-amount/test-suites/lion-input-amount.suite.d.ts.map +1 -0
- package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts +7 -3
- package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts.map +1 -1
- package/dist-types/components/input-date/test/lion-input-date-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input-date/test/lion-input-date.test.d.ts +1 -3
- package/dist-types/components/input-date/test/lion-input-date.test.d.ts.map +1 -1
- package/dist-types/components/input-date/test-suites/lion-input-date.suite.d.ts +15 -0
- package/dist-types/components/input-date/test-suites/lion-input-date.suite.d.ts.map +1 -0
- package/dist-types/components/input-datepicker/test/lion-input-datepicker-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts +1 -2
- package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test-helpers/DatepickerInputObject.d.ts +8 -0
- package/dist-types/components/input-datepicker/test-helpers/DatepickerInputObject.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts +15 -5
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts.map +1 -1
- package/dist-types/components/input-email/test/lion-input-email-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input-email/test/lion-input-email.test.d.ts +1 -3
- package/dist-types/components/input-email/test/lion-input-email.test.d.ts.map +1 -1
- package/dist-types/components/input-email/test-suites/lion-input-email.suite.d.ts +15 -0
- package/dist-types/components/input-email/test-suites/lion-input-email.suite.d.ts.map +1 -0
- package/dist-types/components/input-file/test/lion-input-file.test.d.ts +1 -5
- package/dist-types/components/input-file/test/lion-input-file.test.d.ts.map +1 -1
- package/dist-types/components/input-file/test-suites/lion-input-file.suite.d.ts +19 -0
- package/dist-types/components/input-file/test-suites/lion-input-file.suite.d.ts.map +1 -0
- package/dist-types/components/input-iban/test/lion-input-iban-integrations.test.d.ts.map +1 -1
- package/dist-types/components/input-iban/test/lion-input-iban.test.d.ts +1 -3
- package/dist-types/components/input-iban/test/lion-input-iban.test.d.ts.map +1 -1
- package/dist-types/components/input-iban/test-suites/lion-input-iban.suite.d.ts +15 -0
- package/dist-types/components/input-iban/test-suites/lion-input-iban.suite.d.ts.map +1 -0
- package/dist-types/components/input-range/test/lion-input-range.test.d.ts +1 -3
- package/dist-types/components/input-range/test/lion-input-range.test.d.ts.map +1 -1
- package/dist-types/components/input-range/test-suites/lion-input-range.suite.d.ts +15 -0
- package/dist-types/components/input-range/test-suites/lion-input-range.suite.d.ts.map +1 -0
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts +10 -2
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts.map +1 -1
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts +10 -2
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts.map +1 -1
- package/dist-types/components/input-tel/test-suites/LionInputTel.suite.d.ts +6 -4
- package/dist-types/components/input-tel/test-suites/LionInputTel.suite.d.ts.map +1 -1
- package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.d.ts +7 -3
- package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.d.ts.map +1 -1
- package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.d.ts +7 -3
- package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.d.ts.map +1 -1
- package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts +3 -4
- package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts.map +1 -1
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +6 -5
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -1
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +6 -5
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +1 -1
- package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +10 -4
- package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +1 -1
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +6 -5
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +1 -1
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +7 -6
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +1 -1
- package/dist-types/components/overlays/test-suites/OverlayMixin.suite.d.ts.map +1 -1
- package/dist-types/components/pagination/test/lion-pagination.test.d.ts +1 -3
- package/dist-types/components/pagination/test/lion-pagination.test.d.ts.map +1 -1
- package/dist-types/components/pagination/test-suites/LionPagination.suite.d.ts +18 -0
- package/dist-types/components/pagination/test-suites/LionPagination.suite.d.ts.map +1 -0
- package/dist-types/components/progress-indicator/test/lion-progress-indicator.test.d.ts +1 -3
- package/dist-types/components/progress-indicator/test/lion-progress-indicator.test.d.ts.map +1 -1
- package/dist-types/components/progress-indicator/test-suites/lion-progress-indicator.suite.d.ts +15 -0
- package/dist-types/components/progress-indicator/test-suites/lion-progress-indicator.suite.d.ts.map +1 -0
- package/dist-types/components/radio-group/test/lion-radio-group.test.d.ts +1 -5
- package/dist-types/components/radio-group/test/lion-radio-group.test.d.ts.map +1 -1
- package/dist-types/components/radio-group/test/lion-radio.test.d.ts +1 -2
- package/dist-types/components/radio-group/test/lion-radio.test.d.ts.map +1 -1
- package/dist-types/components/radio-group/test-suites/lion-radio-group.suite.d.ts +19 -0
- package/dist-types/components/radio-group/test-suites/lion-radio-group.suite.d.ts.map +1 -0
- package/dist-types/components/radio-group/test-suites/lion-radio.suite.d.ts +17 -0
- package/dist-types/components/radio-group/test-suites/lion-radio.suite.d.ts.map +1 -0
- package/dist-types/components/select/test/lion-select.test.d.ts +1 -2
- package/dist-types/components/select/test/lion-select.test.d.ts.map +1 -1
- package/dist-types/components/select/test-suites/LionSelect.suite.d.ts +16 -0
- package/dist-types/components/select/test-suites/LionSelect.suite.d.ts.map +1 -0
- package/dist-types/components/select-rich/test/lion-select-invoker.test.d.ts +1 -2
- package/dist-types/components/select-rich/test/lion-select-invoker.test.d.ts.map +1 -1
- package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts +1 -5
- package/dist-types/components/select-rich/test/lion-select-rich-interaction.test.d.ts.map +1 -1
- package/dist-types/components/select-rich/test/lion-select-rich.test.d.ts +1 -8
- package/dist-types/components/select-rich/test/lion-select-rich.test.d.ts.map +1 -1
- package/dist-types/components/select-rich/test-suites/lion-select-invoker.suite.d.ts +19 -0
- package/dist-types/components/select-rich/test-suites/lion-select-invoker.suite.d.ts.map +1 -0
- package/dist-types/components/select-rich/test-suites/lion-select-rich-interaction.suite.d.ts +19 -0
- package/dist-types/components/select-rich/test-suites/lion-select-rich-interaction.suite.d.ts.map +1 -0
- package/dist-types/components/select-rich/test-suites/lion-select-rich.suite.d.ts +21 -0
- package/dist-types/components/select-rich/test-suites/lion-select-rich.suite.d.ts.map +1 -0
- package/dist-types/components/steps/test/lion-step.test.d.ts +1 -2
- package/dist-types/components/steps/test/lion-step.test.d.ts.map +1 -1
- package/dist-types/components/steps/test/lion-steps.test.d.ts +1 -8
- package/dist-types/components/steps/test/lion-steps.test.d.ts.map +1 -1
- package/dist-types/components/steps/test-suites/lion-step.suite.d.ts +17 -0
- package/dist-types/components/steps/test-suites/lion-step.suite.d.ts.map +1 -0
- package/dist-types/components/steps/test-suites/lion-steps.suite.d.ts +22 -0
- package/dist-types/components/steps/test-suites/lion-steps.suite.d.ts.map +1 -0
- package/dist-types/components/switch/test/lion-switch.test.d.ts +1 -4
- package/dist-types/components/switch/test/lion-switch.test.d.ts.map +1 -1
- package/dist-types/components/switch/test-suites/lion-switch.suite.d.ts +17 -0
- package/dist-types/components/switch/test-suites/lion-switch.suite.d.ts.map +1 -0
- package/dist-types/components/tabs/test/lion-tabs.test.d.ts +1 -5
- package/dist-types/components/tabs/test/lion-tabs.test.d.ts.map +1 -1
- package/dist-types/components/tabs/test-suites/lion-tabs.suite.d.ts +17 -0
- package/dist-types/components/tabs/test-suites/lion-tabs.suite.d.ts.map +1 -0
- package/dist-types/components/textarea/src/LionTextarea.d.ts.map +1 -1
- package/dist-types/components/textarea/test/lion-textarea.test.d.ts +1 -3
- package/dist-types/components/textarea/test/lion-textarea.test.d.ts.map +1 -1
- package/dist-types/components/textarea/test-suites/lion-textarea.suite.d.ts +15 -0
- package/dist-types/components/textarea/test-suites/lion-textarea.suite.d.ts.map +1 -0
- package/dist-types/components/tooltip/test/lion-tooltip.test.d.ts +1 -3
- package/dist-types/components/tooltip/test/lion-tooltip.test.d.ts.map +1 -1
- package/dist-types/components/tooltip/test-suites/lion-tooltip.suite.d.ts +19 -0
- package/dist-types/components/tooltip/test-suites/lion-tooltip.suite.d.ts.map +1 -0
- package/dist-types/exports/accordion-test-suites.d.ts +2 -0
- package/dist-types/exports/accordion-test-suites.d.ts.map +1 -0
- package/dist-types/exports/collapsible-test-suites.d.ts +2 -0
- package/dist-types/exports/collapsible-test-suites.d.ts.map +1 -0
- package/dist-types/exports/combobox-test-suites.d.ts +2 -0
- package/dist-types/exports/combobox-test-suites.d.ts.map +1 -0
- package/dist-types/exports/dialog-test-suites.d.ts +2 -0
- package/dist-types/exports/dialog-test-suites.d.ts.map +1 -0
- package/dist-types/exports/drawer-test-suites.d.ts +2 -0
- package/dist-types/exports/drawer-test-suites.d.ts.map +1 -0
- package/dist-types/exports/form-test-suites.d.ts +2 -0
- package/dist-types/exports/form-test-suites.d.ts.map +1 -0
- package/dist-types/exports/icon-test-suites.d.ts +2 -0
- package/dist-types/exports/icon-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-amount-test-suites.d.ts +2 -0
- package/dist-types/exports/input-amount-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-date-test-suites.d.ts +2 -0
- package/dist-types/exports/input-date-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-email-test-suites.d.ts +2 -0
- package/dist-types/exports/input-email-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-file-test-suites.d.ts +2 -0
- package/dist-types/exports/input-file-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-iban-test-suites.d.ts +2 -0
- package/dist-types/exports/input-iban-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-range-test-suites.d.ts +2 -0
- package/dist-types/exports/input-range-test-suites.d.ts.map +1 -0
- package/dist-types/exports/input-stepper-suites.d.ts +7 -2
- package/dist-types/exports/input-stepper-suites.d.ts.map +1 -1
- package/dist-types/exports/input-test-suites.d.ts +2 -0
- package/dist-types/exports/input-test-suites.d.ts.map +1 -0
- package/dist-types/exports/menu-test-suites.d.ts.map +1 -1
- package/dist-types/exports/pagination-test-suites.d.ts +2 -0
- package/dist-types/exports/pagination-test-suites.d.ts.map +1 -0
- package/dist-types/exports/progress-indicator-test-suites.d.ts +2 -0
- package/dist-types/exports/progress-indicator-test-suites.d.ts.map +1 -0
- package/dist-types/exports/radio-group-test-suites.d.ts +3 -0
- package/dist-types/exports/radio-group-test-suites.d.ts.map +1 -0
- package/dist-types/exports/select-rich-test-suites.d.ts +4 -0
- package/dist-types/exports/select-rich-test-suites.d.ts.map +1 -0
- package/dist-types/exports/select-test-suites.d.ts +2 -0
- package/dist-types/exports/select-test-suites.d.ts.map +1 -0
- package/dist-types/exports/steps-test-suites.d.ts +3 -0
- package/dist-types/exports/steps-test-suites.d.ts.map +1 -0
- package/dist-types/exports/switch-test-suites.d.ts +2 -0
- package/dist-types/exports/switch-test-suites.d.ts.map +1 -0
- package/dist-types/exports/tabs-test-suites.d.ts +2 -0
- package/dist-types/exports/tabs-test-suites.d.ts.map +1 -0
- package/dist-types/exports/textarea-test-suites.d.ts +2 -0
- package/dist-types/exports/textarea-test-suites.d.ts.map +1 -0
- package/dist-types/exports/tooltip-test-suites.d.ts +2 -0
- package/dist-types/exports/tooltip-test-suites.d.ts.map +1 -0
- package/dist-types/exports/types/test-suites.d.ts +4 -0
- package/dist-types/exports/types/test-suites.d.ts.map +1 -0
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/drawer-test-suites.js +1 -0
- package/exports/accordion-test-suites.js +2 -0
- package/exports/collapsible-test-suites.js +1 -0
- package/exports/combobox-test-suites.js +2 -0
- package/exports/dialog-test-suites.js +2 -0
- package/exports/drawer-test-suites.js +1 -0
- package/exports/form-test-suites.js +2 -0
- package/exports/icon-test-suites.js +2 -0
- package/exports/input-amount-test-suites.js +2 -0
- package/exports/input-date-test-suites.js +2 -0
- package/exports/input-email-test-suites.js +2 -0
- package/exports/input-file-test-suites.js +2 -0
- package/exports/input-iban-test-suites.js +2 -0
- package/exports/input-range-test-suites.js +2 -0
- package/exports/input-stepper-suites.js +18 -4
- package/exports/input-test-suites.js +2 -0
- package/exports/menu-test-suites.js +3 -0
- package/exports/pagination-test-suites.js +1 -0
- package/exports/progress-indicator-test-suites.js +2 -0
- package/exports/radio-group-test-suites.js +3 -0
- package/exports/select-rich-test-suites.js +4 -0
- package/exports/select-test-suites.js +1 -0
- package/exports/steps-test-suites.js +3 -0
- package/exports/switch-test-suites.js +2 -0
- package/exports/tabs-test-suites.js +2 -0
- package/exports/textarea-test-suites.js +2 -0
- package/exports/tooltip-test-suites.js +2 -0
- package/exports/types/test-suites.ts +3 -0
- package/form-test-suites.js +2 -0
- package/generated/awesome-phonenumber/provenance.json +1 -1
- package/icon-test-suites.js +2 -0
- package/input-amount-test-suites.js +2 -0
- package/input-date-test-suites.js +2 -0
- package/input-email-test-suites.js +2 -0
- package/input-file-test-suites.js +2 -0
- package/input-iban-test-suites.js +2 -0
- package/input-range-test-suites.js +2 -0
- package/input-stepper-suites.js +18 -4
- package/input-test-suites.js +2 -0
- package/menu-test-suites.js +3 -0
- package/package.json +4 -1
- package/pagination-test-suites.js +1 -0
- package/progress-indicator-test-suites.js +2 -0
- package/radio-group-test-suites.js +3 -0
- package/select-rich-test-suites.js +4 -0
- package/select-test-suites.js +1 -0
- package/steps-test-suites.js +3 -0
- package/switch-test-suites.js +2 -0
- package/tabs-test-suites.js +2 -0
- package/textarea-test-suites.js +2 -0
- package/tooltip-test-suites.js +2 -0
- package/vscode.html-custom-data.json +55 -0
- package/web-types.json +219 -1
- package/components/button/test/demos.screenshots-test.js +0 -100
- package/components/calendar/test/demos.screenshots-test.js +0 -118
- package/components/input-file/test/lion-selected-file-list.test.js +0 -199
- package/components/select-rich/test/demos.screenshots-test.js +0 -168
- package/components/switch/test/lion-switch-button.test.js +0 -204
- package/dist-types/components/button/test/demos.screenshots-test.d.ts +0 -2
- package/dist-types/components/button/test/demos.screenshots-test.d.ts.map +0 -1
- package/dist-types/components/calendar/test/demos.screenshots-test.d.ts +0 -2
- package/dist-types/components/calendar/test/demos.screenshots-test.d.ts.map +0 -1
- package/dist-types/components/input-file/test/lion-selected-file-list.test.d.ts +0 -5
- package/dist-types/components/input-file/test/lion-selected-file-list.test.d.ts.map +0 -1
- package/dist-types/components/select-rich/test/demos.screenshots-test.d.ts +0 -2
- package/dist-types/components/select-rich/test/demos.screenshots-test.d.ts.map +0 -1
- package/dist-types/components/switch/test/lion-switch-button.test.d.ts +0 -4
- package/dist-types/components/switch/test/lion-switch-button.test.d.ts.map +0 -1
- package/docs/components/accordion/api-table.md +0 -53
- package/docs/components/accordion/index.md +0 -13
- package/docs/components/accordion/overview.md +0 -141
- package/docs/components/accordion/reference.md +0 -59
- package/docs/components/accordion/use-cases.md +0 -303
- package/docs/components/button/api-table.md +0 -84
- package/docs/components/button/assets/bootstrap-button.js +0 -245
- package/docs/components/button/examples.md +0 -42
- package/docs/components/button/extensions.md +0 -42
- package/docs/components/button/index.md +0 -13
- package/docs/components/button/overview.md +0 -42
- package/docs/components/button/src/icon.svg.js +0 -5
- package/docs/components/button/use-cases.md +0 -121
- package/docs/components/calendar/api-table.md +0 -56
- package/docs/components/calendar/index.md +0 -13
- package/docs/components/calendar/overview.md +0 -61
- package/docs/components/calendar/use-cases.md +0 -243
- package/docs/components/checkbox-group/api-table.md +0 -117
- package/docs/components/checkbox-group/index.md +0 -13
- package/docs/components/checkbox-group/overview.md +0 -51
- package/docs/components/checkbox-group/use-cases.md +0 -192
- package/docs/components/collapsible/api-table.md +0 -55
- package/docs/components/collapsible/assets/CustomCollapsible.js +0 -117
- package/docs/components/collapsible/assets/applyDemoCollapsibleStyles.js +0 -41
- package/docs/components/collapsible/examples.md +0 -95
- package/docs/components/collapsible/index.md +0 -13
- package/docs/components/collapsible/overview.md +0 -51
- package/docs/components/collapsible/use-cases.md +0 -91
- package/docs/components/combobox/api-table.md +0 -122
- package/docs/components/combobox/extensions.md +0 -174
- package/docs/components/combobox/index.md +0 -13
- package/docs/components/combobox/overview.md +0 -74
- package/docs/components/combobox/src/LinkMixin.js +0 -60
- package/docs/components/combobox/src/demo-selection-display.js +0 -164
- package/docs/components/combobox/src/gh-combobox/gh-button.js +0 -71
- package/docs/components/combobox/src/gh-combobox/gh-combobox.js +0 -515
- package/docs/components/combobox/src/google-combobox/assets/google-clear-icon.js +0 -9
- package/docs/components/combobox/src/google-combobox/assets/google-search-icon.js +0 -9
- package/docs/components/combobox/src/google-combobox/assets/google-voice-search-icon.js +0 -19
- package/docs/components/combobox/src/google-combobox/google-combobox.js +0 -461
- package/docs/components/combobox/src/lazyRender.js +0 -29
- package/docs/components/combobox/src/levenshtein.js +0 -95
- package/docs/components/combobox/src/md-combobox/MdFieldMixin.js +0 -345
- package/docs/components/combobox/src/md-combobox/md-combobox.js +0 -91
- package/docs/components/combobox/src/md-combobox/md-input.js +0 -5
- package/docs/components/combobox/src/md-combobox/style/load-roboto.js +0 -6
- package/docs/components/combobox/src/md-combobox/style/md-ripple.js +0 -82
- package/docs/components/combobox/src/wa-combobox/wa-combobox.js +0 -375
- package/docs/components/combobox/use-cases.md +0 -561
- package/docs/components/dialog/api-table.md +0 -61
- package/docs/components/dialog/index.md +0 -13
- package/docs/components/dialog/overview.md +0 -71
- package/docs/components/dialog/src/demoStyle.js +0 -57
- package/docs/components/dialog/src/external-dialog.js +0 -32
- package/docs/components/dialog/src/slots-dialog-content.js +0 -32
- package/docs/components/dialog/src/styled-dialog-content.js +0 -38
- package/docs/components/dialog/use-cases.md +0 -199
- package/docs/components/drawer/api-table.md +0 -64
- package/docs/components/drawer/index.md +0 -13
- package/docs/components/drawer/overview.md +0 -80
- package/docs/components/drawer/src/demoStyle.js +0 -71
- package/docs/components/drawer/use-cases.md +0 -206
- package/docs/components/fieldset/api-table.md +0 -24
- package/docs/components/fieldset/index.md +0 -13
- package/docs/components/fieldset/overview.md +0 -61
- package/docs/components/fieldset/use-cases.md +0 -203
- package/docs/components/form/api-table.md +0 -12
- package/docs/components/form/index.md +0 -13
- package/docs/components/form/overview.md +0 -66
- package/docs/components/form/use-cases.md +0 -230
- package/docs/components/icon/api-table.md +0 -41
- package/docs/components/icon/assets/bugs/bug01.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug02.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug05.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug06.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug08.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug12.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug19.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug23.svg.js +0 -2
- package/docs/components/icon/assets/bugs/bug24.svg.js +0 -2
- package/docs/components/icon/assets/iconset-bugs.js +0 -11
- package/docs/components/icon/assets/iconset-misc.js +0 -3
- package/docs/components/icon/assets/iconset-space.js +0 -31
- package/docs/components/icon/assets/misc/arrowLeft.svg.js +0 -6
- package/docs/components/icon/assets/space/aliens-spaceship.svg.js +0 -2
- package/docs/components/icon/assets/space/meteor.svg.js +0 -2
- package/docs/components/icon/assets/space/moon-flag.svg.js +0 -2
- package/docs/components/icon/assets/space/moon.svg.js +0 -2
- package/docs/components/icon/assets/space/night.svg.js +0 -2
- package/docs/components/icon/assets/space/orbit.svg.js +0 -2
- package/docs/components/icon/assets/space/planet.svg.js +0 -2
- package/docs/components/icon/assets/space/robot.svg.js +0 -2
- package/docs/components/icon/assets/space/rocket.svg.js +0 -2
- package/docs/components/icon/assets/space/satellite.svg.js +0 -2
- package/docs/components/icon/assets/space/signal.svg.js +0 -2
- package/docs/components/icon/assets/space/space-helmet.svg.js +0 -2
- package/docs/components/icon/assets/space/sun.svg.js +0 -2
- package/docs/components/icon/assets/space/telescope.svg.js +0 -2
- package/docs/components/icon/index.md +0 -13
- package/docs/components/icon/overview.md +0 -52
- package/docs/components/icon/use-cases.md +0 -92
- package/docs/components/index.md +0 -17
- package/docs/components/input/api-table.md +0 -52
- package/docs/components/input/index.md +0 -13
- package/docs/components/input/overview.md +0 -48
- package/docs/components/input/use-cases.md +0 -90
- package/docs/components/input-amount/api-table.md +0 -66
- package/docs/components/input-amount/index.md +0 -13
- package/docs/components/input-amount/overview.md +0 -61
- package/docs/components/input-amount/use-cases.md +0 -147
- package/docs/components/input-amount-dropdown/api-table.md +0 -87
- package/docs/components/input-amount-dropdown/index.md +0 -13
- package/docs/components/input-amount-dropdown/use-cases.md +0 -103
- package/docs/components/input-date/api-table.md +0 -58
- package/docs/components/input-date/index.md +0 -13
- package/docs/components/input-date/overview.md +0 -51
- package/docs/components/input-date/use-cases.md +0 -96
- package/docs/components/input-datepicker/api-table.md +0 -99
- package/docs/components/input-datepicker/index.md +0 -13
- package/docs/components/input-datepicker/overview.md +0 -54
- package/docs/components/input-datepicker/use-cases.md +0 -117
- package/docs/components/input-email/api-table.md +0 -53
- package/docs/components/input-email/index.md +0 -13
- package/docs/components/input-email/overview.md +0 -44
- package/docs/components/input-email/use-cases.md +0 -60
- package/docs/components/input-file/api-table.md +0 -157
- package/docs/components/input-file/index.md +0 -13
- package/docs/components/input-file/overview.md +0 -44
- package/docs/components/input-file/use-cases.md +0 -454
- package/docs/components/input-iban/api-table.md +0 -54
- package/docs/components/input-iban/index.md +0 -13
- package/docs/components/input-iban/overview.md +0 -49
- package/docs/components/input-iban/use-cases.md +0 -114
- package/docs/components/input-range/api-table.md +0 -71
- package/docs/components/input-range/index.md +0 -13
- package/docs/components/input-range/overview.md +0 -44
- package/docs/components/input-range/use-cases.md +0 -126
- package/docs/components/input-stepper/api-table.md +0 -74
- package/docs/components/input-stepper/index.md +0 -13
- package/docs/components/input-stepper/overview.md +0 -48
- package/docs/components/input-stepper/use-cases.md +0 -155
- package/docs/components/input-tel/api-table.md +0 -77
- package/docs/components/input-tel/index.md +0 -13
- package/docs/components/input-tel/overview.md +0 -74
- package/docs/components/input-tel/src/h-region-code-table.js +0 -109
- package/docs/components/input-tel/use-cases.md +0 -319
- package/docs/components/input-tel-dropdown/api-table.md +0 -85
- package/docs/components/input-tel-dropdown/extensions.md +0 -44
- package/docs/components/input-tel-dropdown/index.md +0 -13
- package/docs/components/input-tel-dropdown/overview.md +0 -50
- package/docs/components/input-tel-dropdown/src/intl-input-tel-dropdown.js +0 -138
- package/docs/components/input-tel-dropdown/use-cases.md +0 -171
- package/docs/components/listbox/api-table.md +0 -65
- package/docs/components/listbox/index.md +0 -13
- package/docs/components/listbox/overview.md +0 -54
- package/docs/components/listbox/src/listboxData.js +0 -131
- package/docs/components/listbox/use-cases.md +0 -154
- package/docs/components/menu/api-table.md +0 -44
- package/docs/components/menu/applyMenuDemoStyles.js +0 -173
- package/docs/components/menu/extensions.md +0 -262
- package/docs/components/menu/index.md +0 -13
- package/docs/components/menu/migration.md +0 -129
- package/docs/components/menu/overview.md +0 -448
- package/docs/components/menu/src/DemoNavigationBar.js +0 -441
- package/docs/components/menu/src/DemoSpinButton.js +0 -215
- package/docs/components/menu/src/DemoToolbar.js +0 -101
- package/docs/components/menu/src/DemoTree.js +0 -55
- package/docs/components/menu/src/navigation-bar-types.js +0 -41
- package/docs/components/menu/use-cases.md +0 -74
- package/docs/components/pagination/api-table.md +0 -45
- package/docs/components/pagination/index.md +0 -13
- package/docs/components/pagination/overview.md +0 -41
- package/docs/components/pagination/use-cases.md +0 -113
- package/docs/components/progress-indicator/api-table.md +0 -48
- package/docs/components/progress-indicator/assets/my-determinate-progress-bar.js +0 -30
- package/docs/components/progress-indicator/assets/my-indeterminate-progress-spinner.js +0 -55
- package/docs/components/progress-indicator/examples.md +0 -137
- package/docs/components/progress-indicator/index.md +0 -13
- package/docs/components/progress-indicator/overview.md +0 -48
- package/docs/components/radio-group/api-table.md +0 -63
- package/docs/components/radio-group/index.md +0 -13
- package/docs/components/radio-group/overview.md +0 -58
- package/docs/components/radio-group/use-cases.md +0 -146
- package/docs/components/select/api-table.md +0 -51
- package/docs/components/select/index.md +0 -13
- package/docs/components/select/overview.md +0 -56
- package/docs/components/select/use-cases.md +0 -128
- package/docs/components/select-rich/api-table.md +0 -123
- package/docs/components/select-rich/examples.md +0 -43
- package/docs/components/select-rich/index.md +0 -13
- package/docs/components/select-rich/overview.md +0 -55
- package/docs/components/select-rich/src/flagStyles.js +0 -1250
- package/docs/components/select-rich/src/intl-select-rich.js +0 -194
- package/docs/components/select-rich/src/regionMetaList.js +0 -1717
- package/docs/components/select-rich/use-cases.md +0 -387
- package/docs/components/steps/api-table.md +0 -92
- package/docs/components/steps/index.md +0 -13
- package/docs/components/steps/overview.md +0 -77
- package/docs/components/steps/use-cases.md +0 -181
- package/docs/components/switch/api-table.md +0 -82
- package/docs/components/switch/index.md +0 -13
- package/docs/components/switch/overview.md +0 -87
- package/docs/components/switch/reference.md +0 -51
- package/docs/components/switch/use-cases.md +0 -88
- package/docs/components/tabs/api-table.md +0 -51
- package/docs/components/tabs/examples.md +0 -35
- package/docs/components/tabs/index.md +0 -13
- package/docs/components/tabs/overview.md +0 -60
- package/docs/components/tabs/src/lea-tab-panel.js +0 -26
- package/docs/components/tabs/src/lea-tab.js +0 -50
- package/docs/components/tabs/src/lea-tabs.js +0 -28
- package/docs/components/tabs/use-cases.md +0 -231
- package/docs/components/textarea/api-table.md +0 -57
- package/docs/components/textarea/index.md +0 -13
- package/docs/components/textarea/overview.md +0 -47
- package/docs/components/textarea/use-cases.md +0 -107
- package/docs/components/tooltip/api-table.md +0 -62
- package/docs/components/tooltip/examples.md +0 -51
- package/docs/components/tooltip/index.md +0 -13
- package/docs/components/tooltip/overview.md +0 -56
- package/docs/components/tooltip/use-cases.md +0 -275
- package/docs/fundamentals/index.md +0 -19
- package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +0 -13
- package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +0 -246
- package/docs/fundamentals/node-tools/index.md +0 -11
- package/docs/fundamentals/node-tools/providence-analytics/index.md +0 -13
- package/docs/fundamentals/node-tools/providence-analytics/overview.md +0 -108
- package/docs/fundamentals/node-tools/publish-docs/index.md +0 -13
- package/docs/fundamentals/node-tools/publish-docs/overview.md +0 -149
- package/docs/fundamentals/node-tools/remark-extend/index.md +0 -13
- package/docs/fundamentals/node-tools/remark-extend/overview.md +0 -287
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +0 -13
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +0 -298
- package/docs/fundamentals/rationales/TypeScript.md +0 -123
- package/docs/fundamentals/rationales/accessibility.md +0 -40
- package/docs/fundamentals/rationales/index.md +0 -11
- package/docs/fundamentals/rationales/side-effects.md +0 -215
- package/docs/fundamentals/rationales/versioning.md +0 -47
- package/docs/fundamentals/systems/core/SlotMixin.md +0 -168
- package/docs/fundamentals/systems/core/api-table.md +0 -43
- package/docs/fundamentals/systems/core/index.md +0 -15
- package/docs/fundamentals/systems/core/overview.md +0 -98
- package/docs/fundamentals/systems/form/api-table.md +0 -40
- package/docs/fundamentals/systems/form/assets/h-output.js +0 -156
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +0 -258
- package/docs/fundamentals/systems/form/index.md +0 -15
- package/docs/fundamentals/systems/form/interaction-states.md +0 -195
- package/docs/fundamentals/systems/form/model-value.md +0 -57
- package/docs/fundamentals/systems/form/overview.md +0 -95
- package/docs/fundamentals/systems/form/styling.md +0 -92
- package/docs/fundamentals/systems/form/use-cases.md +0 -187
- package/docs/fundamentals/systems/form/validate.md +0 -985
- package/docs/fundamentals/systems/icon/index.md +0 -15
- package/docs/fundamentals/systems/icon/overview.md +0 -137
- package/docs/fundamentals/systems/index.md +0 -11
- package/docs/fundamentals/systems/localize/api-table.md +0 -72
- package/docs/fundamentals/systems/localize/assets/all-locales.js +0 -437
- package/docs/fundamentals/systems/localize/assets/en-AU.js +0 -6
- package/docs/fundamentals/systems/localize/assets/en-GB.js +0 -6
- package/docs/fundamentals/systems/localize/assets/en-US.js +0 -6
- package/docs/fundamentals/systems/localize/assets/en.js +0 -4
- package/docs/fundamentals/systems/localize/assets/nl-BE.js +0 -6
- package/docs/fundamentals/systems/localize/assets/nl-NL.js +0 -6
- package/docs/fundamentals/systems/localize/assets/nl.js +0 -4
- package/docs/fundamentals/systems/localize/dates.md +0 -208
- package/docs/fundamentals/systems/localize/index.md +0 -15
- package/docs/fundamentals/systems/localize/numbers.md +0 -230
- package/docs/fundamentals/systems/localize/overview.md +0 -61
- package/docs/fundamentals/systems/localize/rationale.md +0 -75
- package/docs/fundamentals/systems/localize/text.md +0 -139
- package/docs/fundamentals/systems/localize/use-cases.md +0 -334
- package/docs/fundamentals/systems/overlays/_configuration-positioning.md +0 -118
- package/docs/fundamentals/systems/overlays/_edge-cases.md +0 -149
- package/docs/fundamentals/systems/overlays/api-table.md +0 -174
- package/docs/fundamentals/systems/overlays/assets/applyDemoOverlayStyles.js +0 -23
- package/docs/fundamentals/systems/overlays/assets/demo-el-using-overlaymixin.js +0 -104
- package/docs/fundamentals/systems/overlays/assets/demo-overlay-backdrop.js +0 -47
- package/docs/fundamentals/systems/overlays/assets/demo-overlay-positioning.mjs +0 -537
- package/docs/fundamentals/systems/overlays/assets/umbrella-form.js +0 -140
- package/docs/fundamentals/systems/overlays/configuration.md +0 -516
- package/docs/fundamentals/systems/overlays/index.md +0 -15
- package/docs/fundamentals/systems/overlays/overview.md +0 -126
- package/docs/fundamentals/systems/overlays/rationale.md +0 -242
- package/docs/fundamentals/systems/overlays/use-cases.md +0 -717
- package/docs/fundamentals/tools/ajax/index.md +0 -15
- package/docs/fundamentals/tools/ajax/overview.md +0 -269
- package/docs/fundamentals/tools/ajax/use-cases.md +0 -469
- package/docs/fundamentals/tools/helpers/action-logger.md +0 -175
- package/docs/fundamentals/tools/helpers/index.md +0 -15
- package/docs/fundamentals/tools/helpers/overview.md +0 -43
- package/docs/fundamentals/tools/index.md +0 -11
- package/docs/fundamentals/tools/singleton-manager/example-complex/demo-app.js +0 -95
- package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +0 -34
- package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/overlays/index.js +0 -30
- package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/overlays/instance.js +0 -4
- package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-a/page-a.js +0 -35
- package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-b/node_modules/overlays/index.js +0 -30
- package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-b/node_modules/overlays/instance.js +0 -4
- package/docs/fundamentals/tools/singleton-manager/example-complex/node_modules/page-b/page-b.js +0 -49
- package/docs/fundamentals/tools/singleton-manager/example-complex/overlayCompatibility.js +0 -69
- package/docs/fundamentals/tools/singleton-manager/example-fail/demo-app.js +0 -93
- package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +0 -32
- package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/overlays/index.js +0 -30
- package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/overlays/instance.js +0 -3
- package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-c/page-c.js +0 -34
- package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-d/node_modules/overlays/index.js +0 -30
- package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-d/node_modules/overlays/instance.js +0 -3
- package/docs/fundamentals/tools/singleton-manager/example-fail/node_modules/page-d/page-d.js +0 -34
- package/docs/fundamentals/tools/singleton-manager/example-success/demo-app.js +0 -95
- package/docs/fundamentals/tools/singleton-manager/example-success/index.md +0 -31
- package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/overlays/index.js +0 -30
- package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/overlays/instance.js +0 -4
- package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-e/page-e.js +0 -33
- package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-f/node_modules/overlays/index.js +0 -30
- package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-f/node_modules/overlays/instance.js +0 -4
- package/docs/fundamentals/tools/singleton-manager/example-success/node_modules/page-f/page-f.js +0 -34
- package/docs/fundamentals/tools/singleton-manager/example-success/overlayCompatibility.js +0 -23
- package/docs/fundamentals/tools/singleton-manager/index.md +0 -15
- package/docs/fundamentals/tools/singleton-manager/overview.md +0 -317
- package/docs/guides/how-to/create-a-custom-field.md +0 -212
- package/docs/guides/how-to/create-a-form.md +0 -101
- package/docs/guides/how-to/extend-a-native-input.md +0 -78
- package/docs/guides/how-to/get-started.md +0 -116
- package/docs/guides/how-to/index.md +0 -25
- package/docs/guides/index.md +0 -44
- package/docs/guides/principles/definitions-and-terms.md +0 -53
- package/docs/guides/principles/index.md +0 -36
- package/docs/guides/principles/scoped-elements.md +0 -119
- package/docs/guides/principles/styling.md +0 -43
- package/docs/guides/principles/subclasser-apis.md +0 -40
|
@@ -1,13 +1,67 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { html } from 'lit/static-html.js';
|
|
2
|
+
// The suite templates need `html` from static-html for `${tag}`; these two overrides are compared
|
|
3
|
+
// against Lion's own `() => TemplateResult<1>` signature, so they use plain lit-html's `html`.
|
|
4
|
+
import {
|
|
5
|
+
aTimeout,
|
|
6
|
+
defineCE,
|
|
7
|
+
expect,
|
|
8
|
+
fixture,
|
|
9
|
+
fixture as _fixture,
|
|
10
|
+
nextFrame,
|
|
11
|
+
unsafeStatic,
|
|
12
|
+
waitUntil,
|
|
13
|
+
} from '@open-wc/testing';
|
|
14
|
+
import { sendKeys, setViewport } from '@web/test-runner-commands';
|
|
15
|
+
import { LionCalendar, isSameDate } from '@lion/ui/calendar.js';
|
|
16
|
+
import { html as htmlNonStatic, LitElement } from 'lit';
|
|
17
|
+
import { IsDateDisabled, MaxDate, MinDate, MinMaxDate } from '@lion/ui/form-core.js';
|
|
18
|
+
import { mimicClick } from '@lion/ui/overlays-test-helpers.js';
|
|
19
|
+
import { parseDate } from '@lion/ui/localize.js';
|
|
20
|
+
import { AlwaysInvalid } from '@lion/ui/form-core-test-helpers.js';
|
|
21
|
+
import { DatepickerInputObject as DefaultInputObject } from '@lion/ui/input-datepicker-test-helpers.js';
|
|
22
|
+
import { LionInputDatepicker } from '@lion/ui/input-datepicker.js';
|
|
23
|
+
import '@lion/ui/define/lion-input-datepicker.js';
|
|
24
|
+
import sinon from 'sinon';
|
|
25
|
+
import { resolveSuiteTag } from '../../core/test-helpers/resolveSuiteTag.js';
|
|
5
26
|
|
|
27
|
+
/**
|
|
28
|
+
* @param {{
|
|
29
|
+
* classes?: Record<string, CustomElementConstructor>,
|
|
30
|
+
* datepickerTagName?: string,
|
|
31
|
+
* calendarTagName?: string,
|
|
32
|
+
* InputObject?: typeof DefaultInputObject,
|
|
33
|
+
* }} [customConfig]
|
|
34
|
+
*/
|
|
6
35
|
export function runDatepickerSuite({
|
|
36
|
+
classes = {},
|
|
7
37
|
datepickerTagName = 'lion-input-datepicker',
|
|
8
38
|
calendarTagName = 'lion-calendar',
|
|
39
|
+
// The tests drive the datepicker through a page object; an extension layer whose overlay markup
|
|
40
|
+
// differs (ING renders its own popover frame) passes its own subclass here instead of the suite
|
|
41
|
+
// learning about that markup. See docs/guides/principles/test-suites.md.
|
|
42
|
+
InputObject = DefaultInputObject,
|
|
9
43
|
} = {}) {
|
|
10
|
-
const
|
|
44
|
+
const datepickerTag = resolveSuiteTag(classes.host, datepickerTagName, 'lion-input-datepicker');
|
|
45
|
+
const calendarTag = resolveSuiteTag(classes.calendar, calendarTagName, 'lion-calendar');
|
|
46
|
+
const tag = unsafeStatic(datepickerTag);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The accessible name of a node, regardless of the mechanism an extension layer uses for it:
|
|
50
|
+
* Lion puts it on `title`/`aria-label`, a design system that delegates a11y to Lion but styles its
|
|
51
|
+
* own invoker exposes the same string as `label` on its own button element.
|
|
52
|
+
* @param {Element|null|undefined} node
|
|
53
|
+
* @returns {string|null}
|
|
54
|
+
*/
|
|
55
|
+
function accessibleName(node) {
|
|
56
|
+
return (
|
|
57
|
+
node?.getAttribute('title') ||
|
|
58
|
+
node?.getAttribute('aria-label') ||
|
|
59
|
+
node?.getAttribute('label') ||
|
|
60
|
+
node?.querySelector?.('[label]')?.getAttribute('label') ||
|
|
61
|
+
node?.shadowRoot?.querySelector?.('[label]')?.getAttribute('label') ||
|
|
62
|
+
null
|
|
63
|
+
);
|
|
64
|
+
}
|
|
11
65
|
it('should not reopen the datepicker popup when the date is selected by keyboard', async () => {
|
|
12
66
|
/** @type {LionInputDatepicker} */
|
|
13
67
|
const el = await fixture(html`<${tag} .modelValue="${new Date('2018/05/30')}"></${tag}>`);
|
|
@@ -17,15 +71,11 @@ export function runDatepickerSuite({
|
|
|
17
71
|
const openDatepickerButton = el._invokerNode;
|
|
18
72
|
openDatepickerButton?.focus();
|
|
19
73
|
openDatepickerButton?.click();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
?.querySelector(calendarTagName)
|
|
26
|
-
?.shadowRoot?.querySelector('.calendar__day-button[selected]');
|
|
27
|
-
await waitUntil(getSelectedDateEl);
|
|
28
|
-
getSelectedDateEl()?.focus();
|
|
74
|
+
await waitUntil(() => el.opened === true);
|
|
75
|
+
|
|
76
|
+
// Opening through the invoker leaves the focus on the calendar, which is what the arrow key needs:
|
|
77
|
+
// measured on Firefox, a day button focused by hand does not receive it, the selection stays put,
|
|
78
|
+
// `Enter` reaches the invoker and the popup reopens.
|
|
29
79
|
await sendKeys({
|
|
30
80
|
press: 'ArrowLeft',
|
|
31
81
|
});
|
|
@@ -34,4 +84,839 @@ export function runDatepickerSuite({
|
|
|
34
84
|
});
|
|
35
85
|
expect(el.opened).to.be.false;
|
|
36
86
|
});
|
|
87
|
+
/**
|
|
88
|
+
* @typedef {import('lit').TemplateResult} TemplateResult
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @param {LionInputDatepicker} datepickerEl
|
|
93
|
+
*/
|
|
94
|
+
function getProtectedMembersDatepicker(datepickerEl) {
|
|
95
|
+
// @ts-ignore
|
|
96
|
+
const { __invokerId: invokerId, _calendarNode: calendarNode } = datepickerEl;
|
|
97
|
+
return {
|
|
98
|
+
invokerId,
|
|
99
|
+
calendarNode,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param {LionCalendar} calendarEl
|
|
105
|
+
*/
|
|
106
|
+
function getProtectedMembersCalendar(calendarEl) {
|
|
107
|
+
return {
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
dateSelectedByUser: (...args) => calendarEl.__dateSelectedByUser(...args),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const fixtureForSuite =
|
|
113
|
+
/** @type {(arg: TemplateResult) => Promise<LionInputDatepicker>} */
|
|
114
|
+
_fixture;
|
|
115
|
+
describe('<lion-input-datepicker>', () => {
|
|
116
|
+
describe('Calendar Overlay', () => {
|
|
117
|
+
it('implements calendar-overlay Style component', async () => {
|
|
118
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
119
|
+
const elObj = new InputObject(el);
|
|
120
|
+
await elObj.openCalendar();
|
|
121
|
+
expect(elObj.overlayRootEl).not.to.equal(null);
|
|
122
|
+
expect(elObj.overlayHeaderEl).not.to.equal(null);
|
|
123
|
+
expect(elObj.overlayHeadingEl).not.to.equal(null);
|
|
124
|
+
expect(elObj.overlayCloseButtonContainerEl).not.to.equal(null);
|
|
125
|
+
});
|
|
126
|
+
it('has a close button, with a tooltip "Close"', async () => {
|
|
127
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
128
|
+
const elObj = new InputObject(el);
|
|
129
|
+
await elObj.openCalendar();
|
|
130
|
+
expect(accessibleName(elObj.overlayCloseButtonEl)).to.equal('Close');
|
|
131
|
+
});
|
|
132
|
+
it('has a default title based on input label', async () => {
|
|
133
|
+
const el = await fixtureForSuite(html`
|
|
134
|
+
<${tag}
|
|
135
|
+
.label="${'Pick your date'}"
|
|
136
|
+
.modelValue="${new Date('2020-02-15')}"
|
|
137
|
+
></${tag}>
|
|
138
|
+
`);
|
|
139
|
+
const elObj = new InputObject(el);
|
|
140
|
+
await elObj.openCalendar();
|
|
141
|
+
expect(elObj.overlayHeadingEl.innerText.trim()).to.equal('Pick your date');
|
|
142
|
+
});
|
|
143
|
+
it('can have a custom heading', async () => {
|
|
144
|
+
const el = await fixtureForSuite(html`
|
|
145
|
+
<${tag}
|
|
146
|
+
label="Pick your date"
|
|
147
|
+
calendar-heading="foo"
|
|
148
|
+
></${tag}>
|
|
149
|
+
`);
|
|
150
|
+
const elObj = new InputObject(el);
|
|
151
|
+
await elObj.openCalendar();
|
|
152
|
+
expect(elObj.overlayHeadingEl.innerText).to.equal('foo');
|
|
153
|
+
});
|
|
154
|
+
it('closes the calendar on [esc] key', async () => {
|
|
155
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
156
|
+
const elObj = new InputObject(el);
|
|
157
|
+
await elObj.openCalendar();
|
|
158
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
159
|
+
elObj.overlayController.contentNode.dispatchEvent(
|
|
160
|
+
new KeyboardEvent('keyup', {
|
|
161
|
+
key: 'Escape',
|
|
162
|
+
}),
|
|
163
|
+
);
|
|
164
|
+
await nextFrame();
|
|
165
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
166
|
+
});
|
|
167
|
+
it('closes the calendar via close button', async () => {
|
|
168
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
169
|
+
const elObj = new InputObject(el);
|
|
170
|
+
await elObj.openCalendar();
|
|
171
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
172
|
+
elObj.overlayCloseButtonEl.click();
|
|
173
|
+
await nextFrame();
|
|
174
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
175
|
+
});
|
|
176
|
+
it('closes the calendar via outside click event', async () => {
|
|
177
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
178
|
+
const elObj = new InputObject(el);
|
|
179
|
+
await elObj.openCalendar();
|
|
180
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
181
|
+
mimicClick(document.body);
|
|
182
|
+
await aTimeout(0);
|
|
183
|
+
expect(elObj.overlayController.isShown).to.be.false;
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Not in scope:
|
|
188
|
+
* - centralDate can be overridden
|
|
189
|
+
*/
|
|
190
|
+
});
|
|
191
|
+
describe('Calendar Invoker', () => {
|
|
192
|
+
it('adds invoker button that toggles the overlay on click in suffix slot ', async () => {
|
|
193
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
194
|
+
const elObj = new InputObject(el);
|
|
195
|
+
expect(elObj.invokerEl).not.to.equal(null);
|
|
196
|
+
expect(elObj.overlayController.isShown).to.be.false;
|
|
197
|
+
await elObj.openCalendar();
|
|
198
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
199
|
+
});
|
|
200
|
+
it('delegates disabled state of host input', async () => {
|
|
201
|
+
const el = await fixtureForSuite(html`<${tag} disabled></${tag}>`);
|
|
202
|
+
const elObj = new InputObject(el);
|
|
203
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
204
|
+
await elObj.openCalendar({
|
|
205
|
+
click: true,
|
|
206
|
+
});
|
|
207
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
208
|
+
el.disabled = false;
|
|
209
|
+
await elObj.openCalendar({
|
|
210
|
+
click: true,
|
|
211
|
+
});
|
|
212
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
213
|
+
});
|
|
214
|
+
it('disables invoker when host input is readonly', async () => {
|
|
215
|
+
const el = await fixtureForSuite(html`<${tag} readonly></${tag}>`);
|
|
216
|
+
const elObj = new InputObject(el);
|
|
217
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
218
|
+
await elObj.openCalendar({
|
|
219
|
+
click: true,
|
|
220
|
+
});
|
|
221
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
222
|
+
el.readOnly = false;
|
|
223
|
+
await elObj.openCalendar({
|
|
224
|
+
click: true,
|
|
225
|
+
});
|
|
226
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('Input - calendar synchronization', () => {
|
|
230
|
+
it('syncs modelValue with lion-calendar', async () => {
|
|
231
|
+
const myDate = new Date('2019/06/15');
|
|
232
|
+
const myOtherDate = new Date('2019/06/28');
|
|
233
|
+
const el = await fixtureForSuite(html`
|
|
234
|
+
<${tag} .modelValue="${myDate}"></${tag}>
|
|
235
|
+
`);
|
|
236
|
+
const elObj = new InputObject(el);
|
|
237
|
+
await elObj.openCalendar();
|
|
238
|
+
expect(elObj.calendarEl.selectedDate).to.equal(myDate);
|
|
239
|
+
await elObj.selectMonthDay(myOtherDate.getDate());
|
|
240
|
+
expect(isSameDate(/** @type {Date} */ el.modelValue, myOtherDate)).to.be.true;
|
|
241
|
+
});
|
|
242
|
+
it('restores centralDate when modelValue is cleared', async () => {
|
|
243
|
+
const myDate = new Date('2019/06/15');
|
|
244
|
+
const el = await fixtureForSuite(html` <${tag}></${tag}> `);
|
|
245
|
+
const elObj = new InputObject(el);
|
|
246
|
+
const initialCentralDate = elObj.calendarEl.centralDate;
|
|
247
|
+
el.modelValue = myDate;
|
|
248
|
+
await elObj.openCalendar();
|
|
249
|
+
expect(elObj.calendarEl.selectedDate).to.equal(myDate);
|
|
250
|
+
expect(elObj.calendarEl.centralDate).to.equal(myDate);
|
|
251
|
+
el.modelValue = undefined;
|
|
252
|
+
expect(elObj.calendarEl.centralDate).to.equal(myDate);
|
|
253
|
+
await elObj.closeCalendar();
|
|
254
|
+
await elObj.openCalendar();
|
|
255
|
+
expect(elObj.calendarEl.centralDate).to.equal(initialCentralDate);
|
|
256
|
+
});
|
|
257
|
+
it('closes the calendar overlay on "user-selected-date-changed"', async () => {
|
|
258
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
259
|
+
const elObj = new InputObject(el);
|
|
260
|
+
// Make sure the calendar overlay is opened
|
|
261
|
+
await elObj.openCalendar();
|
|
262
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
263
|
+
// Mimic user input: should fire the 'user-selected-date-changed' event
|
|
264
|
+
await elObj.selectMonthDay(12);
|
|
265
|
+
await el.updateComplete; // safari take a little longer
|
|
266
|
+
expect(elObj.overlayController.isShown).to.equal(false);
|
|
267
|
+
});
|
|
268
|
+
it('focuses selected date on opening of calendar', async () => {
|
|
269
|
+
const el = await fixtureForSuite(html`
|
|
270
|
+
<${tag} .modelValue="${new Date()}"></${tag}>
|
|
271
|
+
`);
|
|
272
|
+
const elObj = new InputObject(el);
|
|
273
|
+
await elObj.openCalendar();
|
|
274
|
+
await aTimeout(0);
|
|
275
|
+
expect(
|
|
276
|
+
isSameDate(
|
|
277
|
+
/** @type {Date} */ elObj.calendarEl.focusedDate,
|
|
278
|
+
/** @type {Date} */ elObj.calendarEl.selectedDate,
|
|
279
|
+
),
|
|
280
|
+
).to.be.true;
|
|
281
|
+
});
|
|
282
|
+
it('focuses central date on opening of calendar if no date selected', async () => {
|
|
283
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
284
|
+
const elObj = new InputObject(el);
|
|
285
|
+
await elObj.openCalendar();
|
|
286
|
+
await aTimeout(0);
|
|
287
|
+
expect(
|
|
288
|
+
isSameDate(
|
|
289
|
+
/** @type {Date} */ elObj.calendarEl.focusedDate,
|
|
290
|
+
elObj.calendarEl.centralDate,
|
|
291
|
+
),
|
|
292
|
+
).to.be.true;
|
|
293
|
+
});
|
|
294
|
+
it('fires model-value-changed with isTriggeredByUser on click', async () => {
|
|
295
|
+
let isTriggeredByUser;
|
|
296
|
+
const myDate = new Date('2019/12/15');
|
|
297
|
+
const myOtherDate = new Date('2019/12/18');
|
|
298
|
+
const el = await fixtureForSuite(html`
|
|
299
|
+
<${tag}
|
|
300
|
+
.modelValue="${myDate}"
|
|
301
|
+
@model-value-changed="${(/** @type {CustomEvent} */ event) => {
|
|
302
|
+
isTriggeredByUser = event.detail.isTriggeredByUser;
|
|
303
|
+
}}"
|
|
304
|
+
>
|
|
305
|
+
</${tag}>
|
|
306
|
+
`);
|
|
307
|
+
const elObj = new InputObject(el);
|
|
308
|
+
// Make sure the calendar overlay is opened
|
|
309
|
+
await elObj.openCalendar();
|
|
310
|
+
expect(elObj.overlayController.isShown).to.equal(true);
|
|
311
|
+
// Mimic user input: should fire the 'user-selected-date-changed' event
|
|
312
|
+
await elObj.selectMonthDay(myOtherDate.getDate());
|
|
313
|
+
await el.updateComplete; // safari take a little longer
|
|
314
|
+
expect(isTriggeredByUser).to.be.true;
|
|
315
|
+
expect(el.value).to.equal('18/12/2019');
|
|
316
|
+
});
|
|
317
|
+
describe('localization', () => {
|
|
318
|
+
/** @type {import('@lion/ui/localize.js').LocalizeManager} */ let localizeManager;
|
|
319
|
+
before(async () => {
|
|
320
|
+
const { getLocalizeManager } = await import('@lion/ui/localize-no-side-effects.js');
|
|
321
|
+
localizeManager = getLocalizeManager();
|
|
322
|
+
});
|
|
323
|
+
it('should update formatted value and value in accordance of localization upon model value update', async () => {
|
|
324
|
+
localizeManager.locale = 'nl-NL';
|
|
325
|
+
const el = await fixtureForSuite(html`
|
|
326
|
+
<${tag} .modelValue="${new Date('2022/12/30')}"></${tag}>
|
|
327
|
+
`);
|
|
328
|
+
await el.updateComplete;
|
|
329
|
+
expect(el.formattedValue).to.equal('30-12-2022');
|
|
330
|
+
expect(el.value).to.equal('30-12-2022');
|
|
331
|
+
});
|
|
332
|
+
after(() => {
|
|
333
|
+
// @ts-ignore - using protected method to undo setting explict locale
|
|
334
|
+
localizeManager.locale = localizeManager._fallbackLocale;
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
describe('Validators', () => {
|
|
338
|
+
/**
|
|
339
|
+
* Validators are the Application Developer facing API in <${tag}>:
|
|
340
|
+
* - setting restrictions on min/max/disallowed dates will be done via validators
|
|
341
|
+
* - all validators will be translated under the hood to enabledDates and passed to
|
|
342
|
+
* lion-calendar
|
|
343
|
+
*/
|
|
344
|
+
it('converts IsDateDisabled validator to "disableDates" property', async () => {
|
|
345
|
+
const no15th = /** @param {Date} d */ (d) => d.getDate() !== 15;
|
|
346
|
+
const no16th = /** @param {Date} d */ (d) => d.getDate() !== 16;
|
|
347
|
+
const no15thOr16th = /** @param {Date} d */ (d) => no15th(d) && no16th(d);
|
|
348
|
+
const el = await fixtureForSuite(html`
|
|
349
|
+
<${tag} .validators="${[new IsDateDisabled(no15thOr16th)]}">
|
|
350
|
+
</${tag}>
|
|
351
|
+
`);
|
|
352
|
+
const elObj = new InputObject(el);
|
|
353
|
+
await elObj.openCalendar();
|
|
354
|
+
expect(elObj.calendarEl.disableDates).to.equal(no15thOr16th);
|
|
355
|
+
});
|
|
356
|
+
it('converts MinDate validator to "minDate" property', async () => {
|
|
357
|
+
const myMinDate = new Date('2019/06/15');
|
|
358
|
+
const el = await fixtureForSuite(html` <${tag} .validators="${[new MinDate(myMinDate)]}">
|
|
359
|
+
</${tag}>`);
|
|
360
|
+
const elObj = new InputObject(el);
|
|
361
|
+
await elObj.openCalendar();
|
|
362
|
+
expect(elObj.calendarEl.minDate).to.equal(myMinDate);
|
|
363
|
+
});
|
|
364
|
+
it('converts MaxDate validator to "maxDate" property', async () => {
|
|
365
|
+
const myMaxDate = new Date('2030/06/15');
|
|
366
|
+
const el = await fixtureForSuite(html`
|
|
367
|
+
<${tag} .validators=${[new MaxDate(myMaxDate)]}> </${tag}>
|
|
368
|
+
`);
|
|
369
|
+
const elObj = new InputObject(el);
|
|
370
|
+
await elObj.openCalendar();
|
|
371
|
+
expect(elObj.calendarEl.maxDate).to.equal(myMaxDate);
|
|
372
|
+
});
|
|
373
|
+
it('converts MinMaxDate validator to "minDate" and "maxDate" property', async () => {
|
|
374
|
+
const myMinDate = new Date('2019/06/15');
|
|
375
|
+
const myMaxDate = new Date('2030/06/15');
|
|
376
|
+
const el = await fixtureForSuite(html`
|
|
377
|
+
<${tag}
|
|
378
|
+
.validators=${[
|
|
379
|
+
new MinMaxDate({
|
|
380
|
+
min: myMinDate,
|
|
381
|
+
max: myMaxDate,
|
|
382
|
+
}),
|
|
383
|
+
]}
|
|
384
|
+
>
|
|
385
|
+
</${tag}>
|
|
386
|
+
`);
|
|
387
|
+
const elObj = new InputObject(el);
|
|
388
|
+
await elObj.openCalendar();
|
|
389
|
+
expect(elObj.calendarEl.minDate).to.equal(myMinDate);
|
|
390
|
+
expect(elObj.calendarEl.maxDate).to.equal(myMaxDate);
|
|
391
|
+
});
|
|
392
|
+
it('does not converts MaxDate validator to "maxDate" property if validator type other then "error"', async () => {
|
|
393
|
+
const myMaxDate = new Date('2030/06/15');
|
|
394
|
+
const tagName = 'custom-input-datepicker';
|
|
395
|
+
if (!customElements.get(tagName)) {
|
|
396
|
+
customElements.define(
|
|
397
|
+
tagName,
|
|
398
|
+
class CustomInputDatepicker extends LionInputDatepicker {
|
|
399
|
+
static get validationTypes() {
|
|
400
|
+
// @ts-ignore [ts7-2855] TS7 rejects field access via super (the parent declares this as a field). Dot form kept deliberately: bracket access is exempt from property mangling (terser keep_quoted), which could split this property into two names. Upstream fix: declare an accessor in the parent type
|
|
401
|
+
return [...super.validationTypes, 'warning'];
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
const el = await fixtureForSuite(html`
|
|
407
|
+
<custom-input-datepicker
|
|
408
|
+
.validators=${[
|
|
409
|
+
new MaxDate(myMaxDate, {
|
|
410
|
+
type: 'warning',
|
|
411
|
+
}),
|
|
412
|
+
]}
|
|
413
|
+
>
|
|
414
|
+
</custom-input-datepicker>
|
|
415
|
+
`);
|
|
416
|
+
const elObj = new InputObject(el);
|
|
417
|
+
await elObj.openCalendar();
|
|
418
|
+
expect(elObj.calendarEl.maxDate).to.be.undefined;
|
|
419
|
+
});
|
|
420
|
+
it('should sync MinDate validator param with Calendar MinDate', async () => {
|
|
421
|
+
const myMinDateValidator = new MinDate(new Date('2020/02/02'));
|
|
422
|
+
const el = await fixtureForSuite(html`
|
|
423
|
+
<${tag} .validators="${[myMinDateValidator]}"> </${tag}>
|
|
424
|
+
`);
|
|
425
|
+
myMinDateValidator.param = new Date('2020/01/01');
|
|
426
|
+
expect(el.__calendarMinDate.toString()).to.equal(new Date('2020/01/01').toString());
|
|
427
|
+
});
|
|
428
|
+
it('should sync MaxDate validator param with Calendar MaxDate', async () => {
|
|
429
|
+
const myMaxDateValidator = new MaxDate(new Date('2020/02/02'));
|
|
430
|
+
const el = await fixtureForSuite(html`
|
|
431
|
+
<${tag} .validators="${[myMaxDateValidator]}"> </${tag}>
|
|
432
|
+
`);
|
|
433
|
+
myMaxDateValidator.param = new Date('2020/03/03');
|
|
434
|
+
expect(el.__calendarMaxDate.toString()).to.equal(new Date('2020/03/03').toString());
|
|
435
|
+
});
|
|
436
|
+
it('should sync MinMaxDate validator param with Calendar Min And Max Date', async () => {
|
|
437
|
+
const myMinDate = new Date('2019/06/15');
|
|
438
|
+
const myMaxDate = new Date('2030/06/15');
|
|
439
|
+
const myMinMaxDateValidator = new MinMaxDate({
|
|
440
|
+
min: myMinDate,
|
|
441
|
+
max: myMaxDate,
|
|
442
|
+
});
|
|
443
|
+
const el = await fixtureForSuite(html`
|
|
444
|
+
<${tag} .validators=${[myMinMaxDateValidator]}> </${tag}>
|
|
445
|
+
`);
|
|
446
|
+
myMinMaxDateValidator.param = {
|
|
447
|
+
min: new Date('2019/05/15'),
|
|
448
|
+
max: new Date('2019/07/15'),
|
|
449
|
+
};
|
|
450
|
+
expect(el.__calendarMinDate.toString()).to.equal(new Date('2019/05/15').toString());
|
|
451
|
+
expect(el.__calendarMaxDate.toString()).to.equal(new Date('2019/07/15').toString());
|
|
452
|
+
});
|
|
453
|
+
it('should update the central date of Calendar if updated validator made the current central date disabled', async () => {
|
|
454
|
+
const initialValidators = [new MaxDate(new Date('2000/01/01'))];
|
|
455
|
+
const updatedValidators = [new MaxDate(new Date('2020/01/01'))];
|
|
456
|
+
const el = await fixtureForSuite(html`
|
|
457
|
+
<${tag} .validators="${initialValidators}"></${tag}>
|
|
458
|
+
`);
|
|
459
|
+
const obj = new InputObject(el);
|
|
460
|
+
await obj.openCalendar();
|
|
461
|
+
expect(getProtectedMembersDatepicker(el).calendarNode.centralDate.toString()).to.equal(
|
|
462
|
+
new Date('2000/01/01').toString(),
|
|
463
|
+
);
|
|
464
|
+
await obj.closeCalendar();
|
|
465
|
+
el.validators = updatedValidators;
|
|
466
|
+
await obj.openCalendar();
|
|
467
|
+
expect(getProtectedMembersDatepicker(el).calendarNode.centralDate.toString()).to.equal(
|
|
468
|
+
new Date('2020/01/01').toString(),
|
|
469
|
+
);
|
|
470
|
+
});
|
|
471
|
+
it('should show error on invalid date passed to modelValue', async () => {
|
|
472
|
+
const myDate = new Date('foo');
|
|
473
|
+
const el = await fixtureForSuite(html`
|
|
474
|
+
<${tag} .modelValue="${myDate}"></${tag}>
|
|
475
|
+
`);
|
|
476
|
+
expect(el.hasFeedbackFor).to.include('error');
|
|
477
|
+
expect(el.validationStates).to.have.property('error');
|
|
478
|
+
expect(el.validationStates.error).to.have.property('IsDate');
|
|
479
|
+
});
|
|
480
|
+
it('should show error on date with invalid format passed to modelValue', async () => {
|
|
481
|
+
const myDate = new Date('30/01/2022');
|
|
482
|
+
const el = await fixtureForSuite(html`
|
|
483
|
+
<${tag} .modelValue="${myDate}"></${tag}>
|
|
484
|
+
`);
|
|
485
|
+
expect(el.hasFeedbackFor).to.include('error');
|
|
486
|
+
expect(el.validationStates).to.have.property('error');
|
|
487
|
+
expect(el.validationStates.error).to.have.property('IsDate');
|
|
488
|
+
});
|
|
489
|
+
it('syncs view value from calendar if custom validator is in error state', async () => {
|
|
490
|
+
const el = await fixtureForSuite(html`
|
|
491
|
+
<${tag} .validators=${[new AlwaysInvalid()]}></${tag}>
|
|
492
|
+
`);
|
|
493
|
+
const elObj = new InputObject(el);
|
|
494
|
+
await elObj.openCalendar();
|
|
495
|
+
await elObj.selectMonthDay(12);
|
|
496
|
+
await el.updateComplete; // safari take a little longer
|
|
497
|
+
|
|
498
|
+
expect(el.hasFeedbackFor).to.include('error');
|
|
499
|
+
expect(el.validationStates).to.have.property('error');
|
|
500
|
+
expect(el.validationStates.error).to.have.property('AlwaysInvalid');
|
|
501
|
+
expect(
|
|
502
|
+
isSameDate(
|
|
503
|
+
/** @type {Date} */ parseDate(el.value),
|
|
504
|
+
/** @type {Date} */ elObj.calendarEl.selectedDate,
|
|
505
|
+
),
|
|
506
|
+
).to.be.true;
|
|
507
|
+
expect(
|
|
508
|
+
isSameDate(
|
|
509
|
+
// @ts-ignore [allow-protected] in test
|
|
510
|
+
/** @type {Date} */
|
|
511
|
+
parseDate(el._inputNode.value),
|
|
512
|
+
/** @type {Date} */ elObj.calendarEl.selectedDate,
|
|
513
|
+
),
|
|
514
|
+
).to.be.true;
|
|
515
|
+
});
|
|
516
|
+
it('syncs view value from calendar if custom validator is in error state, when there was a previous modelValue', async () => {
|
|
517
|
+
const modelValue = new Date('2022/12/30');
|
|
518
|
+
const el = await fixtureForSuite(html`
|
|
519
|
+
<${tag}
|
|
520
|
+
.modelValue="${modelValue}"
|
|
521
|
+
.validators=${[new AlwaysInvalid()]}
|
|
522
|
+
></${tag}>
|
|
523
|
+
`);
|
|
524
|
+
expect(isSameDate(/** @type {Date} */ parseDate(el.value), modelValue)).to.be.true;
|
|
525
|
+
const elObj = new InputObject(el);
|
|
526
|
+
await elObj.openCalendar();
|
|
527
|
+
await elObj.selectMonthDay(12);
|
|
528
|
+
await el.updateComplete; // safari take a little longer
|
|
529
|
+
|
|
530
|
+
expect(el.hasFeedbackFor).to.include('error');
|
|
531
|
+
expect(el.validationStates).to.have.property('error');
|
|
532
|
+
expect(el.validationStates.error).to.have.property('AlwaysInvalid');
|
|
533
|
+
expect(
|
|
534
|
+
isSameDate(
|
|
535
|
+
/** @type {Date} */ parseDate(el.value),
|
|
536
|
+
/** @type {Date} */ elObj.calendarEl.selectedDate,
|
|
537
|
+
),
|
|
538
|
+
).to.be.true;
|
|
539
|
+
expect(
|
|
540
|
+
isSameDate(
|
|
541
|
+
// @ts-ignore [allow-protected] in test
|
|
542
|
+
/** @type {Date} */
|
|
543
|
+
parseDate(el._inputNode.value),
|
|
544
|
+
/** @type {Date} */ elObj.calendarEl.selectedDate,
|
|
545
|
+
),
|
|
546
|
+
).to.be.true;
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
/**
|
|
550
|
+
* Not in scope:
|
|
551
|
+
* - min/max attr (like platform has): could be added in future if observers needed
|
|
552
|
+
*/
|
|
553
|
+
});
|
|
554
|
+
});
|
|
555
|
+
describe('Calendar smoke tests', () => {
|
|
556
|
+
it('responds properly to keyboard events', async () => {
|
|
557
|
+
const el = await fixtureForSuite(html`
|
|
558
|
+
<${tag} calendar-heading="foo"></${tag}>
|
|
559
|
+
`);
|
|
560
|
+
const calendarEl =
|
|
561
|
+
/** @type {LionCalendar} */
|
|
562
|
+
new InputObject(el).calendarEl ?? el.shadowRoot?.querySelector(calendarTag);
|
|
563
|
+
const { dateSelectedByUser } = getProtectedMembersCalendar(calendarEl);
|
|
564
|
+
// First set a fixed date as if selected by a user
|
|
565
|
+
dateSelectedByUser(new Date('December 17, 2020 03:24:00 GMT+0000'));
|
|
566
|
+
await el.updateComplete;
|
|
567
|
+
const elObj = new InputObject(el);
|
|
568
|
+
|
|
569
|
+
// Open the calendar
|
|
570
|
+
await elObj.openCalendar();
|
|
571
|
+
const selectedDateEl = calendarEl?.shadowRoot?.querySelector(
|
|
572
|
+
'.calendar__day-button[selected]',
|
|
573
|
+
);
|
|
574
|
+
// @ts-ignore
|
|
575
|
+
selectedDateEl?.focus();
|
|
576
|
+
|
|
577
|
+
// Move focus to 18th of December
|
|
578
|
+
await sendKeys({
|
|
579
|
+
press: 'ArrowRight',
|
|
580
|
+
});
|
|
581
|
+
expect(/** @type {Date} */ calendarEl.focusedDate.getTime()).to.equal(
|
|
582
|
+
new Date('December 18, 2020 03:24:00 GMT+0000').getTime(),
|
|
583
|
+
);
|
|
584
|
+
});
|
|
585
|
+
it('responds properly to click events', async () => {
|
|
586
|
+
const el = await fixtureForSuite(html`
|
|
587
|
+
<${tag} calendar-heading="foo"></${tag}>
|
|
588
|
+
`);
|
|
589
|
+
const calendarEl =
|
|
590
|
+
/** @type {LionCalendar} */
|
|
591
|
+
new InputObject(el).calendarEl ?? el.shadowRoot?.querySelector(calendarTag);
|
|
592
|
+
const { dateSelectedByUser } = getProtectedMembersCalendar(calendarEl);
|
|
593
|
+
|
|
594
|
+
// First set a fixed date as if selected by a user
|
|
595
|
+
dateSelectedByUser(new Date('December 17, 2020 03:24:00 GMT+0000'));
|
|
596
|
+
await el.updateComplete;
|
|
597
|
+
const elObj = new InputObject(el);
|
|
598
|
+
|
|
599
|
+
// Open the calendar
|
|
600
|
+
await elObj.openCalendar();
|
|
601
|
+
|
|
602
|
+
// Pin the week start on the rendered grid: the first cell holds the previous month's last
|
|
603
|
+
// day only for a Sunday-first week. This assertion is about the click handler, not about the
|
|
604
|
+
// locale default a design system chose (my-ui starts the week on Monday).
|
|
605
|
+
const openedCalendarEl =
|
|
606
|
+
/** @type {LionCalendar} */
|
|
607
|
+
new InputObject(el).calendarEl ?? el.shadowRoot?.querySelector(calendarTag);
|
|
608
|
+
if (openedCalendarEl) {
|
|
609
|
+
openedCalendarEl.firstDayOfWeek = 0;
|
|
610
|
+
await openedCalendarEl.updateComplete;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// Select the first date button, which is 29th of previous month (November)
|
|
614
|
+
const firstDateBtn =
|
|
615
|
+
/** @type {HTMLButtonElement} */
|
|
616
|
+
openedCalendarEl?.shadowRoot?.querySelector('.calendar__day-button');
|
|
617
|
+
firstDateBtn.click();
|
|
618
|
+
expect(/** @type {Date} */ el.modelValue.getTime()).to.equal(
|
|
619
|
+
new Date('November 29, 2020 03:24:00 GMT+0000').getTime(),
|
|
620
|
+
);
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
describe('Accessibility', () => {
|
|
624
|
+
it('has a heading of level 1', async () => {
|
|
625
|
+
const el = await fixtureForSuite(html`
|
|
626
|
+
<${tag} calendar-heading="foo"></${tag}>
|
|
627
|
+
`);
|
|
628
|
+
const elObj = new InputObject(el);
|
|
629
|
+
await elObj.openCalendar();
|
|
630
|
+
const hNode = elObj.overlayHeadingEl;
|
|
631
|
+
const headingIsLevel1 =
|
|
632
|
+
hNode.tagName === 'H1' ||
|
|
633
|
+
(hNode.getAttribute('role') === 'heading' && hNode.getAttribute('aria-level') === '1');
|
|
634
|
+
expect(headingIsLevel1).to.be.true;
|
|
635
|
+
});
|
|
636
|
+
it('adds accessible label to invoker button', async () => {
|
|
637
|
+
// The fixture labels the field, because the point of the assertion is that the invoker's
|
|
638
|
+
// accessible name *names the field*: an unnamed field would test the fallback, not the label.
|
|
639
|
+
const el = await fixtureForSuite(html`<${tag} label="date"></${tag}>`);
|
|
640
|
+
const elObj = new InputObject(el);
|
|
641
|
+
await elObj.openCalendar();
|
|
642
|
+
expect(accessibleName(elObj.invokerEl)).to.equal('Open "date" picker');
|
|
643
|
+
});
|
|
644
|
+
it('adds [aria-expanded] to invoker button', async () => {
|
|
645
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
646
|
+
const elObj = new InputObject(el);
|
|
647
|
+
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal(null);
|
|
648
|
+
await elObj.openCalendar();
|
|
649
|
+
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal(null);
|
|
650
|
+
await elObj.closeCalendar();
|
|
651
|
+
expect(elObj.invokerEl.getAttribute('aria-expanded')).to.equal(null);
|
|
652
|
+
});
|
|
653
|
+
it('is accessible when closed', async () => {
|
|
654
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
655
|
+
const elObj = new InputObject(el);
|
|
656
|
+
await expect(elObj.invokerEl).to.be.accessible();
|
|
657
|
+
await expect(elObj.calendarEl).to.be.accessible();
|
|
658
|
+
});
|
|
659
|
+
it('is accessible when open', async () => {
|
|
660
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
661
|
+
const elObj = new InputObject(el);
|
|
662
|
+
await elObj.openCalendar();
|
|
663
|
+
await expect(elObj.calendarEl).to.be.accessible();
|
|
664
|
+
elObj.overlayCloseButtonEl.click();
|
|
665
|
+
});
|
|
666
|
+
it('has accessible invoker when open', async () => {
|
|
667
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
668
|
+
const elObj = new InputObject(el);
|
|
669
|
+
await elObj.openCalendar();
|
|
670
|
+
await expect(elObj.invokerEl).to.be.accessible();
|
|
671
|
+
elObj.overlayCloseButtonEl.click();
|
|
672
|
+
});
|
|
673
|
+
it('is accessible with a disabled date', async () => {
|
|
674
|
+
const no15th = /** @param {Date} d */ (d) => d.getDate() !== 15;
|
|
675
|
+
const el = await fixtureForSuite(html`
|
|
676
|
+
<${tag} .validators=${[new IsDateDisabled(no15th)]}> </${tag}>
|
|
677
|
+
`);
|
|
678
|
+
const elObj = new InputObject(el);
|
|
679
|
+
await elObj.openCalendar();
|
|
680
|
+
await expect(elObj.calendarEl).to.be.accessible();
|
|
681
|
+
elObj.overlayCloseButtonEl.click();
|
|
682
|
+
});
|
|
683
|
+
it('have different aria-label when multiple invoker', async () => {
|
|
684
|
+
const el = await fixtureForSuite(html`
|
|
685
|
+
<${tag} label="Start date" name="startDate"></${tag}>
|
|
686
|
+
<${tag} label="End date" name="endDate"></${tag}>
|
|
687
|
+
`);
|
|
688
|
+
const elements = /** @type {any} */ el.parentElement.children;
|
|
689
|
+
const startLabel = accessibleName(new InputObject(elements.startDate).invokerEl);
|
|
690
|
+
const endLabel = accessibleName(new InputObject(elements.endDate).invokerEl);
|
|
691
|
+
expect(startLabel).to.not.equal(endLabel);
|
|
692
|
+
});
|
|
693
|
+
});
|
|
694
|
+
describe.skip('Subclassers', () => {
|
|
695
|
+
describe('Providing a custom invoker', () => {
|
|
696
|
+
it('can override the invoker template', async () => {
|
|
697
|
+
const myTag = defineCE(
|
|
698
|
+
class extends LionInputDatepicker {
|
|
699
|
+
/** @override */
|
|
700
|
+
_invokerTemplate() {
|
|
701
|
+
return htmlNonStatic`<my-button>Pick my date</my-button>`;
|
|
702
|
+
}
|
|
703
|
+
},
|
|
704
|
+
);
|
|
705
|
+
const myEl = await fixtureForSuite(html`<${myTag}></${myTag}>`);
|
|
706
|
+
const myElObj = new InputObject(myEl);
|
|
707
|
+
const { invokerId } = getProtectedMembersDatepicker(myEl);
|
|
708
|
+
expect(myElObj.invokerEl.tagName.toLowerCase()).to.equal('my-button');
|
|
709
|
+
|
|
710
|
+
// All other tests will still pass. Small checkup:
|
|
711
|
+
expect(myElObj.invokerEl.getAttribute('title')).to.equal('Open date picker');
|
|
712
|
+
expect(myElObj.invokerEl.getAttribute('aria-label')).to.equal('Open date picker');
|
|
713
|
+
expect(myElObj.invokerEl.getAttribute('aria-expanded')).to.equal('false');
|
|
714
|
+
expect(myElObj.invokerEl.getAttribute('aria-haspopup')).to.equal('dialog');
|
|
715
|
+
expect(myElObj.invokerEl.getAttribute('slot')).to.equal('suffix');
|
|
716
|
+
expect(myElObj.invokerEl.getAttribute('id')).to.equal(invokerId);
|
|
717
|
+
await myElObj.openCalendar();
|
|
718
|
+
expect(myElObj.overlayController.isShown).to.equal(true);
|
|
719
|
+
});
|
|
720
|
+
it('can allocate the picker in a different slot supported by LionField', async () => {
|
|
721
|
+
/**
|
|
722
|
+
* It's important that this api is used instead of Subclassers providing a slot.
|
|
723
|
+
* When the input-datepicker knows where the calendar invoker is, it can attach
|
|
724
|
+
* the right logic, localization and accessibility functionality.
|
|
725
|
+
*/
|
|
726
|
+
const myTag = defineCE(
|
|
727
|
+
class extends LionInputDatepicker {
|
|
728
|
+
constructor() {
|
|
729
|
+
super();
|
|
730
|
+
this._calendarInvokerSlot = 'prefix';
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
);
|
|
734
|
+
const myEl = await fixtureForSuite(html`<${myTag}></${myTag}>`);
|
|
735
|
+
const myElObj = new InputObject(myEl);
|
|
736
|
+
expect(myElObj.invokerEl.getAttribute('slot')).to.equal('prefix');
|
|
737
|
+
});
|
|
738
|
+
});
|
|
739
|
+
describe('Providing a custom calendar', () => {
|
|
740
|
+
it('can override the calendar template', async () => {
|
|
741
|
+
customElements.define(
|
|
742
|
+
'my-calendar',
|
|
743
|
+
class extends LionCalendar {
|
|
744
|
+
constructor() {
|
|
745
|
+
super();
|
|
746
|
+
// Change some defaults
|
|
747
|
+
this.firstDayOfWeek = 1; // Start on Mondays instead of Sundays
|
|
748
|
+
this.weekdayHeaderNotation = 'narrow'; // 'T' instead of 'Thu'
|
|
749
|
+
}
|
|
750
|
+
},
|
|
751
|
+
);
|
|
752
|
+
const myTag = defineCE(
|
|
753
|
+
class extends LionInputDatepicker {
|
|
754
|
+
_calendarTemplate() {
|
|
755
|
+
return htmlNonStatic`<my-calendar id="calendar"></my-calendar>`;
|
|
756
|
+
}
|
|
757
|
+
},
|
|
758
|
+
);
|
|
759
|
+
const myEl = await fixtureForSuite(html`<${myTag}></${myTag}>`);
|
|
760
|
+
const myElObj = new InputObject(myEl);
|
|
761
|
+
|
|
762
|
+
// All other tests will still pass. Small checkup:
|
|
763
|
+
await myElObj.openCalendar();
|
|
764
|
+
expect(myElObj.calendarEl.tagName.toLowerCase()).to.equal('my-calendar');
|
|
765
|
+
});
|
|
766
|
+
});
|
|
767
|
+
describe('Providing a custom overlay', () => {
|
|
768
|
+
it('can override the overlay template', async () => {
|
|
769
|
+
// Keep in mind there is no logic inside this overlay frame; it only handles visuals.
|
|
770
|
+
// All interaction should be delegated to parent, which interacts with the calendar
|
|
771
|
+
// component
|
|
772
|
+
customElements.define(
|
|
773
|
+
'my-calendar-overlay-frame',
|
|
774
|
+
class extends LitElement {
|
|
775
|
+
render() {
|
|
776
|
+
// eslint-disable-line class-methods-use-this
|
|
777
|
+
return html`
|
|
778
|
+
<div class="c-calendar-overlay">
|
|
779
|
+
<slot></slot>
|
|
780
|
+
<div class="c-calendar-overlay__footer">
|
|
781
|
+
<button id="cancel-button" class="c-calendar-overlay__cancel-button">
|
|
782
|
+
Cancel
|
|
783
|
+
</button>
|
|
784
|
+
</div>
|
|
785
|
+
</div>
|
|
786
|
+
`;
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
);
|
|
790
|
+
let myOverlayOpenedCbHandled = false;
|
|
791
|
+
let myUserSelectedChangedCbHandled = false;
|
|
792
|
+
const myTag = defineCE(
|
|
793
|
+
class extends LionInputDatepicker {
|
|
794
|
+
// TODO: this method doesn't exist on LionInputDatepicker, so if we re-enable these tests, they should be redone
|
|
795
|
+
// /** @override */
|
|
796
|
+
// _calendarOverlayTemplate() {
|
|
797
|
+
// return html`
|
|
798
|
+
// <my-calendar-overlay-frame id="calendar-overlay">
|
|
799
|
+
// <span slot="heading">${this.calendarHeading}</span>
|
|
800
|
+
// </my-calendar-overlay-frame>
|
|
801
|
+
// `;
|
|
802
|
+
// }
|
|
803
|
+
|
|
804
|
+
/** @override */
|
|
805
|
+
_onCalendarOverlayOpened() {
|
|
806
|
+
super._onCalendarOverlayOpened();
|
|
807
|
+
myOverlayOpenedCbHandled = true;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* @override
|
|
812
|
+
* @param {{ target: { selectedDate: Date }}} opts
|
|
813
|
+
*/
|
|
814
|
+
_onCalendarUserSelectedChanged({ target: { selectedDate } }) {
|
|
815
|
+
super._onCalendarUserSelectedChanged({
|
|
816
|
+
target: {
|
|
817
|
+
selectedDate,
|
|
818
|
+
},
|
|
819
|
+
});
|
|
820
|
+
myUserSelectedChangedCbHandled = true;
|
|
821
|
+
}
|
|
822
|
+
},
|
|
823
|
+
);
|
|
824
|
+
const myEl = await fixtureForSuite(html`<${myTag}></${myTag}>`);
|
|
825
|
+
const myElObj = new InputObject(myEl);
|
|
826
|
+
|
|
827
|
+
// All other tests will still pass. Small checkup:
|
|
828
|
+
await myElObj.openCalendar();
|
|
829
|
+
expect(myElObj.overlayEl.tagName.toLowerCase()).to.equal('my-calendar-overlay-frame');
|
|
830
|
+
expect(myOverlayOpenedCbHandled).to.be.true;
|
|
831
|
+
await myElObj.selectMonthDay(1);
|
|
832
|
+
expect(myUserSelectedChangedCbHandled).to.be.true;
|
|
833
|
+
});
|
|
834
|
+
it.skip('can configure the overlay presentation based on media query switch', async () => {});
|
|
835
|
+
});
|
|
836
|
+
});
|
|
837
|
+
describe('regression tests', async () => {
|
|
838
|
+
it('does not submit a form when datepicker is opened', async () => {
|
|
839
|
+
const submitSpy = sinon.spy();
|
|
840
|
+
const form = await fixtureForSuite(html`
|
|
841
|
+
<form @submit="${submitSpy}">
|
|
842
|
+
<${tag}></${tag}>
|
|
843
|
+
</form>
|
|
844
|
+
`);
|
|
845
|
+
const el = /** @type {LionInputDatepicker} */ form.children[0];
|
|
846
|
+
await el.updateComplete;
|
|
847
|
+
const elObj = new InputObject(el);
|
|
848
|
+
await elObj.openCalendar();
|
|
849
|
+
expect(submitSpy.callCount).to.equal(0);
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
// TODO: remove: became irrelevant after we don't need dialog-frame
|
|
853
|
+
it.skip('is hidden when attribute hidden is true', async () => {
|
|
854
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
855
|
+
await el.updateComplete;
|
|
856
|
+
const myElObj = new InputObject(el);
|
|
857
|
+
await myElObj.openCalendar();
|
|
858
|
+
myElObj.overlayEl.hidden = true;
|
|
859
|
+
await el.updateComplete;
|
|
860
|
+
expect(getComputedStyle(myElObj.overlayEl).display).to.equal('none', 'Display is not none');
|
|
861
|
+
});
|
|
862
|
+
});
|
|
863
|
+
describe('responsive', async () => {
|
|
864
|
+
it('opens as bottom sheet on mobile', async () => {
|
|
865
|
+
await setViewport({
|
|
866
|
+
width: 360,
|
|
867
|
+
height: 640,
|
|
868
|
+
});
|
|
869
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
870
|
+
const myElObj = new InputObject(el);
|
|
871
|
+
await myElObj.openCalendar();
|
|
872
|
+
expect(el.hasArrow).to.be.false;
|
|
873
|
+
expect(
|
|
874
|
+
myElObj.overlayController.contentNode.classList.contains(
|
|
875
|
+
'overlays__overlay--bottom-sheet',
|
|
876
|
+
),
|
|
877
|
+
'Datepicker does not get rendered as bottom sheet',
|
|
878
|
+
).to.be.false;
|
|
879
|
+
});
|
|
880
|
+
it('opens as popover on desktop', async () => {
|
|
881
|
+
await setViewport({
|
|
882
|
+
width: 1200,
|
|
883
|
+
height: 640,
|
|
884
|
+
});
|
|
885
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
886
|
+
const myElObj = new InputObject(el);
|
|
887
|
+
await myElObj.openCalendar();
|
|
888
|
+
expect(el.hasArrow).to.be.true;
|
|
889
|
+
expect(
|
|
890
|
+
el?.shadowRoot?.contains(myElObj.overlayController.contentNode),
|
|
891
|
+
'Datepicker does not get rendered as a popover',
|
|
892
|
+
).to.be.true;
|
|
893
|
+
});
|
|
894
|
+
|
|
895
|
+
// TODO: fix a bug in overlays which does not move global nodes back to the local dom
|
|
896
|
+
it.skip('can switch between bottom sheet and popover', async () => {
|
|
897
|
+
const el = await fixtureForSuite(html`<${tag}></${tag}>`);
|
|
898
|
+
await el.updateComplete;
|
|
899
|
+
const myElObj = new InputObject(el);
|
|
900
|
+
await setViewport({
|
|
901
|
+
width: 360,
|
|
902
|
+
height: 640,
|
|
903
|
+
});
|
|
904
|
+
await myElObj.openCalendar();
|
|
905
|
+
expect(
|
|
906
|
+
el?.shadowRoot?.contains(myElObj.overlayController.contentNode),
|
|
907
|
+
'Datepicker does not get rendered as bottom sheet',
|
|
908
|
+
).to.be.false;
|
|
909
|
+
await myElObj.closeCalendar();
|
|
910
|
+
await setViewport({
|
|
911
|
+
width: 1200,
|
|
912
|
+
height: 640,
|
|
913
|
+
});
|
|
914
|
+
await myElObj.openCalendar();
|
|
915
|
+
expect(
|
|
916
|
+
el?.shadowRoot?.contains(myElObj.overlayController.contentNode),
|
|
917
|
+
'Datepicker does not get rendered as a popover',
|
|
918
|
+
).to.be.true;
|
|
919
|
+
});
|
|
920
|
+
});
|
|
921
|
+
});
|
|
37
922
|
}
|