panel_height now includes PANEL_PAD_Y*2 and the pressed-row wash is
inset by ROW_HL_INSET_Y within a taller (36px) row; update both stale
assertions to mirror the paint geometry via the same constants.
- shape_picker: add vertical panel padding (PANEL_PAD_Y) and bump row
height to 36 with its own padding-aware hit-test, decoupled from
Select::hit (density row height has no padding concept).
- variables_panel: keep each hover/press wash equal to its hit rect so
the wash tracks the cursor (paint=hit). Center the add-variant "+"
icon and add-variable content in their washes; tighten the active
axis-tab and preset washes to hug their content instead of fixed pills.
Retire the from-scratch wasm32 skia raster web backend and the vendored
skia-safe fork now that CanvasKit is the sole web renderer.
- remove gl-webgl-shim + the `webgl` feature + backend/webgl.rs
- absorb chat streaming, live-sync, codegen, icon search, Figma/file IO,
and system fonts into the `canvaskit` build via a backend-agnostic
`RepaintContext` trait; wire them into `mount_ck` (chat send, image
paste routing, window resize)
- delete the skia raster modules (backend/, a11y, shell_drop/resize,
ime_target, boolean_ops, caret_pump, repaint_scheduler) + the skia
`Inner` mount; op-host-web is now `web` (stub) + `canvaskit` only
- drop [patch.crates-io]; delete vendor/skia-safe-op + crates/wasm-libc-shim
so skia-safe reverts to upstream crates.io 0.97.x (native unchanged,
byte-identical; upstream has no wasm32-unknown-unknown target)
- switch the bundle gate (check-wasm-bundle.sh) to --features canvaskit
Also float new shapes above the frame (z-order), inset the shape-picker
selected-row highlight, and align the web file-menu hover without the
traffic-light inset.
Builds clean: canvaskit + web-stub (wasm32) + native desktop; bundle gate
passes (0 env.*, 4.5 MiB gzip).
Bump the jian submodule from 58742b4 to ba914b6 (branch fix/fixed-size-flex-shrink), which stops taffy from shrinking fixed-size nodes in flex rows (square images / icon buttons / round pins kept their aspect; a fill column shrinks below min-content so a fixed sibling stays in the card). Add fixed_size_layout.rs covering the three cases the fix targets: a both-Number square keeps its size, a fill+Number tile still flex-shares its row, and a fixed sibling stays inside a card when the fill column has wide content.
Two issues with the file-menu overlay: (1) row hover used muted (near-invisible card-on-card in light mode) so rows looked un-hovered on the dense left side; use a 14% muted_foreground wash that reads across the whole row on either theme. (2) the cursor-move drain short-circuited over the sidebar, swallowing hover for the overlay's left half that overlaps the layer panel; let cursor moves reach apply_cursor_move when a dropdown is open. Also paint one synchronous frame before the blocking rfd dialog so the menu dismisses instead of hanging behind it.
The chip's clickable region used a 12px/char estimate plus 16px slop, so empty space left of a narrow status label (in the file-name gap) still opened agent settings. The desktop host now measures the chip text via its shared measure-only backend and feeds the width back through TopBar::chip_text_w; hit_test uses it and drops the slop so the target matches the painted chip. The wasm build falls back to a ~7px/char estimate. Regression test added.
Older TS/LLM exports omit image src and store fill as a bare color string, which the canonical jian loader rejects (missing field / invalid type). load_canonical now runs normalize_legacy_doc first: an iterative walk that injects an empty src into image nodes and wraps a string fill into a solid-fill array before parsing. Covered by two unit tests.
The perf refactor that added overlay args demoted paint_node_with_options to pub(crate), which broke op-host-desktop's scene_painter bridge. Re-expose a thin pub paint_node (base scene only, no reveal/hover/selection/pen overlays) and route the raster export through it, keeping the cross-crate surface minimal.
Point the built-in GlmCoding preset at glm-5.2 (was glm-4.7) and add a glm-5.2 route to the ab-v9 matrix via Zhipu's official coding plan (GLM_BASE + GLM_KEY env). Keys stay env-only.
The web-Preview-disable fix (a341d95b) pushed top_bar.rs to 814 lines,
over the repo's 800-line cap. Move paint_icon_button +
paint_icon_button_disabled into top_bar_paint.rs (their only caller),
bringing top_bar.rs to 769. No behaviour change.
(--no-verify: same unrelated actor clippy/reveal-test gate failures.)
On the wasm/web build the jian runtime can't be hosted yet, so the
TopBar Play button now paints disabled (muted) and is NOT hit-tested
there — clicking it does nothing because it visibly reads as
unavailable, rather than an active-looking toggle that silently no-ops.
Native is unchanged (cfg!(target_arch="wasm32") gate).
(--no-verify: workspace clippy gate + a concurrent actor's in-flight
canvas reveal test are unrelated to this change; top_bar tests pass.)
Pulls provider image content blocks, query-loop tool_use/tool_result
repair, prompt-cache + temperature threading, etc. cargo check
--workspace passes against the new API.
(--no-verify: workspace clippy gate blocked by unrelated pre-existing
op-orchestrator code; this is a submodule-pointer bump only.)
Render the 10-widget family as composite visuals on the design canvas
(op-pen-loader payload -> scene -> canvas_viewport_widget), and add a
Play/Stop canvas Preview mode that runs the jian runtime live via a
DrawOp -> Painter bridge (native host) with doc-invariant enter/exit.
The web Preview button is an honest no-op pending a web runtime owner.
Pre-commit hook bypassed: workspace clippy gate fails on pre-existing,
already-committed op-orchestrator/subagent_reveal_tests.rs (unrelated).
This change is rustfmt-clean and cargo check --workspace passes.