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":"popover.js","sourceRoot":"","sources":["../../../src/components/popover/popover.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n arrow,\n autoUpdate,\n computePosition,\n flip,\n inline,\n limitShift,\n type Middleware,\n type MiddlewareData,\n offset,\n type Placement,\n shift,\n size,\n} from '@floating-ui/dom';\nimport { html, LitElement, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport {\n addSlotController,\n type SlotChangeCallbackParameters,\n setSlots,\n} from '#internals/controllers/slot.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport { firstOf } from '#internals/utils/arrays.js';\nimport {\n getElementByIdFromRoot,\n hasStickyAncestor,\n isPopoverOpen,\n roundByDPR,\n setStyles,\n} from '#internals/utils/dom.js';\nimport { isString } from '#internals/utils/types.js';\nimport { styles } from './themes/light/popover.base.css.js';\n\n/**\n * Describes the preferred placement of a toggle component.\n */\nexport type PopoverPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end';\n\nconst OPPOSITE_SIDE = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n} as const;\n\ntype PopoverSide = keyof typeof OPPOSITE_SIDE;\n\nconst SIDES = Object.keys(OPPOSITE_SIDE) as PopoverSide[];\n\n/* blazorSuppress */\n/**\n * @element igc-popover\n *\n * @slot - Content of the popover.\n * @slot anchor - The element the popover will be anchored to.\n *\n * @csspart container - The container wrapping the slotted content in the popover.\n */\nexport default class IgcPopoverComponent extends LitElement {\n public static readonly tagName = 'igc-popover';\n public static override styles = styles;\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcPopoverComponent);\n }\n\n //#region Internal properties and state\n\n private _dispose?: ReturnType<typeof autoUpdate>;\n private _target?: Element;\n private _middleware?: Middleware[];\n private _positionId = 0;\n\n /**\n * The positioning strategy resolved when the popover is opened. The `fixed`\n * strategy is used when the anchor has a `position: sticky` ancestor, otherwise\n * the default `absolute` strategy is used. Cached here to avoid repeated DOM\n * traversals and style reflows on every scroll/resize reposition.\n *\n * Also, time to migrate to CSS Anchor positioning!!!\n */\n private _strategy: 'absolute' | 'fixed' = 'absolute';\n\n private readonly _slots = addSlotController(this, {\n slots: setSlots('anchor'),\n onChange: this._handleSlotChange,\n });\n\n @query('#container', true)\n private readonly _container!: HTMLElement;\n\n //#endregion\n\n //#region Public attributes and properties\n\n /**\n * Pass an IDREF or an DOM element reference to use as the\n * anchor target for the floating element.\n */\n @property()\n public anchor?: Element | string;\n\n /**\n * Element to render as an \"arrow\" element for the current popover.\n */\n @property({ attribute: false })\n public arrow: HTMLElement | null = null;\n\n /** Additional offset to apply to the arrow element if enabled. */\n @property({ type: Number, attribute: 'arrow-offset' })\n public arrowOffset = 0;\n\n /**\n * Improves positioning for inline reference elements that span over multiple lines.\n * Useful for tooltips or similar components.\n */\n @property({ type: Boolean, reflect: true })\n public inline = false;\n\n /**\n * When enabled this changes the placement of the floating element in order to keep it\n * in view along the main axis.\n */\n @property({ type: Boolean, reflect: true })\n public flip = false;\n\n /**\n * Placement modifier which translates the floating element along the main axis.\n */\n @property({ type: Number })\n public offset = 0;\n\n /**\n * The visibility state of the popover component.\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * Where to place the floating element relative to the parent anchor element.\n */\n @property()\n public placement: PopoverPlacement = 'bottom-start';\n\n /**\n * When enabled the floating element will match the width of its parent anchor element.\n */\n @property({ type: Boolean, reflect: true, attribute: 'same-width' })\n public sameWidth = false;\n\n /**\n * When enabled this tries to shift the floating element along the main axis\n * keeping it in view, preventing overflow while maintaining the desired placement.\n */\n @property({ type: Boolean, reflect: true })\n public shift = false;\n\n /**\n * Virtual padding for the resolved overflow detection offsets in pixels.\n */\n @property({ type: Number, attribute: 'shift-padding' })\n public shiftPadding = 0;\n\n //#endregion\n\n //#region Life-cycle hooks\n\n protected override update(properties: PropertyValues<this>): void {\n if (this.hasUpdated) {\n this._middleware = undefined;\n\n if (properties.has('sameWidth') && !this.sameWidth) {\n setStyles(this._container, { width: '' });\n }\n\n if (properties.has('open') || properties.has('anchor')) {\n this._setOpenState(this.open);\n } else if (this.open) {\n this._updatePosition();\n }\n }\n\n super.update(properties);\n }\n\n protected override firstUpdated(): void {\n this._setOpenState(this.open);\n }\n\n /** @internal */\n public override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.hasUpdated) {\n this._setOpenState(this.open);\n }\n }\n\n /** @internal */\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._setOpenState(false);\n }\n\n //#endregion\n\n private _handleSlotChange({\n isDefault,\n }: SlotChangeCallbackParameters<unknown>): void {\n if (isDefault || this.anchor) {\n return;\n }\n\n this._setOpenState(this.open);\n }\n\n private _handleToggle(): void {\n if (!isPopoverOpen(this._container)) {\n this._clearDispose();\n }\n }\n\n //#region Internal open state API\n\n /**\n * An unresolved IDREF keeps the current target, so that an anchor rendered\n * after this popover is picked up the next time it opens.\n */\n private _resolveTarget(): Element | undefined {\n if (isString(this.anchor)) {\n return getElementByIdFromRoot(this, this.anchor) ?? this._target;\n }\n\n return (\n this.anchor ??\n firstOf(this._slots.getAssignedElements('anchor', { flatten: true }))\n );\n }\n\n private _setOpenState(state: boolean): void {\n this._clearDispose();\n\n if (state) {\n this._target = this._resolveTarget();\n\n if (this._target) {\n this._strategy = hasStickyAncestor(this._target) ? 'fixed' : 'absolute';\n this._dispose = autoUpdate(\n this._target,\n this._container,\n this._updatePosition.bind(this)\n );\n }\n }\n\n this._setPopoverState(state);\n }\n\n private _setPopoverState(state: boolean): void {\n const container = this._container;\n\n if (!container) {\n return;\n }\n\n const shouldOpen = state && this._target != null;\n\n if (shouldOpen !== isPopoverOpen(container)) {\n shouldOpen ? container.showPopover() : container.hidePopover();\n }\n }\n\n private _clearDispose(): void {\n this._dispose?.();\n this._dispose = undefined;\n }\n\n //#endregion\n\n //#region Internal position API\n\n private get _placement(): PopoverPlacement {\n return this.placement ?? 'bottom-start';\n }\n\n private _createMiddleware(): Middleware[] {\n const shiftMiddleware = this.shift\n ? shift({ padding: this.shiftPadding, limiter: limitShift() })\n : null;\n const flipMiddleware = this.flip ? flip() : null;\n\n // Aligned placements flip before shifting, base placements shift first.\n // See https://floating-ui.com/docs/flip\n const positioners = this._placement.includes('-')\n ? [flipMiddleware, shiftMiddleware]\n : [shiftMiddleware, flipMiddleware];\n\n const chain = [\n this.offset !== 0 ? offset(this.offset) : null,\n this.inline ? inline() : null,\n ...positioners,\n this.sameWidth\n ? size({\n apply: ({ rects }) =>\n setStyles(this._container, {\n width: `${rects.reference.width}px`,\n }),\n })\n : null,\n this.arrow ? arrow({ element: this.arrow }) : null,\n ];\n\n return chain.filter((entry): entry is Middleware => entry !== null);\n }\n\n private async _updatePosition(): Promise<void> {\n if (!this.open) {\n return;\n }\n\n if (!this._target?.isConnected) {\n this._target = undefined;\n this._clearDispose();\n this._setPopoverState(false);\n return;\n }\n\n const positionId = ++this._positionId;\n const strategy = this._strategy;\n\n const { x, y, middlewareData, placement } = await computePosition(\n this._target,\n this._container,\n {\n placement: this._placement,\n middleware: (this._middleware ??= this._createMiddleware()),\n strategy,\n }\n );\n\n if (positionId !== this._positionId || !this.open) {\n return;\n }\n\n setStyles(this._container, {\n position: strategy,\n left: '0',\n top: '0',\n transform: `translate(${roundByDPR(x)}px,${roundByDPR(y)}px)`,\n });\n\n this._updateArrowPosition(placement, middlewareData);\n }\n\n private _updateArrowPosition(\n placement: Placement,\n data: MiddlewareData\n ): void {\n const element = this.arrow;\n\n if (!(data.arrow && element)) {\n return;\n }\n\n const { x, y } = data.arrow;\n const offset = this.arrowOffset;\n const [side] = placement.split('-') as [PopoverSide];\n const staticSide = OPPOSITE_SIDE[side];\n\n if (!element.part.contains(side)) {\n element.part.remove(...SIDES);\n element.part.add(side);\n }\n\n // Measured after the part switch, since it is what gives the arrow its size.\n const inset =\n staticSide === 'top' || staticSide === 'bottom'\n ? element.offsetHeight\n : element.offsetWidth;\n\n // Every side is reset, otherwise the inset of the previous placement is left\n // behind and over-constrains the arrow.\n const styles: Partial<CSSStyleDeclaration> = {\n top: y != null ? `${roundByDPR(y + offset)}px` : '',\n right: '',\n bottom: '',\n left: x != null ? `${roundByDPR(x + offset)}px` : '',\n };\n\n styles[staticSide] = `${-inset}px`;\n\n setStyles(element, styles);\n }\n\n //#endregion\n\n protected override render() {\n return html`\n <slot name=\"anchor\"></slot>\n <div\n id=\"container\"\n part=\"container\"\n popover=\"manual\"\n @toggle=${this._handleToggle}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-popover': IgcPopoverComponent;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../../src/components/popover/popover.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, type PropertyValues } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport {\n addSlotController,\n type SlotChangeCallbackParameters,\n setSlots,\n} from '#internals/controllers/slot.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport { firstOf } from '#internals/utils/arrays.js';\nimport { getElementByIdFromRoot, isPopoverOpen } from '#internals/utils/dom.js';\nimport { toggleEventListener } from '#internals/utils/events.js';\nimport { isString } from '#internals/utils/types.js';\nimport type { PopoverScrollStrategy } from '../types.js';\nimport { FloatingPositionStrategy } from './position/floating.js';\nimport {\n NativePositionStrategy,\n shouldUseNativeAnchorPositioning,\n} from './position/native.js';\nimport type { PopoverPositionStrategy } from './position/strategy.js';\nimport {\n type PopoverPositionStrategyMode,\n resolvePlacement,\n SCROLL_LISTENER_OPTIONS,\n} from './position/types.js';\nimport { styles } from './themes/light/popover.base.css.js';\n\n/**\n * Describes the preferred placement of a toggle component.\n */\nexport type PopoverPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end';\n\n/* blazorSuppress */\n/**\n * @element igc-popover\n *\n * @slot - Content of the popover.\n * @slot anchor - The element the popover will be anchored to.\n *\n * @fires igcPopoverScrollClose - The popover emits this event on each document scroll,\n * but only while it shows against its anchor and the scroll strategy is `close`.\n * The popover does not control its own `open` state, so the component that owns that state must close it.\n * The event does not bubble, so add the listener on the popover element.\n *\n * @csspart container - The container wrapping the slotted content in the popover.\n */\nexport default class IgcPopoverComponent extends LitElement {\n public static readonly tagName = 'igc-popover';\n public static override styles = styles;\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcPopoverComponent);\n }\n\n //#region Internal properties and state\n\n private _target?: Element;\n private _positionStrategy?: PopoverPositionStrategy;\n private _positionMode?: PopoverPositionStrategyMode;\n\n private readonly _slots = addSlotController(this, {\n slots: setSlots('anchor'),\n onChange: this._handleSlotChange,\n });\n\n @query('#container', true)\n private readonly _container!: HTMLElement;\n\n //#endregion\n\n //#region Public attributes and properties\n\n /**\n * Pass an IDREF or a DOM element reference to use as the\n * anchor target for the floating element.\n */\n @property()\n public anchor?: Element | string;\n\n /**\n * Element to render as an \"arrow\" element for the current popover.\n */\n @property({ attribute: false })\n public arrow: HTMLElement | null = null;\n\n /** Additional offset to apply to the arrow element if enabled. */\n @property({ type: Number, attribute: 'arrow-offset' })\n public arrowOffset = 0;\n\n /**\n * When enabled this changes the placement of the floating element in order to keep it\n * in view along the main axis.\n */\n @property({ type: Boolean, reflect: true })\n public flip = false;\n\n /**\n * Placement modifier which translates the floating element along the main axis.\n */\n @property({ type: Number })\n public offset = 0;\n\n /**\n * The visibility state of the popover component.\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * Where to place the floating element relative to the parent anchor element.\n */\n @property()\n public placement: PopoverPlacement = 'bottom-start';\n\n /**\n * When enabled the floating element will match the width of its parent anchor element.\n */\n @property({ type: Boolean, reflect: true, attribute: 'same-width' })\n public sameWidth = false;\n\n /**\n * Sets the behavior of the popover when an ancestor scroll container\n * scrolls and the popover is open.\n *\n * If the value is `hide`, the popover hides while the anchor is fully out\n * of view. The popover shows again when the anchor returns to view. `hide`\n * is the default value.\n *\n * If the value is `scroll`, the popover stays visible. The popover also\n * stays anchored while the anchor is out of view.\n *\n * If the value is `close`, the popover behaves as for `hide`. The popover\n * also emits `igcPopoverScrollClose` for each scroll. The component that\n * owns the `open` state must then close the popover.\n */\n @property({ attribute: 'scroll-strategy' })\n public scrollStrategy: PopoverScrollStrategy = 'hide';\n\n //#endregion\n\n //#region Life-cycle hooks\n\n protected override update(properties: PropertyValues<this>): void {\n if (this.hasUpdated) {\n if (properties.has('open') || properties.has('anchor')) {\n this._setOpenState(this.open);\n } else if (this.open) {\n this._positionStrategy?.update();\n }\n\n if (properties.has('scrollStrategy')) {\n this._syncScrollStrategy();\n }\n }\n\n super.update(properties);\n }\n\n protected override firstUpdated(): void {\n this._setOpenState(this.open);\n }\n\n /**\n * Waits also for the position strategy. The fallback strategy positions\n * asynchronously, so the container has no position when Lit ends the update.\n */\n protected override async getUpdateComplete(): Promise<boolean> {\n const complete = await super.getUpdateComplete();\n await this._positionStrategy?.whenPositioned();\n\n return complete;\n }\n\n /** @internal */\n public override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.hasUpdated) {\n this._setOpenState(this.open);\n }\n }\n\n /** @internal */\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._setOpenState(false);\n }\n\n //#endregion\n\n private _handleSlotChange({\n isDefault,\n }: SlotChangeCallbackParameters<unknown>): void {\n if (isDefault || this.anchor) {\n return;\n }\n\n this._setOpenState(this.open);\n }\n\n //#region Internal open state API\n\n private _getPositionStrategy(target: Element): PopoverPositionStrategy {\n const mode = shouldUseNativeAnchorPositioning(target)\n ? 'native'\n : 'floating';\n\n if (this._positionStrategy && this._positionMode === mode) {\n return this._positionStrategy;\n }\n\n this._positionStrategy?.detach();\n this._positionStrategy?.clear();\n\n this._positionMode = mode;\n this._positionStrategy =\n mode === 'native'\n ? new NativePositionStrategy(this, this._handleAnchorRemoved)\n : new FloatingPositionStrategy(this, this._handleAnchorRemoved);\n\n return this._positionStrategy;\n }\n\n /**\n * Hides the container if the anchor leaves the DOM. The `open` property\n * keeps its value, so the popover shows again when a new anchor resolves.\n */\n private readonly _handleAnchorRemoved = (): void => {\n this._target = undefined;\n this._setOpenState(false);\n };\n\n /**\n * An IDREF that does not resolve keeps the current target, so the popover\n * finds an anchor that renders later, at the next open.\n */\n private _resolveTarget(): Element | undefined {\n if (isString(this.anchor)) {\n return getElementByIdFromRoot(this, this.anchor) ?? this._target;\n }\n\n return (\n this.anchor ??\n firstOf(this._slots.getAssignedElements('anchor', { flatten: true }))\n );\n }\n\n private _setOpenState(state: boolean): void {\n if (state) {\n this._target = this._resolveTarget();\n }\n\n if (state && this._target) {\n // `attach` also detaches the previous open cycle.\n this._getPositionStrategy(this._target).attach(\n this._target,\n this._container\n );\n } else {\n this._positionStrategy?.detach();\n }\n\n this._syncContainerState(state);\n }\n\n /**\n * Binds one document `scroll` listener while the container shows and the\n * scroll strategy is `close`. Reads the container, which can stay closed\n * while `open` is true.\n */\n private _syncScrollStrategy(): void {\n toggleEventListener(\n document,\n isPopoverOpen(this._container) && this.scrollStrategy === 'close',\n 'scroll',\n this._handleRootScroll,\n SCROLL_LISTENER_OPTIONS\n );\n }\n\n private readonly _handleRootScroll = (): void => {\n this.dispatchEvent(new CustomEvent('igcPopoverScrollClose'));\n };\n\n /** Shows or hides the container and then syncs the scroll listener. */\n private _syncContainerState(state: boolean): void {\n if (!this._container) {\n return;\n }\n\n if (state && this._target) {\n this._positionStrategy?.show();\n } else {\n this._positionStrategy?.hide();\n }\n\n this._syncScrollStrategy();\n }\n\n //#endregion\n\n protected override render() {\n return html`\n <slot name=\"anchor\"></slot>\n <div\n id=\"container\"\n part=\"container\"\n popover=\"manual\"\n data-placement=${resolvePlacement(this)}\n data-scroll-strategy=${this.scrollStrategy}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-popover': IgcPopoverComponent;\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const OPPOSITE_SIDE: {
|
|
2
|
+
readonly top: "bottom";
|
|
3
|
+
readonly right: "left";
|
|
4
|
+
readonly bottom: "top";
|
|
5
|
+
readonly left: "right";
|
|
6
|
+
};
|
|
7
|
+
export type PopoverSide = keyof typeof OPPOSITE_SIDE;
|
|
8
|
+
/** Returns the side of a placement, without the alignment. */
|
|
9
|
+
export declare function getPlacementSide(placement: string): PopoverSide;
|
|
10
|
+
/** True if `side` is on the block axis. */
|
|
11
|
+
export declare function isBlockSide(side: PopoverSide): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Sets the part and the inline styles of the arrow. Both strategies call it,
|
|
14
|
+
* so the arrow gets the same styles.
|
|
15
|
+
*
|
|
16
|
+
* `side` is the side of the container that touches the anchor. `distance` is
|
|
17
|
+
* the position of the arrow on the cross axis of that side.
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyArrowStyles(element: HTMLElement, side: PopoverSide, distance: number, offset: number): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { roundByDPR, setStyles } from '#internals/utils/dom.js';
|
|
2
|
+
export const OPPOSITE_SIDE = {
|
|
3
|
+
top: 'bottom',
|
|
4
|
+
right: 'left',
|
|
5
|
+
bottom: 'top',
|
|
6
|
+
left: 'right',
|
|
7
|
+
};
|
|
8
|
+
const SIDES = Object.keys(OPPOSITE_SIDE);
|
|
9
|
+
export function getPlacementSide(placement) {
|
|
10
|
+
return placement.split('-')[0];
|
|
11
|
+
}
|
|
12
|
+
export function isBlockSide(side) {
|
|
13
|
+
return side === 'top' || side === 'bottom';
|
|
14
|
+
}
|
|
15
|
+
export function applyArrowStyles(element, side, distance, offset) {
|
|
16
|
+
const staticSide = OPPOSITE_SIDE[side];
|
|
17
|
+
if (!element.part.contains(side)) {
|
|
18
|
+
element.part.remove(...SIDES);
|
|
19
|
+
element.part.add(side);
|
|
20
|
+
}
|
|
21
|
+
const block = isBlockSide(staticSide);
|
|
22
|
+
const inset = block ? element.offsetHeight : element.offsetWidth;
|
|
23
|
+
const styles = {
|
|
24
|
+
top: '',
|
|
25
|
+
right: '',
|
|
26
|
+
bottom: '',
|
|
27
|
+
left: '',
|
|
28
|
+
[block ? 'left' : 'top']: `${roundByDPR(distance + offset)}px`,
|
|
29
|
+
};
|
|
30
|
+
styles[staticSide] = `${-inset}px`;
|
|
31
|
+
setStyles(element, styles);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=arrow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrow.js","sourceRoot":"","sources":["../../../../src/components/popover/position/arrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,OAAO;CACL,CAAC;AAIX,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAkB,CAAC;AAG1D,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAgB,CAAC;AAChD,CAAC;AAGD,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,CAAC;AAC7C,CAAC;AASD,MAAM,UAAU,gBAAgB,CAC9B,OAAoB,EACpB,IAAiB,EACjB,QAAgB,EAChB,MAAc;IAEd,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAGD,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAGjE,MAAM,MAAM,GAAiC;QAC3C,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,EAAE;QACR,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI;KAC/D,CAAC;IAEF,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC;IAEnC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import { roundByDPR, setStyles } from '#internals/utils/dom.js';\n\nexport const OPPOSITE_SIDE = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n} as const;\n\nexport type PopoverSide = keyof typeof OPPOSITE_SIDE;\n\nconst SIDES = Object.keys(OPPOSITE_SIDE) as PopoverSide[];\n\n/** Returns the side of a placement, without the alignment. */\nexport function getPlacementSide(placement: string): PopoverSide {\n return placement.split('-')[0] as PopoverSide;\n}\n\n/** True if `side` is on the block axis. */\nexport function isBlockSide(side: PopoverSide): boolean {\n return side === 'top' || side === 'bottom';\n}\n\n/**\n * Sets the part and the inline styles of the arrow. Both strategies call it,\n * so the arrow gets the same styles.\n *\n * `side` is the side of the container that touches the anchor. `distance` is\n * the position of the arrow on the cross axis of that side.\n */\nexport function applyArrowStyles(\n element: HTMLElement,\n side: PopoverSide,\n distance: number,\n offset: number\n): void {\n const staticSide = OPPOSITE_SIDE[side];\n\n if (!element.part.contains(side)) {\n element.part.remove(...SIDES);\n element.part.add(side);\n }\n\n // The part gives the arrow its size. Measure after the part changes.\n const block = isBlockSide(staticSide);\n const inset = block ? element.offsetHeight : element.offsetWidth;\n\n // Reset all sides. A stale inset over-constrains the arrow.\n const styles: Partial<CSSStyleDeclaration> = {\n top: '',\n right: '',\n bottom: '',\n left: '',\n [block ? 'left' : 'top']: `${roundByDPR(distance + offset)}px`,\n };\n\n styles[staticSide] = `${-inset}px`;\n\n setStyles(element, styles);\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PopoverPositionStrategy } from './strategy.js';
|
|
2
|
+
/**
|
|
3
|
+
* The fallback strategy, for a browser without the native CSS anchor
|
|
4
|
+
* positioning. It positions the container with `@floating-ui/dom`.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FloatingPositionStrategy extends PopoverPositionStrategy {
|
|
7
|
+
private _dispose?;
|
|
8
|
+
private _middleware?;
|
|
9
|
+
private _positionId;
|
|
10
|
+
/** The module load of the current open cycle, with its first position. */
|
|
11
|
+
private _pendingLoad?;
|
|
12
|
+
/** The position update that runs now. */
|
|
13
|
+
private _pendingPosition?;
|
|
14
|
+
/**
|
|
15
|
+
* Identifies the open cycle. Each `attach` and `detach` increments it.
|
|
16
|
+
* Every `attach` chains a callback onto the shared module loader, so a
|
|
17
|
+
* callback of a replaced cycle must not start an update.
|
|
18
|
+
*/
|
|
19
|
+
private _attachId;
|
|
20
|
+
/**
|
|
21
|
+
* `fixed` if an ancestor of the anchor has `position: sticky`, `absolute`
|
|
22
|
+
* in all other cases. The value updates one time for each open cycle,
|
|
23
|
+
* because the calculation walks the DOM and forces a style reflow.
|
|
24
|
+
*/
|
|
25
|
+
private _strategy;
|
|
26
|
+
attach(target: Element, container: HTMLElement): void;
|
|
27
|
+
/**
|
|
28
|
+
* This strategy loads its module on demand and then positions
|
|
29
|
+
* asynchronously, so the host waits for both.
|
|
30
|
+
*/
|
|
31
|
+
whenPositioned(): Promise<void>;
|
|
32
|
+
show(): void;
|
|
33
|
+
update(): void;
|
|
34
|
+
detach(): void;
|
|
35
|
+
clear(): void;
|
|
36
|
+
private _startAutoUpdate;
|
|
37
|
+
private _createMiddleware;
|
|
38
|
+
private _updatePosition;
|
|
39
|
+
private _computePosition;
|
|
40
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { hasStickyAncestor, isPopoverOpen, roundByDPR, setStyles, } from '#internals/utils/dom.js';
|
|
2
|
+
import { applyArrowStyles, getPlacementSide } from './arrow.js';
|
|
3
|
+
import { PopoverPositionStrategy } from './strategy.js';
|
|
4
|
+
import { resolvePlacement } from './types.js';
|
|
5
|
+
let floatingUiModule;
|
|
6
|
+
let floatingUiLoader;
|
|
7
|
+
function loadFloatingUi() {
|
|
8
|
+
floatingUiLoader ??= import('@floating-ui/dom').then((module) => {
|
|
9
|
+
floatingUiModule = module;
|
|
10
|
+
return module;
|
|
11
|
+
});
|
|
12
|
+
return floatingUiLoader;
|
|
13
|
+
}
|
|
14
|
+
export class FloatingPositionStrategy extends PopoverPositionStrategy {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this._positionId = 0;
|
|
18
|
+
this._attachId = 0;
|
|
19
|
+
this._strategy = 'absolute';
|
|
20
|
+
}
|
|
21
|
+
attach(target, container) {
|
|
22
|
+
super.attach(target, container);
|
|
23
|
+
const attachId = ++this._attachId;
|
|
24
|
+
this._middleware = undefined;
|
|
25
|
+
const reset = { visibility: '' };
|
|
26
|
+
if (!this._host.sameWidth) {
|
|
27
|
+
reset.width = '';
|
|
28
|
+
}
|
|
29
|
+
setStyles(container, reset);
|
|
30
|
+
this._strategy = hasStickyAncestor(target) ? 'fixed' : 'absolute';
|
|
31
|
+
if (floatingUiModule) {
|
|
32
|
+
this._startAutoUpdate(floatingUiModule, target, container);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this._pendingLoad = loadFloatingUi().then((module) => {
|
|
36
|
+
if (attachId !== this._attachId) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
this._startAutoUpdate(module, target, container);
|
|
40
|
+
return this._pendingPosition;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async whenPositioned() {
|
|
44
|
+
await this._pendingLoad;
|
|
45
|
+
await this._pendingPosition;
|
|
46
|
+
}
|
|
47
|
+
show() {
|
|
48
|
+
if (this._container && !isPopoverOpen(this._container)) {
|
|
49
|
+
this._container.showPopover();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
update() {
|
|
53
|
+
this._middleware = undefined;
|
|
54
|
+
if (!this._host.sameWidth && this._container) {
|
|
55
|
+
setStyles(this._container, { width: '' });
|
|
56
|
+
}
|
|
57
|
+
this._updatePosition();
|
|
58
|
+
}
|
|
59
|
+
detach() {
|
|
60
|
+
this._attachId++;
|
|
61
|
+
this._pendingLoad = undefined;
|
|
62
|
+
this._dispose?.();
|
|
63
|
+
this._dispose = undefined;
|
|
64
|
+
}
|
|
65
|
+
clear() {
|
|
66
|
+
if (this._container) {
|
|
67
|
+
setStyles(this._container, {
|
|
68
|
+
position: '',
|
|
69
|
+
left: '',
|
|
70
|
+
top: '',
|
|
71
|
+
transform: '',
|
|
72
|
+
width: '',
|
|
73
|
+
visibility: '',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
_startAutoUpdate(floating, target, container) {
|
|
78
|
+
this._dispose = floating.autoUpdate(target, container, this._updatePosition.bind(this));
|
|
79
|
+
}
|
|
80
|
+
_createMiddleware(floating) {
|
|
81
|
+
const { offset, flip, sameWidth, arrow, scrollStrategy } = this._host;
|
|
82
|
+
const middleware = [];
|
|
83
|
+
if (offset !== 0) {
|
|
84
|
+
middleware.push(floating.offset(offset));
|
|
85
|
+
}
|
|
86
|
+
if (flip) {
|
|
87
|
+
middleware.push(floating.flip());
|
|
88
|
+
}
|
|
89
|
+
if (sameWidth) {
|
|
90
|
+
middleware.push(floating.size({
|
|
91
|
+
apply: ({ rects }) => {
|
|
92
|
+
if (this._container) {
|
|
93
|
+
setStyles(this._container, {
|
|
94
|
+
width: `${rects.reference.width}px`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
if (arrow) {
|
|
101
|
+
middleware.push(floating.arrow({ element: arrow }));
|
|
102
|
+
}
|
|
103
|
+
if (scrollStrategy !== 'scroll') {
|
|
104
|
+
middleware.push(floating.hide());
|
|
105
|
+
}
|
|
106
|
+
return middleware;
|
|
107
|
+
}
|
|
108
|
+
_updatePosition() {
|
|
109
|
+
this._pendingPosition = this._computePosition();
|
|
110
|
+
return this._pendingPosition;
|
|
111
|
+
}
|
|
112
|
+
async _computePosition() {
|
|
113
|
+
const container = this._container;
|
|
114
|
+
const floating = floatingUiModule;
|
|
115
|
+
if (!(this._host.open && container && floating)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!this._target?.isConnected) {
|
|
119
|
+
this._onAnchorRemoved();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const positionId = ++this._positionId;
|
|
123
|
+
const strategy = this._strategy;
|
|
124
|
+
const { x, y, middlewareData, placement } = await floating.computePosition(this._target, container, {
|
|
125
|
+
placement: resolvePlacement(this._host),
|
|
126
|
+
middleware: (this._middleware ??= this._createMiddleware(floating)),
|
|
127
|
+
strategy,
|
|
128
|
+
});
|
|
129
|
+
if (positionId !== this._positionId || !this._host.open) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
setStyles(container, {
|
|
133
|
+
position: strategy,
|
|
134
|
+
left: '0',
|
|
135
|
+
top: '0',
|
|
136
|
+
transform: `translate(${roundByDPR(x)}px,${roundByDPR(y)}px)`,
|
|
137
|
+
visibility: middlewareData.hide?.referenceHidden ? 'hidden' : '',
|
|
138
|
+
});
|
|
139
|
+
const { arrow, arrowOffset } = this._host;
|
|
140
|
+
if (arrow && middlewareData.arrow) {
|
|
141
|
+
const { x: arrowX, y: arrowY } = middlewareData.arrow;
|
|
142
|
+
applyArrowStyles(arrow, getPlacementSide(placement), arrowX ?? arrowY ?? 0, arrowOffset);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=floating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floating.js","sourceRoot":"","sources":["../../../../src/components/popover/position/floating.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as FloatingUi from '@floating-ui/dom';\nimport type { Middleware } from '@floating-ui/dom';\nimport {\n hasStickyAncestor,\n isPopoverOpen,\n roundByDPR,\n setStyles,\n} from '#internals/utils/dom.js';\nimport { applyArrowStyles, getPlacementSide } from './arrow.js';\nimport { PopoverPositionStrategy } from './strategy.js';\nimport { resolvePlacement } from './types.js';\n\ntype FloatingUiModule = typeof FloatingUi;\n\n/**\n * The module loads on demand, at the first attach of the fallback strategy. A\n * browser that uses the native strategy never loads it. The published build\n * is ESM, so the bundler of a consumer can split the code at this import.\n */\nlet floatingUiModule: FloatingUiModule | undefined;\nlet floatingUiLoader: Promise<FloatingUiModule> | undefined;\n\nfunction loadFloatingUi(): Promise<FloatingUiModule> {\n floatingUiLoader ??= import('@floating-ui/dom').then((module) => {\n floatingUiModule = module;\n return module;\n });\n\n return floatingUiLoader;\n}\n\n/**\n * The fallback strategy, for a browser without the native CSS anchor\n * positioning. It positions the container with `@floating-ui/dom`.\n */\nexport class FloatingPositionStrategy extends PopoverPositionStrategy {\n private _dispose?: () => void;\n private _middleware?: Middleware[];\n private _positionId = 0;\n\n /** The module load of the current open cycle, with its first position. */\n private _pendingLoad?: Promise<unknown>;\n\n /** The position update that runs now. */\n private _pendingPosition?: Promise<void>;\n\n /**\n * Identifies the open cycle. Each `attach` and `detach` increments it.\n * Every `attach` chains a callback onto the shared module loader, so a\n * callback of a replaced cycle must not start an update.\n */\n private _attachId = 0;\n\n /**\n * `fixed` if an ancestor of the anchor has `position: sticky`, `absolute`\n * in all other cases. The value updates one time for each open cycle,\n * because the calculation walks the DOM and forces a style reflow.\n */\n private _strategy: 'absolute' | 'fixed' = 'absolute';\n\n public override attach(target: Element, container: HTMLElement): void {\n super.attach(target, container);\n\n const attachId = ++this._attachId;\n\n this._middleware = undefined;\n\n // Remove the inline styles of the previous open cycle. A popover that\n // closes while the anchor is out of view keeps `visibility: hidden`, and\n // the first `computePosition` clears it too late.\n const reset: Partial<CSSStyleDeclaration> = { visibility: '' };\n\n if (!this._host.sameWidth) {\n reset.width = '';\n }\n\n setStyles(container, reset);\n\n this._strategy = hasStickyAncestor(target) ? 'fixed' : 'absolute';\n\n if (floatingUiModule) {\n this._startAutoUpdate(floatingUiModule, target, container);\n return;\n }\n\n // `autoUpdate` positions the container one time before it returns, so\n // the pending position of that call completes the load.\n this._pendingLoad = loadFloatingUi().then((module) => {\n if (attachId !== this._attachId) {\n return undefined;\n }\n\n this._startAutoUpdate(module, target, container);\n return this._pendingPosition;\n });\n }\n\n /**\n * This strategy loads its module on demand and then positions\n * asynchronously, so the host waits for both.\n */\n public override async whenPositioned(): Promise<void> {\n await this._pendingLoad;\n await this._pendingPosition;\n }\n\n public show(): void {\n if (this._container && !isPopoverOpen(this._container)) {\n this._container.showPopover();\n }\n }\n\n public update(): void {\n this._middleware = undefined;\n\n if (!this._host.sameWidth && this._container) {\n setStyles(this._container, { width: '' });\n }\n\n this._updatePosition();\n }\n\n public detach(): void {\n this._attachId++;\n this._pendingLoad = undefined;\n this._dispose?.();\n this._dispose = undefined;\n }\n\n public clear(): void {\n if (this._container) {\n setStyles(this._container, {\n position: '',\n left: '',\n top: '',\n transform: '',\n width: '',\n visibility: '',\n });\n }\n }\n\n private _startAutoUpdate(\n floating: FloatingUiModule,\n target: Element,\n container: HTMLElement\n ): void {\n this._dispose = floating.autoUpdate(\n target,\n container,\n this._updatePosition.bind(this)\n );\n }\n\n private _createMiddleware(floating: FloatingUiModule): Middleware[] {\n const { offset, flip, sameWidth, arrow, scrollStrategy } = this._host;\n const middleware: Middleware[] = [];\n\n if (offset !== 0) {\n middleware.push(floating.offset(offset));\n }\n\n if (flip) {\n middleware.push(floating.flip());\n }\n\n if (sameWidth) {\n middleware.push(\n floating.size({\n apply: ({ rects }) => {\n if (this._container) {\n setStyles(this._container, {\n width: `${rects.reference.width}px`,\n });\n }\n },\n })\n );\n }\n\n if (arrow) {\n middleware.push(floating.arrow({ element: arrow }));\n }\n\n // `hide()` matches `position-visibility: anchors-visible` of the native\n // strategy. The `scroll` strategy adds no middleware, which matches\n // `position-visibility: always`.\n if (scrollStrategy !== 'scroll') {\n middleware.push(floating.hide());\n }\n\n return middleware;\n }\n\n private _updatePosition(): Promise<void> {\n this._pendingPosition = this._computePosition();\n return this._pendingPosition;\n }\n\n private async _computePosition(): Promise<void> {\n const container = this._container;\n // A pending `attach` positions the container when the module loads, so an\n // update before the first load can stop here.\n const floating = floatingUiModule;\n\n if (!(this._host.open && container && floating)) {\n return;\n }\n\n if (!this._target?.isConnected) {\n this._onAnchorRemoved();\n return;\n }\n\n const positionId = ++this._positionId;\n const strategy = this._strategy;\n\n const { x, y, middlewareData, placement } = await floating.computePosition(\n this._target,\n container,\n {\n placement: resolvePlacement(this._host),\n middleware: (this._middleware ??= this._createMiddleware(floating)),\n strategy,\n }\n );\n\n if (positionId !== this._positionId || !this._host.open) {\n return;\n }\n\n setStyles(container, {\n position: strategy,\n left: '0',\n top: '0',\n transform: `translate(${roundByDPR(x)}px,${roundByDPR(y)}px)`,\n visibility: middlewareData.hide?.referenceHidden ? 'hidden' : '',\n });\n\n const { arrow, arrowOffset } = this._host;\n\n if (arrow && middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n\n applyArrowStyles(\n arrow,\n getPlacementSide(placement),\n arrowX ?? arrowY ?? 0,\n arrowOffset\n );\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PopoverPositionStrategy } from './strategy.js';
|
|
2
|
+
/**
|
|
3
|
+
* True if the native CSS anchor positioning can position the `target`.
|
|
4
|
+
*
|
|
5
|
+
* The `source` option accepts only an HTMLElement, so the fallback positions
|
|
6
|
+
* an anchor such as an SVG element.
|
|
7
|
+
*/
|
|
8
|
+
export declare function shouldUseNativeAnchorPositioning(target: Element): target is HTMLElement;
|
|
9
|
+
/**
|
|
10
|
+
* The position strategy that uses the native CSS anchor positioning.
|
|
11
|
+
*
|
|
12
|
+
* `showPopover({ source: target })` sets the implicit anchor. This is
|
|
13
|
+
* necessary, because `anchor-name` is tree-scoped and cannot cross the shadow
|
|
14
|
+
* boundary. The CSS rules then do all the positioning. They apply only with
|
|
15
|
+
* the `data-anchored` attribute, which this strategy owns.
|
|
16
|
+
*/
|
|
17
|
+
export declare class NativePositionStrategy extends PopoverPositionStrategy {
|
|
18
|
+
/** The anchor that the container currently shows against. */
|
|
19
|
+
private _shownSource?;
|
|
20
|
+
private _arrowFrame;
|
|
21
|
+
/**
|
|
22
|
+
* Detects the removal of the anchor from the DOM. The observer does not
|
|
23
|
+
* detect the removal of a shadow host above the root of the anchor, and
|
|
24
|
+
* the fallback strategy does not detect it either.
|
|
25
|
+
*/
|
|
26
|
+
private readonly _anchorObserver;
|
|
27
|
+
attach(target: Element, container: HTMLElement): void;
|
|
28
|
+
show(): void;
|
|
29
|
+
hide(): void;
|
|
30
|
+
update(): void;
|
|
31
|
+
detach(): void;
|
|
32
|
+
clear(): void;
|
|
33
|
+
private _syncOffset;
|
|
34
|
+
/**
|
|
35
|
+
* The arrow needs JavaScript: CSS gives no signal about the position-try
|
|
36
|
+
* fallback, and a descendant of the container cannot reference the implicit
|
|
37
|
+
* anchor. The strategy calculates the side from the rectangles of the
|
|
38
|
+
* container and the anchor, on each scroll and resize.
|
|
39
|
+
*/
|
|
40
|
+
private readonly _handleArrowInvalidation;
|
|
41
|
+
/** Keeps the invalidation listeners bound while an open popover has an arrow. */
|
|
42
|
+
private _syncArrowListeners;
|
|
43
|
+
private _scheduleArrowUpdate;
|
|
44
|
+
private _updateArrow;
|
|
45
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { isServer } from 'lit';
|
|
2
|
+
import { getRoot, isPopoverOpen } from '#internals/utils/dom.js';
|
|
3
|
+
import { toggleEventListener } from '#internals/utils/events.js';
|
|
4
|
+
import { clamp } from '#internals/utils/math.js';
|
|
5
|
+
import { applyArrowStyles, getPlacementSide, isBlockSide, OPPOSITE_SIDE, } from './arrow.js';
|
|
6
|
+
import { PopoverPositionStrategy } from './strategy.js';
|
|
7
|
+
import { getForcedPopoverPositionStrategy, resolvePlacement, SCROLL_LISTENER_OPTIONS, } from './types.js';
|
|
8
|
+
const OFFSET_PROPERTY = '--_igc-popover-offset';
|
|
9
|
+
let nativeSupport;
|
|
10
|
+
function supportsNativeAnchoring() {
|
|
11
|
+
nativeSupport ??= probeNativeAnchoring();
|
|
12
|
+
return nativeSupport;
|
|
13
|
+
}
|
|
14
|
+
function probeNativeAnchoring() {
|
|
15
|
+
if (isServer ||
|
|
16
|
+
typeof CSS === 'undefined' ||
|
|
17
|
+
!CSS.supports('anchor-name: --a')) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const anchor = document.createElement('div');
|
|
21
|
+
const popover = document.createElement('div');
|
|
22
|
+
popover.popover = 'manual';
|
|
23
|
+
anchor.style.cssText = 'position:fixed;top:0;left:0;width:1px;height:1px';
|
|
24
|
+
popover.style.cssText =
|
|
25
|
+
'margin:0;inset:auto;border:none;padding:0;width:1px;height:1px;position-area:bottom span-right';
|
|
26
|
+
try {
|
|
27
|
+
document.body.append(anchor, popover);
|
|
28
|
+
popover.showPopover({ source: anchor });
|
|
29
|
+
const anchored = Math.abs(popover.getBoundingClientRect().top - 1) <= 1;
|
|
30
|
+
popover.hidePopover();
|
|
31
|
+
return anchored;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
anchor.remove();
|
|
38
|
+
popover.remove();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function shouldUseNativeAnchorPositioning(target) {
|
|
42
|
+
const forced = getForcedPopoverPositionStrategy();
|
|
43
|
+
if (forced) {
|
|
44
|
+
return forced === 'native';
|
|
45
|
+
}
|
|
46
|
+
return target instanceof HTMLElement && supportsNativeAnchoring();
|
|
47
|
+
}
|
|
48
|
+
export class NativePositionStrategy extends PopoverPositionStrategy {
|
|
49
|
+
constructor() {
|
|
50
|
+
super(...arguments);
|
|
51
|
+
this._arrowFrame = 0;
|
|
52
|
+
this._anchorObserver = new MutationObserver(() => {
|
|
53
|
+
if (this._target?.isConnected === false) {
|
|
54
|
+
this._onAnchorRemoved();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
this._handleArrowInvalidation = () => {
|
|
58
|
+
this._scheduleArrowUpdate();
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
attach(target, container) {
|
|
62
|
+
super.attach(target, container);
|
|
63
|
+
container.toggleAttribute('data-anchored', true);
|
|
64
|
+
this._anchorObserver.observe(getRoot(target), {
|
|
65
|
+
childList: true,
|
|
66
|
+
subtree: true,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
show() {
|
|
70
|
+
const container = this._container;
|
|
71
|
+
const target = this._target;
|
|
72
|
+
if (!(container && target)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (isPopoverOpen(container)) {
|
|
76
|
+
if (this._shownSource !== target) {
|
|
77
|
+
container.hidePopover();
|
|
78
|
+
container.showPopover({ source: target });
|
|
79
|
+
this._shownSource = target;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
container.showPopover({ source: target });
|
|
84
|
+
this._shownSource = target;
|
|
85
|
+
}
|
|
86
|
+
this.update();
|
|
87
|
+
}
|
|
88
|
+
hide() {
|
|
89
|
+
this._shownSource = undefined;
|
|
90
|
+
super.hide();
|
|
91
|
+
}
|
|
92
|
+
update() {
|
|
93
|
+
this._syncOffset();
|
|
94
|
+
this._syncArrowListeners();
|
|
95
|
+
this._scheduleArrowUpdate();
|
|
96
|
+
}
|
|
97
|
+
detach() {
|
|
98
|
+
this._anchorObserver.disconnect();
|
|
99
|
+
this._syncArrowListeners(false);
|
|
100
|
+
}
|
|
101
|
+
clear() {
|
|
102
|
+
if (this._container) {
|
|
103
|
+
this._container.toggleAttribute('data-anchored', false);
|
|
104
|
+
this._container.style.removeProperty(OFFSET_PROPERTY);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
_syncOffset() {
|
|
108
|
+
this._container?.style.setProperty(OFFSET_PROPERTY, `${this._host.offset}px`);
|
|
109
|
+
}
|
|
110
|
+
_syncArrowListeners(active = this._host.arrow != null &&
|
|
111
|
+
this._container != null &&
|
|
112
|
+
isPopoverOpen(this._container)) {
|
|
113
|
+
toggleEventListener(window, active, 'scroll', this._handleArrowInvalidation, SCROLL_LISTENER_OPTIONS);
|
|
114
|
+
toggleEventListener(window, active, 'resize', this._handleArrowInvalidation);
|
|
115
|
+
if (!active) {
|
|
116
|
+
cancelAnimationFrame(this._arrowFrame);
|
|
117
|
+
this._arrowFrame = 0;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_scheduleArrowUpdate() {
|
|
121
|
+
if (this._arrowFrame || !this._host.arrow) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this._arrowFrame = requestAnimationFrame(() => {
|
|
125
|
+
this._arrowFrame = 0;
|
|
126
|
+
this._updateArrow();
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
_updateArrow() {
|
|
130
|
+
const { arrow, arrowOffset } = this._host;
|
|
131
|
+
const target = this._target;
|
|
132
|
+
const container = this._container;
|
|
133
|
+
if (!(arrow && target && container && isPopoverOpen(container))) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const anchorRect = target.getBoundingClientRect();
|
|
137
|
+
const containerRect = container.getBoundingClientRect();
|
|
138
|
+
const placementSide = getPlacementSide(resolvePlacement(this._host));
|
|
139
|
+
const block = isBlockSide(placementSide);
|
|
140
|
+
const main = block ? 'top' : 'left';
|
|
141
|
+
const mainSize = block ? 'height' : 'width';
|
|
142
|
+
const cross = block ? 'left' : 'top';
|
|
143
|
+
const crossSize = block ? 'width' : 'height';
|
|
144
|
+
const arrowSize = block ? arrow.offsetWidth : arrow.offsetHeight;
|
|
145
|
+
const containerSize = block
|
|
146
|
+
? container.clientWidth
|
|
147
|
+
: container.clientHeight;
|
|
148
|
+
const nearSide = containerRect[main] + containerRect[mainSize] / 2 <
|
|
149
|
+
anchorRect[main] + anchorRect[mainSize] / 2;
|
|
150
|
+
const side = nearSide ? main : OPPOSITE_SIDE[main];
|
|
151
|
+
const distance = clamp(anchorRect[cross] +
|
|
152
|
+
anchorRect[crossSize] / 2 -
|
|
153
|
+
containerRect[cross] -
|
|
154
|
+
arrowSize / 2, 0, containerSize - arrowSize);
|
|
155
|
+
applyArrowStyles(arrow, side, distance, arrowOffset);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../src/components/popover/position/native.ts"],"names":[],"mappings":"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","sourcesContent":["import { isServer } from 'lit';\nimport { getRoot, isPopoverOpen } from '#internals/utils/dom.js';\nimport { toggleEventListener } from '#internals/utils/events.js';\nimport { clamp } from '#internals/utils/math.js';\nimport {\n applyArrowStyles,\n getPlacementSide,\n isBlockSide,\n OPPOSITE_SIDE,\n} from './arrow.js';\nimport { PopoverPositionStrategy } from './strategy.js';\nimport {\n getForcedPopoverPositionStrategy,\n resolvePlacement,\n SCROLL_LISTENER_OPTIONS,\n} from './types.js';\n\nconst OFFSET_PROPERTY = '--_igc-popover-offset';\n\nlet nativeSupport: boolean | undefined;\n\n/**\n * Tests the native CSS anchor positioning one time, on the first use.\n *\n * `CSS.supports` cannot test the implicit anchor of `showPopover({ source })`.\n * Chromium 125 to 132 passes the CSS tests but ignores the `source` option.\n * The test therefore measures a real popover.\n */\nfunction supportsNativeAnchoring(): boolean {\n nativeSupport ??= probeNativeAnchoring();\n return nativeSupport;\n}\n\nfunction probeNativeAnchoring(): boolean {\n if (\n isServer ||\n typeof CSS === 'undefined' ||\n !CSS.supports('anchor-name: --a')\n ) {\n return false;\n }\n\n const anchor = document.createElement('div');\n const popover = document.createElement('div');\n\n popover.popover = 'manual';\n anchor.style.cssText = 'position:fixed;top:0;left:0;width:1px;height:1px';\n // `span-right` also tests the span keywords, which the aligned placements\n // need. An engine without them drops the declaration and fails the\n // measurement below.\n popover.style.cssText =\n 'margin:0;inset:auto;border:none;padding:0;width:1px;height:1px;position-area:bottom span-right';\n\n try {\n document.body.append(anchor, popover);\n popover.showPopover({ source: anchor });\n\n // An anchored popover sits directly below the 1 pixel anchor. The\n // tolerance allows for rounding. A browser that ignores `source` centers\n // the popover, far away.\n const anchored = Math.abs(popover.getBoundingClientRect().top - 1) <= 1;\n\n popover.hidePopover();\n return anchored;\n } catch {\n return false;\n } finally {\n anchor.remove();\n popover.remove();\n }\n}\n\n/**\n * True if the native CSS anchor positioning can position the `target`.\n *\n * The `source` option accepts only an HTMLElement, so the fallback positions\n * an anchor such as an SVG element.\n */\nexport function shouldUseNativeAnchorPositioning(\n target: Element\n): target is HTMLElement {\n const forced = getForcedPopoverPositionStrategy();\n\n if (forced) {\n return forced === 'native';\n }\n\n return target instanceof HTMLElement && supportsNativeAnchoring();\n}\n\n/**\n * The position strategy that uses the native CSS anchor positioning.\n *\n * `showPopover({ source: target })` sets the implicit anchor. This is\n * necessary, because `anchor-name` is tree-scoped and cannot cross the shadow\n * boundary. The CSS rules then do all the positioning. They apply only with\n * the `data-anchored` attribute, which this strategy owns.\n */\nexport class NativePositionStrategy extends PopoverPositionStrategy {\n /** The anchor that the container currently shows against. */\n private _shownSource?: Element;\n private _arrowFrame = 0;\n\n /**\n * Detects the removal of the anchor from the DOM. The observer does not\n * detect the removal of a shadow host above the root of the anchor, and\n * the fallback strategy does not detect it either.\n */\n private readonly _anchorObserver = new MutationObserver(() => {\n if (this._target?.isConnected === false) {\n this._onAnchorRemoved();\n }\n });\n\n public override attach(target: Element, container: HTMLElement): void {\n super.attach(target, container);\n\n container.toggleAttribute('data-anchored', true);\n this._anchorObserver.observe(getRoot(target), {\n childList: true,\n subtree: true,\n });\n }\n\n public show(): void {\n const container = this._container;\n const target = this._target;\n\n if (!(container && target)) {\n return;\n }\n\n // The browser binds the implicit anchor only in `showPopover`, so a new\n // anchor needs a hide and a show. The focus moves out and then back.\n if (isPopoverOpen(container)) {\n if (this._shownSource !== target) {\n container.hidePopover();\n container.showPopover({ source: target as HTMLElement });\n this._shownSource = target;\n }\n } else {\n container.showPopover({ source: target as HTMLElement });\n this._shownSource = target;\n }\n\n this.update();\n }\n\n public override hide(): void {\n this._shownSource = undefined;\n super.hide();\n }\n\n public update(): void {\n this._syncOffset();\n this._syncArrowListeners();\n // The browser positions the container. The arrow follows in the next\n // frame, when the content has its final size.\n this._scheduleArrowUpdate();\n }\n\n public detach(): void {\n this._anchorObserver.disconnect();\n this._syncArrowListeners(false);\n }\n\n public clear(): void {\n if (this._container) {\n this._container.toggleAttribute('data-anchored', false);\n this._container.style.removeProperty(OFFSET_PROPERTY);\n }\n }\n\n private _syncOffset(): void {\n this._container?.style.setProperty(\n OFFSET_PROPERTY,\n `${this._host.offset}px`\n );\n }\n\n //#region Arrow support\n\n /**\n * The arrow needs JavaScript: CSS gives no signal about the position-try\n * fallback, and a descendant of the container cannot reference the implicit\n * anchor. The strategy calculates the side from the rectangles of the\n * container and the anchor, on each scroll and resize.\n */\n private readonly _handleArrowInvalidation = (): void => {\n this._scheduleArrowUpdate();\n };\n\n /** Keeps the invalidation listeners bound while an open popover has an arrow. */\n private _syncArrowListeners(\n active = this._host.arrow != null &&\n this._container != null &&\n isPopoverOpen(this._container)\n ): void {\n toggleEventListener(\n window,\n active,\n 'scroll',\n this._handleArrowInvalidation,\n SCROLL_LISTENER_OPTIONS\n );\n toggleEventListener(\n window,\n active,\n 'resize',\n this._handleArrowInvalidation\n );\n\n if (!active) {\n cancelAnimationFrame(this._arrowFrame);\n this._arrowFrame = 0;\n }\n }\n\n private _scheduleArrowUpdate(): void {\n if (this._arrowFrame || !this._host.arrow) {\n return;\n }\n\n this._arrowFrame = requestAnimationFrame(() => {\n this._arrowFrame = 0;\n this._updateArrow();\n });\n }\n\n private _updateArrow(): void {\n const { arrow, arrowOffset } = this._host;\n const target = this._target;\n const container = this._container;\n\n if (!(arrow && target && container && isPopoverOpen(container))) {\n return;\n }\n\n const anchorRect = target.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n const placementSide = getPlacementSide(resolvePlacement(this._host));\n const block = isBlockSide(placementSide);\n\n // The main axis carries the placement. The cross axis centers the arrow.\n const main = block ? 'top' : 'left';\n const mainSize = block ? 'height' : 'width';\n const cross = block ? 'left' : 'top';\n const crossSize = block ? 'width' : 'height';\n const arrowSize = block ? arrow.offsetWidth : arrow.offsetHeight;\n const containerSize = block\n ? container.clientWidth\n : container.clientHeight;\n\n // Compare the centers to find the side after a flip fallback. This stays\n // correct for an offset gap and for a negative offset that overlaps the\n // anchor.\n const nearSide =\n containerRect[main] + containerRect[mainSize] / 2 <\n anchorRect[main] + anchorRect[mainSize] / 2;\n const side = nearSide ? main : OPPOSITE_SIDE[main];\n\n // Center the arrow on the anchor. Keep the arrow inside the container.\n const distance = clamp(\n anchorRect[cross] +\n anchorRect[crossSize] / 2 -\n containerRect[cross] -\n arrowSize / 2,\n 0,\n containerSize - arrowSize\n );\n\n applyArrowStyles(arrow, side, distance, arrowOffset);\n }\n\n //#endregion\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PopoverPositionHost } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Positions the container of a popover against an anchor.
|
|
4
|
+
*
|
|
5
|
+
* For each open cycle the host calls `attach`, then `show`. The host calls
|
|
6
|
+
* `update` after a property changes, and `hide` to close the container.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class PopoverPositionStrategy {
|
|
9
|
+
protected readonly _host: PopoverPositionHost;
|
|
10
|
+
/** The strategy calls this callback if the anchor leaves the DOM. */
|
|
11
|
+
protected readonly _onAnchorRemoved: () => void;
|
|
12
|
+
protected _target?: Element;
|
|
13
|
+
protected _container?: HTMLElement;
|
|
14
|
+
constructor(host: PopoverPositionHost, onAnchorRemoved: () => void);
|
|
15
|
+
/** Starts to position the `container` against the `target`. */
|
|
16
|
+
attach(target: Element, container: HTMLElement): void;
|
|
17
|
+
/**
|
|
18
|
+
* Resolves when the strategy positioned the container.
|
|
19
|
+
*
|
|
20
|
+
* A synchronous strategy needs no wait. The host awaits this promise in
|
|
21
|
+
* `getUpdateComplete`.
|
|
22
|
+
*/
|
|
23
|
+
whenPositioned(): Promise<unknown>;
|
|
24
|
+
/** Shows the container in the top layer. */
|
|
25
|
+
abstract show(): void;
|
|
26
|
+
/** Hides the container. */
|
|
27
|
+
hide(): void;
|
|
28
|
+
/** Positions the container again after a property of the host changes. */
|
|
29
|
+
abstract update(): void;
|
|
30
|
+
/** Stops all observers, listeners and pending updates of the strategy. */
|
|
31
|
+
abstract detach(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Removes the styles and the attributes of this strategy from the
|
|
34
|
+
* container. The host calls it when it changes the strategy.
|
|
35
|
+
*/
|
|
36
|
+
abstract clear(): void;
|
|
37
|
+
}
|