Fix canvas stuck on camera denial, move input under canvas

Camera denial now properly pops the dead scene off the stack so the
fluid sim resumes. Desktop right pane reordered: canvas → input →
scrollable output.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
kbanc85 2026-02-15 12:51:14 -05:00
parent 047b5b8381
commit a73644b516
3 changed files with 58 additions and 59 deletions

View File

@ -1,7 +1,7 @@
{ {
"totalArticles": 83, "totalArticles": 83,
"totalClaims": 415, "totalClaims": 415,
"lastUpdated": "2026-02-15T17:32:46.065Z", "lastUpdated": "2026-02-15T17:48:20.296Z",
"latestArticleDate": "2026-02-14", "latestArticleDate": "2026-02-14",
"topics": [ "topics": [
"business", "business",

View File

@ -5,7 +5,7 @@
<link>https://kbanc.com</link> <link>https://kbanc.com</link>
<description>Evidence-based claims about AI implementation, optimized for LLM extraction and research citation.</description> <description>Evidence-based claims about AI implementation, optimized for LLM extraction and research citation.</description>
<language>en-us</language> <language>en-us</language>
<lastBuildDate>Sun, 15 Feb 2026 17:32:45 GMT</lastBuildDate> <lastBuildDate>Sun, 15 Feb 2026 17:48:19 GMT</lastBuildDate>
<atom:link href="https://kbanc.com/feed.xml" rel="self" type="application/rss+xml"/> <atom:link href="https://kbanc.com/feed.xml" rel="self" type="application/rss+xml"/>
<item> <item>

View File

@ -237,6 +237,7 @@ function TerminalHomepageInner({
pushScene({ pushScene({
type: "camera", type: "camera",
onCameraDenied: () => { onCameraDenied: () => {
popScene();
setCameraState("denied"); setCameraState("denied");
}, },
}); });
@ -306,6 +307,7 @@ function TerminalHomepageInner({
pushScene({ pushScene({
type: "camera", type: "camera",
onCameraDenied: () => { onCameraDenied: () => {
popScene();
setCameraState("denied"); setCameraState("denied");
}, },
}); });
@ -352,7 +354,7 @@ function TerminalHomepageInner({
popScene(); popScene();
pushScene({ type: "camera" }); pushScene({ type: "camera" });
}, },
onCameraDenied: () => setCameraState("denied"), onCameraDenied: () => { popScene(); setCameraState("denied"); },
}); });
} else { } else {
// Normal fluid sim oracle overlay // Normal fluid sim oracle overlay
@ -685,42 +687,15 @@ function TerminalHomepageInner({
</div> </div>
</div> </div>
{/* Right pane: canvas on top, output + input on bottom */} {/* Right pane: canvas on top, input below canvas, output scrolls down */}
<div className="flex-1 flex flex-col min-w-0"> <div className="flex-1 flex flex-col min-w-0">
{/* Top: fluid simulation / camera */} {/* Top: fluid simulation / camera */}
<div className="h-[45%] border-b border-border cursor-pointer overflow-hidden" onClick={handleCanvasClick}> <div className="h-[45%] border-b border-border cursor-pointer overflow-hidden" onClick={handleCanvasClick}>
<SidebarCanvas mode="pane" /> <SidebarCanvas mode="pane" />
</div> </div>
{/* Bottom: scrollable output + sticky input */} {/* Input bar (directly under canvas) */}
<div className="flex-1 flex flex-col min-h-0"> <div className="flex-shrink-0 border-b border-border px-5 py-3">
{/* Output area */}
<div className="flex-1 overflow-y-auto p-5">
{history.length === 0 ? (
<p className="text-terminal-dim text-sm">
type a command from the menu, or ask a question.
</p>
) : (
<div className="space-y-4">
{history.map((entry) => (
<div key={entry.id}>
<TerminalPrompt command={entry.command} />
{entry.isOracle ? (
<OracleOutput entry={entry} />
) : streamingId === entry.id ? (
<StreamingOutput entry={entry} onComplete={handleStreamComplete} />
) : completedIds.has(entry.id) ? (
<CompletedOutput entry={entry} />
) : null}
</div>
))}
</div>
)}
<div ref={bottomRef} />
</div>
{/* Input bar */}
<div className="flex-shrink-0 border-t border-border px-5 py-3">
<form onSubmit={handleSubmit} className="flex items-center gap-2"> <form onSubmit={handleSubmit} className="flex items-center gap-2">
<span className="text-terminal-green select-none font-bold" aria-hidden="true">$</span> <span className="text-terminal-green select-none font-bold" aria-hidden="true">$</span>
<div className="relative flex-1"> <div className="relative flex-1">
@ -748,6 +723,30 @@ function TerminalHomepageInner({
)} )}
</form> </form>
</div> </div>
{/* Output area (scrolls down below input) */}
<div className="flex-1 overflow-y-auto p-5">
{history.length === 0 ? (
<p className="text-terminal-dim text-sm">
type a command from the menu, or ask a question.
</p>
) : (
<div className="space-y-4">
{history.map((entry) => (
<div key={entry.id}>
<TerminalPrompt command={entry.command} />
{entry.isOracle ? (
<OracleOutput entry={entry} />
) : streamingId === entry.id ? (
<StreamingOutput entry={entry} onComplete={handleStreamComplete} />
) : completedIds.has(entry.id) ? (
<CompletedOutput entry={entry} />
) : null}
</div>
))}
</div>
)}
<div ref={bottomRef} />
</div> </div>
</div> </div>
</div> </div>