Fix UI padding and text flush against container edges
All checks were successful
Build App / build-windows (push) Successful in 3m16s
Build App / build-linux (push) Successful in 4m16s

- Remove global * { padding: 0 } reset that was overriding all Tailwind
  padding classes (unlayered CSS beats Tailwind v4 @layer utilities)
- Add color-scheme: dark to fix native form controls (select dropdowns)
  rendering with white backgrounds
- Make sidebar responsive (25% width, min 224px, max 320px)
- Increase internal padding on TopBar, Sidebar, ProjectList, StatusBar
- Add flex-shrink-0 to TopBar status indicators to prevent clipping
- Allow project action buttons to wrap on narrow sidebars
- Increase terminal view padding for breathing room

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-27 10:31:27 -08:00
parent 1a78378ed7
commit 60842befde
8 changed files with 10 additions and 14 deletions

View File

@@ -6,7 +6,7 @@ export default function Sidebar() {
const { sidebarView, setSidebarView } = useAppState(); const { sidebarView, setSidebarView } = useAppState();
return ( return (
<div className="flex flex-col h-full w-64 bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-lg overflow-hidden"> <div className="flex flex-col h-full w-[25%] min-w-56 max-w-80 bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-lg overflow-hidden">
{/* Nav tabs */} {/* Nav tabs */}
<div className="flex border-b border-[var(--border-color)]"> <div className="flex border-b border-[var(--border-color)]">
<button <button
@@ -32,7 +32,7 @@ export default function Sidebar() {
</div> </div>
{/* Content */} {/* Content */}
<div className="flex-1 overflow-y-auto"> <div className="flex-1 overflow-y-auto p-1">
{sidebarView === "projects" ? <ProjectList /> : <SettingsPanel />} {sidebarView === "projects" ? <ProjectList /> : <SettingsPanel />}
</div> </div>
</div> </div>

View File

@@ -5,7 +5,7 @@ export default function StatusBar() {
const running = projects.filter((p) => p.status === "running").length; const running = projects.filter((p) => p.status === "running").length;
return ( return (
<div className="flex items-center h-6 px-3 bg-[var(--bg-tertiary)] border border-[var(--border-color)] rounded-lg text-xs text-[var(--text-secondary)]"> <div className="flex items-center h-6 px-4 bg-[var(--bg-tertiary)] border border-[var(--border-color)] rounded-lg text-xs text-[var(--text-secondary)]">
<span> <span>
{projects.length} project{projects.length !== 1 ? "s" : ""} {projects.length} project{projects.length !== 1 ? "s" : ""}
</span> </span>

View File

@@ -6,10 +6,10 @@ export default function TopBar() {
return ( return (
<div className="flex items-center h-10 bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-lg overflow-hidden"> <div className="flex items-center h-10 bg-[var(--bg-secondary)] border border-[var(--border-color)] rounded-lg overflow-hidden">
<div className="flex-1 overflow-x-auto"> <div className="flex-1 overflow-x-auto pl-2">
<TerminalTabs /> <TerminalTabs />
</div> </div>
<div className="flex items-center gap-2 px-3 text-xs text-[var(--text-secondary)]"> <div className="flex items-center gap-2 px-4 flex-shrink-0 text-xs text-[var(--text-secondary)]">
<StatusDot ok={dockerAvailable === true} label="Docker" /> <StatusDot ok={dockerAvailable === true} label="Docker" />
<StatusDot ok={imageExists === true} label="Image" /> <StatusDot ok={imageExists === true} label="Image" />
</div> </div>

View File

@@ -159,7 +159,7 @@ export default function ProjectCard({ project }: Props) {
</div> </div>
{/* Action buttons */} {/* Action buttons */}
<div className="flex items-center gap-1"> <div className="flex items-center gap-1 flex-wrap">
{isStopped ? ( {isStopped ? (
<> <>
<ActionButton onClick={handleStart} disabled={loading} label="Start" /> <ActionButton onClick={handleStart} disabled={loading} label="Start" />

View File

@@ -8,7 +8,7 @@ export default function ProjectList() {
const [showAdd, setShowAdd] = useState(false); const [showAdd, setShowAdd] = useState(false);
return ( return (
<div className="p-2"> <div className="p-3">
<div className="flex items-center justify-between px-2 py-1 mb-2"> <div className="flex items-center justify-between px-2 py-1 mb-2">
<span className="text-xs font-semibold uppercase text-[var(--text-secondary)]"> <span className="text-xs font-semibold uppercase text-[var(--text-secondary)]">
Projects Projects

View File

@@ -83,7 +83,7 @@ export default function AwsSettings() {
<select <select
value={globalAws.aws_profile ?? ""} value={globalAws.aws_profile ?? ""}
onChange={(e) => handleChange("aws_profile", e.target.value)} onChange={(e) => handleChange("aws_profile", e.target.value)}
className="w-full px-2 py-1.5 text-xs bg-[var(--bg-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]" className="w-full px-2 py-1.5 text-xs bg-[var(--bg-primary)] text-[var(--text-primary)] border border-[var(--border-color)] rounded focus:outline-none focus:border-[var(--accent)]"
> >
<option value="">None (use default)</option> <option value="">None (use default)</option>
{profiles.map((p) => ( {profiles.map((p) => (

View File

@@ -170,7 +170,7 @@ export default function TerminalView({ sessionId, active }: Props) {
<div <div
ref={containerRef} ref={containerRef}
className={`w-full h-full ${active ? "" : "hidden"}`} className={`w-full h-full ${active ? "" : "hidden"}`}
style={{ padding: "4px" }} style={{ padding: "8px" }}
/> />
); );
} }

View File

@@ -12,13 +12,9 @@
--success: #3fb950; --success: #3fb950;
--warning: #d29922; --warning: #d29922;
--error: #f85149; --error: #f85149;
color-scheme: dark;
} }
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body, #root { html, body, #root {
height: 100%; height: 100%;