← kiku-kissaten.pages.dev · design guide

KIKU — the making of

A build log for the most restrained site of the collection: what was decided, what was generated, what was coded, and what three rounds of ruthless self-review changed.

概念 Concept

The brief: a Kyoto kissaten — a slow-coffee house — rendered in wabi-sabi. Silence, paper, steam, one perfect cup. The design bet is that restraint executed precisely reads as luxury: near-empty layouts, one accent color used like a hanko seal (rarely, and with intent), and motion so slow it feels like breathing.

Every section keeps a vertical Japanese side-label (real writing-mode: vertical-rl, not rotated text), bilingual headings, and dashed rules that echo hand-sewn book binding.

Palette

washi #F7F3ECground — warm paper white
sumi #2B2725ink — all type & strokes
roasted #8C7B6Bsecondary — captions, labels
vermillion #B8432Fhanko accent only — seals, prices on hover, one map dot

Type

Shippori Mincho for display — a mincho with genuine Japanese glyph coverage, so 一期一会 and "KIKU" share one voice. Zen Kaku Gothic New (300/400) for Latin body: geometric but soft, wide letter-spacing, line-height 1.9. The pairing mirrors the site's bilingualism: brush heritage for headlines, quiet modernity for reading.

資産 Assets

Three images, generated with GPT Image 2 (model: gpt-image-2, quality high) and art-directed to feel like Kinfolk-magazine film photography. Actual prompts:

Generated hero image: ceramic cup and pour-over in window light
cup.webp — 1024×1536
Generated interior image: hinoki counter and shoji light
interior.webp — 1536×1024
Generated wagashi image: chrysanthemum kinton on dark ceramic
wagashi.webp — 1024×1024
hero · 1024×1536 · highQuiet editorial still-life photograph for a Kyoto slow-coffee kissaten, Kinfolk magazine style. A handmade wabi-sabi ceramic coffee cup with uneven glaze in muted grey-brown, beside a dark ceramic pour-over dripper on a weathered wooden windowsill. Soft diffuse morning window light through paper shoji screen, gentle steam rising from the cup, long soft shadows. Palette: warm washi off-white, sumi ink charcoal, roasted umber brown. Shot on 85mm lens, shallow depth of field, film grain, negative space at top. Serene, contemplative, imperfect beauty. No people, no text, no watermark.
interior · 1536×1024 · highInterior photograph of a tiny Kyoto kissaten coffee house, Kinfolk magazine editorial style. A low counter of dark aged hinoki wood, three simple wooden stools, hand-thrown ceramic cups arranged sparsely, a copper kettle. Soft luminous light filtering through shoji paper screens on the left, dust motes in the light beam, deep quiet shadows. Wabi-sabi minimalism, plaster walls the color of washi paper, one small ikebana branch in a dark vase. Palette: warm off-white, charcoal, roasted brown. 35mm lens, natural light only, film photography feel. No people, no text, no watermark.
wagashi · 1024×1024 · highOverhead editorial photograph, Kinfolk magazine style: a single delicate wagashi sweet — pale chestnut kinton shaped like a chrysanthemum flower — resting on a dark charcoal ceramic plate with rough glaze. Placed on a washi-paper textured surface, soft raking window light from the left, deep gentle shadow. Extreme negative space, wabi-sabi restraint. Palette: warm off-white washi, sumi charcoal, muted chestnut. Macro 100mm lens, shallow depth of field, film grain. No text, no watermark, no hands.

技法 Techniques

1 · Canvas steam (the signature)

Five wisps rise from the hero cup on a <canvas> in mix-blend-mode: screen. Instead of shipping a noise library, the drift is layered incommensurate sines — perlin-ish, three octaves, four lines of math:

function noise(x, t) {
  return Math.sin(x*1.7 + t*0.9)      * 0.55
       + Math.sin(x*3.1 - t*0.6 +1.3) * 0.28
       + Math.sin(x*5.3 + t*1.7 +4.1) * 0.17;
}

Each wisp is a 26-segment polyline whose sway amplitude grows with height, stroked with a vertical alpha gradient and ctx.filter: blur(6px). An IntersectionObserver pauses the rAF loop when the hero scrolls away; prefers-reduced-motion removes it entirely.

2 · Ink-brush stroke reveals

The ensō circle and the Gion map are SVG paths drawn in on scroll. JS measures each path with getTotalLength(), writes it to a --len custom property, and a class toggle runs stroke-dashoffset: var(--len) → 0 with staggered delays — streets first, lanes after, the vermillion shop-dot popping last.

3 · Hanko seal stamp

The seal starts at scale(2.2) rotate(-14deg), invisible — hovering above the paper — then drops with an overshoot curve (cubic-bezier(0.34, 1.4, 0.44, 1)): squash to 0.94, rebound to 1.05, settle at 1 with a −5° skew like a real hand-stamp. Box-shadow insets fake the carved border.

4 · Whitespace choreography

Sections breathe in over 1.8 s — deliberately slower than web-default — with cubic-bezier(0.22, 1, 0.36, 1) and 36 px of rise. Section padding is clamp(7rem, 18vh, 13rem): the emptiness is the layout.

5 · Paper grain

A fixed full-viewport overlay of SVG feTurbulence fractal noise encoded as a data URI — zero requests, ~500 bytes — at 3% effective opacity. It kills the "flat hex background" feel and makes the washi read as fiber.

6 · Quiet parallax & ken-burns

The two photographs in The Space drift a few pixels against scroll (rAF-throttled, ±26px, 5–8% overscale inside overflow:hidden frames), and the hero cup breathes through a 26-second ken-burns cycle — slow enough to read as light moving rather than motion.

7 · Works without JavaScript

Every animation's hidden initial-state is gated behind an html.js class added by a pre-paint inline script. No JS → the full site renders statically. The same mechanism powers the QA hooks used while iterating: ?static=1 (end-states) and ?solo=<section> (renders one section in isolation).

工程 Process — three passes

Pass 1Structure & first truth

  • 一期一会 sat off-centre: the generic flex heading style leaked onto it. Fixed.
  • Mobile: the vertical 一杯入魂 collided with the hanko (absolutely-positioned grid items resolve against their grid area). Redesigned it as washi-white calligraphy over the dark side of the photo — better than the fix.
  • Mobile menu: price had wrapped under the description; pinned it opposite the kanji name.
  • Made the whole site render statically without JavaScript (animation initial-states gated behind a pre-paint html.js class) and added the ?static/?solo QA hooks.

Pass 2Rhythm & texture

  • Ensō read as a geometric circle — added a dry-brush ghost stroke and a −4° hand tilt.
  • Elevated: scroll parallax on the space photographs; ink footer rule with a breathe-in send-off; wordmark and menu-item hover micro-interactions.
  • Re-verified mobile after wrapping images in overflow frames; console clean, no overflow.

Pass 3Polish & accessibility

  • Contrast audit: small roasted text failed AA on washi (3.3:1) — introduced a deeper --roast-text #6E5F51 (5.5:1) for captions, notes and footer lines.
  • Elevated: 26s ken-burns drift on the hero cup; reduced-motion path re-tested end-to-end.
  • Final sweep at 375 / 768 / 1280: screenshots, structure snapshot, zero console errors.

出荷 Ship it

Static files, no build step. Deploy from the site directory:

npx wrangler pages deploy . --project-name kiku-kissaten

← Return to the site