From c4a922894f437903f3c8cc22829129d4763f8c5a Mon Sep 17 00:00:00 2001 From: Christoph Brandau Date: Tue, 4 Aug 2026 18:41:19 +0200 Subject: [PATCH] style(app): update styles for file history dialog --- src/app.css | 366 ++++++++++++++++------------------------------------ 1 file changed, 113 insertions(+), 253 deletions(-) diff --git a/src/app.css b/src/app.css index 1e191e1..a419a10 100644 --- a/src/app.css +++ b/src/app.css @@ -1517,20 +1517,15 @@ .history-aside { position: relative; display: grid; - grid-template-columns: minmax(0, 1fr) 8px minmax(240px, var(--file-history-width, 300px)); + grid-template-columns: minmax(0, 1fr); min-width: 0; min-height: 0; column-gap: 0; row-gap: 8px; } - .history-aside.file-history-collapsed { - grid-template-columns: minmax(0, 1fr) 0 42px; - } - .left-sidebar-resize-handle, - .history-resize-handle, - .file-history-resize-handle { + .history-resize-handle { position: relative; z-index: 10; display: flex; @@ -1541,8 +1536,7 @@ touch-action: none; } .left-sidebar-resize-handle::before, - .history-resize-handle::before, - .file-history-resize-handle::before { + .history-resize-handle::before { content: ""; width: 3px; height: 40px; @@ -1553,26 +1547,16 @@ .left-sidebar-resize-handle:hover::before, .left-sidebar-resize-handle.resizing::before, .history-resize-handle:hover::before, - .history-resize-handle.resizing::before, - .file-history-resize-handle:hover::before, - .file-history-resize-handle.resizing::before { + .history-resize-handle.resizing::before { background: var(--color-accent); box-shadow: 0 0 14px rgba(65,209,255,0.3); } .left-sidebar-resize-handle:focus-visible, - .history-resize-handle:focus-visible, - .file-history-resize-handle:focus-visible { + .history-resize-handle:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } - .history-aside.file-history-collapsed .file-history-resize-handle { - pointer-events: none; - } - .history-aside.file-history-collapsed .file-history-resize-handle::before { - display: none; - } - .left-sidebar { display: grid; grid-template-rows: minmax(180px, var(--branch-panel-height, 260px)) 14px minmax(150px, var(--stash-panel-height, 190px)) 14px minmax(220px, 1fr); @@ -2635,225 +2619,6 @@ background: rgba(65,209,255,0.08); color: var(--color-ink); } - .file-history-panel.collapsed { - display: grid; - grid-template-rows: 1fr; - overflow: hidden; - } - .file-history-rail-toggle { - display: grid; - grid-template-rows: auto minmax(0, 1fr) auto; - justify-items: center; - gap: 8px; - width: 100%; - height: 100%; - min-width: 0; - min-height: 0; - padding: 12px 0; - border: 0; - border-radius: 0; - color: var(--color-ink-dim); - background: linear-gradient(180deg, rgba(100,108,255,0.12), rgba(65,209,255,0.04)); - } - .file-history-rail-toggle:hover:not(:disabled) { - color: var(--color-ink); - background: linear-gradient(180deg, rgba(100,108,255,0.18), rgba(65,209,255,0.08)); - } - .file-history-rail-toggle span { - writing-mode: vertical-rl; - text-orientation: mixed; - overflow: hidden; - color: currentColor; - font-size: 11px; - font-weight: 800; - letter-spacing: 0.04em; - text-transform: uppercase; - white-space: nowrap; - } - .file-history-rail-toggle small { - display: inline-grid; - place-items: center; - min-width: 22px; - min-height: 22px; - border-radius: 999px; - color: var(--color-ink); - background: rgba(94,110,156,0.18); - font-size: 11px; - font-weight: 800; - } - .file-history-head { align-items: flex-start; } - .file-history-heading { min-width: 0; flex: 1 1 auto; overflow: hidden; } - .file-history-head-actions { - display: flex; - align-items: center; - flex: 0 0 auto; - gap: 6px; - } - .file-history-toggle { - width: 26px; - min-width: 26px; - min-height: 26px; - padding: 0; - border-color: rgba(65,209,255,0.2); - border-radius: 7px; - color: var(--color-ink-dim); - background: rgba(65,209,255,0.06); - } - .file-history-toggle:hover:not(:disabled) { - border-color: rgba(65,209,255,0.45); - color: #ffffff; - background: rgba(65,209,255,0.13); - } - .section-head .file-history-name { - display: -webkit-box; - max-height: 2.4em; - margin: 2px 0 0; - overflow: hidden; - color: var(--color-ink); - font-size: 14px; - font-weight: 700; - line-height: 1.2; - overflow-wrap: anywhere; - word-break: break-word; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - } - .file-history-count { flex: 0 0 auto; margin-top: 2px; } - .file-history-row { grid-template-columns: minmax(0, 1fr); min-width: 0; overflow: hidden; } - .file-history-row .commit-line { overflow: hidden; } - .file-history-row .commit-line strong { - display: -webkit-box; - white-space: normal; - overflow-wrap: anywhere; - word-break: break-word; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - } - .file-history-actions { display: grid; grid-template-columns: minmax(0, 1fr); width: 100%; align-items: center; gap: 6px; } - .file-history-actions .commit-action-buttons { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); width: 100%; justify-content: stretch; } - .file-history-actions .commit-action-buttons button { min-width: 0; justify-content: center; padding-inline: 6px; } - - /* --- File history loading (scoped, non-blocking) --- */ - - .file-history-loading { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 10px; - min-height: 156px; - padding: 22px; - overflow: hidden; - background: - radial-gradient(circle at center 42%, rgba(111, 140, 255, 0.1), transparent 52%), - linear-gradient(180deg, rgba(15, 18, 31, 0.55), transparent); - } - - .file-history-loading-mark { - position: relative; - display: grid; - place-items: center; - width: 86px; - height: 86px; - isolation: isolate; - } - - .file-history-loading-halo { - position: absolute; - inset: 10px; - border: 1px solid rgba(111, 140, 255, 0.22); - border-radius: 18px; - transform: rotate(45deg); - animation: fhl-halo-breathe 2.4s ease-in-out infinite; - } - - .file-history-loading-traces { - position: absolute; - inset: -12px; - width: 110px; - height: 110px; - overflow: visible; - } - - .file-history-loading-traces .fhl-trace { - fill: none; - stroke-width: 2.5; - stroke-linecap: round; - stroke-dasharray: 92; - stroke-dashoffset: 92; - filter: drop-shadow(0 0 6px rgba(77, 182, 214, 0.3)); - animation: fhl-trace-draw 2.4s ease-in-out infinite; - } - .file-history-loading-traces .fhl-trace-main { - stroke: #6f8cff; - } - .file-history-loading-traces .fhl-trace-branch { - stroke: #4db6d6; - animation-delay: 0.28s; - } - - .file-history-loading-icon { - position: relative; - z-index: 1; - width: 64px; - height: 64px; - object-fit: contain; - filter: - drop-shadow(0 10px 14px rgba(0, 0, 0, 0.45)) - drop-shadow(0 0 12px rgba(77, 182, 214, 0.2)); - animation: fhl-icon-float 2.4s ease-in-out infinite; - } - - .file-history-loading-label { - color: var(--color-ink-faint); - font-size: 12.5px; - font-weight: 800; - } - - .file-history-loading-bar { - position: relative; - width: 118px; - height: 3px; - overflow: hidden; - border-radius: 999px; - background: rgba(111, 140, 255, 0.14); - } - .file-history-loading-bar span { - position: absolute; - inset: 0; - width: 46%; - border-radius: inherit; - background: linear-gradient(90deg, transparent, #6f8cff 42%, #4db6d6 74%, transparent); - box-shadow: 0 0 12px rgba(77, 182, 214, 0.24); - animation: fhl-bar-slide 1.35s ease-in-out infinite; - } - - @keyframes fhl-halo-breathe { - 0%, 100% { opacity: 0.35; transform: rotate(45deg) scale(0.94); } - 50% { opacity: 0.8; transform: rotate(45deg) scale(1.04); } - } - @keyframes fhl-icon-float { - 0%, 100% { transform: translateY(0) scale(1); } - 50% { transform: translateY(-3px) scale(1.02); } - } - @keyframes fhl-trace-draw { - 0% { stroke-dashoffset: 92; opacity: 0; } - 36% { opacity: 1; } - 64%, 100% { stroke-dashoffset: 0; opacity: 0.72; } - } - @keyframes fhl-bar-slide { - 0% { transform: translateX(-120%); } - 100% { transform: translateX(320%); } - } - - @media (prefers-reduced-motion: reduce) { - .file-history-loading-halo, - .file-history-loading-traces .fhl-trace, - .file-history-loading-icon, - .file-history-loading-bar span { animation: none; } - .file-history-loading-traces .fhl-trace { stroke-dashoffset: 0; opacity: 0.72; } - } - /* --- Git graph --- */ .graph-list { @@ -3116,6 +2881,100 @@ box-shadow: var(--app-dialog-shadow); overflow: hidden; } + .file-history-dialog-backdrop { z-index: 70; } + .file-history-dialog { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + width: min(780px, calc(100vw - 32px)); + height: min(720px, calc(100vh - 32px)); + border: 1px solid var(--color-border); + border-radius: 12px; + outline: 0; + background: var(--app-dialog-bg); + box-shadow: var(--app-dialog-shadow); + overflow: hidden; + } + .file-history-dialog-header { + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: 11px; + min-height: 72px; + padding: 12px 14px; + border-bottom: 1px solid var(--color-border); + background: var(--color-surface-dim); + } + .file-history-dialog-icon { + display: grid; + place-items: center; + width: 38px; + height: 38px; + border: 1px solid color-mix(in srgb, var(--color-primary) 24%, var(--color-border)); + border-radius: 9px; + color: var(--color-primary); + background: color-mix(in srgb, var(--color-primary) 9%, var(--color-surface-solid)); + } + .file-history-dialog-heading { display: grid; min-width: 0; gap: 2px; } + .file-history-dialog-heading h2 { + margin: 0; + overflow: hidden; + color: var(--color-ink); + font-size: 15px; + font-weight: 750; + line-height: 1.25; + text-overflow: ellipsis; + white-space: nowrap; + } + .file-history-dialog-path { + overflow: hidden; + color: var(--color-ink-faint); + font: 10.5px/1.35 var(--font-mono); + text-overflow: ellipsis; + white-space: nowrap; + } + .file-history-dialog-body { min-height: 0; overflow: hidden; background: var(--color-surface-solid); } + .file-history-dialog-list { height: 100%; padding: 6px; overflow: auto; } + .file-history-dialog-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto; + align-items: center; + gap: 12px; + min-height: 66px; + padding: 9px 10px; + border-bottom: 1px solid var(--color-border-subtle); + } + .file-history-dialog-row:last-child { border-bottom: 0; } + .file-history-dialog-row:hover { background: var(--color-surface-hover); } + .file-history-dialog-commit { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 9px; min-width: 0; } + .file-history-dialog-commit > div { display: grid; min-width: 0; gap: 4px; } + .file-history-dialog-commit strong { + overflow: hidden; + color: var(--color-ink); + font-size: 12.5px; + text-overflow: ellipsis; + white-space: nowrap; + } + .file-history-dialog-commit span { overflow: hidden; color: var(--color-ink-faint); font-size: 10.5px; text-overflow: ellipsis; white-space: nowrap; } + .file-history-dialog-commit code { color: var(--color-primary); font-family: var(--font-mono); } + .file-history-dialog-row time { color: var(--color-ink-faint); font-size: 10.5px; white-space: nowrap; } + .file-history-dialog-actions { display: flex; align-items: center; gap: 5px; } + .file-history-dialog-actions button { min-height: 28px; white-space: nowrap; } + .file-history-dialog-state { + display: grid; + place-items: center; + align-content: center; + gap: 7px; + height: 100%; + min-height: 220px; + padding: 28px; + color: var(--color-ink-faint); + text-align: center; + } + .file-history-dialog-state svg { color: var(--color-primary); } + .file-history-dialog-state strong { color: var(--color-ink); font-size: 13px; } + .file-history-dialog-state span { max-width: 520px; font-size: 11.5px; line-height: 1.5; overflow-wrap: anywhere; } + .file-history-dialog-state.error svg, + .file-history-dialog-state.error strong { color: var(--color-danger); } .compare-dialog { width: min(1560px, calc(100vw - 32px)); height: min(940px, calc(100vh - 32px)); @@ -5697,12 +5556,10 @@ input:focus, textarea:focus, select:focus { box-shadow: 0 0 0 3px color-mix(in s .left-sidebar-resize-handle, .history-resize-handle, -.file-history-resize-handle, .panel-resize-handle, .left-panel-resize-handle { background: var(--color-border-subtle); } .left-sidebar-resize-handle::before, -.history-resize-handle::before, -.file-history-resize-handle::before { width: 1px; height: 48px; background: var(--color-border); } +.history-resize-handle::before { width: 1px; height: 48px; background: var(--color-border); } .panel-resize-handle::before { width: 44px; height: 2px; } .status-toolbar { @@ -5768,7 +5625,7 @@ input:focus, textarea:focus, select:focus { box-shadow: 0 0 0 3px color-mix(in s .explorer-row .status-badge { min-width: 18px; overflow: hidden; color: #d9891b; background: transparent; text-indent: -999px; } .explorer-row .status-badge::after { content: "M"; float: right; text-indent: 0; } -.history-panel, .file-history-panel { min-height: 0; } +.history-panel { min-height: 0; } .graph-list { background: var(--color-surface-solid); } .graph-gutter { background: var(--color-surface-dim); } .commit-body { @@ -5784,8 +5641,6 @@ input:focus, textarea:focus, select:focus { box-shadow: 0 0 0 3px color-mix(in s } .commit-avatar { border-radius: 50%; } .commit-kind, .commit-branch-chip, .ref-chip { border-radius: 4px !important; } -.file-history-row { margin: 0; border: 0; border-bottom: 1px solid var(--color-border-subtle); border-radius: 0; background: transparent; } - .workspace-statusbar { display: flex; align-items: center; @@ -6291,13 +6146,11 @@ input:focus, textarea:focus, select:focus { box-shadow: 0 0 0 3px color-mix(in s .top-section { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) 14px var(--commit-panel-height, 190px); } } -/* Compact: stack history panels vertically, narrow sidebars */ +/* Compact workspace with narrow sidebars */ @media (max-width: 960px) { .workspace { grid-template-columns: 180px 8px minmax(0, 1fr) 0 300px; row-gap: 6px; } - .history-aside { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1.3fr) minmax(0, 0.7fr); row-gap: 6px; } - .history-aside.file-history-collapsed { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) 42px; } - .history-resize-handle, - .file-history-resize-handle { display: none; } + .history-aside { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr); row-gap: 0; } + .history-resize-handle { display: none; } .shell-body { gap: 6px; } .left-sidebar { grid-template-rows: minmax(180px, var(--branch-panel-height, 230px)) 14px minmax(150px, var(--stash-panel-height, 170px)) 14px minmax(220px, 1fr); @@ -6344,8 +6197,15 @@ input:focus, textarea:focus, select:focus { box-shadow: 0 0 0 3px color-mix(in s .tb-btn { width: 34px; } .workspace { grid-template-columns: 1fr; gap: 6px; } .left-sidebar-resize-handle { display: none; } - .history-aside { grid-template-columns: 1fr; grid-template-rows: minmax(200px, 1fr) minmax(150px, 0.5fr); min-height: 380px; } - .history-aside.file-history-collapsed { grid-template-rows: minmax(200px, 1fr) 42px; } + .history-aside { grid-template-columns: 1fr; grid-template-rows: minmax(200px, 1fr); min-height: 240px; } + .file-history-dialog-backdrop { padding: 8px; } + .file-history-dialog { width: 100%; height: 100%; } + .file-history-dialog-header { min-height: 64px; padding: 9px 10px; } + .file-history-dialog-icon { width: 34px; height: 34px; } + .file-history-dialog-row { grid-template-columns: minmax(0, 1fr) auto; gap: 7px; } + .file-history-dialog-row time { display: none; } + .file-history-dialog-actions { display: grid; } + .file-history-dialog-actions button { width: 32px; min-width: 32px; padding: 0; overflow: hidden; color: var(--color-ink-muted); font-size: 0; gap: 0; } .left-sidebar { grid-template-rows: minmax(180px, var(--branch-panel-height, 240px)) 14px minmax(150px, var(--stash-panel-height, 180px)) 14px minmax(220px, 1fr); min-height: 560px;