release: v0.20.0

This commit is contained in:
Ralksta
2026-10-02 18:14:23 +02:00
committed by GitHub
parent 81ce886b01
commit 5f831f719a
209 changed files with 13807 additions and 803 deletions

View File

@@ -36,6 +36,28 @@
--accent: var(--accent-dark, #e60012);
--accent-dim: color-mix(in srgb, var(--accent) 12%, transparent);
--on-accent: var(--on-accent-dark, #ffffff);
/* The accent as a text colour: the layout lifts it to 4.5:1 per mode
(accentText() in lib/config/theme.ts). Fills, borders and underlines keep
--accent; anything that is read uses this. The fallbacks are that
function's output for the default red. */
--accent-text: var(--accent-text-dark, #ef5965);
/* One focus ring for everything a visitor can focus, inputs included. The
contact form and the password field drew an accent ring over an accent
border while every link and button drew this one. */
--focus-ring: var(--text-primary);
/* The border that marks an input as an input (WCAG 1.4.11, 3:1). The
--border-subtle hairline measured 1.15–1.29:1 against the page;
--text-muted is checked at 4.5:1 against both page surfaces in every
preset, so borrowing it clears the bar with margin. */
--input-border: var(--text-muted);
/* Status that is not an error: the journal's draft badge. Per mode, like
--error; #eab308 read 1.4:1 on the light pages. */
--warning: #eab308;
color-scheme: dark;
/* Error and destructive text. One value per mode: no single red clears
4.5:1 on both a near-black and a near-white page (the fixed reds these
@@ -62,6 +84,13 @@
may be dark navy, neither of which marks anything on the overlay. */
--lightbox-fav: #ff6b6b;
/* The passepartout photo frame: the mat board, its edge, and the EXIF line
printed on it. --mat-text is checked at 4.5:1 against --mat-bg for every
preset and mode (lib/__tests__/passepartout-mat.test.ts). */
--mat-bg: #111111;
--mat-border: rgba(255, 255, 255, 0.12);
--mat-text: var(--text-muted);
--font-sans: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-serif: 'Playfair Display', Georgia, 'Times New Roman', serif;
--font-caption: 'EB Garamond', Georgia, serif;
@@ -96,8 +125,15 @@
--accent: var(--accent-light, #c8000f);
--accent-dim: color-mix(in srgb, var(--accent) 12%, transparent);
--on-accent: var(--on-accent-light, #ffffff);
--accent-text: var(--accent-text-light, #c8000f);
--error: #c62828;
--warning: #7a5600;
--mat-bg: #ffffff;
--mat-border: rgba(0, 0, 0, 0.1);
color-scheme: light;
}
/* ── Studio Modern: Leica Precision Palette ──────── */
@@ -143,7 +179,10 @@
--text-primary: #161614;
--text-secondary: #5a5a55;
--text-muted: #73736e;
/* #73736e passed on the page and on cards but not on --bg-secondary
(4.17:1) or --bg-card-hover (4.36:1). Darkened in equal steps so the
warm tint stays: 4.55:1 on --bg-secondary now. */
--text-muted: #6d6d68;
--border-subtle: rgba(0, 0, 0, 0.09);
--border-hover: rgba(0, 0, 0, 0.25);
@@ -225,6 +264,13 @@
--border-subtle: #2a2822;
--border-hover: #3a3830;
/* A warm mat. Both modes set it: this block comes after the generic light
one, so a light value left out here would lose to the dark one. */
--mat-bg: #1a1816;
--mat-border: rgba(196, 154, 60, 0.12);
/* --text-muted, a step lighter: it is 4.48:1 on this mat. */
--mat-text: #8c826f;
}
[data-preset='classic'][data-theme='light'] {
@@ -240,6 +286,10 @@
--border-subtle: #e5dfcf;
--border-hover: #d0c8b5;
--mat-bg: #fffdf5;
--mat-border: rgba(196, 154, 60, 0.2);
--mat-text: var(--text-muted);
}
/* ── Noir: Darkroom Analog Palette ───────────────── */
@@ -304,6 +354,207 @@
--border-hover: #cccccc;
}
/* ── Kunsthalle: Gallery Wall Palette ──────────── */
[data-preset='kunsthalle'] {
--bg-primary: #2b2b29;
--bg-secondary: #242422;
--bg-card: #323230;
--bg-card-hover: #393937;
--bg-overlay: rgba(36, 36, 34, 0.98);
--text-primary: #f0efeb;
--text-secondary: #c6c4bd;
--text-muted: #aba9a2;
--border-subtle: #3d3d3a;
--border-hover: #55554f;
--max-width: 1240px;
/* The default #ff6b6b reaches only 4.2:1 on the lighter grey card; this is 5.1:1 on every surface. */
--error: #ff8a80;
/* A grey board a step lighter than the wall, not the default black mat.
Both modes set it: this block comes after the generic light one. The
caption on it is --text-muted, 5.07:1. */
--mat-bg: #373735;
--mat-border: rgba(255, 255, 255, 0.08);
}
[data-preset='kunsthalle'][data-theme='light'] {
--bg-primary: #dddcd8;
--bg-secondary: #d4d3ce;
--bg-card: #e8e7e3;
--bg-card-hover: #e2e1dd;
--bg-overlay: rgba(221, 220, 216, 0.96);
--text-primary: #1b1b19;
--text-secondary: #3f3e3a;
--text-muted: #52514c;
--border-subtle: #c9c8c3;
--border-hover: #aeada7;
/* The default #c62828 reaches only 4.1:1 on the grey wall; this is 5.0:1 on every surface. */
--error: #a61b1b;
/* Warning text on the grey wall: 5.3:1, where an amber of #7a5600 is 4.4:1. */
--warning: #6b4b00;
/* A pale grey board on the grey wall. Caption (--text-muted): 6.79:1. */
--mat-bg: #eeede9;
--mat-border: rgba(0, 0, 0, 0.12);
}
/* ── Ma: Washi / Sumi Palette ──────────────────── */
[data-preset='ma'] {
--bg-primary: #1a1917;
--bg-secondary: #141311;
--bg-card: #21201d;
--bg-card-hover: #282623;
--bg-overlay: rgba(20, 19, 17, 0.98);
--text-primary: #ece7dd;
--text-secondary: #b5ad9f;
--text-muted: #978f82;
--border-subtle: #2c2a26;
--border-hover: #403d37;
--max-width: 1120px;
}
[data-preset='ma'][data-theme='light'] {
--bg-primary: #f0ede6;
--bg-secondary: #e7e3da;
--bg-card: #f6f4ef;
--bg-card-hover: #ebe7df;
--bg-overlay: rgba(240, 237, 230, 0.96);
--text-primary: #1f1d1a;
--text-secondary: #4d4943;
--text-muted: #66615a;
--border-subtle: #dcd7cc;
--border-hover: #c5bfb2;
/* The default #c62828 reaches only 4.4:1 on the washi secondary; this is 5.3:1 on every surface. */
--error: #b02020;
}
/* ── Cyanotype: Prussian Blue Palette ──────────── */
[data-preset='cyanotype'] {
--bg-primary: #0e1621;
--bg-secondary: #0a111a;
--bg-card: #132030;
--bg-card-hover: #192839;
--bg-overlay: rgba(10, 17, 26, 0.98);
--text-primary: #e3eaf0;
--text-secondary: #a8b7c6;
--text-muted: #8898ab;
--border-subtle: #1d2a3a;
--border-hover: #2e4056;
--max-width: 1440px;
}
[data-preset='cyanotype'][data-theme='light'] {
--bg-primary: #eef2f4;
--bg-secondary: #e3e9ec;
--bg-card: #f7f9fa;
--bg-card-hover: #e9eef1;
--bg-overlay: rgba(238, 242, 244, 0.96);
--text-primary: #10243a;
--text-secondary: #34495f;
--text-muted: #4f6379;
--border-subtle: #d2dce2;
--border-hover: #b3c3cd;
}
/* ── Salon: Velvet / Plaster Palette ───────────── */
[data-preset='salon'] {
--bg-primary: #1c1315;
--bg-secondary: #160f11;
--bg-card: #241a1c;
--bg-card-hover: #2c2023;
--bg-overlay: rgba(22, 15, 17, 0.98);
--text-primary: #f3eae7;
--text-secondary: #c5b1ad;
--text-muted: #aa938f;
--border-subtle: #34262a;
--border-hover: #4a383c;
--max-width: 1320px;
/* An oxblood board on the velvet wall, edged in the blush accent. Both
modes set it: this block comes after the generic light one. Caption
(--text-muted): 5.68:1. */
--mat-bg: #2e1a1e;
--mat-border: rgba(227, 163, 154, 0.16);
}
[data-preset='salon'][data-theme='light'] {
--bg-primary: #f5efec;
--bg-secondary: #ece3df;
--bg-card: #fbf8f6;
--bg-card-hover: #f1e9e5;
--bg-overlay: rgba(245, 239, 236, 0.96);
--text-primary: #271618;
--text-secondary: #573f42;
--text-muted: #6f5659;
--border-subtle: #e3d5d1;
--border-hover: #ccb8b3;
/* The default #c62828 reaches only 4.4:1 on the plaster secondary; this is 5.4:1 on every surface. */
--error: #b02020;
/* A plaster-rose board, rosier than the wall, edged in oxblood. Caption
(--text-muted): 5.38:1. */
--mat-bg: #f2e4df;
--mat-border: rgba(125, 31, 44, 0.16);
}
/* ── Birch: Birch / Pine Palette ───────────────── */
[data-preset='birch'] {
--bg-primary: #121613;
--bg-secondary: #0e110f;
--bg-card: #181d19;
--bg-card-hover: #1f2520;
--bg-overlay: rgba(14, 17, 15, 0.98);
--text-primary: #e9eee9;
--text-secondary: #aab5ac;
--text-muted: #8d9a90;
--border-subtle: #232b25;
--border-hover: #364039;
--max-width: 1400px;
}
[data-preset='birch'][data-theme='light'] {
--bg-primary: #f3f5f1;
--bg-secondary: #e9ece6;
--bg-card: #fbfcfa;
--bg-card-hover: #eef1eb;
--bg-overlay: rgba(243, 245, 241, 0.96);
--text-primary: #19201b;
--text-secondary: #434e46;
--text-muted: #5b675e;
--border-subtle: #dce1d9;
--border-hover: #c1c8be;
}
/* ── Reset ────────────────────────────────────────── */
*,
*::before,
@@ -352,6 +603,6 @@ select:focus-visible,
summary:focus-visible,
[role='button']:focus-visible,
[tabindex]:not([tabindex='-1']):focus-visible {
outline: 2px solid var(--text-primary);
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
}