14 Commits
Author SHA1 Message Date
hh b415b17007 docs(readme,preview): screenshots of both tabs, a calendar scene on the busiest month 2026-09-05 04:56:17 +02:00
hh fa36710f0c fix(view,ui): follow the keyboard through the navbar hiding behind it
The panel drifted while the keyboard came up and then slid under it at the
end. Two reasons, both about the ground moving twice: iOS animates the
keyboard, and once it is up Obsidian hides its own navbar - a second move that
the old four-frame watch had already stopped waiting for, and that a trigger
arriving mid-watch was dropped for instead of restarting it.

The watch now runs until the reading holds still for twelve frames, a fresh
trigger restarts it, and Obsidian's Capacitor keyboard events (`keyboardWill/
DidShow`, `...Hide`) are listened to as well - they fire around the animation
that `visualViewport` does not always report, and never fire on the desktop.
2026-09-05 01:14:54 +02:00
hh f980abcc1d fix(view,place): the boards view pads clear of the phone's navbar
The panel had an inset for this; the calendar never did. Its root filled the
leaf, and Obsidian's phone navbar floats over a leaf rather than shortening
it, so the scroll container ran to the bottom of the screen and the last row
of the list sat under the bar - unreachable.

`lib/inset.ts` is the same pure measurement the panel plugin grew, with the
same tests: the deeper of navbar and keyboard, never their sum, and a bar that
sits beside the view covers nothing of it. The view re-measures by frame until
it holds still and writes `--bcal-inset-bottom`.

`viewport()` subtracts the bar too, so anchored panels and the quick look are
placed against what is actually reachable instead of ending under it.
2026-09-05 01:05:14 +02:00
hh f7ccd21d7b fix(ui,preview): panels chase the keyboard by frame, and the preview is finally mobile
The panel measured itself once, a fixed delay into the keyboard's animation,
so it landed against a viewport that was still moving - and in a sidedock
drawer no resize event fires at all, so it never moved. It now re-places every
frame until its own position holds still, which needs neither a duration to
guess nor an event to wait for. Its input taking focus is another trigger:
that is what opens the keyboard in the first place.

The preview had no viewport meta, so a 390px window still laid out at 980px:
every "mobile" screenshot was a desktop one at a phone's aspect, and
coarse-pointer rules could not apply. Which is why the tap targets looked
fine here and were not.
2026-09-05 00:47:21 +02:00
hh b70331f7bd fix(ui): panels stay above the keyboard, the day two offers share is listed once
The date field would not open at all on some days: on a Friday "Friday" and
"In a week" resolve to the same day, and the option list was keyed by the day
it writes, so Svelte tore it down with each_key_duplicate. On a desktop this
took the whole view with it - the same bug, not two. Duplicate offers are
dropped (the more specific name wins) and the list is keyed by position, so
no caller can tear it down that way again.

Panels are placed against the visual viewport rather than the window, which
a phone's keyboard shrinks without resizing anything: they scroll inside what
is left, re-place as the keyboard animates in, and come back into view when
the keyboard covers the very row they hang off - visible beats staying next
to the anchor. The quick look centres the same way.

Its actions are thumb-sized where the pointer is coarse, with the keycaps
hidden - there is no keyboard to press them on - and it gains "no date" and a
close button, since a phone has no Escape. Both menus gain a plain "Edit"
beside "Edit in Tasks"; it was only ever reachable by pressing e.
2026-09-05 00:22:07 +02:00
hh 9c0e57e29b feat(archive): completed cards move to a mirror of the boards folder
"Archive completed tasks" empties every board of what is finished into a
twin of the boards folder - `Boards/work.md` into `Boards/archive/work.md` -
itself a Kanban board with the same lanes, so the history opens like any
other board and the live one stays short. The same pass lifts a board's
native archive (everything below the `***` separator) into that mirror, so
finished work is not left sitting in two places.

Archived tasks render beside live ones when "Include the archive" and "Show
completed" are both on, from the mirrors and from any `***` section still in
a board. They carry an Archive badge instead of a project chip, ride with
the sphere they came from in the rail, and refuse drops.
2026-09-05 00:21:36 +02:00
hh 0cc4655f9f fix(ui): read panel keys at window capture so tasks cannot eat tab 2026-09-01 00:11:09 +02:00
hh d692dff19a fix(css): scope the subject compound so theme-dark rules keep matching 2026-08-29 19:50:01 +02:00
hh 4f485b0bc4 fix(css): leave tailwind theme vars on :root so obsidian's accent wins inside the view 2026-08-29 19:42:54 +02:00
hh 8c971e431a fix(css,preview): scope utilities under the view root, preview with real boards and foreign css 2026-08-29 19:39:19 +02:00
hh 0a7742eb5e feat(ui,store): live today clock, rail as lane filter, b toggle, quick look on space 2026-08-23 16:44:57 +02:00
hh 83ca32d98e feat(*): one task editor, vim navigation and undo 2026-08-15 03:13:50 +02:00
hh 0873cbb366 fix(ui): portal menus to body above the sidedocks 2026-08-09 21:20:01 +02:00
hh 8a609da778 feat: init 2026-08-08 16:30:22 +02:00