WFDASH-WEBAPP/src/lib/themes.ts
SJCoetz 7a68cafe35 chore: add logos, opencode config and build assets
This commit includes the temporary Next.js build cache files, public brand
logos, and project configuration added in this change.
2026-07-27 08:21:20 +02:00

321 lines
No EOL
10 KiB
TypeScript

/**
* WFDASH theme registry.
*
* Base themes inspired by real product surfaces. Each theme is just a
* set of OKLCH tokens (already defined in src/styles/themes.css via the
* `data-theme="<id>"` selector) and a pair of font CSS-var names.
*
* The picker just flips `data-theme` on <html> and `class` (`.dark` for dark
* mode). No inline-style overrides, no custom-theme builder, no
* `!important` theme-specific component rules.
*
* If a theme doesn't define a `.dark` variant, it falls back to the
* `data-theme="<id>"` light block — light mode is the default.
*/
import type { ThemeDefinition } from "@/lib/theme-types";
export const THEMES: ThemeDefinition[] = [
{
id: "crisp",
label: "Crisp",
tagline: "Calm, neutral, default. Easiest to ship.",
accent: "#4C96D7",
accentSoft: "#DCE9F6",
accentOnDark: "#7AB7E8",
surface: "#F8FAFC",
surfaceDark: "#0B1220",
ink: "#0F172A",
inkDark: "#E6ECF5",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.625rem",
reference: "Default",
category: "standard",
},
{
id: "airbnb",
label: "Airbnb",
tagline: "Warm white + Rausch. Photography-led, restrained copy.",
accent: "#FF385C",
accentSoft: "#FFE3E8",
accentOnDark: "#FF6B82",
surface: "#FFFFFF",
surfaceDark: "#161617",
ink: "#222222",
inkDark: "#F7F7F7",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.5rem",
reference: "Airbnb",
category: "standard",
},
{
id: "airtable",
label: "Airtable",
tagline: "Soft blue + cream. Spreadsheet-friendly, calm density.",
accent: "#3B82F6",
accentSoft: "#DBEAFE",
accentOnDark: "#60A5FA",
surface: "#FAF8F2",
surfaceDark: "#1B1D1F",
ink: "#1F2937",
inkDark: "#E5E7EB",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.375rem",
reference: "Airtable",
category: "standard",
},
{
id: "cursor",
label: "Cursor",
tagline: "Deep dark + violet. Editor at night, dev-tool energy.",
accent: "#A78BFA",
accentSoft: "#2D2640",
accentOnDark: "#C4B5FD",
surface: "#0E0E12",
surfaceDark: "#0E0E12",
ink: "#E7E7EA",
inkDark: "#E7E7EA",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.5rem",
reference: "Cursor",
category: "dark",
},
{
id: "supabase",
label: "Supabase",
tagline: "Deep green-black. Dense panels, generous data surface.",
accent: "#3ECF8E",
accentSoft: "#0E2A1D",
accentOnDark: "#3ECF8E",
surface: "#1C1C1C",
surfaceDark: "#1C1C1C",
ink: "#EDEDED",
inkDark: "#EDEDED",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.5rem",
reference: "Supabase",
category: "dark",
},
/* ─────────────────────────────────────────────────────────────────────
* Brand-inspired themes (added 2026-07)
* Revolut / NVIDIA / Ant / Energetic / Artistic / MiniMax /
* Cosmic / Neon — all token-driven, no inline-style fights.
* ─────────────────────────────────────────────────────────────────── */
{
id: "revolut",
label: "Revolut",
tagline: "Soft off-black canvas + electric mint. Premium fintech.",
accent: "#0AE2A2",
accentSoft: "#0D2B22",
accentOnDark: "#3FF1B9",
surface: "#0E0F12",
surfaceDark: "#0E0F12",
ink: "#F5F6F8",
inkDark: "#F5F6F8",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.75rem",
reference: "Revolut",
category: "dark",
},
{
id: "nvidia",
label: "NVIDIA",
tagline: "Pure black + signature green. Engineering precision.",
accent: "#76B900",
accentSoft: "#0E1A06",
accentOnDark: "#9CE02A",
surface: "#0A0A0A",
surfaceDark: "#0A0A0A",
ink: "#EDEDED",
inkDark: "#EDEDED",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.375rem",
reference: "NVIDIA",
category: "dark",
},
{
id: "ant",
label: "Ant",
tagline: "Cool grey + Ant blue. Calm enterprise density.",
accent: "#1677FF",
accentSoft: "#E6F0FF",
accentOnDark: "#4096FF",
surface: "#F5F7FA",
surfaceDark: "#1A1D23",
ink: "#1F2329",
inkDark: "#E8EAED",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.375rem",
reference: "Ant Group",
category: "standard",
},
{
id: "energetic",
label: "Energetic",
tagline: "Bone-white + atomic orange. Sports broadcast energy.",
accent: "#FF4D2E",
accentSoft: "#FFE4DE",
accentOnDark: "#FF7A5C",
surface: "#FAFAF7",
surfaceDark: "#13110E",
ink: "#161514",
inkDark: "#F2EFE9",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.5rem",
reference: "Custom",
category: "standard",
},
{
id: "artistic",
label: "Artistic",
tagline: "Warm cream + ink + magenta. Editorial gallery feel.",
accent: "#E63A8E",
accentSoft: "#FCE4F0",
accentOnDark: "#F269AE",
surface: "#F7F2E9",
surfaceDark: "#1A1714",
ink: "#1B1815",
inkDark: "#F2EDE3",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.5rem",
reference: "Custom",
category: "standard",
},
{
id: "MiniMax",
label: "MiniMax",
tagline: "Cool charcoal + electric violet. Modern AI product surface.",
accent: "#7C5CFF",
accentSoft: "#1F1A33",
accentOnDark: "#A48BFF",
surface: "#111114",
surfaceDark: "#111114",
ink: "#ECECF1",
inkDark: "#ECECF1",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.625rem",
reference: "MiniMax",
category: "dark",
},
{
id: "cosmic",
label: "Cosmic",
tagline: "Deep indigo + electric cyan. Futuristic, immersive.",
accent: "#22D3EE",
accentSoft: "#0E2236",
accentOnDark: "#5AE8F7",
surface: "#0B1023",
surfaceDark: "#0B1023",
ink: "#E2E8F0",
inkDark: "#E2E8F0",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.75rem",
reference: "Custom",
category: "dark",
},
{
id: "neon",
label: "Neon",
tagline: "Pure black + magenta / cyan double-flourish. Synthwave.",
accent: "#FF2D92",
accentSoft: "#1A0612",
accentOnDark: "#FF5DAB",
surface: "#07030C",
surfaceDark: "#07030C",
ink: "#F2EFFF",
inkDark: "#F2EFFF",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.5rem",
reference: "Custom",
category: "dark",
},
/* ─────────────────────────────────────────────────────────────────────
* Brand theme added 2026-07 — Tangerine. Vendor-supplied OKLCH tokens
* mapped onto the standard WFDash picker-card hex shape. Hex values
* here are picker-only (chip + chip-soft + dark-mode preview). The
* actual on-screen colours come from themes.css via data-theme="tangerine".
* ─────────────────────────────────────────────────────────────────── */
{
id: "tangerine",
label: "Tangerine",
tagline: "Warm tangerine + cool neutral. Friendly operator surface.",
accent: "#D26A2A",
accentSoft: "#FBE6D6",
accentOnDark: "#F4A465",
surface: "#ECEEF0",
surfaceDark: "#20222E",
ink: "#525252",
inkDark: "#EBEBEB",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.75rem",
reference: "Custom",
category: "standard",
},
/* ─────────────────────────────────────────────────────────────────────
* Lime — added 2026-07-21. Bright lime primary (#aff33e) on bone-white
* (light) / near-black slate (dark). Hex values here are picker-only;
* the on-screen tokens come from themes.css via data-theme="lime".
* ─────────────────────────────────────────────────────────────────── */
{
id: "lime",
label: "Lime",
tagline: "Fresh lime + clean neutrals. Bright, energetic surface.",
accent: "#aff33e",
accentSoft: "#E4FAB5",
accentOnDark: "#aff33e",
surface: "#fbfcf8",
surfaceDark: "#020617",
ink: "#0f172a",
inkDark: "#f8fafc",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "1rem",
reference: "Custom",
category: "standard",
},
/* ─────────────────────────────────────────────────────────────────────
* WFDASH — brand theme added 2026-07-26. Palette sampled directly from
* /public/wfdash-logo.png so the in-app shell reads as the same brand
* surface as the logo. Defined in src/styles/themes.css via
* `data-theme="wfdash"` (light + dark variants — dark mode matches the
* logo canvas exactly). Hex values here are picker-only; the on-screen
* tokens come from themes.css.
* ─────────────────────────────────────────────────────────────────── */
{
id: "wfdash",
label: "WFDASH",
tagline: "Brand theme. Logo navy + brand blue. The new default.",
accent: "#377DCF",
accentSoft: "#DDE9F7",
accentOnDark: "#7AB7E8",
surface: "#F2F5FB",
surfaceDark: "#080E1D",
ink: "#0F1A2E",
inkDark: "#E8EEF7",
fontHeading: "var(--font-inter)",
fontBody: "var(--font-inter)",
radius: "0.625rem",
reference: "WFDASH",
category: "standard",
},
];
export const DEFAULT_THEME_ID = "wfdash";
export function getThemeById(id: string | null | undefined): ThemeDefinition {
return THEMES.find((t) => t.id === id) ?? THEMES[0];
}