From fd94e824df3f901cbcb3ac70f3556ce07638d280 Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:11:07 +0100 Subject: [PATCH 01/45] refactor(web): align dashboard tokens with Charter palette --- apps/web/tailwind.config.ts | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts index 9f4d7b5..db2fdcb 100644 --- a/apps/web/tailwind.config.ts +++ b/apps/web/tailwind.config.ts @@ -10,9 +10,9 @@ const config: Config = { colors: { // Charter palette — deep slate canvas with a restrained teal accent. canvas: { - DEFAULT: '#0b0f14', - raised: '#111823', - overlay: '#1a2534', + DEFAULT: '#EEEBE2', + raised: '#FBFAF6', + overlay: '#E2DED3', }, // Primary ink. CSS-variable-backed so each root layout owns its value: // the dashboard falls back to its light-on-dark text, while the @@ -21,24 +21,24 @@ const config: Config = { // (#e6edf3 / #8b98a9 / #5a6675), so omitting the variable — as the // dashboard does — renders it identically. ink: { - DEFAULT: 'rgb(var(--color-ink, 230 237 243) / )', - muted: 'rgb(var(--color-ink-muted, 139 152 169) / )', - faint: 'rgb(var(--color-ink-faint, 90 102 117) / )', + DEFAULT: 'rgb(var(--color-ink, 20 23 31) / )', + muted: 'rgb(var(--color-ink-muted, 76 78 82) / )', + faint: 'rgb(var(--color-ink-faint, 112 110 103) / )', }, accent: { - DEFAULT: '#2dd4bf', - hover: '#5eead4', - muted: '#134e4a', + DEFAULT: '#D8A93B', + hover: '#E2B84F', + muted: '#F0DFB2', }, // Info semantic — for neutral status (pending requests, informational badges) info: { - DEFAULT: '#60a5fa', - muted: '#1e3a5f', + DEFAULT: '#9A7218', + muted: '#F0DFB2', }, - line: '#1e2a3a', - danger: '#f87171', - warn: '#fbbf24', - ok: '#34d399', + line: '#14171F', + danger: '#B8462F', + warn: '#9A7218', + ok: '#3F8F5F', // Marketing (landing) palette — soft rounded neo-brutalism on light // paper. Additive: the dashboard never references these tokens. Gold is // the only decorative color; green and red are state-only. The footer @@ -51,10 +51,10 @@ const config: Config = { }, // Custom shadows for depth and glow effects boxShadow: { - 'inner-highlight': 'inset 0 1px 0 rgba(255, 255, 255, 0.03)', - 'glow-accent': '0 0 12px rgba(45, 212, 191, 0.2)', - 'glow-warn': '0 0 8px rgba(251, 191, 36, 0.4)', - 'glow-danger': '0 0 12px rgba(248, 113, 113, 0.15)', + 'inner-highlight': 'none', + 'glow-accent': 'none', + 'glow-warn': 'none', + 'glow-danger': 'none', // Neo-brutalist offset shadows for the marketing surfaces: a hard ink // edge with no blur. Hover collapses the 4px offset toward the surface. brutal: '4px 4px 0 #14171F', From 20a15bbd81b9aeab154883e35e77508c1d6685a8 Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:14:44 +0100 Subject: [PATCH 02/45] refactor(web): adopt Charter typography in app shell --- apps/web/app/(app)/layout.tsx | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/web/app/(app)/layout.tsx b/apps/web/app/(app)/layout.tsx index 8c86e4a..2fb2760 100644 --- a/apps/web/app/(app)/layout.tsx +++ b/apps/web/app/(app)/layout.tsx @@ -1,5 +1,5 @@ import type { Metadata } from 'next'; -import { Inter, JetBrains_Mono } from 'next/font/google'; +import { IBM_Plex_Mono, Inter, Space_Grotesk } from 'next/font/google'; import type { ReactNode } from 'react'; import { SiteHeader } from '@/components/site-header'; @@ -9,14 +9,23 @@ import '../globals.css'; // One sans family, one mono. The mono carries addresses, hashes, and amounts — // anything where character alignment aids scanning; the sans carries everything // else. Both are wired to the CSS variables globals.css references. -const sans = Inter({ +const display = Space_Grotesk({ subsets: ['latin'], - variable: '--font-sans', + weight: ['700'], + variable: '--font-display', display: 'swap', }); -const mono = JetBrains_Mono({ +const body = Inter({ subsets: ['latin'], + weight: ['400', '500'], + variable: '--font-body', + display: 'swap', +}); + +const mono = IBM_Plex_Mono({ + subsets: ['latin'], + weight: ['500'], variable: '--font-mono', display: 'swap', }); @@ -29,8 +38,8 @@ export const metadata: Metadata = { export default function AppLayout({ children }: { children: ReactNode }) { return ( - - + +
{children}
From cd968c6c410babc8e28da83ae7bfe068eab6ebb5 Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:16:16 +0100 Subject: [PATCH 03/45] refactor(web): switch app root to light paper theme --- apps/web/app/globals.css | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index 5f62651..0ef56e5 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -3,18 +3,25 @@ @tailwind utilities; :root { - --font-sans: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + --font-body: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + --font-display: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; --font-mono: ui-monospace, 'SF Mono', 'Cascadia Code', 'Fira Code', monospace; } html { - color-scheme: dark; + color-scheme: light; } body { @apply bg-canvas text-ink antialiased; } +.app-root { + --color-ink: 20 23 31; + --color-ink-muted: 76 78 82; + --color-ink-faint: 112 110 103; +} + /* The marketing (landing) group opts into the light neo-brutalist theme. It owns its own / via the (marketing) route group, so scoping the override to this class leaves the dashboard's dark defaults untouched. @@ -98,16 +105,16 @@ dialog[open]::backdrop { } } -/* Thin, unobtrusive scrollbars that match the dark canvas. */ +/* Thin scrollbars that sit quietly against the warm paper canvas. */ * { scrollbar-width: thin; - scrollbar-color: #1e2a3a transparent; + scrollbar-color: #14171f transparent; } *::-webkit-scrollbar { width: 8px; height: 8px; } *::-webkit-scrollbar-thumb { - background-color: #1e2a3a; + background-color: #14171f; border-radius: 4px; } From 91b95257f87bf0fbef96b9c2dc418b63d38fa6bf Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:18:57 +0100 Subject: [PATCH 04/45] refactor(web): remove gradient from loading shimmer --- apps/web/app/globals.css | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index 0ef56e5..30ee38d 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -51,19 +51,16 @@ body { .shimmer::after { content: ''; position: absolute; - inset: 0; + inset-block: 0; + left: 0; + width: 35%; transform: translateX(-100%); - background: linear-gradient( - 90deg, - transparent 0%, - rgba(255, 255, 255, 0.04) 50%, - transparent 100% - ); + background: rgb(251 250 246 / 0.72); animation: shimmer 1.6s ease-in-out infinite; } @keyframes shimmer { 100% { - transform: translateX(100%); + transform: translateX(390%); } } @@ -101,7 +98,7 @@ dialog[open]::backdrop { @media (prefers-reduced-transparency: reduce) { dialog[open]::backdrop { backdrop-filter: none; - background-color: rgb(11 15 20 / 0.92); + background-color: rgb(20 23 31 / 0.82); } } From 4c7cf9055bffa93aa1190e571be34461b19bf67e Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:20:10 +0100 Subject: [PATCH 05/45] feat(web): add accessible dashboard content frame --- apps/web/app/(app)/layout.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/web/app/(app)/layout.tsx b/apps/web/app/(app)/layout.tsx index 2fb2760..e2eb929 100644 --- a/apps/web/app/(app)/layout.tsx +++ b/apps/web/app/(app)/layout.tsx @@ -41,8 +41,19 @@ export default function AppLayout({ children }: { children: ReactNode }) { + + Skip to dashboard content + -
{children}
+
+ {children} +
From 4581189fdfdef6f56229d48b38c15b284bb843b7 Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:21:12 +0100 Subject: [PATCH 06/45] refactor(web): restyle dashboard header surface --- apps/web/components/site-header.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/components/site-header.tsx b/apps/web/components/site-header.tsx index 4cc111b..6cf70ed 100644 --- a/apps/web/components/site-header.tsx +++ b/apps/web/components/site-header.tsx @@ -11,8 +11,8 @@ import { WalletButton } from './wallet-button'; export function SiteHeader() { return ( -
-
+
+
Date: Fri, 14 Aug 2026 15:23:12 +0100 Subject: [PATCH 07/45] refactor(web): give app header a Charter wordmark --- apps/web/components/site-header.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/apps/web/components/site-header.tsx b/apps/web/components/site-header.tsx index 6cf70ed..f6aff55 100644 --- a/apps/web/components/site-header.tsx +++ b/apps/web/components/site-header.tsx @@ -15,14 +15,12 @@ export function SiteHeader() {
- - - - + + C - Charter + Charter From 73a52a49a88e74b4be6c5c50ff2d985c592ccaee Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:24:34 +0100 Subject: [PATCH 08/45] feat(web): add dashboard and docs header links --- apps/web/components/site-header.tsx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/web/components/site-header.tsx b/apps/web/components/site-header.tsx index f6aff55..0e95f52 100644 --- a/apps/web/components/site-header.tsx +++ b/apps/web/components/site-header.tsx @@ -23,7 +23,23 @@ export function SiteHeader() { Charter - +
+ + Organizations + + + Docs + + +
); From b68df53f761bea3ac99e591aaf1cb4e803e5f822 Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:25:45 +0100 Subject: [PATCH 09/45] refactor(web): restyle wallet connect action --- apps/web/components/wallet-button.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/web/components/wallet-button.tsx b/apps/web/components/wallet-button.tsx index a5e9c22..f7b8b8a 100644 --- a/apps/web/components/wallet-button.tsx +++ b/apps/web/components/wallet-button.tsx @@ -31,10 +31,11 @@ export function WalletButton() { onClick={() => void connect()} disabled={connecting} className={cn( - 'inline-flex h-9 items-center gap-2 rounded-lg px-4 text-sm font-medium', - 'bg-accent text-canvas transition-colors duration-150', - 'hover:bg-accent-hover', - 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-canvas', + 'inline-flex min-h-10 items-center gap-2 rounded-card border-2 border-ink px-4 text-sm font-medium', + 'bg-ledger-gold text-ink shadow-brutal transition-[background-color,box-shadow,transform] duration-150', + 'hover:bg-accent-hover hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-brutal-pressed', + 'active:translate-x-0.5 active:translate-y-0.5 active:shadow-brutal-pressed', + 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ink focus-visible:ring-offset-2 focus-visible:ring-offset-paper-raised', 'disabled:cursor-not-allowed disabled:opacity-60', )} > From 48635ddacb6c7ca9df38ab1f3c453c40d16237be Mon Sep 17 00:00:00 2001 From: fadesany Date: Fri, 14 Aug 2026 15:27:06 +0100 Subject: [PATCH 10/45] refactor(web): restyle connected wallet control --- apps/web/components/wallet-button.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/web/components/wallet-button.tsx b/apps/web/components/wallet-button.tsx index f7b8b8a..38c9138 100644 --- a/apps/web/components/wallet-button.tsx +++ b/apps/web/components/wallet-button.tsx @@ -75,15 +75,17 @@ function AccountPill({ address, network }: { address: string; network: string }) type="button" popoverTarget={popoverId} className={cn( - 'inline-flex h-9 items-center gap-2 rounded-lg border border-line px-3 text-sm', - 'bg-canvas-raised text-ink transition-colors duration-150', - 'hover:border-accent-muted hover:bg-canvas-overlay', - 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-canvas', + 'inline-flex min-h-10 items-center gap-2 rounded-card border-2 border-ink px-3 text-sm', + 'bg-paper-raised text-ink shadow-brutal transition-[background-color,box-shadow,transform] duration-150', + 'hover:bg-canvas-overlay hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-brutal-pressed', + 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ink focus-visible:ring-offset-2 focus-visible:ring-offset-paper-raised', )} > - + {truncateAddress(address)} - {network} + + {network} +
Date: Fri, 14 Aug 2026 15:28:47 +0100 Subject: [PATCH 11/45] refactor(web): rebuild wallet account popover --- apps/web/components/wallet-button.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/web/components/wallet-button.tsx b/apps/web/components/wallet-button.tsx index 38c9138..df64969 100644 --- a/apps/web/components/wallet-button.tsx +++ b/apps/web/components/wallet-button.tsx @@ -92,22 +92,22 @@ function AccountPill({ address, network }: { address: string; network: string }) popover="auto" id={popoverId} className={cn( - 'mt-2 w-64 rounded-xl border border-line bg-canvas-raised p-3 text-sm shadow-2xl', + 'mt-2 w-72 rounded-card border-2 border-ink bg-paper-raised p-4 text-sm shadow-brutal', // Anchor to the trigger's right edge; the popover sits in the top layer // so it is never clipped by the header. - 'inset-[unset] right-4 top-14 left-[unset]', + 'inset-[unset] right-4 top-16 left-[unset]', )} > -

Connected account

-

{address}

+

Connected account

+

{address}