Skip to content

Release 1.1.52 (versionCode 55) - #145

Merged
adibhanna merged 14 commits into
mainfrom
release/1.1.52
Nov 2, 2026
Merged

adibhanna merged 14 commits into
mainfrom
release/1.1.52

Conversation

@adibhanna

Copy link
Copy Markdown
Contributor

ZenNotes for Android 1.1.52 (versionCode 55) on core 2.81.0. The AAB is built from the version commit 27a598c.

  • Core 2.81.0 (014bbac, refreshed to the shipping build in d4c08f7): core-2.81.0-core.h4e6a38a3361b4748 from ZenNotes/zennotes bfab9fdc (the v2.81.0 tag), provenance checked by core:adopt. From core: recurring tasks (Repeat…, Skip this time) and Remind… (the desktop app delivers reminders, so Settings shows no reminder section on a phone), New Kanban, Kanban column colors, folder fields that list the vault's folders, tight list Enter that ends a list with a blank line, Back from a task's note returning to Tasks, no keyboard cursor, key hints or lit menu rows on a phone, hover styles only where a pointer can hover, and a database that cannot open saying so once.
  • Shell, from the 2.81.0 walks:
    • 8eff8f1 New Kanban in the New sheet; 55bdcff New Kanban in a folder's sheet in the drawer (core's createBrowseKanban).
    • 0bbf53e a long-pressed Board card no longer stays dimmed.
    • cbd0086 the Tasks board's Move to… sheet names columns as their headers do, once each.
    • c0fa8f3 the calendar's arrows move a week in Week mode.
    • 8477af6 a Settings field the keyboard covers in part comes up above it; the editor's own reveal is untouched (#891).
    • 666c55b system Back closes the menu, sheet or prompt on top.
    • e6b2041 a tablet's formatting toolbar sits on the keyboard, not above it.
    • e0f09d5 a database deleted outside the app closes its tab instead of stacking toasts.
    • dca89c7 the database Table keeps long names clear of the hover Open and its select column at 40 px.
    • df1d830 a record page opened from the Table's page glyph opens to read, keyboard down (read-open.ts, byte-identical with the iPhone shell's).
  • Version (27a598c): 1.1.52, versionCode 55.

Validation: npm ci, npm run upstream (boundaries, typecheck), 495 tests. Release builds were walked on an Android 17 emulator (dark mode, generic data) on the candidate cores and again on the shipping core, recording ten clips (docs/releases/v1.1.52/media/android-*.mp4, local): recurring tasks, Skip and Remind, New Kanban from the New sheet and a folder, column colors, the folder picker, lists, the Week arrows, system Back, and the deleted-database fix. The final check on the shipping core: lists end with a blank line and the next sentence is its own paragraph in Read mode; no tint stays under a finger; hover-only controls show; menus open with no row lit; a deleted database closes its tab without toasts; the Table keeps long titles and its select boxes clear, and its page glyph opens the record.

…colors and the folder picker

