Repository navigation
feat(web): adopt BaseUI with host-owned theming - #888
Merged
Merged
Conversation
mnoah1
requested review from
a team,
behinddwalls and
sbalabanov
as code owners
October 19, 2026 19:24
mnoah1
force-pushed
the
mnoah1/web-baseui
branch
3 times, most recently
from
October 19, 2026 20:16
ba1e49f to
20fd875
Compare
behinddwalls
approved these changes
Oct 20, 2026
mnoah1
force-pushed
the
mnoah1/web-baseui
branch
2 times, most recently
from
October 21, 2026 15:04
a3f04e7 to
b2acd5b
Compare
Use BaseUI directly in SubmitQueue and Stovepipe views, with host-owned themes, providers, and Styletron SSR/hydration. Preserve gateway-owned pagination and project results, and correct filter accessibility for mouse and keyboard use. Validated all 33 web checks and production browser targets, plus repository formatting and dependency checks. React 18 packages hydrate under light, dark, and custom host themes. Co-Authored-By: Preetam Dwivedi <preetam@uber.com> Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
mnoah1
force-pushed
the
mnoah1/web-baseui
branch
from
October 21, 2026 15:09
b2acd5b to
20c18cd
Compare
mnoah1
enabled auto-merge
October 21, 2026 15:13
behinddwalls
added a commit
that referenced
this pull request
Oct 28, 2026
## Summary ### Why? Queue activity only showed the last 24 hours, so a quiet queue looked empty even when it had history; paging meant clicking through snapshot pages, and there was no way to see only requests in a given status or when each last changed. Queue names also sat at the root of the URL space, where a queue named `api` or `healthz` would collide with host routes, and the move to BaseUI (#888) had replaced SubmitQueue's original centered look with full-width defaults that read worse. ### What? - **Queue activity**: starts at the newest request however old and loads older pages automatically near the bottom (Load more button, retry on failure); loaded rows and scroll position survive request visits, and refreshes update statuses in place behind "Show latest requests". Stovepipe's infinite-scroll list moves to `web/platform` as `PagedRequests` / `RequestPagesProvider` and both modules use it. - **Status filter and Updated column**: a status multi-select restricts the list through the gateway's `statuses` filter, shareable as repeated `?status=` parameters; an Updated column and summary fact show `updated_at_ms`. - **URLs**: pages live under `/queue/<queue>`, `/queue/<queue>/request/<sqid>`, and `/queue/<queue>/change/…`. Continuations read `GET /api/queue/<queue>/requests?status=…&page=…`, a thin host route over the module's new `queueRequests` entry, which shares the queue page's authorization, filter canonicalization, and loader. - **Look**: header, page, and footer share a centered `min(1200px, 100% - 48px)` column with an 80px ruled header and dark SQ badge; links use the theme's `accent500` without underline until hover, change URIs are monospace, and secondary text is muted. The queue directory is a card grid. Request history is a two-column timeline with the time since the previous event. All styling uses BaseUI theme tokens and `withStyle`, so host themes still apply; Stovepipe is unchanged apart from the shared list. - Removed: the read-only labels, the displayed-page search box, and bullets in the Changes column. ## Test Plan ✅ `bazel test //web/platform/... //web/submitqueue/... //web/stovepipe/... //web/service/submitqueue:all //web/service/stovepipe:all //web/test/package/...` ✅ `bazel test //web/test/e2e/submitqueue:web_test` (status filter, JSON API authentication and filtering, layout, accessibility scans) ✅ Locally: `make local-submitqueue-start`, `make demo-requests COUNT=1000 WATCH=false`, then open the printed Web UX URL (user `test`), scroll `/queue/demo-queue`, and filter by status.
behinddwalls
added a commit
that referenced
this pull request
Oct 28, 2026
## Summary ### Why? Queue activity only showed the last 24 hours, so a quiet queue looked empty even when it had history; paging meant clicking through snapshot pages, and there was no way to see only requests in a given status or when each last changed. Queue names also sat at the root of the URL space, where a queue named `api` or `healthz` would collide with host routes, and the move to BaseUI (#888) had replaced SubmitQueue's original centered look with full-width defaults that read worse. ### What? - **Queue activity**: starts at the newest request however old and loads older pages automatically near the bottom (Load more button, retry on failure); loaded rows and scroll position survive request visits, and refreshes update statuses in place behind "Show latest requests". Stovepipe's infinite-scroll list moves to `web/platform` as `PagedRequests` / `RequestPagesProvider` and both modules use it. - **Status filter and Updated column**: a status multi-select restricts the list through the gateway's `statuses` filter, shareable as repeated `?status=` parameters; an Updated column and summary fact show `updated_at_ms`. - **URLs**: pages live under `/queue/<queue>`, `/queue/<queue>/request/<sqid>`, and `/queue/<queue>/change/…`. Continuations read `GET /api/queue/<queue>/requests?status=…&page=…`, a thin host route over the module's new `queueRequests` entry, which shares the queue page's authorization, filter canonicalization, and loader. - **Look**: header, page, and footer share a centered `min(1200px, 100% - 48px)` column with an 80px ruled header and dark SQ badge; links use the theme's `accent500` without underline until hover, change URIs are monospace, and secondary text is muted. The queue directory is a card grid. Request history is a two-column timeline with the time since the previous event. All styling uses BaseUI theme tokens and `withStyle`, so host themes still apply; Stovepipe is unchanged apart from the shared list. - Removed: the read-only labels, the displayed-page search box, and bullets in the Changes column. ## Test Plan ✅ `bazel test //web/platform/... //web/submitqueue/... //web/stovepipe/... //web/service/submitqueue:all //web/service/stovepipe:all //web/test/package/...` ✅ `bazel test //web/test/e2e/submitqueue:web_test` (status filter, JSON API authentication and filtering, layout, accessibility scans) ✅ Locally: `make local-submitqueue-start`, `make demo-requests COUNT=1000 WATCH=false`, then open the printed Web UX URL (user `test`), scroll `/queue/demo-queue`, and filter by status.
behinddwalls
added a commit
that referenced
this pull request
Oct 28, 2026
## Summary ### Why? Queue activity only showed the last 24 hours, so a quiet queue looked empty even when it had history; paging meant clicking through snapshot pages, and there was no way to see only requests in a given status or when each last changed. Queue names also sat at the root of the URL space, where a queue named `api` or `healthz` would collide with host routes, and the move to BaseUI (#888) had replaced SubmitQueue's original centered look with full-width defaults that read worse. ### What? - **Queue activity**: starts at the newest request however old and loads older pages automatically near the bottom (Load more button, retry on failure); loaded rows and scroll position survive request visits, and refreshes update statuses in place behind "Show latest requests". Stovepipe's infinite-scroll list moves to `web/platform` as `PagedRequests` / `RequestPagesProvider` and both modules use it. - **Status filter and Updated column**: a status multi-select restricts the list through the gateway's `statuses` filter, shareable as repeated `?status=` parameters; an Updated column and summary fact show `updated_at_ms`. - **URLs**: pages live under `/queue/<queue>`, `/queue/<queue>/request/<sqid>`, and `/queue/<queue>/change/…`. Continuations read `GET /api/queue/<queue>/requests?status=…&page=…`, a thin host route over the module's new `queueRequests` entry, which shares the queue page's authorization, filter canonicalization, and loader. - **Look**: header, page, and footer share a centered `min(1200px, 100% - 48px)` column with an 80px ruled header and dark SQ badge; links use the theme's `accent500` without underline until hover, change URIs are monospace, and secondary text is muted. The queue directory is a card grid. Request history is a two-column timeline with the time since the previous event. All styling uses BaseUI theme tokens and `withStyle`, so host themes still apply; Stovepipe is unchanged apart from the shared list. - Removed: the read-only labels, the displayed-page search box, and bullets in the Changes column. ## Test Plan ✅ `bazel test //web/platform/... //web/submitqueue/... //web/stovepipe/... //web/service/submitqueue:all //web/service/stovepipe:all //web/test/package/...` ✅ `bazel test //web/test/e2e/submitqueue:web_test` (status filter, JSON API authentication and filtering, layout, accessibility scans) ✅ Locally: `make local-submitqueue-start`, `make demo-requests COUNT=1000 WATCH=false`, then open the printed Web UX URL (user `test`), scroll `/queue/demo-queue`, and filter by status.
Tmwakalasya
pushed a commit
to Tmwakalasya/submitqueue
that referenced
this pull request
Oct 29, 2026
## Summary ### Why? Queue activity only showed the last 24 hours, so a quiet queue looked empty even when it had history; paging meant clicking through snapshot pages, and there was no way to see only requests in a given status or when each last changed. Queue names also sat at the root of the URL space, where a queue named `api` or `healthz` would collide with host routes, and the move to BaseUI (uber#888) had replaced SubmitQueue's original centered look with full-width defaults that read worse. ### What? - **Queue activity**: starts at the newest request however old and loads older pages automatically near the bottom (Load more button, retry on failure); loaded rows and scroll position survive request visits, and refreshes update statuses in place behind "Show latest requests". Stovepipe's infinite-scroll list moves to `web/platform` as `PagedRequests` / `RequestPagesProvider` and both modules use it. - **Status filter and Updated column**: a status multi-select restricts the list through the gateway's `statuses` filter, shareable as repeated `?status=` parameters; an Updated column and summary fact show `updated_at_ms`. - **URLs**: pages live under `/queue/<queue>`, `/queue/<queue>/request/<sqid>`, and `/queue/<queue>/change/…`. Continuations read `GET /api/queue/<queue>/requests?status=…&page=…`, a thin host route over the module's new `queueRequests` entry, which shares the queue page's authorization, filter canonicalization, and loader. - **Look**: header, page, and footer share a centered `min(1200px, 100% - 48px)` column with an 80px ruled header and dark SQ badge; links use the theme's `accent500` without underline until hover, change URIs are monospace, and secondary text is muted. The queue directory is a card grid. Request history is a two-column timeline with the time since the previous event. All styling uses BaseUI theme tokens and `withStyle`, so host themes still apply; Stovepipe is unchanged apart from the shared list. - Removed: the read-only labels, the displayed-page search box, and bullets in the Changes column. ## Test Plan ✅ `bazel test //web/platform/... //web/submitqueue/... //web/stovepipe/... //web/service/submitqueue:all //web/service/stovepipe:all //web/test/package/...` ✅ `bazel test //web/test/e2e/submitqueue:web_test` (status filter, JSON API authentication and filtering, layout, accessibility scans) ✅ Locally: `make local-submitqueue-start`, `make demo-requests COUNT=1000 WATCH=false`, then open the printed Web UX URL (user `test`), scroll `/queue/demo-queue`, and filter by status. ## UI <img width="1307" height="874" alt="Screenshot 2026-10-27 at 7 35 24 PM" src="https://github.com/user-attachments/assets/9fdc188a-5d3c-42e9-9e13-c6a95325d969" /> <img width="1354" height="992" alt="Screenshot 2026-10-27 at 7 35 15 PM" src="https://github.com/user-attachments/assets/36fbfd37-a432-4065-ba1a-1a3de9cf7edc" /> <img width="1298" height="726" alt="Screenshot 2026-10-27 at 7 35 06 PM" src="https://github.com/user-attachments/assets/4f8e6f34-d119-4971-9952-94b8251f625e" /> ## Stack 1. uber#968 1. @ uber#969 🤖 Generated with [Claude Code](https://claude.com/claude-code)
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
Replace native controls and tables in the SubmitQueue and Stovepipe views with BaseUI. Hosts own providers, themes, and Styletron SSR/hydration; BaseUI and Styletron React are peers.
Use BaseUI props for full-width layout with small gutters and responsive behavior. The stylesheets retain only one rule for wrapping long identifiers and errors; scrolling tables support keyboard access.
Preserve gateway-owned pagination without a host cursor secret and the paginated project-results UI. Keep filter accessibility attributes valid when menus close and reopen.
Keep SubmitQueue and Stovepipe request details separated into readable rows, align metadata, and show an active view indicator and compact lifecycle trail. Browser regression checks cover spacing, separators, lifecycle placement, mobile overflow, and Stovepipe styling before hydration.
Test Plan
./tool/bazel test //web:check //web/test/e2e/stovepipe:web_test //web/test/e2e/submitqueue:web_test --test_env=SKIP_CLEANUP=false --test_output=errorsmake fmt lint check-tidy check-gazellemake local-stovepipe-web-start, then open the printed URL (credentials: test/test).Revert Plan
Revert this migration and roll back consumer package updates together; no stored-data migration is involved.
Issue Links
None; this change updates frontend presentation and host integration.