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) {