Skip to content

feat(docs): view-transition polish, branded search + 404, chrome pass - #313

Merged
EricAndrechek merged 24 commits into
mainfrom
website-improvements
Jun 10, 2026
Merged

feat(docs): view-transition polish, branded search + 404, chrome pass#313
EricAndrechek merged 24 commits into
mainfrom
website-improvements

Conversation

@EricAndrechek

@EricAndrechek EricAndrechek commented Jun 10, 2026

Copy link
Copy Markdown
Member

What

A broad polish pass over the docs site, building on #309's astro-vtbot SPA integration — evolved across several overnight cycles from PR-preview feedback. (The direction-aware page slides + title morph from round 1 were tried and ripped out on review — too much motion for docs.)

Progress feedback

  • Navigation progress bar — thin accent bar on slow loads (grace delay keeps fast navs clean). Self-hosted on vtbot's loading() hook: vtbot's own <ProgressBar/> imports Swup's plugin from unpkg.com at runtime in every visitor's browser (verified in the built bundle), which fails our supply-chain bar.
  • Reading-progress bar (ReadingProgress.astro) — a 2px accent line under the header filling with how far through the article you've scrolled; spans only the content column, hidden ≥72rem where the right-rail TOC takes over. The mobile answer to "where am I on this page".
  • Hover prefetch verified already active via ClientRouter (no change needed); reduced-motion guard zeroes all view-transition animations.

Starlight chrome

  • Search dialog branded (three rounds) — design-system frame + pop, blurred backdrop, code-surface input, card result groups with header band + surface-tint row hover, thin branded scrollbars (dialog frame scroller included), accent <mark> hits, branded clear/load-more controls.
  • Asides on brand hues — and then used: nineteen titled note-blockquotes across api/pipes/access-control/sdk/development became real :::note/:::caution asides (sharp edges → caution, clarifications → note).
  • Tabs as a segmented control, prose kbd/mark, accent anchor hover, inner-surface scrollbars, mobile menu button kept on the surface scale, h2 section rule fades out instead of boxing each section.

Landing page

  • New SDK showcase — "Query it like a database. Subscribe to it like a socket." with Ingest / Query / Live-updates tabs, every snippet type-checked against clients/ts/src by reviewers. This surfaced a latent bug in sdk.md's Live Queries example (chained .where() off from(), which has no builder methods) — fixed in both places.
  • The orphan "How it ships" card folded into the quickstart prose.

Docs IA + content

  • Sidebar gains a Reference group (API Reference, TypeScript SDK) — lookup vs narrative; no URL changes.
  • Getting Started → "Troubleshooting first runs": the five first-session trip-ups (schema-refresh 404, pre-flush empty query, fail-closed 403 on non-demo tables, port conflicts, cold-start timing), every claim verified against server code + compose by both reviewers.

404 — "signal lost"

Landing atmosphere, mono 404, an EKG trace (heartbeat decaying to flatline, redrawn by a looping monitor-sweep over a live→dead gradient, dim static ghost underneath, blinking sample dot; static for reduced motion), card quick links, exactly one accessible heading.

PostHog

  • SPA pageview setup verified correct as-is (history_change + init sentinel); added capture_exceptions: true for error tracking on docs JS.

Verification

  • Playwright against the production build each cycle: search survives SPA navs, reading bar 0→0.53→1.0 through a long article @390px and re-arms after navigation, progress bar under throttled fetch, 404 single-heading, hover-prefetch live, no console errors.
  • Screenshot corpus across 390/768/1440/1920/2560px × dark/light incl. search/mobile-nav open; wide-viewport per-element overflow check (1920+2560) clean.
  • Lighthouse (local, prod build): 95 perf / 100 a11y / 100 best-practices / 92 SEO, CLS 0.039, LCP intact.
  • make ci green + both pre-push reviewers ship_it on every push (9 review rounds; 2 iterate rounds caught real bugs — the sdk.md live-query defect and two aside-conversion artifacts — both fixed).

Deliberately not done: splitting api.md/sdk.md (URL churn + redirects felt wrong to ship overnight without feedback — happy to do as a follow-up), Steps adoption on getting-started (would drop the numbered sections from the TOC).

🤖 Generated with Claude Code

EricAndrechek and others added 2 commits June 9, 2026 22:25
View transitions (astro-vtbot, SPA mode):
- Direction-aware 150ms slide on <main>, keyed to sidebar order
  (<PageOrder/>), so next/prev pages slide like paging a book
- <PageOffset name="main"/> kills the fake-scroll artifact when
  navigating away from a scrolled page
- Page-title morph between doc pages via view-transition-name on the
  title-panel h1 (direct-child selector so markdown h1s can't duplicate
  the name and void the transition)
- Self-hosted navigation progress bar on vtbot's loading() hook —
  vtbot's own <ProgressBar/> imports Swup's plugin from unpkg.com at
  runtime in visitors' browsers, which fails our supply-chain bar
- Belt-and-braces reduced-motion guard on all VT pseudo-elements

Starlight chrome:
- Search dialog branded: surface/border/radius on the frame, code-bg
  input with accent focus, card-primitive result groups, accent <mark>
  highlights, blurred backdrop
- Asides mapped onto brand hues (stock blue/purple/orange/red tokens
  were never remapped, so the first :::note would land off-palette)
- kbd/mark prose treatments, accent anchor-link hover, thin branded
  scrollbars on inner scroll surfaces, mobile menu button kept on the
  surface scale instead of stock white inversion

404 page: "signal lost" treatment — landing atmosphere (grid + glow),
mono 404, flatlining waveform, card quick-links; custom h1 replaces the
hidden stock title panel so the page keeps exactly one heading.

PostHog: capture_exceptions enabled (error tracking for docs JS); the
SPA pageview setup (capture_pageview: history_change) was verified
correct against the vtbot lifecycle docs and needs no change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review finding from the pre-push code reviewer: the new transition
choreography, ProgressBar component, branded chrome, 404 redesign, and
PostHog capture_exceptions had no [Unreleased] entry (AGENTS.md
§Documentation Sync).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 10, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR refreshes the documentation site: adds runtime UX components (progress bars, reading progress), scroll/zoom improvements for Mermaid/tables, a global CSS/layout overhaul, sidebar and homepage restructuring, and splits the TypeScript SDK docs into focused topic pages with synchronized examples.

Changes

Docs Site UX, Styling, and Content Refresh

