for website). Tooltips on hover show label + shortcut. SVGs are inline in src/canvas/icons.tsx, using currentColor so
they inherit the text color.
Embed website — new WebCard kind:
- Click the globe → prompt() for URL (auto-prepends https:// if missing).
- Card layout: header (title or hostname) → URL bar (monospace, Enter to navigate, Esc to cancel) → iframe sandboxed
with allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox.
- Right-click the header to rename. Sites with X-Frame-Options: DENY won't render — that's the iframe-route caveat I
mentioned; we can upgrade to a real Tauri Webview later if too many sites are blocked.
Shortcuts — all gated on !isInEditable(activeElement) so they don't fire while typing in CodeMirror, an input, or
xterm:
- Ctrl/Cmd+D — duplicate the top-z card (terminals get a fresh shell, same position+28px, same title)
- Ctrl/Cmd+N — new note
- Ctrl/Cmd+T — new terminal
- Delete / Backspace — close the top-z card
"Top-z card" = the one most recently clicked or just created, which matches the "click to focus" model we already
have. To duplicate a terminal: click its header to focus, then Ctrl+D — xterm itself doesn't get the keystroke because
the header isn't an editable target.
in a single board.json under app_data_dir() (~/.local/share/{appName}/board.json on Linux).
Write pattern: tmp file + atomic rename, debounced 400ms. A crash mid-write can't corrupt the existing file; worst
case you lose ~400ms of recent edits.
Read pattern: load on app start, gate the Canvas render on the result. Missing file → default welcome board. Parse
error → log and fall back to default (won't overwrite the bad file until the user makes changes; actually it will save
over it after the next change — if you want to preserve a corrupt file for recovery that's a one-line tweak).
Terminal caveat: live PTY processes die with the app session, so sanitize() in App.tsx clears every terminal card's
ptyId on load. Each terminal card respawns a fresh shell on mount via the existing pty.spawn path. The card's
position, size, and title are preserved.