Risograph builds depth
Surfaces are told apart the way a riso print separates inks: a halftone second color sits slightly off register behind each plane. Depth comes from ink and offset, not blur-heavy drop shadows.
The J4M5 Design System puts matte, risograph-printed surfaces under clear acrylic. Neutrals are muted minerals from every hue. Gems are kept for the moments that matter. Figtree carries the words, and shapes stay loose and organic.
Every decision in the system traces back to one of these five rules. If a design breaks one, it should be on purpose.
Surfaces are told apart the way a riso print separates inks: a halftone second color sits slightly off register behind each plane. Depth comes from ink and offset, not blur-heavy drop shadows.
Content is printed on matte paper. Chrome that floats, like nav, tab bars, popovers and dialogs, is clear acrylic. The contrast between the two materials is the signature, so never mix them on one surface.
About 90% of any view is muted neutral: low-chroma tones drawn from every hue, never pure white. The last 10% is gem-tone, saturated and deep, used for action, status and delight.
Figtree sets the UI, the body and most headings. Fraunces, a soft serif, is the display voice for heroes and editorial moments. Zilla Slab stamps small labels. If you're unsure which to use, use Figtree.
Corners differ from one another, blobs replace circles, and stickers sit a few degrees off. The layout grid still holds, so edges stay loose while baselines and gutters stay true.
Matte paper for content. Clear acrylic for chrome. Muted minerals everywhere, one gem at a time, set in Figtree, with no perfectly straight edges.
Two families. Minerals are muted neutrals of every hue at four tints, and they make up the paper, the surfaces and the ink. Gems are six rich accents, each with a light wash, a base, a deep and a glow for dark mode.
Use 100 for surfaces and washes, 300 for secondary fills and illustration, 500 for disabled and hairline art, and 700 for text and dark fills. Never use #FFFFFF. The lightest surface in the system is Paper, #efeee9.
Each gem maps loosely to a real Riso drum ink (in parentheses) so that printed collateral can match the screen. Use only one dominant gem per view. A second gem may appear only as an overprint or a small sticker.
#efeee9#b5c8ce#49566b#2151af#e19b34#efe7d6#c1c7b1#52593c#008053#b52f48#ede7df#d7beb5#6c4d42#007575#f9d8b1#e9e8e4#b6cabe#1d222b#007575#e19b34#12151a#5c4f66#eae8e2#a278d1#ffc57b#1d2027#49566b#e66b79#5483dc#58b084| Token | Role | Light | Dark |
|---|---|---|---|
--background | Page paper | oklch(0.948 0.006 90) | oklch(0.195 0.012 265) |
--foreground | Ink text | oklch(0.25 0.02 265) | oklch(0.93 0.008 90) |
--card | Matte print surface | oklch(0.918 0.01 84) | oklch(0.235 0.014 265) |
--primary | Primary action | oklch(0.46 0.16 262) | oklch(0.7 0.12 262) |
--secondary | Secondary fill | oklch(0.885 0.014 80) | oklch(0.29 0.015 265) |
--muted | Wells, quiet fills | oklch(0.905 0.01 85) | oklch(0.27 0.014 265) |
--muted-foreground | Secondary text | oklch(0.47 0.018 265) | oklch(0.72 0.012 265) |
--accent | Hover / selected wash | oklch(0.9 0.028 262) | oklch(0.32 0.045 262) |
--destructive | Danger | oklch(0.52 0.17 15) | oklch(0.68 0.153 15) |
--border | Hairlines | oklch(0.25 0.02 265 / 0.14) | oklch(0.93 0.008 90 / 0.12) |
--ring | Focus ring | oklch(0.62 0.144 262) | oklch(0.7 0.12 262) |
--overprint | Second-ink offset | oklch(0.76 0.072 262) | oklch(0.31 0.128 262) |
--glass | Acrylic fill | oklch(0.98 0.004 90 / 0.58) | oklch(0.3 0.016 265 / 0.5) |
Figtree is always the predominant face. Fraunces adds a soft, slightly wonky serif for display, and Zilla Slab stamps labels the way a rubber stamp would.
A geometric sans with friendly, open curves. Use it for anything someone has to read, scan or tap.
“Soft serifs for loud moments.”
Set the SOFT axis to 100 and WONK to 0. Use sizes of 32px and up, at most once or twice per screen, and never for UI controls.
Set it uppercase with +0.08em tracking at 11 to 15px, for eyebrows, stickers, ticket stubs and data labels.
Keep running text to 60–70 characters per line. Use tabular numbers for data. Give display lines a 1.5–2px misregistered shadow in the overprint ink with .riso-misreg.
No two corners match. Radii are elliptical and asymmetric, so containers feel cut by hand. Big shapes are seeded blobs, and the same seed always draws the same shape.
rounded-cardCards, sheets, dialogsrounded-tileAlerts, list rows, thumbnailsrounded-controlInputs, selects, coderounded-pillButtons, badges, nav, tabsrounded-pebbleIcon buttons, avatars, thumbsrounded-riverImage masks, hero artrounded-seedStickers, stamps<Blob seed={44} />Backgrounds, art, emphasisElevation is shown by material, not by bigger shadows. There are five layers, and each one has a single job.
Four print effects, each a single utility class. Use them with restraint. Texture should be felt more than noticed.
riso-flat and riso-print..riso-flat {
background: var(--grain),
var(--surface);
}.riso-halftone {
--dot: var(--gem-sapphire);
}.riso-misreg {
--misreg: var(--gem-ruby-glow);
}.overprint {
mix-blend-mode:
var(--overprint-blend);
}These are shadcn/ui components restyled for J4M5, plus four new ones: Glass Panel, Riso Surface, Blob and Sticker. Everything below matches what npx shadcn add installs.
Pressing a button closes the offset, like paper meeting the drum. Use one primary button per view.
Gem badges print the deep shade on the light wash of the same gem, which passes AA. Stickers are the only components that are rotated.
Use print by default, flat inside lists or nested cards, and glass only when the card overlaps other content. The offset color comes from ink="ruby" and the other gems.
Archived projects stay in your library for 30 days. After that, builds and assets are deleted.
The system applied to four common surfaces: a landing page, a mobile app, a poster, and a working dashboard.
We design and build interactive work that feels handmade, from playful browser games to calm, careful product UI.
Play unreleased games, watch a live riso print, take a poster home.
This chart follows the gem rule: the peak day is the only bar in a gem color, and every other bar is mineral.
J4M5 is a shadcn/ui registry, which needs Tailwind CSS v4 and a project that has already run shadcn init.
npx shadcn@latest add https://ui.j4m5.com/r/j4m5-kit.jsonnpx shadcn@latest add https://ui.j4m5.com/r/j4m5.jsonnpx shadcn@latest add https://ui.j4m5.com/r/button.json"registries": { "@j4m5": "https://ui.j4m5.com/r/{name}.json" }After adding the namespace, run npx shadcn add @j4m5/card. The J4M5 Button, Card, Badge, Input, Textarea, Label, Switch, Tabs, Dialog and Alert replace the stock shadcn files with the same names.
| Item | What it adds |
|---|---|
j4m5 | Tokens (light + dark), gem and mineral colors, organic radii, riso and glass utilities |
font-* | Figtree, Fraunces, Zilla Slab (next/font or Fontsource) |
organic | blobPath(), seeded(), inkStyle() |
button card badge | Restyled, with gem, glass and print variants |
input textarea label switch | Matte wells and an acrylic switch bead |
tabs dialog alert | Acrylic rail and sheet, gem-wash alerts |
glass-panel riso-surface | The two materials as primitives |
blob sticker | Organic shapes and slab-serif stamps |
For AI coding tools, point the model at ui.j4m5.com/llms.txt (or j4m5-design-system.md) before asking it to build UI.