Layer / File(s) Summary
Navigation progress bar and telemetry integration
docs/src/components/Head.astro, docs/src/components/ProgressBar.astro, docs/src/components/PostHog.astro, docs/astro.config.mjs
Adds a persistent SPA load progress bar, mounts it inside the VtbotStarlight wrapper, enables PostHog exception capture for docs JS errors, and sets expressiveCode defaults for wrapped code blocks.
Reading progress, footer wiring, and hero sync
docs/src/components/ReadingProgress.astro, docs/src/components/Footer.astro, docs/src/components/Hero.astro
Introduces a fixed reading progress bar under the doc header, renders ReadingProgress in the compact footer variant, adds ScrollHints to the shared footer area, and synchronizes the hero install chip with the persisted package-manager selection.
Scroll hints, table tokenization, and Mermaid zoom
docs/src/components/ScrollHints.astro, docs/src/components/MermaidZoom.astro
Wraps Mermaid inline SVGs and wide tables in horizontal scrollers, tokenizes table/code tokens for safe breaks, updates edge-fade affordances, and adds a 1:1 natural-size toggle with pan support and refined open/sizing/reset logic to the Mermaid lightbox.
Global layout, typography, search, and 404 atmosphere
docs/src/styles/global.css
Overhauls global CSS: tighter nav translucency, locked content width, Mermaid mobile sizing/panning, three-column breakout grid for wide blocks, GitHub-style table scrollers, expressive-code badges, restyled Pagefind search UI, and a dedicated .wh-404 "signal lost" layout.
Sidebar reorg, homepage tabs, and 404 content
docs/src/config/sidebar.ts, docs/src/content/docs/index.mdx, docs/src/content/docs/404.md
Reorganizes sidebar into a top-level Reference group with SDK subpages, adds tabbed ingest/query/live-update code samples on the homepage, and replaces the 404 page with custom HTML "Signal lost" markup and SVG.
TypeScript SDK landing and topic pages
docs/src/content/docs/sdk/index.mdx, docs/src/content/docs/sdk/queries.md, streaming.md, pipes.md, admin.md, reference.md
Adds an SDK landing page and separate topic pages covering installation/imports, queries, streaming/live queries, named pipes, admin/system operations, and a reference/CLI page including codegen guidance.
Legacy SDK.md formatting and example fix
docs/src/content/docs/sdk.md
Formats key SDK notes as admonitions (auth transport, wh.sql parameter-binding limits, SSE concurrency warning) and corrects the Live Queries example to call .selectAll() before filters.
API, access-control, configuration, and pipes docs
docs/src/content/docs/api.md, access-control.mdx, configuration.mdx, pipes.mdx
Converts API caveats into admonitions, refactors access-control and policy examples into synchronized YAML/JSON tabs, expands configuration reference with YAML/Env examples, and updates pipes bootstrapping docs.
Getting started, deployment, and developer docs
docs/src/content/docs/getting-started.md, deployment.md, development.md, ingest-pipeline.md, architecture.md, claude-code.md
Adds SDK tip and troubleshooting to getting-started, clarifies Docker/compose and reset instructions, consolidates test verbose guidance, updates ingest-pipeline diagram labels, links architecture issues, and adds local Claude Code examples.
Footer responsive tweaks and compact layout
docs/src/components/Footer.astro
Adjusts compact footer link gap/wrap breakpoint and full-footer column collapse breakpoint; ensures ReadingProgress/ScrollHints are rendered in correct footer zones.
Changelog and AGENTS guidance
CHANGELOG.md, AGENTS.md
Adds Unreleased changelog entries summarizing mobile rendering fixes, docs-site UX polish, and SDK docs split; updates AGENTS guidance to point to the new SDK docs structure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Wave-RF/WaveHouse#309: Modifies Head.astro and Starlight integration; directly related to progress-bar mounting changes.
  • Wave-RF/WaveHouse#142: Prior docs UI/starlight component work that this PR extends (Footer/Head edits and new components).

Suggested labels

area/sdk

Suggested reviewers

  • taitelee
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(docs): view-transition polish, branded search + 404, chrome pass' directly relates to the main changes in the PR—documentation improvements spanning progress bars, search styling, 404 redesign, and UI polish.
Description check ✅ Passed The description comprehensively covers the PR's scope, including progress bars, search styling, landing page updates, docs IA changes, 404 redesign, and verification details—all present in the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch website-improvements
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch website-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added documentation Improvements or additions to documentation area/docs Documentation, site/, README labels Jun 10, 2026
@github-actions

github-actions Bot commented Jun 10, 2026

Copy link
Copy Markdown

📚 Docs preview is livehttps://47615bda-wavehouse-docs.wave-rf.workers.dev

  • Commit9f1f343: fix(docs): tabbed code earns wide track; true natural-width probe
  • Author@EricAndrechek, Claude Fable 5
  • Committed — 2026-06-10 14:48 (UTC-04:00)
  • Deployed — 2026-06-10 15:04 EDT

EricAndrechek and others added 8 commits June 9, 2026 22:59
…arch

Review feedback on the PR preview:

- Navigation choreography removed — the direction-aware slide, page-title
  morph, PageOrder and PageOffset are gone (too much motion for docs).
  The vtbot SPA base, the nav progress bar, and the reduced-motion
  view-transition guard stay.
- New ReadingProgress.astro: a 2.5px accent line under the header filling
  with the scrolled-past fraction of the article body — the mobile answer
  to the desktop TOC's "where am I". Doc pages only (rendered from the
  sidebar footer branch), hides on short articles and under the open
  mobile menu, one rAF-throttled passive listener that survives view
  transitions.
- 404 trace reworked into an EKG: heartbeat decaying into a flatline,
  drawn by a looping monitor-sweep dash animation (pathLength-normalized)
  over a live→dead gradient, with a dim static ghost underneath so the
  shape always reads, and a blinking sample dot. Static full trace for
  reduced motion.
- Search round 2: group-title header band + transparent rows on one card
  surface, surface-tint row hover replacing Starlight's bare bright
  outline, synced inner corner radii, branded clear/load-more controls,
  and a gentle reduced-motion-aware pop on open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rule

PR preview feedback round 3:

- Reading bar: 2px solid accent at 75% opacity (was a 2.5px glowing
  gradient), spanning only the content column — offset past the sidebar
  at >=50rem, hidden >=72rem where the right-rail TOC already answers
  "where am I". Fixes the line crossing the sidebar border and the
  unexpected full-viewport width.
- Search dialog: the results list scrolls inside .dialog-frame with a
  stock chunky UA scrollbar against the rounded corner — now thin and
  brand-colored (dialog + frame).
- Doc h2 section rule: the full-width border-bottom boxed every section
  against the content edge; replaced with a hairline that fades out to
  the right (same scannability, no grid-paper feel).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New homepage section "Query it like a database. Subscribe to it like
  a socket." — Ingest / Query / Live-updates tabs showing @wavehouse/sdk
  snippets (insert, chainable query, liveQuery backfill+stream), each
  checked against the API documented in sdk.md. The SDK is a core
  selling point and the landing only showed curl.
- Starlight <Tabs> restyled as a segmented control on the card surface
  (the underlined default was the last stock-looking chrome piece);
  horizontal scroll + thin scrollbar on narrow viewports.
- The lone full-width "How it ships" card read as an orphan section —
  its content (single process, ClickHouse-only dependency) folds into
  the quickstart prose unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Both pre-push reviewers (code + docs) flagged the landing "Live updates"
snippet: wh.from(table) returns a TableRef, which has no .where()/
.orderBy()/.limit()/.liveQuery() — those live on QueryBuilder, entered
only via .select(...)/.selectAll(). The snippet was faithfully copied
from sdk.md's Live Queries example, which has carried the same latent
bug (uncaught because no e2e test exercises that chain shape). Both now
start the chain with .selectAll(); CHANGELOG gets a Fixed entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…group

- Eighteen "> **Title.** body" blockquotes across api/pipes/
  access-control/sdk/development become :::note/:::caution asides:
  the bold lead promotes to the aside label, sharp-edge content
  (at-least-once retry, 64 MiB cap, lockout footguns, latest-tag
  promotion) gets caution, behavioral clarifications get note. Bodies
  unchanged; short untitled clarification quotes stay blockquotes.
- Sidebar: API Reference + TypeScript SDK move from "Guides" into a new
  "Reference" group — lookup material vs narrative. Slugs/URLs are
  untouched; llms.txt page order follows sidebar.ts as before.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round-7 review findings: the two api.md blockquotes with a second
">"-bridged paragraph left artifacts after the aside conversion — the
Insert-only rationale rendered as a detached gray blockquote below its
note, and a stray empty blockquote sat between the FORMAT note and the
64 MiB caution. Continuation folded into the note body, stray ">"
removed, artifact scan across all docs now clean. CHANGELOG count
corrected to nineteen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The five ways a first session actually goes sideways — schema-refresh
404 on a fresh table, querying inside the flush window, fail-closed 403
on non-demo tables, port conflicts, cold-start timing — were each
documented somewhere, but not where a new user hits them. All claims
sourced from existing docs + deployments/compose/standalone.yaml (ports,
WH_SCHEMA_REFRESH_INTERVAL, plain depends_on). The SDK pointer in step 4
becomes a :::tip aside, exercising the styled tip variant.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two parallel design-review agents audited the full screenshot corpus
(13 pages x widths x themes); confirmed-real findings fixed:

- Tabs: Starlight's stock underline is a box-shadow on every tab — it
  survived the segmented-control restyle as a floating arc under each
  inactive pill. box-shadow: none on the base tab.
- Search: results hard-clipped mid-glyph against the dialog's rounded
  bottom; a bottom-only mask scrim makes the cut read as intentional
  (the pinned input at the top of the frame is unaffected).
