diff --git a/docs/palette-previews/midnight-history.png b/docs/palette-previews/midnight-history.png new file mode 100644 index 0000000..85f1132 Binary files /dev/null and b/docs/palette-previews/midnight-history.png differ diff --git a/docs/palette-previews/midnight-new.png b/docs/palette-previews/midnight-new.png new file mode 100644 index 0000000..45deb48 Binary files /dev/null and b/docs/palette-previews/midnight-new.png differ diff --git a/docs/palette-previews/midnight-paste.png b/docs/palette-previews/midnight-paste.png new file mode 100644 index 0000000..d41946c Binary files /dev/null and b/docs/palette-previews/midnight-paste.png differ diff --git a/docs/palette-previews/pastel-cloud-history.png b/docs/palette-previews/pastel-cloud-history.png new file mode 100644 index 0000000..3e9fa8b Binary files /dev/null and b/docs/palette-previews/pastel-cloud-history.png differ diff --git a/docs/palette-previews/pastel-cloud-new.png b/docs/palette-previews/pastel-cloud-new.png new file mode 100644 index 0000000..41e8c6d Binary files /dev/null and b/docs/palette-previews/pastel-cloud-new.png differ diff --git a/docs/palette-previews/pastel-cloud-paste.png b/docs/palette-previews/pastel-cloud-paste.png new file mode 100644 index 0000000..575a12e Binary files /dev/null and b/docs/palette-previews/pastel-cloud-paste.png differ diff --git a/docs/palette-previews/pastel-lavender-history.png b/docs/palette-previews/pastel-lavender-history.png new file mode 100644 index 0000000..ddebfa8 Binary files /dev/null and b/docs/palette-previews/pastel-lavender-history.png differ diff --git a/docs/palette-previews/pastel-lavender-new.png b/docs/palette-previews/pastel-lavender-new.png new file mode 100644 index 0000000..294c1a2 Binary files /dev/null and b/docs/palette-previews/pastel-lavender-new.png differ diff --git a/docs/palette-previews/pastel-lavender-paste.png b/docs/palette-previews/pastel-lavender-paste.png new file mode 100644 index 0000000..dc96d9e Binary files /dev/null and b/docs/palette-previews/pastel-lavender-paste.png differ diff --git a/docs/palette-previews/pastel-peach-history.png b/docs/palette-previews/pastel-peach-history.png new file mode 100644 index 0000000..fef8b31 Binary files /dev/null and b/docs/palette-previews/pastel-peach-history.png differ diff --git a/docs/palette-previews/pastel-peach-new.png b/docs/palette-previews/pastel-peach-new.png new file mode 100644 index 0000000..0896419 Binary files /dev/null and b/docs/palette-previews/pastel-peach-new.png differ diff --git a/docs/palette-previews/pastel-peach-paste.png b/docs/palette-previews/pastel-peach-paste.png new file mode 100644 index 0000000..fb0c002 Binary files /dev/null and b/docs/palette-previews/pastel-peach-paste.png differ diff --git a/docs/palette-previews/smooth-history.png b/docs/palette-previews/smooth-history.png new file mode 100644 index 0000000..0389b63 Binary files /dev/null and b/docs/palette-previews/smooth-history.png differ diff --git a/docs/palette-previews/smooth-new.png b/docs/palette-previews/smooth-new.png new file mode 100644 index 0000000..f84f866 Binary files /dev/null and b/docs/palette-previews/smooth-new.png differ diff --git a/docs/palette-previews/smooth-paste.png b/docs/palette-previews/smooth-paste.png new file mode 100644 index 0000000..526641c Binary files /dev/null and b/docs/palette-previews/smooth-paste.png differ diff --git a/web/static/app.css b/web/static/app.css index 44870d3..d948dc4 100644 --- a/web/static/app.css +++ b/web/static/app.css @@ -7,10 +7,38 @@ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-mono: ui-monospace, "JetBrains Mono", "Fira Code", monospace; } +/* semantic status colors (dark preset values; light presets override below) */ +:root { + --ok: #9CD49C; --warn: #E8C77B; --err: #F2A3B3; + --on-accent: #241B30; /* text placed on accent-colored backgrounds */ +} [data-preset="smooth"] { --bg: #F6F5FA; --surface: #FFFFFF; --surface-2: #DAD7E6; --muted: #B5B1C9; --muted-fg: #7A7796; --fg: #2A2A36; --accent: #7A7796; --border: #DAD7E6; + --ok: #456F45; --warn: #7A5E1B; --err: #9E4054; + --on-accent: #F6F5FA; +} +[data-preset="pastel-lavender"] { + --bg: #e6e0f5; --surface: #f1edfa; --surface-2: #cbb8e7; + --muted: #a99cc9; --muted-fg: #5f5390; --fg: #3E3059; + --accent: #806bb8; --border: #c4b6e0; + --ok: #3E6B3E; --warn: #7A5E1B; --err: #9E4054; + --on-accent: #f1edfa; +} +[data-preset="pastel-peach"] { + --bg: #ffe0d6; --surface: #fff0ea; --surface-2: #ffc4a8; + --muted: #d9a08c; --muted-fg: #7a4632; --fg: #4F2318; + --accent: #f9826c; --border: #ffc9b5; + --ok: #3E6B3E; --warn: #7A5E1B; --err: #9E4054; + --on-accent: #4F2318; +} +[data-preset="pastel-cloud"] { + --bg: #fff0f6; --surface: #fff7fb; --surface-2: #ffc8dd; + --muted: #d9b9c9; --muted-fg: #7d5670; --fg: #4A3355; + --accent: #a2d2ff; --border: #ffccd9; + --ok: #3E6B3E; --warn: #7A5E1B; --err: #9E4054; + --on-accent: #274a6b; } * { box-sizing: border-box; margin: 0; padding: 0; } @@ -243,6 +271,9 @@ td a.slug:hover { color: var(--accent); } box-shadow: 0 4px 16px rgba(0,0,0,.25); } .toast.show { opacity: 1; transform: translateX(-50%) translateY(0); } +/* status variants (#16) */ +.toast.success { border-color: var(--ok); color: var(--ok); } +.toast.error { border-color: var(--err); color: var(--err); } /* protection section rhythm (#20) */ .protect { display: flex; flex-direction: column; gap: 2px; } diff --git a/web/templates/layout.html b/web/templates/layout.html index 3bc7385..e1d07ea 100644 --- a/web/templates/layout.html +++ b/web/templates/layout.html @@ -2,6 +2,13 @@ + {{end}} {{define "topbar"}} diff --git a/web/templates/new.html b/web/templates/new.html index 6db5a3b..1862108 100644 --- a/web/templates/new.html +++ b/web/templates/new.html @@ -74,10 +74,13 @@ function updateGutter() { content.addEventListener('input', updateGutter); updateGutter(); -function toast(msg) { +function toast(msg, kind) { let t = document.querySelector('.toast'); if (!t) { t = document.createElement('div'); t.className = 'toast'; document.body.appendChild(t); } t.textContent = msg; + t.classList.remove('success', 'error'); + if (kind === 'success') t.classList.add('success'); + if (kind === 'error') t.classList.add('error'); t.classList.add('show'); clearTimeout(t._h); t._h = setTimeout(() => t.classList.remove('show'), 2000); @@ -162,12 +165,13 @@ async function create() { const data = await res.json(); if (!res.ok) { showResult('Error: ' + (data.error || res.status), true); + toast('Create failed', 'error'); return; } const url = location.origin + '/' + (data.custom_slug || data.id); showResult('' + url + '', false); $('result').dataset.token = data.deletion_token || ''; - try { navigator.clipboard.writeText(url); toast('Copied'); } catch(e) {} + try { navigator.clipboard.writeText(url); toast('Copied', 'success'); } catch(e) {} const dest = '/' + data.id + '?created=1&token=' + encodeURIComponent(data.deletion_token || ''); // password-protected: unlock now with the password we already have (#26) if ($('haspw').checked && data.id) {