Hashton
HASHTON

Design system

Shared criteria for how Hashton looks and behaves

Tokens, type, motifs, and primitives — so every surface stays geometric, engineer-precise, and aligned with the # mark. One system. No template drift.

Foundations

What is this?

A living scoring guide for Hashton UI — the same idea as a rubric applied to design. Visible standards so screens don’t invent their own language.

Brand fit

Hashton sells direct engineer work, not agency theatre. The system should feel sharp, dark, and intentional — clip notches, hash geometry, blue→violet brand energy.

What it covers

Color and type tokens in globals.css, notes in DESIGN.md, primitives in @/components/ui, and this page at /design-system.

Foundations

How we use it

Build UI from these tokens and primitives — don’t invent one-off styles when something already exists.

  • Prefer semantic tokens (bg-bg, text-fg-subtle) over raw hex.
  • Primary actions use <Button> — brand gradient, clip-notch, 44px targets.
  • Dropdowns use <Select> — custom listbox, Geist Mono, never native OS menus.
  • Display type is Syne; body is Geist; labels and CTAs are Geist Mono.
  • Body copy stays ≥16px. Only mono eyebrows / labels may go smaller.
  • When you add or change a primitive, update this page in the same change.

Foundations

Colors

Near-black surfaces with AAA text hierarchy and brand mark blues → violets. Tokens live in globals.css and map through @theme.

bg

--bg

bg-elevated

--bg-elevated

fg

--fg

fg-subtle

--fg-subtle

muted

--muted

border

--border

border-strong

--border-strong

brand-ice

--brand-ice

brand-blue

--brand-blue

brand-indigo

--brand-indigo

brand-violet

--brand-violet

brand-core

--brand-core

glow-magenta

--glow-magenta

glow-cyan

--glow-cyan

glow-navy

--glow-navy

focus-ring

--focus-ring

brand CTA gradient

Engineer-built

brand gradient text sample

Foundations

Typography

Syne for display. Geist for body. Geist Mono for labels, meta, and CTAs. Readable copy stays at ≥16px.

RoleFamilyUseSample
displaySyneH1–H2, wordmark, titlesBuilt fast
sansGeistBody, support copyBody copy sample
monoGeist MonoLabels, buttons, metaSection label

Syne — The quick brown fox

Geist Sans — The quick brown fox jumps over the lazy dog.

Geist Mono — const ready = true;

Foundations

Motifs

Geometric language tied to the # mark — not soft SaaS chrome.

Hash grid

.hash-grid — soft geometric overlay on atmospheric surfaces.

Clip notch

Clip notch

.clip-notch — cut corner on CTA faces; focus ring stays on the outer control.

Hero mesh

HeroMesh — WebGL navy / blue / violet field via @mesh-gradient/react. Respects prefers-reduced-motion.

Foundations

Accessibility pledge

We aim for WCAG 2.2 Level AAA targets on this marketing site — contrast, type size, and hit areas are part of the brand, not bolted on.

  • Contrast & color — text tokens tuned for ≥7:1 on --bg; don’t rely on color alone.
  • Readable type — body stays ≥16px; mono labels ≥14px.
  • Keyboard & focus — interactive controls expose a visible white focus ring; targets ≥44px.
  • Motion — hero mesh, hook dissolves, and service motifs respect prefers-reduced-motion.

Components

Primitive showcase

Live demos of UI primitives. New primitives belong here in the same PR.

Button

Primary, secondary, and accent actions. Variants: brand (default), accent, secondary, ghost. Sizes: md, lg, xl. Clip-notch on the face; focus ring on the outer control.

Select

Custom listbox — Geist Mono, sharp corners, white focus ring, 44px target. Optional tone on options for colour-coded filters. Use name in forms. Do not use native <select>.

Filters and form field

Badge

Compact status and offer labels. Tones: muted, slate, amber, sky, teal, purple, emerald, red, brand, violet.

ConversionBrochureNewDraftedContactedRepliedMeetingWonLost

Input

Text fields, textareas, and Field labels. Sharp corners, 44px minimum height, white focus ring.