fix(landing): mobile iter 2 — pointer:coarse, copy, layout polish#42
Merged
johnnichev merged 1 commit intomainfrom Apr 6, 2026
Merged
fix(landing): mobile iter 2 — pointer:coarse, copy, layout polish#42johnnichev merged 1 commit intomainfrom
johnnichev merged 1 commit intomainfrom
Conversation
Addresses the 10 issues from Galaxy S23 testing after PR #41. Critical: header still showed full nav on mobile because Chrome's "Desktop Site" mode reports a viewport of ~1280px (not ~980px as initially assumed), which exceeded the 1024px breakpoint added in PR #41. The fix is to detect touch input via `@media (pointer: coarse)`, which the Desktop Site toggle cannot override. This is the only reliable signal for "this is a touch device, no matter what the viewport pretends to be." Issues fixed: 1. **Header nav still showing on mobile** — Added @media (pointer: coarse) block that forces hamburger + drawer regardless of reported viewport. Also removes nav-hide-on-scroll on touch (issue #10): the auto-hide stays as a desktop progressive enhancement only. 2. **Hero pill grid felt templated** — Replaced 8 generic pills with a cleaner "Works with · OpenAI Anthropic Gemini Ollama" provider strip. Each provider gets a small cyan dot prefix. Removed the redundant feature pills (Multi-Agent Graphs, 50 Evaluators, etc.) since they already appear in the dedicated features section below. 3. **Supervisor agent chips broke into 3+1 layout** — Switched .sim-agents to a 2-column CSS grid with `:last-child:nth-child(odd)` selector that spans the orphaned last item across both columns. Handles 2/3/4 agent counts gracefully. 4. **"What is Selectools?" copy too dense** — Restructured into 3 short paragraphs with a visually distinct middle line listing capabilities separated by middle-dots. Removed the redundant "Unlike LangChain..." framing (the comparison tables already make this case). Closing paragraph keeps the brand voice. 5. **Code block scroll indicator** — Added a right-edge gradient mask to .code-body matching the comparison table pattern. Signals "more content this way" for horizontally-scrollable code. Mask drops on hover/focus so users see the full content when engaging. Also reduced code font slightly on mobile (12px → 11.5px) for better fit. 6. **Feature cards too tall on mobile** — Compact card layout under @media (max-width: 768px), (pointer: coarse): 28px → 20px padding, 40 → 32px icon, 32 → 14px grid gap. Cards now feel like a tight group instead of 1/3-screen blocks with awkward gaps. 7. **"Live · no server required" chip orphaned** — Moved inline with the "Visual Agent Builder" section label so it reads as a header annotation rather than a floating chip between the description and the card. 8. **Comparison table cells wrapping to 3 lines** — Bumped .cmp-table min-width from 640px to 800px so each column has ~115px (enough for "macOS desktop app" and "No (desktop only)" to fit on 1-2 lines). Added `white-space: nowrap` to .yes/.no/.mid verdict cells so 2-3 char answers never wrap awkwardly. 9. **No gap before first builder card in "Three paths"** — Added explicit margin-bottom: 64px on the section description and padding-top: 8px on the cards container. 10. **Header should always be visible** — Removed the hide-on-scroll-down behavior on touch devices (kept on desktop where it's a thoughtful progressive enhancement). On mobile the nav now stays fixed at the top throughout scrolling, which doubles as a wayfinding aid. Approach informed by /adapt and /clarify skill guidelines. The @media (pointer: coarse) pattern is the key insight from /adapt: viewport-based responsive design is fundamentally fragile because users can override it (Desktop Site mode, Reader Mode, browser zoom). Touch input is a hardware property that cannot be spoofed.
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.
Summary
Iteration 2 of mobile responsive fixes after Galaxy S23 testing of PR #41. Addresses 10 specific issues from the bug report. Applied /adapt and /clarify skill guidelines.
The critical insight
PR #41 bumped the breakpoint from 900px → 1024px to catch Chrome's "Desktop Site" mode. That assumption was wrong. Chrome on Galaxy S23 in Desktop Site mode actually reports a viewport of ~1280px (not ~980px), which still exceeded the 1024px breakpoint. The full nav remained visible and squeezed.
The fix is
@media (pointer: coarse). Touch input is a hardware property that the user-agent cannot spoof — no "Desktop Site" toggle can hide the fact that the device has a touchscreen. This is the only reliable signal for "this is a touch device, no matter what the viewport pretends to be."Issues fixed (mapped to your numbered bug report)
@media (pointer: coarse)block forces hamburger + drawer regardless of reported viewport:last-child:nth-child(odd) { grid-column: 1 / -1 }so orphan items span full widthwhite-space: nowrapto Yes/No verdict cellsThe /adapt and /clarify takeaways
From /adapt: Viewport-based responsive design is fundamentally fragile because users can override it (Desktop Site mode, Reader Mode, browser zoom, accessibility settings). The reliable signal for "is this a touch device" is
@media (pointer: coarse), which queries hardware capability. Combined with viewport breakpoints, you get defense in depth.From /clarify: The "What is Selectools?" copy was suffering from textbook clarity problems: one long sentence with a list rammed inside, repeated "Unlike X" framing, and a poetic closing line that didn't add value. The rewrite is shorter, scannable, and uses visual hierarchy (a brighter middle-dot list) to break up the prose.
Detailed changes
CSS (in
landing/index.html)Touch-input override block (the centerpiece)
```css
@media (pointer: coarse) {
.nav-burger { display: block; }
.nav-drawer { display: block; }
.nav-links.hide-mobile { display: none; }
.hero-grid { grid-template-columns: 1fr; }
.hero-flow { display: none; }
.grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
}
```
Provider strip (replaces hero pills)
.hero-providers,.hero-providers-label,.hero-providers-list,.providerclasses::beforeSupervisor agent chips grid
:last-child:nth-child(odd) { grid-column: 1 / -1 }handles odd counts gracefullyCode block scroll indicator
mask-image: linear-gradient(to right, #000 0, #000 calc(100% - 28px), transparent 100%)on .code-body:hoverand:focus-withinso engaged users see full contentCompact card layout
@media (max-width: 768px), (pointer: coarse): card padding 28→20, icon 40→32, grid gap 32→14Comparison table column widths
.yes,.no,.midcells getwhite-space: nowrapso verdict text never wrapsNav hide-on-scroll: desktop only
var allowHide = !prefersReduced && window.matchMedia('(pointer: fine)').matchesMarkup changes
Hero pills → provider strip
```html
"What is Selectools?" rewrite
```html
Open-source Python library for production AI agents. One
pip installgives you the full stack:Multi-agent graphs · Tool calling · Hybrid RAG · 50 evaluators · Guardrails · Audit logging · Visual builder
No DSL. No separate packages. No paid SaaS. Your code stays plain Python — readable, debuggable, yours.
\`\`\`Visual Builder section header
Test plan
After merge, on Galaxy S23 specifically (the device that surfaced these issues):
Test in BOTH normal mobile mode AND "Desktop Site" mode:
Regression on desktop:
What's NOT in this PR
If anything still feels off after merge, I'll iterate on the same
fix/mobile-iter-2branch — no need to spawn another PR.