Skip to content

feat(web): design pass 5: one tab style for provider views, honest replay counts - #1827

Merged
Makisuo merged 8 commits into
ui-pass-4from
ui-pass-5
Oct 25, 2026
Merged

Makisuo merged 8 commits into
ui-pass-4from
ui-pass-5

Conversation

@Makisuo

@Makisuo Makisuo commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Design pass 5, stacked on #1826 (pass 4). Two independent agents checked it blind: one scored a rubric, the other hunted regressions. Icons and data colours are untouched.

Judges

Category Before After
Typography 7.0 7.0
Hierarchy 7.0 7.5
Spacing & density 7.0 7.0
Color & contrast 7.5 7.5
Iconography 7.5 7.5
Consistency & polish 6.5 7.0
Clarity 7.0 7.5
Overall 7.1 7.4

The regression hunt found none: all four changed pages are better.

Changes

One tab style for provider views. GCP (Services / Pub/Sub / Cloud SQL) and Cloudflare (Zones / Workers / Queues) used a small segmented control in the header. They now use the same underline link tabs as AWS and the rest of the app, under the title, with counts and active state kept. Each tab links to the URL the old switch navigated to; labs switch in place.

Before After

Replays: while facets fail, the chip read "0 with errors". It now shows no count until the facets answer, like "engaged" already did.

Before After

Logs: the "340 logs" footer lines up with the table gutter instead of sitting flush against the edge.

Before After

Verification

  • bun run --cwd apps/web typecheck passes, and oxlint is clean.
  • Targeted Vitest: 305 tests across infra integrations, labs, replays, logs and overview.

🤖 Generated with Claude Code

…play counts, padded log footer

- GCP (Services / Pub/Sub / Cloud SQL) and Cloudflare (Zones / Workers / Queues) switch resource
  kinds with the same underline link tabs as AWS, under the title, counts kept; labs switch in place.
- Replays' "with errors" chip shows no count until the facets answer, so a failed read never says 0.
- The logs footer lines up with the table gutter.
@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 23 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 4df2c9fa-6935-403f-8f51-675202415cf8
Commits

Reviewing files that changed from the base of the PR and between 58a48f5 and 3f80bb2.

Files selected for processing: 10
  • apps/web/src/lab/cloudflare-lab/fixture.ts
  • apps/web/src/lab/gcp-infra-lab/view.ts
  • apps/web/src/page/infra-integrations/cloudflare/list/update.ts
  • apps/web/src/page/infra-integrations/cloudflare/list/view.ts
  • apps/web/src/page/infra-integrations/gcp/list/update.ts
  • apps/web/src/page/infra-integrations/gcp/list/view.ts
  • apps/web/src/page/infra/kit/view-tabs.ts
  • apps/web/src/page/replays/kit/replays-toolbar.ts
  • apps/web/src/page/replays/list/view.ts
  • apps/web/src/ui/logs/logs-stream-view.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@maple-review-bot

maple-review-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Contained view-only refactor: both pages still navigate to the URLs their existing scene tests pin; only the tab href builder is untested.
1 note · tests partial −1 · risk low

Replaces the Cloudflare and Google Cloud view switches with the shared underline tab strip in the page body, stops the replays chip claiming a zero count before the facets answer, and restores the logs footer's horizontal padding. Safe to merge.

  • Cloudflare and Google Cloud view switches become linkTabStrip tabs in the page body
  • New viewHref builds each tab's URL; both labs opt into in-place clicks
  • Replays toolbar drops the error count until the facets answer
  • Logs footer keeps px-4 because py-0 replaces p-0

Findings

🔵 Note · F1 · viewHref restates ClickedView's search transition

maintainability · apps/web/src/page/infra-integrations/cloudflare/list/update.ts:49-50

