Ink & Paper — a shadcn/ui theme for Tailwind v4
Newsprint and carbon — an editorial theme for reading, not clicking.
Ink & Paper is stark print contrast: a warm off-white newsprint background and a near-black carbon foreground, with the brand roles kept to the same two values so nothing on the page competes with the writing. It is the theme for a blog, a documentation site, or a long-form portfolio.
The pairing is the editorial classic — Playfair Display headlines over a humanist sans body — and the type scale is a generous perfect fourth so headings feel like headlines. Shadows are almost absent; paper does not float.
The eight color roles
Every shadcn/ui variable in the export derives from these eight. The dark values are not a second theme: they are the light roles with lightness moved, hue and saturation held, and each pair repaired until it meets its WCAG threshold.
| Role | Light | Dark |
|---|---|---|
| primary | #1f1f1f | #949494 |
| secondary | #1f1f1f | #8c8c8c |
| accent | #1f1f1f | #949494 |
| background | #f4f1ea | #1b170e |
| surface | #ede8dd | #2b2517 |
| text | #1e1b15 | #f7f5f3 |
| muted | #817864 | #37332a |
| border | #dbd8d0 | #6b6452 |
Typography
Playfair Display for headings, Source Serif 4 for body copy and ui-monospace for code, on a 16px base with a 1.333 modular ratio.
Shape and elevation
A 0.25rem base radius derives the --radius-sm/md/lg/xl steps; the base shadow derives the four-step elevation scale.
Extended tokens
Foregrounds, destructive, a five-step chart ramp and the sidebar set are derived from the roles — exactly the variables a Tailwind v4 shadcn/ui project reads.
The exported globals.css
This is the stylesheet the generator downloads for this preset — a Tailwind v4 @theme block that any shadcn/ui project can replace its own app/globals.css with. Open the preset in the generator to change anything, preview it on a full landing page, and add the derived .dark block or the W3C design-tokens export.
/* Ink & Paper — Tailwind v4 theme (generated from the styling step) */
@import "tailwindcss";
@theme {
--color-primary: #1f1f1f;
--color-secondary: #1f1f1f;
--color-accent: #1f1f1f;
--color-background: #f4f1ea;
--color-surface: #ede8dd;
--color-text: #1e1b15;
--color-muted: #817864;
--color-border: #dbd8d0;
--color-primary-foreground: #f4f1ea;
--color-secondary-foreground: #1e1b15;
--color-accent-foreground: #1e1b15;
--color-destructive: oklch(0.577 0.245 27.325);
--color-chart-1: #1f1f1f;
--color-chart-2: #1f1f1f;
--color-chart-3: #1f1f1f;
--color-chart-4: #817864;
--color-chart-5: #dbd8d0;
--color-sidebar: #ede8dd;
--color-sidebar-foreground: #1e1b15;
--color-sidebar-primary: #1f1f1f;
--color-sidebar-primary-foreground: #f4f1ea;
--color-sidebar-accent: #1f1f1f;
--color-sidebar-accent-foreground: #1e1b15;
--color-sidebar-border: #dbd8d0;
--color-sidebar-ring: #1f1f1f;
--font-heading: 'Playfair Display', Georgia, serif;
--font-body: 'Source Serif 4', Georgia, serif;
--font-mono: ui-monospace, SFMono-Regular, monospace;
--radius-sm: calc(0.25rem * 0.5);
--radius-md: 0.25rem;
--radius-lg: calc(0.25rem * 1.5);
--radius-xl: calc(0.25rem * 2);
--text-xs: 0.5625rem;
--text-sm: 0.75rem;
--text-base: 1rem;
--text-lg: 1.34375rem;
--text-xl: 1.78125rem;
--text-2xl: 2.375rem;
--text-3xl: 3.15625rem;
--text-4xl: 4.21875rem;
--shadow-sm: 0 0.667px 1.333px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-lg: 0 1.5px 3px 0 rgba(0, 0, 0, 0.05);
--shadow-xl: 0 2.25px 4.5px 0 rgba(0, 0, 0, 0.05);
--scrollbar-size: 10px;
--scrollbar-radius: 999px;
--scrollbar-track: transparent;
--scrollbar-thumb: #dbd8d0;
--scrollbar-thumb-hover: #1f1f1f;
--scrollbar-thumb-border: #f4f1ea;
--animate-marquee: marquee 25s linear infinite;
}
@keyframes marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@layer base {
:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }
.dark { color-scheme: dark; }
html {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
}
*::-webkit-scrollbar { width: var(--scrollbar-size); height: var(--scrollbar-size); }
*::-webkit-scrollbar-track { background: var(--scrollbar-track); }
*::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb);
border-radius: var(--scrollbar-radius);
border: 2px solid var(--scrollbar-thumb-border);
}
*::-webkit-scrollbar-thumb:hover { background-color: var(--scrollbar-thumb-hover); }
*::-webkit-scrollbar-corner { background: var(--scrollbar-track); }
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
}
/* Generated with Nodlume — https://nodlume.dev/theme-generator/ink-and-paper */
Make it yours
A preset is a starting point, not a decision. The shadcn/ui theme generator opens this one with every control live — swap the palette, try another of the 67 font pairings, tune the radius — and exports the result. For the thinking behind the roles, read how to build a semantic UI color palette; for how the whole system is generated, read generating custom themes.
Open in the theme generator