Skip to content

Commit e31f09e

Browse files
committed
fix(ui): keep context-menu highlight outline intact in virtual lists
1 parent 9a32aeb commit e31f09e

3 files changed

Lines changed: 27 additions & 2 deletions

File tree

src/renderer/components/http/RequestsListItem.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ onClickOutside(itemRef, () => {
411411
}
412412
}
413413
&.is-highlighted {
414-
@apply outline-primary rounded-md outline-2 -outline-offset-2;
414+
@apply outline-primary z-20 rounded-md outline-2 -outline-offset-2;
415415
&.is-focused,
416416
&.is-selected,
417417
&.is-multi-selected {

src/renderer/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { createApp } from 'vue'
22
import VueVirtualScroller from 'vue-virtual-scroller'
33
import App from './App.vue'
44
import { router } from './router'
5-
import './styles.css'
65
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
6+
import './styles.css'
77

88
declare global {
99
interface Window {

src/renderer/styles.css

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,31 @@ body {
211211
opacity: 1;
212212
}
213213

214+
/*
215+
* vue-virtual-scroller задаёт item-wrapper высоту ровно N×item-size с
216+
* overflow: hidden, из-за чего у последнего элемента списка обрезается нижняя
217+
* часть highlight-обводки (outline с -outline-offset при открытии контекстного
218+
* меню). Полностью отключать клиппинг нельзя: scroller паркует осиротевшие
219+
* item-view из пула за пределами контента, и без клиппинга они наслаиваются на
220+
* видимый список при быстром переключении папок. overflow: clip сохраняет
221+
* клиппинг, а небольшой clip-margin даёт запас, чтобы обводка отрисовалась
222+
* целиком.
223+
*/
224+
.vue-recycle-scroller__item-wrapper {
225+
overflow: clip;
226+
overflow-clip-margin: 4px;
227+
}
228+
229+
/*
230+
* item-view создаёт собственный stacking context (will-change: transform),
231+
* поэтому z-index внутреннего элемента не влияет на наложение между соседними
232+
* элементами списка. Поднимаем сам item-view, когда внутри активна
233+
* highlight-обводка, чтобы соседний selected/focused элемент её не перекрывал.
234+
*/
235+
.vue-recycle-scroller__item-view:has(.is-highlighted) {
236+
z-index: 1;
237+
}
238+
214239
@layer base {
215240
* {
216241
@apply border-border outline-ring/50;

0 commit comments

Comments
 (0)