From ac696433b7cf68a07f17f433480ec466c17edcce Mon Sep 17 00:00:00 2001 From: HugoRCD Date: Sat, 31 May 2025 23:26:24 +0200 Subject: [PATCH] feat(SelectMenu): implement virtualization --- src/runtime/components/SelectMenu.vue | 117 +++++++++++++++----------- src/theme/select.ts | 2 +- 2 files changed, 71 insertions(+), 48 deletions(-) diff --git a/src/runtime/components/SelectMenu.vue b/src/runtime/components/SelectMenu.vue index bd695db3..888b99a2 100644 --- a/src/runtime/components/SelectMenu.vue +++ b/src/runtime/components/SelectMenu.vue @@ -115,6 +115,16 @@ export interface SelectMenuProps = Array * @defaultValue false */ ignoreFilter?: boolean + /** + * Estimated size (in px) of each item for virtualization. + * @defaultValue 35 + */ + estimateSize?: number + /** + * Number of items rendered outside the visible area for virtualization. + * @defaultValue 5 + */ + overscan?: number class?: any ui?: SelectMenu['slots'] } @@ -166,7 +176,7 @@ export interface SelectMenuSlots< @@ -418,58 +436,63 @@ function isSelectItem(item: SelectMenuItem): item is _SelectMenuItem { -
+ - - - + + + + {{ isSelectItem(option) ? get(option, props.labelKey as string) : option }} + + + + + + + + + + + + + -
+ diff --git a/src/theme/select.ts b/src/theme/select.ts index 83522add..5b2e4987 100644 --- a/src/theme/select.ts +++ b/src/theme/select.ts @@ -12,7 +12,7 @@ export default (options: Required) => { placeholder: 'truncate text-dimmed', arrow: 'fill-default', content: 'max-h-60 w-(--reka-select-trigger-width) bg-default shadow-lg rounded-md ring ring-default overflow-hidden data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] origin-(--reka-select-content-transform-origin) pointer-events-auto flex flex-col', - viewport: 'relative divide-y divide-default scroll-py-1 overflow-y-auto flex-1', + viewport: 'relative divide-y divide-default scroll-py-1 overflow-y-auto flex-1 max-h-60', group: 'p-1 isolate', empty: 'py-2 text-center text-sm text-muted', label: 'font-semibold text-highlighted',