A local-first note taking app

Add Playwright e2e tests for the editor behaviour vitest cannot reach master

The vitest suite runs `environment: 'node'` and collects `*.test.ts` only, so nothing depending on layout, geometry or CodeMirror's DOM is testable — and that is precisely where this editor's bugs have been landing. Scroll restoration silently recorded `scrollTop` 0; the heading scroll was dropped because it was dispatched before the view had height; the completion popup's font and footer took three rounds of blind CSS. All four shipped green. Ten tests driving the real app: scroll and cursor restored across a tab switch, `[[Note#Heading]]` putting that heading at the top of the viewport, and the completion popup's note names, heading options with level badges, same-document `[[#`, alias dismissal, and the footer. Two of them assert the exact things that were wrong rather than merely that the feature works: the option list's computed `font-family` is not monospace (CM's base theme hardcodes it and our override lost on specificity twice), and the footer's rendered geometry is below the list (CM re-appends the `<ul>` after it on every update, so only flex `order` keeps it last). The scroll test was verified by reintroducing the passive-effect capture and watching it fail. Four things the harness has to do, each of which failed confusingly first: - `ELECTRON_RUN_AS_NODE` is stripped from the child env. Some tool environments export it; it makes Electron run as plain Node, so `require('electron').app` is undefined and Chromium switches are rejected as bad options. - The app window is found by skipping `devtools://` pages, since `src/main.ts` opens DevTools unconditionally and `firstWindow()` often returns it — quietly sending `localStorage` writes to the wrong origin. - DevTools is closed and the window resized, because CodeMirror renders only its visible viewport, so a sliver of a window makes most of a document genuinely absent from the DOM. - Teardown races `close()` against a short timeout and then SIGKILLs the process. On macOS the app deliberately outlives its last window, so `close()` waits on something that never exits; that surfaced as "Worker teardown timeout" against whichever test ran first and read as random flakiness elsewhere. Asking the app to quit politely was not enough — it made things worse. Five consecutive full runs now pass 10/10 in ~8.7s. Vaults are seeded straight into `localStorage` and the window reloaded rather than driven through the vault-manager UI, and `TEXTILE_USER_DATA` — a hook `src/main.ts` already provides for exactly this — isolates each run's state. Also fixes the production renderer build, which was broken on main and blocked this entirely: `vite-plugin-top-level-await` emits code esbuild cannot downlevel to Vite's default browser target, failing every `package`/`make` with "Transforming destructuring to the configured target environment is not supported yet". The renderer only runs in Electron's Chromium, so the target is now `esnext`. Dev was unaffected, which is why it went unnoticed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>