igniteui-webcomponents 7.3.2 → 7.4.1
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 +87 -0
- 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/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.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/{resize-container/themes/resize-container.base.css.js → breadcrumb/themes/breadcrumbs.base.css.js} +2 -2
- 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.js +2 -1
- package/components/calendar/base.js.map +1 -1
- package/components/calendar/calendar.d.ts +2 -3
- package/components/calendar/calendar.js.map +1 -1
- package/components/calendar/days-view/days-view.d.ts +2 -2
- package/components/calendar/days-view/days-view.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/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/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 +3 -1
- package/components/checkbox/checkbox-base.js +4 -0
- package/components/checkbox/checkbox-base.js.map +1 -1
- package/components/checkbox/checkbox.js +4 -12
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/switch.js +1 -8
- package/components/checkbox/switch.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 +12 -7
- 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/combo/combo.d.ts +24 -24
- package/components/combo/combo.js +21 -26
- 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/date-picker/date-picker.base.d.ts +22 -27
- package/components/date-picker/date-picker.base.js +9 -3
- 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-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.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.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 +42 -40
- package/components/date-time-input/date-time-input.base.js +9 -5
- 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/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/file-input/file-input.d.ts +7 -2
- package/components/file-input/file-input.js +4 -0
- package/components/file-input/file-input.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-base.d.ts +2 -2
- package/components/input/input-base.js +3 -5
- package/components/input/input-base.js.map +1 -1
- package/components/input/input.d.ts +3 -3
- package/components/input/input.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/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/qr-code/qr-code.d.ts +1 -1
- package/components/radio/radio.d.ts +6 -4
- package/components/radio/radio.js +24 -25
- package/components/radio/radio.js.map +1 -1
- package/components/radio-group/radio-group.js.map +1 -1
- package/components/rating/rating.d.ts +9 -6
- package/components/rating/rating.js +17 -18
- 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 +5 -15
- package/components/select/select.js.map +1 -1
- package/components/slider/range-slider.d.ts +0 -1
- package/components/slider/range-slider.js +6 -11
- package/components/slider/range-slider.js.map +1 -1
- package/components/slider/slider-base.d.ts +4 -1
- package/components/slider/slider-base.js +20 -18
- package/components/slider/slider-base.js.map +1 -1
- package/components/slider/slider.d.ts +2 -0
- package/components/slider/slider.js +5 -1
- package/components/slider/slider.js.map +1 -1
- package/components/splitter/splitter.d.ts +6 -6
- package/components/splitter/splitter.js.map +1 -1
- package/components/textarea/textarea.d.ts +2 -5
- package/components/textarea/textarea.js +3 -5
- package/components/textarea/textarea.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/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/tooltip.d.ts +34 -13
- package/components/tooltip/tooltip.js +8 -4
- package/components/tooltip/tooltip.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/validation-container.js +2 -1
- package/components/validation-container/validation-container.js.map +1 -1
- package/components/virtualization/engine.d.ts +40 -9
- package/components/virtualization/engine.js +126 -61
- package/components/virtualization/engine.js.map +1 -1
- package/components/virtualization/recycle.d.ts +13 -0
- package/components/virtualization/recycle.js +152 -0
- package/components/virtualization/recycle.js.map +1 -0
- package/components/virtualization/virtualization.d.ts +84 -65
- package/components/virtualization/virtualization.js +20 -16
- package/components/virtualization/virtualization.js.map +1 -1
- package/custom-elements.json +18455 -19551
- 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 +100 -61
- package/internals/controllers/aria-projection.js +81 -31
- 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 +2 -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 +42 -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 +27 -78
- 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 +19 -19
- package/internals/templates/toggle-shell.js +12 -8
- 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 +53 -41
- package/internals/utils/dom.js +3 -4
- 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 +4 -3
- package/skills/igniteui-wc-choose-components/SKILL.md +2 -1
- package/skills/igniteui-wc-customize-component-theme/SKILL.md +2 -1
- package/skills/igniteui-wc-figma-to-app/SKILL.md +328 -0
- package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +343 -0
- package/skills/igniteui-wc-figma-to-app/references/design-provenance.md +199 -0
- package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +489 -0
- package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +370 -0
- package/skills/igniteui-wc-figma-to-app/references/figma-exploration.md +222 -0
- package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +363 -0
- package/skills/igniteui-wc-figma-to-app/references/project-setup.md +105 -0
- package/skills/igniteui-wc-figma-to-app/references/theme-generation.md +180 -0
- package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +370 -0
- package/skills/igniteui-wc-generate-from-image-design/SKILL.md +2 -1
- package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +3 -3
- package/skills/igniteui-wc-grids/SKILL.md +133 -0
- package/skills/igniteui-wc-integrate-with-framework/SKILL.md +2 -1
- package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +2 -1
- package/skills/igniteui-wc-optimize-bundle-size/SKILL.md +2 -1
- 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/components/resize-container/themes/resize-container.base.css.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
- /package/components/{resize-container/themes/resize-container.base.css.d.ts → breadcrumb/themes/breadcrumb.base.css.d.ts} +0 -0
|
@@ -8,12 +8,14 @@ import { html, isServer, LitElement, nothing, } from 'lit';
|
|
|
8
8
|
import { property, state } from 'lit/decorators.js';
|
|
9
9
|
import { createRef, ref } from 'lit/directives/ref.js';
|
|
10
10
|
import { styleMap } from 'lit/directives/style-map.js';
|
|
11
|
+
import { addHostListeners } from '#internals/controllers/host-listeners.js';
|
|
11
12
|
import { createResizeObserverController } from '#internals/controllers/resize-observer.js';
|
|
12
13
|
import { registerComponent } from '#internals/definitions/register.js';
|
|
13
14
|
import { EventEmitterMixin } from '#internals/mixins/event-emitter.js';
|
|
14
15
|
import { isLTR } from '#internals/utils/dom.js';
|
|
15
16
|
import { asNumber, clamp } from '#internals/utils/math.js';
|
|
16
17
|
import { VirtualScrollEngine } from './engine.js';
|
|
18
|
+
import { recycle } from './recycle.js';
|
|
17
19
|
import { VirtualScrollItemContext, } from './types.js';
|
|
18
20
|
const REMOTE_SCROLLING_THRESHOLD = 5;
|
|
19
21
|
const MAX_LAYOUT_SETTLE_PASSES = 20;
|
|
@@ -130,8 +132,14 @@ export default class IgcVirtualScrollComponent extends EventEmitterMixin(LitElem
|
|
|
130
132
|
this.overScan = 2;
|
|
131
133
|
this.estimatedItemSize = DEFAULT_ESTIMATED_ITEM_SIZE;
|
|
132
134
|
this.itemTemplate = null;
|
|
135
|
+
this.keyFunction = null;
|
|
133
136
|
this._engine.onSizeChange = () => this.requestUpdate();
|
|
134
137
|
this._handleScroll = this._handleScroll.bind(this);
|
|
138
|
+
addHostListeners(this, {
|
|
139
|
+
events: ['scroll'],
|
|
140
|
+
listener: this._handleScroll,
|
|
141
|
+
options: { passive: true },
|
|
142
|
+
});
|
|
135
143
|
createResizeObserverController(this, {
|
|
136
144
|
callback: this._measureViewport,
|
|
137
145
|
});
|
|
@@ -144,11 +152,6 @@ export default class IgcVirtualScrollComponent extends EventEmitterMixin(LitElem
|
|
|
144
152
|
this._adoptStyles();
|
|
145
153
|
this._engine.initMaxBrowserSize(this.ownerDocument);
|
|
146
154
|
this._measureViewport();
|
|
147
|
-
this.addEventListener('scroll', this._handleScroll, { passive: true });
|
|
148
|
-
}
|
|
149
|
-
disconnectedCallback() {
|
|
150
|
-
super.disconnectedCallback();
|
|
151
|
-
this.removeEventListener('scroll', this._handleScroll);
|
|
152
155
|
}
|
|
153
156
|
willUpdate(changed) {
|
|
154
157
|
this._adoptStyles();
|
|
@@ -205,12 +208,12 @@ export default class IgcVirtualScrollComponent extends EventEmitterMixin(LitElem
|
|
|
205
208
|
role="presentation"
|
|
206
209
|
style=${styleMap(contentStyle)}
|
|
207
210
|
>
|
|
208
|
-
${visibleItems.
|
|
211
|
+
${recycle(visibleItems, (item, i) => this._keyOf(item, range.startIndex + i), (item, i) => {
|
|
209
212
|
const itemIndex = range.startIndex + i;
|
|
210
213
|
const ctx = new VirtualScrollItemContext(item, itemIndex, count);
|
|
211
214
|
return html `<div role="presentation" data-vs-index=${itemIndex}>
|
|
212
|
-
|
|
213
|
-
|
|
215
|
+
${this.itemTemplate(ctx)}
|
|
216
|
+
</div>`;
|
|
214
217
|
})}
|
|
215
218
|
</div>
|
|
216
219
|
</div>
|
|
@@ -229,22 +232,19 @@ export default class IgcVirtualScrollComponent extends EventEmitterMixin(LitElem
|
|
|
229
232
|
get _items() {
|
|
230
233
|
return this.data ?? [];
|
|
231
234
|
}
|
|
235
|
+
_keyOf(item, index) {
|
|
236
|
+
return this.keyFunction ? this.keyFunction(item, index) : index;
|
|
237
|
+
}
|
|
232
238
|
_computeRange() {
|
|
233
239
|
return this.itemTemplate
|
|
234
240
|
? this._engine.getVisibleRange(this._scrollPosition, this._viewportSize, this._normalizedOverScan)
|
|
235
241
|
: EMPTY_RANGE;
|
|
236
242
|
}
|
|
237
243
|
_getAlignedScrollOffset(index, options) {
|
|
238
|
-
const
|
|
244
|
+
const position = this._isVertical
|
|
239
245
|
? (options?.block ?? 'start')
|
|
240
246
|
: (options?.inline ?? options?.block ?? 'start');
|
|
241
|
-
|
|
242
|
-
if (requested === 'nearest' &&
|
|
243
|
-
this._engine.isIndexInView(index, current, this._viewportSize)) {
|
|
244
|
-
return current;
|
|
245
|
-
}
|
|
246
|
-
const align = requested === 'center' || requested === 'end' ? requested : 'start';
|
|
247
|
-
return this._engine.getAlignedScrollOffset(index, this._viewportSize, align);
|
|
247
|
+
return this._engine.resolveScrollOffset(index, this._currentAxisScroll(), this._viewportSize, position);
|
|
248
248
|
}
|
|
249
249
|
_applyScroll(offset, behavior) {
|
|
250
250
|
if (this._isVertical) {
|
|
@@ -343,6 +343,7 @@ export default class IgcVirtualScrollComponent extends EventEmitterMixin(LitElem
|
|
|
343
343
|
this._engine.measureItem(index, measured);
|
|
344
344
|
}
|
|
345
345
|
}
|
|
346
|
+
this._engine.adaptEstimate(this._currentRange.startIndex);
|
|
346
347
|
}
|
|
347
348
|
_scheduleItemMeasurement() {
|
|
348
349
|
const content = this._contentRef.value;
|
|
@@ -479,4 +480,7 @@ __decorate([
|
|
|
479
480
|
__decorate([
|
|
480
481
|
property({ attribute: false })
|
|
481
482
|
], IgcVirtualScrollComponent.prototype, "itemTemplate", void 0);
|
|
483
|
+
__decorate([
|
|
484
|
+
property({ attribute: false })
|
|
485
|
+
], IgcVirtualScrollComponent.prototype, "keyFunction", void 0);
|
|
482
486
|
//# sourceMappingURL=virtualization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtualization.js","sourceRoot":"","sources":["../../../src/components/virtualization/virtualization.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n isServer,\n LitElement,\n nothing,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { createResizeObserverController } from '#internals/controllers/resize-observer.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport type { Constructor } from '#internals/mixins/constructor.js';\nimport { EventEmitterMixin } from '#internals/mixins/event-emitter.js';\nimport { isLTR } from '#internals/utils/dom.js';\nimport { asNumber, clamp } from '#internals/utils/math.js';\nimport { VirtualScrollEngine } from './engine.js';\nimport {\n type ScrollAlignment,\n type VirtualScrollDataRequest,\n VirtualScrollItemContext,\n type VirtualScrollState,\n type VisibleRange,\n} from './types.js';\n\nexport type VirtualScrollItemTemplate<T> = (\n context: VirtualScrollItemContext<T>\n) => TemplateResult | typeof nothing;\n\nexport interface IgcVirtualScrollComponentEventMap {\n igcStateChange: CustomEvent<VirtualScrollState>;\n igcDataRequest: CustomEvent<VirtualScrollDataRequest>;\n}\n\nconst REMOTE_SCROLLING_THRESHOLD = 5;\nconst MAX_LAYOUT_SETTLE_PASSES = 20;\nconst MAX_SCROLL_CORRECTION_PASSES = 5;\nconst SCROLL_END_TIMEOUT_MS = 2000;\nconst SCROLL_OFFSET_EPSILON_PX = 1;\n/** Fallback for a non-positive `estimatedItemSize`. Equal to its default. */\nconst DEFAULT_ESTIMATED_ITEM_SIZE = 50;\n/** How long the scroll position must stay unchanged to count as settled. */\nconst SCROLL_IDLE_MS = 100;\n/**\n * Upper limit on one `requestAnimationFrame` wait. A hidden tab or a\n * disconnected element gets no frames, and `layoutComplete` must still\n * resolve there.\n */\nconst LAYOUT_FRAME_TIMEOUT_MS = 100;\n\n/**\n * `scrollend` reports exactly when a scroll has settled. Safari before 18.2\n * does not have it, and `_scrollAndWaitForEnd` falls back to a scroll-idle\n * timer there.\n */\nconst SUPPORTS_SCROLL_END = !isServer && 'onscrollend' in window;\n\nconst EMPTY_RANGE: VisibleRange = Object.freeze({\n startIndex: 0,\n endIndex: -1,\n});\n\n/**\n * A virtual scroll component for large lists. Only the items visible in the\n * viewport are rendered.\n *\n * @element igc-virtual-scroll\n *\n * @fires igcStateChange - Emitted when the rendered virtual window changes.\n * @fires igcDataRequest - Emitted when the rendered window comes within a few items of the end\n * of `data`. Also emitted on the first render, when the loaded items do not fill the viewport.\n *\n * @csspart virtualization-track - The full-size element that gives the host its scrollable extent.\n * @csspart virtualization-content - The wrapper that holds the rendered items, translated into\n * position within the track.\n */\nexport default class IgcVirtualScrollComponent<\n T = any,\n> extends EventEmitterMixin<\n IgcVirtualScrollComponentEventMap,\n Constructor<LitElement>\n>(LitElement) {\n public static readonly tagName = 'igc-virtual-scroll';\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcVirtualScrollComponent);\n }\n\n private static _styleSheet: CSSStyleSheet | null = null;\n\n private static _getStyleSheet(): CSSStyleSheet {\n if (!IgcVirtualScrollComponent._styleSheet) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`\n :where(igc-virtual-scroll) {\n display: block;\n position: relative;\n overflow: auto;\n height: 18.75rem;\n }\n\n :where(igc-virtual-scroll[orientation='vertical']) {\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) {\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n :where(igc-virtual-scroll) [part=\"virtualization-track\"] {\n position: relative;\n width: 100%;\n min-height: 100%;\n }\n\n :where(igc-virtual-scroll) [part=\"virtualization-content\"] {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n will-change: transform;\n contain: layout style paint;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) [part=\"virtualization-track\"] {\n height: 100%;\n width: auto;\n min-height: unset;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) [part=\"virtualization-content\"] {\n display: flex;\n flex-direction: row;\n height: 100%;\n width: auto;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) [part=\"virtualization-content\"] > [data-vs-index] {\n flex-shrink: 0;\n height: 100%;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']):dir(rtl) [part=\"virtualization-content\"] {\n left: auto;\n right: 0;\n }\n `);\n IgcVirtualScrollComponent._styleSheet = sheet;\n }\n return IgcVirtualScrollComponent._styleSheet;\n }\n\n //#region Internal state\n\n protected readonly _engine = new VirtualScrollEngine();\n private readonly _contentRef = createRef<HTMLDivElement>();\n private readonly _itemResizeController = createResizeObserverController(\n this,\n {\n callback: this._handleItemResize,\n target: null,\n requestUpdate: false,\n }\n );\n\n private _currentRange: VisibleRange = EMPTY_RANGE;\n\n /**\n * The item index each wrapper element was last observed under. Lit reuses\n * the wrapper elements across renders. After a scroll, the same element\n * can host a different item at an identical size, and a ResizeObserver\n * does not report that. See `_scheduleItemMeasurement`.\n */\n private readonly _observedItemIndexes = new WeakMap<Element, number>();\n private _lastEmittedState: VirtualScrollState | null = null;\n private _hasPendingDataRequest = false;\n private _layoutCompletePromise: Promise<void> | null = null;\n private _scrollRequestId = 0;\n\n /**\n * The `startIndex` of the last emitted `igcDataRequest`, which is also the\n * item count at that emit. See `_checkDataRequest`.\n *\n * Kept across a disconnect, like `_hasPendingDataRequest`: a move in the\n * DOM does not undo what the consumer was already asked for. If only one\n * of the two were cleared, the request loop would reopen on reconnect.\n */\n private _lastDataRequestIndex = -1;\n\n /**\n * The live scroll offset on the active axis. Not reactive by design:\n * `render` reads it only through `_currentRange`, so `_handleScroll`\n * schedules an update only when the window moves.\n */\n private _scrollPosition = 0;\n\n @state()\n private _viewportSize = 0;\n\n //#endregion\n\n //#region Public properties\n\n /**\n * The array of items to virtualize.\n *\n * Compared by reference: a mutation in place (`data.push(...)`) causes no\n * update. Assign a new array instead. The `igcDataRequest` flow also\n * expects a new array.\n */\n @property({ attribute: false })\n public data: T[] = [];\n\n /**\n * Scroll orientation of the virtual scroll.\n * @attr orientation\n * @default 'vertical'\n */\n @property({ reflect: true })\n public orientation: 'vertical' | 'horizontal' = 'vertical';\n\n /**\n * Number of extra items to render beyond the visible area of the viewport.\n * Higher values reduce blank flashes during fast scrolling but can lower performance.\n * @attr over-scan\n * @default 2\n */\n @property({ type: Number, attribute: 'over-scan' })\n public overScan = 2;\n\n /**\n * Estimated item size in pixels, used before an item is measured in the DOM.\n * After the first render of an item, the engine replaces the estimate with the measured size.\n * @attr estimated-item-size\n * @default 50\n */\n @property({ type: Number, attribute: 'estimated-item-size' })\n public estimatedItemSize = DEFAULT_ESTIMATED_ITEM_SIZE;\n\n /**\n * A function that renders each item in the virtual scroll list.\n * Receives a VirtualScrollItemContext<T> with the item data, its index, and the total count.\n * Without it, nothing is rendered.\n *\n * Items are measured by their border box, so margins accumulate as drift\n * down the list. Use padding on the item, or a gap on a wrapper, instead.\n *\n * Only the current window is in the DOM, so assistive technology cannot\n * infer an item's position from the markup. Templates that render a role\n * with set semantics (`option`, `listitem`, `row`, ...) should map the\n * context's `index` and `count` onto `aria-posinset` and `aria-setsize`.\n */\n @property({ attribute: false })\n public itemTemplate: VirtualScrollItemTemplate<T> | null = null;\n\n //#endregion\n\n private _adoptStyles(): void {\n /* c8 ignore next 3 */\n if (isServer) {\n return;\n }\n\n const root = this.getRootNode() as Document | ShadowRoot;\n const sheet = IgcVirtualScrollComponent._getStyleSheet();\n if (!root.adoptedStyleSheets.includes(sheet)) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n }\n }\n\n constructor() {\n super();\n this._engine.onSizeChange = () => this.requestUpdate();\n this._handleScroll = this._handleScroll.bind(this);\n\n // Viewport resize observer\n createResizeObserverController(this, {\n callback: this._measureViewport,\n });\n }\n\n //#region Lit lifecycle\n\n /** @internal */\n public override createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n /** @internal */\n public override connectedCallback(): void {\n super.connectedCallback();\n this._adoptStyles();\n this._engine.initMaxBrowserSize(this.ownerDocument);\n this._measureViewport();\n this.addEventListener('scroll', this._handleScroll, { passive: true });\n }\n\n /** @internal */\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('scroll', this._handleScroll);\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n // TODO: Either fix this in the theming controller or come up with some other solution.\n\n // Verified on every update, not only in `connectedCallback`; a no-op\n // when the sheet is already present. A host that renders this component\n // in its own shadow root (for example, combo) can have that root's\n // `adoptedStyleSheets` replaced by its theming logic. That drops this\n // sheet without this element reconnecting.\n this._adoptStyles();\n\n if (changed.has('data')) {\n this._engine.resize(\n this._items.length,\n this._normalizedItemSize,\n this._firstChangedIndex(changed.get('data'))\n );\n this._hasPendingDataRequest = false;\n }\n\n if (changed.has('estimatedItemSize')) {\n this._engine.updateEstimatedSize(this._normalizedItemSize);\n }\n\n if (changed.has('orientation')) {\n this._measureViewport();\n this._scrollPosition = this._currentAxisScroll();\n }\n\n this._currentRange = this._computeRange();\n }\n\n protected override updated(_changed: PropertyValues<this>): void {\n this._scheduleItemMeasurement();\n this._checkDataRequest();\n this._emitStateChange();\n }\n\n protected override render(): TemplateResult {\n if (!this.itemTemplate) {\n return html`${nothing}`;\n }\n\n const items = this._items;\n const range = this._currentRange;\n const count = items.length;\n const isVertical = this._isVertical;\n\n const trackStyle = isVertical\n ? { height: `${this._engine.domSize}px` }\n : { width: `${this._engine.domSize}px` };\n\n // The content wrapper is absolutely positioned at the origin of a track\n // that is `domSize` px tall or wide. A translation to the first rendered\n // item's scroll offset puts that item at its virtual position.\n let contentPosition = this._engine.getScrollOffsetForIndex(\n range.startIndex\n );\n const physicalRangeSize = this._engine.getPhysicalRangeSize(\n range.startIndex,\n range.endIndex\n );\n contentPosition = clamp(\n contentPosition,\n 0,\n this._engine.domSize - physicalRangeSize\n );\n const isRTL = !isVertical && !isLTR(this);\n const contentStyle = {\n transform: isVertical\n ? `translateY(${contentPosition}px)`\n : `translateX(${isRTL ? -contentPosition : contentPosition}px)`,\n };\n\n const visibleItems =\n range.endIndex >= range.startIndex\n ? items.slice(range.startIndex, range.endIndex + 1)\n : [];\n\n return html`\n <div\n part=\"virtualization-track\"\n role=\"presentation\"\n style=${styleMap(trackStyle)}\n >\n <div\n ${ref(this._contentRef)}\n part=\"virtualization-content\"\n role=\"presentation\"\n style=${styleMap(contentStyle)}\n >\n ${visibleItems.map((item, i) => {\n const itemIndex = range.startIndex + i;\n const ctx = new VirtualScrollItemContext(item, itemIndex, count);\n return html`<div role=\"presentation\" data-vs-index=${itemIndex}>\n ${this.itemTemplate!(ctx)}\n </div>`;\n })}\n </div>\n </div>\n `;\n }\n\n //#endregion\n\n //#region Internal API\n\n private get _isVertical(): boolean {\n return this.orientation === 'vertical';\n }\n\n /** The configured `overScan`, normalized to a non-negative integer. */\n private get _normalizedOverScan(): number {\n return Math.max(0, Math.floor(asNumber(this.overScan, 2)));\n }\n\n /** The configured `estimatedItemSize`, normalized to a positive number. */\n private get _normalizedItemSize(): number {\n const size = asNumber(this.estimatedItemSize);\n return size > 0 ? size : DEFAULT_ESTIMATED_ITEM_SIZE;\n }\n\n /** `data`, guarded against a nullish value set by the consumer. */\n private get _items(): T[] {\n return this.data ?? [];\n }\n\n /**\n * The window to render for the current scroll position and viewport. Empty\n * until an `itemTemplate` is set, because nothing renders without one.\n */\n private _computeRange(): VisibleRange {\n return this.itemTemplate\n ? this._engine.getVisibleRange(\n this._scrollPosition,\n this._viewportSize,\n this._normalizedOverScan\n )\n : EMPTY_RANGE;\n }\n\n /**\n * The scroll offset that aligns `index` in the viewport according to\n * `options`, from the engine's current size data. As more items are\n * measured, the same input can give a different, more accurate result.\n *\n * For `block: 'nearest'` on an item already in view, returns the current\n * offset, so no scroll occurs.\n */\n private _getAlignedScrollOffset(\n index: number,\n options?: ScrollIntoViewOptions\n ): number {\n const requested = this._isVertical\n ? (options?.block ?? 'start')\n : (options?.inline ?? options?.block ?? 'start');\n const current = this._currentAxisScroll();\n\n if (\n requested === 'nearest' &&\n this._engine.isIndexInView(index, current, this._viewportSize)\n ) {\n return current;\n }\n\n const align: ScrollAlignment =\n requested === 'center' || requested === 'end' ? requested : 'start';\n\n return this._engine.getAlignedScrollOffset(\n index,\n this._viewportSize,\n align\n );\n }\n\n /** Applies a scroll offset to the correct axis, accounting for RTL. */\n private _applyScroll(offset: number, behavior: ScrollBehavior): void {\n if (this._isVertical) {\n this.scrollTo({ top: offset, behavior });\n } else {\n this.scrollTo({ left: isLTR(this) ? offset : -offset, behavior });\n }\n }\n\n /** The current real scroll position on the active axis, normalized for RTL. */\n private _currentAxisScroll(): number {\n return this._isVertical\n ? this.scrollTop\n : isLTR(this)\n ? this.scrollLeft\n : -this.scrollLeft;\n }\n\n /**\n * Applies a scroll offset to the active axis and waits for the scroll,\n * instant or smooth, to settle.\n *\n * `scrollend` does not fire when the requested offset does not move the\n * scroll position, so that case resolves immediately. The timeout covers\n * an event that never arrives, for example when the element disconnects\n * mid-scroll.\n */\n private _scrollAndWaitForEnd(\n offset: number,\n behavior: ScrollBehavior\n ): Promise<void> {\n if (\n Math.abs(this._currentAxisScroll() - offset) < SCROLL_OFFSET_EPSILON_PX\n ) {\n return Promise.resolve();\n }\n\n return this._withDeadline(SCROLL_END_TIMEOUT_MS, (signal) => {\n const settled = SUPPORTS_SCROLL_END\n ? this._waitForScrollEnd(signal)\n : this._waitForScrollIdle(signal);\n\n // Applied only after the listener is attached, so an instant scroll\n // cannot settle before something watches for it.\n this._applyScroll(offset, behavior);\n return settled;\n });\n }\n\n /**\n * Resolves with `task` or with a deadline of `ms`, whichever comes first.\n * The signal then tears down the other, so no live timer or dangling\n * listener remains.\n */\n private _withDeadline(\n ms: number,\n task: (signal: AbortSignal) => Promise<void>\n ): Promise<void> {\n const controller = new AbortController();\n\n return Promise.race([\n task(controller.signal),\n this._timeout(ms, controller.signal),\n ]).finally(() => controller.abort());\n }\n\n private _waitForScrollEnd(signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n this.addEventListener('scrollend', () => resolve(), {\n once: true,\n signal,\n });\n });\n }\n\n /**\n * Resolves when no `scroll` event arrives for `SCROLL_IDLE_MS`: the\n * closest replacement for `scrollend`. The first timer starts immediately,\n * so a scroll that does not move still settles.\n */\n private _waitForScrollIdle(signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n let id = setTimeout(resolve, SCROLL_IDLE_MS);\n\n this.addEventListener(\n 'scroll',\n () => {\n clearTimeout(id);\n id = setTimeout(resolve, SCROLL_IDLE_MS);\n },\n { passive: true, signal }\n );\n\n signal.addEventListener('abort', () => clearTimeout(id), { once: true });\n });\n }\n\n private _timeout(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const id = setTimeout(resolve, ms);\n signal.addEventListener('abort', () => clearTimeout(id), { once: true });\n });\n }\n\n private _measureViewport(): void {\n this._viewportSize = this._isVertical\n ? this.clientHeight\n : this.clientWidth;\n }\n\n /**\n * Records the new scroll offset. Schedules a render only when the rendered\n * window moves.\n *\n * `render` derives the track size, the content translate, and the item\n * slice from `_currentRange`, not from the scroll offset. Without the\n * guard, a scroll inside one item would re-run each item template for an\n * identical result. `willUpdate` still recomputes `_currentRange` for each\n * other trigger, so this suppresses only redundant passes, never a needed\n * one.\n */\n private _handleScroll(): void {\n this._scrollPosition = this._currentAxisScroll();\n\n const { startIndex, endIndex } = this._computeRange();\n if (\n startIndex !== this._currentRange.startIndex ||\n endIndex !== this._currentRange.endIndex\n ) {\n this.requestUpdate();\n }\n }\n\n /**\n * The number of leading items that kept their identity across a `data`\n * change: the index of the first item whose measured size no longer\n * matches its rendered content. An append (the `igcDataRequest` flow)\n * retains all items. A filter or a replacement retains only the unchanged\n * prefix.\n */\n private _firstChangedIndex(previous: T[] | undefined): number {\n if (!previous) {\n return 0;\n }\n\n const items = this._items;\n const shared = Math.min(previous.length, items.length);\n for (let i = 0; i < shared; i++) {\n if (previous[i] !== items[i]) {\n return i;\n }\n }\n return shared;\n }\n\n private _handleItemResize(entries: ResizeObserverEntry[]): void {\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const index = asNumber(el.dataset.vsIndex, -1);\n if (index < 0) continue;\n\n const measured = this._isVertical\n ? (entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height)\n : (entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width);\n\n if (measured > 0) {\n this._engine.measureItem(index, measured);\n }\n }\n }\n\n /**\n * Synchronizes the item observer with the rendered window and applies only\n * the difference. A newly observed element gets one initial measurement.\n * An `observe` call on an already observed element is a no-op, so a\n * re-measurement on demand requires re-registration: unobserve, then\n * observe.\n *\n * Re-registration is applied to each element whose `data-vs-index`\n * changed. Lit reuses the wrapper elements across renders, so after a\n * scroll the same element can host a different item at an identical size.\n * The observer does not report that, and the new index would keep its\n * estimated size.\n */\n private _scheduleItemMeasurement(): void {\n const content = this._contentRef.value;\n if (!content) return;\n\n const observed = this._itemResizeController.targets;\n\n for (const element of observed) {\n if (element.parentNode !== content) {\n this._itemResizeController.unobserve(element);\n }\n }\n\n for (const element of content.children) {\n const index = asNumber((element as HTMLElement).dataset.vsIndex, -1);\n const isObserved = observed.has(element);\n\n if (isObserved && this._observedItemIndexes.get(element) === index) {\n continue;\n }\n\n if (isObserved) {\n this._itemResizeController.unobserve(element);\n }\n this._itemResizeController.observe(element);\n this._observedItemIndexes.set(element, index);\n }\n }\n\n /**\n * Emits `igcStateChange`. Skipped when the window is empty or equal to the\n * last reported one, because measurement passes re-render without a window\n * change.\n */\n private _emitStateChange(): void {\n const { startIndex, endIndex } = this._currentRange;\n if (endIndex < startIndex) return;\n\n const previous = this._lastEmittedState;\n const detail: VirtualScrollState = {\n startIndex,\n endIndex,\n viewportSize: this._viewportSize,\n totalSize: this._engine.totalSize,\n };\n\n if (\n previous &&\n previous.startIndex === detail.startIndex &&\n previous.endIndex === detail.endIndex &&\n previous.viewportSize === detail.viewportSize &&\n previous.totalSize === detail.totalSize\n ) {\n return;\n }\n\n this._lastEmittedState = { ...detail };\n this.emitEvent('igcStateChange', { detail });\n }\n\n private _checkDataRequest(): void {\n if (this._hasPendingDataRequest) return;\n\n const range = this._currentRange;\n const total = this._items.length;\n\n if (total === 0 || range.endIndex < total - REMOTE_SCROLLING_THRESHOLD) {\n return;\n }\n\n // Each `data` change clears `_hasPendingDataRequest`, including one that\n // appends nothing. Without this second guard, a consumer whose source is\n // exhausted, and that reassigns `data` in response to a request, would\n // receive the same request on each reassignment.\n if (this._lastDataRequestIndex === total) {\n return;\n }\n\n this._hasPendingDataRequest = true;\n this._lastDataRequestIndex = total;\n\n this.emitEvent('igcDataRequest', {\n detail: {\n startIndex: total,\n count: Math.max(this._normalizedOverScan * 4, 20),\n },\n });\n }\n\n /**\n * Resolves on the next animation frame, or after `LAYOUT_FRAME_TIMEOUT_MS`\n * when no frame arrives. A hidden tab or a disconnected element gets no\n * frames, and `layoutComplete` must still settle there. That state has no\n * layout to wait for, so an early resolve is safe.\n */\n private _nextFrame(): Promise<void> {\n return this._withDeadline(\n LAYOUT_FRAME_TIMEOUT_MS,\n (signal) =>\n new Promise((resolve) => {\n const id = requestAnimationFrame(() => resolve());\n signal.addEventListener('abort', () => cancelAnimationFrame(id), {\n once: true,\n });\n })\n );\n }\n\n /**\n * Waits for the current update, then lets ResizeObserver item measurements\n * run. When those schedule a follow-up render, for example an estimate\n * replaced by a measured size, the wait repeats until nothing is pending,\n * up to a safety cap.\n */\n private async _resolveLayoutComplete(): Promise<void> {\n try {\n await this.updateComplete;\n\n for (let i = 0; i < MAX_LAYOUT_SETTLE_PASSES; i++) {\n await this._nextFrame();\n\n if (!this.isUpdatePending) {\n break;\n }\n\n await this.updateComplete;\n }\n } finally {\n // Cleared here, not after the loop, so a run that throws cannot leave\n // the getter with a permanently rejected promise.\n this._layoutCompletePromise = null;\n }\n }\n\n //#endregion\n\n //#region Public API\n\n /* blazorSuppress */\n /**\n * Resolves when the virtual scroll has settled: the current render pass is\n * complete, the item-size measurements it triggers are complete, and so\n * are the renders those measurements schedule.\n *\n * `updateComplete` covers one Lit render pass. This covers `data` changes,\n * scrolls, and viewport resizes, where the stable DOM state comes after\n * one or more follow-up renders.\n */\n public get layoutComplete(): Promise<void> {\n if (!this._layoutCompletePromise) {\n this._layoutCompletePromise = this._resolveLayoutComplete();\n }\n return this._layoutCompletePromise;\n }\n\n /**\n * Scrolls to the specified item index.\n *\n * Items outside the rendered window have only an estimated size, so the\n * first jump can miss the target. The items at the landing point are then\n * measured, and the scroll position is corrected. This repeats until the\n * offset is stable.\n *\n * The returned promise resolves when the scroll settles on the final,\n * corrected offset. Callers that need only the first, approximate scroll\n * can ignore it.\n */\n public async scrollToIndex(\n index: number,\n options?: ScrollIntoViewOptions\n ): Promise<void> {\n const maxIndex = Math.max(0, this._items.length - 1);\n const clampedIndex = clamp(index, 0, maxIndex);\n const behavior = options?.behavior ?? 'auto';\n\n // A newer call supersedes a correction loop that still runs for a\n // previous call, for example under rapid, repeated calls.\n const requestId = ++this._scrollRequestId;\n\n let offset = this._getAlignedScrollOffset(clampedIndex, options);\n await this._scrollAndWaitForEnd(offset, behavior);\n\n for (let i = 0; i < MAX_SCROLL_CORRECTION_PASSES; i++) {\n await this.layoutComplete;\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n\n const corrected = this._getAlignedScrollOffset(clampedIndex, options);\n if (Math.abs(corrected - offset) < SCROLL_OFFSET_EPSILON_PX) {\n break;\n }\n\n offset = corrected;\n await this._scrollAndWaitForEnd(offset, 'auto');\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n }\n }\n\n //#endregion\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-virtual-scroll': IgcVirtualScrollComponent;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"virtualization.js","sourceRoot":"","sources":["../../../src/components/virtualization/virtualization.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n isServer,\n LitElement,\n nothing,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { addHostListeners } from '#internals/controllers/host-listeners.js';\nimport { createResizeObserverController } from '#internals/controllers/resize-observer.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport type { Constructor } from '#internals/mixins/constructor.js';\nimport { EventEmitterMixin } from '#internals/mixins/event-emitter.js';\nimport { isLTR } from '#internals/utils/dom.js';\nimport { asNumber, clamp } from '#internals/utils/math.js';\nimport { VirtualScrollEngine } from './engine.js';\nimport { recycle } from './recycle.js';\nimport {\n type VirtualScrollDataRequest,\n VirtualScrollItemContext,\n type VirtualScrollState,\n type VisibleRange,\n} from './types.js';\n\nexport type VirtualScrollItemTemplate<T> = (\n context: VirtualScrollItemContext<T>\n) => TemplateResult | typeof nothing;\n\nexport type VirtualScrollKeyFunction<T> = (item: T, index: number) => unknown;\n\nexport interface IgcVirtualScrollComponentEventMap {\n igcStateChange: CustomEvent<VirtualScrollState>;\n igcDataRequest: CustomEvent<VirtualScrollDataRequest>;\n}\n\nconst REMOTE_SCROLLING_THRESHOLD = 5;\nconst MAX_LAYOUT_SETTLE_PASSES = 20;\nconst MAX_SCROLL_CORRECTION_PASSES = 5;\nconst SCROLL_END_TIMEOUT_MS = 2000;\nconst SCROLL_OFFSET_EPSILON_PX = 1;\n/** Fallback for a non-positive `estimatedItemSize`. Equal to its default. */\nconst DEFAULT_ESTIMATED_ITEM_SIZE = 50;\n/** How long the scroll position must stay unchanged to count as settled. */\nconst SCROLL_IDLE_MS = 100;\n/**\n * Upper limit on one `requestAnimationFrame` wait. A hidden tab or a\n * disconnected element gets no frames, and `layoutComplete` must still\n * resolve there.\n */\nconst LAYOUT_FRAME_TIMEOUT_MS = 100;\n\n/**\n * `scrollend` reports exactly when a scroll has settled. Safari before 18.2\n * does not have it, and `_scrollAndWaitForEnd` falls back to a scroll-idle\n * timer there.\n */\nconst SUPPORTS_SCROLL_END = !isServer && 'onscrollend' in window;\n\nconst EMPTY_RANGE: VisibleRange = Object.freeze({\n startIndex: 0,\n endIndex: -1,\n});\n\n/**\n * A virtual scroll component for large lists. Only the items visible in the\n * viewport are rendered.\n *\n * @element igc-virtual-scroll\n *\n * @fires igcStateChange - Emitted when the rendered virtual window changes.\n * @fires igcDataRequest - Emitted when the rendered window comes within a few items of the end\n * of `data`. Also emitted on the first render, when the loaded items do not fill the viewport.\n *\n * @csspart virtualization-track - The full-size element that gives the host its scrollable extent.\n * @csspart virtualization-content - The wrapper that holds the rendered items, translated into\n * position within the track.\n */\nexport default class IgcVirtualScrollComponent<\n T = any,\n> extends EventEmitterMixin<\n IgcVirtualScrollComponentEventMap,\n Constructor<LitElement>\n>(LitElement) {\n public static readonly tagName = 'igc-virtual-scroll';\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcVirtualScrollComponent);\n }\n\n private static _styleSheet: CSSStyleSheet | null = null;\n\n private static _getStyleSheet(): CSSStyleSheet {\n if (!IgcVirtualScrollComponent._styleSheet) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(`\n :where(igc-virtual-scroll) {\n display: block;\n position: relative;\n overflow: auto;\n height: 18.75rem;\n }\n\n :where(igc-virtual-scroll[orientation='vertical']) {\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) {\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n :where(igc-virtual-scroll) [part=\"virtualization-track\"] {\n position: relative;\n width: 100%;\n min-height: 100%;\n }\n\n :where(igc-virtual-scroll) [part=\"virtualization-content\"] {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n will-change: transform;\n contain: layout style paint;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) [part=\"virtualization-track\"] {\n height: 100%;\n width: auto;\n min-height: unset;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) [part=\"virtualization-content\"] {\n display: flex;\n flex-direction: row;\n height: 100%;\n width: auto;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']) [part=\"virtualization-content\"] > [data-vs-index] {\n flex-shrink: 0;\n height: 100%;\n }\n\n :where(igc-virtual-scroll[orientation='horizontal']):dir(rtl) [part=\"virtualization-content\"] {\n left: auto;\n right: 0;\n }\n `);\n IgcVirtualScrollComponent._styleSheet = sheet;\n }\n return IgcVirtualScrollComponent._styleSheet;\n }\n\n //#region Internal state\n\n protected readonly _engine = new VirtualScrollEngine();\n private readonly _contentRef = createRef<HTMLDivElement>();\n private readonly _itemResizeController = createResizeObserverController(\n this,\n {\n callback: this._handleItemResize,\n target: null,\n requestUpdate: false,\n }\n );\n\n private _currentRange: VisibleRange = EMPTY_RANGE;\n\n /**\n * The item index each wrapper element was last observed under. See\n * `_scheduleItemMeasurement`.\n */\n private readonly _observedItemIndexes = new WeakMap<Element, number>();\n private _lastEmittedState: VirtualScrollState | null = null;\n private _hasPendingDataRequest = false;\n private _layoutCompletePromise: Promise<void> | null = null;\n private _scrollRequestId = 0;\n\n /**\n * The `startIndex` of the last `igcDataRequest`, which is also the item count\n * at that emit. See `_checkDataRequest`.\n *\n * Kept across a disconnect, as `_hasPendingDataRequest` is. A move in the DOM\n * does not cancel what the consumer was already asked for, and clearing only\n * one of the two opens the request loop again on reconnect.\n */\n private _lastDataRequestIndex = -1;\n\n /**\n * The live scroll offset on the active axis. Not reactive: `render` reads it\n * only through `_currentRange`, so `_handleScroll` schedules an update only\n * if the window moves.\n */\n private _scrollPosition = 0;\n\n @state()\n private _viewportSize = 0;\n\n //#endregion\n\n //#region Public properties\n\n /**\n * The array of items to virtualize.\n *\n * Compared by reference: a mutation in place (`data.push(...)`) causes no\n * update. Assign a new array instead. The `igcDataRequest` flow also\n * expects a new array.\n */\n @property({ attribute: false })\n public data: T[] = [];\n\n /**\n * Scroll orientation of the virtual scroll.\n * @attr orientation\n * @default 'vertical'\n */\n @property({ reflect: true })\n public orientation: 'vertical' | 'horizontal' = 'vertical';\n\n /**\n * Number of extra items to render beyond the visible area of the viewport.\n * Higher values reduce blank flashes during fast scrolling but can lower performance.\n * @attr over-scan\n * @default 2\n */\n @property({ type: Number, attribute: 'over-scan' })\n public overScan = 2;\n\n /**\n * Estimated item size in pixels, used before an item is measured in the DOM.\n * After the first render of an item, the engine replaces the estimate with the measured size.\n * The average measured size also replaces the estimate of the items that are not measured\n * yet, so the scrollbar follows the real content.\n * @attr estimated-item-size\n * @default 50\n */\n @property({ type: Number, attribute: 'estimated-item-size' })\n public estimatedItemSize = DEFAULT_ESTIMATED_ITEM_SIZE;\n\n /**\n * A function that renders each item in the virtual scroll list.\n * Receives a VirtualScrollItemContext<T> with the item data, its index, and the total count.\n * Without it, nothing is rendered.\n *\n * Items are measured by their border box, so margins accumulate as drift\n * down the list. Use padding on the item, or a gap on a wrapper, instead.\n *\n * Only the current window is in the DOM, so assistive technology cannot\n * infer an item's position from the markup. Templates that render a role\n * with set semantics (`option`, `listitem`, `row`, ...) should map the\n * context's `index` and `count` onto `aria-posinset` and `aria-setsize`.\n *\n * Item elements are recycled (see `keyFunction`), so DOM state that the\n * template does not bind moves to another item, for example the state of a\n * checkbox without a `checked` binding. Bind all item state. Lit compares a\n * binding with the value that it set last, not with the element, so bind\n * state that the user changes with Lit's `live` directive. Also write user\n * changes back to the item, or they are lost when the item leaves the window.\n * To get new DOM for each item, wrap the content in Lit's `keyed` directive\n * with the item key: `` html`${keyed(ctx.value.id, content)}` ``.\n */\n @property({ attribute: false })\n public itemTemplate: VirtualScrollItemTemplate<T> | null = null;\n\n /* blazorSuppress */\n /**\n * A function that returns a unique key for an item. Receives the item and its index in `data`.\n *\n * An item keeps its rendered element while its key stays in the rendered window. The elements\n * of keys that leave the window are reused for keys that enter it. Without it, the index is the\n * key, so after a `data` change an index keeps its element and shows its new item. Set it when\n * items move within `data`, for example on sort, insert or remove.\n */\n @property({ attribute: false })\n public keyFunction: VirtualScrollKeyFunction<T> | null = null;\n\n //#endregion\n\n private _adoptStyles(): void {\n /* c8 ignore next 3 */\n if (isServer) {\n return;\n }\n\n const root = this.getRootNode() as Document | ShadowRoot;\n const sheet = IgcVirtualScrollComponent._getStyleSheet();\n if (!root.adoptedStyleSheets.includes(sheet)) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n }\n }\n\n constructor() {\n super();\n this._engine.onSizeChange = () => this.requestUpdate();\n this._handleScroll = this._handleScroll.bind(this);\n\n addHostListeners(this, {\n events: ['scroll'],\n listener: this._handleScroll,\n options: { passive: true },\n });\n\n // Viewport resize observer\n createResizeObserverController(this, {\n callback: this._measureViewport,\n });\n }\n\n //#region Lit lifecycle\n\n /** @internal */\n public override createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n /** @internal */\n public override connectedCallback(): void {\n super.connectedCallback();\n this._adoptStyles();\n this._engine.initMaxBrowserSize(this.ownerDocument);\n this._measureViewport();\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n // TODO: Either fix this in the theming controller or come up with some other solution.\n\n // Checked on each update, not only in `connectedCallback`, and does\n // nothing if the sheet is there. A host that renders this component in its\n // own shadow root, such as combo, can replace that root's\n // `adoptedStyleSheets` from its theming logic. That drops this sheet while\n // the element stays connected.\n this._adoptStyles();\n\n if (changed.has('data')) {\n this._engine.resize(\n this._items.length,\n this._normalizedItemSize,\n this._firstChangedIndex(changed.get('data'))\n );\n this._hasPendingDataRequest = false;\n }\n\n if (changed.has('estimatedItemSize')) {\n this._engine.updateEstimatedSize(this._normalizedItemSize);\n }\n\n if (changed.has('orientation')) {\n this._measureViewport();\n this._scrollPosition = this._currentAxisScroll();\n }\n\n this._currentRange = this._computeRange();\n }\n\n protected override updated(_changed: PropertyValues<this>): void {\n this._scheduleItemMeasurement();\n this._checkDataRequest();\n this._emitStateChange();\n }\n\n protected override render(): TemplateResult {\n if (!this.itemTemplate) {\n return html`${nothing}`;\n }\n\n const items = this._items;\n const range = this._currentRange;\n const count = items.length;\n const isVertical = this._isVertical;\n\n const trackStyle = isVertical\n ? { height: `${this._engine.domSize}px` }\n : { width: `${this._engine.domSize}px` };\n\n // The content wrapper is absolutely positioned at the origin of a track of\n // `domSize` px. A translation to the scroll offset of the first rendered\n // item puts that item at its virtual position.\n let contentPosition = this._engine.getScrollOffsetForIndex(\n range.startIndex\n );\n const physicalRangeSize = this._engine.getPhysicalRangeSize(\n range.startIndex,\n range.endIndex\n );\n contentPosition = clamp(\n contentPosition,\n 0,\n this._engine.domSize - physicalRangeSize\n );\n const isRTL = !isVertical && !isLTR(this);\n const contentStyle = {\n transform: isVertical\n ? `translateY(${contentPosition}px)`\n : `translateX(${isRTL ? -contentPosition : contentPosition}px)`,\n };\n\n const visibleItems =\n range.endIndex >= range.startIndex\n ? items.slice(range.startIndex, range.endIndex + 1)\n : [];\n\n return html`\n <div\n part=\"virtualization-track\"\n role=\"presentation\"\n style=${styleMap(trackStyle)}\n >\n <div\n ${ref(this._contentRef)}\n part=\"virtualization-content\"\n role=\"presentation\"\n style=${styleMap(contentStyle)}\n >\n ${recycle(\n visibleItems,\n (item, i) => this._keyOf(item, range.startIndex + i),\n (item, i) => {\n const itemIndex = range.startIndex + i;\n const ctx = new VirtualScrollItemContext(item, itemIndex, count);\n return html`<div role=\"presentation\" data-vs-index=${itemIndex}>\n ${this.itemTemplate!(ctx)}\n </div>`;\n }\n )}\n </div>\n </div>\n `;\n }\n\n //#endregion\n\n //#region Internal API\n\n private get _isVertical(): boolean {\n return this.orientation === 'vertical';\n }\n\n /** The configured `overScan`, normalized to a non-negative integer. */\n private get _normalizedOverScan(): number {\n return Math.max(0, Math.floor(asNumber(this.overScan, 2)));\n }\n\n /** The configured `estimatedItemSize`, normalized to a positive number. */\n private get _normalizedItemSize(): number {\n const size = asNumber(this.estimatedItemSize);\n return size > 0 ? size : DEFAULT_ESTIMATED_ITEM_SIZE;\n }\n\n /** `data`, guarded against a nullish value set by the consumer. */\n private get _items(): T[] {\n return this.data ?? [];\n }\n\n /** The key that ties the item at `index` to its rendered element. */\n private _keyOf(item: T, index: number): unknown {\n return this.keyFunction ? this.keyFunction(item, index) : index;\n }\n\n /**\n * The window to render for the current scroll position and viewport. Empty\n * until an `itemTemplate` is set, because nothing renders without one.\n */\n private _computeRange(): VisibleRange {\n return this.itemTemplate\n ? this._engine.getVisibleRange(\n this._scrollPosition,\n this._viewportSize,\n this._normalizedOverScan\n )\n : EMPTY_RANGE;\n }\n\n /**\n * The scroll offset that aligns `index` in the viewport, as `options` gives,\n * from the current size data of the engine. The same input can give a\n * different result as more items are measured.\n */\n private _getAlignedScrollOffset(\n index: number,\n options?: ScrollIntoViewOptions\n ): number {\n const position = this._isVertical\n ? (options?.block ?? 'start')\n : (options?.inline ?? options?.block ?? 'start');\n\n return this._engine.resolveScrollOffset(\n index,\n this._currentAxisScroll(),\n this._viewportSize,\n position\n );\n }\n\n /** Applies a scroll offset to the correct axis, accounting for RTL. */\n private _applyScroll(offset: number, behavior: ScrollBehavior): void {\n if (this._isVertical) {\n this.scrollTo({ top: offset, behavior });\n } else {\n this.scrollTo({ left: isLTR(this) ? offset : -offset, behavior });\n }\n }\n\n /** The current real scroll position on the active axis, normalized for RTL. */\n private _currentAxisScroll(): number {\n return this._isVertical\n ? this.scrollTop\n : isLTR(this)\n ? this.scrollLeft\n : -this.scrollLeft;\n }\n\n /**\n * Applies a scroll offset to the active axis, and waits for the scroll to\n * settle.\n *\n * @remarks\n * `scrollend` does not fire if the offset does not move the scroll position,\n * so that case resolves immediately. The timeout covers an event that never\n * arrives, for example when the element disconnects during the scroll.\n */\n private _scrollAndWaitForEnd(\n offset: number,\n behavior: ScrollBehavior\n ): Promise<void> {\n if (\n Math.abs(this._currentAxisScroll() - offset) < SCROLL_OFFSET_EPSILON_PX\n ) {\n return Promise.resolve();\n }\n\n return this._withDeadline(SCROLL_END_TIMEOUT_MS, (signal) => {\n const settled = SUPPORTS_SCROLL_END\n ? this._waitForScrollEnd(signal)\n : this._waitForScrollIdle(signal);\n\n // Applied only after the listener is attached, so an instant scroll\n // cannot settle before something watches for it.\n this._applyScroll(offset, behavior);\n return settled;\n });\n }\n\n /**\n * Resolves with `task`, or with a deadline of `ms`, whichever is first. The\n * signal then stops the other, so no timer or listener stays alive.\n */\n private _withDeadline(\n ms: number,\n task: (signal: AbortSignal) => Promise<void>\n ): Promise<void> {\n const controller = new AbortController();\n\n return Promise.race([\n task(controller.signal),\n this._timeout(ms, controller.signal),\n ]).finally(() => controller.abort());\n }\n\n private _waitForScrollEnd(signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n this.addEventListener('scrollend', () => resolve(), {\n once: true,\n signal,\n });\n });\n }\n\n /**\n * Resolves if no `scroll` event arrives for `SCROLL_IDLE_MS`, which is the\n * closest replacement for `scrollend`. The first timer starts immediately, so\n * a scroll that does not move also settles.\n */\n private _waitForScrollIdle(signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n let id = setTimeout(resolve, SCROLL_IDLE_MS);\n\n this.addEventListener(\n 'scroll',\n () => {\n clearTimeout(id);\n id = setTimeout(resolve, SCROLL_IDLE_MS);\n },\n { passive: true, signal }\n );\n\n signal.addEventListener('abort', () => clearTimeout(id), { once: true });\n });\n }\n\n private _timeout(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const id = setTimeout(resolve, ms);\n signal.addEventListener('abort', () => clearTimeout(id), { once: true });\n });\n }\n\n private _measureViewport(): void {\n this._viewportSize = this._isVertical\n ? this.clientHeight\n : this.clientWidth;\n }\n\n /**\n * Records the new scroll offset. Schedules a render only if the rendered\n * window moves.\n *\n * @remarks\n * `render` reads `_currentRange`, not the scroll offset. Without the guard,\n * a scroll inside one item runs each item template again for the same\n * result. `willUpdate` recomputes `_currentRange` for the other triggers,\n * so this skips only the redundant passes.\n */\n private _handleScroll(): void {\n this._scrollPosition = this._currentAxisScroll();\n\n const { startIndex, endIndex } = this._computeRange();\n if (\n startIndex !== this._currentRange.startIndex ||\n endIndex !== this._currentRange.endIndex\n ) {\n this.requestUpdate();\n }\n }\n\n /**\n * The length of the prefix that a `data` change keeps: the first index at\n * which the old and the new items differ, or the length of the shorter array\n * if neither differs. Measurements below that index stay valid. An append\n * keeps all the previous items. A filter or a replacement keeps fewer.\n *\n * @remarks\n * The test is item identity. An item that changes in place keeps its\n * measured size.\n */\n private _firstChangedIndex(previous: T[] | undefined): number {\n if (!previous) {\n return 0;\n }\n\n const items = this._items;\n const shared = Math.min(previous.length, items.length);\n for (let i = 0; i < shared; i++) {\n if (previous[i] !== items[i]) {\n return i;\n }\n }\n return shared;\n }\n\n private _handleItemResize(entries: ResizeObserverEntry[]): void {\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const index = asNumber(el.dataset.vsIndex, -1);\n if (index < 0) continue;\n\n const measured = this._isVertical\n ? (entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height)\n : (entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width);\n\n if (measured > 0) {\n this._engine.measureItem(index, measured);\n }\n }\n\n this._engine.adaptEstimate(this._currentRange.startIndex);\n }\n\n /**\n * Syncs the item observer with the rendered window, and applies only the\n * difference.\n *\n * @remarks\n * `observe` on an already observed element does nothing, so a new\n * measurement needs `unobserve` and then `observe`. Do this for each element\n * whose `data-vs-index` changed. The wrapper elements are recycled, so after\n * a scroll one element can hold a different item at the same size. The\n * observer does not report that, and the new index keeps its estimated size.\n */\n private _scheduleItemMeasurement(): void {\n const content = this._contentRef.value;\n if (!content) return;\n\n const observed = this._itemResizeController.targets;\n\n for (const element of observed) {\n if (element.parentNode !== content) {\n this._itemResizeController.unobserve(element);\n }\n }\n\n for (const element of content.children) {\n const index = asNumber((element as HTMLElement).dataset.vsIndex, -1);\n const isObserved = observed.has(element);\n\n if (isObserved && this._observedItemIndexes.get(element) === index) {\n continue;\n }\n\n if (isObserved) {\n this._itemResizeController.unobserve(element);\n }\n this._itemResizeController.observe(element);\n this._observedItemIndexes.set(element, index);\n }\n }\n\n /**\n * Emits `igcStateChange`. Does nothing if the window is empty or equal to\n * the last reported one, because a measurement pass renders again with no\n * window change.\n */\n private _emitStateChange(): void {\n const { startIndex, endIndex } = this._currentRange;\n if (endIndex < startIndex) return;\n\n const previous = this._lastEmittedState;\n const detail: VirtualScrollState = {\n startIndex,\n endIndex,\n viewportSize: this._viewportSize,\n totalSize: this._engine.totalSize,\n };\n\n if (\n previous &&\n previous.startIndex === detail.startIndex &&\n previous.endIndex === detail.endIndex &&\n previous.viewportSize === detail.viewportSize &&\n previous.totalSize === detail.totalSize\n ) {\n return;\n }\n\n this._lastEmittedState = { ...detail };\n this.emitEvent('igcStateChange', { detail });\n }\n\n private _checkDataRequest(): void {\n if (this._hasPendingDataRequest) return;\n\n const range = this._currentRange;\n const total = this._items.length;\n\n if (total === 0 || range.endIndex < total - REMOTE_SCROLLING_THRESHOLD) {\n return;\n }\n\n // Each `data` change clears `_hasPendingDataRequest`, also one that\n // appends nothing. Without this second guard, a consumer whose source is\n // exhausted and that assigns `data` again for each request gets that same\n // request again.\n if (this._lastDataRequestIndex === total) {\n return;\n }\n\n this._hasPendingDataRequest = true;\n this._lastDataRequestIndex = total;\n\n this.emitEvent('igcDataRequest', {\n detail: {\n startIndex: total,\n count: Math.max(this._normalizedOverScan * 4, 20),\n },\n });\n }\n\n /**\n * Resolves on the next animation frame, or after `LAYOUT_FRAME_TIMEOUT_MS` if\n * no frame arrives. A hidden tab or a disconnected element gets no frames,\n * and `layoutComplete` must still settle. Such a state has no layout to wait\n * for, so an early resolve is safe.\n */\n private _nextFrame(): Promise<void> {\n return this._withDeadline(\n LAYOUT_FRAME_TIMEOUT_MS,\n (signal) =>\n new Promise((resolve) => {\n const id = requestAnimationFrame(() => resolve());\n signal.addEventListener('abort', () => cancelAnimationFrame(id), {\n once: true,\n });\n })\n );\n }\n\n /**\n * Waits for the current update, then lets the ResizeObserver measurements\n * run. If those schedule one more render, for example when a measured size\n * replaces an estimate, the wait repeats until nothing is pending, up to a\n * safety cap.\n */\n private async _resolveLayoutComplete(): Promise<void> {\n try {\n await this.updateComplete;\n\n for (let i = 0; i < MAX_LAYOUT_SETTLE_PASSES; i++) {\n await this._nextFrame();\n\n if (!this.isUpdatePending) {\n break;\n }\n\n await this.updateComplete;\n }\n } finally {\n // Cleared here, not after the loop, so a run that throws cannot leave\n // the getter with a permanently rejected promise.\n this._layoutCompletePromise = null;\n }\n }\n\n //#endregion\n\n //#region Public API\n\n /* blazorSuppress */\n /**\n * Resolves when the virtual scroll has settled: the current render pass is\n * complete, the item-size measurements it triggers are complete, and so\n * are the renders those measurements schedule.\n *\n * `updateComplete` covers one Lit render pass. This covers `data` changes,\n * scrolls, and viewport resizes, where the stable DOM state comes after\n * one or more follow-up renders.\n */\n public get layoutComplete(): Promise<void> {\n if (!this._layoutCompletePromise) {\n this._layoutCompletePromise = this._resolveLayoutComplete();\n }\n return this._layoutCompletePromise;\n }\n\n /**\n * Scrolls to the specified item index.\n *\n * `block` (`inline` in the horizontal orientation) positions the item as in\n * `scrollIntoView`, and defaults to `start`. With `nearest`, the item\n * scrolls the smallest distance that brings it into view.\n *\n * Items outside the rendered window have only an estimated size, so the\n * first jump can miss the target. The items at the landing point are then\n * measured, and the scroll position is corrected. This repeats until the\n * offset is stable.\n *\n * The returned promise resolves when the scroll settles on the final,\n * corrected offset. Callers that need only the first, approximate scroll\n * can ignore it.\n */\n public async scrollToIndex(\n index: number,\n options?: ScrollIntoViewOptions\n ): Promise<void> {\n const maxIndex = Math.max(0, this._items.length - 1);\n const clampedIndex = clamp(index, 0, maxIndex);\n const behavior = options?.behavior ?? 'auto';\n\n // A newer call supersedes a correction loop that still runs for a\n // previous call, for example under rapid, repeated calls.\n const requestId = ++this._scrollRequestId;\n\n let offset = this._getAlignedScrollOffset(clampedIndex, options);\n await this._scrollAndWaitForEnd(offset, behavior);\n\n for (let i = 0; i < MAX_SCROLL_CORRECTION_PASSES; i++) {\n await this.layoutComplete;\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n\n const corrected = this._getAlignedScrollOffset(clampedIndex, options);\n if (Math.abs(corrected - offset) < SCROLL_OFFSET_EPSILON_PX) {\n break;\n }\n\n offset = corrected;\n await this._scrollAndWaitForEnd(offset, 'auto');\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n }\n }\n\n //#endregion\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-virtual-scroll': IgcVirtualScrollComponent;\n }\n}\n"]}
|