Skip to content

feat: usable spatial canvas — drag/pan/zoom, link UX, wiki-link editing#29

Merged
hyperpolymath merged 1 commit into
mainfrom
claude/project-scope-planning-5zoaze
Jul 3, 2026
Merged

feat: usable spatial canvas — drag/pan/zoom, link UX, wiki-link editing#29
hyperpolymath merged 1 commit into
mainfrom
claude/project-scope-planning-5zoaze

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

The final roadmap follow-up (Import/export ✅ → Accessibility+PWA ✅ → Differentiators ✅ → Usable canvas). Makes the spatial canvas directly usable with a mouse and turns links into first-class editor objects. Also lands wiki-link editing (the [[…]] parser shipped in #26; the picker + reconciliation live here as planned).

Canvas interaction (CanvasView + DomBindings)

  • Drag notes: mousedown on a note starts a drag; one set of document-level mousemove/mouseup listeners moves it (delta ÷ zoom) even when the pointer leaves the note. Shift-click adds to the selection.
  • Drag the background to pan (incremental PanCanvas); wheel to zoom.
  • Keyboard equivalents (arrow-move / Alt-nudge) from feat: keyboard-accessible canvas (WCAG 2.2 AA) + installable PWA #27 still apply.

Link-creation UX (NoteEditor)

  • Links and backlinks now render note titles, not raw UUIDs, and are clickable to navigate.
  • An "add link" picker: type to filter other notes, click to link.
  • A "Linked from" backlinks panel.

Wiki-link editing (core)

  • Notebook::set_content derives [[Title]] links from a note's content (case-insensitive resolution, self-reference skipped, additive — never removes on text deletion). wasm update_content now returns a delta so target backlinks update in the UI too.

Verified

  • cargo test — 29 unit tests (incl. set_content derivation) plus property/golden suites.
  • deno task test:ui — 10 tests, incl. a new wiki-link delta contract across the wasm boundary.
  • deno lint + cargo fmt --check + cargo clippy --features wasm -D warnings clean.
  • E2E (headless Chromium): the picker adds a link shown by title; the backlinks panel lists the source; typing [[Alpha]] derives the link; a canvas note drags 150→230px; axe-core still 0 serious/critical WCAG 2.2 AA.

With this, the README MVP checklist is functionally complete (create/edit/delete, spatial canvas with drag-and-drop, bidirectional linking, search, local storage), plus the post-MVP differentiators (wiki-links, graph view, agents, import/export, PWA, accessibility). Known-red estate governance checks (ReScript-language ban, scorecard staleness) remain pre-existing policy on main and out of scope.

🤖 Generated with Claude Code

https://claude.ai/code/session_01PAEqVP7Y3bZDhtAaPUTbps


Generated by Claude Code

The final roadmap slice: the spatial canvas becomes directly usable and
links become first-class in the editor.

Canvas interaction (ui/src/View.res CanvasView + DomBindings):
- Drag notes: mousedown on a note starts a drag; one set of
  document-level mousemove/mouseup listeners moves it (delta ÷ zoom)
  even when the pointer leaves the note. Shift-click adds to the
  selection.
- Drag the background to pan (incremental PanCanvas); wheel to zoom.

Link-creation UX (NoteEditor):
- Links and backlinks now render note *titles*, not raw UUIDs, and are
  clickable to navigate.
- An "add link" picker: type to filter other notes, click to link.
- A "Linked from" backlinks panel.

Wiki-link editing (core):
- notebook.set_content derives [[Title]] links from a note's content
  (case-insensitive title resolution, self-reference skipped, additive —
  never removes on text deletion). wasm update_content now returns a
  delta so target backlinks update in the UI too.

Verified: cargo test (29 unit incl. set_content derivation; property +
golden suites); deno test:ui (10, incl. a new wiki-link delta contract);
deno lint + cargo fmt/clippy (-D warnings, wasm) clean. E2E (headless
Chromium): the link picker adds a link shown by title; backlinks list
the source; typing [[Alpha]] derives the link; a canvas note drags
150→230px; axe-core still 0 serious/critical WCAG 2.2 AA.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PAEqVP7Y3bZDhtAaPUTbps
@sonarqubecloud

sonarqubecloud Bot commented Jul 3, 2026

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

🔍 Hypatia Security Scan

Findings: 59 issues detected

Severity Count
🔴 Critical 1
🟠 High 26
🟡 Medium 32

⚠️ Action Required: Critical security issues found!

View findings
[
  {
    "reason": "Issue in boj-build.yml",
    "type": "missing_timeout_minutes",
    "file": "boj-build.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in casket-pages.yml",
    "type": "missing_timeout_minutes",
    "file": "casket-pages.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in casket-pages.yml",
    "type": "missing_timeout_minutes",
    "file": "casket-pages.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in codeql.yml",
    "type": "missing_timeout_minutes",
    "file": "codeql.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in dogfood-gate.yml",
    "type": "missing_timeout_minutes",
    "file": "dogfood-gate.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in dogfood-gate.yml",
    "type": "missing_timeout_minutes",
    "file": "dogfood-gate.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in dogfood-gate.yml",
    "type": "missing_timeout_minutes",
    "file": "dogfood-gate.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in dogfood-gate.yml",
    "type": "missing_timeout_minutes",
    "file": "dogfood-gate.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in dogfood-gate.yml",
    "type": "missing_timeout_minutes",
    "file": "dogfood-gate.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Issue in hypatia-scan.yml",
    "type": "missing_timeout_minutes",
    "file": "hypatia-scan.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium"
  }
]

Powered by Hypatia Neurosymbolic CI/CD Intelligence

@hyperpolymath
hyperpolymath marked this pull request as ready for review July 3, 2026 02:02
@hyperpolymath
hyperpolymath merged commit 24a8d6c into main Jul 3, 2026
22 of 24 checks passed
@hyperpolymath
hyperpolymath deleted the claude/project-scope-planning-5zoaze branch July 3, 2026 02:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants