# @repo/editor Owns the rebuilt Veect editor UI (ADR-029): the React Flow board shell, the iframe frame node that hosts the runner's preview-adapter origin, the editor-side selection overlay, the canvas-protocol client (pinned-`targetOrigin` postMessage both directions, ADR-028), and the minimal zustand store (registry + selection only — DesignDoc v1 arrives with the `design-doc-and-editor-foundation` epic). **Boundary tag:** feature. May import from core (`core-runner-protocol`, `core-shared`), feature, and tooling packages. Imported by apps (`apps/web-next` hosts the board from story 10). **Public surface:** - `.` (root) — contracts only: canvas-protocol schemas + types, the feature manifest. - `./ui` — UI artifacts: board, frame node, selection overlay components, the editor store hook. **Conventions:** - UI-only feature package — `useCases` is empty in `src/feature.manifest.ts`; there are no DI binders. Manifest-first ordering applies the moment a use case appears. - Every component in `src/ui/` has sibling `.stories.tsx` + `.test.tsx` files (`component-must-have-story` / `component-must-have-test`) — no exemption zone (ADR-029). - Chrome (selection/hover rings) renders as editor-side overlays positioned from agent-reported geometry — never inside the iframe document (ADR-028). - Board pan/zoom and frame drag are pure React Flow transforms — no canvas-protocol round-trip on drag (<16 ms/frame budget). - The canvas-protocol message shapes agent ↔ editor are local zod schemas in `src/canvas-protocol/` for now; they reconcile with the adapter's agent script (walking-skeleton story 05) and `@repo/core-runner-protocol` in story 10. `render-frame` already comes from `@repo/core-runner-protocol`. - The prototype under `docs/product/reference/project/veect-codebase/` is reference only — never vendored (ADR-029). **See:** `docs/decisions/adr-028-iframe-canvas.md`, `docs/decisions/adr-029-designdoc-v1-and-editor-rebuild.md`, `docs/work/epics/walking-skeleton/09-editor-package/_story.md`.