Skip to content

Commit 2ff20d0

Browse files
GiniGini
authored andcommitted
Fix desktop app shell grid overflow
1 parent edeafea commit 2ff20d0

4 files changed

Lines changed: 11 additions & 3 deletions

File tree

‎docs/IMPLEMENTATION-LOG.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
- Closed the remaining local P5-02 boundary. Active task stop/retry/follow-up/branch/share/guidance/project/tag actions already use TanStack Query mutation hooks; this pass makes share requests and queued-guidance removal visibly pending, keeps the composer disabled during active mutation requests, and preserves toast-based mutation errors.
1919
- `useTask` remains the sole server-authoritative SSE/replay snapshot. Successful mutations either refresh that snapshot or reconcile server-derived task/conversation/library caches; no second browser-owned transcript store was introduced. `npm run lint`, `npm run test` (50 files / 247 tests), and `npm run build` pass.
2020

21+
## 2026-07-17 — browser-found desktop grid overflow
22+
23+
- Browser QA at a 1,280×900 viewport found that Sonner's notification region was being rendered inside `.app-shell` as an extra CSS-grid child. That pushed the main shell onto a second row, compressed the task view to the first grid track, and produced a 9px horizontal overflow despite the mobile layout appearing healthy.
24+
- Moved `<Toaster>` outside the application grid and pinned `.main-shell` to the second grid column. Rechecked the current Vite app at 1,280×900 and 390×844: both report no horizontal overflow; the 390px task flow completed an explicit simulation chat (`task_81887ee319804a`) with the conversation surface visible. The protected Claude/LiteLLM browser acceptance remains open because no relay credentials were present in this local session.
25+
2126
## 2026-07-17 — handover evidence reconciliation
2227

2328
- Reconciled the phase checklist against the current implementation and regression evidence: P1-01 backend-offline recovery, P1-08 permanent simulation disclosure, and P2-07 durable guidance queueing are complete and now marked as such in `TODO.md`.

‎docs/LINEAR-BOARD.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ The UI program is no longer blocked on the completed truthfulness P0s, but must
114114
- Commit `b30da27` closed a browser-found presentation defect: internal `.claude/skills` files no longer inflate portable artifact counts, provider thinking-token telemetry is not rendered as reasoning, and deterministic history entries are visibly labelled `Simulation · no model call`.
115115
- Post-fix live rerun: `task_4ec98deee76e41` / `task_a01f60f606c349` / `task_9ea262fa183949` passed with 23 live SSE frames, 46 replay frames, two chat turns, one bounded Bash call, valid evidence, and restart recovery.
116116
- The mobile inspector handoff is now implemented and browser-checked: `View computer` switches to a full-height Computer surface and `Back to conversation` restores the thread without horizontal overflow. Exact 390px/tablet screenshot automation remains open.
117+
- 2026-07-17 browser audit found and fixed a desktop-only CSS-grid defect: Sonner's notification region was an extra `.app-shell` grid child, compressing the task shell and causing 9px horizontal overflow at 1,280px. The current app now passes no-overflow checks at 1,280×900 and 390×844, and an explicit local simulation chat completed in the mobile flow. ONE-237 remains open for protected Claude/LiteLLM browser acceptance and exact screenshot automation.
117118
- The focused local gate is green: `npm run check` (lint, 43 files / 229 tests, production build, and all E2E harness typechecks). Boundary: host-process local proof only; no microVM/ONEComputer/OpenVTC/production egress claim.
118119
- UX shell overhaul pass: at the effective 1140px browser width, the old three-column layout compressed the conversation to ~408px. The current slice makes the conversation primary below 1250px, keeps the assistant-ui thread readable, collapses completed operational traces, exposes provider errors through assistant-ui, and hands off to a full-height Computer inspector via `View computer`. Browser-checked on `task_f8d51a10de4f4d`; exact-width screenshot automation and remaining composer/thread/skills polish remain open under ONE-238/239/240/241/242/243/244.
119120
- Latest protected local E2E `task_b47dcbab442345` / `task_b110270725f941` / `task_ce7415292df54c` passed with 31 live SSE frames, 80 replay frames, two chat turns, two bounded Bash calls, restart recovery, and valid evidence. Failure/retry probe `task_4c1e953f5c4d40` intentionally failed one provider run, restarted the API against the same data, retried idempotently, completed, and returned valid evidence. Boundary remains host-process local proof; no microVM or OpenVTC enforcement claim.

‎src/App.tsx‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,9 @@ export default function App() {
381381
}).slice(0, 8)
382382

383383
return (
384-
<div className={`app-shell ${sidebarOpen ? '' : 'sidebar-collapsed'}`}>
384+
<>
385385
<Toaster position="bottom-right" closeButton richColors />
386+
<div className={`app-shell ${sidebarOpen ? '' : 'sidebar-collapsed'}`}>
386387
<AnimatePresence>{sidebarOpen && <><motion.button key="sidebar-backdrop" className="sidebar-backdrop" aria-label="Close sidebar" initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} onClick={() => setSidebarOpen(false)} /><motion.div key="sidebar-panel" initial={{ x: -260 }} animate={{ x: 0 }} exit={{ x: -260 }}><Sidebar view={view} conversations={conversations} activeTaskId={activeTaskId} onNewTask={() => navigateToTask(null)} onClose={() => setSidebarOpen(false)} onSelectTask={(taskId) => navigateToTask(taskId)} hasMoreConversations={Boolean(conversationsHasNextPage)} loadingMoreConversations={conversationsIsFetchingNextPage} onLoadMoreConversations={loadMoreConversations} projects={projects} activeProjectId={activeProjectId} onSelectProject={setActiveProjectId} onCreateProject={addProject} onAttachProjectFile={attachProjectFile} onRemoveProjectFile={detachProjectFile} onUpdateProjectFile={editProjectFile} onRestoreProjectFile={restoreProjectFile} onUpdateProjectContext={updateProject} onOpenSkills={() => navigateToView('skills')} onOpenLibrary={() => navigateToView('library')} onOpenSchedules={() => navigateToView('schedules')} onOpenComputers={() => navigateToView('computers')} skillCount={skillCatalog.length} user={authState?.session?.user} onSignOut={signOut} /></motion.div></>}</AnimatePresence>
387388
<main className="main-shell">
388389
{backendOffline && <div className="backend-offline-banner" role="alert"><div><TriangleAlert size={15} /><span><strong>Backend offline</strong><small>Run <code>npm run dev</code> in the ONEVibe project root to connect the workspace.</small></span></div><button type="button" onClick={() => void retryBackend()} disabled={retryingBackend}>{retryingBackend ? 'Checking…' : 'Retry'}</button></div>}
@@ -423,6 +424,7 @@ export default function App() {
423424
)}
424425
</AnimatePresence>
425426
</main>
426-
</div>
427+
</div>
428+
</>
427429
)
428430
}

‎src/index.css‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)