Skip to content

feat(landing): overdrive 6 sections + footer + 3 wordmark variants#47

Merged
johnnichev merged 12 commits intomainfrom
feat/landing-overdrive-fused
Apr 7, 2026
Merged

feat(landing): overdrive 6 sections + footer + 3 wordmark variants#47
johnnichev merged 12 commits intomainfrom
feat/landing-overdrive-fused

Conversation

@johnnichev
Copy link
Copy Markdown
Owner

Summary

Replaces 6 templated landing-page sections, the footer, and the wordmark with distinct visual treatments unified by a section-local "execution pointer" device. This is a continuation of the overdrive work from #46 (which redesigned the other 4 sections).

The design contract is pinned in docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md (commit d42ecfe).

What changed

# Section Before After
1 #what Bullet stack + generic mac terminal Single full-width terminal that types its script line-by-line on viewport entry, paired with a vertical capability rail whose chips light up in sync with their trigger lines
2 #see-difference Side-by-side LangGraph (25 lines) vs selectools (1 line) + green checkmark list CSS Grid 2-column drag-to-compare slider; auto-sweeps once on viewport entry; annotations cascade in as the slider passes their thresholds
3 #production 4 stacked result.* cards Interactive trace explorer — clickable agent loop nodes (llm_call → tool_selection → tool_execution → llm_call) above a single result panel that swaps content; auto-plays through nodes once on viewport entry
4 #enterprise Sad full-width pill row inside the bento Extracted to its own section with 5 distinct exhibits: animated coverage ring (95%), test counter (4612), version stack (3.13→3.9), CycloneDX SBOM card, stability marker rows
5 #eval 3 stacked tag-cards Hardcoded mock test-report skeleton that fills metrics on viewport entry + 2-row marquee of all 50 evaluators scrolling in opposite directions
6 #faq Stacked accordion selectools docs REPL — search bar with prompt, left-rail category tabs, questions as ? prompts, click to expand answers with inline syntax-highlighted code
footer Plain attribution + 4 link row Terminal sitemap rendered as $ tree selectools.dev/ output with hover-highlighted paths and a never-stopping caret
wordmark Static "selectools" text 3 switchable variants via ?logo=1|2|3 (persisted to localStorage): [•] selectools (default, with favicon), s▌electools (cursor inside the word), and a 3-row terminal banner art version

The animating principle

Every redesigned section composes the same shared CSS atoms (.exec-dot, .exec-caret, .exec-scan, @keyframes exec-stamp) defined in commit 89c9a8c. There's no global moving DOM node — each section owns its own IntersectionObserver-triggered animation. The cohesion comes from sharing the visual vocabulary (cyan #22d3ee, eased curves, timing language), not from runtime coordination.

Mobile adapt

Verified at 360x760 (Galaxy S23), 390x844 (iPhone 12), 768 (tablet), 1024 (small desktop), 1280 (desktop).

Notable mobile fixes in 508eceb:

  • Bento (#features from feat(landing): overdrive 4 sections — 4 distinct visual genres #46) — inline-style cell pinning beat media queries via specificity. Added !important overrides at the 700px breakpoint plus an intermediate 1100px-701px reset.
  • Drag-to-compare (#see-difference) — at <=700px, replaced with a stacked 2-row layout (LangGraph above, selectools below), both full-width. Slider/divider/knob hidden.
  • Nav links.nav-links (defined later in source) was beating .hide-mobile even at <=1024px. Added higher-specificity .nav-links.hide-mobile selector to the existing media query.

Final overflow audit at 390px: zero horizontal overflows across the entire page.

Reduced motion (WCAG AA)

Every animation has a designed static fallback under prefers-reduced-motion: reduce. Each fallback is an intentional final-state composition, not a stripped animation. All 6 redesigned sections plus the footer have explicit overrides in the existing reduced-motion media block.

Performance

  • +2009 net lines to landing/index.html (~209KB → ~286KB), well within budget
  • No new fonts (reuses Plus Jakarta Sans + JetBrains Mono)
  • No new image assets (everything CSS / SVG / inline text)
  • 2 new favicon SVGs (for wordmark variants)
  • No new dependencies, no frameworks, vanilla JS for all observers

Test plan

  • Desktop 1280x900: all 8 redesigned surfaces render correctly, animations play on viewport entry
  • Tablet 1024x800: bento drops to 4-col, sections stack as needed
  • Mobile 390x844 (iPhone 12): zero horizontal overflows, bento single-column, drag-to-compare stacks vertically, FAQ rail collapses to horizontal scroll
  • Mobile 360x760 (Galaxy S23): same as iPhone 12, all touch targets >=44px
  • Wordmark ?logo=1: [•] selectools renders with pulsing dot, favicon loads
  • Wordmark ?logo=2: cursor blinks between s and electools
  • Wordmark ?logo=3: 3-row terminal banner renders with cyan glow
  • Reduced motion: all sections have static fallbacks (verified per-section)
  • Real device test: defer to user (Galaxy S23 / iPhone)

Pins the design contract for the next phase of landing overdrive work:
6 sections (What is / See the difference / Production-ready /
Enterprise-ready / Built-in evaluation / FAQ) plus footer plus 3
wordmark variants. Fuses A+C: every section gets technical proof
(living documentation) unified by a section-local execution-pointer
device (abstract pulse, not a character). Includes per-section mobile
fallbacks, prefers-reduced-motion fallbacks, build order, performance
budget, and definition of done.
Adds the shared design tokens, keyframes, and reusable atoms that all
six redesigned sections will compose. The execution pointer is a
conceptual entity (cyan pulse representing live execution) implemented
as section-local animations sharing common timing and color.

Atoms added:
- .exec-dot — pulsing status indicator (used in wordmark, headers)
- .exec-caret — blinking block cursor (terminals, wordmark)
- .exec-scan — one-shot horizontal beam sweep (banners, terminals)
- @Keyframes exec-stamp — one-shot scale + cyan ring for exhibits

Tokens: --exec-color, --exec-glow(-soft), --exec-pulse-dur,
--exec-step-dur, --exec-blink-dur, --exec-ease-step, --exec-ease-soft.

Reduced-motion overrides included in the existing media block. No
visual changes yet — atoms have no consumers until Section 1 lands.
Replaces the bullet stack + generic mac-terminal code window with a
single full-width terminal panel that types its script line-by-line on
viewport entry, paired with a vertical capability rail whose chips
light up in sync with their trigger lines.

The terminal types 14 lines over ~3s using staggered transition-delays
(reuses the path-term pattern from PR #46). Each chip carries an
inline --chip-delay CSS var; the JS observer reads it and stages the
.is-lit class via setTimeout. The execution pointer settles as a
blinking caret at the end of agent.run() once typing finishes.

Capability mapping (line → chip):
  HybridRAG import         → Hybrid RAG (0.45s)
  PIIGuardrail import      → Guardrails (0.65s)
  AuditLogger import       → Audit logging (0.85s)
  @tool() decorator        → Tool calling (1.30s)
  Agent(...) constructor   → Multi-agent graphs (1.95s)
  agent.run(...)           → 50 evaluators (2.75s)
  trailing comment         → Visual builder (3.10s)

Mobile: stage collapses to single column, terminal min-height 340px,
chips stack below. Reduced motion: terminal lines snap visible, all
chips force-lit, caret static. Both fallbacks designed as intentional
static compositions, not stripped animations.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 1"
Replaces the 3 stacked tag-cards (Deterministic / LLM-Judge /
Infrastructure) with a hardcoded mock test report skeleton that fills
in metrics on viewport entry, plus a full-width 2-row marquee of all
50 evaluators scrolling in opposite directions.

The report:
- pytest-style header bar with amber spinner during running, then
  green dot + "passed" status when done
- 3 metric rows (accuracy / latency p50 / total cost), each with
  cyan/amber/green animated bar fills and tabular-num value reveals
- Footer line: "1 passed in 142ms" + assertion summary

Choreography: bar fills cascade at 0.2s / 0.55s / 0.9s, value reveals
follow at 1.5s / 1.85s / 2.2s, status flips to "passed" at 2.7s.

The marquee renders all 30 deterministic + 20 judge evaluators in two
rows scrolling at 32s/38s in opposite directions. Edges masked with
linear-gradient for clean fade-in/out. Tags duplicated inline for
seamless loop.

Code window on the left preserved as-is. Iframe report+trace previews
below the new stage preserved as-is — they're real proof and the user
only flagged the chip-card layout.

Mobile: stage stacks single-column, marquee tags shrink. Reduced
motion: report snaps to done state, marquee freezes mid-scroll.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 5"
Replaces the 4 stacked result.* cards with a clickable agent loop:
4 nodes (llm_call → tool_selection → tool_execution → llm_call) above
a single result panel that swaps content based on the active node.
Each node represents a step the agent took; clicking it inspects what
that step produced (reasoning text, tool call, tool output, final
content) along with step metadata (tokens, cost, guardrail status).

Section gets id="production" so deep links work.

Choreography:
- IntersectionObserver fires auto-play through nodes 1→2→3→4 at 850ms
  intervals on viewport entry (one-shot, observer disconnects after)
- After auto-play, the panel idles on the final node
- User can click any node anytime to inspect that step
- Keyboard nav: ArrowLeft/ArrowRight between nodes (proper tablist
  semantics with role="tab"/aria-selected)

The 4 panel states are pre-rendered in the markup and toggled via
.is-active. Active node gets the cyan ring + glow from the exec-stamp
language. Arrows past the active step turn cyan (visited).

Mobile: nodes stack vertically, arrows hide. Reduced motion: state
fade-in animation killed, panel still swaps on click.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 3"
Replaces side-by-side LangGraph/selectools code blocks + green
checkmark list with a drag-to-compare slider. Both code blocks live
in the same container, stacked. The selectools (foreground) layer is
clipped via clip-path inset tied to a --split CSS variable. A range
input (visually hidden but native, gives free touch + keyboard
support) drives --split on input. A glowing cyan split line + circular
knob render the handle.

The 4 old checkmarks become numbered annotations below the pane that
fade in as the slider passes their thresholds (20% / 40% / 60% / 80%).

Choreography: on viewport entry, an IntersectionObserver fires a
one-shot auto-sweep — 50 → 95 → 50 over ~2.4s using requestAnimationFrame
with cubic easing. The annotations cascade in as the slider passes
each threshold, then stay shown after the sweep returns. After the
sweep completes, the slider sits at 50 awaiting user drag.

The selectools foreground extends past the original 1-line example
into 6 comment lines that double as inline copy ("That's it. No
StateGraph. No TypedDict. No add_node, no add_edge..."). The pane
is 480px tall so both languages have room to breathe at any split.

Section gets id="see-difference" for deep linking.

Touch: <input type="range"> handles touch natively; the knob is 48px
on mobile for thumb reach. Reduced motion: clip-path transition killed,
all annotations force-shown, slider is fully usable as static comparison.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 2"
Removes the sad full-width pill row that lived as bento__cell--full
inside #features. Replaces it with a standalone #enterprise section
between #features and #eval, containing 5 distinct micro-components
laid out as exhibits in a 5-column grid:

  1. Coverage ring  — animated SVG circular gauge climbing to 95%
  2. Test counter   — large number ticking from 0 → 4612 with cubic ease
  3. Version stack  — 5 rungs (3.13 → 3.9) lighting up sequentially
  4. CycloneDX SBOM — paper-document card with folded corner + barcode
  5. Stability card — @stable / @beta / @deprecated marker rows

Each exhibit fades in on viewport entry with a stamp effect (the
exec-stamp keyframe from the setup commit) staggered ~130ms apart.
The counter ticks via requestAnimationFrame with an easeOutCubic curve
starting after the initial stamp completes.

Section gets id="enterprise" for deep linking.

Mobile: 5-col → 2-col at 1080px → 1-col at 600px. Reduced motion:
exhibits snap visible, ring snaps to 95%, version stack lights all
rungs, counter shows final value (no tick animation). All fallbacks
designed as intentional static compositions.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 4"
Replaces the basic stacked accordion with a search-driven docs REPL:
- Left rail: 5 category tabs (all / getting-started / concepts /
  providers / advanced) with question counts as pill badges
- Top bar: prompt-styled search input ("docs >") with cyan caret
- Main panel: 10 questions render as ? prompts in JetBrains Mono.
  Click to expand the answer in the same monospace style with
  inline syntax-highlighted code blocks. Active question gets a
  cyan glow strip on the left.

The 10 questions and their full answers are preserved from the old
accordion (zero copy regression). Each question is tagged with both
data-cat (for category filter) and data-q (extra search keywords
beyond the visible text — e.g. "langchain" returns the comparison Q).

Behaviors:
- Click a category tab → filters question list (with empty state)
- Type in search → filters by text + keyword tag, instant
- Categories and search compose (intersect)

Hero moment: on viewport entry, the pointer auto-types "production"
into the search bar character-by-character (95ms each), filters down
to the production-readiness question, then clears the input after
1.4s so the user lands on a clean searchable list. The auto-type only
fires once per page load.

Mobile: rail collapses to a horizontal scroll of category chips above
the panel. Question category labels hidden. Answer indent reduced.

Reduced motion: answer fade-in killed, auto-type seed still runs but
without the smooth fade. Categories and search work identically.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 6"
Replaces the basic footer (NichevLabs attribution + 4 link row) with
a terminal sitemap rendered as \`\$ tree selectools.dev/\` output.
Each path in the tree is a hover-highlighted link with a cyan glow on
hover. Comments after the paths describe what each section is.

Layout:
  \$ tree selectools.dev/    # site map
  .
  ├── docs/
  │   ├── quickstart.md
  │   ├── configuration.md
  │   ├── providers.md
  │   └── api-reference/
  ├── examples/      # 88 numbered scripts
  ├── builder/       # visual flow editor
  ├── github/        # source · issues · discussions
  ├── pypi/          # pip install selectools
  └── changelog/     # what shipped, what changed

  # selectools v0.20.1 · Apache-2.0 · made by NichevLabs
  # for developers who ship
  \$ ▌

The trailing \`\$ ▌\` has the exec-caret atom (blinking block cursor)
that never stops — the page is "still running". Comments are styled
in italic dim text per terminal convention.

Mobile: smaller font (11.5px), tighter padding. Reduced motion: caret
static via the global atom override. Box-drawing characters wrap
gracefully via overflow-x: auto on the tree container.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Footer"
Three wordmark variants live in the nav-logo slot, switchable via
?logo=1|2|3 URL param. Selection is persisted to localStorage.
A small head-script reads the param BEFORE paint and sets
html[data-logo] to avoid FOUC. CSS shows only the active variant via
[data-logo="N"] .wm--N { display: inline-flex }.

Variant 1 — [•] selectools (default)
  Pulsing cyan dot inside square brackets followed by the wordmark.
  Brackets read as "select"; the dot is the execution pointer atom
  (.exec-dot, defined in the setup commit). Reduces cleanly to a 16x16
  favicon as landing/favicon.svg with an animated SVG dot.

Variant 2 — s▌electools
  Block cursor (.exec-caret atom) inserted between the s and the rest
  of the wordmark. The caret blinks via the global exec-blink keyframe.
  Companion favicon: landing/favicon-cursor.svg (a vertical block cursor).

Variant 3 — terminal banner art (3-row box-drawing)
  Compact 3-row box-drawing rendering of "selectools" set in JetBrains
  Mono at ~6.5px on desktop / 5.5px mobile. Cyan with a soft drop-shadow
  glow. Unmistakably terminal-coded; nobody else does this on a Python
  framework landing page. Uses .wm--3__banner with a <pre> for whitespace
  preservation. Companion favicon: same as Variant 2 (cursor).

All three variants:
- Render inside <a class="nav-logo"> with a visually-hidden <span>selectools</span>
  for screen readers (aria-hidden on every variant for the visuals)
- Existing nav-logo "wink" hover transform applies to all three uniformly
- Reduced motion: caret blink killed (Variant 2), banner mask animation killed
  (Variant 3), pulse killed via the global atom override

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Wordmark"
Three bugs caught by Playwright visual audit:

1. FAQ rail was being hoisted to the top of the page.
   Cause: <nav class="repl__rail"> matched the existing global
   `nav { position: fixed; top: 0 }` site nav selector, escaping its
   grid container and pinning to the page top.
   Fix: switch to <div role="navigation"> — same a11y semantics, no
   inheritance from the global nav rule.

2. Drag-to-compare slider showed only one half (clip-path bug).
   Cause: clip-path: inset(0 calc(100% - var(--split)) 0 0) does not
   recompute in browsers when var(--split) changes — the parsed value
   is frozen at element creation. Even setting clip-path inline via JS
   didn't help because the existing global .code-body has its own
   mask-image and overflow rules that interacted badly with the
   absolute-positioned layered approach.
   Fix: rewrite as a CSS Grid 2-column layout where the column widths
   are driven by --split (a unitless 0..100 value, multiplied by 1%
   in calc()). Both code blocks live in their own columns, side by
   side. Slider drag resizes the columns. No more clip-path. Drag
   left = wipe LangGraph away (less LangGraph col, more selectools).

3. Eval report status badge stayed on "running" text after the green
   "passed" color flip. Polish: JS now updates the badge textContent
   to "passed" when the .is-done class is added at 2700ms.

Spec ref: docs/superpowers/specs/2026-04-07-landing-overdrive-fused-design.md §"Section 2", §"Section 5", §"Section 6"
User reported #features bento not working on mobile. Audit found 4
mobile issues across the redesigned sections, fixed in one pass:

1. Bento (#features, from PR #46) — broken at narrow viewports.
   Cause: two cells use inline `style="grid-row:1;grid-column:4 / 7"`
   to pin them to specific positions in the 6-col desktop grid (a fix
   for an earlier bento gap bug). Inline styles beat media queries
   via specificity, so on mobile the cells try to occupy invalid
   positions in the 1-col grid and overflow / collapse.
   Fix: add !important to the existing 700px breakpoint reset for
   .bento__cell--{wide,full,hero} to override the inline styles. Also
   add a 1100px-701px intermediate fix that resets pinned wide cells
   to span 4 cols (full row) at tablet width.

2. Drag-to-compare (#see-difference) — too tight to read at narrow
   viewports because each column shrinks below ~200px and the code
   text gets clipped horizontally.
   Fix: at <=700px, override grid-template-columns to 1fr and stack
   the two code blocks vertically (LangGraph above, selectools below),
   both full-width. Hide the slider, divider, knob, side labels, and
   drag hint — the comparison is static on mobile. Each column grows
   to its content height with internal max-height + overflow-y auto.

3. Nav links — visible at <=1024px even though .hide-mobile rule
   exists.
   Cause: the .nav-links { display: flex } base rule comes later in
   source order than .hide-mobile { display: none } in the 1024px
   media query. Equal specificity (one class each), so cascade order
   wins for .nav-links, defeating the hide.
   Fix: add the higher-specificity .nav-links.hide-mobile selector
   inside the existing 1024px media query. Two-class specificity
   wins regardless of source order.

4. Copy reference to "drag the handle" no longer applies on mobile
   stacked layout. Reworded to "Same outcome — 25 lines of ceremony,
   or one." which works in both contexts.

Verification: Playwright sweep at 390x844 (iPhone 12 portrait) found
zero horizontal overflows on the entire page. All 12 bento cells
render at uniform 358px width in a single column with no overlaps.
@johnnichev johnnichev merged commit f65d067 into main Apr 7, 2026
6 checks passed
@johnnichev johnnichev deleted the feat/landing-overdrive-fused branch April 7, 2026 13:40
johnnichev added a commit that referenced this pull request Apr 7, 2026
Two related changes that go together because they share the new
visual language: the SELECTOOLS terminal banner is now in README.md
and docs/index.md, and the bland 4-card metric rows in #builder and
the comparison section get the same overdrive treatment that the
other landing sections received in PR #47.

## Card overdrive (#builder + comparison)

Replaces 8 generic .card cells (4 below the visual builder, 4 below
the comparison table) with .stat-card scoreboard tiles. Each card has
a distinctive central visualization, distinct from any pattern in PR
#46/#47 (not bento, not compliance shelf).

Builder row (.stat-card--bytes / --deps / --nodes / --price):
1. 49KB — animated horizontal bar comparison: selectools 49KB cyan
   bar vs electron 67MB faint bar. Caption: "1400x lighter than
   electron".
2. 0 deps — mini package.json snippet showing
   "dependencies": {} with the empty braces highlighted in cyan
   and pulsing on a 1.6s loop.
3. 8 nodes — SVG mini-graph: 8 connected dots in a flow pattern
   (2-2-1-2-1 layout). Edges scan-draw in sequence on viewport entry
   via stroke-dasharray animation.
4. $0 — strikethrough "$39 / seat / mo" above a giant cyan-glowing
   "$0" with "FOREVER" caption.

Comparison row (.stat-card--code / --latency / --tests / --cost):
5. 1 line — actual highlighted Python code snippet showing
   AgentGraph.chain(planner, writer, reviewer).run("prompt") with
   strikethrough "25 lines (LangGraph)" comparison line.
6. <0.5ms — semicircle latency dial (SVG arc) with the cyan fill at
   ~3% of the 0..10ms range. Shows just how negligible the overhead is.
7. 4612 — animated counter that ticks from 0 to 4,612 via
   requestAnimationFrame with easeOutCubic. Re-uses the enterprise
   counter pattern from PR #47, smaller scale.
8. $0.03 — itemized receipt with dashed border showing 40 test cases,
   3 providers, 20 judge calls, with a total line. Concrete proof of
   the cost claim, not just the number.

Shared CSS atoms (.stat-card, .stat-card__viz, .stat-card__metric,
.stat-card__sub, .stat-card__compare). 230px min-height. Stagger
reveal via .stat-row.in-view + nth-child transition-delays. Cyan
ring + glow on hover (pointer:fine only). 4-col grid → 2-col at
1024px → 1-col at 600px.

JS observer added: one IntersectionObserver IIFE that finds all
.stat-row[data-stat-row] and wires up the in-view trigger + the
counter tick (any element with data-counter-target inside the row).

Reduced motion: cards snap visible, bar fills snap to final width,
SVG edges show fully drawn, dial fills to final position, counter
shows the final value, JSON pulse killed.

## README.md + docs/index.md

Adds the SELECTOOLS terminal banner art (the 3-row box-drawing
rendering used by Wordmark Variant 3 in the nav) at the top of both
README.md and docs/index.md. Just three lines of box-drawing chars
in a fenced code block. Renders fine on GitHub and in MkDocs.
johnnichev added a commit that referenced this pull request Apr 7, 2026
)

* fix(landing): five small polish items

1. Trace nodes (#production): tool_selection / tool_execution labels
   were overflowing their button containers. Reduced font-size from
   11px to 10px, removed letter-spacing, tightened padding from 10px 8px
   to 10px 6px, added overflow:hidden + white-space:nowrap so text fits
   even at narrow widths.

2. Enterprise @deprecated marker: "2 minors" was wrapping to two lines.
   Added white-space:nowrap and flex:0 0 auto to .ent-marker__count so
   the count stays on one line regardless of available width.

3. FAQ search placeholder: "search the docs..." was misleading because
   the input only filters FAQ items, not the actual docs site. Renamed
   to "search questions..." for honest copy.

4. Wordmark Variant 3 (terminal banner) was rendering at the bottom of
   the nav header instead of vertically centered. Two fixes:
   - .nav-logo gets display:inline-flex + align-items:center + height:100%
     so its content centers within the nav row
   - .wm--3 gets vertical-align:middle for inline contexts
   Now the banner sits in the middle of the header.

6. #see-difference drag-to-compare gets a desktop-only mouse-follow
   mode: hovering over the pane scrubs the slider position from 0 to
   100 based on cursor X. Touch keeps the existing range input as the
   primary control. Visual feedback: cyan ring + ew-resize cursor when
   hovering. Hint copy updated from "drag to compare" to "move your
   cursor across".

(Items 5, 7, 8, 9, OG image will follow in subsequent commits.)

* feat(landing,docs): cards overdrive + Variant 3 logo in README and docs

Two related changes that go together because they share the new
visual language: the SELECTOOLS terminal banner is now in README.md
and docs/index.md, and the bland 4-card metric rows in #builder and
the comparison section get the same overdrive treatment that the
other landing sections received in PR #47.

## Card overdrive (#builder + comparison)

Replaces 8 generic .card cells (4 below the visual builder, 4 below
the comparison table) with .stat-card scoreboard tiles. Each card has
a distinctive central visualization, distinct from any pattern in PR
#46/#47 (not bento, not compliance shelf).

Builder row (.stat-card--bytes / --deps / --nodes / --price):
1. 49KB — animated horizontal bar comparison: selectools 49KB cyan
   bar vs electron 67MB faint bar. Caption: "1400x lighter than
   electron".
2. 0 deps — mini package.json snippet showing
   "dependencies": {} with the empty braces highlighted in cyan
   and pulsing on a 1.6s loop.
3. 8 nodes — SVG mini-graph: 8 connected dots in a flow pattern
   (2-2-1-2-1 layout). Edges scan-draw in sequence on viewport entry
   via stroke-dasharray animation.
4. $0 — strikethrough "$39 / seat / mo" above a giant cyan-glowing
   "$0" with "FOREVER" caption.

Comparison row (.stat-card--code / --latency / --tests / --cost):
5. 1 line — actual highlighted Python code snippet showing
   AgentGraph.chain(planner, writer, reviewer).run("prompt") with
   strikethrough "25 lines (LangGraph)" comparison line.
6. <0.5ms — semicircle latency dial (SVG arc) with the cyan fill at
   ~3% of the 0..10ms range. Shows just how negligible the overhead is.
7. 4612 — animated counter that ticks from 0 to 4,612 via
   requestAnimationFrame with easeOutCubic. Re-uses the enterprise
   counter pattern from PR #47, smaller scale.
8. $0.03 — itemized receipt with dashed border showing 40 test cases,
   3 providers, 20 judge calls, with a total line. Concrete proof of
   the cost claim, not just the number.

Shared CSS atoms (.stat-card, .stat-card__viz, .stat-card__metric,
.stat-card__sub, .stat-card__compare). 230px min-height. Stagger
reveal via .stat-row.in-view + nth-child transition-delays. Cyan
ring + glow on hover (pointer:fine only). 4-col grid → 2-col at
1024px → 1-col at 600px.

JS observer added: one IntersectionObserver IIFE that finds all
.stat-row[data-stat-row] and wires up the in-view trigger + the
counter tick (any element with data-counter-target inside the row).

Reduced motion: cards snap visible, bar fills snap to final width,
SVG edges show fully drawn, dial fills to final position, counter
shows the final value, JSON pulse killed.

## README.md + docs/index.md

Adds the SELECTOOLS terminal banner art (the 3-row box-drawing
rendering used by Wordmark Variant 3 in the nav) at the top of both
README.md and docs/index.md. Just three lines of box-drawing chars
in a fenced code block. Renders fine on GitHub and in MkDocs.

* feat(landing): comparison table polish + OG image + Variant 3 nav centering

Three follow-up items from the polish pass:

1. Comparison table polish (item 9): light touch, no full redesign
   because tables should stay scannable. Three improvements:
   - Verdict cells (.yes/.no/.mid) get pill-shaped backgrounds with
     subtle borders. Each verdict is now a colored badge instead of
     plain text, which makes the table scannable at a glance.
   - The selectools column (col 2) gets a subtle cyan tint background
     and a 2px cyan inset shadow on the left edge. The eye now goes
     straight to the "winner" column without enlarging the column.
   - Subtle row hover state on mouse devices (cyan tint), helps follow
     a single feature row across columns. Coarse pointers skip this.

2. OG image (extra item): the meta tags referenced
   /assets/og-image.svg but the file didn't exist. Created the SVG
   (1200x630) showing a mac terminal window with the SELECTOOLS
   terminal banner art rendered in cyan with glow filter, the
   tagline "Production-ready AI agents in plain Python.", a feature
   sub-tagline, "$ pip install selectools" in a cyan-bordered frame,
   and the full v0.20.1/license/providers footer line.

   Rendered to PNG via Playwright (better social media compatibility
   than SVG since some crawlers don't render SVG). PNG is 238KB,
   exact 1200x630 dimensions. Updated meta tags to reference
   og-image.png with og:image:type and og:image:alt.

3. Wordmark Variant 3 vertical centering (continuation of item 4):
   the previous fix targeted the wrong .nav-logo rule. There are TWO
   .nav-logo definitions in the source (one near other nav styles,
   one near the "logo wink" section later in the file). The later
   one wins via cascade order, and it had display:inline-block. Now
   it has display:inline-flex + align-items:center + height:100%, so
   the banner centers vertically. Verified: nav midY = 28, banner
   midY = 27.5 (alignment within 0.5px is sub-pixel).
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