feat(design)!: Servizio's structure in Bottega's printed matter (v7.0.0) - #300
Merged
Conversation
|
JanWelker
force-pushed
the
design/servizio-bottega
branch
from
September 7, 2026 15:48
f946933 to
5447d36
Compare
BREAKING CHANGE: the default experience is a different app. Anyone returning to a bookmark meets a question flow and a job ticket where a form and a table used to be, which is what CLAUDE.md calls a user contract break, so this is 7.0.0. Direct feedback on the old design was that it looked like it was made by an engineer, and it did: every region was the same cream card, the page opened with twelve near-identical label-over-input rows, and the schedule — the thing the app is for — sat below the fold on a phone and no louder than the fridge temperature field. This is the redesign that answers it, combining the structure of PR #298 with the visual language of PR #297. THE STRUCTURE. The app is three places, and which one is on screen lives in the URL fragment (`#ask/<step>`, `#plan`, `#library`) so it is linkable, survives a reload and walks with the back button — and adds no query key, so the recipe schema is untouched and `hasRecipeParams` needs no exception. It opens with one question at 72 px, then four more, each answerable in a gesture and each skippable. Anyone arriving with a share link or a remembered recipe lands straight on the plan and is never asked anything. The plan carries no inputs: every value is a blank on a printed form that opens the adjust sheet focused on that field, and the sheet is the expert's door — one press to twenty numbers. The collections became a view of their own, since they are entry points to a recipe rather than an appendix to one. THE PRESS. Ink does the work shadows used to: flat paper stock, 2 px rules, square corners, offset blocks, nothing blurred. Anton for the sign, Archivo's width axis for the condensed caps, loaded as a preload that promotes itself so a slow font server can never block first paint. The schedule is a numbered job ticket where the line number IS the rail node; the ingredients are a deli ticket with dotted leaders and a real punched perforation; the masthead is a painted enamel plaque over a tricolore hairline that closes the colophon too — that flag is what holds three views together as one publication. Every control sits with the thing it acts on: the buttons under the flag with the values they change, the mode and fit seals on the schedule's lede line, each opening what its mark means. Language, theme and step detail are choices in one menu, which is why SegmentedControl and the pill strip are gone. The mode and the fit are drawn guild seals rather than outlined boxes carrying ASCII stars. THE SCHEMA IS NOT BROKEN. `src/lib/dough/**`, the .ics builder, the TRMNL payload and the print route are unchanged, and every v=1…v=6 link reproduces its recipe exactly. CURRENT_VERSION goes to 7 only because the major version is pinned to it: v=7 adds no key and no gate, both existing gates sit below it, and two tests hold that — the encoded key set is unchanged, and the same query decodes identically at v=6 and v=7. Testing: 953 unit at 100 % coverage, 122 browser (from 940/90). Nothing was weakened to fit the new structure — specs were rewritten to reach the same rules through it. Bugs found and fixed along the way, each with its own test: a question's slide-in painting past the sheet and putting a scrollbar under every move at 390 px; the tricolore's middle panel vanishing on the dark press, because the flag's white is the stock; a dotted leader stranded as a stub beside a flour name that wrapped; a fit panel that lost its position, border, fill and shadow at once because `@apply` reached for another components class; and a menu that painted behind the schedule card after a transform trapped its stacking context.
JanWelker
force-pushed
the
design/servizio-bottega
branch
from
September 7, 2026 15:53
5447d36 to
b34f079
Compare
This was referenced Sep 7, 2026
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.
Servizio's structure (#298) wearing Bottega's printed matter (#297).
The layout of one and the style of the other. This branch was cut from
design/servizio-flowand Bottega's design system ported onto it deliberately, file by file, rather than merged — the two branches touch 33 of the same files and a merge would have been hand-resolved into something worse.The split: structure, routing, view logic and composition from #298; tokens, palette, type, borders, shadows and the whole component layer from #297. Where both had restyled the same component, Bottega's treatment is re-fitted into Servizio's composition. Its two best pieces — the numbered job-ticket schedule and the deli-ticket ingredients — survive intact. Servizio's limewashed plaster and Bottega's two-column page are both gone.
This is 7.0.0. The default experience is a different app — anyone returning to a bookmark meets a question flow and a job ticket where a form and a table used to be, which is a user contract break by CLAUDE.md's definition. The major version is pinned to
CURRENT_VERSION, sov=7follows: it adds no key and no gate, both existing gates (alatv < 5,fwatv < 6) sit below it, and two tests hold that — the encoded key set is unchanged, and the same query decodes identically at v=6 and v=7. Everyv=1…v=6link still reproduces its recipe exactly.One commit, no screenshots committed. The development history is squashed and the
docs/redesign/folder removed, so this merges as a single change with nothing but source in it.What a user sees
The ask flow — 72 px of Anton on paper stock, one question per sheet. The progress marker is the tricolore being printed across the sheet, not five grey dots: the flag stretches to whatever has been answered and the remainder is hatched. The forming plan sits beside it as a ticket stub — facts on dotted leaders above a real punched perforation, with the mode seal on the counterfoil below the tear.
The plan — the bake moment set as the sign, its name reversed out of an ink band. Every editable value is a
.chip-field: a blank on a printed order form, name stamped above a ruled line. Tapping one opens the adjust sheet focused on that field. Not a web link and not a button — a plan full of buttons is a form again. The schedule is a numbered job ticket where the line number is the rail node; the weights beside it are the deli ticket, dotted leaders to a punched tear-off and a double-ruled total.The adjust sheet — the order pad. Bottom sheet under
lg, right-hand drawer above it, so the ticket stays live behind it. One press to twenty numbers; this is the expert's door.The library — three sheets on a rack, each closed with its heading as the ink band you press.
The masthead — the shop's sign as an enamel plaque over a tricolore hairline, the same flag closing the colophon. That is what holds three views together as one publication, which is why the third colour is spent there and on the progress rule and nowhere else.
What holds it together
#ask/<step>,#plan,#library) — linkable, reload-proof, back-button-correct, and no new query key, so the recipe schema is untouched andhasRecipeParamsneeds no exception.SegmentedControland the pill strip are deleted.What is untouched
src/lib/dough/**, the.icsbuilder, the TRMNL payload and/print/[[locale]]. No ingredient mass and no step time changed.Testing
953 unit at 100 % coverage, 122 browser (from 940 / 90). No assertion was weakened and no test deleted to fit the new structure — specs were rewritten to reach the same rules through it.
Bugs found and fixed on the way, each with its own regression test:
@applyreached for another@layer componentsclass — Tailwind drops the whole declaration and the build stays green;transformwrapper trapped its stacking context;Checks:
lint,check,test:coverage,test:baseline,test:e2e, plusverify/e2e/preview/ CodeQL in CI.