feat: the plan window — the plan's ambient, live, auto-moving presence
The successor of the injected plan blocks (docs/probe-teach-split.md §6): always on once a tree exists, a zoomed-in window (2:1, ~2¼ node widths) centered on the CURRENT node, re-centering by pure derivation as tagged checks move the lesson — statuses derive live from the transcript on every render (derivePlanStatuses), glow on current, fallback focus on the lesson's first node, click opens the existing full-DAG popup. Bottom-left, mirroring the activity dock's bottom-right; hidden on narrow viewports; the learner's visual polish pass comes later. PlanDiagram gains a viewBoxOverride (exported); latestTree exported. Tests: viewBox centering/clamping (pure) + render (hidden pre-plan, windowed viewBox, glowing current, starting fallback).
This commit is contained in:
@@ -22,6 +22,7 @@ import { Composer } from "@/components/composer";
|
||||
import { JobsContext } from "@/components/jobs-context";
|
||||
import { StatsBar } from "@/components/stats-bar";
|
||||
import { PlanBlock, PlanPopup } from "@/components/plan-block";
|
||||
import { PlanWindow } from "@/components/plan-window";
|
||||
import type { PlanBlockData } from "@/src/core";
|
||||
import { QuestionDock } from "@/components/question-dock";
|
||||
import { SidebarToggle } from "@/components/sidebar";
|
||||
@@ -506,6 +507,8 @@ export function Chat({
|
||||
</div>
|
||||
</div>
|
||||
{planOpen && <PlanPopup messages={messages} onClose={() => setPlanOpen(false)} />}
|
||||
{/* The plan's ambient presence: live, zoomed on the current node; click → popup. */}
|
||||
<PlanWindow messages={messages} onOpen={() => setPlanOpen(true)} />
|
||||
</JobsContext.Provider>
|
||||
</ChatActionsContext.Provider>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user