mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-25 11:20:07 +08:00
fix(ui): remove redundant scrollbar in side-by-side view & fix message menubar overflow (#10543)
* fix(ui): remove redundant scrollbar in side-by-side view Changed GridContainer from styled(Scrollbar) to styled.div to eliminate redundant horizontal scrollbar in multi-model horizontal layout mode. The Scrollbar component is designed for vertical scrolling and conflicts with horizontal layouts. Fixes #10520 * fix(ui): restore vertical scrollbar for grid mode while preserving horizontal fix Optimal solution: Use Scrollbar component as base to preserve auto-hide behavior for vertical modes (grid, vertical, fold) while overriding its overflow-y behavior for horizontal mode only. This approach: - Preserves the June 2025 UX optimization (auto-hide scrollbars) - Fixes horizontal scrollbar issue from #10520 - Restores vertical scrolling for grid mode - Maintains auto-hide behavior for all vertical scrolling modes - Minimal change with no code duplication The Scrollbar component provides scrollbar thumb auto-hide after 1.5s, which enhances UX for vertical scrolling. By using CSS overrides only for horizontal mode, we get the best of both worlds. * chore: fix import sorting in MessageGroup.tsx Unrelated to PR scope - fixing to unblock CI. Auto-fixed via eslint --fix (moved Scrollbar import to correct position). Also updated yarn.lock to resolve dependency sync. * fix(ui): add explicit overflow declarations for all grid modes Previous fix relied on CSS inheritance from Scrollbar base component, but display: grid interferes with overflow property inheritance. This iteration adds explicit overflow-y: auto and overflow-x: hidden to grid, fold, vertical, and multi-select modes to ensure vertical scrolling works reliably across all layouts. - horizontal mode: overflow-y visible, overflow-x auto (unchanged) - grid/fold/vertical modes: explicit overflow-y auto, overflow-x hidden - multi-select mode: explicit overflow-y auto, overflow-x hidden Fixes vertical scrollbar missing in grid mode reported by @EurFelux * fix(Messages): adjust overflow behavior in message groups Fix scrollbar issues by hiding vertical overflow in horizontal layout and simplifying overflow handling in grid layout * feat(HorizontalScrollContainer): add classNames prop for container and content styling allow custom styling of container and content via classNames prop --------- Co-authored-by: icarus <eurfelux@gmail.com>
This commit is contained in:
parent
a9843b4128
commit
cd881ceb34
@ -1,3 +1,4 @@
|
||||
import { cn } from '@heroui/react'
|
||||
import Scrollbar from '@renderer/components/Scrollbar'
|
||||
import { ChevronRight } from 'lucide-react'
|
||||
import { useEffect, useRef, useState } from 'react'
|
||||
@ -17,6 +18,10 @@ export interface HorizontalScrollContainerProps {
|
||||
dependencies?: readonly unknown[]
|
||||
scrollDistance?: number
|
||||
className?: string
|
||||
classNames?: {
|
||||
container?: string
|
||||
content?: string
|
||||
}
|
||||
gap?: string
|
||||
expandable?: boolean
|
||||
}
|
||||
@ -26,6 +31,7 @@ const HorizontalScrollContainer: React.FC<HorizontalScrollContainerProps> = ({
|
||||
dependencies = [],
|
||||
scrollDistance = 200,
|
||||
className,
|
||||
classNames,
|
||||
gap = '8px',
|
||||
expandable = false
|
||||
}) => {
|
||||
@ -95,11 +101,16 @@ const HorizontalScrollContainer: React.FC<HorizontalScrollContainerProps> = ({
|
||||
|
||||
return (
|
||||
<Container
|
||||
className={className}
|
||||
className={cn(className, classNames?.container)}
|
||||
$expandable={expandable}
|
||||
$disableHoverButton={isScrolledToEnd}
|
||||
onClick={expandable ? handleContainerClick : undefined}>
|
||||
<ScrollContent ref={scrollRef} $gap={gap} $isExpanded={isExpanded} $expandable={expandable}>
|
||||
<ScrollContent
|
||||
ref={scrollRef}
|
||||
$gap={gap}
|
||||
$isExpanded={isExpanded}
|
||||
$expandable={expandable}
|
||||
className={cn(classNames?.content)}>
|
||||
{children}
|
||||
</ScrollContent>
|
||||
{canScroll && !isExpanded && !isScrolledToEnd && (
|
||||
|
||||
@ -1,4 +1,6 @@
|
||||
import { cn } from '@heroui/react'
|
||||
import { loggerService } from '@logger'
|
||||
import HorizontalScrollContainer from '@renderer/components/HorizontalScrollContainer'
|
||||
import Scrollbar from '@renderer/components/Scrollbar'
|
||||
import { useMessageEditing } from '@renderer/context/MessageEditingContext'
|
||||
import { useAssistant } from '@renderer/hooks/useAssistant'
|
||||
@ -225,20 +227,28 @@ const MessageItem: FC<Props> = ({
|
||||
</MessageErrorBoundary>
|
||||
</MessageContentContainer>
|
||||
{showMenubar && (
|
||||
<MessageFooter className="MessageFooter" $isLastMessage={isLastMessage} $messageStyle={messageStyle}>
|
||||
<MessageMenubar
|
||||
message={message}
|
||||
assistant={assistant}
|
||||
model={model}
|
||||
index={index}
|
||||
topic={topic}
|
||||
isLastMessage={isLastMessage}
|
||||
isAssistantMessage={isAssistantMessage}
|
||||
isGrouped={isGrouped}
|
||||
messageContainerRef={messageContainerRef as React.RefObject<HTMLDivElement>}
|
||||
setModel={setModel}
|
||||
onUpdateUseful={onUpdateUseful}
|
||||
/>
|
||||
<MessageFooter className="MessageFooter">
|
||||
<HorizontalScrollContainer
|
||||
classNames={{
|
||||
content: cn(
|
||||
'items-center',
|
||||
isLastMessage && messageStyle === 'plain' ? 'flex-row-reverse' : 'flex-row'
|
||||
)
|
||||
}}>
|
||||
<MessageMenubar
|
||||
message={message}
|
||||
assistant={assistant}
|
||||
model={model}
|
||||
index={index}
|
||||
topic={topic}
|
||||
isLastMessage={isLastMessage}
|
||||
isAssistantMessage={isAssistantMessage}
|
||||
isGrouped={isGrouped}
|
||||
messageContainerRef={messageContainerRef as React.RefObject<HTMLDivElement>}
|
||||
setModel={setModel}
|
||||
onUpdateUseful={onUpdateUseful}
|
||||
/>
|
||||
</HorizontalScrollContainer>
|
||||
</MessageFooter>
|
||||
)}
|
||||
</>
|
||||
@ -282,10 +292,8 @@ const MessageContentContainer = styled(Scrollbar)`
|
||||
overflow-y: auto;
|
||||
`
|
||||
|
||||
const MessageFooter = styled.div<{ $isLastMessage: boolean; $messageStyle: 'plain' | 'bubble' }>`
|
||||
const MessageFooter = styled.div`
|
||||
display: flex;
|
||||
flex-direction: ${({ $isLastMessage, $messageStyle }) =>
|
||||
$isLastMessage && $messageStyle === 'plain' ? 'row-reverse' : 'row'};
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 10px;
|
||||
|
||||
@ -337,17 +337,30 @@ const GroupContainer = styled.div`
|
||||
const GridContainer = styled(Scrollbar)<{ $count: number; $gridColumns: number }>`
|
||||
width: 100%;
|
||||
display: grid;
|
||||
overflow-y: visible;
|
||||
gap: 16px;
|
||||
|
||||
&.horizontal {
|
||||
padding-bottom: 4px;
|
||||
grid-template-columns: repeat(${({ $count }) => $count}, minmax(420px, 1fr));
|
||||
overflow-y: hidden;
|
||||
overflow-x: auto;
|
||||
&::-webkit-scrollbar {
|
||||
height: 6px;
|
||||
}
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: var(--color-scrollbar-thumb);
|
||||
border-radius: var(--scrollbar-thumb-radius);
|
||||
}
|
||||
&::-webkit-scrollbar-thumb:hover {
|
||||
background: var(--color-scrollbar-thumb-hover);
|
||||
}
|
||||
}
|
||||
&.fold,
|
||||
&.vertical {
|
||||
grid-template-columns: repeat(1, minmax(0, 1fr));
|
||||
gap: 8px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
&.grid {
|
||||
grid-template-columns: repeat(
|
||||
@ -355,11 +368,15 @@ const GridContainer = styled(Scrollbar)<{ $count: number; $gridColumns: number }
|
||||
minmax(0, 1fr)
|
||||
);
|
||||
grid-template-rows: auto;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
&.multi-select-mode {
|
||||
grid-template-columns: repeat(1, minmax(0, 1fr));
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
.grid {
|
||||
height: auto;
|
||||
}
|
||||
@ -385,7 +402,7 @@ interface MessageWrapperProps {
|
||||
const MessageWrapper = styled.div<MessageWrapperProps>`
|
||||
&.horizontal {
|
||||
padding: 1px;
|
||||
overflow-y: auto;
|
||||
/* overflow-y: auto; */
|
||||
.message {
|
||||
height: 100%;
|
||||
border: 0.5px solid var(--color-border);
|
||||
@ -405,8 +422,9 @@ const MessageWrapper = styled.div<MessageWrapperProps>`
|
||||
}
|
||||
}
|
||||
&.grid {
|
||||
display: block;
|
||||
height: 300px;
|
||||
overflow-y: hidden;
|
||||
overflow: hidden;
|
||||
border: 0.5px solid var(--color-border);
|
||||
border-radius: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user