Files
billing/app/error.tsx
zeekayandHanzo Dev b35157282d fix(theme): one ink, one ground — the light flip actually flips
The Tailwind strip left the colour *values* behind: markup still named
literal whites and dark-theme hexes, so `html.light` moved the tokens and
nothing followed. Light mode rendered near-black text on a near-black page.

Same four facts, each with one home now:

  ground      bg-[#09090b] · bg-[#141419] · bg-[#0d0d10] · bg-[#16161c]
              -> bg-bg · bg-bg-card · bg-bg-elevated
  ink         the whole `*-white/α` family is really "foreground at α%",
              so it says so: `-ink/α`, mixed from var(--color-text)
  brand       bg-white + text-black pills -> bg-brand + text-brand-foreground
              (+ .bg-brand-foreground, which the switch knob needed — it was
              painting white on the white ON-track and vanishing)
  selection   one rule for both themes; the light override painted white
              text on a pale tint

/commerce styled itself entirely with inline dark literals and ignored the
flip wholesale — 82 unreadable elements. Its hexes and rgba(255,255,255,α)
now read the same tokens, and the H-mark inherits currentColor instead of
being permanently white.

Also: every self-navigation goes through BASE_PATH. /plans, /transactions,
/payment-methods and the auth callback jumped to a bare '/', which walks the
browser out of the app whenever the SPA is mounted at /admin/billing inside
the commerce binary. billing-shell already did this for /topup — now it is
the only way.

Verified: next build green; Playwright over the static export in both
themes — light /commerce 82 unreadable -> 0, /plans -> /admin/billing/#pricing
(was the server root); dark render byte-identical in intent (same alphas,
now expressed in oklab).

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-04 17:58:21 -07:00

32 lines
1015 B
TypeScript

'use client'
export default function ErrorPage({
error,
reset,
}: {
error: Error & { digest?: string }
reset: () => void
}) {
return (
<main className="flex min-h-screen items-center justify-center bg-bg p-8">
<div className="max-w-lg rounded-2xl border border-border bg-bg-card p-8 text-center">
<h1 className="text-lg font-semibold text-text">Something went wrong</h1>
<pre className="mt-4 max-h-40 overflow-auto rounded-lg bg-black/30 p-3 text-left text-xs text-red-400">
{error.message}
</pre>
{error.stack && (
<pre className="mt-2 max-h-40 overflow-auto rounded-lg bg-black/30 p-3 text-left text-[10px] text-ink/30">
{error.stack}
</pre>
)}
<button
onClick={reset}
className="mt-6 inline-block rounded-lg bg-brand px-4 py-2 text-sm font-medium text-brand-foreground transition hover:bg-brand-hover"
>
Try again
</button>
</div>
</main>
)
}