viewHref repeats the { view, scope: undefined, q: undefined } transition that ClickedView applies at apps/web/src/page/infra-integrations/cloudflare/list/update.ts:195; the tab's link and the in-place patch have to produce the same URL, and nothing keeps the two lists of cleared fields in sync. The GCP half of this PR shares one viewSearch helper for exactly this pair (gcp/list/update.ts:48).

Add a `viewSearch(search, view)` helper in this file returning `{ ...search, view, scope: undefined, q: undefined }`, use it in `viewHref`, and make `ClickedView` call `patch(model, viewSearch(model.search, view))`.
🤖 Prompt to fix this finding with an AI agent
Findings from an automated review of commit e87fbcfc1cbd8d9c135f34ea6077a95fdb3e7f4e. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F1 · Note · maintainability · apps/web/src/page/infra-integrations/cloudflare/list/update.ts:49-50
`viewHref` restates `ClickedView`'s search transition
`viewHref` repeats the `{ view, scope: undefined, q: undefined }` transition that `ClickedView` applies at `apps/web/src/page/infra-integrations/cloudflare/list/update.ts:195`; the tab's link and the in-place patch have to produce the same URL, and nothing keeps the two lists of cleared fields in sync. The GCP half of this PR shares one `viewSearch` helper for exactly this pair (`gcp/list/update.ts:48`).
Suggested fix: Add a `viewSearch(search, view)` helper in this file returning `{ ...search, view, scope: undefined, q: undefined }`, use it in `viewHref`, and make `ClickedView` call `patch(model, viewSearch(model.search, view))`.
What was checked
  • viewHref reproduces ClickedView's URL in both pages (cloudflare/list/update.ts:49, gcp/list/update.ts:48-57)
  • Lab clicks reach the page handlers: followNavigation in the Cloudflare lab, case "ClickedView" in the GCP lab
  • linkTabStrip's optional onClick leaves the Hosts and Kubernetes strips unchanged (view-tabs.ts:36-38)

e87fbcf · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo Makisuo added the preview:web Deploy a Workers-only PR preview (no ingest/Electric); see docs/pr-previews.md label Oct 25, 2026
@Makisuo Makisuo changed the title ui pass 5 feat(web): design pass 5: one tab style for provider views, honest replay counts Oct 25, 2026

@devin-ai-integration devin-ai-integration 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.

Devin Review found 1 potential issue.

Devin Review

Comment thread apps/web/src/page/infra/kit/view-tabs.ts
@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

🍁 Maple PR preview

Note

Preview resources were removed when the preview label came off.

Final commit 3f80bb2 · View workflow run

@maple-review-bot

maple-review-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Contained UI change: scene tests pin the ClickedView URLs the new tab hrefs mirror, but the rendered tabs and the replay chip branch are untested.
1 note · tests partial −1 · risk low

Replaces the GCP and Cloudflare view segmented controls with the shared underline link tabs, hides the replays error count until facets answer, and pads the logs footer. Contained to the web app and safe to merge; the earlier note about Cloudflare's duplicated search transition still stands.

  • GCP and Cloudflare view switches become linkTabStrip links under the title
  • TabLink gained onClick; labs switch in place, routes follow the href
  • viewHref builds each tab URL from the search ClickedView writes
  • Replays error chip drops its count until facets answer

Still open from earlier reviews

What was checked
  • listScopeOf returns a non-null scope in listBody, so tabs show in the same states as the old select (cloudflare/list/view.ts:342)
  • GCP viewHref and ClickedView share viewSearch; gcp.scene.test.ts:139 pins that URL
  • cn is twMerge, so py-0 overrides py-3 and keeps px-4 on the logs footer (packages/ui/src/lib/utils.ts:8)

40bd320 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot

maple-review-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Rendering-only and contained; the only open item is the viewHref/ClickedView duplication in Cloudflare, which this head does not fix.
2 notes · tests partial −1 · risk medium

