Skip to content

Commit f95abf8

Browse files
committed
fix(InputMenu/Select/SelectMenu): manual viewport to display scrollbars
Resolves #4069
1 parent dcf34a7 commit f95abf8

11 files changed

+497
-3377
lines changed

src/runtime/components/InputMenu.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ export interface InputMenuSlots<
172172

173173
<script setup lang="ts" generic="T extends ArrayOrNested<InputMenuItem>, VK extends GetItemKeys<T> | undefined = undefined, M extends boolean = false">
174174
import { computed, ref, toRef, onMounted, toRaw } from 'vue'
175-
import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxViewport, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, TagsInputRoot, TagsInputItem, TagsInputItemText, TagsInputItemDelete, TagsInputInput, useForwardPropsEmits, useFilter } from 'reka-ui'
175+
import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, TagsInputRoot, TagsInputItem, TagsInputItemText, TagsInputItemDelete, TagsInputInput, useForwardPropsEmits, useFilter } from 'reka-ui'
176176
import { defu } from 'defu'
177177
import { isEqual } from 'ohash/utils'
178178
import { reactivePick, createReusableTemplate } from '@vueuse/core'
@@ -490,7 +490,7 @@ defineExpose({
490490
</slot>
491491
</ComboboxEmpty>
492492

493-
<ComboboxViewport :class="ui.viewport({ class: props.ui?.viewport })">
493+
<div role="presentation" :class="ui.viewport({ class: props.ui?.viewport })">
494494
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'top'" />
495495

496496
<ComboboxGroup v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
@@ -541,7 +541,7 @@ defineExpose({
541541
</ComboboxGroup>
542542

543543
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'bottom'" />
544-
</ComboboxViewport>
544+
</div>
545545

546546
<slot name="content-bottom" />
547547

src/runtime/components/Select.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export interface SelectSlots<
135135

136136
<script setup lang="ts" generic="T extends ArrayOrNested<SelectItem>, VK extends GetItemKeys<T> = 'value', M extends boolean = false">
137137
import { computed, toRef } from 'vue'
138-
import { SelectRoot, SelectArrow, SelectTrigger, SelectPortal, SelectContent, SelectViewport, SelectLabel, SelectGroup, SelectItem, SelectItemIndicator, SelectItemText, SelectSeparator, useForwardPropsEmits } from 'reka-ui'
138+
import { SelectRoot, SelectArrow, SelectTrigger, SelectPortal, SelectContent, SelectLabel, SelectGroup, SelectItem, SelectItemIndicator, SelectItemText, SelectSeparator, useForwardPropsEmits } from 'reka-ui'
139139
import { defu } from 'defu'
140140
import { reactivePick } from '@vueuse/core'
141141
import { useAppConfig } from '#imports'
@@ -270,7 +270,7 @@ function isSelectItem(item: SelectItem): item is SelectItemBase {
270270
<SelectContent :class="ui.content({ class: props.ui?.content })" v-bind="contentProps">
271271
<slot name="content-top" />
272272

273-
<SelectViewport :class="ui.viewport({ class: props.ui?.viewport })">
273+
<div role="presentation" :class="ui.viewport({ class: props.ui?.viewport })">
274274
<SelectGroup v-for="(group, groupIndex) in groups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
275275
<template v-for="(item, index) in group" :key="`group-${groupIndex}-${index}`">
276276
<SelectLabel v-if="isSelectItem(item) && item.type === 'label'" :class="ui.label({ class: [props.ui?.label, item.ui?.label, item.class] })">
@@ -317,7 +317,7 @@ function isSelectItem(item: SelectItem): item is SelectItemBase {
317317
</SelectItem>
318318
</template>
319319
</SelectGroup>
320-
</SelectViewport>
320+
</div>
321321

322322
<slot name="content-bottom" />
323323

src/runtime/components/SelectMenu.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ export interface SelectMenuSlots<
166166

167167
<script setup lang="ts" generic="T extends ArrayOrNested<SelectMenuItem>, VK extends GetItemKeys<T> | undefined = undefined, M extends boolean = false">
168168
import { computed, toRef, toRaw } from 'vue'
169-
import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxViewport, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, FocusScope, useForwardPropsEmits, useFilter } from 'reka-ui'
169+
import { ComboboxRoot, ComboboxArrow, ComboboxAnchor, ComboboxInput, ComboboxTrigger, ComboboxPortal, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxLabel, ComboboxSeparator, ComboboxItem, ComboboxItemIndicator, FocusScope, useForwardPropsEmits, useFilter } from 'reka-ui'
170170
import { defu } from 'defu'
171171
import { reactivePick, createReusableTemplate } from '@vueuse/core'
172172
import { useAppConfig } from '#imports'
@@ -417,7 +417,7 @@ function isSelectItem(item: SelectMenuItem): item is _SelectMenuItem {
417417
</slot>
418418
</ComboboxEmpty>
419419

420-
<ComboboxViewport :class="ui.viewport({ class: props.ui?.viewport })">
420+
<div role="presentation" :class="ui.viewport({ class: props.ui?.viewport })">
421421
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'top'" />
422422

423423
<ComboboxGroup v-for="(group, groupIndex) in filteredGroups" :key="`group-${groupIndex}`" :class="ui.group({ class: props.ui?.group })">
@@ -468,7 +468,7 @@ function isSelectItem(item: SelectMenuItem): item is _SelectMenuItem {
468468
</ComboboxGroup>
469469

470470
<ReuseCreateItemTemplate v-if="createItem && createItemPosition === 'bottom'" />
471-
</ComboboxViewport>
471+
</div>
472472

473473
<slot name="content-bottom" />
474474
</FocusScope>

src/theme/input-menu.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ export default (options: Required<ModuleOptions>) => {
88
base: () => ['rounded-md', options.theme.transitions && 'transition-colors'],
99
trailing: 'group absolute inset-y-0 end-0 flex items-center disabled:cursor-not-allowed disabled:opacity-75',
1010
arrow: 'fill-default',
11-
content: 'max-h-60 w-(--reka-combobox-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-combobox-content-transform-origin) pointer-events-auto',
12-
viewport: 'divide-y divide-default scroll-py-1',
11+
content: 'max-h-60 w-(--reka-combobox-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-combobox-content-transform-origin) pointer-events-auto flex flex-col',
12+
viewport: 'relative divide-y divide-default scroll-py-1 overflow-y-auto flex-1',
1313
group: 'p-1 isolate',
1414
empty: 'py-2 text-center text-sm text-muted',
1515
label: 'font-semibold text-highlighted',

src/theme/select.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export default (options: Required<ModuleOptions>) => {
1111
value: 'truncate pointer-events-none',
1212
placeholder: 'truncate text-dimmed',
1313
arrow: 'fill-default',
14-
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',
15-
viewport: 'divide-y divide-default scroll-py-1',
14+
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',
15+
viewport: 'relative divide-y divide-default scroll-py-1 overflow-y-auto flex-1',
1616
group: 'p-1 isolate',
1717
empty: 'py-2 text-center text-sm text-muted',
1818
label: 'font-semibold text-highlighted',

0 commit comments

Comments
 (0)