Add admin-configurable branding (colors, logo, favicon) and generic default fallbacks

Site Settings -> Branding now supports a Primary/Secondary/Accent brand color
system applied site-wide (buttons, nav, hover states, links) and to outgoing
email header/CTA colors, plus a favicon upload alongside the existing logo
upload, a live preview panel (website/email x desktop/mobile), and
logo-based color suggestions. The setup wizard's Branding step got the same
treatment. Fixes two related bugs found along the way: the setup wizard's
logo/favicon upload was missing its auth token, and a static favicon.ico in
Next's special app/ convention path was silently overriding the dynamic one.

Also replaces every "Hope Events"/"Hope Family Church" default (org name,
email subjects, WhatsApp messages, report metadata, API docs) with a neutral
"Cross Code" placeholder, and the optional legal settings (operator name, IO
details, website URL, effective date) with obviously-generic placeholders
instead of defaulting to real personal/organisational details -- since this
platform is deployed for multiple organisations. Adds SETTINGS.md documenting
every setting's default behaviour.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-20 14:49:51 +02:00
co-authored by Claude Sonnet 5
parent 2d99b7cafe
commit 86af7093ac
33 changed files with 1174 additions and 198 deletions
+17 -15
View File
@@ -39,22 +39,24 @@ module.exports = {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
// Fixed indigo/purple brand scale — the site's hard-coded design-system
// color. Use this (not `indigo-*`/`blue-*` literals) for anything that
// isn't a shadcn primitive: nav active-states, icon chips, the help FAB,
// etc. Never bind this scale to the admin-configurable accent_color
// setting (see globals.css) — that stays an inline style on the org name only.
// Brand scale — the site's primary design-system color. Use this (not
// `indigo-*`/`blue-*` literals) for anything that isn't a shadcn
// primitive: nav active-states, icon chips, the help FAB, etc.
// Values come from CSS custom properties set at request-time in
// layout.tsx from the admin's saved `primary_color` setting (see
// colorScale.ts's buildBrandScale + globals.css for the static
// fallback defaults used when no setting is saved yet).
brand: {
50: "#EEF2FF",
100: "#E0E7FF",
200: "#C7D2FE",
300: "#A5B4FC",
400: "#818CF8",
500: "#6366F1",
600: "#4F46E5",
700: "#4338CA",
800: "#3730A3",
900: "#312E81",
50: "var(--brand-50)",
100: "var(--brand-100)",
200: "var(--brand-200)",
300: "var(--brand-300)",
400: "var(--brand-400)",
500: "var(--brand-500)",
600: "var(--brand-600)",
700: "var(--brand-700)",
800: "var(--brand-800)",
900: "var(--brand-900)",
},
},
borderRadius: {