@botiverse/raft-ui 0.50.0 → 0.52.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 +32 -0
- package/dist/components/activity-inbox/activity-inbox-shell.d.mts +12 -0
- package/dist/components/activity-inbox/activity-inbox-shell.mjs +39 -0
- package/dist/components/activity-inbox/activity-inbox-shell.recipe.mjs +14 -0
- package/dist/components/activity-inbox/activity-inbox-sidebar.d.mts +6 -0
- package/dist/components/activity-inbox/activity-inbox-sidebar.mjs +22 -0
- package/dist/components/activity-inbox/activity-inbox-sidebar.recipe.mjs +22 -0
- package/dist/components/activity-inbox/activity-inbox-toolbar.d.mts +9 -0
- package/dist/components/activity-inbox/activity-inbox-toolbar.mjs +29 -0
- package/dist/components/activity-inbox/activity-inbox-toolbar.recipe.mjs +14 -0
- package/dist/components/activity-inbox/index.d.mts +4 -0
- package/dist/components/alert-dialog/alert-dialog.d.mts +41 -0
- package/dist/components/alert-dialog/alert-dialog.mjs +163 -0
- package/dist/components/alert-dialog/index.d.mts +2 -0
- package/dist/components/announcement-dialog/announcement-dialog.d.mts +18 -0
- package/dist/components/announcement-dialog/announcement-dialog.mjs +121 -0
- package/dist/components/announcement-dialog/index.d.mts +3 -0
- package/dist/components/app-rail/app-rail.d.mts +31 -0
- package/dist/components/app-rail/app-rail.mjs +126 -0
- package/dist/components/app-rail/app-rail.recipe.mjs +47 -0
- package/dist/components/app-rail/index.d.mts +2 -0
- package/dist/components/app-shell/app-shell.d.mts +27 -0
- package/dist/components/app-shell/app-shell.mjs +217 -0
- package/dist/components/app-shell/index.d.mts +2 -0
- package/dist/components/avatar/avatar.d.mts +169 -0
- package/dist/components/avatar/avatar.mjs +298 -0
- package/dist/components/avatar/index.d.mts +2 -0
- package/dist/components/badge/badge.d.mts +89 -0
- package/dist/components/badge/badge.mjs +203 -0
- package/dist/components/badge/index.d.mts +2 -0
- package/dist/components/banner/banner.d.mts +141 -0
- package/dist/components/banner/banner.mjs +228 -0
- package/dist/components/banner/index.d.mts +2 -0
- package/dist/components/button/button.d.mts +257 -0
- package/dist/components/button/button.mjs +177 -0
- package/dist/components/button/index.d.mts +2 -0
- package/dist/components/card/card.d.mts +21 -0
- package/dist/components/card/card.mjs +114 -0
- package/dist/components/card/card.recipe.d.mts +105 -0
- package/dist/components/card/card.recipe.mjs +67 -0
- package/dist/components/card/index.d.mts +2 -0
- package/dist/components/checkbox/checkbox-indicator.d.mts +92 -0
- package/dist/components/checkbox/checkbox-indicator.mjs +61 -0
- package/dist/components/checkbox/checkbox.d.mts +9 -0
- package/dist/components/checkbox/checkbox.mjs +40 -0
- package/dist/components/checkbox/index.d.mts +3 -0
- package/dist/components/choice-list/choice-list.d.mts +103 -0
- package/dist/components/choice-list/choice-list.mjs +301 -0
- package/dist/components/choice-list/choice-list.recipe.mjs +44 -0
- package/dist/components/choice-list/index.d.mts +2 -0
- package/dist/components/code-block/code-block.d.mts +30 -0
- package/dist/components/code-block/code-block.mjs +151 -0
- package/dist/components/code-block/code-block.recipe.mjs +47 -0
- package/dist/components/code-block/index.d.mts +2 -0
- package/dist/components/combobox/combobox.d.mts +69 -0
- package/dist/components/combobox/combobox.mjs +438 -0
- package/dist/components/combobox/index.d.mts +2 -0
- package/dist/components/combobox-select/combobox-select.d.mts +4 -0
- package/dist/components/combobox-select/combobox-select.list-side.mjs +16 -0
- package/dist/components/combobox-select/combobox-select.mjs +473 -0
- package/dist/components/combobox-select/combobox-select.options.mjs +21 -0
- package/dist/components/combobox-select/combobox-select.types.d.mts +83 -0
- package/dist/components/combobox-select/index.d.mts +3 -0
- package/dist/components/comment/comment-card.d.mts +40 -0
- package/dist/components/comment/comment-card.mjs +83 -0
- package/dist/components/comment/comment-entry.d.mts +24 -0
- package/dist/components/comment/comment-entry.mjs +75 -0
- package/dist/components/comment/comment-highlight.d.mts +18 -0
- package/dist/components/comment/comment-highlight.mjs +33 -0
- package/dist/components/comment/comment-margin-layout.d.mts +32 -0
- package/dist/components/comment/comment-margin-layout.mjs +44 -0
- package/dist/components/comment/comment-margin.d.mts +29 -0
- package/dist/components/comment/comment-margin.mjs +164 -0
- package/dist/components/comment/comment-marker.d.mts +16 -0
- package/dist/components/comment/comment-marker.mjs +24 -0
- package/dist/components/comment/comment.recipe.mjs +58 -0
- package/dist/components/comment/index.d.mts +8 -0
- package/dist/components/comment/use-comment-margin-fits.d.mts +16 -0
- package/dist/components/comment/use-comment-margin-fits.mjs +34 -0
- package/dist/components/composer/composer-attachment.recipe.mjs +85 -0
- package/dist/components/composer/composer-attachments-scroll-area.d.mts +5 -0
- package/dist/components/composer/composer-attachments-scroll-area.mjs +93 -0
- package/dist/components/composer/composer-attachments.d.mts +27 -0
- package/dist/components/composer/composer-attachments.mjs +147 -0
- package/dist/components/composer/composer-drop-overlay.d.mts +9 -0
- package/dist/components/composer/composer-drop-overlay.mjs +60 -0
- package/dist/components/composer/composer-drop-overlay.recipe.mjs +23 -0
- package/dist/components/composer/composer-root.d.mts +5 -0
- package/dist/components/composer/composer-root.mjs +18 -0
- package/dist/components/composer/composer-suggestion-list.d.mts +139 -0
- package/dist/components/composer/composer-suggestion-list.mjs +160 -0
- package/dist/components/composer/composer-toolbar-label.d.mts +5 -0
- package/dist/components/composer/composer-toolbar-label.mjs +24 -0
- package/dist/components/composer/composer.d.mts +20 -0
- package/dist/components/composer/composer.mjs +88 -0
- package/dist/components/composer/composer.recipe.mjs +29 -0
- package/dist/components/composer/index.d.mts +10 -0
- package/dist/components/composer/sortable-composer-attachments.d.mts +37 -0
- package/dist/components/composer/sortable-composer-attachments.mjs +247 -0
- package/dist/components/composer/use-composer-suggestions.d.mts +83 -0
- package/dist/components/composer/use-composer-suggestions.mjs +207 -0
- package/dist/components/context-menu/context-menu.d.mts +53 -0
- package/dist/components/context-menu/context-menu.mjs +275 -0
- package/dist/components/context-menu/index.d.mts +2 -0
- package/dist/components/conversation-panel/conversation-panel-empty-state.d.mts +9 -0
- package/dist/components/conversation-panel/conversation-panel-empty-state.mjs +57 -0
- package/dist/components/conversation-panel/conversation-panel.d.mts +20 -0
- package/dist/components/conversation-panel/conversation-panel.mjs +63 -0
- package/dist/components/conversation-panel/conversation-panel.recipe.mjs +15 -0
- package/dist/components/conversation-panel/index.d.mts +3 -0
- package/dist/components/copyable-code/copyable-code.d.mts +72 -0
- package/dist/components/copyable-code/copyable-code.mjs +153 -0
- package/dist/components/copyable-code/index.d.mts +2 -0
- package/dist/components/description-list/description-list.d.mts +59 -0
- package/dist/components/description-list/description-list.mjs +96 -0
- package/dist/components/description-list/index.d.mts +2 -0
- package/dist/components/dialog/dialog-sheet-context.mjs +58 -0
- package/dist/components/dialog/dialog-sheet.d.mts +31 -0
- package/dist/components/dialog/dialog-sheet.mjs +194 -0
- package/dist/components/dialog/dialog.d.mts +85 -0
- package/dist/components/dialog/dialog.mjs +371 -0
- package/dist/components/dialog/index.d.mts +3 -0
- package/dist/components/drag/drag-announcements.d.mts +72 -0
- package/dist/components/drag/drag-announcements.mjs +115 -0
- package/dist/components/drag/drag-lift.d.mts +100 -0
- package/dist/components/drag/drag-lift.mjs +276 -0
- package/dist/components/drag/drag-lists.d.mts +98 -0
- package/dist/components/drag/drag-lists.mjs +258 -0
- package/dist/components/drag/drag-sensors.d.mts +87 -0
- package/dist/components/drag/drag-sensors.mjs +169 -0
- package/dist/components/drag/drag.recipe.d.mts +7 -0
- package/dist/components/drag/drag.recipe.mjs +30 -0
- package/dist/components/drag/drop-placeholder.d.mts +41 -0
- package/dist/components/drag/drop-placeholder.mjs +161 -0
- package/dist/components/drag/index.d.mts +8 -0
- package/dist/components/drawer/drawer.d.mts +34 -0
- package/dist/components/drawer/drawer.mjs +202 -0
- package/dist/components/drawer/drawer.recipe.mjs +175 -0
- package/dist/components/drawer/index.d.mts +2 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.mts +62 -0
- package/dist/components/dropdown-menu/dropdown-menu.mjs +319 -0
- package/dist/components/dropdown-menu/index.d.mts +2 -0
- package/dist/components/ellipsis/ellipsis.d.mts +55 -0
- package/dist/components/ellipsis/ellipsis.mjs +320 -0
- package/dist/components/ellipsis/index.d.mts +3 -0
- package/dist/components/empty-state/empty-state.d.mts +15 -0
- package/dist/components/empty-state/empty-state.mjs +102 -0
- package/dist/components/empty-state/index.d.mts +2 -0
- package/dist/components/field/field.d.mts +79 -0
- package/dist/components/field/field.mjs +100 -0
- package/dist/components/field/index.d.mts +2 -0
- package/dist/components/file-preview/file-preview.d.mts +17 -0
- package/dist/components/file-preview/file-preview.mjs +210 -0
- package/dist/components/file-preview/file-preview.recipe.d.mts +99 -0
- package/dist/components/file-preview/file-preview.recipe.mjs +39 -0
- package/dist/components/file-preview/index.d.mts +2 -0
- package/dist/components/files/files.d.mts +35 -0
- package/dist/components/files/files.mjs +69 -0
- package/dist/components/files/files.recipe.mjs +40 -0
- package/dist/components/files/index.d.mts +2 -0
- package/dist/components/filter-chip/filter-chip.d.mts +25 -0
- package/dist/components/filter-chip/filter-chip.mjs +59 -0
- package/dist/components/filter-chip/index.d.mts +2 -0
- package/dist/components/float-button/float-button.d.mts +36 -0
- package/dist/components/float-button/float-button.mjs +116 -0
- package/dist/components/float-button/float-button.position.d.mts +6 -0
- package/dist/components/float-button/float-button.position.mjs +41 -0
- package/dist/components/float-button/index.d.mts +3 -0
- package/dist/components/form-section/form-section.d.mts +16 -0
- package/dist/components/form-section/form-section.mjs +53 -0
- package/dist/components/form-section/index.d.mts +2 -0
- package/dist/components/icon-tile/icon-tile.d.mts +97 -0
- package/dist/components/icon-tile/icon-tile.mjs +49 -0
- package/dist/components/icon-tile/index.d.mts +2 -0
- package/dist/components/icons/action-icons.d.mts +34 -0
- package/dist/components/icons/action-icons.mjs +383 -0
- package/dist/components/icons/conversation-icons.d.mts +12 -0
- package/dist/components/icons/conversation-icons.mjs +147 -0
- package/dist/components/icons/index.d.mts +4 -0
- package/dist/components/icons/object-icons.d.mts +6 -0
- package/dist/components/icons/object-icons.mjs +27 -0
- package/dist/components/inbox-item/inbox-item-leading-badge.d.mts +13 -0
- package/dist/components/inbox-item/inbox-item-leading-badge.mjs +27 -0
- package/dist/components/inbox-item/inbox-item-skeleton.d.mts +46 -0
- package/dist/components/inbox-item/inbox-item-skeleton.mjs +89 -0
- package/dist/components/inbox-item/inbox-item-skeleton.recipe.mjs +20 -0
- package/dist/components/inbox-item/inbox-item.d.mts +71 -0
- package/dist/components/inbox-item/inbox-item.mjs +276 -0
- package/dist/components/inbox-item/inbox-item.recipe.mjs +137 -0
- package/dist/components/inbox-item/index.d.mts +2 -0
- package/dist/components/inline-code/index.d.mts +2 -0
- package/dist/components/inline-code/inline-code.d.mts +8 -0
- package/dist/components/inline-code/inline-code.mjs +30 -0
- package/dist/components/input/index.d.mts +2 -0
- package/dist/components/input/input.d.mts +16 -0
- package/dist/components/input/input.mjs +20 -0
- package/dist/components/input/input.recipe.mjs +12 -0
- package/dist/components/input-group/index.d.mts +2 -0
- package/dist/components/input-group/input-group.d.mts +93 -0
- package/dist/components/input-group/input-group.mjs +178 -0
- package/dist/components/kbd/index.d.mts +2 -0
- package/dist/components/kbd/kbd.d.mts +7 -0
- package/dist/components/kbd/kbd.mjs +34 -0
- package/dist/components/label/index.d.mts +2 -0
- package/dist/components/label/label.d.mts +60 -0
- package/dist/components/label/label.mjs +75 -0
- package/dist/components/legacy-task-panel/index.d.mts +2 -0
- package/dist/components/legacy-task-panel/legacy-task-panel.d.mts +57 -0
- package/dist/components/legacy-task-panel/legacy-task-panel.mjs +234 -0
- package/dist/components/legacy-task-panel/legacy-task-panel.recipe.mjs +30 -0
- package/dist/components/lightbox/index.d.mts +2 -0
- package/dist/components/lightbox/lightbox.d.mts +55 -0
- package/dist/components/lightbox/lightbox.mjs +336 -0
- package/dist/components/list-row/index.d.mts +2 -0
- package/dist/components/list-row/list-row-skeleton.d.mts +21 -0
- package/dist/components/list-row/list-row-skeleton.mjs +43 -0
- package/dist/components/list-row/list-row.d.mts +66 -0
- package/dist/components/list-row/list-row.mjs +167 -0
- package/dist/components/list-row/list-row.recipe.d.mts +126 -0
- package/dist/components/list-row/list-row.recipe.mjs +94 -0
- package/dist/components/live-agent-activity-bar/index.d.mts +2 -0
- package/dist/components/live-agent-activity-bar/live-agent-activity-bar.d.mts +25 -0
- package/dist/components/live-agent-activity-bar/live-agent-activity-bar.mjs +107 -0
- package/dist/components/logo/index.d.mts +2 -0
- package/dist/components/logo/raft-logo.d.mts +9 -0
- package/dist/components/logo/raft-logo.mjs +63 -0
- package/dist/components/markdown/index.d.mts +2 -0
- package/dist/components/markdown/markdown-parts.d.mts +54 -0
- package/dist/components/markdown/markdown-parts.mjs +153 -0
- package/dist/components/markdown/markdown.recipe.mjs +77 -0
- package/dist/components/message-action-card/index.d.mts +2 -0
- package/dist/components/message-action-card/message-action-card-content.recipe.mjs +50 -0
- package/dist/components/message-action-card/message-action-card.d.mts +95 -0
- package/dist/components/message-action-card/message-action-card.mjs +298 -0
- package/dist/components/message-action-card/message-action-card.recipe.mjs +47 -0
- package/dist/components/message-attachment/index.d.mts +5 -0
- package/dist/components/message-attachment/message-attachment.d.mts +27 -0
- package/dist/components/message-attachment/message-attachment.mjs +129 -0
- package/dist/components/message-attachment/message-attachment.recipe.mjs +36 -0
- package/dist/components/message-attachment/message-image-gallery-rows.d.mts +47 -0
- package/dist/components/message-attachment/message-image-gallery-rows.mjs +55 -0
- package/dist/components/message-attachment/message-image-gallery.d.mts +32 -0
- package/dist/components/message-attachment/message-image-gallery.mjs +105 -0
- package/dist/components/message-attachment/message-image-gallery.recipe.mjs +61 -0
- package/dist/components/message-attachment/message-video-preview.d.mts +19 -0
- package/dist/components/message-attachment/message-video-preview.mjs +92 -0
- package/dist/components/message-attachment/message-video-preview.recipe.mjs +33 -0
- package/dist/components/message-embed/index.d.mts +2 -0
- package/dist/components/message-embed/message-embed.d.mts +12 -0
- package/dist/components/message-embed/message-embed.mjs +42 -0
- package/dist/components/message-embed/message-embed.recipe.mjs +14 -0
- package/dist/components/message-forwarded-bundle/index.d.mts +2 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.d.mts +92 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.mjs +324 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.recipe.mjs +81 -0
- package/dist/components/message-item/index.d.mts +13 -0
- package/dist/components/message-item/message-footer.d.mts +20 -0
- package/dist/components/message-item/message-footer.mjs +54 -0
- package/dist/components/message-item/message-footer.recipe.mjs +46 -0
- package/dist/components/message-item/message-item-content.d.mts +22 -0
- package/dist/components/message-item/message-item-content.mjs +81 -0
- package/dist/components/message-item/message-item-delegated.d.mts +38 -0
- package/dist/components/message-item/message-item-delegated.mjs +72 -0
- package/dist/components/message-item/message-item-gutter.d.mts +10 -0
- package/dist/components/message-item/message-item-gutter.mjs +41 -0
- package/dist/components/message-item/message-item-header.d.mts +29 -0
- package/dist/components/message-item/message-item-header.mjs +107 -0
- package/dist/components/message-item/message-item-label.mjs +113 -0
- package/dist/components/message-item/message-item-root.d.mts +25 -0
- package/dist/components/message-item/message-item-root.mjs +39 -0
- package/dist/components/message-item/message-item-toolbar.d.mts +9 -0
- package/dist/components/message-item/message-item-toolbar.mjs +131 -0
- package/dist/components/message-item/message-item.recipe.d.mts +101 -0
- package/dist/components/message-item/message-item.recipe.mjs +114 -0
- package/dist/components/message-item/message-multi-select.d.mts +15 -0
- package/dist/components/message-item/message-multi-select.mjs +49 -0
- package/dist/components/message-item/message-multi-select.recipe.mjs +23 -0
- package/dist/components/message-item/message-reaction.d.mts +39 -0
- package/dist/components/message-item/message-reaction.mjs +188 -0
- package/dist/components/message-item/message-reaction.recipe.mjs +76 -0
- package/dist/components/message-item/message-reference.d.mts +50 -0
- package/dist/components/message-item/message-reference.mjs +111 -0
- package/dist/components/message-item/message-reference.recipe.d.mts +6 -0
- package/dist/components/message-item/message-reference.recipe.mjs +63 -0
- package/dist/components/message-item/message-text-selection-toolbar.d.mts +24 -0
- package/dist/components/message-item/message-text-selection-toolbar.mjs +13 -0
- package/dist/components/message-list/index.d.mts +4 -0
- package/dist/components/message-list/message-list-jump.d.mts +21 -0
- package/dist/components/message-list/message-list-jump.mjs +73 -0
- package/dist/components/message-list/message-list-markers.d.mts +13 -0
- package/dist/components/message-list/message-list-markers.mjs +70 -0
- package/dist/components/message-list/message-list.d.mts +7 -0
- package/dist/components/message-list/message-list.mjs +52 -0
- package/dist/components/message-list/message-list.recipe.mjs +54 -0
- package/dist/components/message-quoted-preview/index.d.mts +2 -0
- package/dist/components/message-quoted-preview/message-quoted-preview.d.mts +40 -0
- package/dist/components/message-quoted-preview/message-quoted-preview.mjs +144 -0
- package/dist/components/message-quoted-preview/message-quoted-preview.recipe.mjs +38 -0
- package/dist/components/message-replies/index.d.mts +2 -0
- package/dist/components/message-replies/message-replies.d.mts +17 -0
- package/dist/components/message-replies/message-replies.mjs +79 -0
- package/dist/components/message-replies/message-replies.recipe.mjs +25 -0
- package/dist/components/message-translation/index.d.mts +2 -0
- package/dist/components/message-translation/message-translation.d.mts +20 -0
- package/dist/components/message-translation/message-translation.mjs +64 -0
- package/dist/components/message-translation/message-translation.recipe.mjs +27 -0
- package/dist/components/meter/index.d.mts +2 -0
- package/dist/components/meter/meter.d.mts +107 -0
- package/dist/components/meter/meter.mjs +118 -0
- package/dist/components/mobile-nav/index.d.mts +3 -0
- package/dist/components/mobile-nav/mobile-nav-server.d.mts +71 -0
- package/dist/components/mobile-nav/mobile-nav-server.mjs +287 -0
- package/dist/components/mobile-nav/mobile-nav.d.mts +12 -0
- package/dist/components/mobile-nav/mobile-nav.mjs +73 -0
- package/dist/components/mode-bar/index.d.mts +2 -0
- package/dist/components/mode-bar/mode-bar.d.mts +33 -0
- package/dist/components/mode-bar/mode-bar.mjs +115 -0
- package/dist/components/notification-center/index.d.mts +2 -0
- package/dist/components/notification-center/notification-center.d.mts +225 -0
- package/dist/components/notification-center/notification-center.mjs +340 -0
- package/dist/components/panel/index.d.mts +7 -0
- package/dist/components/panel/panel-action.d.mts +15 -0
- package/dist/components/panel/panel-action.mjs +23 -0
- package/dist/components/panel/panel-action.recipe.mjs +40 -0
- package/dist/components/panel/panel-header.d.mts +34 -0
- package/dist/components/panel/panel-header.mjs +135 -0
- package/dist/components/panel/panel-header.recipe.mjs +78 -0
- package/dist/components/panel/panel-notice.d.mts +16 -0
- package/dist/components/panel/panel-notice.mjs +77 -0
- package/dist/components/panel/panel-split-action.d.mts +34 -0
- package/dist/components/panel/panel-split-action.mjs +69 -0
- package/dist/components/panel/panel-split-action.recipe.mjs +53 -0
- package/dist/components/panel/panel-toggle-action.d.mts +6 -0
- package/dist/components/panel/panel-toggle-action.mjs +15 -0
- package/dist/components/panel/panel.d.mts +25 -0
- package/dist/components/panel/panel.mjs +96 -0
- package/dist/components/panel/panel.recipe.mjs +24 -0
- package/dist/components/picker-trigger-button/index.d.mts +2 -0
- package/dist/components/picker-trigger-button/picker-trigger-button.d.mts +7 -0
- package/dist/components/picker-trigger-button/picker-trigger-button.mjs +36 -0
- package/dist/components/popover/index.d.mts +2 -0
- package/dist/components/popover/popover.d.mts +41 -0
- package/dist/components/popover/popover.mjs +184 -0
- package/dist/components/preview-card/index.d.mts +2 -0
- package/dist/components/preview-card/preview-card.d.mts +43 -0
- package/dist/components/preview-card/preview-card.mjs +197 -0
- package/dist/components/profile-panel/index.d.mts +2 -0
- package/dist/components/profile-panel/profile-panel.d.mts +14 -0
- package/dist/components/profile-panel/profile-panel.mjs +46 -0
- package/dist/components/profile-panel/profile-panel.recipe.mjs +14 -0
- package/dist/components/progress/index.d.mts +2 -0
- package/dist/components/progress/progress.d.mts +119 -0
- package/dist/components/progress/progress.mjs +139 -0
- package/dist/components/pull-to-refresh/index.d.mts +4 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-gesture.d.mts +30 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-gesture.mjs +134 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-indicator.d.mts +21 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-indicator.mjs +153 -0
- package/dist/components/pull-to-refresh/pull-to-refresh-material-progress.mjs +150 -0
- package/dist/components/pull-to-refresh/use-pull-to-refresh.d.mts +55 -0
- package/dist/components/pull-to-refresh/use-pull-to-refresh.mjs +156 -0
- package/dist/components/radio-group/index.d.mts +2 -0
- package/dist/components/radio-group/radio-group.d.mts +14 -0
- package/dist/components/radio-group/radio-group.mjs +59 -0
- package/dist/components/resizable/index.d.mts +2 -0
- package/dist/components/resizable/resizable.d.mts +15 -0
- package/dist/components/resizable/resizable.mjs +39 -0
- package/dist/components/resizable/resizable.recipe.mjs +24 -0
- package/dist/components/scroll-area/index.d.mts +2 -0
- package/dist/components/scroll-area/scroll-area.d.mts +17 -0
- package/dist/components/scroll-area/scroll-area.mjs +55 -0
- package/dist/components/scroll-area/scroll-area.recipe.mjs +23 -0
- package/dist/components/search/index.d.mts +6 -0
- package/dist/components/search/search-entity.d.mts +24 -0
- package/dist/components/search/search-entity.mjs +106 -0
- package/dist/components/search/search-entity.recipe.mjs +41 -0
- package/dist/components/search/search-message.d.mts +25 -0
- package/dist/components/search/search-message.mjs +115 -0
- package/dist/components/search/search-message.recipe.mjs +32 -0
- package/dist/components/search/search-thread.d.mts +17 -0
- package/dist/components/search/search-thread.mjs +79 -0
- package/dist/components/search/search-thread.recipe.mjs +16 -0
- package/dist/components/search/search-trigger.d.mts +15 -0
- package/dist/components/search/search-trigger.mjs +59 -0
- package/dist/components/search/search.d.mts +23 -0
- package/dist/components/search/search.mjs +88 -0
- package/dist/components/search/search.recipe.mjs +22 -0
- package/dist/components/segmented-control/index.d.mts +2 -0
- package/dist/components/segmented-control/segmented-control.d.mts +38 -0
- package/dist/components/segmented-control/segmented-control.mjs +306 -0
- package/dist/components/select/index.d.mts +2 -0
- package/dist/components/select/select.d.mts +95 -0
- package/dist/components/select/select.mjs +483 -0
- package/dist/components/separator/index.d.mts +2 -0
- package/dist/components/separator/separator.d.mts +10 -0
- package/dist/components/separator/separator.mjs +49 -0
- package/dist/components/sidebar/index.d.mts +5 -0
- package/dist/components/sidebar/sidebar-item.d.mts +64 -0
- package/dist/components/sidebar/sidebar-item.mjs +201 -0
- package/dist/components/sidebar/sidebar-item.recipe.mjs +100 -0
- package/dist/components/sidebar/sidebar-menu.d.mts +13 -0
- package/dist/components/sidebar/sidebar-menu.mjs +67 -0
- package/dist/components/sidebar/sidebar-menu.recipe.mjs +22 -0
- package/dist/components/sidebar/sidebar-section.d.mts +41 -0
- package/dist/components/sidebar/sidebar-section.mjs +164 -0
- package/dist/components/sidebar/sidebar-section.recipe.mjs +45 -0
- package/dist/components/sidebar/sidebar.d.mts +17 -0
- package/dist/components/sidebar/sidebar.mjs +149 -0
- package/dist/components/sidebar/sidebar.recipe.mjs +37 -0
- package/dist/components/skeleton/index.d.mts +2 -0
- package/dist/components/skeleton/skeleton.d.mts +50 -0
- package/dist/components/skeleton/skeleton.mjs +29 -0
- package/dist/components/spinner/index.d.mts +2 -0
- package/dist/components/spinner/spinner.d.mts +77 -0
- package/dist/components/spinner/spinner.mjs +118 -0
- package/dist/components/status/index.d.mts +2 -0
- package/dist/components/status/status.d.mts +143 -0
- package/dist/components/status/status.mjs +56 -0
- package/dist/components/steps/index.d.mts +3 -0
- package/dist/components/steps/otter-indicator.d.mts +17 -0
- package/dist/components/steps/otter-indicator.mjs +331 -0
- package/dist/components/steps/steps.d.mts +50 -0
- package/dist/components/steps/steps.mjs +174 -0
- package/dist/components/switch/index.d.mts +2 -0
- package/dist/components/switch/switch.d.mts +9 -0
- package/dist/components/switch/switch.mjs +50 -0
- package/dist/components/system-message/index.d.mts +2 -0
- package/dist/components/system-message/system-message.d.mts +27 -0
- package/dist/components/system-message/system-message.mjs +113 -0
- package/dist/components/system-message/system-message.recipe.mjs +34 -0
- package/dist/components/table/index.d.mts +2 -0
- package/dist/components/table/table.d.mts +35 -0
- package/dist/components/table/table.mjs +102 -0
- package/dist/components/table/table.recipe.mjs +31 -0
- package/dist/components/tabs/index.d.mts +2 -0
- package/dist/components/tabs/tabs.d.mts +185 -0
- package/dist/components/tabs/tabs.mjs +528 -0
- package/dist/components/task-board/index.d.mts +2 -0
- package/dist/components/task-board/task-board-column.recipe.mjs +46 -0
- package/dist/components/task-board/task-board.d.mts +40 -0
- package/dist/components/task-board/task-board.mjs +155 -0
- package/dist/components/task-card/index.d.mts +2 -0
- package/dist/components/task-card/task-card-status.recipe.mjs +17 -0
- package/dist/components/task-card/task-card.d.mts +30 -0
- package/dist/components/task-card/task-card.mjs +141 -0
- package/dist/components/task-card/task-card.recipe.mjs +39 -0
- package/dist/components/task-dnd/index.d.mts +2 -0
- package/dist/components/task-dnd/task-dnd.d.mts +75 -0
- package/dist/components/task-dnd/task-dnd.mjs +341 -0
- package/dist/components/task-dnd/task-dnd.recipe.mjs +20 -0
- package/dist/components/task-list/index.d.mts +2 -0
- package/dist/components/task-list/task-list-section.recipe.mjs +37 -0
- package/dist/components/task-list/task-list.d.mts +34 -0
- package/dist/components/task-list/task-list.mjs +119 -0
- package/dist/components/tasks/index.d.mts +7 -0
- package/dist/components/tasks/task-chip.d.mts +14 -0
- package/dist/components/tasks/task-chip.mjs +81 -0
- package/dist/components/tasks/task-loading.d.mts +7 -0
- package/dist/components/tasks/task-loading.mjs +32 -0
- package/dist/components/tasks/task-loading.recipe.mjs +8 -0
- package/dist/components/tasks/task-status-badge.d.mts +24 -0
- package/dist/components/tasks/task-status-badge.mjs +24 -0
- package/dist/components/tasks/task-status-icon.d.mts +13 -0
- package/dist/components/tasks/task-status-icon.mjs +90 -0
- package/dist/components/tasks/task-status.recipe.d.mts +62 -0
- package/dist/components/tasks/task-status.recipe.mjs +33 -0
- package/dist/components/tasks/tasks-panel.d.mts +22 -0
- package/dist/components/tasks/tasks-panel.mjs +114 -0
- package/dist/components/tasks/tasks-panel.recipe.mjs +36 -0
- package/dist/components/text/index.d.mts +2 -0
- package/dist/components/text/text.d.mts +186 -0
- package/dist/components/text/text.mjs +114 -0
- package/dist/components/text-link/index.d.mts +2 -0
- package/dist/components/text-link/text-link.d.mts +36 -0
- package/dist/components/text-link/text-link.mjs +60 -0
- package/dist/components/text-selection-toolbar/index.d.mts +3 -0
- package/dist/components/text-selection-toolbar/text-selection-anchor.d.mts +22 -0
- package/dist/components/text-selection-toolbar/text-selection-anchor.mjs +106 -0
- package/dist/components/text-selection-toolbar/text-selection-toolbar.d.mts +20 -0
- package/dist/components/text-selection-toolbar/text-selection-toolbar.mjs +41 -0
- package/dist/components/text-selection-toolbar/text-selection-toolbar.recipe.mjs +19 -0
- package/dist/components/textarea/index.d.mts +2 -0
- package/dist/components/textarea/textarea.d.mts +16 -0
- package/dist/components/textarea/textarea.mjs +62 -0
- package/dist/components/thread-panel/index.d.mts +2 -0
- package/dist/components/thread-panel/thread-panel.d.mts +31 -0
- package/dist/components/thread-panel/thread-panel.mjs +162 -0
- package/dist/components/thread-panel/thread-panel.recipe.mjs +36 -0
- package/dist/components/timeline/index.d.mts +2 -0
- package/dist/components/timeline/timeline.d.mts +44 -0
- package/dist/components/timeline/timeline.mjs +81 -0
- package/dist/components/toast/index.d.mts +2 -0
- package/dist/components/toast/toast.d.mts +263 -0
- package/dist/components/toast/toast.mjs +556 -0
- package/dist/components/toggle-group/index.d.mts +2 -0
- package/dist/components/toggle-group/toggle-group.d.mts +15 -0
- package/dist/components/toggle-group/toggle-group.mjs +64 -0
- package/dist/components/tooltip/index.d.mts +2 -0
- package/dist/components/tooltip/tooltip.d.mts +18 -0
- package/dist/components/tooltip/tooltip.mjs +197 -0
- package/dist/components/virtual-list/ItemColumns.mjs +37 -0
- package/dist/components/virtual-list/VirtualList.d.mts +4 -0
- package/dist/components/virtual-list/VirtualList.mjs +1401 -0
- package/dist/components/virtual-list/VirtualListContext.mjs +5 -0
- package/dist/components/virtual-list/hooks/use-event-callback.mjs +10 -0
- package/dist/components/virtual-list/hooks/use-ios-momentum-compensation.mjs +148 -0
- package/dist/components/virtual-list/hooks/use-keyboard-scroll.mjs +42 -0
- package/dist/components/virtual-list/hooks/use-latest-ref.mjs +10 -0
- package/dist/components/virtual-list/hooks/use-layout-effect-with-previous.mjs +16 -0
- package/dist/components/virtual-list/hooks/use-memo-with-previous.mjs +22 -0
- package/dist/components/virtual-list/hooks/use-non-passive-wheel.mjs +23 -0
- package/dist/components/virtual-list/hooks/use-non-virtual-content-resize.mjs +28 -0
- package/dist/components/virtual-list/hooks/use-scroll-anchor.mjs +55 -0
- package/dist/components/virtual-list/index.d.mts +5 -0
- package/dist/components/virtual-list/public-types.d.mts +341 -0
- package/dist/components/virtual-list/resize-observer/ResizeObserverWrapper.d.mts +5 -0
- package/dist/components/virtual-list/resize-observer/ResizeObserverWrapper.mjs +70 -0
- package/dist/components/virtual-list/resize-observer/resize-observer-delegate.d.mts +6 -0
- package/dist/components/virtual-list/resize-observer/resize-observer-delegate.mjs +54 -0
- package/dist/components/virtual-list/utils/align.mjs +19 -0
- package/dist/components/virtual-list/utils/constants.mjs +30 -0
- package/dist/components/virtual-list/utils/fenwick-tree.mjs +66 -0
- package/dist/components/virtual-list/utils/items-anchor.mjs +49 -0
- package/dist/components/virtual-list/utils/measure.mjs +77 -0
- package/dist/components/virtual-list/utils/platform.mjs +39 -0
- package/dist/components/virtual-list/utils/range.mjs +103 -0
- package/dist/components/virtual-list/utils/size-cache.mjs +35 -0
- package/dist/components/workspace-button/index.d.mts +2 -0
- package/dist/components/workspace-button/workspace-button.d.mts +9 -0
- package/dist/components/workspace-button/workspace-button.mjs +28 -0
- package/dist/index.d.mts +239 -4864
- package/dist/index.mjs +142 -17053
- package/dist/lib/chip-remove.mjs +17 -0
- package/dist/lib/data-attributes.d.mts +5 -0
- package/dist/lib/decision-width.mjs +9 -0
- package/dist/lib/default-native-button.mjs +8 -0
- package/dist/lib/desktop-media.mjs +10 -0
- package/dist/lib/drag-escape.mjs +37 -0
- package/dist/lib/frame-insets.mjs +127 -0
- package/dist/lib/head-edges.mjs +44 -0
- package/dist/lib/hud-text-action.mjs +10 -0
- package/dist/lib/inline-chip.mjs +30 -0
- package/dist/lib/input-modality.d.mts +36 -0
- package/dist/lib/input-modality.mjs +186 -0
- package/dist/lib/list-cell.mjs +21 -0
- package/dist/lib/located.d.mts +25 -0
- package/dist/lib/located.mjs +28 -0
- package/dist/lib/overlay-depth.d.mts +42 -0
- package/dist/lib/overlay-depth.mjs +59 -0
- package/dist/lib/phone-media.mjs +24 -0
- package/dist/lib/presence.d.mts +16 -0
- package/dist/lib/presence.mjs +16 -0
- package/dist/lib/row-tone.d.mts +8 -0
- package/dist/lib/search-hit.mjs +18 -0
- package/dist/lib/stacked-actions.mjs +112 -0
- package/dist/lib/styled-props.d.mts +15 -0
- package/dist/lib/tap-activation.mjs +133 -0
- package/dist/lib/theme/theme-context.d.mts +10 -0
- package/dist/lib/theme/theme-context.mjs +9 -0
- package/dist/lib/theme/theme-provider.d.mts +23 -0
- package/dist/lib/theme/theme-provider.mjs +61 -0
- package/dist/lib/theme/theme-scope.mjs +19 -0
- package/dist/lib/theme/use-theme.d.mts +5 -0
- package/dist/lib/theme/use-theme.mjs +9 -0
- package/dist/lib/touch-drag.d.mts +55 -0
- package/dist/lib/touch-drag.mjs +151 -0
- package/dist/lib/truncation.d.mts +26 -0
- package/dist/lib/truncation.mjs +153 -0
- package/dist/lib/tv.d.mts +2 -0
- package/dist/lib/tv.mjs +14 -0
- package/dist/lib/use-copy-to-clipboard.mjs +58 -0
- package/dist/lib/use-merged-ref.mjs +60 -0
- package/dist/lib/use-mobile-viewport.mjs +17 -0
- package/dist/lib/use-overflow-title.mjs +49 -0
- package/dist/lib/use-scrollbar-size.d.mts +16 -0
- package/dist/lib/use-scrollbar-size.mjs +46 -0
- package/dist/lib/use-truncated.d.mts +20 -0
- package/dist/lib/use-truncated.mjs +34 -0
- package/dist/lib/without-children.d.mts +8 -0
- package/dist/wip.d.mts +61 -1222
- package/dist/wip.mjs +43 -3079
- package/package.json +8 -1
- package/dist/inbox-item-B4nNvpp1.d.mts +0 -1784
- package/dist/inbox-item-DHJOrxB8.mjs +0 -7454
- package/dist/style.css +0 -1395
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { ObservedResizeEntry } from "./resize-observer/resize-observer-delegate.mjs";
|
|
2
|
+
import { MeasuredRef } from "./resize-observer/ResizeObserverWrapper.mjs";
|
|
3
|
+
import { CSSProperties, ComponentType, ElementType, HTMLAttributes, ReactElement, ReactNode, Ref, RefObject } from "react";
|
|
4
|
+
//#region src/components/virtual-list/public-types.d.ts
|
|
5
|
+
/** A column: only `width` is read (summed into the column Fenwick tree). */
|
|
6
|
+
export interface Column {
|
|
7
|
+
width: number;
|
|
8
|
+
}
|
|
9
|
+
/** What `renderCol` receives for one column of a row. */
|
|
10
|
+
export interface RenderColInfo {
|
|
11
|
+
/** The column (undefined past the last one). */
|
|
12
|
+
column: Column | undefined;
|
|
13
|
+
/** The column's left edge, in px: the sum of the widths before it. */
|
|
14
|
+
left: number;
|
|
15
|
+
/** The row's item. */
|
|
16
|
+
item: unknown;
|
|
17
|
+
/** The column's index, to use as the React key of what is rendered. */
|
|
18
|
+
key: number;
|
|
19
|
+
}
|
|
20
|
+
/** What `renderItemWithCols` receives for a row. */
|
|
21
|
+
export interface RenderItemWithColsInfo {
|
|
22
|
+
/** The row's index in `items`. */
|
|
23
|
+
itemIndex: number | undefined;
|
|
24
|
+
/** The first column in view. */
|
|
25
|
+
startColIndex: number;
|
|
26
|
+
/** The last column in view (inclusive). */
|
|
27
|
+
endColIndex: number;
|
|
28
|
+
/** Every column, `columns` as given. */
|
|
29
|
+
allColumns: readonly Column[];
|
|
30
|
+
/** The row's item. */
|
|
31
|
+
item: unknown;
|
|
32
|
+
/** The left edge of column `index`, in px. */
|
|
33
|
+
getLeft: (index: number) => number;
|
|
34
|
+
}
|
|
35
|
+
/** What an item renderer receives (`ItemComponent` props, the `children` function's argument). */
|
|
36
|
+
export interface ItemRenderProps<T> {
|
|
37
|
+
/** The ref to put on the item's root element (null when `itemResizable` is off). */
|
|
38
|
+
domRef: MeasuredRef | null;
|
|
39
|
+
/** The item this row renders. */
|
|
40
|
+
item: T;
|
|
41
|
+
/** The item's index in `items`. */
|
|
42
|
+
index: number | undefined;
|
|
43
|
+
/** With `columns` and `renderCol`: the row's columns in view, to render inside the row. */
|
|
44
|
+
renderedCols: ReactElement | undefined;
|
|
45
|
+
/** With `columns` and `renderItemWithCols`: what it rendered for the row, to render inside the row. */
|
|
46
|
+
renderedItemWithCols: ReactElement | undefined;
|
|
47
|
+
/** Set only for an item kept mounted outside the range (absolutely positioned). */
|
|
48
|
+
style: CSSProperties | undefined;
|
|
49
|
+
}
|
|
50
|
+
export type ScrollPosition = "top" | "bottom";
|
|
51
|
+
/** Where `scrollTo` with `index` / `key` and `align` puts the item in the view. */
|
|
52
|
+
export type ScrollAlign = "start" | "center" | "end";
|
|
53
|
+
/**
|
|
54
|
+
* What `scrollTo` scrolls to: a position (`left` / `top`), a row (`index` or `key`, with `align`) or
|
|
55
|
+
* either end (`position`), checked in that order.
|
|
56
|
+
*/
|
|
57
|
+
export interface VirtualListScrollToOptions {
|
|
58
|
+
/** Scroll to this horizontal offset, in px. */
|
|
59
|
+
left?: number | undefined;
|
|
60
|
+
/** Scroll to this vertical offset, in px. */
|
|
61
|
+
top?: number | undefined;
|
|
62
|
+
/** Scroll to the row at this index. */
|
|
63
|
+
index?: number | undefined;
|
|
64
|
+
/** Scroll to the row with this key (`getKey`). */
|
|
65
|
+
key?: string | undefined;
|
|
66
|
+
/** Scroll to the top or the bottom of the list. */
|
|
67
|
+
position?: ScrollPosition | undefined;
|
|
68
|
+
/** `"instant"` (the default), `"smooth"` or `"auto"`, as for `Element.scrollTo`. */
|
|
69
|
+
behavior?: ScrollBehavior | undefined;
|
|
70
|
+
/** With `index` / `key`: scroll only as far as needed to show the item (default true). Ignored with `align`. */
|
|
71
|
+
debounce?: boolean | undefined;
|
|
72
|
+
/** With `index` / `key`: space, in px, to keep between the row and the view's top. */
|
|
73
|
+
scrollMarginTop?: number | undefined;
|
|
74
|
+
/** With `index` / `key`: space, in px, to keep between the row and the view's bottom. */
|
|
75
|
+
scrollMarginBottom?: number | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* With `index` / `key`: put the item's top at the view's top (`"start"`), its middle
|
|
78
|
+
* in the middle of the view (`"center"`) or its bottom at the view's bottom (`"end"`), inside
|
|
79
|
+
* `scrollMarginTop` / `scrollMarginBottom`. With `behavior: "instant"` (the default) the position is exact
|
|
80
|
+
* before the browser paints: the item and the rows around it are mounted and measured first, so no
|
|
81
|
+
* estimated position is ever shown. Without `align`, the jump goes to the item's estimated offset (or,
|
|
82
|
+
* with `debounce`, only as far as needed to show it).
|
|
83
|
+
*/
|
|
84
|
+
align?: ScrollAlign | undefined;
|
|
85
|
+
}
|
|
86
|
+
/** The imperative API (`componentRef`, `VirtualListContext`). */
|
|
87
|
+
export interface VirtualListApi {
|
|
88
|
+
/** The scroller's element (`data-slot="virtual-list"`). */
|
|
89
|
+
listElRef: RefObject<HTMLDivElement | null>;
|
|
90
|
+
/** The spacer's element (`data-slot="virtual-list-items"`); null while there are no items. */
|
|
91
|
+
itemsElRef: RefObject<HTMLDivElement | null>;
|
|
92
|
+
/**
|
|
93
|
+
* Scrolls the list (see `VirtualListScrollToOptions`); `scrollTo(left, top)` scrolls to a position.
|
|
94
|
+
* An instant jump to a row or an end is replayed as rows are measured right after it, so it lands.
|
|
95
|
+
*/
|
|
96
|
+
scrollTo: (options: VirtualListScrollToOptions | number, topIfNumber?: number) => void;
|
|
97
|
+
/** Reads the scroll position now and renders the rows in view, after scrolling the element directly. */
|
|
98
|
+
syncViewport: () => void;
|
|
99
|
+
/** Where the row with this key starts, in px from the top of the spacer (an estimate if not measured). */
|
|
100
|
+
getOffsetTopOfKey: (key: string) => number | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Runs `task` now and again after each batch of row measurements, for one frame plus one task: for a
|
|
103
|
+
* scroll position of your own that must hold while the rows it depends on are measured.
|
|
104
|
+
*/
|
|
105
|
+
submitScrollAdjustingTask: (task: () => void) => void;
|
|
106
|
+
/** Writes the scroller's width to `--virtual-list-width` again. */
|
|
107
|
+
refreshListWidth: () => void;
|
|
108
|
+
}
|
|
109
|
+
export type RenderReason = "sessionChanged" | "itemsChanged" | "listScroll" | "batchItemResize" | "listResize";
|
|
110
|
+
export interface RenderAnomaly {
|
|
111
|
+
type: "renderThrashing";
|
|
112
|
+
message: string;
|
|
113
|
+
payload: {
|
|
114
|
+
renderCount: number;
|
|
115
|
+
windowMs: number;
|
|
116
|
+
triggerReason: RenderReason;
|
|
117
|
+
itemCount: number;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export type FooterRender = (props: {
|
|
121
|
+
domRef: MeasuredRef;
|
|
122
|
+
}) => ReactNode;
|
|
123
|
+
/**
|
|
124
|
+
* The scroll container's own attributes passed through to it (`id`, `role`, `aria-*`, `data-*`,
|
|
125
|
+
* handlers such as `onKeyDown`); `onScroll`, `onWheel`, `onResize` and `children` are VirtualList's own
|
|
126
|
+
* (below), and `focusable` sets `tabIndex`.
|
|
127
|
+
*/
|
|
128
|
+
type VirtualListNativeProps = Omit<HTMLAttributes<HTMLDivElement>, "children" | "className" | "style" | "onScroll" | "onWheel" | "onResize" | "tabIndex" | "ref">;
|
|
129
|
+
/**
|
|
130
|
+
* The props VirtualList reads; optional where it has a default or checks for undefined / null. Every
|
|
131
|
+
* other attribute of the scroll container (`id`, `role`, `aria-label`, `data-*`, handlers) is passed
|
|
132
|
+
* through to it.
|
|
133
|
+
*/
|
|
134
|
+
export interface VirtualListProps<T> extends VirtualListNativeProps {
|
|
135
|
+
/**
|
|
136
|
+
* Render only the rows in or near the view. Off, every row is rendered in flow (with
|
|
137
|
+
* `itemResizable`, the row at the top of the view keeps its place when it is switched off).
|
|
138
|
+
* @default true
|
|
139
|
+
*/
|
|
140
|
+
virtual?: boolean | undefined;
|
|
141
|
+
/**
|
|
142
|
+
* Identifies what the list shows (a channel, a thread). A new value resets the list: scroll
|
|
143
|
+
* position, measurements and rows (every row remounts), then `defaultScrollKey` / `defaultScrollIndex`
|
|
144
|
+
* apply again.
|
|
145
|
+
*/
|
|
146
|
+
sessionId?: string | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* Show the scroller's native scrollbar (hidden by default).
|
|
149
|
+
* @default false
|
|
150
|
+
*/
|
|
151
|
+
showScrollbar?: boolean | undefined;
|
|
152
|
+
/**
|
|
153
|
+
* Columns for a list that also scrolls sideways: only the columns in view are rendered, through
|
|
154
|
+
* `renderCol` or `renderItemWithCols`. Each column's `width` is read.
|
|
155
|
+
*/
|
|
156
|
+
columns?: readonly Column[] | undefined;
|
|
157
|
+
/** With `columns`: renders one column of a row; its result is the row's `renderedCols`. */
|
|
158
|
+
renderCol?: ((info: RenderColInfo) => ReactNode) | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* With `columns`: renders the columns in view of a row at once (in place of `renderCol`); its
|
|
161
|
+
* result is the row's `renderedItemWithCols`.
|
|
162
|
+
*/
|
|
163
|
+
renderItemWithCols?: ((info: RenderItemWithColsInfo) => ReactNode) | undefined;
|
|
164
|
+
/**
|
|
165
|
+
* The items, one row each, in order. Treat them as immutable: a mounted row is rendered again only
|
|
166
|
+
* when its item (by reference) or its index changes, or a render prop does (`children`,
|
|
167
|
+
* `ItemComponent`, `getKey`, `renderCol`, `renderItemWithCols`, `itemResizable`, `ignoreItemResize`,
|
|
168
|
+
* `sessionId`, `virtual`), so replace an item's object to change its row.
|
|
169
|
+
*/
|
|
170
|
+
items?: readonly T[] | undefined;
|
|
171
|
+
/**
|
|
172
|
+
* The shortest a row can be, in px, or less: to fill the view, rows not measured yet count at this
|
|
173
|
+
* size (after a jump, as many rows as fit at it, plus one), so a larger value leaves the end of the
|
|
174
|
+
* view empty. While the list scrolls, rows ahead of the view are mounted on top of these.
|
|
175
|
+
*/
|
|
176
|
+
itemMinSize: number;
|
|
177
|
+
/** The size, in px, counted for a row not measured yet (its offset and the spacer's height). */
|
|
178
|
+
itemEstimatedSize: number;
|
|
179
|
+
/**
|
|
180
|
+
* Rows have heights of their own: each row is measured from layout when it mounts and whenever it
|
|
181
|
+
* resizes (put the row's `domRef` on its root element). Off, every row is `itemEstimatedSize` high.
|
|
182
|
+
* @default false
|
|
183
|
+
*/
|
|
184
|
+
itemResizable?: boolean | undefined;
|
|
185
|
+
/** Styles of the spacer (`data-slot="virtual-list-items"`), merged over its own. */
|
|
186
|
+
itemsStyle?: CSSProperties | undefined;
|
|
187
|
+
/**
|
|
188
|
+
* The element that holds the rows (`data-slot="virtual-list-visible-items"`), such as `"ul"` for
|
|
189
|
+
* rows that are `li`.
|
|
190
|
+
* @default "div"
|
|
191
|
+
*/
|
|
192
|
+
visibleItemsTag?: ElementType | undefined;
|
|
193
|
+
/** Props of the element that holds the rows (`visibleItemsTag`), such as `role` or `aria-label`. */
|
|
194
|
+
visibleItemsProps?: object | undefined;
|
|
195
|
+
/**
|
|
196
|
+
* Stop applying row measurements: sizes measured while it is on are dropped, and the rows keep the
|
|
197
|
+
* sizes they had (for a moment when rows resize but the layout should not follow, such as an
|
|
198
|
+
* animation).
|
|
199
|
+
* @default false
|
|
200
|
+
*/
|
|
201
|
+
ignoreItemResize?: boolean | undefined;
|
|
202
|
+
/** Called when the list scrolls, with the native event, after the rows in view are updated. */
|
|
203
|
+
onScroll?: ((event: Event) => void) | undefined;
|
|
204
|
+
/** With `catchWheel`: called with the native wheel event, except one let through at either end. */
|
|
205
|
+
onWheel?: ((event: WheelEvent) => void) | undefined;
|
|
206
|
+
/** Called when the scroller itself resizes, with its ResizeObserver entry. */
|
|
207
|
+
onResize?: ((entry: ObservedResizeEntry) => void) | undefined;
|
|
208
|
+
/**
|
|
209
|
+
* The key of the row to scroll to when the list mounts or `sessionId` changes (as far as needed to
|
|
210
|
+
* show it). `defaultScrollIndex` wins when both are set.
|
|
211
|
+
*/
|
|
212
|
+
defaultScrollKey?: string | undefined;
|
|
213
|
+
/** The index of the row to scroll to when the list mounts or `sessionId` changes. */
|
|
214
|
+
defaultScrollIndex?: number | undefined;
|
|
215
|
+
/**
|
|
216
|
+
* A key for each item, stable across renders: measurements are kept by key, so they survive
|
|
217
|
+
* reordering and new items, and a new key is a new row, measured again from the estimate.
|
|
218
|
+
*/
|
|
219
|
+
getKey: (item: T) => string;
|
|
220
|
+
/**
|
|
221
|
+
* Space above the first row, in px, inside the spacer.
|
|
222
|
+
* @default 0
|
|
223
|
+
*/
|
|
224
|
+
paddingTop?: number | undefined;
|
|
225
|
+
/**
|
|
226
|
+
* Space below the footer, in px (before `footerAfterBottomPadding`).
|
|
227
|
+
* @default 0
|
|
228
|
+
*/
|
|
229
|
+
paddingBottom?: number | undefined;
|
|
230
|
+
/**
|
|
231
|
+
* Renders a row: called for each item in or near the view with the item, its index, the `domRef` to
|
|
232
|
+
* put on the row's root element and the `style` to spread on it. Give the element the `key` it gets.
|
|
233
|
+
* A mounted row is rendered again only when its item, its index or a render prop changes (see
|
|
234
|
+
* `items`): read no other mutable state here.
|
|
235
|
+
*/
|
|
236
|
+
children?: ((props: ItemRenderProps<T> & {
|
|
237
|
+
key: string | undefined;
|
|
238
|
+
}) => ReactNode) | undefined;
|
|
239
|
+
/** A component that renders a row, in place of `children`; it gets the same props. */
|
|
240
|
+
ItemComponent?: ComponentType<ItemRenderProps<T>> | undefined;
|
|
241
|
+
/**
|
|
242
|
+
* Rendered in place of the rows when there are no items. A function gets a `domRef`: when its
|
|
243
|
+
* element resizes, `onContentResize` is called.
|
|
244
|
+
*/
|
|
245
|
+
empty?: ReactNode | FooterRender;
|
|
246
|
+
/**
|
|
247
|
+
* Where `empty` sits: at the top (`"start"`) or in the middle of the list (`"center"`).
|
|
248
|
+
* @default "start"
|
|
249
|
+
*/
|
|
250
|
+
emptyAlign?: "start" | "center" | undefined;
|
|
251
|
+
/** Classes of the scroller, after its own (a utility here overrides them: `h-*`, `max-h-*`). */
|
|
252
|
+
className?: string | undefined;
|
|
253
|
+
/** Styles of the scroller. */
|
|
254
|
+
style?: CSSProperties | undefined;
|
|
255
|
+
/** Classes of the spacer (`data-slot="virtual-list-items"`). */
|
|
256
|
+
itemsClassName?: string | undefined;
|
|
257
|
+
/**
|
|
258
|
+
* Rendered below the rows, inside the scroller. A function gets a `domRef`: when its element
|
|
259
|
+
* resizes, `onContentResize` is called.
|
|
260
|
+
*/
|
|
261
|
+
footer?: ReactNode | FooterRender;
|
|
262
|
+
/** Rendered last in the scroller, after `paddingBottom`. */
|
|
263
|
+
footerAfterBottomPadding?: ReactNode;
|
|
264
|
+
/**
|
|
265
|
+
* Rendered above the rows, inside the scroller. Keep its height the same while rows load above:
|
|
266
|
+
* a change in its height moves the rows in view.
|
|
267
|
+
*/
|
|
268
|
+
header?: ReactNode;
|
|
269
|
+
/** A ref to the scroller's element. */
|
|
270
|
+
domRef?: Ref<HTMLDivElement> | undefined;
|
|
271
|
+
/**
|
|
272
|
+
* Not a prop: the scroller's element goes to `domRef`. Declared so that a `ref` is a type error,
|
|
273
|
+
* not passed through to the scroller with the native attributes.
|
|
274
|
+
*/
|
|
275
|
+
ref?: never;
|
|
276
|
+
/**
|
|
277
|
+
* Called when the content's height changes: a row resizes or mounts measured, the spacer's
|
|
278
|
+
* height changes, or the `footer` / `empty` element resizes (to follow the end of a chat). Not
|
|
279
|
+
* called for a change the list scrolls away exactly (rows above the view measured as it scrolls
|
|
280
|
+
* up): it moves nothing in view, nor the distance from the view to the end.
|
|
281
|
+
*/
|
|
282
|
+
onContentResize?: (() => void) | undefined;
|
|
283
|
+
/**
|
|
284
|
+
* Called when the rows' offset (the translateY of the rows' element) changes, for content that
|
|
285
|
+
* must follow it.
|
|
286
|
+
*/
|
|
287
|
+
onTransformChange?: (() => void) | undefined;
|
|
288
|
+
/** The imperative API: `scrollTo`, `getOffsetTopOfKey`, the scroller's and spacer's elements. */
|
|
289
|
+
componentRef?: Ref<VirtualListApi> | undefined;
|
|
290
|
+
/**
|
|
291
|
+
* When printing, let the list grow to its content (no height limit, no scrolling).
|
|
292
|
+
* @default false
|
|
293
|
+
*/
|
|
294
|
+
printable?: boolean | undefined;
|
|
295
|
+
/**
|
|
296
|
+
* Scroll by the wheel in the list's own handler (where the pointer is not coarse), so rows are
|
|
297
|
+
* rendered in the same frame as the scroll; it lets the wheel through at either end.
|
|
298
|
+
* @default false
|
|
299
|
+
*/
|
|
300
|
+
catchWheel?: boolean | undefined;
|
|
301
|
+
/**
|
|
302
|
+
* Called when the list renders too often: 120 forced renders within a second report a
|
|
303
|
+
* `"renderThrashing"` anomaly, for logging.
|
|
304
|
+
*/
|
|
305
|
+
onRenderAnomaly?: ((anomaly: RenderAnomaly) => void) | undefined;
|
|
306
|
+
/**
|
|
307
|
+
* What covers the bottom of the list, in px (such as a composer over it): Page Up, Page Down and
|
|
308
|
+
* Space scroll by the view's height less this and 32px.
|
|
309
|
+
* @default 0
|
|
310
|
+
*/
|
|
311
|
+
keyboardPageBottomOcclusion?: number | undefined;
|
|
312
|
+
/**
|
|
313
|
+
* Put the scroller in the tab order (`tabIndex` 0), so the keyboard can scroll it; off, it is
|
|
314
|
+
* `tabIndex` -1.
|
|
315
|
+
* @default true
|
|
316
|
+
*/
|
|
317
|
+
focusable?: boolean | undefined;
|
|
318
|
+
/**
|
|
319
|
+
* When `items` change, keep the row at the top of the view where it is: the
|
|
320
|
+
* same row stays at the same distance from the view's top, so rows inserted or removed above it (most
|
|
321
|
+
* often a prepend, such as loading older history) do not move what is on screen. Also at the very top
|
|
322
|
+
* (`scrollTop` 0): the row that was first stays first in view and the new rows are above it, out of
|
|
323
|
+
* view. If that row was removed, the first row after it that is still there keeps its place; if none
|
|
324
|
+
* is left, `scrollTop` is kept. An instant jump still pending (`scrollTo` an index, a key, the top or the
|
|
325
|
+
* bottom, in the same frame) wins. Only with `virtual` on; a new `sessionId` resets the list as before.
|
|
326
|
+
*
|
|
327
|
+
* Off by default (`scrollTop` is kept, so the rows move). This is separate from the
|
|
328
|
+
* compensation that is always on: rows that enter above the view while scrolling up have their first
|
|
329
|
+
* measured size scrolled away, which covers scrolling, not changes of `items`.
|
|
330
|
+
*/
|
|
331
|
+
keepAnchorOnItemsChange?: boolean | undefined;
|
|
332
|
+
/**
|
|
333
|
+
* With `keepAnchorOnItemsChange`: which rows may be the row kept in place. A row
|
|
334
|
+
* this rejects is passed over like a removed one (the first accepted row after it keeps its place). For
|
|
335
|
+
* rows that new items are inserted below, such as a leading header row above a prepend: keeping such a
|
|
336
|
+
* row in place would push the rows below it, the ones being read. All rows may by default.
|
|
337
|
+
*/
|
|
338
|
+
canAnchorItem?: ((item: T) => boolean) | undefined;
|
|
339
|
+
}
|
|
340
|
+
//#endregion
|
|
341
|
+
export type { MeasuredRef, ObservedResizeEntry };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useMergedRef } from "../../../lib/use-merged-ref.mjs";
|
|
2
|
+
import { useEventCallback } from "../hooks/use-event-callback.mjs";
|
|
3
|
+
import { getResizeObserverDelegate } from "./resize-observer-delegate.mjs";
|
|
4
|
+
import { useLayoutEffect, useRef } from "react";
|
|
5
|
+
//#region src/components/virtual-list/resize-observer/ResizeObserverWrapper.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Calls `children({ ref })` and observes the element `ref` receives. `onRefUpdate` runs synchronously
|
|
8
|
+
* whenever the ref is set (VirtualList measures a new item there, before paint), and again in a
|
|
9
|
+
* layout effect when `simulateRefUpdateTrigger` differs from its first value; `onResize` runs from the
|
|
10
|
+
* ResizeObserver, with `isFirst` for its first call (again after re-enabling). `disabled` stops
|
|
11
|
+
* observing; `onUnmounted` runs in a layout-effect cleanup.
|
|
12
|
+
*/
|
|
13
|
+
function ResizeObserverWrapper(props) {
|
|
14
|
+
const { disabled, onResize, children, onRefUpdate, forwardedRef, simulateRefUpdateTrigger, onUnmounted } = props;
|
|
15
|
+
const [setRef, getRef] = useMergedRef(forwardedRef);
|
|
16
|
+
const isFirstResizeRef = useRef(true);
|
|
17
|
+
const prevSimulateTriggerRef = useRef(simulateRefUpdateTrigger);
|
|
18
|
+
const emitRefUpdate = useEventCallback(() => {
|
|
19
|
+
onRefUpdate?.(getRef());
|
|
20
|
+
});
|
|
21
|
+
useLayoutEffect(() => {
|
|
22
|
+
if (prevSimulateTriggerRef.current !== simulateRefUpdateTrigger) emitRefUpdate();
|
|
23
|
+
}, [simulateRefUpdateTrigger, emitRefUpdate]);
|
|
24
|
+
const handleResize = useEventCallback((entry) => {
|
|
25
|
+
if (!disabled) onResize({
|
|
26
|
+
entry,
|
|
27
|
+
isFirst: isFirstResizeRef.current
|
|
28
|
+
});
|
|
29
|
+
isFirstResizeRef.current = false;
|
|
30
|
+
});
|
|
31
|
+
useLayoutEffect(() => {
|
|
32
|
+
const el = getRef();
|
|
33
|
+
if (el != null) {
|
|
34
|
+
if (disabled) {
|
|
35
|
+
getResizeObserverDelegate().unobserve(el);
|
|
36
|
+
isFirstResizeRef.current = true;
|
|
37
|
+
} else {
|
|
38
|
+
getResizeObserverDelegate().observe(el, handleResize);
|
|
39
|
+
return () => {
|
|
40
|
+
getResizeObserverDelegate().unobserve(el);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}, [
|
|
45
|
+
disabled,
|
|
46
|
+
getRef,
|
|
47
|
+
handleResize
|
|
48
|
+
]);
|
|
49
|
+
const emitUnmounted = useEventCallback(() => {
|
|
50
|
+
onUnmounted?.();
|
|
51
|
+
});
|
|
52
|
+
useLayoutEffect(() => () => {
|
|
53
|
+
emitUnmounted();
|
|
54
|
+
}, [emitUnmounted]);
|
|
55
|
+
return children({ ref: useEventCallback((el) => {
|
|
56
|
+
const previous = getRef();
|
|
57
|
+
setRef(el);
|
|
58
|
+
onRefUpdate?.(el);
|
|
59
|
+
if (disabled) {
|
|
60
|
+
if (previous != null) getResizeObserverDelegate().unobserve(previous);
|
|
61
|
+
} else if (el === null) {
|
|
62
|
+
if (previous !== null) getResizeObserverDelegate().unobserve(previous);
|
|
63
|
+
} else {
|
|
64
|
+
if (previous !== null && previous !== el) getResizeObserverDelegate().unobserve(previous);
|
|
65
|
+
getResizeObserverDelegate().observe(el, handleResize);
|
|
66
|
+
}
|
|
67
|
+
}) });
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { ResizeObserverWrapper };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/components/virtual-list/resize-observer/resize-observer-delegate.d.ts
|
|
2
|
+
/** The entries the delegate passes on are for the elements `observe()` was called with. */
|
|
3
|
+
export type ObservedResizeEntry = ResizeObserverEntry & {
|
|
4
|
+
target: HTMLElement;
|
|
5
|
+
};
|
|
6
|
+
//#endregion
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/components/virtual-list/resize-observer/resize-observer-delegate.ts
|
|
2
|
+
/**
|
|
3
|
+
* Observes elements with one ResizeObserver, created on the first `observe()`, and calls each
|
|
4
|
+
* element's own callback. Entries whose target is detached (no `parentElement`) are ignored.
|
|
5
|
+
* `runAfterEntries(fn)` (from an element's callback) runs `fn` once after every entry of the current
|
|
6
|
+
* notification has been delivered: VirtualList measures all of a list's rows once per notification,
|
|
7
|
+
* not once per row.
|
|
8
|
+
*/
|
|
9
|
+
var ResizeObserverDelegate = class {
|
|
10
|
+
observer = void 0;
|
|
11
|
+
callbacksMap = /* @__PURE__ */ new Map();
|
|
12
|
+
observedDomSet = /* @__PURE__ */ new WeakSet();
|
|
13
|
+
afterEntries = /* @__PURE__ */ new Set();
|
|
14
|
+
/** The shared observer, created on first use; `null` without a native ResizeObserver. */
|
|
15
|
+
ensureObserver() {
|
|
16
|
+
if (this.observer === void 0) this.observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(this.callback.bind(this));
|
|
17
|
+
return this.observer;
|
|
18
|
+
}
|
|
19
|
+
callback(entries) {
|
|
20
|
+
for (const entry of entries) {
|
|
21
|
+
if (!entry.target.parentElement) continue;
|
|
22
|
+
const callback = this.callbacksMap.get(entry.target);
|
|
23
|
+
if (callback) callback(entry);
|
|
24
|
+
}
|
|
25
|
+
const afterEntries = [...this.afterEntries];
|
|
26
|
+
this.afterEntries.clear();
|
|
27
|
+
for (const fn of afterEntries) fn();
|
|
28
|
+
}
|
|
29
|
+
runAfterEntries(fn) {
|
|
30
|
+
this.afterEntries.add(fn);
|
|
31
|
+
}
|
|
32
|
+
observe(el, callback) {
|
|
33
|
+
this.callbacksMap.set(el, callback);
|
|
34
|
+
if (!this.observedDomSet.has(el)) {
|
|
35
|
+
this.ensureObserver()?.observe(el);
|
|
36
|
+
this.observedDomSet.add(el);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
unobserve(el) {
|
|
40
|
+
this.callbacksMap.delete(el);
|
|
41
|
+
if (this.observedDomSet.has(el)) {
|
|
42
|
+
this.ensureObserver()?.unobserve(el);
|
|
43
|
+
this.observedDomSet.delete(el);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
let resizeObserverDelegate;
|
|
48
|
+
/** The shared delegate, created on first use. */
|
|
49
|
+
function getResizeObserverDelegate() {
|
|
50
|
+
resizeObserverDelegate ||= new ResizeObserverDelegate();
|
|
51
|
+
return resizeObserverDelegate;
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { getResizeObserverDelegate };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/components/virtual-list/utils/align.ts
|
|
2
|
+
/**
|
|
3
|
+
* The `scrollTop` that puts an item (its top `itemTop` in the list's content, its height `itemSize`) at
|
|
4
|
+
* `align` in a view `viewportHeight` high, inside the margins: its top `scrollMarginTop` below the view's
|
|
5
|
+
* top (`"start"`), its bottom `scrollMarginBottom` above the view's bottom (`"end"`), or its middle in the
|
|
6
|
+
* middle of the area between them (`"center"`). Clamped to `0 .. maxScrollTop`.
|
|
7
|
+
*/
|
|
8
|
+
function getAlignedScrollTop({ itemTop, itemSize, viewportHeight, align, scrollMarginTop, scrollMarginBottom, maxScrollTop }) {
|
|
9
|
+
let top;
|
|
10
|
+
if (align === "start") top = itemTop - scrollMarginTop;
|
|
11
|
+
else if (align === "end") top = itemTop + itemSize - viewportHeight + scrollMarginBottom;
|
|
12
|
+
else {
|
|
13
|
+
const area = viewportHeight - scrollMarginTop - scrollMarginBottom;
|
|
14
|
+
top = itemTop + itemSize / 2 - scrollMarginTop - area / 2;
|
|
15
|
+
}
|
|
16
|
+
return Math.max(0, Math.min(top, Math.max(0, maxScrollTop)));
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { getAlignedScrollTop };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/components/virtual-list/utils/constants.ts
|
|
2
|
+
/**
|
|
3
|
+
* Written on the root element of every measured item: maps the DOM to item keys (kept selections,
|
|
4
|
+
* and what other code uses to find an item).
|
|
5
|
+
*/
|
|
6
|
+
const ITEM_KEY_ATTR = "data-virtual-list-item-key";
|
|
7
|
+
/** The default of the `columns` and `items` props, and the empty kept-item lists. */
|
|
8
|
+
const EMPTY_ARRAY = [];
|
|
9
|
+
/**
|
|
10
|
+
* The visible-items element lays the rows out in normal block flow, so their margins collapse as the
|
|
11
|
+
* consumer's CSS says (between adjacent rows, and a row's children's through the row). It is a block
|
|
12
|
+
* formatting context (`flow-root`), so the first row's top margin and the last row's bottom margin stay
|
|
13
|
+
* inside it instead of collapsing through it (into the spacer, or with the footer), and it is the rows'
|
|
14
|
+
* offsetParent (`position: relative`): the list measures where each row starts from layout
|
|
15
|
+
* (`measureRowSpans`).
|
|
16
|
+
*/
|
|
17
|
+
const VIRTUAL_VISIBLE_ITEMS_STYLE = {
|
|
18
|
+
position: "relative",
|
|
19
|
+
display: "flow-root"
|
|
20
|
+
};
|
|
21
|
+
/** With virtualization off, the visible-items element sits at translateY(0px). */
|
|
22
|
+
const NON_VIRTUAL_VISIBLE_ITEMS_STYLE = {
|
|
23
|
+
transform: "translateY(0px)",
|
|
24
|
+
position: "relative",
|
|
25
|
+
display: "flow-root"
|
|
26
|
+
};
|
|
27
|
+
/** ... within this window (ms). */
|
|
28
|
+
const RENDER_THRASHING_WINDOW_MS = 1e3;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { EMPTY_ARRAY, ITEM_KEY_ATTR, NON_VIRTUAL_VISIBLE_ITEMS_STYLE, RENDER_THRASHING_WINDOW_MS, VIRTUAL_VISIBLE_ITEMS_STYLE };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//#region src/components/virtual-list/utils/fenwick-tree.ts
|
|
2
|
+
/**
|
|
3
|
+
* Sizes of `l` items, each `estimated` plus a delta stored in the tree: `sum(i)` (the offset of item
|
|
4
|
+
* `i`) is `i * estimated` plus the prefix sum of the deltas, in O(log n); `getBound(offset)` maps an
|
|
5
|
+
* offset to an item index by a binary search over `sum()` (O(log² n)).
|
|
6
|
+
*/
|
|
7
|
+
var FenwickTree = class {
|
|
8
|
+
l;
|
|
9
|
+
estimated;
|
|
10
|
+
ft;
|
|
11
|
+
constructor(length, estimated) {
|
|
12
|
+
this.l = length;
|
|
13
|
+
this.estimated = estimated;
|
|
14
|
+
const ft = Array(length + 1);
|
|
15
|
+
for (let i = 0; i < length + 1; ++i) ft[i] = 0;
|
|
16
|
+
this.ft = ft;
|
|
17
|
+
}
|
|
18
|
+
/** Adds `delta` to the size of item `index`. */
|
|
19
|
+
add(index, delta) {
|
|
20
|
+
if (delta === 0) return;
|
|
21
|
+
const { l, ft } = this;
|
|
22
|
+
index += 1;
|
|
23
|
+
while (index <= l) {
|
|
24
|
+
ft[index] += delta;
|
|
25
|
+
index += index & -index;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** The size of item `index`. */
|
|
29
|
+
get(index) {
|
|
30
|
+
return this.sum(index + 1) - this.sum(index);
|
|
31
|
+
}
|
|
32
|
+
/** The total size of the first `count` items (all of them by default). */
|
|
33
|
+
sum(count = this.l) {
|
|
34
|
+
if (count <= 0) return 0;
|
|
35
|
+
const { ft, estimated, l } = this;
|
|
36
|
+
if (count > l) throw new Error("[FenwickTree.sum]: `i` is larger than length.");
|
|
37
|
+
let sum = count * estimated;
|
|
38
|
+
while (count > 0) {
|
|
39
|
+
sum += ft[count];
|
|
40
|
+
count -= count & -count;
|
|
41
|
+
}
|
|
42
|
+
return sum;
|
|
43
|
+
}
|
|
44
|
+
/** The largest count `c` with `sum(c) <= threshold`: the index of the item that contains `threshold`. */
|
|
45
|
+
getBound(threshold) {
|
|
46
|
+
let lo = 0;
|
|
47
|
+
let hi = this.l;
|
|
48
|
+
while (hi > lo) {
|
|
49
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
50
|
+
const midSum = this.sum(mid);
|
|
51
|
+
if (midSum > threshold) {
|
|
52
|
+
hi = mid;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (!(midSum < threshold)) return mid;
|
|
56
|
+
if (lo === mid) {
|
|
57
|
+
if (this.sum(lo + 1) <= threshold) return lo + 1;
|
|
58
|
+
return mid;
|
|
59
|
+
}
|
|
60
|
+
lo = mid;
|
|
61
|
+
}
|
|
62
|
+
return lo;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
//#endregion
|
|
66
|
+
export { FenwickTree };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//#region src/components/virtual-list/utils/items-anchor.ts
|
|
2
|
+
/**
|
|
3
|
+
* Finds the row at `top` (the view's top, in item coordinates: `scrollTop + compensation - paddingTop`)
|
|
4
|
+
* in the previous items and returns it with where it is now. If that row is gone, the first row after
|
|
5
|
+
* it that is still there is kept instead, at the distance from the view's top it had; `null` when no row
|
|
6
|
+
* from the one at the top onwards is left (or there is nothing to anchor to). Rows `canAnchor` rejects are
|
|
7
|
+
* passed over the same way (edge rows such as a list's leading boundary, which new rows go below).
|
|
8
|
+
*/
|
|
9
|
+
function findItemsAnchor({ prevItems, prevTree, prevPrependIndexes, nextItems, getKey, canAnchor, top }) {
|
|
10
|
+
if (prevItems.length === 0 || nextItems.length === 0) return null;
|
|
11
|
+
const nextIndexOfKey = /* @__PURE__ */ new Map();
|
|
12
|
+
nextItems.forEach((item, index) => {
|
|
13
|
+
nextIndexOfKey.set(getKey(item), index);
|
|
14
|
+
});
|
|
15
|
+
const topIndex = Math.min(Math.max(prevTree.getBound(top), 0), prevItems.length - 1);
|
|
16
|
+
for (let index = topIndex; index < prevItems.length; ++index) {
|
|
17
|
+
const item = prevItems[index];
|
|
18
|
+
if (canAnchor !== void 0 && !canAnchor(item)) continue;
|
|
19
|
+
const key = getKey(item);
|
|
20
|
+
const nextIndex = nextIndexOfKey.get(key);
|
|
21
|
+
if (nextIndex === void 0) continue;
|
|
22
|
+
const prependIndexes = [];
|
|
23
|
+
for (const prevIndex of prevPrependIndexes) {
|
|
24
|
+
const item = prevItems[prevIndex];
|
|
25
|
+
const moved = item === void 0 ? void 0 : nextIndexOfKey.get(getKey(item));
|
|
26
|
+
if (moved !== void 0) prependIndexes.push(moved);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
key,
|
|
30
|
+
delta: top - prevTree.sum(index),
|
|
31
|
+
index: nextIndex,
|
|
32
|
+
prependIndexes
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The range to render with the new items: from the anchor row, as many rows as `start..end` held (none if
|
|
39
|
+
* it was empty), clamped to `itemCount` items. It starts at the anchor row, not at the new index of the old
|
|
40
|
+
* start: the rows above the anchor are not mounted in this render. When the view's top is above the anchor
|
|
41
|
+
* row (the row at the top was removed), the range update that follows mounts the rows above as rows
|
|
42
|
+
* entering above the range, so their first measurement is compensated like when scrolling up.
|
|
43
|
+
*/
|
|
44
|
+
function getAnchoredRange(start, end, anchorIndex, itemCount) {
|
|
45
|
+
if (end < start) return [anchorIndex, anchorIndex - 1];
|
|
46
|
+
return [anchorIndex, Math.min(anchorIndex + (end - start), itemCount - 1)];
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { findItemsAnchor, getAnchoredRange };
|