niuma-ui 2.0.4 → 2.1.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 +67 -0
- package/NOTICE +0 -1
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/dist/components/_shared/index.d.ts +2 -2
- package/dist/components/_shared/src/overlay-utils.d.ts +44 -1
- package/dist/components/_shared/src/overlay-utils.js +87 -2
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/src/RsAlert.css +120 -65
- package/dist/components/alert/src/RsAlert.d.ts +24 -5
- package/dist/components/alert/src/RsAlert.impl.js +108 -36
- package/dist/components/alert/src/RsAlert.js +1 -1
- package/dist/components/alert/src/alert-utils.d.ts +37 -0
- package/dist/components/alert/src/alert-utils.js +71 -0
- package/dist/components/auto-complete/src/RsAutoComplete.d.ts +1 -1
- package/dist/components/button/src/RsButton.css +75 -72
- package/dist/components/button/src/RsButton.d.ts +1 -4
- package/dist/components/button/src/RsButton.impl.js +3 -7
- package/dist/components/button/src/RsButton.js +1 -1
- package/dist/components/card/src/RsCard.d.ts +1 -1
- package/dist/components/code-block/index.d.ts +1 -0
- package/dist/components/code-block/src/RsCodeBlock.css +93 -52
- package/dist/components/code-block/src/RsCodeBlock.d.ts +36 -9
- package/dist/components/code-block/src/RsCodeBlock.impl.js +203 -84
- package/dist/components/code-block/src/RsCodeBlock.js +1 -1
- package/dist/components/code-block/src/code-block-highlight.d.ts +4 -0
- package/dist/components/code-block/src/code-block-highlight.js +34 -0
- package/dist/components/code-block/src/code-block-utils.d.ts +23 -0
- package/dist/components/code-block/src/code-block-utils.js +71 -0
- package/dist/components/code-editor/index.d.ts +1 -1
- package/dist/components/code-editor/src/RsCodeEditor.css +118 -92
- package/dist/components/code-editor/src/RsCodeEditor.d.ts +14 -3
- package/dist/components/code-editor/src/RsCodeEditor.impl.js +261 -94
- package/dist/components/code-editor/src/RsCodeEditor.js +1 -1
- package/dist/components/code-editor/src/code-editor-utils.d.ts +15 -0
- package/dist/components/code-editor/src/code-editor-utils.js +36 -1
- package/dist/components/code-editor/src/code-mirror-completion.d.ts +1 -1
- package/dist/components/code-editor/src/code-mirror-completion.js +8 -5
- package/dist/components/code-editor/src/code-mirror-diagnostics.d.ts +2 -3
- package/dist/components/code-editor/src/code-mirror-diagnostics.js +3 -4
- package/dist/components/code-editor/src/code-mirror-ghost.d.ts +1 -1
- package/dist/components/code-editor/src/code-mirror-ghost.js +12 -3
- package/dist/components/code-editor/src/code-mirror-inline-edit.js +8 -3
- package/dist/components/code-editor/src/code-mirror-intel.d.ts +2 -2
- package/dist/components/code-editor/src/code-mirror-intel.js +50 -39
- package/dist/components/code-editor/src/code-mirror-lang.js +4 -0
- package/dist/components/code-editor/src/code-mirror-session.d.ts +13 -0
- package/dist/components/code-editor/src/code-mirror-session.js +30 -0
- package/dist/components/config-provider/src/RsConfigProvider.css +1 -1
- package/dist/components/config-provider/src/RsConfigProvider.d.ts +2 -2
- package/dist/components/config-provider/src/RsConfigProvider.impl.js +7 -16
- package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
- package/dist/components/context-menu/index.d.ts +1 -1
- package/dist/components/context-menu/src/RsContextMenu.css +115 -89
- package/dist/components/context-menu/src/RsContextMenu.d.ts +32 -11
- package/dist/components/context-menu/src/RsContextMenu.impl.js +795 -48
- package/dist/components/context-menu/src/RsContextMenuItems.d.ts +25 -1
- package/dist/components/context-menu/src/RsContextMenuItems.impl.js +110 -61
- package/dist/components/context-menu/src/context-menu-utils.d.ts +89 -3
- package/dist/components/context-menu/src/context-menu-utils.js +168 -3
- package/dist/components/date-picker/src/RsDatePicker.d.ts +2 -2
- package/dist/components/date-picker/src/RsDateTimePicker.d.ts +2 -2
- package/dist/components/descriptions/index.d.ts +1 -1
- package/dist/components/descriptions/src/RsDescriptions.css +38 -11
- package/dist/components/descriptions/src/RsDescriptions.d.ts +20 -4
- package/dist/components/descriptions/src/RsDescriptions.impl.js +89 -19
- package/dist/components/descriptions/src/RsDescriptionsItem.impl.js +13 -6
- package/dist/components/descriptions/src/descriptions-utils.d.ts +19 -0
- package/dist/components/descriptions/src/descriptions-utils.js +39 -1
- package/dist/components/dialog/index.d.ts +1 -1
- package/dist/components/dialog/src/RsConfirmDialog.css +47 -21
- package/dist/components/dialog/src/RsConfirmDialog.d.ts +19 -7
- package/dist/components/dialog/src/RsConfirmDialog.impl.js +349 -119
- package/dist/components/dialog/src/RsConfirmDialog.js +2 -1
- package/dist/components/dialog/src/RsDialog.css +102 -109
- package/dist/components/dialog/src/RsDialog.d.ts +34 -24
- package/dist/components/dialog/src/RsDialog.impl.js +410 -177
- package/dist/components/dialog/src/RsDialog.js +2 -1
- package/dist/components/dialog/src/dialog-utils.d.ts +40 -1
- package/dist/components/dialog/src/dialog-utils.js +152 -1
- package/dist/components/dialog/src/dialog-window.js +29 -8
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/drawer/src/RsDrawer.css +61 -29
- package/dist/components/drawer/src/RsDrawer.d.ts +37 -21
- package/dist/components/drawer/src/RsDrawer.impl.js +441 -223
- package/dist/components/drawer/src/drawer-utils.d.ts +35 -0
- package/dist/components/drawer/src/drawer-utils.js +131 -1
- package/dist/components/dropdown/index.d.ts +1 -1
- package/dist/components/dropdown/src/RsDropdown.css +140 -61
- package/dist/components/dropdown/src/RsDropdown.d.ts +39 -6
- package/dist/components/dropdown/src/RsDropdown.impl.js +693 -63
- package/dist/components/dropdown/src/RsDropdownItemView.impl.js +17 -7
- package/dist/components/dropdown/src/RsDropdownItems.d.ts +32 -3
- package/dist/components/dropdown/src/RsDropdownItems.impl.js +171 -59
- package/dist/components/dropdown/src/dropdown-utils.d.ts +50 -0
- package/dist/components/dropdown/src/dropdown-utils.js +103 -3
- package/dist/components/empty/index.d.ts +1 -0
- package/dist/components/empty/src/RsEmpty.css +105 -23
- package/dist/components/empty/src/RsEmpty.d.ts +27 -4
- package/dist/components/empty/src/RsEmpty.impl.js +154 -11
- package/dist/components/empty/src/RsEmpty.js +2 -1
- package/dist/components/empty/src/empty-utils.d.ts +28 -0
- package/dist/components/empty/src/empty-utils.js +55 -0
- package/dist/components/form/src/RsForm.d.ts +1 -1
- package/dist/components/input-number/src/RsInputNumber.d.ts +1 -1
- package/dist/components/label/src/RsLabel.d.ts +1 -1
- package/dist/components/loading/index.d.ts +1 -0
- package/dist/components/loading/src/RsLoading.css +13 -97
- package/dist/components/loading/src/RsLoading.d.ts +52 -2
- package/dist/components/loading/src/RsLoading.impl.js +216 -33
- package/dist/components/loading/src/RsLoading.js +2 -1
- package/dist/components/loading/src/loading-status.css +210 -0
- package/dist/components/loading/src/loading-status.d.ts +34 -0
- package/dist/components/loading/src/loading-status.impl.js +84 -0
- package/dist/components/loading/src/loading-status.js +8 -0
- package/dist/components/loading/src/loading-utils.d.ts +51 -4
- package/dist/components/loading/src/loading-utils.js +122 -0
- package/dist/components/loading-bar/index.d.ts +1 -0
- package/dist/components/loading-bar/src/RsLoadingBar.css +72 -8
- package/dist/components/loading-bar/src/RsLoadingBar.d.ts +55 -11
- package/dist/components/loading-bar/src/RsLoadingBar.impl.js +298 -57
- package/dist/components/loading-bar/src/RsLoadingBar.js +1 -1
- package/dist/components/loading-bar/src/loading-bar-utils.d.ts +69 -0
- package/dist/components/loading-bar/src/loading-bar-utils.js +97 -0
- package/dist/components/log/src/RsLog.css +52 -144
- package/dist/components/log/src/RsLog.d.ts +12 -11
- package/dist/components/log/src/RsLog.impl.js +181 -148
- package/dist/components/log/src/RsLog.js +1 -1
- package/dist/components/log/src/RsLogRow.css +152 -0
- package/dist/components/log/src/RsLogRow.d.ts +35 -0
- package/dist/components/log/src/RsLogRow.impl.js +91 -0
- package/dist/components/log/src/RsLogRow.js +8 -0
- package/dist/components/log/src/log-utils.d.ts +8 -0
- package/dist/components/log/src/log-utils.js +71 -10
- package/dist/components/markdown/index.d.ts +1 -1
- package/dist/components/markdown/src/RsMarkdown.css +75 -32
- package/dist/components/markdown/src/RsMarkdown.d.ts +6 -2
- package/dist/components/markdown/src/RsMarkdown.impl.js +185 -17
- package/dist/components/markdown/src/markdown-utils.d.ts +26 -0
- package/dist/components/markdown/src/markdown-utils.js +114 -12
- package/dist/components/mentions/src/RsMentions.d.ts +2 -2
- package/dist/components/menu/index.d.ts +1 -1
- package/dist/components/menu/src/RsMenu.css +70 -29
- package/dist/components/menu/src/RsMenu.d.ts +58 -4
- package/dist/components/menu/src/RsMenu.impl.js +93 -46
- package/dist/components/menu/src/RsMenuItems.d.ts +22 -5
- package/dist/components/menu/src/RsMenuItems.impl.js +506 -154
- package/dist/components/menu/src/menu-utils.d.ts +56 -0
- package/dist/components/menu/src/menu-utils.js +139 -6
- package/dist/components/monaco-editor/index.d.ts +1 -1
- package/dist/components/monaco-editor/src/RsMonacoEditor.css +28 -16
- package/dist/components/monaco-editor/src/RsMonacoEditor.d.ts +39 -41
- package/dist/components/monaco-editor/src/RsMonacoEditor.impl.js +212 -133
- package/dist/components/monaco-editor/src/RsMonacoEditor.js +1 -1
- package/dist/components/monaco-editor/src/monaco-editor-utils.d.ts +126 -0
- package/dist/components/monaco-editor/src/monaco-editor-utils.js +302 -0
- package/dist/components/pagination/index.d.ts +2 -2
- package/dist/components/pagination/src/RsPagination.css +93 -46
- package/dist/components/pagination/src/RsPagination.d.ts +68 -8
- package/dist/components/pagination/src/RsPagination.impl.js +229 -86
- package/dist/components/pagination/src/RsPagination.js +1 -1
- package/dist/components/pagination/src/pagination-utils.d.ts +59 -0
- package/dist/components/pagination/src/pagination-utils.js +105 -1
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/src/RsPopover.css +124 -14
- package/dist/components/popover/src/RsPopover.d.ts +38 -7
- package/dist/components/popover/src/RsPopover.impl.js +546 -35
- package/dist/components/popover/src/RsPopover.js +2 -1
- package/dist/components/popover/src/popover-utils.d.ts +24 -2
- package/dist/components/popover/src/popover-utils.js +55 -0
- package/dist/components/sidebar/index.d.ts +1 -0
- package/dist/components/sidebar/src/RsSidebar.css +91 -33
- package/dist/components/sidebar/src/RsSidebar.d.ts +17 -9
- package/dist/components/sidebar/src/RsSidebar.impl.js +124 -22
- package/dist/components/sidebar/src/RsSidebar.js +1 -1
- package/dist/components/sidebar/src/RsSidebarGroup.css +23 -6
- package/dist/components/sidebar/src/RsSidebarGroup.d.ts +6 -2
- package/dist/components/sidebar/src/RsSidebarGroup.impl.js +17 -4
- package/dist/components/sidebar/src/RsSidebarGroup.js +1 -1
- package/dist/components/sidebar/src/RsSidebarItem.css +50 -20
- package/dist/components/sidebar/src/RsSidebarItem.d.ts +21 -3
- package/dist/components/sidebar/src/RsSidebarItem.impl.js +71 -20
- package/dist/components/sidebar/src/RsSidebarItem.js +1 -1
- package/dist/components/sidebar/src/sidebar-utils.d.ts +47 -0
- package/dist/components/sidebar/src/sidebar-utils.js +72 -0
- package/dist/components/split-pane/index.d.ts +2 -2
- package/dist/components/split-pane/src/RsSplitPane.css +41 -30
- package/dist/components/split-pane/src/RsSplitPane.d.ts +6 -2
- package/dist/components/split-pane/src/RsSplitPane.impl.js +153 -45
- package/dist/components/split-pane/src/split-pane-utils.d.ts +23 -0
- package/dist/components/split-pane/src/split-pane-utils.js +18 -1
- package/dist/components/stat-card/index.d.ts +1 -0
- package/dist/components/stat-card/src/RsStatCard.css +129 -25
- package/dist/components/stat-card/src/RsStatCard.d.ts +40 -4
- package/dist/components/stat-card/src/RsStatCard.impl.js +106 -12
- package/dist/components/stat-card/src/RsStatCard.js +1 -1
- package/dist/components/stat-card/src/stat-card-utils.d.ts +39 -0
- package/dist/components/stat-card/src/stat-card-utils.js +113 -0
- package/dist/components/steps/index.d.ts +1 -1
- package/dist/components/steps/src/RsSteps.css +158 -37
- package/dist/components/steps/src/RsSteps.d.ts +69 -5
- package/dist/components/steps/src/RsSteps.impl.js +168 -28
- package/dist/components/steps/src/RsSteps.js +1 -1
- package/dist/components/steps/src/steps-utils.d.ts +51 -1
- package/dist/components/steps/src/steps-utils.js +67 -1
- package/dist/components/table/src/RsTable.impl.js +4 -2
- package/dist/components/table/src/composables/useRsTableContextMenu.d.ts +16 -0
- package/dist/components/table/src/composables/useRsTableContextMenu.js +1 -1
- package/dist/components/table/src/composables/useRsTableEngine.js +6 -2
- package/dist/components/table/src/composables/useRsTableScrollLayout.js +2 -0
- package/dist/components/table/src/composables/useRsTableShell.d.ts +16 -0
- package/dist/components/table/src/rs-table-props.d.ts +1 -1
- package/dist/components/table/src/rs-table-props.js +0 -1
- package/dist/components/table/src/table-body/RsTableBody.impl.js +1 -0
- package/dist/components/table/src/table-body/RsTableCell.impl.js +1 -1
- package/dist/components/table/src/table-body/RsTableCellEditor.impl.js +10 -2
- package/dist/components/table/src/table-body/RsTableColGroup.impl.js +1 -0
- package/dist/components/table/src/table-footer/RsTableSummaryRow.impl.js +1 -0
- package/dist/components/table/src/table-header/RsTableHeader.impl.js +1 -0
- package/dist/components/table/src/utils/table-utils.d.ts +10 -6
- package/dist/components/table/src/utils/table-utils.js +27 -25
- package/dist/components/table/style/rs-table.css +86 -28
- package/dist/components/tabs/index.d.ts +2 -2
- package/dist/components/tabs/src/RsTabs.css +225 -101
- package/dist/components/tabs/src/RsTabs.d.ts +37 -8
- package/dist/components/tabs/src/RsTabs.impl.js +400 -270
- package/dist/components/tabs/src/tabs-utils.d.ts +41 -2
- package/dist/components/tabs/src/tabs-utils.js +55 -1
- package/dist/components/terminal/index.d.ts +1 -1
- package/dist/components/terminal/src/RsTerminal.css +60 -37
- package/dist/components/terminal/src/RsTerminal.d.ts +36 -4
- package/dist/components/terminal/src/RsTerminal.impl.js +288 -68
- package/dist/components/terminal/src/RsTerminal.js +1 -1
- package/dist/components/terminal/src/terminal-utils.d.ts +42 -4
- package/dist/components/terminal/src/terminal-utils.js +113 -10
- package/dist/components/textarea/src/RsTextarea.d.ts +1 -1
- package/dist/components/time-picker/src/RsTimePicker.d.ts +2 -2
- package/dist/components/toaster/src/RsToaster.css +156 -203
- package/dist/components/toaster/src/RsToaster.d.ts +32 -2
- package/dist/components/toaster/src/RsToaster.impl.js +309 -34
- package/dist/components/toaster/src/toast-store.d.ts +95 -0
- package/dist/components/toaster/src/toast-store.js +177 -0
- package/dist/components/toaster/src/toast-utils.d.ts +60 -0
- package/dist/components/toaster/src/toast-utils.js +86 -0
- package/dist/components/toolbar/index.d.ts +1 -1
- package/dist/components/toolbar/src/RsToolbar.css +206 -32
- package/dist/components/toolbar/src/RsToolbar.d.ts +41 -16
- package/dist/components/toolbar/src/RsToolbar.impl.js +146 -18
- package/dist/components/toolbar/src/RsToolbar.js +2 -1
- package/dist/components/toolbar/src/toolbar-utils.d.ts +20 -0
- package/dist/components/toolbar/src/toolbar-utils.js +105 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/src/RsTooltip.css +104 -26
- package/dist/components/tooltip/src/RsTooltip.d.ts +38 -16
- package/dist/components/tooltip/src/RsTooltip.impl.js +420 -51
- package/dist/components/tooltip/src/RsTooltip.js +2 -1
- package/dist/components/tooltip/src/RsTooltipProvider.d.ts +4 -4
- package/dist/components/tooltip/src/RsTooltipProvider.impl.js +51 -14
- package/dist/components/tooltip/src/tooltip-utils.d.ts +30 -0
- package/dist/components/tooltip/src/tooltip-utils.js +23 -0
- package/dist/components/tree/index.d.ts +2 -2
- package/dist/components/tree/src/RsTree.css +84 -75
- package/dist/components/tree/src/RsTree.d.ts +20 -20
- package/dist/components/tree/src/RsTree.impl.js +292 -66
- package/dist/components/tree/src/RsTree.js +1 -1
- package/dist/components/tree/src/tree-utils.d.ts +22 -0
- package/dist/components/tree/src/tree-utils.js +18 -4
- package/dist/components/tree-select/src/RsTreeSelect.d.ts +1 -1
- package/dist/components/virtual-list/index.d.ts +1 -1
- package/dist/components/virtual-list/src/RsVirtualList.css +64 -9
- package/dist/components/virtual-list/src/RsVirtualList.d.ts +31 -5
- package/dist/components/virtual-list/src/RsVirtualList.impl.js +425 -76
- package/dist/components/virtual-list/src/RsVirtualList.js +1 -1
- package/dist/components/virtual-list/src/virtual-list-utils.d.ts +64 -1
- package/dist/components/virtual-list/src/virtual-list-utils.js +215 -1
- package/dist/composables/useRsLoadingBar.d.ts +2 -5
- package/dist/composables/useRsLoadingBar.js +21 -5
- package/dist/composables/useRsTabsNav.d.ts +3 -1
- package/dist/composables/useRsTabsNav.js +96 -28
- package/dist/composables/useRsToast.d.ts +11 -13
- package/dist/composables/useRsToast.js +66 -17
- package/dist/index.d.ts +30 -21
- package/dist/index.js +14 -0
- package/dist/locale/apply.js +6 -1
- package/dist/locale/messages.js +128 -2
- package/dist/styles.css +465 -808
- package/dist/theme/brand.example.css +3 -2
- package/dist/vite-plugins/niuma-ui-host.js +1 -1
- package/package.json +2 -5
- package/dist/components/_shared/src/reka.d.ts +0 -2
- package/dist/components/_shared/src/reka.js +0 -2
|
@@ -1,75 +1,386 @@
|
|
|
1
|
+
import { useRsConfigOptional } from "../../../composables/useRsConfig.js";
|
|
2
|
+
import { resolveDirMode } from "../../../locale/apply.js";
|
|
3
|
+
import { useRsI18n } from "../../../composables/useRsI18n.js";
|
|
1
4
|
import { rsRadiusCss, useResolvedRsRadius } from "../../_shared/src/resolve-radius.js";
|
|
2
|
-
import { isVirtualListFillHeight, resolveItemSize, resolveVirtualListHeight } from "./virtual-list-utils.js";
|
|
3
|
-
import { Fragment, computed, createElementBlock, createElementVNode, createTextVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onActivated, onMounted, onUnmounted, openBlock, ref, renderList, renderSlot, toDisplayString, watch } from "vue";
|
|
5
|
+
import { buildVirtualMetrics, contentToScroll, detectRtlScrollType, isVirtualListFillHeight, parseVirtualListHeightPx, readHorizontalOffset, readVirtualItemBox, resolveAlignedOffset, resolveItemSize, resolveVirtualListHeight, resolveVirtualListKeyIndex, resolveVisibleRange, scrollToContent, windowOrigin, writeHorizontalOffset } from "./virtual-list-utils.js";
|
|
6
|
+
import { Fragment, computed, createElementBlock, createElementVNode, createTextVNode, defineComponent, mergeModels, nextTick, normalizeClass, normalizeStyle, onActivated, onMounted, onUnmounted, openBlock, ref, renderList, renderSlot, toDisplayString, useAttrs, useId, useModel, watch } from "vue";
|
|
4
7
|
//#region src/components/virtual-list/src/RsVirtualList.vue?vue&type=script&setup=true&lang.ts
|
|
8
|
+
var _hoisted_1 = [
|
|
9
|
+
"id",
|
|
10
|
+
"role",
|
|
11
|
+
"aria-label",
|
|
12
|
+
"aria-activedescendant",
|
|
13
|
+
"tabindex"
|
|
14
|
+
];
|
|
15
|
+
var _hoisted_2 = {
|
|
16
|
+
key: 0,
|
|
17
|
+
class: "rs-virtual-list__empty",
|
|
18
|
+
role: "status"
|
|
19
|
+
};
|
|
20
|
+
var _hoisted_3 = { class: "rs-virtual-list__items" };
|
|
21
|
+
var _hoisted_4 = [
|
|
22
|
+
"id",
|
|
23
|
+
"role",
|
|
24
|
+
"aria-selected",
|
|
25
|
+
"aria-current",
|
|
26
|
+
"onClick"
|
|
27
|
+
];
|
|
5
28
|
var RsVirtualList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
29
|
+
name: "RsVirtualList",
|
|
6
30
|
__name: "RsVirtualList",
|
|
7
|
-
props: {
|
|
31
|
+
props: /*@__PURE__*/ mergeModels({
|
|
8
32
|
items: {},
|
|
9
33
|
itemSize: {
|
|
10
|
-
type: [
|
|
34
|
+
type: [
|
|
35
|
+
Number,
|
|
36
|
+
Function,
|
|
37
|
+
String
|
|
38
|
+
],
|
|
11
39
|
default: 32
|
|
12
40
|
},
|
|
41
|
+
estimateSize: { default: 32 },
|
|
13
42
|
height: { default: 240 },
|
|
14
43
|
overscan: { default: 4 },
|
|
15
|
-
activeIndex: { default: null },
|
|
16
44
|
layoutActive: { type: Boolean },
|
|
17
|
-
radius: {}
|
|
18
|
-
|
|
19
|
-
|
|
45
|
+
radius: {},
|
|
46
|
+
orientation: { default: "vertical" },
|
|
47
|
+
itemKey: {},
|
|
48
|
+
keyboard: {
|
|
49
|
+
type: Boolean,
|
|
50
|
+
default: false
|
|
51
|
+
},
|
|
52
|
+
bordered: {
|
|
53
|
+
type: Boolean,
|
|
54
|
+
default: true
|
|
55
|
+
},
|
|
56
|
+
ariaLabel: {},
|
|
57
|
+
id: {}
|
|
58
|
+
}, {
|
|
59
|
+
"activeIndex": { default: null },
|
|
60
|
+
"activeIndexModifiers": {}
|
|
61
|
+
}),
|
|
62
|
+
emits: /*@__PURE__*/ mergeModels(["scroll", "change"], ["update:activeIndex"]),
|
|
63
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
20
64
|
const props = __props;
|
|
65
|
+
const activeIndex = useModel(__props, "activeIndex");
|
|
66
|
+
const emit = __emit;
|
|
67
|
+
const attrs = useAttrs();
|
|
68
|
+
const { t } = useRsI18n();
|
|
69
|
+
const config = useRsConfigOptional();
|
|
70
|
+
const uid = useId();
|
|
21
71
|
const resolvedRadius = useResolvedRsRadius(() => props.radius, "sm");
|
|
22
72
|
const rootRef = ref(null);
|
|
23
|
-
const
|
|
24
|
-
const
|
|
73
|
+
const scrollOffset = ref(0);
|
|
74
|
+
const measured = ref(0);
|
|
75
|
+
const scrolling = ref(false);
|
|
76
|
+
const rtl = ref(false);
|
|
77
|
+
const measureVersion = ref(0);
|
|
78
|
+
const measuredSizes = /* @__PURE__ */ new Map();
|
|
79
|
+
const indexByEl = /* @__PURE__ */ new WeakMap();
|
|
80
|
+
const observed = /* @__PURE__ */ new Set();
|
|
81
|
+
let resizeObserver = null;
|
|
82
|
+
let itemObserver = null;
|
|
83
|
+
let disposed = false;
|
|
84
|
+
let ignoreActiveScroll = false;
|
|
85
|
+
let layoutGen = 0;
|
|
86
|
+
let layoutFrame = 0;
|
|
87
|
+
let activeFrame = 0;
|
|
88
|
+
let scrollIdle = 0;
|
|
89
|
+
let rtlScrollType = detectRtlScrollType();
|
|
25
90
|
const fillHeight = computed(() => isVirtualListFillHeight(props.height));
|
|
91
|
+
const horizontal = computed(() => props.orientation === "horizontal");
|
|
92
|
+
const rootId = computed(() => props.id || `rs-virtual-list-${uid}`);
|
|
93
|
+
const listRole = computed(() => {
|
|
94
|
+
if (attrs.role) return void 0;
|
|
95
|
+
return props.keyboard ? "listbox" : void 0;
|
|
96
|
+
});
|
|
97
|
+
const resolvedAriaLabel = computed(() => {
|
|
98
|
+
if (props.ariaLabel) return props.ariaLabel;
|
|
99
|
+
if (attrs["aria-label"] || attrs.ariaLabel) return void 0;
|
|
100
|
+
if (props.keyboard) return t("virtualList.label");
|
|
101
|
+
});
|
|
102
|
+
const emptyLabel = computed(() => t("virtualList.empty"));
|
|
26
103
|
const heightStyle = computed(() => {
|
|
27
104
|
const resolved = resolveVirtualListHeight(props.height);
|
|
28
105
|
return resolved ? { height: resolved } : void 0;
|
|
29
106
|
});
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
})
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const parsed = Number.parseInt(props.height, 10);
|
|
39
|
-
if (Number.isFinite(parsed) && parsed > 0 && !props.height.includes("%")) return parsed;
|
|
107
|
+
const metrics = computed(() => {
|
|
108
|
+
const version = measureVersion.value;
|
|
109
|
+
return buildVirtualMetrics(props.items.length, props.itemSize, version >= 0 ? measuredSizes : null, resolveItemSize(props.estimateSize));
|
|
110
|
+
});
|
|
111
|
+
const viewportPx = computed(() => {
|
|
112
|
+
if (!horizontal.value) {
|
|
113
|
+
const parsed = parseVirtualListHeightPx(props.height);
|
|
114
|
+
if (parsed != null) return parsed;
|
|
40
115
|
}
|
|
41
|
-
if (
|
|
116
|
+
if (measured.value > 0) return measured.value;
|
|
42
117
|
const el = rootRef.value;
|
|
43
|
-
if (el
|
|
118
|
+
if (el) {
|
|
119
|
+
const live = horizontal.value ? el.clientWidth : el.clientHeight;
|
|
120
|
+
if (live > 0) return live;
|
|
121
|
+
}
|
|
44
122
|
return 240;
|
|
45
123
|
});
|
|
46
|
-
|
|
47
|
-
|
|
124
|
+
const contentOffset = computed(() => scrollToContent(scrollOffset.value, metrics.value.total, viewportPx.value, metrics.value.extent));
|
|
125
|
+
const range = computed(() => resolveVisibleRange(props.items.length, contentOffset.value, viewportPx.value, props.overscan, metrics.value));
|
|
126
|
+
const origin = computed(() => windowOrigin(scrollOffset.value, contentOffset.value, range.value.offset));
|
|
127
|
+
const shiftX = computed(() => {
|
|
128
|
+
if (!horizontal.value) return 0;
|
|
129
|
+
return rtl.value ? -origin.value : origin.value;
|
|
130
|
+
});
|
|
131
|
+
const shiftY = computed(() => horizontal.value ? 0 : origin.value);
|
|
132
|
+
const rootStyle = computed(() => ({
|
|
133
|
+
...heightStyle.value,
|
|
134
|
+
"--rs-virtual-list-radius": rsRadiusCss(resolvedRadius.value),
|
|
135
|
+
"--rs-virtual-list-x": `${shiftX.value}px`,
|
|
136
|
+
"--rs-virtual-list-y": `${shiftY.value}px`
|
|
137
|
+
}));
|
|
138
|
+
const spacerStyle = computed(() => {
|
|
139
|
+
const extent = `${metrics.value.extent}px`;
|
|
140
|
+
return horizontal.value ? {
|
|
141
|
+
width: extent,
|
|
142
|
+
height: "100%"
|
|
143
|
+
} : { height: extent };
|
|
144
|
+
});
|
|
145
|
+
const visibleItems = computed(() => {
|
|
146
|
+
const { start, end } = range.value;
|
|
147
|
+
return props.items.slice(start, end).map((item, index) => {
|
|
148
|
+
const itemIndex = start + index;
|
|
149
|
+
return {
|
|
150
|
+
item,
|
|
151
|
+
index: itemIndex,
|
|
152
|
+
key: props.itemKey ? props.itemKey(item, itemIndex) : itemIndex
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
const activeDescendant = computed(() => {
|
|
157
|
+
if (!props.keyboard || activeIndex.value == null || activeIndex.value < 0) return void 0;
|
|
158
|
+
return `${rootId.value}-opt-${activeIndex.value}`;
|
|
159
|
+
});
|
|
160
|
+
function itemStyle(index) {
|
|
161
|
+
if (props.itemSize === "auto") {
|
|
162
|
+
const known = measuredSizes.get(index);
|
|
163
|
+
if (known == null) return void 0;
|
|
164
|
+
const size = `${known}px`;
|
|
165
|
+
return horizontal.value ? { width: size } : { height: size };
|
|
166
|
+
}
|
|
167
|
+
const size = `${metrics.value.sizeAt(index)}px`;
|
|
168
|
+
return horizontal.value ? { width: size } : { height: size };
|
|
169
|
+
}
|
|
170
|
+
function optionId(index) {
|
|
171
|
+
if (!props.keyboard || attrs.role) return void 0;
|
|
172
|
+
return `${rootId.value}-opt-${index}`;
|
|
173
|
+
}
|
|
174
|
+
function isRtlHost() {
|
|
175
|
+
if (config) return resolveDirMode(config.dir.value, config.locale.value) === "rtl";
|
|
176
|
+
const parent = rootRef.value?.parentElement;
|
|
177
|
+
if (parent && typeof getComputedStyle === "function") return getComputedStyle(parent).direction === "rtl";
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
function syncDir() {
|
|
181
|
+
rtl.value = isRtlHost();
|
|
182
|
+
}
|
|
183
|
+
function axisSize(el) {
|
|
184
|
+
return horizontal.value ? el.clientWidth : el.clientHeight;
|
|
185
|
+
}
|
|
186
|
+
function readRawScroll(el) {
|
|
187
|
+
if (!horizontal.value) return el.scrollTop;
|
|
188
|
+
const max = Math.max(0, el.scrollWidth - el.clientWidth);
|
|
189
|
+
return readHorizontalOffset(el.scrollLeft, max, rtl.value, rtlScrollType);
|
|
190
|
+
}
|
|
191
|
+
function writeRawScroll(el, offset) {
|
|
192
|
+
if (!horizontal.value) {
|
|
193
|
+
el.scrollTop = offset;
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
el.scrollLeft = writeHorizontalOffset(offset, Math.max(0, el.scrollWidth - el.clientWidth), rtl.value, rtlScrollType);
|
|
197
|
+
}
|
|
198
|
+
function syncMeasured() {
|
|
48
199
|
const el = rootRef.value;
|
|
49
200
|
if (!el) return;
|
|
50
|
-
const next = el.clientHeight;
|
|
51
|
-
if (next > 0 && next !==
|
|
201
|
+
const next = horizontal.value ? el.clientWidth : el.clientHeight;
|
|
202
|
+
if (next > 0 && next !== measured.value) measured.value = next;
|
|
52
203
|
}
|
|
53
204
|
function syncLayoutFromDom() {
|
|
54
|
-
|
|
205
|
+
syncDir();
|
|
206
|
+
syncMeasured();
|
|
55
207
|
const el = rootRef.value;
|
|
56
|
-
if (el)
|
|
208
|
+
if (el) scrollOffset.value = readRawScroll(el);
|
|
209
|
+
}
|
|
210
|
+
function frame(callback) {
|
|
211
|
+
if (typeof requestAnimationFrame !== "function") {
|
|
212
|
+
callback();
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
return requestAnimationFrame(callback);
|
|
57
216
|
}
|
|
58
217
|
function scheduleLayoutSync() {
|
|
218
|
+
if (disposed) return;
|
|
219
|
+
const gen = ++layoutGen;
|
|
59
220
|
syncLayoutFromDom();
|
|
60
221
|
nextTick(() => {
|
|
222
|
+
if (disposed || gen !== layoutGen) return;
|
|
61
223
|
syncLayoutFromDom();
|
|
62
|
-
|
|
63
|
-
|
|
224
|
+
if (layoutFrame && typeof cancelAnimationFrame === "function") cancelAnimationFrame(layoutFrame);
|
|
225
|
+
layoutFrame = frame(() => {
|
|
226
|
+
layoutFrame = 0;
|
|
227
|
+
if (!disposed && gen === layoutGen) syncLayoutFromDom();
|
|
64
228
|
});
|
|
65
229
|
});
|
|
66
230
|
}
|
|
231
|
+
function markScrolling() {
|
|
232
|
+
if (disposed) return;
|
|
233
|
+
if (!scrolling.value) scrolling.value = true;
|
|
234
|
+
if (scrollIdle) clearTimeout(scrollIdle);
|
|
235
|
+
scrollIdle = setTimeout(() => {
|
|
236
|
+
scrollIdle = 0;
|
|
237
|
+
if (!disposed) scrolling.value = false;
|
|
238
|
+
}, 120);
|
|
239
|
+
}
|
|
240
|
+
function onScroll(event) {
|
|
241
|
+
emit("scroll", event);
|
|
242
|
+
const el = event.currentTarget;
|
|
243
|
+
if (!(el instanceof HTMLElement) || disposed) return;
|
|
244
|
+
const next = readRawScroll(el);
|
|
245
|
+
if (next !== scrollOffset.value) scrollOffset.value = next;
|
|
246
|
+
markScrolling();
|
|
247
|
+
}
|
|
248
|
+
function scrollToIndex(index, align = "center") {
|
|
249
|
+
const el = rootRef.value;
|
|
250
|
+
if (!el || index < 0 || index >= props.items.length) return;
|
|
251
|
+
const view = axisSize(el) > 0 ? axisSize(el) : viewportPx.value;
|
|
252
|
+
const content = scrollToContent(readRawScroll(el), metrics.value.total, view, metrics.value.extent);
|
|
253
|
+
const nextContent = resolveAlignedOffset({
|
|
254
|
+
index,
|
|
255
|
+
align,
|
|
256
|
+
count: props.items.length,
|
|
257
|
+
viewport: view,
|
|
258
|
+
contentOffset: content,
|
|
259
|
+
total: metrics.value.total,
|
|
260
|
+
offsetAt: metrics.value.offsetAt,
|
|
261
|
+
sizeAt: metrics.value.sizeAt
|
|
262
|
+
});
|
|
263
|
+
if (nextContent == null) return;
|
|
264
|
+
writeRawScroll(el, contentToScroll(nextContent, metrics.value.total, view, metrics.value.extent));
|
|
265
|
+
scrollOffset.value = readRawScroll(el);
|
|
266
|
+
}
|
|
267
|
+
function scrollToOffset(offset) {
|
|
268
|
+
const el = rootRef.value;
|
|
269
|
+
if (!el || !Number.isFinite(offset)) return;
|
|
270
|
+
const view = axisSize(el) > 0 ? axisSize(el) : viewportPx.value;
|
|
271
|
+
writeRawScroll(el, contentToScroll(Math.max(0, offset), metrics.value.total, view, metrics.value.extent));
|
|
272
|
+
scrollOffset.value = readRawScroll(el);
|
|
273
|
+
}
|
|
274
|
+
function getScrollOffset() {
|
|
275
|
+
const el = rootRef.value;
|
|
276
|
+
const raw = el ? readRawScroll(el) : scrollOffset.value;
|
|
277
|
+
const view = el && axisSize(el) > 0 ? axisSize(el) : viewportPx.value;
|
|
278
|
+
return scrollToContent(raw, metrics.value.total, view, metrics.value.extent);
|
|
279
|
+
}
|
|
280
|
+
function getViewport() {
|
|
281
|
+
return rootRef.value ?? void 0;
|
|
282
|
+
}
|
|
283
|
+
function focus() {
|
|
284
|
+
rootRef.value?.focus();
|
|
285
|
+
}
|
|
286
|
+
function selectIndex(index, item) {
|
|
287
|
+
if (index < 0 || index >= props.items.length) return;
|
|
288
|
+
activeIndex.value = index;
|
|
289
|
+
emit("change", index, item);
|
|
290
|
+
}
|
|
291
|
+
function onItemClick(index, item) {
|
|
292
|
+
selectIndex(index, item);
|
|
293
|
+
}
|
|
294
|
+
function isTypingTarget(target) {
|
|
295
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
296
|
+
return Boolean(target.closest("input, textarea, select, [contenteditable=\"true\"]"));
|
|
297
|
+
}
|
|
298
|
+
function pageSize() {
|
|
299
|
+
const sample = metrics.value.fixed ?? metrics.value.sizeAt(0);
|
|
300
|
+
if (sample <= 0) return 1;
|
|
301
|
+
return Math.max(1, Math.floor(viewportPx.value / sample));
|
|
302
|
+
}
|
|
303
|
+
function onKeydown(event) {
|
|
304
|
+
if (!props.keyboard || isTypingTarget(event.target)) return;
|
|
305
|
+
const next = resolveVirtualListKeyIndex({
|
|
306
|
+
key: event.key,
|
|
307
|
+
index: activeIndex.value,
|
|
308
|
+
count: props.items.length,
|
|
309
|
+
orientation: props.orientation,
|
|
310
|
+
rtl: rtl.value,
|
|
311
|
+
pageSize: pageSize()
|
|
312
|
+
});
|
|
313
|
+
if (next == null) return;
|
|
314
|
+
event.preventDefault();
|
|
315
|
+
if (next === activeIndex.value) return;
|
|
316
|
+
const item = props.items[next];
|
|
317
|
+
if (item === void 0) return;
|
|
318
|
+
ignoreActiveScroll = true;
|
|
319
|
+
selectIndex(next, item);
|
|
320
|
+
scrollToIndex(next, "nearest");
|
|
321
|
+
}
|
|
322
|
+
function ensureItemObserver() {
|
|
323
|
+
if (itemObserver || props.itemSize !== "auto" || typeof ResizeObserver === "undefined") return;
|
|
324
|
+
itemObserver = new ResizeObserver((entries) => {
|
|
325
|
+
if (disposed || props.itemSize !== "auto") return;
|
|
326
|
+
let changed = false;
|
|
327
|
+
for (const entry of entries) {
|
|
328
|
+
const index = indexByEl.get(entry.target);
|
|
329
|
+
if (index == null) continue;
|
|
330
|
+
if (applyMeasure(index, readVirtualItemBox(entry, props.orientation))) changed = true;
|
|
331
|
+
}
|
|
332
|
+
if (changed) measureVersion.value += 1;
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
function applyMeasure(index, next) {
|
|
336
|
+
if (next <= 0) return false;
|
|
337
|
+
const estimate = resolveItemSize(props.estimateSize);
|
|
338
|
+
const prev = measuredSizes.get(index);
|
|
339
|
+
const before = prev ?? estimate;
|
|
340
|
+
if (prev != null && Math.abs(prev - next) < .5) return false;
|
|
341
|
+
measuredSizes.set(index, next);
|
|
342
|
+
if (prev == null && Math.abs(next - estimate) < .5) return false;
|
|
343
|
+
const delta = next - before;
|
|
344
|
+
const el = rootRef.value;
|
|
345
|
+
if (el && delta !== 0 && metrics.value.extent === metrics.value.total && index < range.value.start) {
|
|
346
|
+
writeRawScroll(el, readRawScroll(el) + delta);
|
|
347
|
+
scrollOffset.value = readRawScroll(el);
|
|
348
|
+
}
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
function bindItem(el, index) {
|
|
352
|
+
if (props.itemSize !== "auto" || !(el instanceof Element)) return;
|
|
353
|
+
indexByEl.set(el, index);
|
|
354
|
+
if (observed.has(el)) return;
|
|
355
|
+
ensureItemObserver();
|
|
356
|
+
observed.add(el);
|
|
357
|
+
itemObserver?.observe(el);
|
|
358
|
+
}
|
|
359
|
+
function sweepObserved() {
|
|
360
|
+
for (const el of observed) if (!el.isConnected) {
|
|
361
|
+
itemObserver?.unobserve(el);
|
|
362
|
+
observed.delete(el);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
function disconnectItemObserver() {
|
|
366
|
+
itemObserver?.disconnect();
|
|
367
|
+
itemObserver = null;
|
|
368
|
+
observed.clear();
|
|
369
|
+
}
|
|
370
|
+
function releaseItemObserver() {
|
|
371
|
+
disconnectItemObserver();
|
|
372
|
+
measuredSizes.clear();
|
|
373
|
+
}
|
|
67
374
|
onMounted(() => {
|
|
375
|
+
rtlScrollType = detectRtlScrollType();
|
|
68
376
|
scheduleLayoutSync();
|
|
69
377
|
const el = rootRef.value;
|
|
70
378
|
if (!el || typeof ResizeObserver === "undefined") return;
|
|
71
|
-
resizeObserver = new ResizeObserver(() =>
|
|
379
|
+
resizeObserver = new ResizeObserver(() => {
|
|
380
|
+
if (!disposed) syncMeasured();
|
|
381
|
+
});
|
|
72
382
|
resizeObserver.observe(el);
|
|
383
|
+
if (props.itemSize === "auto") ensureItemObserver();
|
|
73
384
|
});
|
|
74
385
|
onActivated(() => {
|
|
75
386
|
scheduleLayoutSync();
|
|
@@ -77,65 +388,103 @@ var RsVirtualList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
77
388
|
watch(() => props.layoutActive, (active) => {
|
|
78
389
|
if (active) scheduleLayoutSync();
|
|
79
390
|
}, { flush: "post" });
|
|
391
|
+
watch(() => props.items.length, (count) => {
|
|
392
|
+
for (const key of measuredSizes.keys()) if (key >= count) measuredSizes.delete(key);
|
|
393
|
+
});
|
|
394
|
+
watch(() => props.itemSize === "auto", (auto) => {
|
|
395
|
+
if (!auto) {
|
|
396
|
+
releaseItemObserver();
|
|
397
|
+
measureVersion.value += 1;
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
ensureItemObserver();
|
|
401
|
+
});
|
|
402
|
+
watch(() => [range.value.start, range.value.end], () => {
|
|
403
|
+
if (props.itemSize !== "auto") return;
|
|
404
|
+
nextTick(() => {
|
|
405
|
+
if (!disposed) sweepObserved();
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
watch(() => [activeIndex.value, props.items.length], async ([index, length]) => {
|
|
409
|
+
if (ignoreActiveScroll) {
|
|
410
|
+
ignoreActiveScroll = false;
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
if (disposed || index == null || index < 0 || length === 0) return;
|
|
414
|
+
await nextTick();
|
|
415
|
+
if (disposed || ignoreActiveScroll) {
|
|
416
|
+
ignoreActiveScroll = false;
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (activeFrame && typeof cancelAnimationFrame === "function") cancelAnimationFrame(activeFrame);
|
|
420
|
+
activeFrame = frame(() => {
|
|
421
|
+
activeFrame = 0;
|
|
422
|
+
if (!disposed) scrollToIndex(index);
|
|
423
|
+
});
|
|
424
|
+
}, { immediate: true });
|
|
80
425
|
onUnmounted(() => {
|
|
426
|
+
disposed = true;
|
|
427
|
+
layoutGen += 1;
|
|
428
|
+
if (typeof cancelAnimationFrame === "function") {
|
|
429
|
+
if (layoutFrame) cancelAnimationFrame(layoutFrame);
|
|
430
|
+
if (activeFrame) cancelAnimationFrame(activeFrame);
|
|
431
|
+
}
|
|
432
|
+
layoutFrame = 0;
|
|
433
|
+
activeFrame = 0;
|
|
434
|
+
if (scrollIdle) clearTimeout(scrollIdle);
|
|
435
|
+
scrollIdle = 0;
|
|
81
436
|
resizeObserver?.disconnect();
|
|
82
437
|
resizeObserver = null;
|
|
438
|
+
disconnectItemObserver();
|
|
439
|
+
});
|
|
440
|
+
__expose({
|
|
441
|
+
scrollToIndex,
|
|
442
|
+
scrollToOffset,
|
|
443
|
+
getScrollOffset,
|
|
444
|
+
getViewport,
|
|
445
|
+
focus
|
|
83
446
|
});
|
|
84
|
-
const startIndex = computed(() => Math.max(0, Math.floor(scrollTop.value / fixedItemSize.value) - props.overscan));
|
|
85
|
-
const visibleCount = computed(() => Math.ceil(viewportHeightPx.value / fixedItemSize.value) + props.overscan * 2);
|
|
86
|
-
const visibleItems = computed(() => props.items.slice(startIndex.value, startIndex.value + visibleCount.value).map((item, index) => ({
|
|
87
|
-
item,
|
|
88
|
-
index: startIndex.value + index
|
|
89
|
-
})));
|
|
90
|
-
const totalHeight = computed(() => props.items.length * fixedItemSize.value);
|
|
91
|
-
const offsetY = computed(() => startIndex.value * fixedItemSize.value);
|
|
92
|
-
function scrollToIndex(index, align = "center") {
|
|
93
|
-
const el = rootRef.value;
|
|
94
|
-
if (!el || index < 0 || index >= props.items.length) return;
|
|
95
|
-
const itemTop = index * fixedItemSize.value;
|
|
96
|
-
const itemBottom = itemTop + fixedItemSize.value;
|
|
97
|
-
const viewTop = el.scrollTop;
|
|
98
|
-
const viewBottom = viewTop + el.clientHeight;
|
|
99
|
-
if (align === "nearest" && itemTop >= viewTop && itemBottom <= viewBottom) return;
|
|
100
|
-
const maxScroll = Math.max(0, totalHeight.value - el.clientHeight);
|
|
101
|
-
let next = itemTop - (el.clientHeight - fixedItemSize.value) / 2;
|
|
102
|
-
if (align === "start") next = itemTop;
|
|
103
|
-
if (align === "end") next = itemBottom - el.clientHeight;
|
|
104
|
-
if (align === "nearest") if (itemTop < viewTop) next = itemTop;
|
|
105
|
-
else if (itemBottom > viewBottom) next = itemBottom - el.clientHeight;
|
|
106
|
-
else return;
|
|
107
|
-
el.scrollTop = Math.min(maxScroll, Math.max(0, next));
|
|
108
|
-
scrollTop.value = el.scrollTop;
|
|
109
|
-
}
|
|
110
|
-
watch(() => [props.activeIndex, props.items.length], async ([index, length]) => {
|
|
111
|
-
if (index == null || index < 0 || length === 0) return;
|
|
112
|
-
await nextTick();
|
|
113
|
-
requestAnimationFrame(() => scrollToIndex(index));
|
|
114
|
-
}, { immediate: true });
|
|
115
|
-
__expose({ scrollToIndex });
|
|
116
447
|
return (_ctx, _cache) => {
|
|
117
448
|
return openBlock(), createElementBlock("div", {
|
|
449
|
+
id: rootId.value,
|
|
118
450
|
ref_key: "rootRef",
|
|
119
451
|
ref: rootRef,
|
|
120
|
-
class: normalizeClass(["rs-virtual-list", {
|
|
452
|
+
class: normalizeClass(["rs-virtual-list", {
|
|
453
|
+
"rs-virtual-list--fill": fillHeight.value,
|
|
454
|
+
"rs-virtual-list--horizontal": horizontal.value,
|
|
455
|
+
"rs-virtual-list--borderless": !__props.bordered,
|
|
456
|
+
"rs-virtual-list--keyboard": __props.keyboard,
|
|
457
|
+
"rs-virtual-list--auto": __props.itemSize === "auto",
|
|
458
|
+
"rs-virtual-list--scrolling": scrolling.value
|
|
459
|
+
}]),
|
|
121
460
|
style: normalizeStyle(rootStyle.value),
|
|
122
|
-
|
|
123
|
-
|
|
461
|
+
role: listRole.value || void 0,
|
|
462
|
+
"aria-label": resolvedAriaLabel.value || void 0,
|
|
463
|
+
"aria-activedescendant": activeDescendant.value,
|
|
464
|
+
tabindex: __props.keyboard ? 0 : void 0,
|
|
465
|
+
onScroll,
|
|
466
|
+
onKeydown
|
|
467
|
+
}, [__props.items.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [renderSlot(_ctx.$slots, "empty", {}, () => [createTextVNode(toDisplayString(emptyLabel.value), 1)], true)])) : (openBlock(), createElementBlock("div", {
|
|
468
|
+
key: 1,
|
|
124
469
|
class: "rs-virtual-list__spacer",
|
|
125
|
-
style: normalizeStyle(
|
|
126
|
-
}, [createElementVNode("div", {
|
|
127
|
-
class: "rs-virtual-list__items",
|
|
128
|
-
style: normalizeStyle({ transform: `translateY(${offsetY.value}px)` })
|
|
129
|
-
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleItems.value, (entry) => {
|
|
470
|
+
style: normalizeStyle(spacerStyle.value)
|
|
471
|
+
}, [createElementVNode("div", _hoisted_3, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleItems.value, (entry) => {
|
|
130
472
|
return openBlock(), createElementBlock("div", {
|
|
131
|
-
key: entry.
|
|
132
|
-
|
|
133
|
-
|
|
473
|
+
key: entry.key,
|
|
474
|
+
ref_for: true,
|
|
475
|
+
ref: (el) => bindItem(el, entry.index),
|
|
476
|
+
class: normalizeClass(["rs-virtual-list__item", { "rs-virtual-list__item--active": activeIndex.value === entry.index }]),
|
|
477
|
+
id: optionId(entry.index),
|
|
478
|
+
role: listRole.value === "listbox" ? "option" : void 0,
|
|
479
|
+
"aria-selected": listRole.value === "listbox" ? activeIndex.value === entry.index ? "true" : "false" : void 0,
|
|
480
|
+
"aria-current": listRole.value === "listbox" ? void 0 : activeIndex.value === entry.index ? "true" : void 0,
|
|
481
|
+
style: normalizeStyle(itemStyle(entry.index)),
|
|
482
|
+
onClick: ($event) => onItemClick(entry.index, entry.item)
|
|
134
483
|
}, [renderSlot(_ctx.$slots, "default", {
|
|
135
484
|
item: entry.item,
|
|
136
485
|
index: entry.index
|
|
137
|
-
}, () => [createTextVNode(toDisplayString(entry.item), 1)], true)],
|
|
138
|
-
}), 128))]
|
|
486
|
+
}, () => [createTextVNode(toDisplayString(entry.item), 1)], true)], 14, _hoisted_4);
|
|
487
|
+
}), 128))])], 4))], 46, _hoisted_1);
|
|
139
488
|
};
|
|
140
489
|
}
|
|
141
490
|
});
|
|
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
|
|
|
3
3
|
import RsVirtualList_vue_vue_type_script_setup_true_lang_default from "./RsVirtualList.impl.js";
|
|
4
4
|
|
|
5
5
|
//#region src/components/virtual-list/src/RsVirtualList.vue
|
|
6
|
-
var RsVirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsVirtualList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
6
|
+
var RsVirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsVirtualList_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-c4f5f6d4"]]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { RsVirtualList_default as default };
|
|
@@ -1,7 +1,70 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type RsVirtualListAlign = 'nearest' | 'center' | 'start' | 'end';
|
|
2
|
+
export type RsVirtualListOrientation = 'vertical' | 'horizontal';
|
|
3
|
+
/** 固定像素、按索引返回像素,或 `'auto'`(量内容)。 */
|
|
4
|
+
export type RsVirtualListItemSize = number | ((index: number) => number) | 'auto';
|
|
5
|
+
export type RsVirtualListItemKey<T> = (item: T, index: number) => string | number;
|
|
6
|
+
export interface RsVirtualListExpose {
|
|
7
|
+
scrollToIndex: (index: number, align?: RsVirtualListAlign) => void;
|
|
8
|
+
scrollToOffset: (offset: number) => void;
|
|
9
|
+
getScrollOffset: () => number;
|
|
10
|
+
getViewport: () => HTMLElement | undefined;
|
|
11
|
+
focus: () => void;
|
|
12
|
+
}
|
|
13
|
+
export type RsVirtualListInstance = RsVirtualListExpose;
|
|
14
|
+
/** Chrome / Firefox 可滚动高度上限之下,避免超长列表把滚动条撑爆。 */
|
|
15
|
+
export declare const RS_VIRTUAL_LIST_MAX_EXTENT = 8000000;
|
|
16
|
+
export type RsRtlScrollType = 'default' | 'negative' | 'reverse';
|
|
17
|
+
export interface RsVirtualMetrics {
|
|
18
|
+
/** 定高时为行高;函数 / auto 时为 null。 */
|
|
19
|
+
fixed: number | null;
|
|
20
|
+
total: number;
|
|
21
|
+
extent: number;
|
|
22
|
+
sizeAt: (index: number) => number;
|
|
23
|
+
offsetAt: (index: number) => number;
|
|
24
|
+
}
|
|
2
25
|
export declare function resolveItemSize(itemSize: RsVirtualListItemSize, index?: number): number;
|
|
3
26
|
export declare function resolveVirtualListHeight(height?: number | string, fallback?: number): string | undefined;
|
|
4
27
|
/** height 为 0 / 百分比时由父级撑满,组件内用 ResizeObserver 测量可视高度 */
|
|
5
28
|
export declare function isVirtualListFillHeight(height?: number | string): boolean;
|
|
6
29
|
/** 解析虚拟列表数值视口高度;百分比 / 填满模式返回 null,交由测量值处理 */
|
|
7
30
|
export declare function parseVirtualListHeightPx(height?: number | string): number | null;
|
|
31
|
+
export declare function normalizeOverscan(value: number | undefined, fallback?: number): number;
|
|
32
|
+
export declare function capExtent(total: number, max?: number): number;
|
|
33
|
+
export declare function axisMax(total: number, viewport: number): number;
|
|
34
|
+
/** 内容偏移 → 滚动条偏移。未触顶时二者相同。 */
|
|
35
|
+
export declare function contentToScroll(content: number, total: number, viewport: number, extent: number): number;
|
|
36
|
+
/** 滚动条偏移 → 内容偏移。未触顶时二者相同。 */
|
|
37
|
+
export declare function scrollToContent(scroll: number, total: number, viewport: number, extent: number): number;
|
|
38
|
+
/** 窗口在滚动内容里的平移。scale 为 1 时等于条目偏移。 */
|
|
39
|
+
export declare function windowOrigin(scroll: number, contentOffset: number, itemOffset: number): number;
|
|
40
|
+
export declare function buildVirtualMetrics(count: number, itemSize: RsVirtualListItemSize, measured?: ReadonlyMap<number, number> | null, estimate?: number): RsVirtualMetrics;
|
|
41
|
+
export declare function findIndexAtOffset(count: number, offset: number, metrics: RsVirtualMetrics): number;
|
|
42
|
+
export declare function resolveVisibleRange(count: number, contentOffset: number, viewport: number, overscan: number | undefined, metrics: RsVirtualMetrics): {
|
|
43
|
+
start: number;
|
|
44
|
+
end: number;
|
|
45
|
+
offset: number;
|
|
46
|
+
};
|
|
47
|
+
export declare function resolveAlignedOffset(options: {
|
|
48
|
+
index: number;
|
|
49
|
+
align: RsVirtualListAlign;
|
|
50
|
+
count: number;
|
|
51
|
+
viewport: number;
|
|
52
|
+
contentOffset: number;
|
|
53
|
+
total: number;
|
|
54
|
+
offsetAt: (index: number) => number;
|
|
55
|
+
sizeAt: (index: number) => number;
|
|
56
|
+
}): number | null;
|
|
57
|
+
export declare function readHorizontalOffset(scrollLeft: number, max: number, rtl: boolean, type: RsRtlScrollType): number;
|
|
58
|
+
export declare function writeHorizontalOffset(offset: number, max: number, rtl: boolean, type: RsRtlScrollType): number;
|
|
59
|
+
/** 探测当前引擎的 RTL scrollLeft。探测节点用完即删。无 document 时按 default。 */
|
|
60
|
+
export declare function detectRtlScrollType(): RsRtlScrollType;
|
|
61
|
+
export declare function resetRtlScrollTypeCache(): void;
|
|
62
|
+
export declare function resolveVirtualListKeyIndex(options: {
|
|
63
|
+
key: string;
|
|
64
|
+
index: number | null;
|
|
65
|
+
count: number;
|
|
66
|
+
orientation: RsVirtualListOrientation;
|
|
67
|
+
rtl: boolean;
|
|
68
|
+
pageSize: number;
|
|
69
|
+
}): number | null;
|
|
70
|
+
export declare function readVirtualItemBox(entry: ResizeObserverEntry, orientation: RsVirtualListOrientation): number;
|