From 751862a4863a93d02728bc5e1fbeed4164c3a992 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 3 Mar 2026 16:04:18 -0800 Subject: [PATCH] Redesign frontend: IBM Plex Mono, black/white editorial aesthetic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IBM Plex Mono font from Google Fonts for the monospace character - Pure black/white/gray palette — no colors except red for errors/danger - 1px solid black borders system throughout (no shadows, no rounding) - Header nav uses border-left separators with hover backgrounds - Primary button: solid black; copy button: white outline (visually distinct) - Share box: readonly input + copy button flush with no gap - Table: outer border + gray header row + subtle row hover - File view: centered with border around video/audio players - Danger button: red outline, fills on hover Co-Authored-By: Claude Sonnet 4.6 --- public/style.css | 415 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 347 insertions(+), 68 deletions(-) diff --git a/public/style.css b/public/style.css index 2ef3363..136a5f5 100644 --- a/public/style.css +++ b/public/style.css @@ -1,126 +1,405 @@ -*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } +@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap'); -:root { - --bg: #0f1117; - --surface: #1c1f2e; - --border: #2a2d3e; - --accent: #6c63ff; - --accent-hover: #5a52e0; - --text: #e2e8f0; - --muted: #8892a4; - --error: #f56565; - --danger: #e53e3e; +/* ── Reset ──────────────────────────────────────────────── */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; } +/* ── Tokens ─────────────────────────────────────────────── */ +:root { + --black: #000; + --white: #fff; + --gray-50: #fafafa; + --gray-100:#f0f0f0; + --gray-200:#e0e0e0; + --gray-400:#999; + --gray-600:#555; + --red: #c00; + + --font: 'IBM Plex Mono', 'Courier New', monospace; + --border: 1px solid var(--black); + --radius: 0; +} + +/* ── Base ───────────────────────────────────────────────── */ +html { font-size: 14px; } + body { - font-family: system-ui, -apple-system, sans-serif; - background: var(--bg); - color: var(--text); + font-family: var(--font); + background: var(--white); + color: var(--black); min-height: 100vh; display: flex; flex-direction: column; + -webkit-font-smoothing: antialiased; } -a { color: var(--accent); text-decoration: none; } -a:hover { text-decoration: underline; } +a { + color: var(--black); + text-decoration: underline; + text-underline-offset: 3px; +} +a:hover { color: var(--gray-600); } +/* ── Header ─────────────────────────────────────────────── */ header { display: flex; align-items: center; - gap: 1.5rem; - padding: 1rem 2rem; - border-bottom: 1px solid var(--border); + gap: 2rem; + padding: 0 2rem; + height: 48px; + border-bottom: var(--border); + flex-shrink: 0; } -.logo { font-size: 1.25rem; font-weight: 700; color: var(--text); } +.logo { + font-size: 13px; + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; + text-decoration: none; + color: var(--black); +} +.logo:hover { color: var(--gray-600); } -nav { display: flex; align-items: center; gap: 1rem; margin-left: auto; } -nav a { color: var(--muted); font-size: 0.9rem; } -nav a:hover { color: var(--text); } +nav { + display: flex; + align-items: center; + gap: 0; + margin-left: auto; +} -main { flex: 1; padding: 2rem; display: flex; justify-content: center; align-items: flex-start; } +nav a { + display: block; + padding: 0 1rem; + height: 48px; + line-height: 48px; + font-size: 12px; + letter-spacing: 0.04em; + text-decoration: none; + color: var(--gray-600); + border-left: var(--border); +} +nav a:hover { + color: var(--black); + background: var(--gray-100); +} +nav form { + display: contents; +} + +nav button[type="submit"] { + display: block; + padding: 0 1rem; + height: 48px; + font-size: 12px; + letter-spacing: 0.04em; + background: none; + border: none; + border-left: var(--border); + color: var(--gray-600); + cursor: pointer; + font-family: var(--font); +} +nav button[type="submit"]:hover { + color: var(--black); + background: var(--gray-100); +} + +/* ── Main ───────────────────────────────────────────────── */ +main { + flex: 1; + padding: 3rem 2rem; +} + +/* ── Form Container ─────────────────────────────────────── */ .form-container { - width: 100%; - max-width: 420px; - margin-top: 4rem; + max-width: 400px; } -.form-container h1 { margin-bottom: 1.5rem; font-size: 1.5rem; } +.form-container h1 { + font-size: 16px; + font-weight: 600; + letter-spacing: 0.02em; + margin-bottom: 2rem; + padding-bottom: 1rem; + border-bottom: var(--border); +} -form { display: flex; flex-direction: column; gap: 1rem; } +form { + display: flex; + flex-direction: column; + gap: 1.25rem; +} label { display: flex; flex-direction: column; gap: 0.375rem; - font-size: 0.875rem; - color: var(--muted); + font-size: 11px; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--gray-600); } input[type="text"], input[type="password"], input[type="file"] { - padding: 0.625rem 0.75rem; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 6px; - color: var(--text); - font-size: 1rem; width: 100%; + padding: 0.6rem 0.75rem; + font-family: var(--font); + font-size: 13px; + background: var(--white); + border: var(--border); + color: var(--black); + outline: none; + transition: background 0.1s; +} +input[type="text"]:focus, +input[type="password"]:focus { + background: var(--gray-50); + box-shadow: inset 0 0 0 2px var(--black); } -input:focus { outline: 2px solid var(--accent); outline-offset: 1px; border-color: var(--accent); } - -button, .btn { - padding: 0.625rem 1.25rem; - background: var(--accent); - border: none; - border-radius: 6px; - color: #fff; - font-size: 0.9rem; - font-weight: 600; +input[type="file"] { + padding: 0.5rem; cursor: pointer; - text-align: center; - display: inline-block; +} +input[type="file"]::-webkit-file-upload-button { + font-family: var(--font); + font-size: 11px; + letter-spacing: 0.06em; + text-transform: uppercase; + background: var(--black); + color: var(--white); + border: none; + padding: 0.3rem 0.6rem; + cursor: pointer; + margin-right: 0.75rem; +} +input[type="file"]::file-selector-button { + font-family: var(--font); + font-size: 11px; + letter-spacing: 0.06em; + text-transform: uppercase; + background: var(--black); + color: var(--white); + border: none; + padding: 0.3rem 0.6rem; + cursor: pointer; + margin-right: 0.75rem; } -button:hover, .btn:hover { background: var(--accent-hover); } +/* ── Primary Button ─────────────────────────────────────── */ +button[type="submit"], +.btn-primary { + display: inline-block; + padding: 0.6rem 1.25rem; + font-family: var(--font); + font-size: 11px; + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; + background: var(--black); + color: var(--white); + border: var(--border); + cursor: pointer; + transition: background 0.1s, color 0.1s; + text-align: center; +} +button[type="submit"]:hover, +.btn-primary:hover { + background: var(--gray-600); +} -button.danger { background: var(--danger); } -button.danger:hover { background: #c53030; } +/* ── Danger Button ──────────────────────────────────────── */ +button.danger { + display: inline-block; + padding: 0.3rem 0.6rem; + font-family: var(--font); + font-size: 11px; + letter-spacing: 0.04em; + background: none; + color: var(--red); + border: 1px solid var(--red); + cursor: pointer; +} +button.danger:hover { + background: var(--red); + color: var(--white); +} -.error { color: var(--error); font-size: 0.9rem; margin-bottom: 0.5rem; } +/* ── Generic Link-button (.btn for file-view) ───────────── */ +a.btn { + display: inline-block; + padding: 0.6rem 1.25rem; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; + text-decoration: none; + background: var(--black); + color: var(--white); + border: var(--border); + transition: background 0.1s; +} +a.btn:hover { + background: var(--gray-600); + color: var(--white); +} +/* ── Error ──────────────────────────────────────────────── */ +.error { + font-size: 12px; + color: var(--red); + padding: 0.6rem 0.75rem; + border: 1px solid var(--red); + background: #fff5f5; + margin-bottom: 0.5rem; +} + +/* ── Share Box ──────────────────────────────────────────── */ .share-box { display: flex; - gap: 0.5rem; - margin: 1rem 0; + gap: 0; + margin: 1.25rem 0 1rem; } -.share-box input { flex: 1; } -/* File view — centered */ +.share-box input[readonly] { + flex: 1; + background: var(--gray-100); + color: var(--gray-600); + border-right: none; + cursor: text; +} +.share-box input[readonly]:focus { + box-shadow: none; + background: var(--gray-100); +} + +/* Copy button — outline style, distinct from submit */ +.share-box button { + padding: 0.6rem 1rem; + font-family: var(--font); + font-size: 11px; + font-weight: 600; + letter-spacing: 0.08em; + text-transform: uppercase; + background: var(--white); + color: var(--black); + border: var(--border); + cursor: pointer; + white-space: nowrap; + transition: background 0.1s; + flex-shrink: 0; +} +.share-box button:hover { + background: var(--gray-100); +} + +/* ── Table ──────────────────────────────────────────────── */ +h1 { + font-size: 16px; + font-weight: 600; + letter-spacing: 0.02em; + margin-bottom: 1.25rem; + padding-bottom: 1rem; + border-bottom: var(--border); +} + +h1 + p { + margin-bottom: 1.5rem; + font-size: 12px; +} + +table { + width: 100%; + border-collapse: collapse; + border: var(--border); +} + +th { + padding: 0.6rem 1rem; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + text-align: left; + background: var(--gray-100); + border-bottom: var(--border); + color: var(--gray-600); +} + +td { + padding: 0.6rem 1rem; + font-size: 12px; + border-bottom: 1px solid var(--gray-200); + vertical-align: middle; +} + +tr:last-child td { border-bottom: none; } + +tr:hover td { background: var(--gray-50); } + +td a { + font-weight: 500; +} + +td:last-child { + width: 80px; + text-align: right; +} + +/* ── File View ──────────────────────────────────────────── */ .file-view { display: flex; flex-direction: column; align-items: center; justify-content: center; - min-height: 60vh; + min-height: calc(100vh - 48px - 6rem); gap: 1.5rem; text-align: center; + max-width: 800px; + margin: 0 auto; } -.file-view h1 { font-size: 1.25rem; color: var(--muted); word-break: break-all; } +.file-view h1 { + font-size: 13px; + font-weight: 400; + color: var(--gray-600); + word-break: break-all; + border-bottom: none; + padding-bottom: 0; + margin-bottom: 0; +} .file-view video, -.file-view audio { max-width: 800px; width: 100%; border-radius: 8px; } +.file-view audio { + width: 100%; + max-width: 720px; + border: var(--border); + display: block; +} -.file-actions { display: flex; gap: 1rem; } +.file-actions { + display: flex; + gap: 0.75rem; +} -/* File list table */ -table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } -th, td { padding: 0.75rem 1rem; text-align: left; border-bottom: 1px solid var(--border); } -th { color: var(--muted); font-weight: 600; } -tr:hover td { background: var(--surface); } - -h1 { margin-bottom: 1rem; } +/* ── Utility ─────────────────────────────────────────────── */ +.form-container > p { + font-size: 12px; + color: var(--gray-600); + margin-top: 1rem; + line-height: 1.7; +} +.form-container > p strong { + color: var(--black); + font-weight: 600; +} +.form-container > p a { + color: var(--black); +}