R8a: turn the composer into a floating island, not a full-width footer bar - #163
Merged
Conversation
…r bar The composer was a <footer> spanning the full window width, docked flush at the bottom with no visual container of its own - a textarea and a row of individually-bordered buttons sitting directly in the app background. It's now a self-contained floating card, centered over the canvas with a responsive max-width, using the same elevated-surface language as the app's popovers/dialogs (node-body background, border, shadow). Inside the card: the textarea drops its own border/background and blends into the card surface (focus now highlights the whole card via :focus-within, not just the field); the attach/reasoning/model controls go flat and borderless until hover instead of each being its own bordered box; send/cancel break out into their own zone behind a single hairline divider, with send as the one circular, filled accent control. Structurally, <footer className="app-composer-region"> is gone - the composer now lives inside <main className="app-canvas-region"> as an absolutely-positioned layer, the same pattern already used for the token counter and notification banner, so the canvas renders full-bleed behind it. Its bottom offset is set from the token counter's actual measured footprint so the two never collide, verified at both a 960px and a wide desktop window width. Also deletes two fully orphaned CSS rules (.app-composer-region and .app-composer-placeholder, an unrelated dead leftover from an early pre-R2.3 scaffold) found sitting next to the selector this change repoints - neither had any JSX reference left.
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.
Problem
The composer was a
<footer>spanning the full window width, docked flush at the bottom with no visual container of its own - a plain textarea and a row of individually-bordered buttons sitting directly in the app background. It read as a form embedded in a page, not a self-contained control surface.Change
<footer className="app-composer-region">is gone. The composer now lives inside<main className="app-canvas-region">as a new absolutely-positioned layer, the same pattern already used for the token counter and notification banner, so the canvas renders full-bleed behind it.:focus-within, not just the field); the attach/reasoning/model controls go flat and borderless until hover instead of each being its own bordered box; send/cancel break out into their own zone behind a single hairline divider, with send as the one circular, filled accent control..app-composer-regionand.app-composer-placeholder, an unrelated dead leftover from an early pre-R2.3 scaffold) found sitting next to the selector this change repoints - neither had any remaining JSX reference.No changes to
Composer.tsx's element tree,aria-labels, ordata-overlay-triggerattributes - this is a CSS/layout change only, so existing test coverage for composer behavior is untouched and still exercises the same DOM contract.Test plan
tsc --noEmitclean, lint 0 errors, 785 tests passed, build succeedsgetBoundingClientRect) at both 1189px and 960px window widths, with zero vertical overlap against the token counter's real measured position at either width