Record the design system and fix four endpoint-screen defects - #39
Merged
Conversation
`go run ./src/application.go` compiles that one file, so the package's other files are excluded and the build fails on the undefined request logger. Running the package builds all of them. Claude-Session: https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt
The details and headers lists were two-column grids with a fixed 10rem key column that held at every width, leaving a phone-sized viewport roughly half its content width for the value. They are flex rows now: the key column applies above the breakpoint and the label stacks above its value below it. Each row is its own element rather than a `display: contents` wrapper, so a row's divider spans the whole row instead of only the value column. The divider is a bottom border with the last row cleared, because x-for leaves its template as the first child and a :first-child rule would never match a rendered row. The retention notice swaps its emoji for a stroked icon from the set every other icon comes from, so the family has no per-platform outlier. Claude-Session: https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt
Design tooling serves an injected picker script from a local port and opens a socket back to it, which the policy blocked. The extra source is gated on the environment rather than on anything a request carries, so production keeps the exact policy it had. The policy is now assembled once at startup instead of on every response; its only variable part is fixed for the process lifetime. Claude-Session: https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt
PRODUCT.md captures durable product truth: who the tool is for, what it promises, and the constraints future work must preserve — free and anonymous permanently, ephemeral by design. DESIGN.md captures the implemented visual system. The token values are the Tailwind defaults the CDN build actually resolves, verified against computed styles in a browser rather than transcribed, and the palette includes the vendored highlight.js colours that the rest of the system does not author. `.impeccable/design.json` carries what the format cannot hold: tonal ramps, shadow and motion tokens, and renderable component snippets. Claude-Session: https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
PRODUCT.mdandDESIGN.mdfor the project, and fixes four defects found while documenting it.Fixes
Captured request rows squeezed on phones. The details and headers lists were two-column grids with a fixed
10remkey column that held at every width, so a phone-sized viewport gave roughly half its content width to the label and the rest to a path or header value. They are flex rows now — key column above the breakpoint, label stacked above its value below it. Desktop is unchanged: the label column still measures 160px with a 12px gap.Two details worth a reviewer's attention:
display: contentswrapper. The oldfirst:border-t-0sat on thedtinside that wrapper, so only theddever drew a rule and dividers were painting over the value column alone. They span the full row now.border-bwith the last row cleared rather thanborder-twith the first cleared, becausex-forleaves its<template>as the first child and a:first-childrule never matches a rendered row. There's a comment on this so it doesn't get "simplified" back.The retention notice used an emoji in an otherwise uniform set of 24×24 stroked icons. Replaced with the matching alert triangle, inheriting colour like every other icon.
The CSP blocked local design tooling. It serves an injected script from a local port and opens a socket back to it. The extra source is gated on the environment rather than on anything a request carries, and the policy is now assembled once at startup instead of per response. Verified both branches: development carries the origin, production is byte-identical to the previous policy.
docs/scripts.mddocumented a command that doesn't compile.go run ./src/application.goexcludes the rest of the package and fails on the undefined request logger.Documentation
PRODUCT.mdrecords product truth — audience, positioning, and the constraints future work must preserve (free and anonymous permanently; ephemeral by design).DESIGN.mdrecords the implemented visual system under the DESIGN.md spec. Since there's no Tailwind config, the token values were read from the pinned CDN bundle and checked against computed styles in a browser rather than transcribed. It also documents the vendored highlight.js palette, which the rest of the system does not author..impeccable/design.jsoncarries what the format can't hold: tonal ramps, shadow/motion tokens, and renderable component snippets.Verification
go vet,gofmt,go build, unit tests andprettier --checkall clean. Playwright suite 35/35 passing. Mobile and desktop rendering checked in a browser.Not addressed
The home page
/ships with no security headers at all — no CSP,X-Frame-Options,X-Content-Type-OptionsorReferrer-Policy— while every other route, including unmatched paths, has them. This reproduces on unmodifiedmaster, so it predates this branch; the likely cause is theGet("/*", static.New("./public"))catch-all registered ahead of the page routes. Left alone here to keep this PR to its stated scope, but it's a real gap on the most-visited page and worth its own fix.🤖 Generated with Claude Code
https://claude.ai/code/session_01X8JeP7AQwpd2coSfwbMopt