- Header glass: 78% -> 88% bg opacity — scrolled body text stayed
  legible through it and visually collided with the search trigger.
- Mobile header controls: the menu button was a heavy filled circle
  next to the bordered search trigger; both states now sit on the
  bordered-surface family.
- Hero CTAs stack full-width + centered on <=30rem (ragged hug-widths).

Rejected after verification: "h2 rule repeats between wrapped lines"
(the landing's background grid, not the heading rule) and a stale
"empty aside fragment" (screenshot predated 79617f0's fix).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@EricAndrechek

Copy link
Copy Markdown
Member Author

☀️ Overnight run — morning summary

Preview: https://d821250a-wavehouse-docs.wave-rf.workers.dev · 6 pushes, 10 review rounds (every push: local make ci + code & docs reviewers to ship_it), CI green throughout.

What changed since your feedback last night

Cycle What
1 Your three fixes: reading bar now 2px/75% opacity, spans only the content column (offset past the sidebar 50–72rem, hidden ≥72rem where the TOC takes over); search results scroller got a thin branded scrollbar; h2 underline → hairline that fades out rightward
2 Landing SDK showcase — "Query it like a database. Subscribe to it like a socket." with Ingest/Query/Live-updates tabs (segmented-control styling). Reviewers caught that the snippet and the sdk.md example it came from chained .where() off from() — a real latent doc bug, now fixed in both
3 Asides put to work — 19 titled note-blockquotes across api/pipes/access-control/sdk/development became :::note/:::caution; sidebar gained a Reference group (API + SDK out of Guides, no URL changes)
4 Getting Started → "Troubleshooting first runs" — the five first-session trip-ups, every claim verified against server code + compose by the reviewers
5 Fresh-eyes visual audit (two parallel design-review agents over the full screenshot corpus) → fixed: floating underline arcs on inactive tabs, search results hard-clipping at the dialog edge (bottom scrim), header glass too transparent when scrolled (78→88%), mobile menu button now matches the search trigger's control family, hero CTAs full-width on small phones

Verified

  • Playwright each cycle: search survives SPA navs, reading bar 0→0.53→1.0 @390px and re-arms after navigation, hover prefetch already active (no change needed), no console errors
  • Screenshot corpus 390–2560px × dark/light; per-element wide-viewport overflow check clean
  • Lighthouse (prod build, local): 95 perf / 100 a11y / 100 BP / 92 SEO, CLS 0.039

Deliberately not done (your call)

  • Splitting api.md (763 lines) / sdk.md (799 lines) into multi-page sections — real IA value, but URL churn + redirects felt wrong to ship without your eyes. Happy to do as a follow-up.
  • Steps component on Getting Started — would drop the numbered sections from the page TOC.
  • Two live counters in the hero demo panel can briefly disagree (different pipes, different refresh cadence) — flagged by the audit as a nit; syncing them is a LiveDemo data-flow change, not styling.

🤖 Generated with Claude Code

EricAndrechek and others added 2 commits June 10, 2026 01:38
…ings

A 15-agent visual audit (every page x 320-1440px x both themes, on the
exhaustive screenshot corpus) after the report that many pages look
broken on mobile. Four systemic root causes, all verified by hand
before fixing:

- Tables crushed instead of scrolling: fixed-layout + overflow-wrap:
  anywhere shredded identifiers at 390px (WH_P/ROME/THEU/S_PO/RT) and
  split tokens even at 1440. New ScrollHints.astro wraps each table in
  a framed scroll container with true auto layout (prose wraps first,
  scroll only when min-content demands); GitHub-style display:block
  scroll as the no-JS fallback. overflow-wrap: anywhere removed.
- Mermaid diagrams scaled to ~3-7px-label thumbnails on phones:
  standalone svgs now wrapped in the same scroller, keeping readable
  size with pan (no-JS keeps scale-to-fit via the existing carve-out
  selector that stops matching once wrapped). Zoom lightbox: safe
  centering (plain centering made the overflow start side unreachable);
  coarse pointers get a visible zoom badge.
- Translucent fixed chrome double-exposed while scrolling on mobile:
  header + Starlight's sticky On-this-page bar go opaque <50rem (glass
  stays on desktop). Removed the hand-written -webkit-backdrop-filter:
  it made LightningCSS treat prefixing as author-managed and DROP the
  standard backdrop-filter from the build (Firefox got no blur).
- Wrapped headings drew the section rule through the text: Starlight
  renders headings display:inline inside .sl-heading-wrapper, so
  backgrounds fragment per line box (pre-branch border-bottom had the
  same bug) and heading margins no-oped. Rhythm + rule moved to the
  wrapper.

Also: right-edge fade scrim on every horizontal scroller while content
is hidden (data-wh-more, scroll-tracked), code ligatures disabled
site-wide (!= rendered as one ≠ glyph in operator reference tables),
footer keeps 3 columns at tablet widths, reading bar at 0.9 opacity,
search dialog bottom scrim deepened.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
diagrams, aside titles, state-machine labels

Second 15-agent audit over a regenerated corpus (mechanical overflow:
0 hits site-wide with the corrected detector). Confirmed fixed: chrome
opacity, table shredding, heading rules, scroll affordances. Residuals
fixed here:

- Scrolling tables: per-column min-widths (6rem, last column
  min(26rem, 75vw)). Without floors auto layout crushed off-screen
  prose columns to ~100px — their 10-20 wrapped lines drove row height,
  leaving near-blank viewport-tall rows (config policy table was a
  full-screen empty frame at 390; tallest row now 438px).
- Table code chips: white-space nowrap — `--url` broke at hyphens into
  what read as two separate flags (sdk codegen table).
- Diagrams pin to Mermaid's stamped natural width inside the scroller
  (style.minWidth = style.maxWidth): the 540px CSS floor still let the
  widest ingest-pipeline diagrams shrink ~33% to ~5px labels. Verified
  2148px natural = 2148px rendered at 390.
- Aside titles: block flow + inline icon — Starlight's flex title made
  a trailing code chip its own flex item, detaching it from the
  sentence when the title wrapped.
- Zoom lightbox stage joins the data-wh-more fade contract (it
  hard-clipped nodes at its edge with no scroll hint).
- ingest-pipeline state-machine edge labels shortened; the long labels
  overlapped each other at every width (prose explains the semantics).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai
coderabbitai Bot requested a review from taitelee June 10, 2026 06:21
@EricAndrechek

Copy link
Copy Markdown
Member Author

🔍 Rigorous audit round — response to "pages look broken on mobile"

Preview: https://7983d615-wavehouse-docs.wave-rf.workers.dev

You were right — my earlier sweep covered 5 pages and extrapolated. This round did it properly:

Method. Exhaustive corpus: all 14 pages × {320, 360, 390, 414, 768, 1024, 1440}px × dark/light, with 390px captured as sequential viewport slices (full-page shots hide sticky-chrome bugs — they render the header once, at the top). Plus per-element mechanical overflow detection at every mobile width, and interactive states (search, menu, zoom lightbox, tabs). Then 15 auditor agents in parallel, one per page, over the corpus → 28 MUST / 32 SHOULD findings → fixes → fresh corpus + second 15-agent verification round → residuals fixed.

The four systemic root causes (all verified by hand before fixing):

  1. Tables crushed instead of scrolling — the old fixed-layout + overflow-wrap: anywhere kept tables in the column by shredding content: at 390px every reference table wrapped identifiers ~4 characters per line (WH_P/ROME/THEU/S_PO/RT); even at 1440px tokens split mid-word. Now: framed horizontal scrollers with natural columns (prose wraps, code never splits, per-column floors so off-screen columns can't crush), right-edge fade while more content is hidden.
  2. Mermaid diagrams scaled to thumbnails on phones — standalone diagrams shrank to fit, leaving 3–7px labels. Now: pinned to natural size inside pan-scrollers (verified 2148px natural = 2148px rendered at 390), with fade affordance, safe-centered zoom lightbox (the old centering made the left edge unreachable), and a visible ⤢ zoom badge on touch.
  3. Translucent sticky chrome double-exposed scrolled content — the header and the "On this page" bar ghosted text through themselves on every scrolled mobile viewport. Now opaque below 50rem (glass stays on desktop). Bonus root-cause: the hand-written -webkit-backdrop-filter made LightningCSS drop the standard property from the build — Firefox never had blur at all.
  4. Section rules struck through wrapped headings — Starlight renders headings display: inline inside the anchor-link wrapper, so backgrounds fragment per line (the pre-branch border-bottom had this bug too, and heading margins were silently no-oping). Rhythm + rule moved to the wrapper block.

Also fixed along the way: code ligatures off site-wide (!= rendered as in the operator reference table — wrong characters in a reference doc), --url-style flags splitting at hyphens in tables, aside titles detaching their code chips when wrapping, the ingest-pipeline state-machine's overlapping edge labels, footer column balance at tablet, reading-bar visibility.

Where it stands: second-round verification: mechanical overflow 0 hits site-wide; 7/15 pages fully clean, the rest down to NITs (mostly capture-harness artifacts like touch-emulation gaps). Gates: make ci + both reviewers ship_it on every push (the docs reviewer re-verified the shortened diagram labels against worker.go semantics).

Remaining known papercuts (deliberately not churned at 3am): prose inline-code chips can still wrap mid-token in one spot at 390 (users_<suite>), the hero's two live counters can briefly disagree (data-flow, not styling), and the audit harness should emulate touch so the zoom badge is exercised in future rounds.

🤖 Generated with Claude Code

Starlight ships `.sl-markdown-content li { overflow-wrap: anywhere }`
(so long URLs in list items never overflow) — which also licenses
mid-token splits of short code chips at phone widths across every list
on the site. break-word keeps the no-overflow guarantee but only splits
a token that can't fit on a line of its own.

Known nit kept on the record: the ingest-pipeline `users_<suite>` chip
in the (a / b / c) run still splits at the same point under break-word
in Chromium; the override still removes the shred-license everywhere
else.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e16fa9f4-b3d2-48fe-8f94-f3d803af8f6a

📥 Commits

Reviewing files that changed from the base of the PR and between 40619b8 and 72cb96b.

📒 Files selected for processing (20)
  • CHANGELOG.md
  • docs/src/components/Footer.astro
  • docs/src/components/Head.astro
  • docs/src/components/Hero.astro
  • docs/src/components/MermaidZoom.astro
  • docs/src/components/PostHog.astro
  • docs/src/components/ProgressBar.astro
  • docs/src/components/ReadingProgress.astro
  • docs/src/components/ScrollHints.astro
  • docs/src/config/sidebar.ts
  • docs/src/content/docs/404.md
  • docs/src/content/docs/access-control.md
  • docs/src/content/docs/api.md
  • docs/src/content/docs/development.md
  • docs/src/content/docs/getting-started.md
  • docs/src/content/docs/index.mdx
  • docs/src/content/docs/ingest-pipeline.md
  • docs/src/content/docs/pipes.md
  • docs/src/content/docs/sdk.md
  • docs/src/styles/global.css
📜 Review details
⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: CI
🧰 Additional context used
📓 Path-based instructions (3)
**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

Markdown files must pass markdownlint style checks and misspell spell-checking

Files:

  • docs/src/content/docs/pipes.md
  • docs/src/content/docs/404.md
  • docs/src/content/docs/access-control.md
  • docs/src/content/docs/ingest-pipeline.md
  • docs/src/content/docs/development.md
  • docs/src/content/docs/getting-started.md
  • docs/src/content/docs/api.md
  • CHANGELOG.md
  • docs/src/content/docs/sdk.md
docs/src/**/*.{md,mdx}

📄 CodeRabbit inference engine (AGENTS.md)

docs/src/**/*.{md,mdx}: Mermaid diagrams must be authored vertically (default flowchart TB/TD) to fit Starlight content column (~46–58rem); reserve LR for short chains (≤3–4 nodes); use <div class="diagram-pair">…</div> for side-by-side comparisons
Mermaid node labels should be short, using <br/> for second lines; lean on semantic node classes (:::wh, :::win, :::pain, :::fail, :::infra, :::neutral, :::store, :::client)

Files:

  • docs/src/content/docs/pipes.md
  • docs/src/content/docs/404.md
  • docs/src/content/docs/access-control.md
  • docs/src/content/docs/index.mdx
  • docs/src/content/docs/ingest-pipeline.md
  • docs/src/content/docs/development.md
  • docs/src/content/docs/getting-started.md
  • docs/src/content/docs/api.md
  • docs/src/content/docs/sdk.md
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

TypeScript files must pass Biome linting and tsc type checking

Files:

  • docs/src/config/sidebar.ts
🧠 Learnings (2)
📚 Learning: 2026-05-19T14:42:16.296Z
Learnt from: EricAndrechek
Repo: Wave-RF/WaveHouse PR: 142
File: docs/src/styles/global.css:13-20
Timestamp: 2026-05-19T14:42:16.296Z
Learning: In the Wave-RF/WaveHouse repo, CSS review should treat Tailwind v4 at-rules (e.g., `theme`, `layer`, and `import ... layer()`) as intentional and valid. They are processed by `tailwindcss/vite` configured in `docs/astro.config.mjs` (`vite.plugins`), so you should not flag these directives in `docs/src/styles/**/*.css` as “unknown at-rules” during review.

Applied to files:

  • docs/src/styles/global.css
📚 Learning: 2026-05-19T14:42:16.296Z
Learnt from: EricAndrechek
Repo: Wave-RF/WaveHouse PR: 142
File: docs/src/styles/global.css:13-20
Timestamp: 2026-05-19T14:42:16.296Z
Learning: In Wave-RF/WaveHouse, Tailwind v4 directives in CSS (e.g., `theme`, `layer`, and `import ... layer(...)`) are intentionally supported by the docs build pipeline (via `tailwindcss/vite` configured in `docs/astro.config.mjs`). During code review, do NOT flag these as “unknown at-rules” in files under `docs/src/styles/`; they should be allowed because they validate during the build.

Applied to files:

  • docs/src/styles/global.css
🪛 LanguageTool
docs/src/content/docs/api.md

[style] ~331-~331: A comma is missing here.
Context: ...e] ClickHouse's inline FORMAT clause (e.g. SELECT 1 FORMAT CSV or `… FORMAT Pret...

(EG_NO_COMMA)


[style] ~359-~359: Consider using the typographical ellipsis character here instead.
Context: ...e upstream URL, and the request body is {"sql": "..."} with no escape hatch for query-strin...

(ELLIPSIS)

docs/src/content/docs/sdk.md

[style] ~82-~82: ‘in preference to’ might be wordy. Consider a shorter alternative.
Context: ...are present the server reads the header in preference to the query parameter, and strips the `?t...

(EN_WORDINESS_PREMIUM_IN_PREFERENCE_TO)

🪛 Stylelint (17.12.0)
docs/src/styles/global.css

[error] 1152-1152: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 1157-1157: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 1162-1162: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 1167-1167: Expected empty line before declaration (declaration-empty-line-before)

(declaration-empty-line-before)


[error] 1442-1442: Expected "currentColor" to be "currentcolor" (value-keyword-case)

(value-keyword-case)

🔇 Additional comments (17)
docs/src/content/docs/404.md (3)

1-17: LGTM!


19-41: LGTM!


48-48: ⚡ Quick win

Verify external link behavior is intentional.

The GitHub issues link opens in the same tab (no target="_blank"), which navigates users away from the docs. If users are expected to open a new tab to report issues while keeping the docs visible, consider adding target="_blank" and rel="noopener noreferrer" for security.

If same-tab navigation is intentional to avoid popup friction, the current implementation is fine.

Suggested enhancement if new-tab behavior is preferred
-  <p class="wh-404__report">Followed a link that should have worked? <a href="https://github.com/Wave-RF/WaveHouse/issues/new">File an issue</a> — broken links are bugs.</p>
+  <p class="wh-404__report">Followed a link that should have worked? <a href="https://github.com/Wave-RF/WaveHouse/issues/new" target="_blank" rel="noopener noreferrer">File an issue</a> — broken links are bugs.</p>
docs/src/config/sidebar.ts (1)

19-29: LGTM!

docs/src/content/docs/index.mdx (3)

28-28: LGTM!


105-147: LGTM!


170-170: LGTM!

docs/src/content/docs/getting-started.md (2)

78-80: LGTM!


94-103: LGTM!

docs/src/content/docs/development.md (1)

535-537: LGTM!

docs/src/content/docs/ingest-pipeline.md (1)

136-147: LGTM!

docs/src/content/docs/access-control.md (1)

54-56: LGTM!

Also applies to: 67-69, 220-222

docs/src/content/docs/pipes.md (1)

36-38: LGTM!

Also applies to: 175-177

docs/src/content/docs/api.md (1)

71-73: LGTM!

Also applies to: 179-183, 304-306, 330-336, 358-360, 404-406, 441-443, 540-542

docs/src/content/docs/sdk.md (1)

81-83: LGTM!

Also applies to: 376-378, 595-597, 622-622

CHANGELOG.md (1)

23-26: LGTM!

Also applies to: 42-43

docs/src/components/Hero.astro (1)

378-388: LGTM!

Comment thread docs/src/styles/global.css
@github-project-automation github-project-automation Bot moved this from Backlog to In review in WaveHouse Task Board Jun 10, 2026
@EricAndrechek

Copy link
Copy Markdown
Member Author

Correction to the audit summary's "remaining papercuts": the mid-token chip wrapping in list items is now fixed in be2ce69 — Starlight ships li { overflow-wrap: anywhere }, which licensed those splits site-wide; it's overridden to break-word. One single chip on ingest-pipeline still splits under a Chromium quirk (documented in the commit); everything else wraps whole. CI green.

🤖 Generated with Claude Code

…code readability

Response to PR-review feedback on layout drift and horizontal scrolling:

- Layout back to Starlight stock geometry: one 45rem content track at
  every width (was 45/50/58rem stepped), stock 18.75rem sidebar, prose
  sub-cap removed — text/tables/code now share the same right edge. The
  ≥100rem .main-frame cap is gone outright: auto margins on a flex item
  sized it to fit-content (column measured 544px instead of 720px at
  1680px) while the fixed left sidebar stayed glued to the viewport edge.
- Mermaid: desktop returns to scale-to-fit + click-to-zoom; the
  natural-width pin (minWidth = maxWidth) that forced wide diagrams into
  horizontal scrollers at every viewport is now phone-only via a
  --wh-natural-w custom property (pan beats 3px labels there).
- Zoom lightbox: fit math sizes against the stage CONTENT box
  (subtract padding, floor fractional px) — fully-zoomed diagrams
  previously overshot by the padding and always showed both scrollbars.
- Code blocks wrap (expressiveCode defaultProps.wrap) instead of
  scrolling; development.md Quick Reference drops the column-aligned
  trailing comments whose 39-space continuation indent guaranteed
  overflow under preserveIndent.
- Table code wraps BETWEEN tokens: per-token nowrap spans split at
  spaces, <wbr> after slashes in paths — tokens stay atomic (no --url
  shred), JSON bodies/commands wrap at their spaces. No-JS keeps the
  nowrap+scroll fallback.
- Table column floors apply only to tables measured as genuinely
  overflowing (data-wh-scrolls) — unconditional floors were CREATING
  scroll on tables that fit by wrapping.
- configuration.md stacks each setting's YAML key over its env var in
  one column (the two widest columns in every table on the page).
- Table readability: 14px top-aligned body cells, zebra rows, stronger
  hover.
- Stylelint (CodeRabbit): blank line before declarations after custom
  properties in the aside variants; currentcolor keyword case.

Verified: zero page-level horizontal overflow across 14 pages x 12
widths (320-2560) x both themes; at >=1024px every table and code block
fits the column except two tables in the ~90px window at the exact
72rem breakpoint where stock Starlight squeezes the pane below 45rem.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@EricAndrechek

Copy link
Copy Markdown
Member Author

🔧 Morning round — layout back to stock Starlight, sideways scroll eliminated

Commit: 79ea442 · local make ci green · code + docs reviewers → ship_it ×2 · preview: https://5870efdc-wavehouse-docs.wave-rf.workers.dev

Point-by-point response to this morning's feedback:

"Layout lines up weird" — confirmed, and it was measurably broken

Every layout value diffed against stock Starlight. Deviations found:

Deviation Stock Verdict
Content track stepped 45→50rem (@72rem)→58rem (@100rem) one 45rem Reverted. The steps shifted the column at each breakpoint and starved the TOC
Prose sub-capped at 46rem inside the wider track no cap Removed. This was the raggedness: text, tables, and code each ended at a different right edge
Sidebar 18.5rem 18.75rem Reverted (pointless 4px delta)
.main-frame capped at 100rem + centered on ultrawide no cap Removed — broken, not just weird. Auto margins on a flex item size it to fit-content: at 1680px the content column measured 544px instead of 720px. And the left sidebar is position: fixed, so it stayed glued to the viewport edge while the frame centered away from it — the misaligned gap

The doc shell is now byte-for-byte stock Starlight geometry; the branding lives in colors/typography/chrome, none in layout math.

Mermaid horizontal scrolling — regression found and fixed

The "natural-size diagrams" round pinned every diagram to its natural width (minWidth = maxWidth) at all viewports — that pin was the phones fix (scale-to-fit there meant 3px labels), but on desktop it forced any diagram wider than the column into a scroller. Now: desktop is back to scale-to-fit (Mermaid's own width="100%" + natural max-width) with click-to-zoom for detail; the natural-width pin is phone-only (≤768px), where panning beats thumbnails.

Zoom modal phantom scrollbars — real bug, fixed

The fit math sized the diagram against 94vw × 90vh, but those caps are the stage's outer box — its own padding pushed the "fully zoomed" state past the cap by exactly the padding, so both scrollbars always rendered. Fit now subtracts the stage's computed padding and floors fractional pixels.

Tables + code blocks overflowing — systematically eliminated

Four root causes, four fixes:

  1. Code blocks now wrap (expressiveCode.defaultProps.wrap); wrap=false per block remains available. The one residual offender (development.md Quick Reference) had column-aligned trailing comments whose 39-space continuation indent guaranteed overflow under preserveIndent — restructured to comment-above-command.
  2. Table code wraps between tokens: blanket white-space: nowrap (the --url shred fix) also stopped JSON bodies and shell commands wrapping at their spaces. Cell code is now split into per-token nowrap spans (tokens stay atomic) with <wbr> break points after slashes in paths. Copy/paste text unchanged.
  3. Column min-width floors were creating scroll on tables that fit — they now apply only after the script measures a table as genuinely overflowing.
  4. configuration.md stacks YAML key over env var in one column — the two widest columns in every table on the page, and one is derivable from the other.

Verification: 14 pages × 12 widths (320–2560px) × both themes — zero page-level horizontal overflow anywhere. At ≥1024px every table and code block fits the column except two tables in the ~90px window at exactly the 72rem breakpoint, where stock Starlight itself squeezes the pane below 45rem (they fit again at 1280+). Phones keep the designed pan-inside-scroller behavior.

Table readability pass

Body cells dropped to 14px with tightened line-height and top alignment, zebra striping replaces hover-only row tracking (hover stays, a step stronger).

Preview "failing to load"

Investigated 5a587830-…workers.dev (the sticky-comment build): HTTP 200, every referenced asset 200, byte-identical HTML to the prior build except the CSS hash, zero console errors / zero failed requests in headless Chromium, full render. Best explanation is a transient edge blip right after deploy. Nothing wrong with the build — flag it if it recurs.

api.md length

Agreed — tracked by #302 (OpenAPI spec → rendered reference); not restructuring that page meanwhile.

Splitting the SDK docs

sdk.md is 806 lines / 19 top-level sections. Split plan:

Page Content (today's sections)
/sdk (index) Installation, Quick Start, Creating a Client, Result Type — plus section cards into the rest
/sdk/queries Tables API, Query Builder, Raw SQL, pagination
/sdk/streaming Streaming, Live Queries, client-side filtering
/sdk/pipes Named Pipes, Pipes Admin
/sdk/admin Schema, Policy, DLQ, System
/sdk/reference AbortController, Error Handling, Full API Tree, Codegen CLI, E2E Testing

On multi-language: topic-first URLs with shared usage pages — when a second language lands, the usage pages grow <Tabs syncKey="lang"> code tabs and each language gets its own setup/install/caveats page, so the topic URLs never churn. (Update: green-lit — implementing now, including package-manager-synced install tabs and a landing-page install chip that follows the reader's choice.)

Also in this push

CodeRabbit's stylelint findings fixed (blank-line-before-declaration ×4, currentcolor case), replied + thread resolved.

🤖 Posted on Eric's behalf by Claude Code

EricAndrechek and others added 2 commits June 10, 2026 08:43
Second response round to PR-review feedback:

- SDK split: sdk.md (806 lines) becomes /sdk overview + five topic pages
  (queries, streaming, pipes, admin, reference) under a nested sidebar
  group. Topic-first URLs are the multi-language plan: a second language
  adds <Tabs syncKey="lang"> to the shared usage pages + its own setup
  page — no URL churn. Install is <Tabs syncKey="pkg"> (pnpm/npm/yarn/
  bun/deno/CDN) and the landing hero's install chip follows the synced
  choice via Starlight's localStorage label.
- Breakout layout: markdown body becomes a 3-track grid — prose capped
  at the stock 45rem in the centered middle track (title + prose share
  a left edge), while tables/code/diagrams span all tracks at
  fit-content: short blocks keep prose width and alignment, wide ones
  grow centered up to the main pane. Pane width depends only on the
  viewport, so the TOC never moves and the page never scrolls sideways.
- Tables: header row emphasized (0.8125rem/650 on ink, stronger
  underline); wrap-vs-scroll is now a crowding heuristic — a >=4-column
  table averaging under ~8.5rem per column scrolls instead of wrapping
  every other word.

Verified: 19 pages x 12 widths (320-2560) x both themes — zero
page-level horizontal overflow; breakout confirmed at 1440/1920/2560
(title/prose left edges aligned, TOC position unchanged); hero chip
verified for default/bun/deno/CDN cases.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The table cell still named docs/src/content/docs/sdk.md, deleted by the
SDK docs split — a contributor adding an endpoint would be directed to
a non-existent file (pre-push reviewer finding).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai coderabbitai Bot added the area/sdk TypeScript SDK (clients/ts/) label Jun 10, 2026
…s optional

Two stale claims surfaced by the docs reviewer's cross-checks:
- development.md documented KEEP_RUNNING=true for make test-e2e, but the
  orchestrator reads no such variable and always tears down — removed.
- sdk/streaming.md typed StreamSubscriber.initial as required;
  clients/ts/src/types.ts:49 declares it optional (initial?:).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@EricAndrechek

Copy link
Copy Markdown
Member Author

🎯 Round 6 — the phantom fade, killed by construction

Commits: 1d0c7b7 + 7f171fd · local make ci green ×2 · reviewers → ship_it ×4 · preview: https://22a4fef6-wavehouse-docs.wave-rf.workers.dev

Why this artifact kept surviving

Your "happens when the comment wraps" observation was the key. The fade depends on exactly where a line wraps at your specific width — when a wrap point lands after a run of preserved spaces (like the gap before a # comment), the hanging whitespace inflates scrollWidth past any threshold we pick, at some width. My audits tested discrete widths and kept missing the magic ones; threshold bumps just moved the goalposts.

The fix is an invariant, not a threshold

A wrapped code block (pre.wrap) physically cannot scroll sideways — pre-wrap + break-word guarantee every line fits. So whatever scrollWidth claims, it's hanging whitespace or zoom/font rounding. The fade updater now hard-strips both fade attributes from wrapped blocks unconditionally. (wrap=false blocks keep their real scroll + fades.) Plus: all classifications re-derive once document.fonts.ready resolves, so fallback-font metrics can't go stale.

Your other two asks

  • Comments wrap manually now: 9 restructures moved long trailing comments above their lines (access-control's bootstrap + complete example — your two named blocks — plus deployment/development/sdk examples), so only code ever soft-wraps.
  • Code earns width like tables: a block widens only when its longest line actually fits the wide track (measured nowrap, batched), or when it's wrap=false and scrolls. The named-pipes long-SQL block — your example — now stays at prose width instead of going maximally wide to strand two words on a continuation line.

The dedicated verification you asked for

A single-purpose agent hunted exactly this artifact: 42,696 element scans, zero violations

  • 18 pages × 141 widths (320–2560 in 16px steps, resize-triggered reclassification)
  • every tab option clicked (all 38 YAML/JSON/Environment/pnpm/npm/yarn/bun/deno/CDN tabs) × 3 widths
  • full zoom lifecycle on all 16 diagrams × 2 widths: fit (zero scrollbars), 1:1, pan-right (left fade appears), toggle back (fades clear), next diagram (stage starts clean)
  • soft-navigation chains via sidebar clicks
  • blocked-webfont and 2s-delayed-webfont variants (the late re-scan validates the fonts.ready re-measure)

Verdict line from the agent: ARTIFACT-FREE.

Also

The docs reviewer's cross-checks caught two stale claims while gating this round, fixed in 7f171fd: the KEEP_RUNNING=true make test-e2e example documented a variable the orchestrator never honored (removed), and StreamSubscriber.initial was typed required where the SDK declares it optional (now initial?:).

🤖 Posted on Eric's behalf by Claude Code

@EricAndrechek
EricAndrechek marked this pull request as ready for review June 10, 2026 18:14
@EricAndrechek
EricAndrechek requested a review from a team June 10, 2026 18:14
@coderabbitai coderabbitai Bot added the area/sdk TypeScript SDK (clients/ts/) label Jun 10, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/src/components/ScrollHints.astro (1)

22-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Drop <table> from the scroller selector.

After wrapScrollables() runs, JS-enhanced tables scroll on .wh-table-wrap, not on the <table> itself. Keeping .sl-markdown-content table in SCROLLERS makes updateAll() stamp data-wh-more* on a non-scrolling child once, while the scroll listener only updates the wrapper. That leaves a stale right-edge mask behind after the user pans to the end.

Suggested patch
-    const SCROLLERS =
-      ".expressive-code pre, .sl-markdown-content table, .wh-scroll-x, .wh-zoom__stage";
+    const SCROLLERS =
+      ".expressive-code pre, .wh-scroll-x, .wh-zoom__stage";
docs/src/styles/global.css (1)

313-319: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Extend the mobile wrapper scroller rule to class and state Mermaid diagrams.

This block gives class/state SVGs the same phone min-width: var(--wh-natural-w, 540px) as flowchart/sequence, but only flowchart/sequence wrappers get overflow-x: auto. A wrapped class or state diagram on mobile can therefore keep the 540px floor without a local scroller when JS is unavailable.

Suggested patch
   .sl-markdown-content :where(p, div):has(> svg[aria-roledescription^="flowchart"]),
-  .sl-markdown-content :where(p, div):has(> svg[aria-roledescription^="sequence"]) {
+  .sl-markdown-content :where(p, div):has(> svg[aria-roledescription^="sequence"]),
+  .sl-markdown-content :where(p, div):has(> svg[aria-roledescription^="class"]),
+  .sl-markdown-content :where(p, div):has(> svg[aria-roledescription^="state"]) {
     overflow-x: auto;
     overflow-y: visible;
     scroll-padding-inline: 1rem;
     scrollbar-width: thin;
   }

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 19b3ddfa-fc13-48ce-bca1-d427b439eabc

📥 Commits

Reviewing files that changed from the base of the PR and between 850e48c and bb141d9.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • docs/src/components/ScrollHints.astro
  • docs/src/content/docs/access-control.mdx
  • docs/src/content/docs/deployment.md
  • docs/src/content/docs/development.md
  • docs/src/content/docs/sdk/pipes.md
  • docs/src/content/docs/sdk/streaming.md
  • docs/src/styles/global.css
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
docs/src/content/**/*.{md,mdx}

📄 CodeRabbit inference engine (AGENTS.md)

docs/src/content/**/*.{md,mdx}: Author Mermaid diagrams vertically (top-down flowchart TB/TD) to fit the Starlight content column (~46–58rem) at legible size; reserve LR for short chains only (≤3–4 nodes)
Keep Mermaid node labels short; use <br/> for second line rather than one long line; lean on semantic node classes (wh, win, pain, fail, infra, neutral, store, client) and CSS variables
Never sit two large Mermaid diagrams side-by-side; wrap comparisons in <div class="diagram-pair">…</div> to stack vertically so each gets the full column width
Mermaid diagrams are click-to-zoom on the site (via docs/src/components/MermaidZoom.astro), so fine detail is recoverable, but author diagrams legibly for the first view — don't ship an illegible inline diagram relying on zoom

Files:

  • docs/src/content/docs/sdk/pipes.md
  • docs/src/content/docs/deployment.md
  • docs/src/content/docs/development.md
  • docs/src/content/docs/sdk/streaming.md
  • docs/src/content/docs/access-control.mdx
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Validate locally before every push by running `make ci` — do not use CI as your first feedback loop
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Run `/prepush` to discover pre-push reviewers and run them until each returns `ship_it` before pushing a PR-branch
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Every code change must update its documentation and `CHANGELOG.md` in the same PR
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Address and resolve every review finding with a substantive reply, fix, or tracked issue; never silently drop a review comment
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Create PRs with `gh pr create --draft` only — never use `gh pr ready` or approve; only humans transition draft → ready-for-review
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: PR title must pass Conventional Commits gate: `<type>(scope): <subject>` ≤ 72 chars, subject lowercase-first with no trailing period; validate with `scripts/lint-pr-title.sh`
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Never force-push or rebase a PR branch — use `git merge origin/main` to absorb upstream changes
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Never hand-write markers or use `--no-verify` — if tempted, the gate is wrong-shaped for the situation; fix the gate instead
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Comment the *why*, not the *what* — add comments only when the reason is not obvious; keep to 1–2 lines and match file density; remove comments that merely restate the code
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: DRY — maintain one source of truth; before adding logic look for an existing helper, type, or constant to reuse; factor duplicated rules into one place
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Leave the codebase neater than you found it — fix stale comments, typos, misnamed locals, and dead code in passing, keeping cleanups in the same spirit as your change; defer large/risky cleanups to a tracking issue
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Aim for 80%+ test coverage on new code; project-wide CI-enforced minimum is 80% (merged unit + integration + e2e); per-suite minima: unit 70%, integration 12%, e2e 50%, SDK 50%
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Every new function should have corresponding test cases; run `make lint` and `make test` before considering work complete
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Run integration tests via `make test-integration` (Docker testcontainers; do NOT `make deps-up` first)
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Any notable change: update `CHANGELOG.md` under `[Unreleased]` section in the same PR
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When backend API changes, update TypeScript SDK: add typed client methods in `clients/ts/src/`, update SDK docs under `docs/src/content/docs/sdk/`, and update API reference tree
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When JWT auth or role extraction changes, update TypeScript SDK auth handling in `clients/ts/src/http.ts` and types in `clients/ts/src/client.ts`
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When `EventMessage` or ingest event format changes, update TypeScript SDK payload types in `clients/ts/src/`; regenerate SDK types via codegen CLI
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When structured query AST changes, update TypeScript SDK query-builder types and methods in `clients/ts/src/query-builder.ts`
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When live-query aggregation classification changes, update TypeScript SDK live-query helpers in `clients/ts/src/stream/`
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When named pipes API changes, update TypeScript SDK in `clients/ts/src/pipes.ts`
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When policy or access-control logic changes, update TypeScript SDK in `clients/ts/src/policy.ts`
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: When ClickHouse schema-driven types change, re-run SDK codegen CLI and commit regenerated types
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Use Conventional Commits types (`feat`, `fix`, `docs`, `refactor`, `test`, `chore`, `ci`, `deps`, `build`, `perf`, `revert`, `style`) for commit messages and PR titles (≤ 72 chars)
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: No `CODEOWNERS` file — admin approval is enforced natively by the `main branch protection` ruleset's `required_reviewers` rule requesting the `Wave-RF/wavehouse-admins` team
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: `CONTRIBUTING.md` Conventional Commits type list must stay in sync with the regex in `scripts/lint-pr-title.sh` (the single source of truth used by both local gate and required `PR housekeeping` check)
Learnt from: CR
Repo: Wave-RF/WaveHouse

Timestamp: 2026-06-10T18:17:03.723Z
Learning: Dependency vulnerability scanning: run `govulncheck ./...` on every push/PR (enforced by CI); Dependabot opens weekly grouped PRs with no auto-merge (human admin approval required)
📚 Learning: 2026-06-10T15:01:09.027Z
Learnt from: EricAndrechek
Repo: Wave-RF/WaveHouse PR: 312
File: docs/src/content/docs/development.md:0-0
Timestamp: 2026-06-10T15:01:09.027Z
Learning: In this repo’s Markdown review (all .md files), do not flag capitalization/style issues for literal paths starting with ".github/" (or any substring that is a path beginning with ".github/"). Treat ".github" as the correct lowercase dotfile directory name, even when it appears inside prose or code spans; automated checks such as LanguageTool’s "(GITHUB)" rule commonly produce false positives for this literal filesystem path.

Applied to files:

  • docs/src/content/docs/sdk/pipes.md
  • CHANGELOG.md
  • docs/src/content/docs/deployment.md
  • docs/src/content/docs/development.md
  • docs/src/content/docs/sdk/streaming.md
📚 Learning: 2026-05-19T14:42:16.296Z
Learnt from: EricAndrechek
Repo: Wave-RF/WaveHouse PR: 142
File: docs/src/styles/global.css:13-20
Timestamp: 2026-05-19T14:42:16.296Z
Learning: In the Wave-RF/WaveHouse repo, CSS review should treat Tailwind v4 at-rules (e.g., `theme`, `layer`, and `import ... layer()`) as intentional and valid. They are processed by `tailwindcss/vite` configured in `docs/astro.config.mjs` (`vite.plugins`), so you should not flag these directives in `docs/src/styles/**/*.css` as “unknown at-rules” during review.

Applied to files:

  • docs/src/styles/global.css
📚 Learning: 2026-05-19T14:42:16.296Z
Learnt from: EricAndrechek
Repo: Wave-RF/WaveHouse PR: 142
File: docs/src/styles/global.css:13-20
Timestamp: 2026-05-19T14:42:16.296Z
Learning: In Wave-RF/WaveHouse, Tailwind v4 directives in CSS (e.g., `theme`, `layer`, and `import ... layer(...)`) are intentionally supported by the docs build pipeline (via `tailwindcss/vite` configured in `docs/astro.config.mjs`). During code review, do NOT flag these as “unknown at-rules” in files under `docs/src/styles/`; they should be allowed because they validate during the build.

Applied to files:

  • docs/src/styles/global.css
🔇 Additional comments (19)
docs/src/content/docs/sdk/streaming.md (1)

146-146: LGTM!

docs/src/content/docs/sdk/pipes.md (1)

17-19: LGTM!

CHANGELOG.md (1)

149-149: LGTM!

docs/src/content/docs/development.md (3)

288-315: LGTM!


358-361: LGTM!


550-552: LGTM!

docs/src/content/docs/access-control.mdx (4)

8-8: LGTM!

Also applies to: 56-58, 69-71, 340-342


18-30: LGTM!


85-118: LGTM!

Also applies to: 126-147, 160-186, 216-248, 261-287, 303-324, 377-390, 398-468


266-267: LGTM!

Also applies to: 269-270, 381-382, 401-404

docs/src/content/docs/deployment.md (8)

34-35: LGTM!


121-122: LGTM!


156-157: LGTM!


176-180: LGTM!


206-210: LGTM!


317-318: LGTM!


385-386: LGTM!


425-428: LGTM!

docs/src/styles/global.css (1)

1173-1176: Avoid reintroducing the manual -webkit-backdrop-filter twin for the search dialog backdrop

site-search dialog::backdrop currently sets both backdrop-filter and -webkit-backdrop-filter; since the project notes that this pattern makes the CSS pipeline drop the unprefixed backdrop-filter (Firefox blur breakage), either remove the -webkit-backdrop-filter declaration here or confirm the emitted CSS still keeps backdrop-filter for this rule.

Comment thread docs/src/components/ScrollHints.astro Outdated
CodeRabbit round addressing (1 inline + 2 outside-diff + 1 verify):

- classifyCode() now classifies code-ONLY starlight-tabs groups as a
  unit: all panels are measured (hidden ones get an inline display:block
  during the batched read — layout never reaches paint mid-batch) and
  the group pins to its widest panel via --wh-natural-w so the frame
  keeps one width across tab switches; matching breakout CSS rule.
- Root cause found while wiring it: the natural-width probe set
  white-space:pre on the pre, but EC wraps on the DESCENDANT .code spans
  (pre.wrap .ec-line .code), so every default-wrap block measured its
  wrapped width and could never earn the wide track (only wrap=false
  blocks ever widened). The wrap class now comes off for the batched
  measurement; long-lined wrap blocks across api/development/sdk pages
  widen as the earn-the-width rule always intended.
- Tab switches refresh edge fades — a pre revealed from [hidden]
  measured 0x0 when fades were last stamped.
- Bare table left the SCROLLERS list: after wrapScrollables() tables
  scroll on .wh-table-wrap, so a fade stamped on the non-scrolling
  <table> itself could never clear.
- The phone Mermaid wrapper-scroller rule extends to class/state
  diagrams (they had the 540px no-JS min-width floor without the
  matching overflow-x:auto).
- Search-dialog backdrop drops the reintroduced hand-written
  -webkit-backdrop-filter twin (LightningCSS author-managed-prefix
  trap); emitted CSS verified — standard property kept, twin
  auto-emitted.

Verified on the production build with Playwright: 19 pages x 5 widths
(375-2560) — zero element overflow, zero fade-on-wrap, zero stale
fades; tab-switch width drift 0px; the configuration and access-control
format switchers take the wide track at >=1680px.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the area/sdk TypeScript SDK (clients/ts/) label Jun 10, 2026
@EricAndrechek

Copy link
Copy Markdown
Member Author

@coderabbitai The two outside-diff-range comments and the backdrop-filter verification from the latest review are addressed in 9f1f343:

  • Drop <table> from the SCROLLERS selector (ScrollHints.astro): done. wrapScrollables() runs before any measurement, so tables always scroll on their .wh-table-wrap (already matched via .wh-scroll-x) — the bare table entry could only ever stamp a fade on the non-scrolling <table> that the wrapper-scoped scroll listener would never clear. A comment on the constant now records why table must stay out.
  • Extend the mobile wrapper scroller rule to class/state Mermaid diagrams (global.css): done. The overflow-x: auto wrapper rule now lists all four aria-roledescription prefixes, matching the min-width: var(--wh-natural-w, 540px) block above it — a wrapped class/state diagram no longer keeps the 540px floor without a local scroller when JS is unavailable.
  • -webkit-backdrop-filter twin on site-search dialog::backdrop: removed — it was exactly the LightningCSS author-managed-prefix trap the header.header note documents (hand-written twin ⇒ unprefixed declaration dropped ⇒ no blur in Firefox). Verified in the emitted CSS after the fix: site-search dialog::backdrop{-webkit-backdrop-filter:blur(8px)saturate(120%);backdrop-filter:blur(8px)saturate(120%)} — standard property retained, twin auto-emitted by the pipeline. A pointer comment now sits on the rule to head off the next reintroduction.

The inline comment about tabbed code never earning the wide track is fixed in the same commit (details in the thread reply): code-only tab groups now classify as a unit, and fixing it surfaced a deeper measurement bug that had kept every default-wrap code block out of the breakout system.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jun 10, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@EricAndrechek All four items confirmed — clean resolutions across the board:

  • SCROLLERS / <table> — the invariant reasoning (tables always scroll on .wh-table-wrap, bare <table> is the non-scrolling inner element) is exactly right, and the explanatory comment will prevent the pattern from creeping back.
  • class/state diagrams on mobile — good catch that the aria-roledescription alignment between the min-width rule and the overflow-x: auto wrapper rule was incomplete; having them match in lockstep means the no-JS fallback is consistent across all diagram types.
  • -webkit-backdrop-filter on the search backdrop — verified approach; the pointer comment is the right guard given how subtle the LightningCSS author-managed-prefix drop is.
  • Tabbed code + measurement bug — classifying tab groups as a unit and fixing the wrap block measurement path together is a meaningful improvement to the breakout system.

If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

@EricAndrechek
EricAndrechek merged commit 13b9bf4 into main Jun 10, 2026
9 checks passed
@github-project-automation github-project-automation Bot moved this from In review to Done in WaveHouse Task Board Jun 10, 2026
@EricAndrechek
EricAndrechek deleted the website-improvements branch June 10, 2026 19:09
jfwoods added a commit that referenced this pull request Aug 25, 2026
Addresses every thread @EricAndrechek left on #434.

Docs — the documented decision, restored. PR #313 settled that SDK pages
are topic-first: shared usage pages grow <Tabs syncKey="lang"> as languages
land, each language keeps its own setup page, and the topic URLs never
churn. The Go SDK's first draft deleted that comment and shipped a parallel
/sdk/go/* tree with TypeScript left un-prefixed at the root of /sdk. Undone:

  - /sdk/{queries,streaming,pipes,admin,reference} are now .mdx, each
    carrying one <Tabs syncKey="lang"> block per section — shared prose
    outside, language-specific code and caveats inside. Nothing was dropped
    in the merge; both languages' full content is preserved.
  - /sdk/typescript (was the root /sdk) and /sdk/go are the per-language
    setup/caveats pages. /sdk is now a language-neutral overview.
  - The sidebar comment is back, and stronger: it says what a third
    language costs (one setup page, one TabItem per topic) and what it must
    not do (a parallel tree; a language at the root of /sdk).
  - AGENTS.md gains a §SDK docs layout section so the rule is enforceable
    rather than a comment one agent can delete.
  - SDK mentions across README, why-wavehouse, getting-started, the docs
    homepage, the 404 page and the footer drop the per-SDK dependency-count
    trivia and just name the clients we publish. The dependency posture
    stays where it is a real difference: the Go page's own comparison list.

Make targets — one family, no new ad-hoc names.

  - test-ts -> test-sdk-ts, test-go-sdk -> test-sdk-go, plus test-sdk which
    runs both and test-sdk-go-e2e for the live-server suite.
  - test-conformance-ts is gone as a target: each language's half of the
    wire-format suite now rides that language's target, which is already
    how the Go half worked.
  - `make test` is the test-unit alias it was before this PR.
  - All four SDK targets use gotestsum and honor ARGS/V=1 like every other
    Go suite — the nested module has no tool directives, so they resolve
    the binary with `go tool -n gotestsum` from the root module first.

Static checks — one entry point per tool, not per module.

  - lint-go-sdk and verify-go-sdk are deleted. lint-go now lints both
    modules (two invocations, because golangci-lint is module-scoped);
    verify-go-sdk was pure duplication — gofumpt is already fmt-go's job
    and `go vet` is golangci-lint's govet linter.
  - tidy covers the nested go.mod too, so verify checks exactly what fix
    rewrites. That closes the tidy half of #437; vulncheck remains open.
  - go-mod-download warms both modules, so anything reaching into
    clients/go inherits the prereq.
  - fix-go is one step per line instead of a five-command && chain, and a
    comment says the `cd` is the only difference between its two
    golangci-lint lines.

Coverage — .testcoverage.yml now explains why the Go SDK has one gate key
where the TS SDK has three (one instrumented suite vs two), and #518 tracks
running the Go e2e suite from the orchestrator so it earns the same shape.

Refs #434, #437, #518
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/docs Documentation, site/, README documentation Improvements or additions to documentation

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

1 participant