Swaps the Cloudflare and GCP view switches for the shared underline link tabs with counts, hides the replays errors count until the facets answer, and re-pads the logs footer. Contained to rendering; the open viewHref/ClickedView duplication in Cloudflare still stands.

  • linkTabStrip tabs take an optional onClick, suppressed in the route pages
  • Cloudflare and GCP views render as underlined link tabs with counts
  • Replays errors chip drops its count until facets answer
  • Logs footer keeps the table gutter, drops vertical padding

Findings

🔵 Note · F2 · The honest with errors label has no scene test behind it

tests · apps/web/src/page/replays/list/view.ts:246

replays.scene.test.ts already renders this page and asserts its text (expectView(text("2 pages")) at line 202), so the new label is cheap to pin, yet nothing covers it: a given(loaded(...)) model has facets, and no test renders the page with facets.data unanswered, which is the state that used to read "0 with errors". Without that pair of cases the ?? 0 regression can come straight back.

Add one scene test with a model whose facets never answered asserting `expectView(text("with errors")).toExist()` and its `0 with errors` counterpart once they have.
🤖 Prompt to fix this finding with an AI agent
Findings from an automated review of commit 50389929982ce05fec59992fd514ee08262cb287. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F2 · Note · tests · apps/web/src/page/replays/list/view.ts:246
The honest `with errors` label has no scene test behind it
`replays.scene.test.ts` already renders this page and asserts its text (`expectView(text("2 pages"))` at line 202), so the new label is cheap to pin, yet nothing covers it: a `given(loaded(...))` model has facets, and no test renders the page with `facets.data` unanswered, which is the state that used to read "0 with errors". Without that pair of cases the `?? 0` regression can come straight back.
Suggested fix: Add one scene test with a model whose facets never answered asserting `expectView(text("with errors")).toExist()` and its `0 with errors` counterpart once they have.

Still open from earlier reviews

What was checked
  • facetsOf is undefined until facets answer (replays/list/derive.ts:79), so the chip only loses its count then
  • inPlaceViews is set only by cloudflare-lab/fixture.ts:68, so the route tabs stay plain links
  • cn is tailwind-merge (packages/ui/src/lib/utils.ts:5): py-0 overrides py-3, px-4 survives

5038992 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@maple-review-bot

maple-review-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Open viewHref duplication and the untested honest replay count; the tab-strip rendering has only update-level scene tests.
2 notes · tests partial −1 · risk medium

Cloudflare and GCP list pages now use the same underline link tabs as AWS, and the replays chip waits for facets before showing an error count. Rendering-only and safe to merge; two earlier info findings still stand.

  • linkTabStrip replaces the header segmentedSelect on the Cloudflare and GCP lists
  • TabLink gained an optional onClick so the two labs switch views in place
  • errorSessions is undefined until facets answer, dropping "0 with errors"
  • The logs footer keeps its px-4 gutter (py-0 instead of p-0)

Still open from earlier reviews

What was checked
  • Both providers' tabs link through viewHref, which writes the same search ClickedView did, so no tab lands on a different URL
  • onClick is lab-only: the route call sites pass none (gcp/list/view.ts:351, cloudflare-lab/fixture.ts:68)
  • A loaded zero still renders "0 with errors": facetsOf(model) is undefined only before the read answers

e0c42a4 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo

Makisuo commented Oct 25, 2026

Copy link
Copy Markdown
Collaborator Author

Notes from the latest review: the viewHref / ClickedView duplication is fixed one PR up the stack in #1829 (both go through a shared withView). The honest replay count is a display-only branch (errorSessions === undefined renders no number); left without a dedicated test.

@Makisuo
Makisuo deployed to pr-preview October 25, 2026 14:56 — with GitHub Actions Active
@maple-review-bot

maple-review-bot Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 9/10 · safe to merge
Design-only hunks read clean, but the routes' view switching now rides on untested viewHref links and the viewHref/ClickedView duplication is deferred to #1829.
3 notes · tests partial −1 · risk medium

