[UnigramDev/Unigram/develop](https://github.com/UnigramDev/Unigram/tree/develop) • [39ce27d](https://github.com/UnigramDev/Unigram/commit/39ce27d7b6aafb9f8d49a776e4f9f433f0670a34) • _1 files, +13/-3_
Never lay out the incoming page from the navigated handler

Writing a scroll mode on a scroller that is already laid out reconfigures its
manipulation, and that runs a layout pass over the whole tree. The incoming page
is the frame content by then but NavigateToAsync has not activated it, so
ChatView was arranged without a view model: it threw, and the exception unwound
the navigation before anything could be activated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[UnigramDev/Unigram/develop](https://github.com/UnigramDev/Unigram/tree/develop) • [4878bfb](https://github.com/UnigramDev/Unigram/commit/4878bfbf83b26fe04ded1a9d6213b66ac59fee4c) • _2 files, +371/-52_
Match Chrome's back gesture, in distance and in affordance

The pan commits at 30% of the display's larger edge rather than at a fixed 120,
which is what makes the distance feel the same whatever the window size, and the
first 60 DIPs only recognise the gesture. The chip is Chrome's: a 20-radius
circle over a ripple that grows to 40 and bursts to 48 on commit, travelling 146
with 72 of rubber band past it, inverting to the accent as it activates, and
retreating over a duration proportional to how far it came.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[UnigramDev/Unigram/develop](https://github.com/UnigramDev/Unigram/tree/develop) • [4a16484](https://github.com/UnigramDev/Unigram/commit/4a16484fd2230ab08338d0e2e5673fc232c2185a) • _2 files, +63/-4_
Size and load the chat search autocomplete from its own collection

The list is handed an empty collection that fills asynchronously, so a null
check on the source never saw a row: it now follows CollectionChanged too, and
starts the first page itself, since a collapsed list is never measured and its
panel never asks. Member rows are 44, not the 64 a ChatCell declares.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[UnigramDev/Unigram/develop](https://github.com/UnigramDev/Unigram/tree/develop) • [a156a68](https://github.com/UnigramDev/Unigram/commit/a156a68311513dd3a330d168694652d9edc06d32) • _3 files, +101/-23_
Snap a word or paragraph to the line the pointer is on

A paragraph break takes no rendered unit, so the end of a line and the start of
the next share an index: expanding from it always resolved to the following
paragraph, and a double tap on an empty line selected the next line's first
word. Hit-testing now reports which paragraph the point landed in, and reports
none for an empty line, where there is nothing to expand to.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[UnigramDev/Unigram/develop](https://github.com/UnigramDev/Unigram/tree/develop) • [9147943](https://github.com/UnigramDev/Unigram/commit/9147943dcef32ecbf5d066d5489d803860ffef86) • _1 files, +61/-9_
Show a hand cursor over an inline button

The I-beam was driven for anything that isn't a hyperlink, buttons included,
and a disabled button takes no pointer input at all, so the pointer fell
through to the text behind it: its wrapper now carries a transparent
background, and the negative margin with it, to cover what the button paints.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[#unigram](?q=%23unigram)