Web source: crop capture to actual content bounds (anchor 0,0); slider click-to-position; web URI X clears; tab order

This commit is contained in:
2026-08-28 11:10:49 -07:00
parent 23874c2dd6
commit f39ebd96ce
6 changed files with 98 additions and 30 deletions
+15 -10
View File
@@ -917,17 +917,22 @@ capturing the primary display (which causes the infinity mirror effect).
8. ✅ Preview shows live web content (not just a blank rectangle)
9. ☐ Handle navigation errors, invalid URIs, timeout gracefully
**Rendering model (2026-08-28, stable-viewport + fill — the working invariant):**
**Rendering model (2026-08-28, stable viewport + content-bounds crop):**
the page renders ONCE at the size the element was created at (snapshot in `Register`, never
tracked) — so dragging the box never reflows the page, never truncates it, and scrollbars are
suppressed (`overflow:hidden` on html/body injection; background-transparent only otherwise,
no layout meddling). The captured texture is displayed with `Stretch="Fill"`, so any box the
user draws is covered edge-to-edge with zero dead space (OBS free-transform behavior:
browser renders at a fixed resolution, the scene-item scales the texture). The invariants:
the page viewport is stable; the display Fill-scales it to the box. Graceful-error handling
(item 9) is a follow-up. Attempts rejected for the record: fixed 1920×1080 + `Uniform`
(letterbox dead space), CSS margin/100% reset (enlarged the gap), viewport==box (page reflow
→ truncation/scrollbars/jank).
tracked) — dragging the box never reflows the page; scrollbars suppressed via
`overflow:hidden` html/body injection (background-transparent only otherwise). After each
navigation the manager queries the page's real content rect (`scrollWidth/scrollHeight` vs
`innerWidth/innerHeight`) and **crops the capture to the actual content bounds, anchored at
(0,0)** — widgets that don't fill their viewport no longer stretch dead space across the box.
`Stretch="Fill"` maps the cropped frame edge-to-edge (box is covered; the fill/adornment rect
snaps to it). Graceful-error handling (item 9) is a follow-up. Rejected for the record:
fixed-viewport 1920×1080 + `Uniform` (letterbox), CSS margin/100% reset (enlarged gaps),
viewport==box (page reflow → truncation/scrollbars).
**Properties panel (2026-08-28):** web URI ✓/✕ icon buttons are `IsTabStop="False"` so Tab flows
X→Y→W→H→URI; the ✕ button now clears the URI textbox (was reverting to the pre-accept snapshot).
Slider style gained `IsMoveToPointEnabled="True"` — click-anywhere-on-bar jumps the thumb to the
click (volume sliders keep their manual `SetSliderValueFromClick`, harmless duplication).
### Design decisions