Core 2.81.0 (core-2.81.0-core.h0aaaccaf974a3d72, from ZenNotes/zennotes
bcce61e1) brings recurring tasks (@repeat, Repeat… and Skip this time),
New Kanban, Kanban column colors, folder fields that list the vault's
folders, tight list Enter, Back from a task's note returning to Tasks, and
no keyboard cursor, key hints or reminder settings on a phone. Reminders
fire from the desktop app; a phone writes @remind and shows the bell.
Core 2.81 gives every folder a Kanban board of its own (ZenNotes/zennotes
#1038): New Kanban writes a database seeded with a To do, Doing and Done
Status and opens it on its Board. On desktop it lives on a folder's
right-click menu, in the palette and on Space k. The phone's palette
already lists it, but the New… sheet is where a phone creates things,
and it offered only New database, whose board needs its columns built by
hand.

The sheet now has a New Kanban row right after New database. It runs the
same core command (database.new.kanban), so the board lands where new
databases go (Settings, Vault, Notes), as on desktop with no sidebar
folder under the cursor. The row reuses the shell's two-column tabs glyph
rather than adding an icon. The iPhone shell gets the same row, worded the
same.

Tests: the row sits between New database and New folder and runs that
command, and the adopted core registers it as New Kanban.
Walking core 2.81's database Board on the emulator: long-press a card,
and its new card menu opens (Open page, Move to Doing, Move to Done,
Delete card). Pick a move, or dismiss the menu, and the card stayed at
half opacity, as if still being dragged, until another card was
long-pressed.

Chromium starts an HTML5 drag from a long-press on a draggable element.
The shell has cancelled that drag on phones since cards and task rows
became draggable (a phantom drop over the editor tripped its file-drop
alert), but with preventDefault alone: the cancelled dragstart still
reached app-core, and DatabaseBoardView marks the card it hears about as
the one being dragged until a dragend that a cancelled drag never fires.
Before 2.81 a long-press on a Board card did nothing else, so nobody
looked; now it is the way to reach the card's menu.

The capture listener now stops the event as well, on phones only, so
app-core never hears of a drag that is not happening. Tablets keep native
drag and drop. The Tasks board drags by pointer events, not dragstart, so
its cards and move handles are untouched.

Tests: the listener cancels and stops dragstart at phone width, and the
core Board markup it guards (the dim on dragstart, the reset on dragend).
Walking the Tasks board on core 2.81: a card's move handle opened a Move
to… sheet listing "undated" and "in-progress" between Today and Waiting.
The sheet named columns from its own map of status ids, which knew Today,
Upcoming, Waiting and Done but not the No due date and In progress
columns core has since added, so those fell through to their raw ids. A
column the user renamed showed its old name, and with lanes on every
column was listed twice, once for its header and once per lane cell,
since all of them carry the column's id.

The sheet now takes each column's title from the column header core
draws (its label, a rename included) and keeps the id map only for a
header that shows no title, mid-rename. Each column is offered once.

Tests: the sheet prefers the header's title, lists a column id once, and
the core markup it reads (the header marker, its title, the lane cells).
Walking core 2.81 on the emulator: the Tasks calendar in Week mode showed
the week of Oct 26, and a tap on the next arrow showed the week of Nov 30.
The shell's Week scope hides all but one row of core's six-row month grid,
but the arrows above it are core's month arrows, so each tap went a month
on, landed on the same day of the next month, and the shell then showed
that day's week. A month of tasks went by unseen between two taps.

In Week mode the shell now takes the arrows' taps before core does and
picks the day a week before or after the selected one, the way a tap on
that day would: core selects it and, for a day of another month, turns
the grid to that month. A week past either end of the grid (Sep 7 from
Aug 31, Oct 25 from Nov 1) comes in with core's own month arrow first,
then its day is picked. Month mode keeps core's month arrows untouched.
In Week mode the arrows are labelled Previous week and Next week for a
screen reader, since core titles them by the month.

Nothing in core changes: the shell drives the grid through the day cells
and the arrows core draws.

Tests: days counted across months, years and daylight saving; a step
inside the grid picks the day, one past either end brings in the month;
the shell stops core's arrow click only in Week mode; and the core markup
it drives (the toolbar, both arrows, a day cell's select and month follow).
…ove it

Walking core 2.81 on the emulator: Settings > Tasks opens with the folder
board's "Group by the folders inside" field at 559 px, and the keyboard's
top lands at 578. A tap on the field left its lower half under the
keyboard's suggestion strip, typing included, and its folder list flipped
up over the section above. Phones resize the WebView for the keyboard, and
Chromium then scrolls a focused field into view, but only one the keyboard
covers completely (the Task folders field further down came up fine). A
field it covers in part stays where it is. The iPhone walk found the same
fields hidden there.

Once the keyboard has landed (or the viewport shrinks), a focused field
outside the note that does not show in full inside a box that scrolls it
is now centred in what shows of that box, where Chromium puts the fields it
does reveal. Core's folder list places itself from its field on scroll, so
it comes along. A field tapped while the keyboard is already up needs
nothing more: Chromium scrolls a field it focuses into view.

The note's editor is left alone: its caret keeps its own reveal, which must
never fight a reader's scroll (zennotes#891), and the editor's search panel
sits inside .cm-editor too. This is installed on phones only: a tablet
reveals a focused field on its own.

Tests: the board root field ends centred above the keyboard; a field
already in view, the keyboard leaving and a focused note scroll nothing;
only fields the keyboard types into count; and the shell installs it on
phones only, next to the editor's own reveal.
Core 2.81 gives a folder a Kanban board of its own (ZenNotes/zennotes
#1038), and on desktop that lives on the folder's right-click menu: the
board lands in that folder. The phone had only the New sheet's New Kanban,
which puts a board where new databases go (Settings, Vault), so a board
for Projects meant making one and moving it.

A long-press on a folder in the drawer now offers New Kanban, after Open as
Gallery. It runs core's new createBrowseKanban with that folder, on the
workspace the sheet was opened in, so "Untitled Kanban.base" is written in
the folder and opens on its Board with To do, Doing and Done. The row
carries the New sheet's glyph and wording, and shows for folders only, not
for a database's own sheet. Core refuses a folder inside a database, which
the drawer never lists.

Tests: the row sits between Open as Gallery and Rename for folders, with
the New sheet's glyph; it creates through createBrowseKanban on the sheet's
host and folder; and the adopted core exports that create, placing the
board in the folder it is given and refusing one inside a database.
Walking core 2.81's long-press card menu on a database Board: Back did
nothing, however many times it was pressed, and the menu stayed open over
the board. The same held for the drawer's folder sheet and sort menu, the
note sheet a long-press opens, and a prompt such as New folder, Rename or
Move: Back hid the keyboard, then did nothing more.

The Back cascade closed the layers above the page by sending Escape to the
window. Nested editors, palettes and dialogs listen there, but core's
context menu listens on itself, where it keeps the focus, and a prompt
turns the dialog's window Escape off and cancels on one in its field. The
shell's own sheets have no Escape at all. Nothing heard the press.

Back's Escape for the top-most menu or modal now starts at the focused
element inside it (else the layer itself) and bubbles out to the window,
which still hears anything no layer handled, so palettes, nested editors
and dialogs close as before. The note sheet, the drawer's folder sheet and
its sort menu close through zn:android-back, before the drawer under them,
like the FAB dial and the Move to... sheet already did.

Tests: the Escape starts at the focus inside the layer, else at the layer,
else at the window, and bubbles; the cascade sends it from the top-most
menu and modal; the shell sheets close on zn:android-back; and where core
listens (the menu on itself, dialogs at the window, a prompt in its field).
…above it

Checking the Settings keyboard fix on the tablet layout (800 x 1280 CSS px,
API 37): with the keyboard up, the editor's formatting toolbar floated in
the middle of the screen, 328 px above the keyboard, with blank note
between them.

wireKeyboard asks tablets not to resize the WebView for the keyboard and
lifts the toolbar by --zn-kb-height in CSS instead. Capacitor's Android
Keyboard plugin never honours that request (setResizeMode is unimplemented
on Android), and SystemBars shrinks the WebView for the keyboard on every
device, so the toolbar rose twice: once with the viewport, once by the
lift. The note's bottom padding grew by the same lift.

The lift is now only the part of the keyboard the viewport has not already
given up (keyboard-lift.ts): none where the WebView shrank for all of it,
which is what the tablet does, and the whole keyboard where it kept its
height. The keyboard-down height is remembered per viewport width, so a
resize that lands before the keyboard's event, or a rotation under the
keyboard, is not taken for it. Phones never read the lift and are
unchanged: their toolbar still docks at the keyboard's top.

The Settings field reveal (992accd) took the same claim on trust, that
tablets keep the keyboard over an unshrunk WebView; its notes now say the
WebView shrinks everywhere, and that it stays on phones because a tablet's
Settings dialog brought a part-covered field above the keyboard on its own.

Tests: the walk's tablet numbers give no lift, a WebView that keeps its
height gets the whole keyboard, an early resize and rotations stay docked,
main.tsx feeds the lift from every keyboard event and resize, only the two
tablet rules read it, and the plugin's Android resize mode is a no-op.
… toast storm

The release walk of 1.1.52: a Kanban board open in a tab, its folder then
deleted outside the app (a file manager, sync from another device, another
app on the vault), and the app relaunched. 1,089 "Database not found"
toasts stacked over the screen, and the dead tab came back on every launch.

The bridge contract answers null for a database that is not there, as
desktop's main process does, and core then forgets the database and closes
its tab. The shell passed the shared database ops' openDatabase straight
through, and that throws "Database not found: <path>" instead. Core showed
the error as a toast, and its grid, still without a database, asked again
on its next render, so every pass added another toast.

openDatabase now answers null for exactly that error (database-open.ts).
Every other failure, a file that cannot be read or a schema that cannot be
parsed, still throws and still reaches the toast, as it should.

Verified on the release build: relaunching with the dead tab active shows
no toast and lands on the next tab; a board deleted while the app was in
the background is gone on return, with no toast.

Tests: a missing database answers null, a found one passes through and any
other error still throws; the bridge hands core the wrapped call; and the
contract on both sides (the shared ops' throw, core forgetting on null and
toasting a throw, the bridge type allowing null).
…uch screens lose the sticky tint

Core core-2.81.0-core.h4e6a38a3361b4748, built from ZenNotes/zennotes
bfab9fdc, the v2.81.0 tag. Since the candidate this branch adopted first:
ending a list leaves a blank line, so the next text is a paragraph of its
own; a database that cannot open says so once with Try again instead of
asking again on every render; menus open with no row lit; and hover styles
apply only where a pointer can hover, so a tap no longer leaves a tint,
while the controls that appear on hover show all the time on a phone.

The database-open contract test reads core's new failure path: the error
still toasts once, and core now records it (databasesLoadError).
…oxes clear

Core 2.81.0 shows hover-only controls on a screen that cannot hover. Two of
them crowded the database Table on a phone (both phones' final checks of
the 2.81.0 tag): the row's Open, a hover shortcut laid over the end of the
name cell, hid the end of every long name, and the select column, its box
now always shown, shrank to 18 px against the screen's edge once a long
title widened the Table.

The phone drops that Open (the page glyph left of the name opens the page)
and keeps the select column at 40 px. Core takes the same Open away on its
own in the next release; this holds the phones until then.
…board down

The database Table's page glyph, left of a row's name, is the phone's way
into a record page (the hover Open is hidden on phones). The page opened
with the caret in its frontmatter, so the keyboard came up and its first
Back only lowered it: leaving took two (the Android check of 2.81.0). A
tap on that glyph now opens to read, as a note from a Kanban card does.
read-open.ts stays byte-identical across the two shells.
@adibhanna
adibhanna merged commit 3f67077 into main Nov 2, 2026
2 checks passed
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.

1 participant