refactor: remove scrollbar, add space for app dragging

This commit is contained in:
one 2025-09-03 14:25:47 +08:00
parent eb7a3a1469
commit f6ebeb143e

View File

@ -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`