Tags: robinslange/fathom
Tags
desktop: harden selection popover + cap reading measure + broaden exi…
…t-event hook
- Selection popover: cache anchor on the store so tier-switch retry doesn't
depend on window.getSelection still being live; dismiss the popover on a
collapsed-selection click in a paragraph; bias placement into the gutter
beside the selection (right gutter → left gutter → above → below) so the
popover never covers the source text; drop the bottom caret tail (it
pointed at the popover edge, not the selection).
- Faithfulness chip: plain-English headline ("Stays close to the source" /
"May drift from the source") instead of raw NLI numbers; the support /
contradiction / threshold numbers + uncalibrated-NLI caveat move into
the i-metadata panel for users who want the technical view. Chip
rectangle (4px radius), single row when there are no introductions,
expansion stays inside the silhouette.
- Reader measure: cap the reading column at 680px (~65ch) and centre it
in the viewport. The gutters either side become space the popover
occupies; long-form prose now reads at the typographic sweet spot
regardless of window width.
- Pagination: scrollWidth-based pageCount uses ceil + trailing-gap
subtraction (was round + raw scrollWidth); ResizeObserver replaces the
self-referential $state loop on viewport size.
- Tauri exit hook: also catch WindowEvent::CloseRequested and
RunEvent::Exit alongside ExitRequested, so libc::_exit(0) wins the race
against C++ static destructors regardless of which event fires first
on the user's Tauri version. The Cmd+Q "closed unexpectedly" dialog
was back; this should re-close it for good.
desktop: floating SelectionPopover + CSS-column pagination + client s… …entence-snap Replaces the right-side ParaphrasePane with a SelectionPopover that anchors to the live selection rect, flips above/below based on viewport room, and clamps to the viewport edges with a caret tail pointing at the selection. App grid drops the 24rem third column; the popover lives outside the grid as a portal. Reader pagination swaps fixed 8-paragraphs-per-page for CSS-column flow: column-width = viewport width, column-gap = 64px gutter, pageCount = scrollWidth / columnStride measured on every resize and book-change tick. scroll-to-chunk now resolves via the chunk element's offsetLeft / columnStride. This closes the "dynamic viewport-fit pagination" follow-up from project_fathom — chapter- divider pages no longer waste 70% of the viewport. New snap-sentence.ts mirrors the backend's UAX#29 sentence snap on the client via Intl.Segmenter, so the visible selection grows to match what's actually about to get paraphrased. The user sees the snap happen instead of dragging "Athe" and getting a paraphrase of the whole sentence with no visual feedback. Net diff: -717 / +796 lines. pagination.ts + pagination.test.ts deleted (CSS columns own page math now). use-paraphrase grows popover-open/close state + selectionRect tracking. use-library grows setPageCount / setPage / pendingScrollChunk for the new pagination model.
ci: date-based v* tags on every push to main + commit-list changelog Every push to main now cuts a v<YYYY>.<MM>.<DD>.<N> tag where <N> is the push-of-the-day index, and uploads the macOS bundle to both the new dated release AND the rolling 'latest' release. Both releases get a body that lists the commit subjects since the prior dated tag, so a visitor can see what's actually in the build without comparing SHAs. This fixes the "release page says 3 days ago but the artefact is brand new" confusion: the dated tag carries the real publish time, and the rolling release's body is rewritten on every push so it never goes stale. GitHub's sidebar 'Latest release' will follow the newest dated v* tag (action-gh-release default behaviour); the rolling release stays a prerelease so it doesn't compete for that slot. Dropped the v* tag-trigger from `on:` because the dated-tag publish step creates tags via the GitHub API and re-subscribing would risk double-builds on every push.
ci: publish rolling `latest` prerelease from main pushes Release workflow only fired on v* tags, and no tags existed, so the README's "Download from Releases" link pointed at an empty page. Now main pushes build the macOS bundle and publish/replace a prerelease at tag `latest`; v* tags continue to publish versioned releases. README points users at the rolling build's stable URL. CI's redundant bundle build now runs only on PRs to avoid double-building every main push.