Files
GitLite/src/app.css
T
2026-06-27 23:08:19 +02:00

795 lines
28 KiB
CSS

@import "tailwindcss";
@theme {
--color-ink: #202326;
--color-ink-muted: #697681;
--color-ink-faint: #6c7882;
--color-ink-dim: #5f6b75;
--color-ink-quiet: #596670;
--color-surface: #fbfcfd;
--color-surface-alt: #eef1f3;
--color-surface-dim: #f7f9fa;
--color-surface-hover: #f6f8f9;
--color-border: #d2d8de;
--color-border-subtle: #dce1e5;
--color-border-input: #c7ced4;
--color-primary: #256f8f;
--color-primary-dark: #1f5f7b;
--color-accent: #4f7d96;
--color-bar: #1a1f23;
--color-bar-text: #c8d0d6;
--color-bar-muted: #8fa8b8;
--font-mono: "Cascadia Code", "SFMono-Regular", Consolas, monospace;
}
@layer base {
*, *::before, *::after { box-sizing: border-box; }
html, body, #app { width: 100%; height: 100%; margin: 0; }
body {
overflow: hidden;
color: var(--color-ink);
background: var(--color-surface-alt);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
button, input, textarea, select { font: inherit; }
button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
min-height: 32px;
padding: 0 12px;
border: 1px solid var(--color-border-input);
border-radius: 6px;
color: var(--color-ink);
background: #ffffff;
cursor: pointer;
transition: background 140ms ease, border-color 140ms ease, color 140ms ease;
}
button:hover:not(:disabled) { border-color: #8fa0ad; background: var(--color-surface-hover); }
button:disabled { cursor: not-allowed; opacity: 0.55; }
input, textarea {
width: 100%;
border: 1px solid var(--color-border-input);
border-radius: 6px;
color: var(--color-ink);
background: #ffffff;
outline: none;
}
input:focus, textarea:focus {
border-color: #2f7da1;
box-shadow: 0 0 0 3px rgba(47, 125, 161, 0.14);
}
input { height: 34px; padding: 0 11px; }
textarea { resize: vertical; min-height: 132px; padding: 10px 11px; line-height: 1.45; }
}
@layer components {
/* --- Shared utilities --- */
.btn-sm { min-height: 28px; padding: 0 8px; font-size: 12px; }
.btn-primary {
border-color: var(--color-primary);
color: #ffffff;
background: var(--color-primary);
}
.btn-primary:hover:not(:disabled) {
border-color: var(--color-primary-dark);
background: var(--color-primary-dark);
}
.panel {
min-height: 0;
border: 1px solid var(--color-border);
border-radius: 8px;
background: var(--color-surface);
}
.section-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 58px;
padding: 12px;
border-bottom: 1px solid var(--color-border-subtle);
}
.section-head h2 { margin: 1px 0 0; color: var(--color-ink); font-size: 16px; line-height: 1.2; }
.eyebrow {
display: block;
color: var(--color-ink-muted);
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
}
.pill {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 0 8px;
border-radius: 999px;
font-size: 12px;
font-weight: 700;
white-space: nowrap;
}
.pill-count { color: #4f5d66; background: #edf0f2; }
.pill-active { color: #176239; background: #e4f4ea; }
.blank-state {
display: grid;
place-items: center;
min-height: 120px;
padding: 18px;
color: var(--color-ink-faint);
font-size: 13px;
text-align: center;
}
.status-badge {
display: inline-block;
min-width: 74px;
padding: 3px 7px;
border-radius: 999px;
font-size: 11px;
font-weight: 800;
text-align: center;
text-transform: uppercase;
white-space: nowrap;
}
.status-badge.modified { color: #7b4a05; background: #ffe8bb; }
.status-badge.added,
.status-badge.untracked { color: #176239; background: #dff3e7; }
.status-badge.deleted { color: #9b2e29; background: #ffe1df; }
.status-badge.renamed { color: #255b8b; background: #e0effd; }
.status-badge.conflicted { color: #8f2d61; background: #fde2f0; }
.status-badge.unknown,
.status-badge.none { color: #596670; background: #e9edef; }
.quiet { overflow: hidden; color: #7d8891; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
.spin { animation: spin 900ms linear infinite; }
/* --- App shell --- */
.shell { display: flex; flex-direction: column; height: 100%; background: var(--color-surface-alt); }
.shell-body {
display: flex;
flex-direction: column;
flex: 1 1 0;
min-height: 0;
padding: 0 12px 12px;
gap: 10px;
}
/* --- Titlebar --- */
.titlebar {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
height: 38px;
background: var(--color-bar);
color: var(--color-bar-text);
user-select: none;
flex-shrink: 0;
-webkit-app-region: drag;
}
.titlebar-brand {
display: flex;
align-items: center;
gap: 7px;
padding: 0 14px;
height: 100%;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.01em;
color: var(--color-bar-text);
border-right: 1px solid rgba(255,255,255,0.07);
}
.titlebar-brand svg { color: #5da8d4; flex-shrink: 0; }
.titlebar-info {
display: flex;
align-items: center;
gap: 6px;
padding: 0 12px;
min-width: 0;
height: 100%;
overflow: hidden;
}
.titlebar-info svg { color: #5da8d4; flex-shrink: 0; }
.tb-repo { color: #7e9aaa; font-size: 12px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 160px; }
.tb-sep { color: #3d4f5c; font-size: 13px; }
.tb-branch { color: #dce6eb; font-size: 12px; font-weight: 700; font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 220px; }
.tb-sync { display: inline-flex; align-items: center; padding: 1px 6px; border-radius: 999px; font-size: 11px; font-weight: 800; white-space: nowrap; flex-shrink: 0; }
.tb-sync.ahead { color: #f0b861; background: rgba(240,184,97,0.12); }
.tb-sync.behind { color: #79b8e8; background: rgba(121,184,232,0.12); }
.tb-no-repo { color: #4a5a66; font-size: 12px; font-style: italic; }
.titlebar-right { display: flex; align-items: stretch; height: 100%; border-left: 1px solid rgba(255,255,255,0.07); }
.titlebar-actions { display: flex; align-items: stretch; }
.tb-action {
display: flex;
align-items: center;
gap: 5px;
height: 100%;
min-height: unset;
padding: 0 10px;
border: none;
border-radius: 0;
background: transparent;
color: var(--color-bar-muted);
font-size: 12px;
cursor: pointer;
transition: background 120ms ease, color 120ms ease;
-webkit-app-region: no-drag;
}
.tb-action:hover:not(:disabled) { background: rgba(255,255,255,0.08); border-color: transparent; color: #dce6eb; }
.tb-action:disabled { opacity: 0.35; cursor: not-allowed; }
.tb-action.auto-toggle.active { color: #5cba87; }
.tb-action.auto-toggle.active:hover:not(:disabled) { color: #7ad4a2; background: rgba(92,186,135,0.1); }
.tb-action-label { font-size: 12px; font-weight: 600; }
.titlebar-divider { width: 1px; margin: 8px 0; background: rgba(255,255,255,0.1); flex-shrink: 0; }
.titlebar-controls { display: flex; align-items: stretch; height: 100%; }
.tb-btn {
display: flex;
align-items: center;
justify-content: center;
width: 46px;
height: 100%;
min-height: unset;
padding: 0;
border: none;
border-radius: 0;
background: transparent;
color: #7a8e9a;
cursor: pointer;
transition: background 120ms ease, color 120ms ease;
-webkit-app-region: no-drag;
}
.tb-btn:hover:not(:disabled) { background: rgba(255,255,255,0.1); border-color: transparent; color: #ffffff; }
.tb-btn.close:hover:not(:disabled) { background: #c0392b; color: #ffffff; }
/* --- Top bar (repo form) --- */
.topbar { padding: 10px; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-surface); }
.repo-form {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 9px;
}
.repo-form label { color: #54606a; font-size: 12px; font-weight: 700; text-transform: uppercase; white-space: nowrap; }
/* --- Notices --- */
.notice {
display: flex;
align-items: center;
gap: 8px;
min-height: 36px;
padding: 8px 11px;
border: 1px solid;
border-radius: 8px;
font-size: 13px;
}
.notice.error { border-color: #e8aaa4; color: #8e2d27; background: #fff4f2; }
.notice.busy { border-color: #a7cfe2; color: #245d78; background: #edf8fd; }
.notice.conflict { border-color: #e3b778; color: #8a4c0e; background: #fff6e7; }
.notice.conflict button {
margin-left: auto;
min-height: 30px;
padding: 0 12px;
border-color: #e3b778;
color: #8a4c0e;
background: #ffffff;
font-size: 13px;
font-weight: 700;
}
/* --- Workspace layout --- */
.workspace {
display: grid;
grid-template-columns: clamp(240px, 22vw, 320px) minmax(0, 1fr) clamp(300px, 30vw, 440px);
flex: 1 1 0;
min-height: 0;
gap: 10px;
}
.history-aside { display: grid; min-height: 0; }
.left-sidebar {
display: grid;
grid-template-rows: minmax(220px, 0.9fr) minmax(260px, 1.1fr);
min-height: 0;
gap: 10px;
}
/* --- Main panel --- */
.main-panel {
display: grid;
grid-template-rows: auto minmax(0, 1.2fr) minmax(0, 0.8fr) auto;
min-height: 0;
border: 1px solid var(--color-border);
border-radius: 8px;
background: var(--color-surface);
overflow: auto;
}
.repo-summary {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 12px;
padding: 16px;
border-bottom: 1px solid var(--color-border-subtle);
}
.repo-summary h1 { margin: 1px 0 0; font-size: 24px; line-height: 1.15; }
.repo-summary p { overflow: hidden; margin: 5px 0 0; color: var(--color-ink-dim); font-size: 13px; text-overflow: ellipsis; white-space: nowrap; }
.sync-stats, .status-counts { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
.sync-stats strong:first-of-type { color: #8a4c0e; background: #fff2d7; }
.sync-stats strong:last-of-type { color: #255b8b; background: #e7f1fb; }
.sync-stats span { color: #4f5d66; background: #edf0f2; }
.top-section {
display: grid;
grid-template-columns: minmax(0, 1fr) 360px;
min-height: 0;
gap: 10px;
padding: 10px;
overflow: hidden;
}
.file-history-section {
min-height: 0;
padding: 0 10px 10px;
overflow: hidden;
display: grid;
}
/* --- File list / change lanes --- */
.file-list { padding: 8px; overflow: auto; }
.file-row { display: grid; gap: 8px; padding: 10px; border: 1px solid var(--color-border-subtle); border-radius: 8px; background: #ffffff; }
.file-row + .file-row { margin-top: 8px; }
.file-title strong {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--font-mono);
font-size: 13px;
}
.change-lanes { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.change-lane {
display: grid;
grid-template-rows: auto auto;
gap: 6px;
padding: 8px;
border: 1px solid var(--color-border-subtle);
border-radius: 6px;
background: var(--color-surface-dim);
}
.change-lane.inactive { color: #8a949c; background: #fafafa; }
.lane-header { display: flex; align-items: center; gap: 8px; }
.lane-name { color: var(--color-ink-quiet); font-size: 12px; font-weight: 800; flex-shrink: 0; }
.lane-actions { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.status-toolbar {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 8px;
border-bottom: 1px solid var(--color-border-subtle);
background: var(--color-surface-dim);
}
/* --- Branch list --- */
.branch-group-label {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin: 2px 2px 6px;
color: var(--color-ink-muted);
font-size: 11px;
font-weight: 800;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.branch-group-count {
display: inline-flex;
align-items: center;
min-height: 18px;
padding: 0 7px;
border-radius: 999px;
color: #4f5d66;
background: #edf0f2;
font-size: 11px;
}
.branch-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 8px;
min-height: 48px;
padding: 8px;
border: 1px solid transparent;
border-radius: 8px;
}
.branch-row + .branch-row { margin-top: 4px; }
.branch-row.current { border-color: #b9ddc6; background: #f0f8f3; }
.branch-info { display: flex; align-items: center; min-width: 0; gap: 8px; }
.branch-info div { min-width: 0; }
.branch-info strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
.branch-info span { display: block; margin-top: 2px; color: var(--color-ink-muted); font-size: 12px; }
.branch-actions { display: flex; align-items: center; justify-content: flex-end; gap: 6px; }
/* --- Explorer --- */
.explorer-row {
display: grid;
grid-template-columns: auto auto minmax(0, 1fr) auto;
align-items: center;
gap: 7px;
width: 100%;
min-height: 34px;
padding: 5px 8px 5px calc(8px + var(--depth, 0) * 14px);
border: 1px solid var(--color-border-input);
border-radius: 6px;
background: #ffffff;
text-align: left;
transition: background 140ms ease, border-color 140ms ease;
}
.explorer-row + .explorer-row { margin-top: 4px; }
.explorer-row:hover { border-color: #8fa0ad; background: var(--color-surface-hover); }
.explorer-row.active { border-color: #9fc8dc; background: #edf8fd; }
.explorer-row.folder { font-weight: 800; }
.explorer-row svg { color: var(--color-accent); }
.tree-toggle, .explorer-select { min-height: 22px; padding: 0; border: 0; background: transparent; }
.tree-toggle { width: 14px; }
.tree-toggle:hover:not(:disabled), .explorer-select:hover:not(:disabled) { background: transparent; }
.explorer-select { justify-content: flex-start; min-width: 0; }
.tree-spacer { width: 14px; }
.explorer-select span { overflow: hidden; font-family: var(--font-mono); font-size: 12px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; }
/* --- Commit form --- */
.commit-form { display: flex; flex-direction: column; flex: 1 1 0; min-height: 0; gap: 10px; padding: 12px; }
.commit-form textarea { flex: 1 1 0; min-height: 80px; resize: none; }
/* --- Commit history --- */
.history-list { padding: 8px; overflow: auto; }
.commit-row { display: grid; gap: 8px; padding: 10px; border: 1px solid var(--color-border-subtle); border-radius: 8px; background: #ffffff; }
.commit-row + .commit-row { margin-top: 8px; }
.commit-row.compact { padding: 9px; }
.commit-line { display: flex; align-items: flex-start; min-width: 0; gap: 8px; }
.commit-line svg { flex: 0 0 auto; margin-top: 2px; color: var(--color-accent); }
.commit-line div { min-width: 0; }
.commit-line strong { display: block; overflow: hidden; color: var(--color-ink); font-size: 13px; line-height: 1.3; text-overflow: ellipsis; white-space: nowrap; }
.commit-line span { display: block; overflow: hidden; margin-top: 3px; color: var(--color-ink-muted); font-family: var(--font-mono); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
.ref-list { display: flex; flex-wrap: wrap; gap: 5px; }
.ref-list span { max-width: 100%; overflow: hidden; padding: 3px 7px; border-radius: 999px; color: #255b8b; background: #e7f1fb; font-size: 11px; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; }
.commit-files { display: grid; gap: 6px; }
.commit-files-toggle { justify-content: flex-start; gap: 5px; min-height: 26px; padding: 0 8px; border-color: transparent; background: transparent; color: #4f5d66; font-size: 12px; font-weight: 700; }
.commit-files-toggle:hover:not(:disabled) { border-color: var(--color-border-input); background: var(--color-surface-hover); }
.commit-file-list { display: grid; gap: 5px; }
.commit-file-button { display: grid; grid-template-columns: auto minmax(0, 1fr); justify-content: stretch; width: 100%; min-height: 30px; padding: 5px 7px; text-align: left; }
.commit-file-button strong { overflow: hidden; color: var(--color-ink); font-family: var(--font-mono); font-size: 12px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; }
.commit-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.commit-actions time { overflow: hidden; color: var(--color-ink-faint); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
.commit-action-buttons { display: flex; align-items: center; gap: 6px; }
/* --- Git graph --- */
.graph-list { padding: 0; }
.graph-row { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0; margin: 0; padding: 0; border: none; border-radius: 0; background: none; }
.graph-row + .graph-row { margin-top: 0; }
.graph-gutter { position: relative; align-self: stretch; background: #fdfdfe; }
.graph-svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
.graph-dot {
position: absolute;
top: 50%;
width: 11px;
height: 11px;
border-radius: 999px;
background: var(--dot-color, #2f6fb0);
border: 2px solid #ffffff;
box-shadow: 0 0 0 1px var(--dot-color, #2f6fb0);
transform: translate(-50%, -50%);
}
.graph-dot.merge { width: 13px; height: 13px; background: #ffffff; border-color: var(--dot-color, #2f6fb0); }
.commit-body { display: grid; gap: 8px; min-width: 0; padding: 11px 12px; }
.graph-row + .graph-row .commit-body { border-top: 1px solid #e7ebee; }
.graph-row:hover .commit-body { background: #f6f9fb; }
/* --- Compare panel --- */
.compare-panel {
display: grid;
grid-template-rows: auto auto;
margin: 0 10px 10px;
}
.compare-form {
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto;
align-items: end;
gap: 10px;
padding: 12px;
border-bottom: 1px solid var(--color-border-subtle);
}
.compare-field { display: grid; gap: 5px; min-width: 0; }
.compare-field span { color: var(--color-ink-quiet); font-size: 12px; font-weight: 800; }
.compare-field select { width: 100%; min-height: 36px; padding: 0 8px; border: 1px solid #c4ccd3; border-radius: 6px; background: #ffffff; color: var(--color-ink); font-size: 13px; }
.compare-arrow { margin-bottom: 8px; color: var(--color-accent); }
.compare-summary { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; padding: 12px; }
.compare-range { display: flex; align-items: center; gap: 8px; color: var(--color-accent); }
.compare-range .hash, .dialog-range .hash { padding: 3px 8px; border-radius: 999px; background: #e7f1fb; color: #255b8b; font-family: var(--font-mono); font-size: 12px; font-weight: 700; }
.compare-count { color: var(--color-ink-quiet); font-size: 13px; font-weight: 700; }
/* --- Dialogs --- */
.dialog-backdrop {
position: fixed;
inset: 0;
z-index: 50;
display: grid;
place-items: center;
padding: 24px;
background: rgba(20, 26, 31, 0.45);
}
.dialog {
display: grid;
grid-template-rows: auto minmax(0, 1fr);
width: min(1100px, 100%);
height: min(760px, 100%);
border: 1px solid #c4ccd3;
border-radius: 12px;
background: var(--color-surface);
box-shadow: 0 18px 48px rgba(20, 26, 31, 0.32);
overflow: hidden;
}
.dialog-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; border-bottom: 1px solid var(--color-border-subtle); }
.dialog-range { display: flex; align-items: center; gap: 8px; margin: 2px 0 0; color: var(--color-accent); font-size: 16px; }
.dialog-title { margin: 2px 0 0; color: var(--color-ink); font-size: 16px; }
.dialog-close { min-height: 34px; min-width: 34px; padding: 0; justify-content: center; }
.dialog-body { display: grid; grid-template-columns: 300px minmax(0, 1fr); min-height: 0; }
.dialog-files { display: grid; align-content: start; gap: 5px; padding: 10px; overflow: auto; border-right: 1px solid var(--color-border-subtle); background: #f4f6f8; }
.dialog-file-row {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 8px;
padding: 7px 8px;
border: 1px solid var(--color-border-subtle);
border-radius: 6px;
background: #ffffff;
text-align: left;
}
.dialog-file-row.active { border-color: #9cc2e6; background: #e7f1fb; }
.dialog-file-row.prepared { border-color: #b9ddc6; background: #f0f8f3; }
.dialog-file-row.prepared.active { border-color: #4aa777; background: #e4f4ea; }
.dialog-file-row strong { overflow: hidden; color: var(--color-ink); font-family: var(--font-mono); font-size: 12px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; }
.dialog-file-row svg { color: #1f7a4d; }
.dialog-diff { display: grid; min-height: 0; padding: 10px; }
.dialog-diff .diff-view { max-height: none; }
.dialog-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-top: 1px solid var(--color-border-subtle); background: #f4f6f8; }
.dialog-footer-info { color: #4f5d66; font-size: 13px; font-weight: 700; }
.prepared-tag { display: inline-flex; align-items: center; gap: 4px; margin-right: auto; color: #1f7a4d; font-size: 12px; font-weight: 700; }
/* --- Diff viewer --- */
.diff-view {
min-height: 0;
max-height: 420px;
margin: 0;
padding: 10px;
overflow: auto;
border: 1px solid var(--color-border-subtle);
border-radius: 6px;
background: #ffffff;
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.5;
tab-size: 2;
}
.diff-line { display: block; white-space: pre-wrap; word-break: break-word; }
.diff-line.meta { color: var(--color-ink-faint); }
.diff-line.hunk { color: #255b8b; background: #eef4fb; }
.diff-line.add { color: #176239; background: #e6f5ec; }
.diff-line.del { color: #9b2e29; background: #fdeceb; }
.diff-line.context { color: #3a444c; }
.diff-counts { display: flex; gap: 8px; font-family: var(--font-mono); font-size: 12px; font-weight: 700; }
.diff-counts .adds { color: #176239; }
.diff-counts .dels { color: #9b2e29; }
/* --- Conflict resolver --- */
.resolve-editor { display: flex; flex-direction: column; min-height: 0; padding: 10px; gap: 8px; }
.resolve-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.resolve-toolbar button { min-height: 32px; padding: 0 10px; font-size: 13px; }
.resolve-toolbar-label { color: var(--color-ink-quiet); font-size: 12px; font-weight: 800; }
.resolve-status { display: inline-flex; align-items: center; gap: 5px; margin-left: auto; font-size: 12px; font-weight: 700; color: #8a4c0e; }
.resolve-textarea {
width: 100%;
flex: 1 1 auto;
min-height: 120px;
padding: 10px;
border: 1px solid #c4ccd3;
border-radius: 6px;
background: #ffffff;
color: var(--color-ink);
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.5;
tab-size: 2;
resize: none;
white-space: pre;
}
.resolve-structured {
display: grid;
align-content: start;
gap: 8px;
flex: 1 1 auto;
min-height: 0;
padding: 4px;
overflow: auto;
border: 1px solid var(--color-border-subtle);
border-radius: 6px;
background: #ffffff;
}
.resolve-context { margin: 0; padding: 2px 8px; overflow-x: auto; font-family: var(--font-mono); font-size: 12px; line-height: 1.5; tab-size: 2; color: #3a444c; }
.resolve-conflict { display: grid; gap: 6px; padding: 8px; border: 1px solid #e3b778; border-radius: 6px; background: #fffaf1; }
.resolve-conflict.unresolved { border-color: #d98b8b; background: #fff5f3; }
.resolve-conflict-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
.resolve-conflict-label { color: #8a4c0e; font-size: 12px; font-weight: 800; }
.resolve-choice-buttons { display: flex; flex-wrap: wrap; gap: 4px; }
.resolve-choice-buttons button { min-height: 26px; padding: 0 8px; font-size: 12px; }
.resolve-choice-buttons button.active { border-color: #2f6fb0; color: #ffffff; background: #2f6fb0; }
.resolve-side { display: grid; gap: 3px; padding: 6px; border: 1px solid var(--color-border-subtle); border-radius: 6px; border-left-width: 3px; }
.resolve-side.ours { border-left-color: #4aa777; background: #f1faf4; }
.resolve-side.theirs { border-left-color: #5a8bd0; background: #f1f5fc; }
.resolve-side.dimmed { opacity: 0.45; filter: grayscale(0.4); }
.resolve-side-label { font-size: 11px; font-weight: 800; text-transform: uppercase; }
.resolve-side.ours .resolve-side-label { color: #1f7a4d; }
.resolve-side.theirs .resolve-side-label { color: #2f6fb0; }
.resolve-lines { margin: 0; overflow-x: auto; font-family: var(--font-mono); font-size: 12px; line-height: 1.5; tab-size: 2; }
.resolve-line { display: block; white-space: pre-wrap; word-break: break-word; }
.resolve-line.ours { color: #176239; }
.resolve-line.theirs { color: #255b8b; }
.resolve-line.context { color: #3a444c; }
.resolve-binary { display: grid; align-content: start; gap: 12px; padding: 4px; }
.resolve-binary-note { display: flex; align-items: center; gap: 8px; padding: 10px; border: 1px solid #e3b778; border-radius: 6px; color: #8a4c0e; background: #fff6e7; font-size: 13px; }
.resolve-binary-options { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.resolve-binary-card { display: grid; gap: 6px; justify-items: start; padding: 14px; border: 1px solid var(--color-border-subtle); border-left-width: 3px; border-radius: 8px; text-align: left; }
.resolve-binary-card.ours { border-left-color: #4aa777; background: #f1faf4; }
.resolve-binary-card.theirs { border-left-color: #5a8bd0; background: #f1f5fc; }
.resolve-binary-card.active { box-shadow: 0 0 0 2px #2f6fb0 inset; border-color: #2f6fb0; }
.resolve-binary-card strong { color: var(--color-ink); font-size: 18px; }
.resolve-binary-hint { color: var(--color-ink-faint); font-size: 12px; }
.resolve-actions { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.resolve-path { overflow: hidden; color: var(--color-ink-faint); font-family: var(--font-mono); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
}
@keyframes spin { to { transform: rotate(360deg); } }
/* --- Responsive breakpoints --- */
@media (max-width: 1400px) {
.workspace { grid-template-columns: clamp(220px, 20vw, 300px) minmax(0, 1fr) clamp(280px, 28vw, 400px); }
}
@media (max-width: 1180px) {
.workspace { grid-template-columns: clamp(200px, 18vw, 260px) minmax(0, 1fr) clamp(260px, 26vw, 340px); }
.top-section { grid-template-columns: minmax(0, 1fr); }
.file-history-section { padding: 0 10px 10px; }
.repo-summary h1 { font-size: 20px; }
}
@media (max-width: 980px) {
.workspace { grid-template-columns: 200px minmax(0, 1fr) 240px; }
.left-sidebar { grid-template-rows: minmax(180px, 0.8fr) minmax(220px, 1.2fr); }
.section-head { min-height: 50px; padding: 10px; }
.repo-summary { padding: 12px; }
.branch-actions { flex-direction: column; align-items: flex-end; gap: 4px; }
.branch-actions button { width: 100%; }
}
@media (max-width: 860px) {
body { overflow: auto; }
.shell-body { min-height: 100%; }
.repo-form { grid-template-columns: 1fr; }
.workspace { grid-template-columns: 1fr; }
.repo-summary { grid-template-columns: 1fr; }
.change-lanes, .compare-form { grid-template-columns: 1fr; }
.compare-arrow { display: none; }
.dialog-body { grid-template-columns: 1fr; grid-template-rows: minmax(120px, 0.4fr) minmax(0, 1fr); }
.dialog-files { border-right: none; border-bottom: 1px solid var(--color-border-subtle); }
.sync-stats { justify-content: flex-start; }
.branch-actions { flex-direction: row; justify-content: flex-start; }
.tb-action-label { display: none; }
.history-aside { min-height: 480px; }
.branches { min-height: 260px; }
.left-sidebar { min-height: 560px; }
.change-lane { grid-template-columns: auto auto; }
.lane-actions { grid-column: 1 / -1; justify-content: flex-start; }
}
@media (min-width: 1800px) {
.workspace { grid-template-columns: 360px minmax(0, 1fr) 500px; }
.top-section { grid-template-columns: minmax(0, 1fr) 420px; }
}