--- version: alpha name: last-and-sole-design description: "A cognac-leather canvas (#241a12) with warm cream ink (#f2e9d8), the gallery's second true leather-brown palette but darker and more saturated than the trade-shop cream system built earlier the same batch. Brass (#c98a3a) is the working accent and the color a finished, burnished sole actually turns, dye-red (#d4695c) marks the welt stitch line and status. Domine carries every headline in a sturdy book-trade serif, Rubik carries prose and controls. The homepage resoles one shoe through four real stages, each cross-section genuinely more complete than the last." --- ## Brand Positioning Last & Sole repairs shoes, and it exists because most cobbler sites either skip the actual craft entirely or lean on a vague "we love shoes" sentiment instead of explaining the one fact that actually matters: why a resole holds. The bet here is to show the real four-stage sequence and name the specific reason a stitched welt outlasts a glued sole. If a component doesn't correspond to a real stage, a real construction detail, or the shoe itself, it doesn't belong here. colors: accent: "#c98a3a" accent-alt: "#d4695c" ink: "#f2e9d8" ink-muted: "#c4ab8a" canvas: "#241a12" ## Logo / Wordmark System The mark is a shoe last in profile, the real foot-shaped form a cobbler works on, not a finished shoe. It is not a boot, a sneaker, or a heel icon. ```svg ``` - **Lockup**: mark, then a `0.55rem` gap, then "Last & Sole" in Domine 700, sentence case. Mark always left of the wordmark. - **Minimum size**: mark not smaller than `20px` wide, below that the toe curve flattens unreadably. - **Clearspace**: empty margin equal to the mark's own height on all four sides. - **Don't**: don't recolor the sole line to anything but `--accent`, it's the brass a finished sole edge actually turns after burnishing. Don't add laces or a heel to the mark, it's a last, not a shoe. Don't fill the mark solid, the outline is what reads as a wooden form. ## Color System ### Roles | Role | Token | Value | Used for | |---|---|---|---| | Canvas | `--bg` | `#241a12` | Page background | | Surface | `--panel` | `#2c2117` | Nav, stage cards, table, form card, shoe upper fill | | Surface raised | `--raised` | `#332619` | Row hover, cta band | | Border | `--border` | `#3a2c1c` | Card edges, table rules, dividers | | Border strong | `--border-strong` | `#4d3a24` | Decorative-only edges, unfinished sole fill | | Border UI | `--border-ui` | `#8a7458` | Every interactive boundary: secondary button, input, select, shoe outline | | Ink | `--ink` | `#f2e9d8` | Headlines, body copy, table cells | | Ink muted | `--dim` | `#c4ab8a` | Labels, meta lines, helper text | | Brass | `--accent` | `#c98a3a` | Primary button, mark's sole line, the finished burnished sole fill | | Welt-thread | `--accent-alt` | `#d4695c` | The welt stitch line, second-page status | Brass only fills the sole once the shoe is actually finished, stages one through three keep the sole area neutral or in a plain grey, so the color change on the bench marks a genuine milestone rather than decorating four identical shoes. Welt-thread red appears exactly where real stitching happens, stage two's dashed line, and nowhere else. ### Contrast (computed from the hex values above via WCAG relative luminance) | Pairing | Ratio | Passes | |---|---|---| | `--ink` on `--bg` (headlines, body copy) | 14.15:1 | AAA | | `--ink` on `--panel` (card copy, table cells) | 13.03:1 | AAA | | `--dim` on `--bg` (labels, helper text) | 7.75:1 | AAA | | `--dim` on `--panel` | 7.11:1 | AAA | | `--dim` on `--raised` | 6.66:1 | AAA | | `--accent` on `--bg` (links, mark's sole line) | 5.83:1 | AA | | `--accent` on `--panel` | 5.37:1 | AA | | `--accent` on `--raised` | 5.01:1 | AA | | `--accent-alt` on `--bg` (welt line, status) | 4.85:1 | AA | | `--accent-alt` on `--panel` (large text and UI only, see below) | 4.47:1 | AA (large/UI only) | | `--accent-alt` on `--raised` | 4.17:1 | AA (large/UI only) | | dark label (`#211703`) on `--accent` fill (primary button) | 6.04:1 | AA | | `--border-ui` control edge on `--bg` (non-text, inputs) | 3.83:1 | AA (1.4.11) | | `--border-ui` control edge on `--panel` (non-text, secondary button) | 3.53:1 | AA (1.4.11) | `--accent-alt` was brightened from an initial `#a8433a`, which measured only 2.87:1 on canvas, badly short of even the large-text minimum, before this system shipped, not after. It still falls short of the small-text 4.5:1 minimum on `--panel` and `--raised`, so status text and the welt line label stay on `--bg` or use large type, never small red text on a card. `--border-strong` is kept for decorative-only uses, never a control boundary, `--border-ui` exists specifically so a real control never inherits that weaker value. typography: display: fontFamily: Domine fontWeight: 600 body: fontFamily: Rubik fontWeight: 400 ## Type Scale | Token | Size | Weight | Family | Line-height | Letter-spacing | Used for | |---|---|---|---|---|---|---| | `--text-display` | `clamp(2.1rem, 5vw, 3.4rem)` | 600 | Domine | 1.15 | 0 | Homepage H1 | | `--text-page-h1` | `clamp(1.9rem, 4vw, 2.6rem)` | 600 | Domine | 1.15 | 0 | Second-page H1 | | `--text-h2` | `1.5rem` | 600 | Domine | 1.2 | 0 | Section headings | | `--text-h3` | `1.05rem` | 600 | Domine | 1.2 | 0 | Stage names | | `--text-body` | `1rem` | 400 | Rubik | 1.6 | 0 | Paragraph copy | | `--text-small` | `0.88rem` | 400 | Rubik | 1.55 | 0 | Table cells, footer, meta lines | | `--text-label` | `0.78rem` | 700 | Rubik | 1 | 0.05em, uppercase | Form labels, table headers, stage numbers | Domine is a sturdy book-trade serif that reads as built rather than typeset, reserved for headlines only. Rubik carries every sentence and every control at 400 for prose and 700 for labels. ## Spacing Scale Base unit `8px`. Tokens in use: `--space-2: .5rem`, `--space-3: 1rem`, `--space-4: 1.5rem`, `--space-6: 2rem`, `--space-8: 3rem`, `--space-12: 4rem`. ## Shape `--radius: 4px` on cards and buttons, `--radius-sm: 3px` on inputs. Small and workshop-plain, reading as a leather edge, not a decorative rounding choice. ## Iconography No icon library. The only non-text graphics are the logo mark and the hero's own bench-and-shoes illustration (hand-built SVG). A stage's real technique is always stated in text, never implied by the shoe shape alone. ## Motion Principles Scroll resoles one shoe through four real stages, laid out left to right on a bench. Each stage is a fixed-geometry shoe cross-section, positioned at a fixed bench location, scaling from `0` to `1` with a slight overshoot as its own scroll segment completes, the same one-shot settle this gallery's other "N items arrive in sequence" systems use. The domain-specific detail is in the geometry: stage one has a bare sole edge, stage two adds a dashed welt-stitch line, stage three adds a plain grey sole block, stage four fills that sole brass, so each shape is genuinely more complete, not the same silhouette recolored four times. Each stage's static bench position and its animated scale live on separate nested groups from the first draft, per the lesson carried forward from earlier systems this batch. One-shot sequence: nothing loops, and every stage is written out in the card grid regardless of scroll or script state. The scroll trigger measures the page's real available scroll room below the stage at load, minus a `16px` safety margin, and caps the distance at that figure (never more than `520px`). A viewport tall enough to leave under `20px` of room, or a `prefers-reduced-motion` visitor, gets all four stages already resoled and every card already visible, with no scroll listener attached at all. ## Voice & Tone Plain, trade-competent, explains why glue alone fails. Last & Sole talks like a cobbler who actually stitches welts, not a brand selling nostalgia for craftsmanship. In practice: - **Primary button**: "Start a resole", not "We love shoes" - **Welt-prep copy**: "This is what actually holds a resole together, not glue.", a direct structural claim - **Stripping copy**: "A rushed strip damages the upper you're trying to save.", stated as a real risk, not a boast - **Burnishing copy**: "Until it looks like it was never touched.", the actual craft standard, not a vague promise - **Status**: "Bench open today, most resoles take about three days." The tell that a sentence is off-brand: it expresses affection for shoes in general instead of naming the actual construction detail that makes a repair last. ## Accessibility Baseline - **Focus ring**: `2px solid var(--accent)` at `2px` offset via `:focus-visible` on every link, button, input, and select, never removed. - **Reduced motion**: honored on the shoe-resoling sequence, as described under Motion Principles. No scroll listener is attached at all when reduce is set, or when there's no real scroll room to attach one to meaningfully. - **The bench-and-shoes graphic is `aria-hidden`.** It's a continuously changing illustration tied to scroll position. Nothing is communicated by it alone: every stage's name and technique description is in the card grid below in plain markup at all times. - **Tap targets**: `44px` minimum height on every button, nav link, and form control. - **Structure**: one `