# Implementation Plan: F11 — Preview Toolbar as the Primary Interaction Surface (#43) **Spec:** `docs/superpowers/specs/2026-06-12-f11-preview-toolbar-interaction-surface.md` **Anchor:** Feature `benstull/vscode-cowriting-plugin#43` (F11, `type/feature`, `priority/P1`) **Session:** vscode-cowriting-plugin-0037 This plan transcribes the spec's §7.2 slicing plan into concrete, file-level tasks. Each slice is independently green (unit + host E2E) before the next. Host E2E is this app's required tier (no browser/deploy stage — a VS Code extension); no LLM in CI (edit turns stubbed). The webview's visual rendering, the adaptive label, and the selection→source DOM lookup are manual-smoke only. --- ## SLICE-1 — Pin baseline button + reachability *(the immediate win)* Homes the orphaned `cowriting.pinDiffBaseline` command and gives the writer a reachable Pin control in the preview toolbar. **Tasks** 1. **Host message routing** (`src/trackChangesPreview.ts`): extract the inline `onDidReceiveMessage` body into a private `handleWebviewMessage(document, m)` method; add a `pinBaseline` branch that calls `this.diffView.pin(document)` (the *previewed* document — not `activeTextEditor`). The existing `onDidChangeBaseline` subscription already re-renders with cleared marks. 2. **Test seam**: add `receiveMessage(uriString, m)` that resolves the doc and calls `handleWebviewMessage`, so host E2E can simulate the raw webview message and exercise the real routing. 3. **Webview** (`media/preview.ts` + `.css`): add a `⌖ Pin baseline` button in `#cw-header`; click → `postMessage({ type: "pinBaseline" })`; theme-aware CSS. 4. **Shell HTML** (`shellHtml`): add the `