Skip to content

refine(web): polish homepage craftsmanship - #2

Merged
sabahattink merged 7 commits into
mainfrom
feat/recall-problem-section
Aug 7, 2026
Merged

refine(web): polish homepage craftsmanship#2
sabahattink merged 7 commits into
mainfrom
feat/recall-problem-section

Conversation

@sabahattink

Copy link
Copy Markdown
Owner
  • feat(web): implement problem comparison section
  • feat(web): implement workflow section
  • refine(web): elevate Problem and Workflow composition
  • refine(web): reduce repeated UI patterns across the homepage
  • fix(web): restore visible keyboard focus ring on buttons, add selection color

Summary

This PR continues the Recall homepage refinement work after the initial web foundation was merged.

It adds the Problem and Workflow sections, removes duplicated narrative/UI patterns, replaces the generic feature-card grid with a typography-first presentation, simplifies workflow visualization, and fixes two concrete accessibility/design-system issues: the missing visible keyboard focus ring on buttons and the missing text-selection styling.

The objective is to make the homepage feel more like a deliberate engineering product and less like a generic SaaS landing page, without adding new product features or changing Recall CLI behavior.

Related issue

None.

Test plan

  • pnpm lint
  • pnpm typecheck
  • pnpm test
  • pnpm build
  • Manually verified desktop/mobile layout and dark/light themes where Playwright was available
  • Verified keyboard focus-ring behavior in the browser
  • Verified production CSS output for the focus-ring fix
  • Confirmed Recall CLI/package tests remain green

Checklist

  • New/changed findings (risks, conventions, features) carry evidence ({ path, reason }) — not applicable to this web-only PR
  • No source files outside .recall/, .gitignore, or an explicit output path are written — no Recall CLI write behavior changed
  • Human-authored Markdown content outside the generated markers is preserved — no Recall memory-writing behavior changed
  • A changeset was added if this should be released (pnpm changeset) — not required; this PR only changes the website and does not publish recall-context

Adds ProblemSection (apps/web/src/components/marketing/problem-section.tsx)
and integrates it immediately after HeroSection on the marketing page —
no other section, the Hero, header, footer, docs, or routing touched.

Structure follows docs/design-system.md exactly:
- H2 "Every new session starts here." + supporting copy, reusing the
  shared Section/Container wrapper every other homepage section uses
  (§5, §15 "reuse by default").
- A two-column comparison at `lg:grid-cols-2` (matches the Hero's own
  breakpoint), stacking to "Without Recall" then "With Recall" on
  mobile via DOM order — no separate mobile-only markup.