Replaces the GCP and Cloudflare segmented view switches with the app's underline link tabs (labs switch in place), hides the replays error count until facets answer, and fixes the logs footer gutter. Safe to merge.

  • linkTabStrip gains an optional TabLink.onClick for the router-less labs
  • Cloudflare and GCP view switches become underline tabs with counts
  • Replays with errors chip drops its count until facets load
  • Logs footer keeps px-4 and only drops vertical padding

Findings

🔵 Note · F3 · The live view-switch URL is untested; the scene tests pin the now-unused ClickedView

tests · apps/web/src/page/infra-integrations/cloudflare/list/view.ts:299

The routes no longer dispatch Message.ClickedView — only the labs do — so the tab href built by viewHref is what actually switches views on /infra/cloudflare and /infra/gcp (gcp/list/view.ts:351). cloudflare.scene.test.ts:127 and gcp.scene.test.ts:141 still assert the ClickedView navigation instead, so a regression in the href (a kept scope or q, a stale time window) ships silently. Pin viewHref itself in those two scene tests.

Add a scene assertion on `viewHref`/the rendered tab `href`: from `{ q: "acme", scope: "serving5xx" }`, view "workers" must link to `/infra/cloudflare?view=workers`.
🤖 Prompt to fix this finding with an AI agent
Findings from an automated review of commit 3f80bb2d8a9a616c94e0a116484e357c2896a036. Verify each one against the current code before changing anything, fix only those that still apply, and keep each fix to the lines it names.

---

F3 · Note · tests · apps/web/src/page/infra-integrations/cloudflare/list/view.ts:299
The live view-switch URL is untested; the scene tests pin the now-unused `ClickedView`
The routes no longer dispatch `Message.ClickedView` — only the labs do — so the tab `href` built by `viewHref` is what actually switches views on `/infra/cloudflare` and `/infra/gcp` (`gcp/list/view.ts:351`). `cloudflare.scene.test.ts:127` and `gcp.scene.test.ts:141` still assert the `ClickedView` navigation instead, so a regression in the href (a kept `scope` or `q`, a stale time window) ships silently. Pin `viewHref` itself in those two scene tests.
Suggested fix: Add a scene assertion on `viewHref`/the rendered tab `href`: from `{ q: "acme", scope: "serving5xx" }`, view "workers" must link to `/infra/cloudflare?view=workers`.

Still open from earlier reviews

What was checked
  • Cloudflare viewHref clears the same fields ClickedView patches (update.ts:195), so scope and search still drop on a view switch
  • Only the two labs set onClick; the routes render plain links with no defaultAction: "Prevent"
  • cn is twMerge, so py-0 overrides py-3 and the px-4 gutter the fix relies on survives

3f80bb2 · Updated on every push. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo
Makisuo deployed to pr-preview October 25, 2026 14:58 — with GitHub Actions Active
@Makisuo Makisuo removed the preview:web Deploy a Workers-only PR preview (no ingest/Electric); see docs/pr-previews.md label Oct 25, 2026
@Makisuo
Makisuo deployed to pr-preview October 25, 2026 15:01 — with GitHub Actions Active
@Makisuo
Makisuo added this pull request to stack #1834 October 25, 2026 16:43
@Makisuo
Makisuo merged commit 6496558 into main Oct 25, 2026
25 checks passed
@Makisuo
Makisuo deleted the ui-pass-5 branch October 25, 2026 16:44
Makisuo added a commit that referenced this pull request Oct 25, 2026
…ab header matches the route (#1829)

- Log row actions overlay the row (hover, focus, focused row) instead of reserving ~104px, so
  messages run out to the chips; the invisible no-trace placeholder is gone, row height kept.
- The Cloudflare lab renders the route's title row (description, time range, Reload) through a
  shared titleRow; viewHref and ClickedView share one search transition (review note on #1827).

This branch was successfully deployed

1 active deployment
pr-preview — 3f80bb2d Deployed Oct 25, 2026 by Makisuo via deploy-pr-preview #7029
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