SHUMI-EN趣味園

Colophon · how it was made

A tree that remembers, drawn as arithmetic.

SHUMI-EN is a fictional hillside bonsai nursery, built for anyone who has ever wanted to feel how a single cut echoes down decades of growth. The page has one job: hand you the shears and let a branching engine answer honestly — every snip redirects the vigour, every wire bends the future, and twenty simulated years arrive in a few seconds.

Palette

Four colours, all pulled from the plant and its pot

Moss
#4A5D43
Foliage and the studio's voice. A grey-green that stays calm under the eye for a long session, so the tree — not the interface — holds attention.
Bark
#4A3B30
Trunk, pot and every primary action. Warm brown grounds the palette and reads as the oldest, most permanent thing on the bench.
Blossom
#E8C0C8
Spring only — the single soft pink, used for the drifting petals and the text selection. Scarce on purpose, so its arrival marks the season.
Sky wash
#EFF2EC
The paper behind everything — a barely-green off-white that tints toward each season on the stage without ever going grey.

A vermillion seal #A8433A appears once, on a tree trained past sixty years — the nursery's exhibition stamp, earned rather than decorative.

Type

Zen Old Mincho + Karla

趣味園 — a tree that remembers
Zen Old Mincho · display & numerals

A Japanese Mincho with true kanji coverage, so the section labels (作業台, 手入れ, 台帳) and the vertical watermark are set in the same hand as the headlines. Its high-contrast strokes give the numbers on the bench — age, seed, cuts — the weight of an engraved plate.

Karla · interface & body

A grotesque with a slightly humanist warmth for controls, labels and running text. It stays legible at 12px in the tool panel and never competes with the Mincho above it — the split keeps the serif reserved for moments that matter.

Technique

L-system · pipe-model widths · SVG · vanilla JS, no libraries

The tree is a seeded L-system grown one year at a time. A tiny deterministic PRNG means a seed number always yields the same tree under the same weather, which is what lets the ledger raise the same specimen every time. Each year, tips branch with a probability shaped by apical vigour, distance from the trunk, height and age; lateral buds fork off the strong ones. Trunk and branch widths use a pipe model — a parent is thick enough to carry the sum of its children — and, crucially, width never shrinks: old wood lignifies and keeps its girth, so the tree carries a visible memory of how big it once needed to be.

The signature element — shears that alter twenty years. Pruning is not a visual trick. A cut deletes an entire subtree from the growth graph and flags the parent with spare buds (the scar). From that year on, the vigour that fed the removed branch floods the survivors, so a pruned tree genuinely grows fewer, stronger lines. Because growth is re-simulated from the changed graph, fast-forwarding twenty years shows the real consequence of the snip — not a canned animation. The whole scene is a single inline SVG, so the same document you prune is the one you export: Export SVG serialises the live tree, strips the interaction layer, and stamps its seed, age and history into the file's description.

Copper wire clamps a branch's rest angle; every shoot it sends out afterwards inherits the new line. Seasons re-tint a wash rectangle and swap foliage for blossom, green, ochre, then bare wood — with drifting petals in spring and a few shed leaves settling on the soil in autumn. No canvas, no WebGL, no external library: just SVG paths recomputed each frame.

Iteration log推敲

Three passes, re-reading the rendered result each time

Pass 1 · Craft

Contrast & legibility

  • The faint micro-labels (age/seed captions, section eyebrows) were set in a soft #8B8877 that measured only ~3.2:1 on the paper — below AA. Darkened the token to #6C6857 (~5.2:1) without losing the airy hierarchy.
  • The season tag floated as bare text over the stage; added a translucent blurred scrim behind it so it stays readable when a branch grows underneath it.
  • Read the copy end to end — tightened the practice column and ledger cards to concrete, active lines with no filler.
Pass 2 · Depth

A second-read detail and a crafted ease

  • Added shed leaves that settle on the soil in autumn and winter, positioned deterministically from seed and year so they scatter slightly with each season — a small reward noticed only on a second, slower visit.
  • Gave the buttons and CTA a 1px press micro-interaction so the controls feel physical under the cursor.
  • Swapped the season colour wash from the default ease to a crafted cubic-bezier(.19,1,.22,1), so the turn of the year settles instead of snapping.
Pass 3 · Hardening

Responsive, restrained, resilient

  • Verified the layout at 375 / 768 / 1440: the bench stacks, the watermark hides, the reads grid reflows, and there is no horizontal overflow.
  • Chanel rule: removed the redundant secondary soil-highlight ellipse — the shed leaves now carry the soil's texture, so the pot reads as one clean form.
  • Confirmed the reduced-motion path renders a settled static frame (petals off, cuts and fast-forward resolve instantly) and that fast-forward pauses cleanly on a hidden tab.

See it live