hide-scroll held overflow-y: hidden for the length of the open
animation, so a drawer whose content overflows gained its scrollbar only
afterwards and its content narrowed by the scrollbar width and rewrapped
(864 to 847 px in User Settings).
It covered the scrollbar flashing while the height grew from zero. Since
drawers now lay out at their final size and reveal with clip-path, the
scrollbar is in place from the first frame and is revealed with the rest.
Drawers animated height from 0 to calc-size(auto, size). WebKit has no
calc-size(), so under allow-discrete the height switched at the halfway
point: a 12 px strip for 125 ms, then a jump to full height, and the
reverse on close. This affects macOS, iOS and Linux; upstream
SillyTavern has the same rule.
Top-level drawers now lay out at their final size and transition
clip-path from inset(0 0 100% 0) to inset(0), so opening and closing run
the full duration in every engine, whatever the content height or a
theme's max-height, without relayout per frame. Floating panels keep
upstream's height transition. The assistant drawer's size no longer
depends on openDrawer, so it holds while closing.
The host registered an insets animation callback and resized the WebView
on every onProgress frame, so each keyboard show or hide relaid out the
page 7-19 times and fell behind the finger (#330).
Android already dispatches the keyboard's target insets once when the
animation starts. Follow onApplyWindowInsets only and let the keyboard
slide over a settled page. Without a callback the platform also keeps
the layout unchanged while a predictive-back gesture drags the keyboard,
commits once on release, and leaves it untouched on cancel. Chromium
still scrolls a focused field into view after the single resize.
On an API 36 emulator every transition now takes one resize, and style
plus layout work drops from 20-75 ms to 3-7 ms on a 20-message chat.
The same rule now holds on all three platforms: iOS holds the WebView
height during the dismiss drag, and ArkWeb's RESIZE_CONTENT already
resizes once per docked transition.
Refs #330
Hide WebKit's form accessory bar and let UIKit's interactive dismissal
own the gesture. A full-window KeyboardScrollView inside WindowHost is
the pan surface: it has no content, recognizes alongside WebKit's
overflow scroll views, never cancels page touches, and keeps a zero
content offset because an empty bounce makes WebKit recompute visible
geometry every frame. The WebView stays constrained to the host's safe
area and keyboard guides.
The accessory bar also caused the two-stage dismissal: keyboardLayoutGuide
tracks the union of bar and keyboard, and the bar leaves about 400 ms
after the keyboard. Without it the guide returns to the safe area in one
animation.
While the pan is active the WebView height is held. iOS WebKit treats
every view-height change as a stylesheet-environment change and rebuilds
all styles (WebPage::viewportConfigurationChanged ->
updateSizeForCSSDefaultViewportUnits -> didChangeStyleSheetEnvironment),
about 30 ms per step on an iPhone 13. Like Safari, the page relayouts
once when the keyboard settles while the keyboard itself follows the
finger.
Choose status and navigation bar icon brightness from the host
backdrop behind each bar: the strip's average color composited over
the backdrop color, or the color alone. The renderer reports each
strip's edge and premultiplied average, and each native owner
re-evaluates when the color or strips change.
- Android drops its per-frame PixelCopy sampler and defaults new
installs to non-immersive; saved preferences are unchanged.
- iOS sets the style through TaoUIViewController's
preferredStatusBarStyle.
- OpenHarmony sets status and three-button navigation colors in one
partial system bar update.
Bring OpenHarmony onto the contract Android and iOS already follow.
ArkUI lays the Web out in the safe area, ArkWeb's RESIZE_CONTENT
shrinks the layout viewport by the docked keyboard's overlap, and an
app-owned window-layout plugin publishes window snapshots and draws
wallpaper strips behind the system bars.
- Share the window-layout plugin transport between Android and OHOS.
- Drop the remaining OHOS branches in Rust and the frontend.
- Rotate with the sensor, within the system rotation lock.
The ability and plugins-workspace pins point at the Darkatse forks
until LeenHawk/openharmony-ability#1 and LeenHawk/plugins-workspace#1
merge.
Consume system bars, cutouts and docked keyboards in Android and iOS,
then let web content use the resulting viewport. Publish window wallpaper
strips through one shared background path.
Remove the old CSS and IME compensation layers, update layout ABI v2,
and keep the matching documentation and behavior tests together.
Derive platform and shell kind in Rust and inject them before WebView scripts.
Replace frontend UA guesses and pass host facts and IPC budgets to adapters.
Keep chat width in the frontend, preserve iOS policy initialization, and
restore the mobile third-party resource limit. Align docs and test fixtures.