Sinks the blink phase logic into vendor/jian (jian-core::anim) so any host can wire the same square-wave timing instead of reimplementing per-product. Both OpenPencil chrome and Zode TUI consume the same helpers. - vendor/jian bumped to head with new `jian_core::anim` module (blink_visible / next_blink_flip_ms, 9 unit tests) - ChatState: `caret_anchor_ms` resets on focus / keystroke / example fill so the caret reappears solid right after the user acts, not mid-fade - AIChatPlaceholder.now_ms threaded from host; paint computes caret visibility = focused && jian_core::anim::blink_visible - AIChatPlaceholder caret X uses RenderBackend::measure_text for pixel-accurate trailing edge (replaces the 7px / 13px guess per char that drifted on Roboto + Noto-CJK) - WidgetHostNative.set_now_ms / chat_focused / next_animation_ deadline_ms surface; runner refreshes from a single Instant anchor + sets ControlFlow::WaitUntil at the next blink flip - inspector_window: new_events handles ResumeTimeReached → request redraw so winit actually wakes for the next frame |
||
|---|---|---|
| .. | ||
| agent@62c4baddae | ||
| jian@36e2577c5f | ||
| skia-safe-op | ||