Repository navigation
Conversation
Edit-mode table cells are plain contenteditable fields inside an atomic block widget. Their keystrokes never become editor transactions, so the editor's [[ completion never saw a [[ typed in a cell, and links in tables had to be typed from memory. The cell now runs the same picker on its own text: the editor's ranking (shared as wikilinkCandidates), its item rendering and popup classes, and its keys. Arrows and Ctrl+J/K/N/P move, Enter or Ctrl+Y inserts, Tab keeps the caret inside the brackets, | starts the display text, and Escape only closes the popup, in Vim INSERT too. Inserts are the editor's edits measured on the cell string, so a #section or |alias in a closed link survives and assets become embeds; the widget commits them on blur like any typed cell edit. [[ inside inline code stays literal. Heading and block suggestions ([[note# and [[note^) stay editor-only.
…id#126) The pane header kept every folder crumb at full width and gave the note's title whatever space was left. On a phone, a note three or four folders deep got a title a few pixels wide, and tapping it opened an 88px rename field scrolled to the tail of the name, so the start of the name could not be read while renaming it. The title now outranks the folders. The crumbs share one group that gives way first, clipped at the vault end so the nearest folder stays beside the title, and the title truncates only once it alone fills the row. Each crumb carries its trailing space as padding instead of the row's flex gap, so spacing is unchanged when everything fits and a collapsed group leaves no gap behind. The rename field is as wide as the name (field-sizing), up to the whole row, and opens at the start of the name with all of it still selected. The same layout applies on desktop: in a narrow pane or a crowded header, a deep note now loses its outer folders before its title. A pane narrower than its toolbar still leaves no room for either; that is unchanged.
DarellYuhu keeps documentation where the same note name repeats across folders. Search notes (Mod+P) showed each result's title and its area in capitals, so five notes called Overview read as five identical INBOX rows and opening the right one meant guessing. The buffer switcher solved the same problem in #635 and the search palette was left out. A result now shows the folder its note lives in, the way the buffer switcher does: the title keeps its natural width, the folder takes the rest of the row, and a folder too long to fit loses its start rather than its end (dir="rtl" with an LRE/PDF embedding, so the path itself still reads left to right), keeping the part that tells the notes apart. A note at the vault root, where a root-mode vault keeps its notes, has no folder to show and keeps its area label. The folder comes from parentDirOf (manual-order.ts) instead of a third copy of the helper. Search itself is unchanged: it already matched on the path. The in-app manual's note search guide says so in one sentence. In the built app over CDP (isolated userData and config, a vault with six notes called Overview), Mod+P and "overview" listed every one with its folder: inbox, archive/2025/Atlas, inbox/Projects/Billing/docs, inbox/Projects/Atlas/docs and two client folders, the deepest shown as "...rporation International Holdings/onboarding/2026/q4/handover/weekly reviews". The two new palette tests and the updated row-text assertion fail on the old rows; the trash tests' row helper now reads the title span, since a row's text includes its folder. Typecheck 8/8, app-core 3,408 tests pass. The website docs mirror of that sentence is not in this change: its checkout holds other uncommitted docs work.
…llows zennotesandroid#128: on a Redmi 13C with a 368 MB vault kept in a Syncthing folder, New note and Quick took 12 to 15 seconds to open the note; tapping again meanwhile made four Quick notes. createAndOpen waited for a full refreshNotes before it opened anything, and on a phone that listing is one storage query per folder (two walks, notes and folders, while the create's own 'add' event starts a second refresh). newTaskFile waited for a full refreshTasks before "Task added", and the phone's task scan reads every note. createAndOpen now puts the created note in the list, sets the view and the title focus, opens the note, and refreshes after; the call still resolves once the listing has landed, so callers see the same state at the end as before. newTaskFile rescans only the new file when a task list is loaded. An empty list may never have been loaded, and Home and the calendar load the list only while it is empty, so a patched list of one task would stop them; that case loads the list whole in the background instead of before the toast. Desktop and web lists were fast enough that neither wait was felt there; nothing they show changes. The phone shell carries its own half (listings shared between overlapping walks, a per-note task cache) in zennotesandroid; this half needs no shell change and reaches the phones when they adopt this core. On an API 36 emulator over WebView CDP, Android 1.1.44 with both halves (a rehearsal core from this tree) and a 1,663-note, 175-folder vault opened through the folder picker: New note opens in 0.32 to 0.35 s (5.1 s on 1.1.44, 1.5 s with the shell half alone), Quick in 0.23 s, "Task added" after 0.26 s (13.4 s on 1.1.44); the Quick Notes list and Tasks show every note and task created. Three new store tests fail on the old code. Typecheck 8/8, app-core 3,397 tests pass.
The production dependency audit (npm audit --omit=dev --audit-level=high) has failed on main since 2.74.0's packaging commits: DOMPurify 3.4.14 falls under advisories published on 2026-10-22, a critical one for SAFE_FOR_TEMPLATES and a high one for IN_PLACE sanitizing, with three low ones beside them, all fixed in 3.4.17. ZenNotes uses neither mode nor the XHTML parser, and its one hook (uponSanitizeAttribute in app-core's markdown.ts) only drops attributes, so 2.74.0 was not exposed; the phone shells already ship 3.4.17. The package moves to its first fixed version and nothing else in the lockfile changes (every workspace range is ^3.3.4); the audit passes at its level. The remaining advisories (katex, fast-uri, hono, ip-address, smol-toml) are moderate or low and do not fail it.
What's New opens on the first launch after the update with three highlights. First, note search shows the folder each result lives in, so notes that share a name are easy to tell apart (#982). Second, typing [[ in a table cell in Edit mode opens the same note picker as in a paragraph (#977). Third, a note several folders deep keeps its title in a narrow pane's header and renames from the start of its name (zennotesandroid#126).
The Render tables in live preview entry of the manual lists what a table cell does in Edit mode; it now says that [[ in a cell opens the same note picker as in a paragraph, with the same keys, and that | starts the display text. The website docs carry the same sentence.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ZenNotes 2.75.0: desktop, server 2.75.0 with Docker, the boundary packages, the website release page, and both phones on core 2.75.0 (iPhone 1.31.0, Android 1.1.45, with their own #128 halves and Android's dotted-name fix).
Features
eb527d4d):SearchPaletterows showparentDirOf(n.path)in a left-truncatingdir="rtl"span, as the buffer switcher does since Prioritise Filenames In The Open Buffers Menu #635; a root note keeps its area label.890d4af4):cm-table-link-picker.tsruns the editor's[[picker on an Edit-mode table cell, with the editor's ranking, rendering and keys.Fixes
58615641):createAndOpenopens the note before re-listing the vault, andnewTaskFilerescans only the new file when a task list is loaded. On an Android emulator with a 1,700-note picked folder, with the shell's half: New note 5.1 s to 0.3 s, Task added 13.4 s to 0.3 s.b0aef0e7): the folder crumbs give way before the title; the rename field is as wide as the name.Also
dompurify3.4.17 for the advisories that failednpm auditat high since 2.74.0's packaging commits (9250282b, only that package moves in the lockfile); What's New 2.75.0 (11f6386f); version bump (a0670148); the manual's table entry names the[[picker (7e6506db).Gates on
7e6506db, in a clean worktree with its ownnpm ci: typecheck 8/8 uncached; shared-domain 2,054, app-core 3,411, desktop 1,190 and quicklook 15 uncached; fresh build:prod green;npm run pack(signed) and the packaged launch check pass (page target, rendered, 1.6 s, 2.75.0); vim-editor, sidebar-vim and editor-improvements pass on the first run.ci-sweep.py v2.74.0: one failed job, main's dependency audit, fixed by9250282b.hazard-scan.py --since v2.74.0: no hazards. dash-lint clean on the notes, the diff and every commit. Note search and the table picker were driven in the built app over CDP.