← 星菊 back to the counter 設計覚書
覚書

Design notes for Hoshigiku

How an eleven-seat kaiseki counter became one continuous scroll — the concept, the palette, the ink stroke that draws itself, and a recipe for building at this level with Claude.

構想 CONCEPT

Hoshigiku sells one thing: shun, the few days when an ingredient is at its absolute peak. So the page is built like an emaki — a Japanese handscroll — one continuous vertical journey through the eight courses of the July menu, dated in the old 72-microseason calendar (小暑 · 温風至, "the warm winds arrive") rather than in months. A single ink-brush stroke draws itself down the page as you scroll, swinging left and right to lead you from course to course the way a scroll painting leads the eye.

PALETTE

Sumi ink on textured washi, with persimmon as the working accent — plus a seasonal accent that shifts for every course, each one a named traditional Japanese color. The structure encodes the content: the color chip beside each course number is part of the menu, not decoration.

washi #F2EEE3paper ground, fibre-textured with SVG turbulence
sumi #211E19ink — text and the brush stroke
persimmon #B04F28the hanko seal, links, emphasis
matcha #757C43secondary green, course two

The eight course accents, in serving order:

若竹 wakatake 抹茶 matcha 浅葱 asagi 銀鼠 ginnezu 柿渋 kakishibu 茄子紺 nasukon 山吹 yamabuki 桃 momo
文字 TYPE
Cormorant Garamond

Latin display and headings, weights 300–500. A garalde with sharp, calligraphic terminals — the closest a Latin face comes to a brush lifted cleanly off paper. Set large and light, never bolded.

しっぽり明朝

Shippori Mincho B1 for all Japanese and for body text. A bookish mincho with real ink-trap warmth; its vertical set (CSS writing-mode: vertical-rl with text-orientation: upright) gives the course labels their hanging-scroll quality.

技法 TECHNIQUES

The scroll-drawn ink stroke

The signature is one SVG path that spans the whole menu section. It is generated in JavaScript after layout: each course contributes an anchor point on the side opposite its text, the anchors are joined with a Catmull-Rom spline converted to cubic Béziers, and the path is revealed with the classic dash trick, eased with a lerp so the ink has weight:

// anchors → spline → draw-on-scroll
const d = catmullRomToBezier(anchorPoints);
path.setAttribute('d', d);
const len = path.getTotalLength();
path.style.strokeDasharray = len;

// scroll sets a target; rAF chases it (ink has inertia)
tgt = clamp((innerHeight*0.72 - menuTop) / menuHeight, 0, 1);
cur += (tgt - cur) * 0.075;
path.style.strokeDashoffset = len * (1 - cur);

Three copies of the same path are stacked to fake a loaded brush — a wide 12%-opacity “bleed”, the 6.5px body, and a dark 2.2px core — each roughened by an feTurbulence + feDisplacementMap filter so no edge is ever geometric:

<filter id="brush">
  <feTurbulence type="fractalNoise" baseFrequency="0.015 0.28" seed="7"/>
  <feDisplacementMap in="SourceGraphic" scale="9"/>
</filter>

Vertical typography

Course names, the hero title 星菊 and the philosophy character 旬 are set with real vertical writing, not rotated text — glyphs stay upright and stack downward, exactly as on a hanging scroll:

.vert { writing-mode: vertical-rl; text-orientation: upright; }

Washi, hanko, brush circles

The paper texture is two layered feTurbulence SVGs as data-URIs (fine grain + long horizontal fibres) fixed behind the page. The red seal is inline SVG stamped in with a spring-curve scale animation. Course numbers sit in “brush circles” — plain CSS borders with four unequal radii and a 2° rotation, so no two feel machine-drawn.

Photography: three images generated with gpt-image-2 (OpenAI) from written photographic briefs — the counter at dusk, the hassun tray, the mukōzuke in glass — then treated to match the palette.

推敲 THE THREE PASSES
  1. Correctness & composition. The vertical hero caption was breaking into stacked columns — gave it an explicit inline-size so it hangs as one line; stopped 小暑 splitting mid-word in the season line; started the ink stroke below the menu heading instead of behind it; cropped the hassun photo to 4:5 so the tray fills the frame; added an idle fallback so the page below the fold is never blank if scrolling never happens.
  2. Elevation. Thickened the three-layer brush (bleed 17, body 7.5, core 2.6) so the ink reads at full-page scale; added the reward moment — a hanko seal stamps itself at the stroke's end when the scroll completes; course numbers now ink-fill with their seasonal color on hover, photos straighten and lift; form fields underline in persimmon on focus.
  3. Taste. Chanel rule — removed the reservation card's seal (three seals on one page was one too many; the stroke-end stamp already closes the scroll); rebuilt the season line as natural text flow so it wraps like a sentence, not a broken flexbox; shortened the hero side caption to 京都 祇園 · 会席; re-verified 390px, reduced-motion, and zero console errors.
手引 DO THIS YOURSELF

A recipe for getting a site of this caliber out of Claude:

  1. Start with a thesis, not a layout. One sentence: “the menu is a handscroll you unroll.” Every decision must serve it — tell Claude to reject anything that doesn't.
  2. Assign one signature element and let Claude spend its ambition there (here: the scroll-drawn brush stroke). Keep everything else disciplined.
  3. Demand a palette with provenance. Named colors with reasons (sumi, washi, kakishibu) beat hex codes picked by vibes — and ban the default AI look in your prompt.
  4. Make structure carry information. Course numbers, seasonal color chips, calendar terms — ask Claude to encode something true in every label and divider.
  5. Write copy like a brand writer. Give Claude the voice (“quiet, precise, a chef who counts bone-cuts per inch”) and forbid filler.
  6. Generate photos from photographic briefs — lens, light, film stock, time of day — not subject nouns. “35mm, f/2, Portra 400, twilight through paper” gets editorial results.
  7. Iterate with screenshots. Three passes minimum: correctness, elevation, taste. Have Claude read its own screenshots and criticise composition before touching code.
  8. End by removing something. The last pass should delete an accessory, not add one.