You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Responsive grid layout: fixed TopBar/Sidebar with document scroll (#3178)
Refactor of #2087
Switch from a CSS grid layout (where TopBar and Sidebar occupied grid
cells alongside ContentPane) to fixed-position TopBar and Sidebar with
document-level scrolling. This is the foundation for mobile/tablet
support and likely the place that has the potential to cause the most
issues so I'm separating the two.
- Viewport meta tag: proper responsive width=device-width instead of
fixed width=1050
- CSS: add --sidebar-width variable, responsive --content-gutter
(smaller below 1000px), remove overflow-y-hidden on body, set height:
100% on html/body/#root
- TopBar: single fixed element (was two Fragment children occupying grid
cells)
- Sidebar: fixed position with overflow scroll
- ContentPane: margin-left offset for sidebar, document-level scroll via
min-h-[calc(100vh-...)]
- Scroll restoration: window.scrollY instead of container .scrollTop
- PageSkeleton: matches new fixed layout structure
- E2e: scroll-restore test updated for document scroll,
expectScrollTop/scrollTo utils use window
This PR should produce a console that is visually identical to the
current one.
---
Broader responsive changes will come in another PR, and are not a
blocker for this.
Todo
- [x] Fix table dropdown overlapping header
- [x] Double check modals are not causing layout shift
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: David Crespo <david.crespo@oxidecomputer.com>
Copy file name to clipboardExpand all lines: AGENTS.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -32,6 +32,7 @@
32
32
- Co-locate Vitest specs next to the code they cover; use Testing Library utilities (`render`, `renderHook`, `fireEvent`, fake timers) to assert observable output rather than implementation details (`app/ui/lib/FileInput.spec.tsx`, `app/hooks/use-pagination.spec.ts`).
33
33
- For sweeping styling changes, coordinate with the visual regression harness and follow `test/visual/README.md` for the workflow.
34
34
- Fix root causes of flaky timing rather than adding `sleep()` workarounds in tests.
35
+
- Local Playwright runs write a compact plain-text report to `.e2e-logs/` (gitignored, one timestamped `.log` per run, last 10 kept) via the custom reporter at `test/e2e/compact-reporter.ts`. Top line is `status: ... total=N passed=N ...`; each failure is a `── UNEXPECTED|FLAKY file:line title` block followed by the error (ANSI stripped). Latest run: `ls .e2e-logs | tail -1` — Read it directly, no parsing needed.
35
36
36
37
# Data fetching pattern
37
38
@@ -100,7 +101,7 @@
100
101
101
102
# Layout & accessibility
102
103
103
-
- Build pages inside the shared `PageContainer`/`ContentPane` so you inherit the skip link, sticky footer, pagination target, and scroll restoration tied to `#scroll-container`(`app/layouts/helpers.tsx`, `app/hooks/use-scroll-restoration.ts`).
104
+
- Build pages inside the shared `PageContainer`/`ContentPane` so you inherit the skip link, sticky footer, pagination target, and scroll restoration (`app/layouts/helpers.tsx`, `app/hooks/use-scroll-restoration.ts`).
104
105
- Surface page-level buttons and pagination via the `PageActions` and `Pagination` tunnels from `tunnel-rat`; anything rendered through `.In` lands in `.Target` automatically.
105
106
- For global loading states, reuse `PageSkeleton`—it keeps the MSW banner and grid layout stable, and `skipPaths` lets you opt-out for routes with custom layouts (`app/components/PageSkeleton.tsx`).
106
107
- Enforce accessibility at the type level: use `AriaLabel` type from `app/ui/util/aria.ts` which requires exactly one of `aria-label` or `aria-labelledby` on custom interactive components.
0 commit comments