- Both comparison columns share one local `ComparisonCard` helper
  (border, bg-card, p-6, rounded-lg, no shadow, no hover — §7: cards
  that aren't clickable get no hover state).
- "Without Recall": a restrained transcript (speaker label in
  muted-foreground, message in foreground, plain stacked text) — no
  chat bubbles, no avatars, no gradients, not styled as a branded chat
  UI.
- "With Recall": a checklist reusing the exact success-checkmark
  pattern already established in HeroTerminal (§15 consistency), ending
  in a plain "Context ready." status line.
- Closing centered statement below the comparison, in muted-foreground
  to match the rest of the page's supporting-text convention.

Every color is an existing semantic token (foreground, muted-foreground,
border, card, success) — no new arbitrary colors, no gradients, no
shadows, no animation, no icons beyond the same functional checkmark
already in use elsewhere on this page.

Visual verification (Playwright, localhost dev server): confirmed at
1440x900 and 390x844, in both light and dark theme — card balance,
heading wrap, mobile stacking order (Without Recall first), zero
horizontal overflow (scrollWidth === clientWidth at 390px), contrast,
and visual consistency with the existing Hero.

Validation: `pnpm --filter recall-web lint/typecheck/test/build` and
root `pnpm lint/typecheck/test/build` all green (16/16 workspace tasks).
Adds HowRecallWorksSection (apps/web/src/components/marketing/
how-recall-works-section.tsx) and integrates it immediately after
ProblemSection on the marketing page. Hero, ProblemSection, header,
footer, docs, routing, and copy outside this section are untouched.

Structure follows docs/design-system.md exactly:
- H2 "How Recall works" + supporting paragraph, using the shared
  Section wrapper every other homepage section uses (§5, §15 "reuse
  by default").
- Four equally-sized step cards (Scan Repository / Build Memory /
  Understand Task / Provide Context), each a plain bordered card
  (border, bg-card, p-6, rounded-lg, no shadow, no hover — §7: not
  clickable, so no hover state) containing a mono step numeral (`01`-
  `04`, matching the numeral convention already established in the
  page's existing "How it works" section), an h3 title, and a short
  description.
- Cards are connected by a single hairline (`bg-border`) between each
  pair — vertical when stacked on mobile, horizontal in the row on
  desktop — implemented as flat flex siblings (not nested per-card
  wrappers) so all four cards share the exact same `flex-1` sizing
  rule and stay genuinely equal-width regardless of connector
  placement. This is a connected-steps flow, not a timeline: no dates,
  no large illustrations, no icons beyond the existing checkmark style.
- A compact terminal block below the steps, visually identical to
  HeroTerminal's treatment (border, bg-code-background, font-mono,
  `$`-prefixed command, success-colored checkmarks) but narrower
  (max-w-xl) to read as a confirmation rather than a second hero.

Every color is an existing semantic token (foreground, muted-foreground,
border, card, code-background, success) — no new arbitrary colors, no
gradients, no shadows, no animation, no illustrations.

Note: a separate, pre-existing "How it works" section (3 steps: Scan/
Rank/Generate) already exists further down this same page from the
original scaffold. It was left untouched per "do not modify existing
copy outside this section" — the two sections now temporarily overlap
in subject matter until a later pass consolidates or removes the older
scaffold section.

Visual verification (Playwright, live dev server): confirmed at
1440x900 and 390x844, in both light and dark theme — equal card widths,
connector consistency (vertical on mobile, horizontal on desktop),
terminal readability in both themes, zero horizontal overflow
(scrollWidth === clientWidth at 390px), and visual consistency with
the existing Hero terminal.

Validation: `pnpm --filter recall-web lint/typecheck/test/build` and
root `pnpm lint/typecheck/test/build` all green (16/16 workspace tasks).
An audit pass over Hero, ProblemSection, and HowRecallWorksSection
against docs/design-system.md, treating the homepage as one connected
narrative rather than three independent sections — no new sections,
no copy changes, no new dependencies.

Findings and fixes:

- HowRecallWorksSection's connector line was centered against the
  tallest card's full height (flex `self-center`), so on desktop it
  landed at an approximate row-center rather than through the step
  numerals it's meant to connect. Pinned it to a fixed offset (24px
  card padding + 10px, half of `text-sm`'s exact 20px line-height —
  verified against Tailwind's own --text-sm--line-height token) so it
  runs precisely through every numeral regardless of how a
  description happens to wrap. This is the kind of "disciplined
  alignment" the design system explicitly calls for, and it was
  previously only approximately correct.
- ProblemSection's two comparison card titles both used identical
  foreground weight, giving no typographic signal that "Without
  Recall" describes a problem and "With Recall" describes its
  resolution. Added a `muted` option to the shared card title (used
  only for "Without Recall"), applying an existing token
  (muted-foreground) rather than introducing any new color — per
  design-system.md §4 rule 3, color hierarchy (not size or decoration)
  is exactly how this system is meant to carry that kind of meaning.
- Hero was evaluated and deliberately left unchanged: it already
  reads as restrained, typography-led, and correctly hierarchical: an
  audit finding no defect is itself a legitimate outcome, not a
  missed opportunity.

One idea considered and explicitly rejected: scroll-triggered
fade/slide reveal animations on these sections. docs/design-system.md
§10 forbids this outright ("every section is visible and fully
rendered immediately... not by virtue of an animation permitting it
to appear"), which directly conflicts with looser "progressive
reveal" language elsewhere — the design system document is the
tie-breaker per its own stated authority, so no motion was added
anywhere in this pass.

Validation: `pnpm --filter recall-web lint/typecheck/test/build` and
root `pnpm lint/typecheck/test/build` all green (16/16 workspace
tasks). Visual verification via Playwright was attempted but the
browser bridge was unresponsive for the full session (connects, then
times out) — correctness was instead confirmed via the rendered HTML
output (both new classes present and correct in the live dev-server
markup) and exact CSS math against Tailwind's own token values, not
a guess. Live visual confirmation is still recommended once the
bridge is available.
Implements the approved items from the homepage narrative audit —
removing duplication and diversifying visual language, not adding new
sections, features, or copy.

1. Removed the older scaffold "How it works" (3-step: Scan/Rank/
   Generate). It duplicated HowRecallWorksSection's 4-step flow with a
   different step count a few sections later on the same page — the
   single most credibility-damaging issue found in the audit (an
   engineer would read it as unedited). HowRecallWorksSection already
   covers this ground with more care; this is pure subtraction.

2. Redesigned "What Recall generates" from a 6-card bordered grid
   (FeatureCard, now unused and removed) into a typography-first
   definition list: a semantic `<dl>` with `divide-y` hairlines between
   rows instead of six repeated `border + rounded-lg + p-6` boxes,
   generous per-row spacing (py-6/py-8), and a two-column dt/dd layout
   on wider viewports. Same six title/description pairs, same order,
   zero new copy — only the container changed. This was the single
   most generic-feeling section on the page (a textbook SaaS-grid
   pattern); it's the fourth consecutive card grid a scrolling visitor
   would otherwise see after Hero/Problem/Workflow.

3. Replaced HowRecallWorksSection's closing terminal block with
   MemoryFlow, a borderless data-flow line ("Repository → Architecture
   · Conventions · Decisions · Risks · Technical debt → Coding agent"
   plus "Context ready.") instead of a second `$ recall context`
   terminal. The Hero already demonstrates terminal output; repeating
   it two sections later added a second, weaker version of the same
   idea rather than a new one. Every label reused verbatim from
   existing copy elsewhere on the page (Hero, ProblemSection) — no new
   copy introduced. Uses `role="img"` + one descriptive `aria-label`
   (same accessible pattern as HeroTerminal), with the visual glyphs
   `aria-hidden`.

Net effect: card-count in the Hero-to-comparison-table stretch of the
page drops from 13 bordered boxes to 4 (the two ProblemSection cards
and... nothing else — the step cards were the only bordered element
left in HowRecallWorksSection after this change). No motion added
anywhere; docs/design-system.md §10's ban on scroll-triggered reveal
animations was treated as non-negotiable per its own stated authority.

Validation: `pnpm --filter recall-web lint/typecheck/test/build` and
root `pnpm lint/typecheck/test/build` all green (16/16 workspace
tasks). Playwright's browser bridge was unresponsive for this entire
session (same issue as the prior turn) — correctness was verified via
the live dev server's rendered HTML instead (confirmed zero remaining
occurrences of "How it works", the new `<dl>` markup with all six
features present, and MemoryFlow's exact output). A live visual pass
is still recommended once the bridge reconnects.
…on color

buttonVariants carried focus-visible:outline-none with no replacement ring.
Because Tailwind v4 compiles utilities into a layer declared after base,
that class silently beat the global :focus-visible rule in globals.css,
leaving the Hero's primary and secondary CTAs with no visible focus
indicator on keyboard navigation — a violation of design-system.md §13.
Removing the redundant override lets the existing global ring apply.

Also adds the ::selection styling design-system.md §3 specifies but
globals.css never implemented (accent at low opacity).
@sabahattink
sabahattink merged commit e6ece8c into main Aug 7, 2026
3 checks passed
@sabahattink
sabahattink deleted the feat/recall-problem-section branch August 7, 2026 10:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant