ux(brand): logomark — three offset gold bars + bolder wordmark
Some checks failed
CI / Web — typecheck + lint + build (push) Failing after 45s
CI / Scripts — Python smoke (push) Failing after 6s
CI / Web — npm audit (push) Failing after 35s
CI / Retrieval — golden set (Recall@5 + MRR) (push) Failing after 7s

The lone "▍ The Disclosure Bureau" glyph read as a stray vertical bar next
to small mono text — easy to lose against the navbar links. The brand
needed visible weight without inventing a logotype from scratch.

- BrandMark (new) — small inline SVG-free mark: three rounded gold bars
  at decreasing heights (100% / 70% / 45%), suggesting a redaction edge
  or a stack of classified-page tabs. Each bar lifts 1px on hover, so the
  mark gets a subtle physical response without animation libraries.
- Wordmark switched to font-display font-semibold (was display regular)
  and bumped to 19/20px so it carries the row.
- On desktop a tiny "CLASSIFIED · PUBLIC RECORD" microline in #5a6678
  monospace sits beneath the wordmark; it disappears on mobile to keep
  the row tight inside the drawer.
- Used in SiteHeader (every page) and inside the MobileNav drawer
  header — replaces the previous bare-text label there too.

Verified at desktop 1440 and mobile 600 widths.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Luiz Gustavo 2026-05-29 01:47:27 -03:00
parent df05b21dff
commit 590bb3283c
3 changed files with 62 additions and 9 deletions

View file

@ -0,0 +1,57 @@
/**
* BrandMark The Disclosure Bureau wordmark + mark.
*
* Small inline SVG (three offset gold bars suggesting a redaction edge / a
* classification stamp) paired with the serif wordmark and a tiny
* monospace "CLASSIFIED · PUBLIC RECORD" microline beneath. Used in
* SiteHeader on every page and inside the mobile drawer header. Keeps the
* brand presence consistent without depending on an external asset.
*
* Two sizes: `default` (header) and `compact` (mobile drawer).
*/
interface BrandMarkProps {
size?: "default" | "compact";
className?: string;
}
export function BrandMark({ size = "default", className = "" }: BrandMarkProps) {
const isCompact = size === "compact";
return (
<span className={`inline-flex items-center gap-2.5 group ${className}`}>
<span
aria-hidden="true"
className="inline-flex items-end gap-[2px]"
style={{ height: isCompact ? "20px" : "24px" }}
>
<span
className="block w-[3px] rounded-sm bg-[#e0c080] transition-transform group-hover:translate-y-[-1px]"
style={{ height: "100%" }}
/>
<span
className="block w-[3px] rounded-sm bg-[#e0c080]/70 transition-transform group-hover:translate-y-[-1px]"
style={{ height: "70%" }}
/>
<span
className="block w-[3px] rounded-sm bg-[#e0c080]/40 transition-transform group-hover:translate-y-[-1px]"
style={{ height: "45%" }}
/>
</span>
<span className="flex flex-col leading-none">
<span
className={
isCompact
? "font-display font-semibold text-[16px] text-[#e7ecf3] group-hover:text-[#e0c080] transition-colors"
: "font-display font-semibold text-[19px] md:text-[20px] text-[#e7ecf3] group-hover:text-[#e0c080] transition-colors"
}
>
The Disclosure Bureau
</span>
{!isCompact && (
<span className="hidden md:inline mt-1 font-mono text-[9px] uppercase tracking-[0.22em] text-[#5a6678]">
Classified · public record
</span>
)}
</span>
</span>
);
}

View file

@ -22,6 +22,7 @@ import { usePathname } from "next/navigation";
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
import { Menu, X } from "lucide-react"; import { Menu, X } from "lucide-react";
import { AuthBar } from "./auth-bar"; import { AuthBar } from "./auth-bar";
import { BrandMark } from "./brand-mark";
import { LocaleToggleClient } from "./locale-toggle-client"; import { LocaleToggleClient } from "./locale-toggle-client";
interface NavItem { interface NavItem {
@ -94,10 +95,7 @@ export function MobileNav({
{/* Panel */} {/* Panel */}
<div className="absolute top-0 right-0 h-full w-[85vw] max-w-sm bg-[#0d1220] border-l border-[rgba(224,192,128,0.20)] shadow-2xl flex flex-col"> <div className="absolute top-0 right-0 h-full w-[85vw] max-w-sm bg-[#0d1220] border-l border-[rgba(224,192,128,0.20)] shadow-2xl flex flex-col">
<div className="flex items-center justify-between px-4 py-4 border-b border-[rgba(224,192,128,0.15)]"> <div className="flex items-center justify-between px-4 py-4 border-b border-[rgba(224,192,128,0.15)]">
<span className="font-display text-lg text-[#e7ecf3]"> <BrandMark size="compact" />
<span className="text-[#e0c080] mr-1" aria-hidden="true"></span>
The Disclosure Bureau
</span>
<button <button
ref={closeBtnRef} ref={closeBtnRef}
type="button" type="button"

View file

@ -8,6 +8,7 @@
*/ */
import Link from "next/link"; import Link from "next/link";
import { AuthBar } from "./auth-bar"; import { AuthBar } from "./auth-bar";
import { BrandMark } from "./brand-mark";
import { LocaleToggle } from "./locale-toggle"; import { LocaleToggle } from "./locale-toggle";
import { MobileNav } from "./mobile-nav"; import { MobileNav } from "./mobile-nav";
import { NavLink } from "./nav-link"; import { NavLink } from "./nav-link";
@ -26,11 +27,8 @@ export function SiteHeader({ locale }: { locale: "pt-br" | "en" }) {
return ( return (
<header className="border-b border-[rgba(224,192,128,0.15)]"> <header className="border-b border-[rgba(224,192,128,0.15)]">
<div className="mx-auto max-w-7xl px-4 md:px-8 py-4 flex items-center justify-between gap-4"> <div className="mx-auto max-w-7xl px-4 md:px-8 py-4 flex items-center justify-between gap-4">
<Link href="/" className="flex items-center gap-2 group" aria-label="The Disclosure Bureau — home"> <Link href="/" aria-label="The Disclosure Bureau — home">
<span className="text-[#e0c080] text-lg" aria-hidden="true"></span> <BrandMark />
<span className="font-display text-xl text-[#e7ecf3] group-hover:text-[#e0c080] transition-colors">
The Disclosure Bureau
</span>
</Link> </Link>
{/* Desktop nav — hidden below md, shown md+. */} {/* Desktop nav — hidden below md, shown md+. */}