feat(web): responsive UI overhaul — hamburger nav, spacing scale, icon system #15
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab#15
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Request
Overhaul the web UI to be properly responsive (maintainer request, design grilled interactively on 2026-07-07):
Design decisions (binding, from the grilling session)
aria-expanded.--space-*CSS custom properties) applied consistently to card padding, list gaps, and section margins. Slightly roomier ≥640px, current density on phones.Iconcomponent, colored viacurrentColor.aria-label+title) for universal actions in tight spots: hamburger, back, close/dismiss, send, stop, external-link, and instance-row actions on mobile. Icon+text for nav menu entries, Log out, and form/action buttons.Agent brief follows as a comment.
Agent Brief
Category: enhancement
Summary: Make the lab SPA responsive: collapse the topbar nav behind a hamburger below 640px, introduce a tokenized spacing scale, restack instance rows on narrow screens, and adopt a vendored inline-SVG icon system with icon-only controls in tight spots.
Current behavior:
The topbar renders brand, five text nav links (Repos · Credentials · Runs · Tokens · Settings), an SSE live dot, the username (hidden below 560px by an ad-hoc rule), and a Log out button inline at every viewport width — on phones the links crowd the bar. Spacing values (card padding, list gaps, section margins) are ad-hoc literals in the stylesheet. A repo card's instance row puts title/branch, up to three state chips, a Chat link, an Open deep-link, and a Stop button on one wrapping flex line, squeezing the title to an unreadable sliver on ~360px screens. The chat header's stop control is a text button ("Stop" → "Confirm stop" + "Cancel"), and the composer submits via a text "Send" button. The only iconography is unicode glyphs (←, ↗, ✕, ▸); there is no icon component or icon dependency.
Desired behavior:
aria-expanded. At ≥640px the inline nav renders as today with the username visible (the 560px rule is removed).--space-*) alongside the existing color/radius tokens, and card padding, list gaps, and section margins are expressed through it — current density on phones, slightly roomier at ≥640px.aria-labelandtitle. Nav menu entries, Log out, and form/action buttons keep visible text next to any icon.Iconcomponent containing vendored Lucide SVG paths (ISC license — keep attribution in the component header), sized via a prop and colored viacurrentColorso dark mode needs no extra work.Key interfaces:
Iconcomponent — the only icon entry point; name + optional size props, inline<svg>withstroke="currentColor", no runtime dependency added to the web package.--space-*custom properties join the existing--bg/--radius-*token block; the 44px touch-target and 16px-input rules must survive.Acceptance criteria:
aria-expanded.--space-*tokens exist and card padding, card-list gaps, and section margins reference them; desktop layouts show no regressions.aria-labelandtitle; all icons render via the singleIconcomponent;package.jsongains no new dependency.currentColor).nix flake check(CI has no runner).Out of scope: