陰影Schatten · Brand Concept

Shadow is not the absence of light.
It is the gradation that arises between paper and ink.

Schatten is German for “shadow.” It implements the portfolio site’s brand concept, In Praise of Shadows (Jun’ichirō Tanizaki), as component-level design tokens instead of page-level visuals.

Color

Four colors, named in Japanese

Schatten’s primitives carry Japanese names. The values below are the real v1.0.0 tokens (src/core/tokens/primitives.css).

Vermillion朱 · vermillion
The brand’s heat. The vermillion of shrine gates, seals, and lacquer.
Sumi ink墨 · sumi
Foreground and text. An achromatic that leans cool.
Washi paper和紙 · alabaster
Surfaces and ground. An achromatic that leans warm.
Indigo藍 · indigo
The second brand color. Ink that carries chroma.

Ink runs cool, paper runs warm — at identical chroma

sumi and alabaster share the same lightness and the same chroma; only the hue differs, 250 against 70. Both read as near-neutral, yet ink tilts blue and paper tilts yellow.

All eleven steps are mirrored

This is not a fact about the -500 rung alone. Every one of the eleven steps matches in lightness and chroma; only the hue parts. Ink and paper share one ladder.

The chromatic pair rides the same ladder

Everything is defined in OKLCH. The space is perceptually uniform, so “the same lightness” holds to the eye, not merely in the arithmetic.

Seasons

Eight seasons, one lightness

A season (a Special theme) swaps only the --color-theme-* ramp. Every 500 rung sits at L 64%, every 700 rung at L 46% — hue and chroma move, nothing else. The dates match the classical eight markers: the four beginnings and the two solstices and equinoxes.

Seasons turn; legibility does not. The eight markers carry color alone and never touch the lightness ladder.

Type

Speaking two languages at once

The structure is Western engineering vocabulary — shadcn, Radix, OKLCH, BEM, CVA. The surface is Japanese aesthetic vocabulary — vermillion, ink, washi, indigo, the eight markers. Neither decorates the other.

That duality is not confined to names and colors; it is implemented in the typesetting. Both the sans and the serif role pair a Latin face with a Japanese face into a single stack. Being bilingual is the default state.

sans — UI and bodyShadow & Gradation陰影と階調
Hanken Grotesk
LINE Seed JP
serif — headings and long formShadow & Gradation陰影と階調
EB Garamond
Noto Serif JP

Eight sizes, six leadings

Sizes come from --text-*, leading from --leading-* — public tokens, all in rem.

4xl · 2.25Shadow 陰影
3xl · 1.875Shadow 陰影
2xl · 1.5Shadow 陰影
xl · 1.25Shadow 陰影
lg · 1.125Shadow 陰影
base · 1Shadow 陰影
sm · 0.875Shadow 陰影
xs · 0.75Shadow 陰影
none · 1

Shadow 陰影

tight · 1.25

Shadow 陰影

snug · 1.375

Shadow 陰影

normal · 1.5

Shadow 陰影

relaxed · 1.625

Shadow 陰影

loose · 2

Shadow 陰影

Note that body / label / heading are not CSS variables. Size, leading, and weight are three properties, and a single var() cannot carry three — so the roles bind to the .st-text--* class rules instead.