mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-12 17:09:37 +08:00
refactor: remove scrollbar, add space for app dragging
This commit is contained in:
parent
eb7a3a1469
commit
f6ebeb143e
@ -1,7 +1,6 @@
|
|||||||
import { PlusOutlined } from '@ant-design/icons'
|
import { PlusOutlined } from '@ant-design/icons'
|
||||||
import { TopNavbarOpenedMinappTabs } from '@renderer/components/app/PinnedMinapps'
|
import { TopNavbarOpenedMinappTabs } from '@renderer/components/app/PinnedMinapps'
|
||||||
import { Sortable, useDndReorder } from '@renderer/components/dnd'
|
import { Sortable, useDndReorder } from '@renderer/components/dnd'
|
||||||
import Scrollbar from '@renderer/components/Scrollbar'
|
|
||||||
import { isLinux, isMac, isWin } from '@renderer/config/constant'
|
import { isLinux, isMac, isWin } from '@renderer/config/constant'
|
||||||
import { useTheme } from '@renderer/context/ThemeProvider'
|
import { useTheme } from '@renderer/context/ThemeProvider'
|
||||||
import { useFullscreen } from '@renderer/hooks/useFullscreen'
|
import { useFullscreen } from '@renderer/hooks/useFullscreen'
|
||||||
@ -143,11 +142,11 @@ const TabsContainer: React.FC<TabsContainerProps> = ({ children }) => {
|
|||||||
navigate(tab.path)
|
navigate(tab.path)
|
||||||
}
|
}
|
||||||
|
|
||||||
const filteredTabs = useMemo(() => tabs.filter((tab) => !specialTabs.includes(tab.id)), [tabs])
|
const visibleTabs = useMemo(() => tabs.filter((tab) => !specialTabs.includes(tab.id)), [tabs])
|
||||||
|
|
||||||
const { onSortEnd } = useDndReorder<Tab>({
|
const { onSortEnd } = useDndReorder<Tab>({
|
||||||
originalList: tabs,
|
originalList: tabs,
|
||||||
filteredList: filteredTabs,
|
filteredList: visibleTabs,
|
||||||
onUpdate: (newTabs) => dispatch(setTabs(newTabs)),
|
onUpdate: (newTabs) => dispatch(setTabs(newTabs)),
|
||||||
itemKey: 'id'
|
itemKey: 'id'
|
||||||
})
|
})
|
||||||
@ -156,14 +155,15 @@ const TabsContainer: React.FC<TabsContainerProps> = ({ children }) => {
|
|||||||
<Container>
|
<Container>
|
||||||
<TabsBar $isFullscreen={isFullscreen}>
|
<TabsBar $isFullscreen={isFullscreen}>
|
||||||
<TabsArea>
|
<TabsArea>
|
||||||
<TabsScroll>
|
<SortableWrapper>
|
||||||
<Sortable
|
<Sortable
|
||||||
items={filteredTabs}
|
items={visibleTabs}
|
||||||
itemKey="id"
|
itemKey="id"
|
||||||
layout="list"
|
layout="list"
|
||||||
horizontal
|
horizontal
|
||||||
gap={'6px'}
|
gap={'6px'}
|
||||||
onSortEnd={onSortEnd}
|
onSortEnd={onSortEnd}
|
||||||
|
className="tabs-sortable"
|
||||||
renderItem={(tab) => (
|
renderItem={(tab) => (
|
||||||
<Tab key={tab.id} active={tab.id === activeTabId} onClick={() => handleTabClick(tab)}>
|
<Tab key={tab.id} active={tab.id === activeTabId} onClick={() => handleTabClick(tab)}>
|
||||||
<TabHeader>
|
<TabHeader>
|
||||||
@ -184,7 +184,7 @@ const TabsContainer: React.FC<TabsContainerProps> = ({ children }) => {
|
|||||||
</Tab>
|
</Tab>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</TabsScroll>
|
</SortableWrapper>
|
||||||
<AddTabButton onClick={handleAddTab} className={classNames({ active: activeTabId === 'launchpad' })}>
|
<AddTabButton onClick={handleAddTab} className={classNames({ active: activeTabId === 'launchpad' })}>
|
||||||
<PlusOutlined />
|
<PlusOutlined />
|
||||||
</AddTabButton>
|
</AddTabButton>
|
||||||
@ -246,8 +246,9 @@ const TabsArea = styled.div`
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
overflow: hidden;
|
|
||||||
gap: 6px;
|
gap: 6px;
|
||||||
|
padding-right: 2rem;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
-webkit-app-region: drag;
|
-webkit-app-region: drag;
|
||||||
|
|
||||||
@ -256,24 +257,26 @@ const TabsArea = styled.div`
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
const TabsScroll = styled(Scrollbar)`
|
const SortableWrapper = styled.div`
|
||||||
&::-webkit-scrollbar {
|
overflow: hidden;
|
||||||
display: none;
|
|
||||||
|
.tabs-sortable > * {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-width: 0;
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
const Tab = styled.div<{ active?: boolean }>`
|
const Tab = styled.div<{ active?: boolean; $tabCount?: number }>`
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 4px 10px;
|
padding: 4px 10px;
|
||||||
padding-right: 8px;
|
padding-right: 8px;
|
||||||
background: ${(props) => (props.active ? 'var(--color-list-item)' : 'transparent')};
|
background: ${(props) => (props.active ? 'var(--color-list-item)' : 'transparent')};
|
||||||
|
transition: background 0.2s;
|
||||||
border-radius: var(--list-item-border-radius);
|
border-radius: var(--list-item-border-radius);
|
||||||
user-select: none;
|
user-select: none;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
min-width: 90px;
|
|
||||||
transition: background 0.2s;
|
|
||||||
|
|
||||||
.close-button {
|
.close-button {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
@ -309,10 +312,8 @@ const TabTitle = styled.span`
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-right: 4px;
|
margin-right: 4px;
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
min-width: 0;
|
|
||||||
`
|
`
|
||||||
|
|
||||||
const CloseButton = styled.span`
|
const CloseButton = styled.span`
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user