diff --git a/src/App.svelte b/src/App.svelte index 435115a..94d1185 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -3,10 +3,11 @@ import { invoke } from "@tauri-apps/api/core"; import { open as openDialog } from "@tauri-apps/plugin-dialog"; import { check, type DownloadEvent, type Update } from "@tauri-apps/plugin-updater"; - import { AlertCircle, BookOpen, Cherry, Download, FolderOpen, GitBranch, GitMerge, LoaderCircle, Plus, Search, Star, X } from "@lucide/svelte"; + import { AlertCircle, Cherry, Download, FolderOpen, GitBranch, GitMerge, LoaderCircle, Plus, Search, Star, X } from "@lucide/svelte"; import TitleBar from "./lib/TitleBar.svelte"; import RepoToolbar from "./lib/RepoToolbar.svelte"; + import RepoTabs from "./lib/RepoTabs.svelte"; import AiSettingsDialog from "./lib/components/AiSettingsDialog.svelte"; import AnalyticsNoticeDialog from "./lib/components/AnalyticsNoticeDialog.svelte"; import AppSettingsDialog from "./lib/components/AppSettingsDialog.svelte"; @@ -3537,65 +3538,18 @@
-
- - -
- {#each repoTabs as repo (repo.path)} - - {/each} -
- - -
+ activeView === "repository" && sameRepoPath(activeRepoPath, path)} + onSelect={selectRepoTab} + onClose={closeRepoTab} + onContextMenu={openRepoTabContextMenu} + onAdd={chooseRepositoryFolder} + /> diff --git a/src/app.css b/src/app.css index a396146..385d6f9 100644 --- a/src/app.css +++ b/src/app.css @@ -896,10 +896,10 @@ display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: stretch; - min-height: 40px; + min-height: 44px; border: 1px solid var(--color-border-subtle); border-radius: 10px; - background: rgba(16, 17, 29, 0.9); + background: rgba(13, 15, 25, 0.92); overflow: hidden; } @@ -907,76 +907,89 @@ display: flex; align-items: stretch; min-width: 0; + border-left: 1px solid var(--color-border-subtle); overflow-x: auto; overflow-y: hidden; + scrollbar-width: thin; } .repo-tab-wrap { display: flex; align-items: stretch; - min-width: 0; + flex: 0 1 230px; + min-width: 150px; + max-width: 260px; + position: relative; border-right: 1px solid var(--color-border-subtle); - background: rgba(255,255,255,0.015); + background: rgba(255,255,255,0.012); + transition: background 120ms ease; } + .repo-tab-wrap:hover { background: rgba(255,255,255,0.035); } .repo-tab-wrap.active { - background: rgba(90, 140, 248, 0.16); - box-shadow: inset 0 -2px 0 var(--color-primary); + background: linear-gradient(180deg, rgba(90,140,248,0.14), rgba(23,29,43,0.96)); + box-shadow: inset 0 -3px 0 var(--color-primary); } .repo-tab { - min-height: 38px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 8px; + flex: 1 1 auto; + min-height: 42px; min-width: 0; - max-width: 250px; - padding: 0 10px; + max-width: none; + padding: 0 8px 0 13px; border: 0; - border-right: 1px solid var(--color-border-subtle); border-radius: 0; background: transparent; color: var(--color-ink-muted); font-size: 12px; - font-weight: 700; + font-weight: 720; + text-align: left; } + .repo-tab > svg { flex: 0 0 auto; color: var(--color-ink-faint); } .repo-tab.management { - max-width: none; - min-width: 190px; + min-width: 184px; + border: 0; + box-shadow: inset 0 -3px 0 transparent; } - .repo-tab.active, + .repo-tab.management.active { + color: var(--color-ink); + background: linear-gradient(180deg, rgba(90,140,248,0.14), rgba(23,29,43,0.96)); + box-shadow: inset 0 -3px 0 var(--color-primary); + } + .repo-tab.management:hover:not(:disabled) { background: var(--color-surface-hover); } .repo-tab-wrap.active .repo-tab { color: var(--color-ink); } + .repo-tab-wrap.active .repo-tab > svg, + .repo-tab.management.active > svg { color: var(--color-accent); } .repo-tab span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } - .repo-tab strong { - flex: 0 0 auto; - max-width: 90px; - overflow: hidden; - padding: 2px 6px; - border-radius: 4px; - background: rgba(94, 110, 156, 0.18); - color: var(--color-ink-dim); - font-size: 10.5px; - font-family: var(--font-mono); - text-overflow: ellipsis; - white-space: nowrap; - } - .repo-tab-close, .repo-tab-add { - min-height: 38px; - min-width: 38px; + min-height: 42px; + min-width: 36px; padding: 0; border: 0; border-radius: 0; background: transparent; color: var(--color-ink-faint); } + .repo-tab-close { opacity: 0.58; transition: opacity 120ms ease, color 120ms ease, background 120ms ease; } + .repo-tab-wrap:hover .repo-tab-close, + .repo-tab-wrap.active .repo-tab-close { opacity: 1; } + .repo-tab-close:hover:not(:disabled) { color: var(--color-ink); background: var(--color-surface-hover); } .repo-tab-add { + min-width: 44px; border-left: 1px solid var(--color-border-subtle); } + .repo-tab-add:hover:not(:disabled) { color: var(--color-accent); background: var(--color-surface-hover); } .repo-management { display: grid; @@ -4958,15 +4971,24 @@ :root[data-theme="light"] .repo-tabbar, :root[data-theme="light"] .repo-management-tools { - background: rgba(255,255,255,0.78); + background: rgba(247,249,252,0.96); } :root[data-theme="light"] .repo-tab-wrap { - background: rgba(244,247,252,0.72); + background: rgba(255,255,255,0.5); } :root[data-theme="light"] .repo-tab-wrap.active { - background: rgba(49,95,214,0.1); + background: #ffffff; +} + +:root[data-theme="light"] .repo-tab-wrap:hover, +:root[data-theme="light"] .repo-tab.management:hover:not(:disabled) { + background: rgba(255,255,255,0.9); +} + +:root[data-theme="light"] .repo-tab.management.active { + background: #ffffff; } :root[data-theme="light"] .repo-row { @@ -5419,9 +5441,10 @@ } .top-section { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) 14px var(--commit-panel-height, 190px); } .repo-form { grid-template-columns: 1fr; } - .repo-tabbar { grid-template-columns: minmax(0, 1fr) auto; } - .repo-tab.management { min-width: 0; } - .repo-tabs-scroll { grid-column: 1 / -1; order: 2; border-top: 1px solid var(--color-border-subtle); } + .repo-tabbar { grid-template-columns: auto minmax(0, 1fr) auto; } + .repo-tab.management { min-width: 44px; width: 44px; padding: 0; justify-content: center; } + .repo-tab.management span { display: none; } + .repo-tabs-scroll { grid-column: auto; order: initial; border-top: 0; } .repo-management-head, .repo-management-tools { align-items: stretch; flex-direction: column; } .repo-management-actions { justify-content: flex-start; } diff --git a/src/lib/RepoTabs.svelte b/src/lib/RepoTabs.svelte new file mode 100644 index 0000000..09c0e61 --- /dev/null +++ b/src/lib/RepoTabs.svelte @@ -0,0 +1,77 @@ + + +
+ + +
+ {#each repoTabs as repo (repo.path)} + + {/each} +
+ + +