igniteui-webcomponents 7.3.1 → 7.4.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/CHANGELOG.md +72 -1
- package/animations/easings.d.ts +21 -31
- package/animations/easings.js +21 -34
- package/animations/easings.js.map +1 -1
- package/animations/player.d.ts +8 -16
- package/animations/player.js +5 -8
- package/animations/player.js.map +1 -1
- package/animations/view-transition.d.ts +10 -10
- package/animations/view-transition.js +26 -37
- package/animations/view-transition.js.map +1 -1
- package/components/avatar/themes/avatar.base.css.js +1 -1
- package/components/avatar/themes/avatar.base.css.js.map +1 -1
- package/components/badge/themes/badge.base.css.js +1 -1
- package/components/badge/themes/badge.base.css.js.map +1 -1
- package/components/banner/themes/banner.base.css.js +1 -1
- package/components/banner/themes/banner.base.css.js.map +1 -1
- package/components/banner/themes/shared/banner.indigo.css.js +1 -1
- package/components/banner/themes/shared/banner.indigo.css.js.map +1 -1
- package/components/breadcrumb/breadcrumb.d.ts +74 -0
- package/components/breadcrumb/breadcrumb.js +107 -0
- package/components/breadcrumb/breadcrumb.js.map +1 -0
- package/components/breadcrumb/breadcrumbs.d.ts +60 -0
- package/components/breadcrumb/breadcrumbs.js +50 -0
- package/components/breadcrumb/breadcrumbs.js.map +1 -0
- package/components/breadcrumb/themes/breadcrumb.base.css.d.ts +1 -0
- package/components/breadcrumb/themes/breadcrumb.base.css.js +3 -0
- package/components/breadcrumb/themes/breadcrumb.base.css.js.map +1 -0
- package/components/breadcrumb/themes/breadcrumbs.base.css.d.ts +1 -0
- package/components/breadcrumb/themes/breadcrumbs.base.css.js +3 -0
- package/components/breadcrumb/themes/breadcrumbs.base.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.js.map +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.material.css.d.ts +1 -0
- package/components/breadcrumb/themes/dark/breadcrumb.material.css.js +3 -0
- package/components/breadcrumb/themes/dark/breadcrumb.material.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.fluent.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.fluent.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.fluent.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.indigo.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.indigo.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.indigo.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.material.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.material.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.material.css.js.map +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.shared.css.d.ts +1 -0
- package/components/breadcrumb/themes/light/breadcrumb.shared.css.js +3 -0
- package/components/breadcrumb/themes/light/breadcrumb.shared.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.common.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.common.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.common.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.js.map +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.material.css.d.ts +1 -0
- package/components/breadcrumb/themes/shared/breadcrumb.material.css.js +3 -0
- package/components/breadcrumb/themes/shared/breadcrumb.material.css.js.map +1 -0
- package/components/breadcrumb/themes/themes.d.ts +2 -0
- package/components/breadcrumb/themes/themes.js +50 -0
- package/components/breadcrumb/themes/themes.js.map +1 -0
- package/components/button/button.d.ts +0 -2
- package/components/button/button.js.map +1 -1
- package/components/button-group/button-group.d.ts +42 -12
- package/components/button-group/button-group.js +82 -34
- package/components/button-group/button-group.js.map +1 -1
- package/components/button-group/toggle-button.d.ts +6 -1
- package/components/button-group/toggle-button.js +28 -2
- package/components/button-group/toggle-button.js.map +1 -1
- package/components/calendar/base.d.ts +7 -2
- package/components/calendar/base.js +10 -4
- package/components/calendar/base.js.map +1 -1
- package/components/calendar/calendar.d.ts +6 -3
- package/components/calendar/calendar.js +41 -14
- package/components/calendar/calendar.js.map +1 -1
- package/components/calendar/days-view/days-view.d.ts +5 -8
- package/components/calendar/days-view/days-view.js +7 -16
- package/components/calendar/days-view/days-view.js.map +1 -1
- package/components/calendar/helpers.d.ts +13 -0
- package/components/calendar/helpers.js +15 -0
- package/components/calendar/helpers.js.map +1 -1
- package/components/calendar/themes/calendar.base.css.js +1 -1
- package/components/calendar/themes/calendar.base.css.js.map +1 -1
- package/components/calendar/themes/days-view.base.css.js +1 -1
- package/components/calendar/themes/days-view.base.css.js.map +1 -1
- package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js +1 -1
- package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js.map +1 -1
- package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js +1 -1
- package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js.map +1 -1
- package/components/calendar/themes/shared/fluent/days-view.fluent.css.js +1 -1
- package/components/calendar/themes/shared/fluent/days-view.fluent.css.js.map +1 -1
- package/components/calendar/themes/shared/indigo/calendar.indigo.css.js +1 -1
- package/components/calendar/themes/shared/indigo/calendar.indigo.css.js.map +1 -1
- package/components/calendar/themes/shared/indigo/days-view.indigo.css.js +1 -1
- package/components/calendar/themes/shared/indigo/days-view.indigo.css.js.map +1 -1
- package/components/calendar/themes/shared/material/days-view.material.css.js +1 -1
- package/components/calendar/themes/shared/material/days-view.material.css.js.map +1 -1
- package/components/calendar/themes/year-month-view.base.css.js +1 -1
- package/components/calendar/themes/year-month-view.base.css.js.map +1 -1
- package/components/card/themes/container.base.css.js +1 -1
- package/components/card/themes/container.base.css.js.map +1 -1
- package/components/carousel/carousel-indicator.js +1 -0
- package/components/carousel/carousel-indicator.js.map +1 -1
- package/components/carousel/carousel-slide.d.ts +1 -1
- package/components/carousel/carousel-slide.js.map +1 -1
- package/components/carousel/carousel.d.ts +3 -3
- package/components/carousel/carousel.js.map +1 -1
- package/components/carousel/themes/carousel.base.css.js +1 -1
- package/components/carousel/themes/carousel.base.css.js.map +1 -1
- package/components/carousel/themes/shared/carousel.indigo.css.js +1 -1
- package/components/carousel/themes/shared/carousel.indigo.css.js.map +1 -1
- package/components/chat/chat-input.d.ts +1 -2
- package/components/chat/chat-input.js +1 -1
- package/components/chat/chat-input.js.map +1 -1
- package/components/chat/chat-state.d.ts +8 -9
- package/components/chat/chat-state.js.map +1 -1
- package/components/chat/chat.d.ts +1 -3
- package/components/chat/chat.js +2 -2
- package/components/chat/chat.js.map +1 -1
- package/components/chat/message-attachments.d.ts +6 -15
- package/components/chat/message-attachments.js.map +1 -1
- package/components/chat/themes/chat.base.css.js +1 -1
- package/components/chat/themes/chat.base.css.js.map +1 -1
- package/components/chat/themes/message.base.css.js +1 -1
- package/components/chat/themes/message.base.css.js.map +1 -1
- package/components/chat/utils.d.ts +0 -1
- package/components/chat/utils.js +1 -1
- package/components/chat/utils.js.map +1 -1
- package/components/checkbox/checkbox-base.d.ts +1 -1
- package/components/checkbox/checkbox.js +1 -1
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/themes/checkbox.base.css.js +1 -1
- package/components/checkbox/themes/checkbox.base.css.js.map +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
- package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.fluent.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.fluent.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.indigo.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.indigo.css.js.map +1 -1
- package/components/checkbox/themes/shared/switch/switch.material.css.js +1 -1
- package/components/checkbox/themes/shared/switch/switch.material.css.js.map +1 -1
- package/components/checkbox/themes/switch.base.css.js +1 -1
- package/components/checkbox/themes/switch.base.css.js.map +1 -1
- package/components/chip/chip.d.ts +2 -2
- package/components/chip/chip.js.map +1 -1
- package/components/color-picker/color-picker.d.ts +35 -34
- package/components/color-picker/color-picker.js +9 -4
- package/components/color-picker/color-picker.js.map +1 -1
- package/components/color-picker/common.d.ts +0 -2
- package/components/color-picker/common.js +2 -2
- package/components/color-picker/common.js.map +1 -1
- package/components/color-picker/converters.js.map +1 -1
- package/components/color-picker/picker-canvas.js.map +1 -1
- package/components/color-picker/themes/color-picker.base.css.js +1 -1
- package/components/color-picker/themes/color-picker.base.css.js.map +1 -1
- package/components/combo/combo.d.ts +18 -20
- package/components/combo/combo.js +8 -2
- package/components/combo/combo.js.map +1 -1
- package/components/combo/controllers/data.d.ts +7 -10
- package/components/combo/controllers/data.js.map +1 -1
- package/components/combo/themes/combo-item.base.css.js +1 -1
- package/components/combo/themes/combo-item.base.css.js.map +1 -1
- package/components/combo/themes/combo.base.css.js +1 -1
- package/components/combo/themes/combo.base.css.js.map +1 -1
- package/components/combo/themes/shared/combo.bootstrap.css.js +1 -1
- package/components/combo/themes/shared/combo.bootstrap.css.js.map +1 -1
- package/components/date-picker/date-picker.base.d.ts +33 -29
- package/components/date-picker/date-picker.base.js +15 -4
- package/components/date-picker/date-picker.base.js.map +1 -1
- package/components/date-picker/date-picker.d.ts +1 -1
- package/components/date-picker/date-picker.js +5 -3
- package/components/date-picker/date-picker.js.map +1 -1
- package/components/date-picker/themes/date-picker.base.css.js +1 -1
- package/components/date-picker/themes/date-picker.base.css.js.map +1 -1
- package/components/date-range-picker/date-range-input.d.ts +0 -2
- package/components/date-range-picker/date-range-input.js +0 -6
- package/components/date-range-picker/date-range-input.js.map +1 -1
- package/components/date-range-picker/date-range-picker.base.css.js +1 -1
- package/components/date-range-picker/date-range-picker.base.css.js.map +1 -1
- package/components/date-range-picker/date-range-picker.d.ts +22 -31
- package/components/date-range-picker/date-range-picker.js +7 -7
- package/components/date-range-picker/date-range-picker.js.map +1 -1
- package/components/date-range-picker/i18n.d.ts +21 -0
- package/components/date-range-picker/i18n.js +10 -0
- package/components/date-range-picker/i18n.js.map +1 -0
- package/components/date-range-picker/predefined-ranges-area.base.css.js +1 -1
- package/components/date-range-picker/predefined-ranges-area.base.css.js.map +1 -1
- package/components/date-range-picker/predefined-ranges-area.d.ts +3 -3
- package/components/date-range-picker/predefined-ranges-area.js +2 -5
- package/components/date-range-picker/predefined-ranges-area.js.map +1 -1
- package/components/date-range-picker/validators.d.ts +0 -4
- package/components/date-range-picker/validators.js +4 -4
- package/components/date-range-picker/validators.js.map +1 -1
- package/components/date-time-input/date-time-input.base.d.ts +39 -37
- package/components/date-time-input/date-time-input.base.js +6 -0
- package/components/date-time-input/date-time-input.base.js.map +1 -1
- package/components/date-time-input/date-time-input.d.ts +1 -11
- package/components/date-time-input/date-time-input.js +0 -6
- package/components/date-time-input/date-time-input.js.map +1 -1
- package/components/date-time-input/datetime-mask-parser.d.ts +0 -10
- package/components/date-time-input/datetime-mask-parser.js +1 -1
- package/components/date-time-input/datetime-mask-parser.js.map +1 -1
- package/components/dialog/dialog.js.map +1 -1
- package/components/divider/themes/divider.base.css.js +1 -1
- package/components/divider/themes/divider.base.css.js.map +1 -1
- package/components/dropdown/dropdown-group.d.ts +2 -10
- package/components/dropdown/dropdown-group.js +2 -27
- package/components/dropdown/dropdown-group.js.map +1 -1
- package/components/dropdown/dropdown.d.ts +17 -23
- package/components/dropdown/dropdown.js +5 -17
- package/components/dropdown/dropdown.js.map +1 -1
- package/components/dropdown/themes/dropdown-item.base.css.js +1 -1
- package/components/dropdown/themes/dropdown-item.base.css.js.map +1 -1
- package/components/dropdown/themes/dropdown.base.css.js +1 -1
- package/components/dropdown/themes/dropdown.base.css.js.map +1 -1
- package/components/file-input/file-input.d.ts +2 -2
- package/components/file-input/file-input.js.map +1 -1
- package/components/file-input/themes/file-input.base.css.js +1 -1
- package/components/file-input/themes/file-input.base.css.js.map +1 -1
- package/components/file-input/themes/shared/file-input.bootstrap.css.js +1 -1
- package/components/file-input/themes/shared/file-input.bootstrap.css.js.map +1 -1
- package/components/icon/icon.d.ts +1 -1
- package/components/icon/icon.registry.d.ts +6 -6
- package/components/icon/icon.registry.js.map +1 -1
- package/components/input/input.d.ts +3 -3
- package/components/input/input.js.map +1 -1
- package/components/input/themes/shared/input.indigo.css.js +1 -1
- package/components/input/themes/shared/input.indigo.css.js.map +1 -1
- package/components/input/themes/shared/input.material.css.js +1 -1
- package/components/input/themes/shared/input.material.css.js.map +1 -1
- package/components/list/themes/item.base.css.js +1 -1
- package/components/list/themes/item.base.css.js.map +1 -1
- package/components/mask-input/mask-history.d.ts +22 -18
- package/components/mask-input/mask-history.js.map +1 -1
- package/components/mask-input/mask-input.d.ts +1 -1
- package/components/mask-input/mask-parser.d.ts +11 -13
- package/components/mask-input/mask-parser.js.map +1 -1
- package/components/nav-drawer/themes/item.base.css.js +1 -1
- package/components/nav-drawer/themes/item.base.css.js.map +1 -1
- package/components/popover/popover.d.ts +45 -34
- package/components/popover/popover.js +54 -122
- package/components/popover/popover.js.map +1 -1
- package/components/popover/position/arrow.d.ts +19 -0
- package/components/popover/position/arrow.js +33 -0
- package/components/popover/position/arrow.js.map +1 -0
- package/components/popover/position/floating.d.ts +40 -0
- package/components/popover/position/floating.js +146 -0
- package/components/popover/position/floating.js.map +1 -0
- package/components/popover/position/native.d.ts +45 -0
- package/components/popover/position/native.js +158 -0
- package/components/popover/position/native.js.map +1 -0
- package/components/popover/position/strategy.d.ts +37 -0
- package/components/popover/position/strategy.js +21 -0
- package/components/popover/position/strategy.js.map +1 -0
- package/components/popover/position/types.d.ts +26 -0
- package/components/popover/position/types.js +15 -0
- package/components/popover/position/types.js.map +1 -0
- package/components/popover/themes/light/popover.base.css.js +1 -1
- package/components/popover/themes/light/popover.base.css.js.map +1 -1
- package/components/progress/circular-progress.d.ts +0 -5
- package/components/progress/circular-progress.js.map +1 -1
- package/components/progress/themes/linear/linear.progress.base.css.js +1 -1
- package/components/progress/themes/linear/linear.progress.base.css.js.map +1 -1
- package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.d.ts +1 -0
- package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.js +3 -0
- package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.js.map +1 -0
- package/components/progress/themes/linear/themes.js +3 -2
- package/components/progress/themes/linear/themes.js.map +1 -1
- package/components/qr-code/qr-code.d.ts +29 -2
- package/components/qr-code/qr-code.js +56 -13
- package/components/qr-code/qr-code.js.map +1 -1
- package/components/qr-code/renderer/export.d.ts +28 -0
- package/components/qr-code/renderer/export.js +120 -0
- package/components/qr-code/renderer/export.js.map +1 -0
- package/components/qr-code/types.d.ts +26 -0
- package/components/qr-code/types.js.map +1 -1
- package/components/radio/radio.d.ts +4 -4
- package/components/radio/radio.js +17 -14
- package/components/radio/radio.js.map +1 -1
- package/components/radio/themes/radio.base.css.js +1 -1
- package/components/radio/themes/radio.base.css.js.map +1 -1
- package/components/radio/themes/shared/radio.bootstrap.css.js +1 -1
- package/components/radio/themes/shared/radio.bootstrap.css.js.map +1 -1
- package/components/radio/themes/shared/radio.indigo.css.js +1 -1
- package/components/radio/themes/shared/radio.indigo.css.js.map +1 -1
- package/components/radio-group/radio-group.js.map +1 -1
- package/components/rating/rating.d.ts +6 -6
- package/components/rating/rating.js.map +1 -1
- package/components/select/select-group.d.ts +5 -10
- package/components/select/select-group.js +10 -34
- package/components/select/select-group.js.map +1 -1
- package/components/select/select.d.ts +12 -20
- package/components/select/select.js +4 -14
- package/components/select/select.js.map +1 -1
- package/components/select/themes/select.base.css.js +1 -1
- package/components/select/themes/select.base.css.js.map +1 -1
- package/components/select/themes/shared/select.bootstrap.css.js +1 -1
- package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
- package/components/slider/themes/shared/slider.material.css.js +1 -1
- package/components/slider/themes/shared/slider.material.css.js.map +1 -1
- package/components/slider/themes/slider.base.css.js +1 -1
- package/components/slider/themes/slider.base.css.js.map +1 -1
- package/components/snackbar/themes/snackbar.base.css.js +1 -1
- package/components/snackbar/themes/snackbar.base.css.js.map +1 -1
- package/components/splitter/splitter.d.ts +6 -6
- package/components/splitter/splitter.js.map +1 -1
- package/components/splitter/themes/splitter.base.css.js +1 -1
- package/components/splitter/themes/splitter.base.css.js.map +1 -1
- package/components/stepper/themes/step/step.base.css.js +1 -1
- package/components/stepper/themes/step/step.base.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.bootstrap.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.bootstrap.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.fluent.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.fluent.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.indigo.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.indigo.css.js.map +1 -1
- package/components/tabs/themes/shared/tab/tab.material.css.js +1 -1
- package/components/tabs/themes/shared/tab/tab.material.css.js.map +1 -1
- package/components/tabs/themes/shared/tabs/tabs.fluent.css.js +1 -1
- package/components/tabs/themes/shared/tabs/tabs.fluent.css.js.map +1 -1
- package/components/tabs/themes/shared/tabs/tabs.indigo.css.js +1 -1
- package/components/tabs/themes/shared/tabs/tabs.indigo.css.js.map +1 -1
- package/components/tabs/themes/shared/tabs/tabs.material.css.js +1 -1
- package/components/tabs/themes/shared/tabs/tabs.material.css.js.map +1 -1
- package/components/tabs/themes/tab.base.css.js +1 -1
- package/components/tabs/themes/tab.base.css.js.map +1 -1
- package/components/textarea/textarea.d.ts +1 -1
- package/components/textarea/textarea.js.map +1 -1
- package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
- package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.common.css.js +1 -1
- package/components/textarea/themes/shared/textarea.common.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
- package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
- package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.material.css.js +1 -1
- package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
- package/components/tile-manager/themes/tile.base.css.js +1 -1
- package/components/tile-manager/themes/tile.base.css.js.map +1 -1
- package/components/tile-manager/tile-manager.d.ts +6 -7
- package/components/tile-manager/tile-manager.js.map +1 -1
- package/components/tile-manager/tile.d.ts +3 -3
- package/components/tile-manager/tile.js.map +1 -1
- package/components/toast/themes/toast.base.css.js +1 -1
- package/components/toast/themes/toast.base.css.js.map +1 -1
- package/components/toast/toast.d.ts +0 -2
- package/components/toast/toast.js.map +1 -1
- package/components/tooltip/controller.js.map +1 -1
- package/components/tooltip/service.js +4 -5
- package/components/tooltip/service.js.map +1 -1
- package/components/tooltip/themes/tooltip.base.css.js +1 -1
- package/components/tooltip/themes/tooltip.base.css.js.map +1 -1
- package/components/tooltip/tooltip.d.ts +34 -13
- package/components/tooltip/tooltip.js +8 -4
- package/components/tooltip/tooltip.js.map +1 -1
- package/components/tree/themes/item.base.css.js +1 -1
- package/components/tree/themes/item.base.css.js.map +1 -1
- package/components/tree/tree-item.d.ts +6 -6
- package/components/tree/tree-item.js.map +1 -1
- package/components/tree/tree.navigation.d.ts +5 -6
- package/components/tree/tree.navigation.js.map +1 -1
- package/components/tree/tree.selection.js.map +1 -1
- package/components/types.d.ts +1 -1
- package/components/types.js.map +1 -1
- package/components/validation-container/themes/validator.base.css.js +1 -1
- package/components/validation-container/themes/validator.base.css.js.map +1 -1
- package/components/validation-container/validation-container.d.ts +10 -12
- package/components/validation-container/validation-container.js +14 -17
- package/components/validation-container/validation-container.js.map +1 -1
- package/components/virtualization/engine.d.ts +5 -5
- package/components/virtualization/engine.js.map +1 -1
- package/components/virtualization/virtualization.d.ts +61 -63
- package/components/virtualization/virtualization.js +6 -5
- package/components/virtualization/virtualization.js.map +1 -1
- package/custom-elements.json +16769 -19698
- package/igniteui-webcomponents.css-data.json +2 -2
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +3 -1
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/internals/abort-handler.d.ts +13 -25
- package/internals/abort-handler.js +4 -6
- package/internals/abort-handler.js.map +1 -1
- package/internals/context.d.ts +13 -7
- package/internals/context.js +2 -1
- package/internals/context.js.map +1 -1
- package/internals/controllers/adopt-styles.d.ts +19 -20
- package/internals/controllers/adopt-styles.js +3 -8
- package/internals/controllers/adopt-styles.js.map +1 -1
- package/internals/controllers/aria-projection.d.ts +56 -55
- package/internals/controllers/aria-projection.js +14 -15
- package/internals/controllers/aria-projection.js.map +1 -1
- package/internals/controllers/async-consumer.js.map +1 -1
- package/internals/controllers/command.d.ts +15 -30
- package/internals/controllers/command.js +2 -7
- package/internals/controllers/command.js.map +1 -1
- package/internals/controllers/context-provider.d.ts +7 -13
- package/internals/controllers/context-provider.js.map +1 -1
- package/internals/controllers/focus-ring.d.ts +10 -30
- package/internals/controllers/focus-ring.js +6 -12
- package/internals/controllers/focus-ring.js.map +1 -1
- package/internals/controllers/fullscreen.d.ts +7 -23
- package/internals/controllers/fullscreen.js +3 -9
- package/internals/controllers/fullscreen.js.map +1 -1
- package/internals/controllers/gestures.d.ts +10 -29
- package/internals/controllers/gestures.js +1 -3
- package/internals/controllers/gestures.js.map +1 -1
- package/internals/controllers/group.d.ts +13 -30
- package/internals/controllers/group.js.map +1 -1
- package/internals/controllers/host-listeners.d.ts +28 -0
- package/internals/controllers/host-listeners.js +27 -0
- package/internals/controllers/host-listeners.js.map +1 -0
- package/internals/controllers/id-resolver.d.ts +8 -9
- package/internals/controllers/id-resolver.js +6 -14
- package/internals/controllers/id-resolver.js.map +1 -1
- package/internals/controllers/internals.d.ts +53 -104
- package/internals/controllers/internals.js +40 -13
- package/internals/controllers/internals.js.map +1 -1
- package/internals/controllers/key-bindings.d.ts +61 -158
- package/internals/controllers/key-bindings.js +68 -67
- package/internals/controllers/key-bindings.js.map +1 -1
- package/internals/controllers/keys.d.ts +32 -0
- package/internals/controllers/keys.js +20 -0
- package/internals/controllers/keys.js.map +1 -0
- package/internals/controllers/mutation-observer.d.ts +14 -37
- package/internals/controllers/mutation-observer.js +1 -1
- package/internals/controllers/mutation-observer.js.map +1 -1
- package/internals/controllers/resize-observer.d.ts +9 -19
- package/internals/controllers/resize-observer.js.map +1 -1
- package/internals/controllers/root-click.d.ts +11 -42
- package/internals/controllers/root-click.js +4 -6
- package/internals/controllers/root-click.js.map +1 -1
- package/internals/controllers/roving-focus.d.ts +16 -35
- package/internals/controllers/roving-focus.js.map +1 -1
- package/internals/controllers/slot.d.ts +25 -54
- package/internals/controllers/slot.js +6 -6
- package/internals/controllers/slot.js.map +1 -1
- package/internals/controllers/toggle.d.ts +44 -48
- package/internals/controllers/toggle.js.map +1 -1
- package/internals/date/compare.js.map +1 -1
- package/internals/date/converters.d.ts +10 -7
- package/internals/date/converters.js.map +1 -1
- package/internals/date/model.d.ts +9 -16
- package/internals/date/model.js +22 -25
- package/internals/date/model.js.map +1 -1
- package/internals/decorators/blazorAdditionalDependencies.d.ts +4 -2
- package/internals/decorators/blazorAdditionalDependencies.js.map +1 -1
- package/internals/decorators/blazorDeepImport.d.ts +1 -3
- package/internals/decorators/blazorDeepImport.js.map +1 -1
- package/internals/decorators/blazorInclude.d.ts +3 -2
- package/internals/decorators/blazorInclude.js.map +1 -1
- package/internals/decorators/blazorIndirectRender.d.ts +1 -3
- package/internals/decorators/blazorIndirectRender.js.map +1 -1
- package/internals/decorators/blazorSuppressComponent.d.ts +1 -3
- package/internals/decorators/blazorSuppressComponent.js.map +1 -1
- package/internals/decorators/coerced-property.d.ts +14 -20
- package/internals/decorators/coerced-property.js.map +1 -1
- package/internals/decorators/shadow-options.d.ts +2 -5
- package/internals/decorators/shadow-options.js.map +1 -1
- package/internals/definitions/defineAllComponents.js +6 -0
- package/internals/definitions/defineAllComponents.js.map +1 -1
- package/internals/directives/drag.d.ts +51 -81
- package/internals/directives/drag.js +27 -89
- package/internals/directives/drag.js.map +1 -1
- package/internals/directives/pointer-operation.d.ts +75 -0
- package/internals/directives/pointer-operation.js +92 -0
- package/internals/directives/pointer-operation.js.map +1 -0
- package/internals/directives/resize.d.ts +36 -64
- package/internals/directives/resize.js +18 -85
- package/internals/directives/resize.js.map +1 -1
- package/internals/i18n/EN/calendar.resources.d.ts +8 -2
- package/internals/i18n/EN/calendar.resources.js +2 -2
- package/internals/i18n/EN/calendar.resources.js.map +1 -1
- package/internals/i18n/EN/chat.resources.d.ts +8 -2
- package/internals/i18n/EN/chat.resources.js +3 -10
- package/internals/i18n/EN/chat.resources.js.map +1 -1
- package/internals/i18n/EN/date-picker.resources.d.ts +6 -4
- package/internals/i18n/EN/date-picker.resources.js +1 -7
- package/internals/i18n/EN/date-picker.resources.js.map +1 -1
- package/internals/i18n/EN/date-range-picker.resources.d.ts +9 -2
- package/internals/i18n/EN/date-range-picker.resources.js +2 -2
- package/internals/i18n/EN/date-range-picker.resources.js.map +1 -1
- package/internals/i18n/i18n-controller.d.ts +44 -46
- package/internals/i18n/i18n-controller.js +46 -33
- package/internals/i18n/i18n-controller.js.map +1 -1
- package/internals/i18n/utils.d.ts +9 -4
- package/internals/i18n/utils.js +4 -27
- package/internals/i18n/utils.js.map +1 -1
- package/internals/mixins/alert.d.ts +10 -25
- package/internals/mixins/alert.js.map +1 -1
- package/internals/mixins/combo-box.d.ts +21 -11
- package/internals/mixins/combo-box.js +16 -22
- package/internals/mixins/combo-box.js.map +1 -1
- package/internals/mixins/event-emitter.js +9 -11
- package/internals/mixins/event-emitter.js.map +1 -1
- package/internals/mixins/forms/associated-required.d.ts +4 -4
- package/internals/mixins/forms/associated-required.js.map +1 -1
- package/internals/mixins/forms/associated.d.ts +4 -2
- package/internals/mixins/forms/associated.js +8 -19
- package/internals/mixins/forms/associated.js.map +1 -1
- package/internals/mixins/forms/form-transformers.js.map +1 -1
- package/internals/mixins/forms/types.d.ts +24 -80
- package/internals/mixins/forms/types.js.map +1 -1
- package/internals/mixins/group.d.ts +18 -0
- package/internals/mixins/group.js +37 -0
- package/internals/mixins/group.js.map +1 -0
- package/internals/mixins/i18n.d.ts +10 -16
- package/internals/mixins/i18n.js.map +1 -1
- package/internals/mixins/mask-behavior.d.ts +8 -22
- package/internals/mixins/mask-behavior.js +1 -2
- package/internals/mixins/mask-behavior.js.map +1 -1
- package/internals/mixins/option.d.ts +1 -2
- package/internals/mixins/option.js +2 -1
- package/internals/mixins/option.js.map +1 -1
- package/internals/part-map.d.ts +4 -2
- package/internals/part-map.js +1 -1
- package/internals/part-map.js.map +1 -1
- package/internals/templates/input-shell.d.ts +8 -17
- package/internals/templates/input-shell.js +4 -1
- package/internals/templates/input-shell.js.map +1 -1
- package/internals/templates/masked-input.d.ts +7 -8
- package/internals/templates/masked-input.js.map +1 -1
- package/internals/templates/slotted-icon.d.ts +7 -12
- package/internals/templates/slotted-icon.js.map +1 -1
- package/internals/templates/toggle-shell.d.ts +6 -7
- package/internals/templates/toggle-shell.js.map +1 -1
- package/internals/timing.d.ts +5 -14
- package/internals/timing.js.map +1 -1
- package/internals/utils/arrays.d.ts +21 -21
- package/internals/utils/arrays.js +14 -0
- package/internals/utils/arrays.js.map +1 -1
- package/internals/utils/dom.d.ts +51 -39
- package/internals/utils/dom.js +1 -2
- package/internals/utils/dom.js.map +1 -1
- package/internals/utils/events.d.ts +29 -16
- package/internals/utils/events.js +9 -1
- package/internals/utils/events.js.map +1 -1
- package/internals/utils/lit.d.ts +5 -2
- package/internals/utils/lit.js.map +1 -1
- package/internals/utils/math.d.ts +8 -6
- package/internals/utils/math.js.map +1 -1
- package/internals/utils/objects.d.ts +3 -20
- package/internals/utils/objects.js +1 -39
- package/internals/utils/objects.js.map +1 -1
- package/internals/utils/strings.d.ts +9 -11
- package/internals/utils/strings.js.map +1 -1
- package/internals/utils/types.d.ts +16 -3
- package/internals/utils/types.js +3 -0
- package/internals/utils/types.js.map +1 -1
- package/internals/validators.d.ts +9 -8
- package/internals/validators.js +12 -6
- package/internals/validators.js.map +1 -1
- package/package.json +1 -1
- package/skills/README.md +3 -0
- package/skills/igniteui-wc-figma-to-app/SKILL.md +907 -0
- package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +363 -0
- package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +407 -0
- package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +325 -0
- package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +409 -0
- package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +376 -0
- package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +21 -0
- package/skills/igniteui-wc-integrate-with-framework/SKILL.md +4 -3
- package/skills/igniteui-wc-integrate-with-framework/references/vanilla-js.md +14 -0
- package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +12 -2
- package/theming/config.d.ts +14 -5
- package/theming/config.js +38 -18
- package/theming/config.js.map +1 -1
- package/theming/context.d.ts +1 -23
- package/theming/context.js.map +1 -1
- package/theming/theming-controller.d.ts +2 -32
- package/theming/theming-controller.js +15 -21
- package/theming/theming-controller.js.map +1 -1
- package/theming/theming-event.d.ts +0 -7
- package/theming/theming-event.js +0 -13
- package/theming/theming-event.js.map +1 -1
- package/theming/types.d.ts +1 -8
- package/theming/types.js.map +1 -1
- package/web-types.json +3 -3
- package/animations/presets/slide/index.d.ts +0 -3
- package/animations/presets/slide/index.js +0 -16
- package/animations/presets/slide/index.js.map +0 -1
- package/internals/controllers/root-scroll.d.ts +0 -31
- package/internals/controllers/root-scroll.js +0 -71
- package/internals/controllers/root-scroll.js.map +0 -1
- package/theming/utils.d.ts +0 -11
- package/theming/utils.js +0 -20
- package/theming/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-ring.js","sourceRoot":"","sources":["../../../src/internals/controllers/focus-ring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"focus-ring.js","sourceRoot":"","sources":["../../../src/internals/controllers/focus-ring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,2BAA2B;aACP,YAAO,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAU,AAA9C,CAA+C;IAM9E,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,YAAY,IAA0C;QAP9C,uBAAkB,GAAG,KAAK,CAAC;QAQjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,gBAAgB,CAAC,IAAI,EAAE;YACrB,MAAM,EAAE,2BAA2B,CAAC,OAAO;YAC3C,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;IAGM,WAAW,CAAC,KAAY;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAEvC,IAAI,OAAO,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;;AAcH,MAAM,UAAU,oBAAoB,CAClC,IAA0C;IAE1C,OAAO,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import type { ReactiveControllerHost } from 'lit';\nimport { addHostListeners } from './host-listeners.js';\n\n/** Tracks the keyboard focus state. See {@link addKeyboardFocusRing}. */\nclass KeyboardFocusRingController {\n private static readonly _events = ['keyup', 'focusout', 'pointerup'] as const;\n\n private readonly _host: ReactiveControllerHost & HTMLElement;\n private _isKeyboardFocused = false;\n\n /** Whether a keyboard interaction activated the current focus state. */\n public get focused(): boolean {\n return this._isKeyboardFocused;\n }\n\n constructor(host: ReactiveControllerHost & HTMLElement) {\n this._host = host;\n\n addHostListeners(host, {\n events: KeyboardFocusRingController._events,\n listener: this,\n options: { passive: true },\n });\n }\n\n /** @internal */\n public handleEvent(event: Event): void {\n const focused = event.type === 'keyup';\n\n if (focused !== this._isKeyboardFocused) {\n this._isKeyboardFocused = focused;\n this._host.requestUpdate();\n }\n }\n}\n\nexport type { KeyboardFocusRingController };\n\n/**\n * Adds a controller that reports whether the host has focus from the\n * keyboard. A component shows its focus ring only in that condition.\n *\n * @remarks\n * Use it for an atomic component, such as a button or a form field. A\n * composite component or a layout needs ARIA attributes, a managed\n * `tabindex`, or an implementation of its own.\n */\nexport function addKeyboardFocusRing(\n host: ReactiveControllerHost & HTMLElement\n): KeyboardFocusRingController {\n return new KeyboardFocusRingController(host);\n}\n"]}
|
|
@@ -1,41 +1,25 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ReactiveControllerHost } from 'lit';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The callback is passed the current fullscreen `state`.
|
|
6
|
-
* Returning a falsy value from the callback will stop the current fullscreen state change.
|
|
3
|
+
* Runs before the host enters or leaves fullscreen mode, with the requested
|
|
4
|
+
* `state`. A falsy return value stops the change.
|
|
7
5
|
*/
|
|
8
6
|
type FullscreenControllerCallback = (state: boolean) => boolean;
|
|
9
|
-
/** Configuration object for the fullscreen controller. */
|
|
10
7
|
type FullscreenControllerConfiguration = {
|
|
11
|
-
/**
|
|
12
|
-
* Invoked when the host element is entering fullscreen mode.
|
|
13
|
-
* See the {@link FullscreenControllerCallback} for details.
|
|
14
|
-
*/
|
|
8
|
+
/** Runs before the host enters fullscreen mode. */
|
|
15
9
|
enter?: FullscreenControllerCallback;
|
|
16
|
-
/**
|
|
17
|
-
* Invoked when the host element is leaving fullscreen mode.
|
|
18
|
-
* See the {@link FullscreenControllerCallback} for details.
|
|
19
|
-
*/
|
|
10
|
+
/** Runs before the host leaves fullscreen mode. */
|
|
20
11
|
exit?: FullscreenControllerCallback;
|
|
21
12
|
};
|
|
22
|
-
declare class FullscreenController
|
|
13
|
+
declare class FullscreenController {
|
|
23
14
|
private _host;
|
|
24
15
|
private _options;
|
|
25
16
|
private _fullscreen;
|
|
26
17
|
get fullscreen(): boolean;
|
|
27
18
|
constructor(host: ReactiveControllerHost & HTMLElement, options?: FullscreenControllerConfiguration);
|
|
28
|
-
/**
|
|
29
|
-
* Transitions the host element to/from fullscreen mode.
|
|
30
|
-
* This method **will invoke** enter/exit callbacks if present.
|
|
31
|
-
*/
|
|
19
|
+
/** Moves the host element into or out of fullscreen mode. */
|
|
32
20
|
setState(fullscreen: boolean): void;
|
|
33
21
|
/** @internal */
|
|
34
22
|
handleEvent(): void;
|
|
35
|
-
/** @internal */
|
|
36
|
-
hostConnected(): void;
|
|
37
|
-
/** @internal */
|
|
38
|
-
hostDisconnected(): void;
|
|
39
23
|
}
|
|
40
24
|
export declare function addFullscreenController(host: ReactiveControllerHost & HTMLElement, options?: FullscreenControllerConfiguration): FullscreenController;
|
|
41
25
|
export {};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { addHostListeners } from './host-listeners.js';
|
|
1
2
|
class FullscreenController {
|
|
2
3
|
get fullscreen() {
|
|
3
4
|
return this._fullscreen;
|
|
4
5
|
}
|
|
5
6
|
constructor(host, options) {
|
|
6
|
-
this._options = {};
|
|
7
7
|
this._fullscreen = false;
|
|
8
8
|
this._host = host;
|
|
9
|
-
|
|
10
|
-
host
|
|
9
|
+
this._options = { ...options };
|
|
10
|
+
addHostListeners(host, { events: ['fullscreenchange'], listener: this });
|
|
11
11
|
}
|
|
12
12
|
setState(fullscreen) {
|
|
13
13
|
const callback = fullscreen ? this._options.enter : this._options.exit;
|
|
@@ -30,12 +30,6 @@ class FullscreenController {
|
|
|
30
30
|
this.setState(false);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
hostConnected() {
|
|
34
|
-
this._host.addEventListener('fullscreenchange', this);
|
|
35
|
-
}
|
|
36
|
-
hostDisconnected() {
|
|
37
|
-
this._host.removeEventListener('fullscreenchange', this);
|
|
38
|
-
}
|
|
39
33
|
}
|
|
40
34
|
export function addFullscreenController(host, options) {
|
|
41
35
|
return new FullscreenController(host, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullscreen.js","sourceRoot":"","sources":["../../../src/internals/controllers/fullscreen.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fullscreen.js","sourceRoot":"","sources":["../../../src/internals/controllers/fullscreen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAevD,MAAM,oBAAoB;IAMxB,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,YACE,IAA0C,EAC1C,OAA2C;QARrC,gBAAW,GAAG,KAAK,CAAC;QAU1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAE/B,gBAAgB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAGM,QAAQ,CAAC,UAAmB;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEvE,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAE9B,IAAI,UAAU,EAAE,CAAC;YAGf,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACtC,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAGM,WAAW;QAChB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CACrC,IAA0C,EAC1C,OAA2C;IAE3C,OAAO,IAAI,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC","sourcesContent":["import type { ReactiveControllerHost } from 'lit';\nimport { addHostListeners } from './host-listeners.js';\n\n/**\n * Runs before the host enters or leaves fullscreen mode, with the requested\n * `state`. A falsy return value stops the change.\n */\ntype FullscreenControllerCallback = (state: boolean) => boolean;\n\ntype FullscreenControllerConfiguration = {\n /** Runs before the host enters fullscreen mode. */\n enter?: FullscreenControllerCallback;\n /** Runs before the host leaves fullscreen mode. */\n exit?: FullscreenControllerCallback;\n};\n\nclass FullscreenController {\n private _host: ReactiveControllerHost & HTMLElement;\n private _options: FullscreenControllerConfiguration;\n\n private _fullscreen = false;\n\n public get fullscreen(): boolean {\n return this._fullscreen;\n }\n\n constructor(\n host: ReactiveControllerHost & HTMLElement,\n options?: FullscreenControllerConfiguration\n ) {\n this._host = host;\n this._options = { ...options };\n\n addHostListeners(host, { events: ['fullscreenchange'], listener: this });\n }\n\n /** Moves the host element into or out of fullscreen mode. */\n public setState(fullscreen: boolean): void {\n const callback = fullscreen ? this._options.enter : this._options.exit;\n\n if (callback && !callback.call(this._host, fullscreen)) {\n return;\n }\n\n this._fullscreen = fullscreen;\n\n if (fullscreen) {\n // The request rejects without user activation, or for an element that\n // cannot go fullscreen. The state then rolls back.\n this._host.requestFullscreen().catch(() => {\n this._fullscreen = false;\n this._host.requestUpdate();\n });\n } else if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n }\n }\n\n /** @internal */\n public handleEvent(): void {\n if (!document.fullscreenElement && this._fullscreen) {\n this.setState(false);\n }\n }\n}\n\nexport function addFullscreenController(\n host: ReactiveControllerHost & HTMLElement,\n options?: FullscreenControllerConfiguration\n): FullscreenController {\n return new FullscreenController(host, options);\n}\n"]}
|
|
@@ -1,28 +1,16 @@
|
|
|
1
1
|
import type { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
2
|
import type { Ref } from 'lit/directives/ref.js';
|
|
3
|
-
/**
|
|
4
|
-
* Configuration object for a {@link GesturesController} instance.
|
|
5
|
-
* @hidden
|
|
6
|
-
*/
|
|
3
|
+
/** @hidden */
|
|
7
4
|
export interface GesturesOptions {
|
|
8
5
|
/**
|
|
9
|
-
*
|
|
10
|
-
* If you pass a `ref`, you can limit the observation to a certain DOM part of the host scope.
|
|
6
|
+
* The element that the controller observes. Defaults to the host element.
|
|
11
7
|
*/
|
|
12
8
|
ref?: Ref<HTMLElement>;
|
|
13
|
-
/**
|
|
14
|
-
* The maximum amount of milliseconds between the start and end of a gesture combination
|
|
15
|
-
* before it is recognized as such.
|
|
16
|
-
*/
|
|
9
|
+
/** The maximum time in milliseconds of a recognized gesture. */
|
|
17
10
|
thresholdTime?: number;
|
|
18
|
-
/**
|
|
19
|
-
* The minimum amount a "pointer" should travel in pixels, before being recognized as a
|
|
20
|
-
* gesture.
|
|
21
|
-
*/
|
|
11
|
+
/** The minimum pointer travel in pixels of a recognized gesture. */
|
|
22
12
|
thresholdDistance?: number;
|
|
23
|
-
/**
|
|
24
|
-
* When enabled, the controller will skip events generated by a mouse device.
|
|
25
|
-
*/
|
|
13
|
+
/** Whether the controller ignores the events of a mouse device. */
|
|
26
14
|
touchOnly?: boolean;
|
|
27
15
|
}
|
|
28
16
|
type GestureDirection = 'left' | 'up' | 'right' | 'down';
|
|
@@ -37,22 +25,19 @@ export type GestureData = {
|
|
|
37
25
|
};
|
|
38
26
|
export declare class SwipeEvent extends Event {
|
|
39
27
|
readonly data: GestureData;
|
|
40
|
-
readonly name: string;
|
|
41
28
|
constructor(name: string, data: GestureData, initOptions?: EventInit);
|
|
42
29
|
}
|
|
43
30
|
declare class GesturesController extends EventTarget implements ReactiveController {
|
|
44
31
|
private readonly _host;
|
|
45
32
|
private readonly _ref?;
|
|
46
33
|
private readonly _abortHandle;
|
|
34
|
+
/** The options of the controller, with the defaults applied. */
|
|
47
35
|
private _options;
|
|
48
36
|
private _pointerState;
|
|
49
|
-
|
|
50
|
-
/** Get the current configuration object */
|
|
37
|
+
private get _element();
|
|
51
38
|
get options(): GesturesOptions;
|
|
52
39
|
constructor(host: ReactiveControllerHost & HTMLElement, options?: GesturesOptions);
|
|
53
|
-
/**
|
|
54
|
-
* Add an event listener for a given swipe event.
|
|
55
|
-
*/
|
|
40
|
+
/** Adds an event listener for the given swipe event. */
|
|
56
41
|
set(type: SwipeEvents, callback: (event: SwipeEvent) => void, options?: AddEventListenerOptions): this;
|
|
57
42
|
/** @internal */
|
|
58
43
|
handleEvent(event: PointerEvent): void;
|
|
@@ -60,7 +45,6 @@ declare class GesturesController extends EventTarget implements ReactiveControll
|
|
|
60
45
|
hostConnected(): void;
|
|
61
46
|
/** @internal */
|
|
62
47
|
hostDisconnected(): void;
|
|
63
|
-
/** Updates the configuration of the controller */
|
|
64
48
|
updateOptions(options: Omit<GesturesOptions, 'ref'>): void;
|
|
65
49
|
private _getGestureState;
|
|
66
50
|
private _setTouchActionState;
|
|
@@ -70,12 +54,9 @@ declare class GesturesController extends EventTarget implements ReactiveControll
|
|
|
70
54
|
private _handlePointerMove;
|
|
71
55
|
private _emit;
|
|
72
56
|
private _createEventArgs;
|
|
73
|
-
|
|
57
|
+
private _recognize;
|
|
74
58
|
private _handleLostPointerCapture;
|
|
75
59
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Adds a {@link GesturesController} responsible for managing gesture behaviors
|
|
78
|
-
* for the given host element.
|
|
79
|
-
*/
|
|
60
|
+
/** Creates a {@link GesturesController} and adds it to `host`. */
|
|
80
61
|
export declare function addGesturesController(host: ReactiveControllerHost & HTMLElement, options?: GesturesOptions): GesturesController;
|
|
81
62
|
export {};
|
|
@@ -9,7 +9,6 @@ const defaultState = Object.freeze({ x: 0, y: 0, time: 0 });
|
|
|
9
9
|
export class SwipeEvent extends Event {
|
|
10
10
|
constructor(name, data, initOptions) {
|
|
11
11
|
super(name, initOptions);
|
|
12
|
-
this.name = name;
|
|
13
12
|
this.data = data;
|
|
14
13
|
}
|
|
15
14
|
}
|
|
@@ -118,11 +117,10 @@ class GesturesController extends EventTarget {
|
|
|
118
117
|
}
|
|
119
118
|
_recognize() {
|
|
120
119
|
const { start, current } = this._pointerState;
|
|
120
|
+
const { thresholdTime: time, thresholdDistance: distance } = this._options;
|
|
121
121
|
const dt = current.time - start.time;
|
|
122
122
|
const dx = current.x - start.x;
|
|
123
123
|
const dy = current.y - start.y;
|
|
124
|
-
const time = this._options.thresholdTime ?? 500;
|
|
125
|
-
const distance = this._options.thresholdDistance ?? 100;
|
|
126
124
|
if (dt > time) {
|
|
127
125
|
return false;
|
|
128
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gestures.js","sourceRoot":"","sources":["../../../src/internals/controllers/gestures.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,MAAM,GAAG;IACb,aAAa;IACb,aAAa;IACb,oBAAoB;IACpB,eAAe;CACP,CAAC;AACX,MAAM,YAAY,GAAiB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAoD1E,MAAM,OAAO,UAAW,SAAQ,KAAK;IAInC,YAAY,IAAY,EAAE,IAAiB,EAAE,WAAuB;QAClE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,kBAAmB,SAAQ,WAAW;IAiB1C,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACnD,CAAC;IAGD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,YACE,IAA0C,EAC1C,OAAyB;QAEzB,KAAK,EAAE,CAAC;QA3BO,iBAAY,GAAG,iBAAiB,EAAE,CAAC;QAE5C,aAAQ,GAAoB;YAClC,iBAAiB,EAAE,GAAG;YACtB,aAAa,EAAE,GAAG;YAClB,SAAS,EAAE,KAAK;SACjB,CAAC;QAEM,kBAAa,GAAG;YACtB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,YAAY;SACtB,CAAC;QAiBA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAE9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAKM,GAAG,CACR,IAAiB,EACjB,QAAqC,EACrC,OAAiC;QAEjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAkB,CAAC;QAEzD,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAGM,WAAW,CAAC,KAAmB;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,aAAa;gBAChB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,oBAAoB,CAAC;YAC1B,KAAK,eAAe;gBAClB,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAGM,aAAa;QAClB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;QAErC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YAClC,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAGM,gBAAgB;QACrB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAGM,aAAa,CAAC,OAAqC;QACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAEO,gBAAgB,CAAC,EACvB,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,CAAC,GACG;QACb,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACpC,CAAC;IAEO,oBAAoB,CAAC,QAAiB;QAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,YAAY,CAAC;IAC5C,CAAC;IAEO,uBAAuB,CAAC,KAAmB,EAAE,KAAc;QACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,KAAK,CAAC;QACpC,KAAK;YACH,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;YAClD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAEO,kBAAkB,CAAC,KAAmB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE3C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAGhC,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAEO,kBAAkB,CAAC,KAAmB;QAC5C,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAiB,EAAE,IAAiB;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAEO,gBAAgB;QACtB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAE9C,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,CAAC;YACf,IAAI,EAAE,OAAO,CAAC,CAAC;YACf,MAAM,EAAE,KAAK,CAAC,CAAC;YACf,IAAI,EAAE,OAAO,CAAC,CAAC;SAChB,CAAC;IACJ,CAAC;IAES,UAAU;QAClB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAE9C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACrC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,GAAG,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,GAAG,CAAC;QAExD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC7C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC9C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC7C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,yBAAyB,CAAC,KAAmB;QACnD,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAEhC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAgB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAC/D,IAAI,EAAE,KAAK,CAAC,WAAW;gBACvB,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF;AAMD,MAAM,UAAU,qBAAqB,CACnC,IAA0C,EAC1C,OAAyB;IAEzB,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { Ref } from 'lit/directives/ref.js';\nimport { createAbortHandle } from '../abort-handler.js';\n\nconst Events = [\n 'pointerdown',\n 'pointermove',\n 'lostpointercapture',\n 'pointercancel',\n] as const;\nconst defaultState: GestureState = Object.freeze({ x: 0, y: 0, time: 0 });\n\n/**\n * Configuration object for a {@link GesturesController} instance.\n * @hidden\n */\nexport interface GesturesOptions {\n /**\n * By default, the controller listens for pointer/touch events in the context of the host element.\n * If you pass a `ref`, you can limit the observation to a certain DOM part of the host scope.\n */\n ref?: Ref<HTMLElement>;\n /**\n * The maximum amount of milliseconds between the start and end of a gesture combination\n * before it is recognized as such.\n */\n thresholdTime?: number;\n /**\n * The minimum amount a \"pointer\" should travel in pixels, before being recognized as a\n * gesture.\n */\n thresholdDistance?: number;\n /**\n * When enabled, the controller will skip events generated by a mouse device.\n */\n touchOnly?: boolean;\n}\n\ntype GestureState = {\n x: number;\n y: number;\n time: number;\n};\n\ntype GestureDirection = 'left' | 'up' | 'right' | 'down';\ntype SwipeEvents =\n | 'swipe'\n | 'swipe-left'\n | 'swipe-up'\n | 'swipe-right'\n | 'swipe-down';\n\nexport type GestureData = {\n direction: GestureDirection;\n type: string;\n xStart: number;\n xEnd: number;\n yStart: number;\n yEnd: number;\n};\n\n/* blazorSuppress */\nexport class SwipeEvent extends Event {\n public readonly data: GestureData;\n public readonly name: string;\n\n constructor(name: string, data: GestureData, initOptions?: EventInit) {\n super(name, initOptions);\n this.name = name;\n this.data = data;\n }\n}\n\nclass GesturesController extends EventTarget implements ReactiveController {\n private readonly _host: ReactiveControllerHost & HTMLElement;\n private readonly _ref?: Ref<HTMLElement>;\n private readonly _abortHandle = createAbortHandle();\n\n private _options: GesturesOptions = {\n thresholdDistance: 100,\n thresholdTime: 500,\n touchOnly: false,\n };\n\n private _pointerState = {\n captured: false,\n start: defaultState,\n current: defaultState,\n };\n\n protected get _element() {\n return this._ref ? this._ref.value! : this._host;\n }\n\n /** Get the current configuration object */\n public get options(): GesturesOptions {\n return this._options;\n }\n\n constructor(\n host: ReactiveControllerHost & HTMLElement,\n options?: GesturesOptions\n ) {\n super();\n\n Object.assign(this._options, options);\n this._ref = this._options.ref;\n\n this._host = host;\n this._host.addController(this);\n }\n\n /**\n * Add an event listener for a given swipe event.\n */\n public set(\n type: SwipeEvents,\n callback: (event: SwipeEvent) => void,\n options?: AddEventListenerOptions\n ): this {\n const bound = callback.bind(this._host) as EventListener;\n\n this.addEventListener(type, bound, options);\n return this;\n }\n\n /** @internal */\n public handleEvent(event: PointerEvent): void {\n if (this._options.touchOnly && event.pointerType === 'mouse') {\n return;\n }\n\n switch (event.type) {\n case 'pointerdown':\n this._handlePointerDown(event);\n break;\n case 'pointermove':\n this._handlePointerMove(event);\n break;\n case 'lostpointercapture':\n case 'pointercancel':\n this._handleLostPointerCapture(event);\n }\n }\n\n /** @internal */\n public hostConnected(): void {\n const { signal } = this._abortHandle;\n\n this._host.updateComplete.then(() => {\n if (signal.aborted || !this._element) {\n return;\n }\n\n for (const event of Events) {\n this._element.addEventListener(event, this, { passive: true, signal });\n }\n });\n }\n\n /** @internal */\n public hostDisconnected(): void {\n this._abortHandle.abort();\n }\n\n /** Updates the configuration of the controller */\n public updateOptions(options: Omit<GesturesOptions, 'ref'>): void {\n Object.assign(this._options, options);\n }\n\n private _getGestureState({\n clientX: x,\n clientY: y,\n }: PointerEvent): GestureState {\n return { x, y, time: Date.now() };\n }\n\n private _setTouchActionState(disabled: boolean) {\n this._element.style.touchAction = disabled ? 'none' : '';\n }\n\n private _resetState() {\n this._pointerState.start = defaultState;\n this._pointerState.current = defaultState;\n }\n\n private _setPointerCaptureState(event: PointerEvent, state: boolean) {\n this._pointerState.captured = state;\n state\n ? this._element.setPointerCapture(event.pointerId)\n : this._element.releasePointerCapture(event.pointerId);\n }\n\n private _handlePointerDown(event: PointerEvent) {\n const state = this._getGestureState(event);\n\n this._setTouchActionState(true);\n // Seeded so that a press without any movement resolves to a zero delta\n // instead of being measured against the zeroed default state.\n this._pointerState.start = state;\n this._pointerState.current = state;\n this._setPointerCaptureState(event, true);\n }\n\n private _handlePointerMove(event: PointerEvent) {\n if (this._pointerState.captured) {\n this._pointerState.current = this._getGestureState(event);\n }\n }\n\n private _emit(name: SwipeEvents, data: GestureData) {\n return this.dispatchEvent(new SwipeEvent(name, data));\n }\n\n private _createEventArgs() {\n const { start, current } = this._pointerState;\n\n return {\n xStart: start.x,\n xEnd: current.x,\n yStart: start.y,\n yEnd: current.y,\n };\n }\n\n protected _recognize(): GestureDirection | false {\n const { start, current } = this._pointerState;\n\n const dt = current.time - start.time;\n const dx = current.x - start.x;\n const dy = current.y - start.y;\n\n const time = this._options.thresholdTime ?? 500;\n const distance = this._options.thresholdDistance ?? 100;\n\n if (dt > time) {\n return false;\n }\n\n if (dx > distance && Math.abs(dy) < distance) {\n return 'right';\n }\n\n if (-dx > distance && Math.abs(dy) < distance) {\n return 'left';\n }\n\n if (dy > distance && Math.abs(dx) < distance) {\n return 'down';\n }\n\n if (-dy > distance && Math.abs(dx) < distance) {\n return 'up';\n }\n\n return false;\n }\n\n private _handleLostPointerCapture(event: PointerEvent) {\n this._setPointerCaptureState(event, false);\n const state = this._recognize();\n\n if (state) {\n const args: GestureData = Object.assign(this._createEventArgs(), {\n type: event.pointerType,\n direction: state,\n });\n\n this._emit('swipe', args);\n this._emit(`swipe-${state}`, args);\n }\n\n this._resetState();\n this._setTouchActionState(false);\n }\n}\n\n/**\n * Adds a {@link GesturesController} responsible for managing gesture behaviors\n * for the given host element.\n */\nexport function addGesturesController(\n host: ReactiveControllerHost & HTMLElement,\n options?: GesturesOptions\n) {\n return new GesturesController(host, options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gestures.js","sourceRoot":"","sources":["../../../src/internals/controllers/gestures.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { Ref } from 'lit/directives/ref.js';\nimport { createAbortHandle } from '../abort-handler.js';\n\nconst Events = [\n 'pointerdown',\n 'pointermove',\n 'lostpointercapture',\n 'pointercancel',\n] as const;\nconst defaultState: GestureState = Object.freeze({ x: 0, y: 0, time: 0 });\n\n/** @hidden */\nexport interface GesturesOptions {\n /**\n * The element that the controller observes. Defaults to the host element.\n */\n ref?: Ref<HTMLElement>;\n /** The maximum time in milliseconds of a recognized gesture. */\n thresholdTime?: number;\n /** The minimum pointer travel in pixels of a recognized gesture. */\n thresholdDistance?: number;\n /** Whether the controller ignores the events of a mouse device. */\n touchOnly?: boolean;\n}\n\ntype ResolvedGesturesOptions = GesturesOptions &\n Required<\n Pick<GesturesOptions, 'thresholdTime' | 'thresholdDistance' | 'touchOnly'>\n >;\n\ntype GestureState = {\n x: number;\n y: number;\n time: number;\n};\n\ntype GestureDirection = 'left' | 'up' | 'right' | 'down';\ntype SwipeEvents =\n | 'swipe'\n | 'swipe-left'\n | 'swipe-up'\n | 'swipe-right'\n | 'swipe-down';\n\nexport type GestureData = {\n direction: GestureDirection;\n type: string;\n xStart: number;\n xEnd: number;\n yStart: number;\n yEnd: number;\n};\n\n/* blazorSuppress */\nexport class SwipeEvent extends Event {\n public readonly data: GestureData;\n\n constructor(name: string, data: GestureData, initOptions?: EventInit) {\n super(name, initOptions);\n this.data = data;\n }\n}\n\nclass GesturesController extends EventTarget implements ReactiveController {\n private readonly _host: ReactiveControllerHost & HTMLElement;\n private readonly _ref?: Ref<HTMLElement>;\n private readonly _abortHandle = createAbortHandle();\n\n /** The options of the controller, with the defaults applied. */\n private _options: ResolvedGesturesOptions = {\n thresholdDistance: 100,\n thresholdTime: 500,\n touchOnly: false,\n };\n\n private _pointerState = {\n captured: false,\n start: defaultState,\n current: defaultState,\n };\n\n private get _element() {\n return this._ref ? this._ref.value! : this._host;\n }\n\n public get options(): GesturesOptions {\n return this._options;\n }\n\n constructor(\n host: ReactiveControllerHost & HTMLElement,\n options?: GesturesOptions\n ) {\n super();\n\n Object.assign(this._options, options);\n this._ref = this._options.ref;\n\n this._host = host;\n this._host.addController(this);\n }\n\n /** Adds an event listener for the given swipe event. */\n public set(\n type: SwipeEvents,\n callback: (event: SwipeEvent) => void,\n options?: AddEventListenerOptions\n ): this {\n const bound = callback.bind(this._host) as EventListener;\n\n this.addEventListener(type, bound, options);\n return this;\n }\n\n /** @internal */\n public handleEvent(event: PointerEvent): void {\n if (this._options.touchOnly && event.pointerType === 'mouse') {\n return;\n }\n\n switch (event.type) {\n case 'pointerdown':\n this._handlePointerDown(event);\n break;\n case 'pointermove':\n this._handlePointerMove(event);\n break;\n case 'lostpointercapture':\n case 'pointercancel':\n this._handleLostPointerCapture(event);\n }\n }\n\n /** @internal */\n public hostConnected(): void {\n const { signal } = this._abortHandle;\n\n this._host.updateComplete.then(() => {\n if (signal.aborted || !this._element) {\n return;\n }\n\n for (const event of Events) {\n this._element.addEventListener(event, this, { passive: true, signal });\n }\n });\n }\n\n /** @internal */\n public hostDisconnected(): void {\n this._abortHandle.abort();\n }\n\n public updateOptions(options: Omit<GesturesOptions, 'ref'>): void {\n Object.assign(this._options, options);\n }\n\n private _getGestureState({\n clientX: x,\n clientY: y,\n }: PointerEvent): GestureState {\n return { x, y, time: Date.now() };\n }\n\n private _setTouchActionState(disabled: boolean) {\n this._element.style.touchAction = disabled ? 'none' : '';\n }\n\n private _resetState() {\n this._pointerState.start = defaultState;\n this._pointerState.current = defaultState;\n }\n\n private _setPointerCaptureState(event: PointerEvent, state: boolean) {\n this._pointerState.captured = state;\n state\n ? this._element.setPointerCapture(event.pointerId)\n : this._element.releasePointerCapture(event.pointerId);\n }\n\n private _handlePointerDown(event: PointerEvent) {\n const state = this._getGestureState(event);\n\n this._setTouchActionState(true);\n // Seed both, so a press without movement gives a zero delta.\n this._pointerState.start = state;\n this._pointerState.current = state;\n this._setPointerCaptureState(event, true);\n }\n\n private _handlePointerMove(event: PointerEvent) {\n if (this._pointerState.captured) {\n this._pointerState.current = this._getGestureState(event);\n }\n }\n\n private _emit(name: SwipeEvents, data: GestureData) {\n return this.dispatchEvent(new SwipeEvent(name, data));\n }\n\n private _createEventArgs() {\n const { start, current } = this._pointerState;\n\n return {\n xStart: start.x,\n xEnd: current.x,\n yStart: start.y,\n yEnd: current.y,\n };\n }\n\n private _recognize(): GestureDirection | false {\n const { start, current } = this._pointerState;\n const { thresholdTime: time, thresholdDistance: distance } = this._options;\n\n const dt = current.time - start.time;\n const dx = current.x - start.x;\n const dy = current.y - start.y;\n\n if (dt > time) {\n return false;\n }\n\n if (dx > distance && Math.abs(dy) < distance) {\n return 'right';\n }\n\n if (-dx > distance && Math.abs(dy) < distance) {\n return 'left';\n }\n\n if (dy > distance && Math.abs(dx) < distance) {\n return 'down';\n }\n\n if (-dy > distance && Math.abs(dx) < distance) {\n return 'up';\n }\n\n return false;\n }\n\n private _handleLostPointerCapture(event: PointerEvent) {\n this._setPointerCaptureState(event, false);\n const state = this._recognize();\n\n if (state) {\n const args: GestureData = Object.assign(this._createEventArgs(), {\n type: event.pointerType,\n direction: state,\n });\n\n this._emit('swipe', args);\n this._emit(`swipe-${state}`, args);\n }\n\n this._resetState();\n this._setTouchActionState(false);\n }\n}\n\n/** Creates a {@link GesturesController} and adds it to `host`. */\nexport function addGesturesController(\n host: ReactiveControllerHost & HTMLElement,\n options?: GesturesOptions\n) {\n return new GesturesController(host, options);\n}\n"]}
|
|
@@ -1,53 +1,36 @@
|
|
|
1
1
|
import type { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
2
2
|
type GroupHost = ReactiveControllerHost & Element;
|
|
3
|
-
/** The
|
|
3
|
+
/** The identity of a group: a root node or a container element. */
|
|
4
4
|
type GroupScope = object;
|
|
5
5
|
type GroupRegistryConfig<T extends GroupHost, S> = {
|
|
6
|
-
/**
|
|
7
|
-
* The group key of a host. Together with the scope it forms the identity of
|
|
8
|
-
* a group. A host with an empty key stays on its own.
|
|
9
|
-
*/
|
|
6
|
+
/** The group key of a host. An empty key leaves the host on its own. */
|
|
10
7
|
keyOf: (host: T) => string;
|
|
11
|
-
/**
|
|
12
|
-
* Derives the group-wide state that each member receives on sync, from the
|
|
13
|
-
* current members of the group.
|
|
14
|
-
*/
|
|
8
|
+
/** Derives the state that each member receives on a sync. */
|
|
15
9
|
deriveState: (members: T[]) => S;
|
|
16
|
-
/**
|
|
17
|
-
* The scope the group identity is bound to. Defaults to the host's root
|
|
18
|
-
* node (document or shadow root).
|
|
19
|
-
*/
|
|
10
|
+
/** The scope of the group identity. Defaults to the host root node. */
|
|
20
11
|
scopeOf?: (host: T) => GroupScope;
|
|
21
12
|
};
|
|
22
|
-
/** The membership of one host,
|
|
13
|
+
/** The membership of one host, added to it as a reactive controller. */
|
|
23
14
|
interface GroupMemberController<T extends GroupHost> extends ReactiveController {
|
|
24
|
-
/** The hosts of
|
|
15
|
+
/** The hosts of the group, in DOM order. A lone host gets its own group. */
|
|
25
16
|
readonly members: T[];
|
|
26
|
-
/**
|
|
27
|
-
* Moves the host to the group of its current scope and key. Does nothing
|
|
28
|
-
* while both stay the same. If not, the group that the host joins and the
|
|
29
|
-
* group that it leaves both update their state.
|
|
30
|
-
*/
|
|
17
|
+
/** Moves the host to the group of its scope and key, and syncs both. */
|
|
31
18
|
updateMembership(): void;
|
|
32
|
-
/** Updates the state of the host group. */
|
|
33
19
|
sync(): void;
|
|
34
20
|
}
|
|
35
21
|
interface GroupRegistry<T extends GroupHost, S> {
|
|
36
|
-
/** Creates
|
|
22
|
+
/** Creates a membership controller and adds it to the host. */
|
|
37
23
|
attach(host: T, onSync: (state: S) => void): GroupMemberController<T>;
|
|
38
24
|
/** Returns the hosts of the group of `member`, in DOM order. */
|
|
39
25
|
membersOf(member: T): T[];
|
|
40
26
|
}
|
|
41
27
|
/**
|
|
42
|
-
* Creates a registry of groups
|
|
43
|
-
* shared scope and key instead of a common parent element - the way native
|
|
44
|
-
* radio buttons group by their `name` within a form root.
|
|
28
|
+
* Creates a registry of groups.
|
|
45
29
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* One registry holds one kind of group; create it at module level:
|
|
30
|
+
* @remarks
|
|
31
|
+
* Members find each other through a shared scope and key, as native radio
|
|
32
|
+
* buttons group by `name` in a form root. Create one registry per kind of
|
|
33
|
+
* group, at module level.
|
|
51
34
|
*
|
|
52
35
|
* @example
|
|
53
36
|
* ```typescript
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../src/internals/controllers/group.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { isEmpty } from '../utils/arrays.js';\nimport { getRoot } from '../utils/dom.js';\n\ntype GroupHost = ReactiveControllerHost & Element;\n\n/** The object a group's identity is bound to - a root node, a container element. */\ntype GroupScope = object;\n\ntype GroupRegistryConfig<T extends GroupHost, S> = {\n /**\n * The group key of a host. Together with the scope it forms the identity of\n * a group. A host with an empty key stays on its own.\n */\n keyOf: (host: T) => string;\n /**\n * Derives the group-wide state that each member receives on sync, from the\n * current members of the group.\n */\n deriveState: (members: T[]) => S;\n /**\n * The scope the group identity is bound to. Defaults to the host's root\n * node (document or shadow root).\n */\n scopeOf?: (host: T) => GroupScope;\n};\n\n/** The membership of one host, attached to it as a reactive controller. */\ninterface GroupMemberController<\n T extends GroupHost,\n> extends ReactiveController {\n /** The hosts of this member's group, in DOM order. A host with no group is on its own. */\n readonly members: T[];\n /**\n * Moves the host to the group of its current scope and key. Does nothing\n * while both stay the same. If not, the group that the host joins and the\n * group that it leaves both update their state.\n */\n updateMembership(): void;\n /** Updates the state of the host group. */\n sync(): void;\n}\n\ninterface GroupRegistry<T extends GroupHost, S> {\n /** Creates and attaches a membership controller to the host. */\n attach(host: T, onSync: (state: S) => void): GroupMemberController<T>;\n /** Returns the hosts of the group of `member`, in DOM order. */\n membersOf(member: T): T[];\n}\n\nfunction byDocumentOrder(a: Node, b: Node): number {\n if (a === b) {\n return 0;\n }\n\n return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING\n ? -1\n : 1;\n}\n\n/**\n * Creates a registry of groups whose members discover each other through a\n * shared scope and key instead of a common parent element - the way native\n * radio buttons group by their `name` within a form root.\n *\n * Each member holds its own entry for its life-cycle, so that a group read\n * reflects the actual membership and the members that stay behind derive their\n * state again when one leaves - a change a member cannot see on its own.\n *\n * One registry holds one kind of group; create it at module level:\n *\n * @example\n * ```typescript\n * const radioGroups = createGroupRegistry<IgcRadioComponent, boolean>({\n * keyOf: (radio) => radio.name || '',\n * deriveState: (radios) => radios.some((radio) => radio.checked),\n * });\n *\n * // In the component:\n * private readonly _group = radioGroups.attach(this, (state) => { ... });\n * ```\n */\nexport function createGroupRegistry<T extends GroupHost, S>(\n config: GroupRegistryConfig<T, S>\n): GroupRegistry<T, S> {\n const groups = new WeakMap<GroupScope, Map<string, Set<Member>>>();\n const controllers = new WeakMap<T, Member>();\n\n function scopeOf(host: T): GroupScope {\n return config.scopeOf?.(host) ?? getRoot(host);\n }\n\n /** Gives each member of the group the state that the group derives. */\n function syncGroup(group: Iterable<Member>): void {\n const members = Array.from(group);\n const state = config.deriveState(members.map((member) => member.host));\n\n for (const member of members) {\n member.onSync(state);\n }\n }\n\n class Member implements GroupMemberController<T> {\n public readonly host: T;\n public readonly onSync: (state: S) => void;\n\n /** The scope the host is registered under, or null while it is not registered. */\n private _scope: GroupScope | null = null;\n private _key = '';\n\n /** Whether the host still belongs to the group that holds its entry. */\n private get _isCurrent(): boolean {\n return (\n config.keyOf(this.host) === this._key &&\n scopeOf(this.host) === this._scope\n );\n }\n\n private get _group(): Member[] {\n const entries = this._scope\n ? Array.from(groups.get(this._scope)?.get(this._key) ?? [])\n : [];\n\n // A host moves to its new group on its next update, so an entry can be\n // one that has a different key or scope by now.\n const members = entries.filter((member) => member._isCurrent);\n\n return isEmpty(members)\n ? [this]\n : members.sort((a, b) => byDocumentOrder(a.host, b.host));\n }\n\n public get members(): T[] {\n return this._group.map((member) => member.host);\n }\n\n constructor(host: T, onSync: (state: S) => void) {\n this.host = host;\n this.onSync = onSync;\n\n controllers.set(host, this);\n host.addController(this);\n }\n\n public hostConnected(): void {\n this.updateMembership();\n }\n\n public hostDisconnected(): void {\n this._unregister();\n }\n\n public updateMembership(): void {\n const scope = this.host.isConnected ? scopeOf(this.host) : null;\n const key = config.keyOf(this.host);\n\n if (scope === this._scope && key === this._key) {\n return;\n }\n\n this._unregister();\n\n if (scope && key) {\n this._scope = scope;\n this._key = key;\n\n const keys = groups.get(scope) ?? new Map<string, Set<Member>>();\n const group = keys.get(key) ?? new Set<Member>();\n\n keys.set(key, group);\n groups.set(scope, keys);\n group.add(this);\n }\n\n this.sync();\n }\n\n public sync(): void {\n syncGroup(this._group);\n }\n\n private _unregister(): void {\n const { _scope: scope, _key: key } = this;\n const keys = scope ? groups.get(scope) : undefined;\n const group = keys?.get(key);\n\n this._scope = null;\n this._key = '';\n\n if (!group?.delete(this)) {\n return;\n }\n\n if (isEmpty(group)) {\n keys?.delete(key);\n } else {\n // The host is gone, and any state that it held goes with it. What is\n // left of the group derives its state again.\n syncGroup(group);\n }\n }\n }\n\n return {\n attach(host, onSync) {\n return new Member(host, onSync);\n },\n\n membersOf(member) {\n const controller = controllers.get(member);\n\n // Move the member first, so that a read that comes right after a change\n // of its key or scope resolves against the correct group.\n controller?.updateMembership();\n\n return controller?.members ?? [member];\n },\n };\n}\n\nexport type { GroupMemberController, GroupRegistry, GroupRegistryConfig };\n"]}
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../src/internals/controllers/group.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport { isEmpty } from '../utils/arrays.js';\nimport { getRoot } from '../utils/dom.js';\n\ntype GroupHost = ReactiveControllerHost & Element;\n\n/** The identity of a group: a root node or a container element. */\ntype GroupScope = object;\n\ntype GroupRegistryConfig<T extends GroupHost, S> = {\n /** The group key of a host. An empty key leaves the host on its own. */\n keyOf: (host: T) => string;\n /** Derives the state that each member receives on a sync. */\n deriveState: (members: T[]) => S;\n /** The scope of the group identity. Defaults to the host root node. */\n scopeOf?: (host: T) => GroupScope;\n};\n\n/** The membership of one host, added to it as a reactive controller. */\ninterface GroupMemberController<\n T extends GroupHost,\n> extends ReactiveController {\n /** The hosts of the group, in DOM order. A lone host gets its own group. */\n readonly members: T[];\n /** Moves the host to the group of its scope and key, and syncs both. */\n updateMembership(): void;\n sync(): void;\n}\n\ninterface GroupRegistry<T extends GroupHost, S> {\n /** Creates a membership controller and adds it to the host. */\n attach(host: T, onSync: (state: S) => void): GroupMemberController<T>;\n /** Returns the hosts of the group of `member`, in DOM order. */\n membersOf(member: T): T[];\n}\n\nfunction byDocumentOrder(a: Node, b: Node): number {\n if (a === b) {\n return 0;\n }\n\n return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING\n ? -1\n : 1;\n}\n\n/**\n * Creates a registry of groups.\n *\n * @remarks\n * Members find each other through a shared scope and key, as native radio\n * buttons group by `name` in a form root. Create one registry per kind of\n * group, at module level.\n *\n * @example\n * ```typescript\n * const radioGroups = createGroupRegistry<IgcRadioComponent, boolean>({\n * keyOf: (radio) => radio.name || '',\n * deriveState: (radios) => radios.some((radio) => radio.checked),\n * });\n *\n * // In the component:\n * private readonly _group = radioGroups.attach(this, (state) => { ... });\n * ```\n */\nexport function createGroupRegistry<T extends GroupHost, S>(\n config: GroupRegistryConfig<T, S>\n): GroupRegistry<T, S> {\n const groups = new WeakMap<GroupScope, Map<string, Set<Member>>>();\n const controllers = new WeakMap<T, Member>();\n\n function scopeOf(host: T): GroupScope {\n return config.scopeOf?.(host) ?? getRoot(host);\n }\n\n /** Derives the group state and gives it to each member. */\n function syncGroup(group: Iterable<Member>): void {\n const members = Array.from(group);\n const state = config.deriveState(members.map((member) => member.host));\n\n for (const member of members) {\n member.onSync(state);\n }\n }\n\n class Member implements GroupMemberController<T> {\n public readonly host: T;\n public readonly onSync: (state: S) => void;\n\n /** The scope of the host, or `null` while it is not registered. */\n private _scope: GroupScope | null = null;\n private _key = '';\n\n /** Whether the host still belongs to the group that holds its entry. */\n private get _isCurrent(): boolean {\n return (\n config.keyOf(this.host) === this._key &&\n scopeOf(this.host) === this._scope\n );\n }\n\n private get _group(): Member[] {\n const entries = this._scope\n ? Array.from(groups.get(this._scope)?.get(this._key) ?? [])\n : [];\n\n // A host moves on its next update, so an entry can hold a stale key.\n const members = entries.filter((member) => member._isCurrent);\n\n return isEmpty(members)\n ? [this]\n : members.sort((a, b) => byDocumentOrder(a.host, b.host));\n }\n\n public get members(): T[] {\n return this._group.map((member) => member.host);\n }\n\n constructor(host: T, onSync: (state: S) => void) {\n this.host = host;\n this.onSync = onSync;\n\n controllers.set(host, this);\n host.addController(this);\n }\n\n public hostConnected(): void {\n this.updateMembership();\n }\n\n public hostDisconnected(): void {\n this._unregister();\n }\n\n public updateMembership(): void {\n const scope = this.host.isConnected ? scopeOf(this.host) : null;\n const key = config.keyOf(this.host);\n\n if (scope === this._scope && key === this._key) {\n return;\n }\n\n this._unregister();\n\n if (scope && key) {\n this._scope = scope;\n this._key = key;\n\n const keys = groups.get(scope) ?? new Map<string, Set<Member>>();\n const group = keys.get(key) ?? new Set<Member>();\n\n keys.set(key, group);\n groups.set(scope, keys);\n group.add(this);\n }\n\n this.sync();\n }\n\n public sync(): void {\n syncGroup(this._group);\n }\n\n private _unregister(): void {\n const { _scope: scope, _key: key } = this;\n const keys = scope ? groups.get(scope) : undefined;\n const group = keys?.get(key);\n\n this._scope = null;\n this._key = '';\n\n if (!group?.delete(this)) {\n return;\n }\n\n if (isEmpty(group)) {\n keys?.delete(key);\n } else {\n // The remaining members derive their state again without this host.\n syncGroup(group);\n }\n }\n }\n\n return {\n attach(host, onSync) {\n return new Member(host, onSync);\n },\n\n membersOf(member) {\n const controller = controllers.get(member);\n\n // Move first, so a read after a key or scope change resolves right.\n controller?.updateMembership();\n\n return controller?.members ?? [member];\n },\n };\n}\n\nexport type { GroupMemberController, GroupRegistry, GroupRegistryConfig };\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReactiveControllerHost } from 'lit';
|
|
2
|
+
type HostListenersHost = ReactiveControllerHost & EventTarget;
|
|
3
|
+
export type HostListenersConfig = {
|
|
4
|
+
/**
|
|
5
|
+
* The target of the listeners. Defaults to the host. A function resolves
|
|
6
|
+
* when the host connects, for a target that does not exist yet, such as
|
|
7
|
+
* the render root of a Lit host.
|
|
8
|
+
*/
|
|
9
|
+
target?: EventTarget | (() => EventTarget);
|
|
10
|
+
events: readonly string[];
|
|
11
|
+
/** The listener. An object receives events through `handleEvent`. */
|
|
12
|
+
listener: EventListenerOrEventListenerObject;
|
|
13
|
+
options?: AddEventListenerOptions;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Adds a listener set to the given host.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* addHostListeners(this, {
|
|
21
|
+
* events: ['keyup', 'focusout'],
|
|
22
|
+
* listener: this,
|
|
23
|
+
* options: { passive: true },
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function addHostListeners(host: HostListenersHost, config: HostListenersConfig): void;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class HostListenersController {
|
|
2
|
+
constructor(host, config) {
|
|
3
|
+
this._host = host;
|
|
4
|
+
this._config = config;
|
|
5
|
+
host.addController(this);
|
|
6
|
+
}
|
|
7
|
+
hostConnected() {
|
|
8
|
+
const { target, events, listener, options } = this._config;
|
|
9
|
+
const element = (typeof target === 'function' ? target() : target) ?? this._host;
|
|
10
|
+
this._controller = new AbortController();
|
|
11
|
+
const listenerOptions = {
|
|
12
|
+
...options,
|
|
13
|
+
signal: this._controller.signal,
|
|
14
|
+
};
|
|
15
|
+
for (const event of events) {
|
|
16
|
+
element.addEventListener(event, listener, listenerOptions);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
hostDisconnected() {
|
|
20
|
+
this._controller?.abort();
|
|
21
|
+
this._controller = undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function addHostListeners(host, config) {
|
|
25
|
+
new HostListenersController(host, config);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=host-listeners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-listeners.js","sourceRoot":"","sources":["../../../src/internals/controllers/host-listeners.ts"],"names":[],"mappings":"AAwBA,MAAM,uBAAuB;IAK3B,YAAY,IAAuB,EAAE,MAA2B;QAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAGM,aAAa;QAClB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3D,MAAM,OAAO,GACX,CAAC,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;QACnE,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,MAAM,eAAe,GAA4B;YAC/C,GAAG,OAAO;YACV,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;SAChC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAGM,gBAAgB;QACrB,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC/B,CAAC;CACF;AAcD,MAAM,UAAU,gBAAgB,CAC9B,IAAuB,EACvB,MAA2B;IAE3B,IAAI,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\ntype HostListenersHost = ReactiveControllerHost & EventTarget;\n\nexport type HostListenersConfig = {\n /**\n * The target of the listeners. Defaults to the host. A function resolves\n * when the host connects, for a target that does not exist yet, such as\n * the render root of a Lit host.\n */\n target?: EventTarget | (() => EventTarget);\n events: readonly string[];\n /** The listener. An object receives events through `handleEvent`. */\n listener: EventListenerOrEventListenerObject;\n options?: AddEventListenerOptions;\n};\n\n/**\n * Adds a set of listeners for as long as the host is connected.\n *\n * @remarks\n * One abort signal removes every listener on a disconnect, without the\n * matching options object that a manual removal needs.\n */\nclass HostListenersController implements ReactiveController {\n private readonly _host: HostListenersHost;\n private readonly _config: HostListenersConfig;\n private _controller?: AbortController;\n\n constructor(host: HostListenersHost, config: HostListenersConfig) {\n this._host = host;\n this._config = config;\n host.addController(this);\n }\n\n /** @internal */\n public hostConnected(): void {\n const { target, events, listener, options } = this._config;\n const element =\n (typeof target === 'function' ? target() : target) ?? this._host;\n this._controller = new AbortController();\n\n const listenerOptions: AddEventListenerOptions = {\n ...options,\n signal: this._controller.signal,\n };\n\n for (const event of events) {\n element.addEventListener(event, listener, listenerOptions);\n }\n }\n\n /** @internal */\n public hostDisconnected(): void {\n this._controller?.abort();\n this._controller = undefined;\n }\n}\n\n/**\n * Adds a listener set to the given host.\n *\n * @example\n * ```typescript\n * addHostListeners(this, {\n * events: ['keyup', 'focusout'],\n * listener: this,\n * options: { passive: true },\n * });\n * ```\n */\nexport function addHostListeners(\n host: HostListenersHost,\n config: HostListenersConfig\n): void {\n new HostListenersController(host, config);\n}\n"]}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { type LitElement, type ReactiveController } from 'lit';
|
|
2
|
-
/**
|
|
3
|
-
* Reactive controller that allows a host component to resolve ID references
|
|
4
|
-
* scoped to its root node, and react to changes in those references.
|
|
5
|
-
*/
|
|
2
|
+
/** Resolves ID references in a root node. See {@link addIdRefResolver}. */
|
|
6
3
|
declare class IdRefResolverController implements ReactiveController {
|
|
7
4
|
private readonly _host;
|
|
8
5
|
private readonly _callback;
|
|
6
|
+
/** Whether the consumer asked for the observation. */
|
|
9
7
|
private _active;
|
|
10
|
-
|
|
8
|
+
/** The emitter of the current root node, non-null only while observing. */
|
|
11
9
|
private _emitter;
|
|
12
10
|
constructor(host: LitElement, callback: (ids: Set<string>) => unknown);
|
|
13
11
|
private _observe;
|
|
@@ -18,14 +16,15 @@ declare class IdRefResolverController implements ReactiveController {
|
|
|
18
16
|
hostConnected(): void;
|
|
19
17
|
/** @internal */
|
|
20
18
|
hostDisconnected(): void;
|
|
21
|
-
/** Start tracking ID reference changes in the document. */
|
|
22
19
|
observe(): void;
|
|
23
|
-
/** Stop tracking ID reference changes in the document. */
|
|
24
20
|
unobserve(): void;
|
|
25
21
|
}
|
|
26
22
|
/**
|
|
27
|
-
* Adds
|
|
28
|
-
*
|
|
23
|
+
* Adds a controller that resolves ID references in the root node of the host.
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* The controller calls `callback` with the ids that changed. Call `observe`
|
|
27
|
+
* to start and `unobserve` to stop. A root node shares one observation.
|
|
29
28
|
*/
|
|
30
29
|
export declare function addIdRefResolver(host: LitElement, callback: (ids: Set<string>) => unknown): IdRefResolverController;
|
|
31
30
|
export type { IdRefResolverController };
|
|
@@ -73,13 +73,15 @@ class IdRefChangeEmitter extends EventTarget {
|
|
|
73
73
|
class IdRefResolverController {
|
|
74
74
|
constructor(host, callback) {
|
|
75
75
|
this._active = false;
|
|
76
|
-
this._connected = false;
|
|
77
76
|
this._emitter = null;
|
|
78
77
|
this._host = host;
|
|
79
78
|
this._host.addController(this);
|
|
80
79
|
this._callback = callback;
|
|
81
80
|
}
|
|
82
81
|
_observe() {
|
|
82
|
+
if (this._emitter) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
83
85
|
const root = this._host.getRootNode();
|
|
84
86
|
this._emitter = getEmitter(root);
|
|
85
87
|
this._emitter.retain();
|
|
@@ -96,32 +98,22 @@ class IdRefResolverController {
|
|
|
96
98
|
this._callback.call(this._host, event.detail);
|
|
97
99
|
}
|
|
98
100
|
hostConnected() {
|
|
99
|
-
this._connected = true;
|
|
100
101
|
if (this._active) {
|
|
101
102
|
this._observe();
|
|
102
103
|
}
|
|
103
104
|
}
|
|
104
105
|
hostDisconnected() {
|
|
105
|
-
|
|
106
|
-
this._unobserve();
|
|
107
|
-
}
|
|
108
|
-
this._connected = false;
|
|
106
|
+
this._unobserve();
|
|
109
107
|
}
|
|
110
108
|
observe() {
|
|
111
|
-
if (this._active)
|
|
112
|
-
return;
|
|
113
109
|
this._active = true;
|
|
114
|
-
if (this.
|
|
110
|
+
if (this._host.isConnected) {
|
|
115
111
|
this._observe();
|
|
116
112
|
}
|
|
117
113
|
}
|
|
118
114
|
unobserve() {
|
|
119
|
-
if (!this._active)
|
|
120
|
-
return;
|
|
121
115
|
this._active = false;
|
|
122
|
-
|
|
123
|
-
this._unobserve();
|
|
124
|
-
}
|
|
116
|
+
this._unobserve();
|
|
125
117
|
}
|
|
126
118
|
}
|
|
127
119
|
export function addIdRefResolver(host, callback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id-resolver.js","sourceRoot":"","sources":["../../../src/internals/controllers/id-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA4C,MAAM,KAAK,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,eAAe,GAAG,IAAI,OAAO,EAA4B,CAAC;AAChE,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAEtC,SAAS,UAAU,CAAC,IAAU;IAC5B,IAAI,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACvC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAGD,SAAS,UAAU,CAAC,KAAe,EAAE,QAAqB;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,IAAI,IAAI,CAAC,EAAE;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAA2B,EAC3B,OAA2B;IAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC1C,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"id-resolver.js","sourceRoot":"","sources":["../../../src/internals/controllers/id-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { isServer, type LitElement, type ReactiveController } from 'lit';\nimport { isDocument, isElement } from '../utils/dom.js';\n\nconst ID_REF_EMITTERS = new WeakMap<Node, IdRefChangeEmitter>();\nconst ID_REF_EVENT = 'id-refs-change';\n\nfunction getEmitter(root: Node): IdRefChangeEmitter {\n let emitter = ID_REF_EMITTERS.get(root);\n if (!emitter) {\n emitter = new IdRefChangeEmitter(root);\n ID_REF_EMITTERS.set(root, emitter);\n }\n return emitter;\n}\n\n/** Adds the ids of `nodes` and of any of their descendants to `affected`. */\nfunction collectIds(nodes: NodeList, affected: Set<string>): void {\n for (const node of nodes) {\n if (!isElement(node)) continue;\n if (node.id) affected.add(node.id);\n for (const child of node.querySelectorAll('[id]')) {\n if (child.id) affected.add(child.id);\n }\n }\n}\n\nfunction refObserverCallback(\n mutations: MutationRecord[],\n emitter: IdRefChangeEmitter\n): void {\n const affected = new Set<string>();\n\n for (const mutation of mutations) {\n if (mutation.type === 'attributes') {\n if (!isElement(mutation.target)) continue;\n const oldId = mutation.oldValue;\n const newId = mutation.target.id;\n if (oldId) affected.add(oldId);\n if (newId) affected.add(newId);\n } else {\n collectIds(mutation.addedNodes, affected);\n collectIds(mutation.removedNodes, affected);\n }\n }\n\n if (affected.size > 0) {\n emitter.dispatchEvent(new CustomEvent(ID_REF_EVENT, { detail: affected }));\n }\n}\n\n/**\n * Sends an event when an ID reference in a root node changes. A reference\n * count starts the observation for the first consumer, and stops it after\n * the last one releases.\n */\nclass IdRefChangeEmitter extends EventTarget {\n private readonly _observer?: MutationObserver;\n private readonly _root: Node;\n private _refCount = 0;\n\n constructor(root: Node) {\n super();\n this._root = root;\n\n if (!isServer) {\n this._observer = new MutationObserver((mutations) =>\n refObserverCallback(mutations, this)\n );\n }\n }\n\n /** Starts the mutation observer on the first call. */\n public retain(): void {\n if (this._refCount++ === 0) {\n const root = isDocument(this._root) ? this._root.body : this._root;\n this._observer?.observe(root, {\n attributeFilter: ['id'],\n attributeOldValue: true,\n subtree: true,\n childList: true,\n });\n }\n }\n\n /** Stops the observer when the reference count reaches zero. */\n public release(): void {\n if (this._refCount > 0 && --this._refCount === 0) {\n this._observer?.disconnect();\n }\n }\n}\n\n/** Resolves ID references in a root node. See {@link addIdRefResolver}. */\nclass IdRefResolverController implements ReactiveController {\n private readonly _host: LitElement;\n private readonly _callback: (ids: Set<string>) => unknown;\n /** Whether the consumer asked for the observation. */\n private _active = false;\n\n /** The emitter of the current root node, non-null only while observing. */\n private _emitter: IdRefChangeEmitter | null = null;\n\n constructor(host: LitElement, callback: (ids: Set<string>) => unknown) {\n this._host = host;\n this._host.addController(this);\n this._callback = callback;\n }\n\n private _observe(): void {\n if (this._emitter) {\n return;\n }\n\n const root = this._host.getRootNode();\n this._emitter = getEmitter(root);\n this._emitter.retain();\n this._emitter.addEventListener(ID_REF_EVENT, this);\n }\n\n private _unobserve(): void {\n if (this._emitter) {\n this._emitter.removeEventListener(ID_REF_EVENT, this);\n this._emitter.release();\n this._emitter = null;\n }\n }\n\n /** @internal */\n public handleEvent(event: Event): void {\n this._callback.call(this._host, (event as CustomEvent<Set<string>>).detail);\n }\n\n /** @internal */\n public hostConnected(): void {\n if (this._active) {\n this._observe();\n }\n }\n\n /** @internal */\n public hostDisconnected(): void {\n this._unobserve();\n }\n\n public observe(): void {\n this._active = true;\n\n if (this._host.isConnected) {\n this._observe();\n }\n }\n\n public unobserve(): void {\n this._active = false;\n this._unobserve();\n }\n}\n\n/**\n * Adds a controller that resolves ID references in the root node of the host.\n *\n * @remarks\n * The controller calls `callback` with the ids that changed. Call `observe`\n * to start and `unobserve` to stop. A root node shares one observation.\n */\nexport function addIdRefResolver(\n host: LitElement,\n callback: (ids: Set<string>) => unknown\n): IdRefResolverController {\n return new IdRefResolverController(host, callback);\n}\n\nexport type { IdRefResolverController };\n"]}
|