From 27c26b03ee1ac7428bc6db01a8442110ab65fa41 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Sat, 9 Aug 2025 14:31:49 +0800 Subject: [PATCH 1/2] fix: add scrollable support to PopoverContent to prevent overflow --- src/renderer/src/components/NewThread.vue | 2 +- src/renderer/src/components/TitleView.vue | 2 +- .../src/components/ui/popover/PopoverContent.vue | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/renderer/src/components/NewThread.vue b/src/renderer/src/components/NewThread.vue index 5121074a8..8bd07cb85 100644 --- a/src/renderer/src/components/NewThread.vue +++ b/src/renderer/src/components/NewThread.vue @@ -78,7 +78,7 @@ - + - + (), + defineProps(), { align: 'center', - sideOffset: 4 + sideOffset: 4, + enableScrollable: false } ) const emits = defineEmits() const delegatedProps = computed(() => { - const { class: _, ...delegated } = props + const { class: _, enableScrollable: __, ...delegated } = props return delegated }) @@ -34,11 +38,15 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) :class=" cn( 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + props.enableScrollable && 'max-h-96 overflow-hidden', props.class ) " > - +
+ +
+
From 45b16610a452a7bbbce7c55d70a531d5ee913cd9 Mon Sep 17 00:00:00 2001 From: yyhhyyyyyy Date: Mon, 11 Aug 2025 10:13:17 +0800 Subject: [PATCH 2/2] refactor: extract scrollable popover functionality from shadcn ui components --- src/renderer/src/components/NewThread.vue | 39 ++++++++++-------- .../src/components/ScrollablePopover.vue | 34 +++++++++++++++ src/renderer/src/components/TitleView.vue | 41 +++++++++---------- .../components/ui/popover/PopoverContent.vue | 12 ++---- 4 files changed, 79 insertions(+), 47 deletions(-) create mode 100644 src/renderer/src/components/ScrollablePopover.vue diff --git a/src/renderer/src/components/NewThread.vue b/src/renderer/src/components/NewThread.vue index 8bd07cb85..c1e55dab5 100644 --- a/src/renderer/src/components/NewThread.vue +++ b/src/renderer/src/components/NewThread.vue @@ -64,8 +64,14 @@ />
- - + + + + @@ -104,6 +108,7 @@ import { useI18n } from 'vue-i18n' import ChatInput from './ChatInput.vue' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import ScrollablePopover from './ScrollablePopover.vue' import { Button } from '@/components/ui/button' import ModelIcon from './icons/ModelIcon.vue' import { Badge } from '@/components/ui/badge' diff --git a/src/renderer/src/components/ScrollablePopover.vue b/src/renderer/src/components/ScrollablePopover.vue new file mode 100644 index 000000000..7afa43c45 --- /dev/null +++ b/src/renderer/src/components/ScrollablePopover.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/renderer/src/components/TitleView.vue b/src/renderer/src/components/TitleView.vue index 1a6f726fc..7618af8b0 100644 --- a/src/renderer/src/components/TitleView.vue +++ b/src/renderer/src/components/TitleView.vue @@ -43,30 +43,28 @@
- - + + + +
@@ -77,6 +75,7 @@ import { Icon } from '@iconify/vue' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import ScrollablePopover from './ScrollablePopover.vue' import ChatConfig from './ChatConfig.vue' import ModelSelect from './ModelSelect.vue' import ModelIcon from './icons/ModelIcon.vue' diff --git a/src/renderer/src/components/ui/popover/PopoverContent.vue b/src/renderer/src/components/ui/popover/PopoverContent.vue index e0d99fa72..6744b583b 100644 --- a/src/renderer/src/components/ui/popover/PopoverContent.vue +++ b/src/renderer/src/components/ui/popover/PopoverContent.vue @@ -12,18 +12,16 @@ defineOptions({ const props = withDefaults( defineProps(), { align: 'center', - sideOffset: 4, - enableScrollable: false + sideOffset: 4 } ) const emits = defineEmits() const delegatedProps = computed(() => { - const { class: _, enableScrollable: __, ...delegated } = props + const { class: _, ...delegated } = props return delegated }) @@ -38,15 +36,11 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits) :class=" cn( 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', - props.enableScrollable && 'max-h-96 overflow-hidden', props.class ) " > -
- -
- +