emrg: GUI layout v0.2 — panels become workspace views - #762
Conversation
Host rejected the v0.1 design where nav clicks expand panels inside the 264px sidebar (~220px usable). v0.2: nav click switches the whole right workspace area, same mechanism as session switching (DOM show/hide via .active mutual exclusion, state preserved). - #chat-view renamed #workspace (shared parent of session views + panel views) - 4 panels (projects/tasks/rants/settings) moved from #sidebar into #workspace, .side-panel -> .workspace-view, data-panel-body -> data-view; #panel-sessions deleted - nav data-panel -> data-view (sessions = activate current session view) - switchPanel -> switchView (VIEWS), state.activePanel -> state.activeView - panel view active: composer + empty-state + result-panel + resizer hidden; session view: restored (per-sid state preserved) - activateSessionView clears all panel views + nav highlight (mutual exclusion) - docs/gui-redesign.md v0.2 terminology (App Shell / Sidebar / Workspace / Views) - GUI tests updated to .active semantics + new nav test (236 pass)
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — self-review (1/3). Verified locally: GUI tests 236/236 (nav-view test covers panel activation + mutual exclusion + composer/result-panel hide/restore + toggle-to-session), pytest 801, doc-count 3/3, node --check clean. CI: test + test-windows both PASS. Diff check: #chat-view → #workspace rename consistent across index.html/layout.css/app.js/chat.js; panels moved into #workspace with .workspace-view mutual-exclusion classes; switchView toggle semantics preserved; no .side-panel / chat-view id residue in DOM.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle (2/3). Independent re-review of full diff:
- Refactor correctness: #chat-view → #workspace rename consistent across index.html/layout.css/app.js/chat.js/dialogs.js/markdown.js; .side-panel → .workspace-view with data-view attributes; #panel-sessions removed (sessions = activate current session view).
- switchView semantics: toggle-off on same item returns to session view; opening a panel explicitly clears ALL session views + panel views via DOM (not relying on tree order) for mutual exclusion; nav highlight toggled consistently.
- setWorkspaceChrome("panel") hides composer/empty-state/result-panel/resizer (incl. HTML-preview closePreview call) and restores them on session view — no stuck hidden input.
- Residue check: grep for data-panel/side-panel/chat-view/panel-sessions/panel-body → 0 hits in renderer code (only CSS comment historical mention).
- Tests: GUI 236/236 pass locally (new nav-view test covers panel activation + mutual exclusion + chrome hide/restore + toggle-to-session); pytest 801 passed; doc-count guard 3/3; node --check clean.
- CI: test 31694170177 test+test-windows PASS; MERGEABLE.
Awaiting 3rd ✅ from another cycle.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle (3/3). Fresh verification on head 6796686: pytest 801 passed, GUI tests 236/236 passed, node --check clean; grep residue check for side-panel/data-panel/chat-view/panel-sessions in renderer code → 0 hits. CI test + test-windows PASS. Merging.
…e-view-body CSS (#763) Follow-up to the GUI layout v0.2 workspace-views merge (#762, rant 18:55:09): - evolution_prompt.md: add implemented-features quick-ref entry for #762 (panels → workspace views, terminology, merged d664ada) - i18n.js: remove 6 dead keys (nav.sessionsPanel/projectsPanel/tasksPanel/ rantsPanel/settingsPanel + nav.placeholder) — they were only used by the deleted .side-panel-title elements from #762; grep-verified zero usages - layout.css: add .workspace-view-body rule restoring v0.1 .side-panel-body visual parity (font-size fs-secondary + color text-3) that the migration dropped for the projects/tasks/rants panel content wrappers Verification: GUI tests 236/236, pytest 801, node --check, import + CLI green Co-authored-by: EMRG Evolution <emrg@argszero.dev>
…to session-view scrolls (#764) Regression from #634 (per-session .session-view scroll containers): #workspace is overflow:hidden and never scrolls itself, but both scroll listeners were attached to it in bubble phase. Native scroll events do NOT bubble, so: - back-to-bottom button never appeared in the real GUI (tests dispatched scroll directly on the wrapper, masking the bug) - scroll-to-top older-history load never fired (same cause) - returning from a panel view (v0.2 #762) always jumped to bottom, violating the rant acceptance "scroll position preserved" (browser-tab semantics) Fix: - attach both #workspace scroll listeners with capture: true so child .session-view scrolls reach them - updateBackToBottomState/activeScrollEl helpers read metrics from the active .session-view (not the non-scrolling #workspace) - back-to-bottom click scrolls the active .session-view - activateSessionView only scrolls to bottom for newly-created containers; existing containers preserve their scroll position (panel round-trip / session switch no longer jump) - setWorkspaceChrome hides back-to-bottom in panel views, restores per position when returning to session view Tests: +1 renderer.smoke (back-to-bottom follows session-view scroll via capture, panel-view hide + position restore on return) — GUI 236→237; Agent.md count synced; pytest 801 green. Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Summary
Host rejected the v0.1 sidebar-panel design (rant 2026-08-13T18:55:09): panels expanding inside the 264px sidebar left only ~220px usable width, cramping the settings 6-tab / task CRUD / project list. v0.2 switches the whole right workspace area on nav click — same mechanism as session switching (DOM show/hide, state preserved).
Changes
DOM (index.html)
#chat-view→#workspace(unified term: workspace is the shared parent of session views + panel views)#sidebarinto#workspace:.side-panel→.workspace-view,data-panel-body→data-view;#panel-sessionsdeleted (sessions = activate current session view)data-panel→data-viewCSS (layout.css)
.workspace-view: defaultdisplay:none;.active→display:flex; flex-direction:column; height:100%; overflow-y:auto; padding(fills entire workspace)#workspace: flex:1 / min-width:0 / overflow:hidden.side-panelnarrow rulesJS (app.js / chat.js / dialogs.js)
SIDE_PANELS/switchPanel→VIEWS/switchView;state.activePanel→state.activeView#composer-wrap/#empty-state/#result-panel/#result-resizer(+ closes HTML preview); session view → restoresactivateSessionViewclears all panel views + nav highlight (mutual exclusion)Docs
docs/gui-redesign.mdv0.2 with host-confirmed terminology (App Shell / Sidebar / Nav / Workspace / Workspace View / Session View)Verification
.activesemantics + new nav-view test)