Vellum
Minimal design system for jamesatk.in.
Palette
Named colours. Use CSS tokens, not raw hex values.
Typography
Bell MT for content. PT Mono for metadata, UI, and code. Never swap them.
Bell MT — headings & body
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox
The quick brown fox
Language is the dress of thought, and a clear sentence is a well-fitted garment.
PT Mono — metadata, UI & code
npm installSpacing & Shape
Consistent radii and structural dividers.
--border-amount: 8px
.nav-divider
2px solid
1px solid / 0.2 opacity
680px
Components
Live rendered. Hover to see interactive states.
Link — default (animated underline)
a (global) · underline via background-size
trick
Tags
.post-meta__tag · vergaut border & colour
Inline code
Install with
npm install
or run
make build.
.post__codespan · ecru background
Code block
func greet(name string) string {
return fmt.Sprintf("Hello, %s", name)
}
.post__pre[data-lang] / .post__code · ecru
background, lang label top-right
Blockquote
The hand, the head, and the heart of a craftsman must go together.
.post__blockquote · 3px deep-black left border,
italic
Horizontal rule
.post__hr · 1px, 0.2 opacity
Writing list item
.writing-list / .writing-list__link /
.writing-list__title / .writing-list__subtitle
Portfolio card
.portfolio-box / .project-name2 · 2px deep-black
border, border-radius
Syntax Highlighting
Kimbie Light via highlight.js. Background overridden to
--ecru for palette
cohesion.
def fibonacci(n: int) -> list[int]:
sequence = [0, 1]
while len(sequence) < n:
sequence.append(sequence[-1] + sequence[-2])
return sequence[:n]
type Repository interface {
FindByID(ctx context.Context, id string) (*User, error)
Save(ctx context.Context, user *User) error
}
Usage Rules
For porting Vellum to a new surface (Obsidian, Markdeep, etc.), apply these constraints.
- Page background is always
off-white
#faf8f4. Never ecru — ecru is a surface colour only. - Red ochre is currently the only interactive accent. Use it for links and active states. Do not introduce other accent colours for interactivity.
- Vergaut is currently for taxonomic elements only — tags, categories, labels. Not for links or buttons.
- Woad is another accent. Use it if a third accent is genuinely required, or for dark-mode surfaces.
- Bell MT is the reading font. Use it for all long-form prose and headings. Fallback: Georgia, serif.
- PT Mono signals metadata, system, or code context. Never use it for running prose. Fallback: monospace.
- Code blocks and inline code always use an ecru background. On dark surfaces, use a darkened ecru equivalent rather than a pure black terminal look.
- Borders and rules use deep-black at varying opacity: 100% structural, ~15% subtle containers, ~8% hairlines.
- Border radius is 8px everywhere. Do not mix radius values.
- The animated underline on links (CSS
background-sizetransition) is a core interaction pattern — preserve it on any ported theme that supports CSS transitions.