- The ResizeObserver callback measured the panel and resized the node
synchronously, which forces a layout while the stylesheet may still be
applying; WebKit then reports "ResizeObserver loop completed with
undelivered notifications" as a page error, and the browser fixture
fails any test with a page error (CI WebKit job on PR #108).
- The callback now only schedules a single-flight requestAnimationFrame
that measures and refits, so no observed box changes during delivery.
- Reproduced in the pinned Playwright WebKit image: the picker tests pass
48/48 (16 tests × 3) with this change.
- New nodes started at a fixed 340×600, so one-entry size lists left a
large empty area between the list and the Swap button.
- The panel now reports its measured content height as both the minimum
and maximum DOM-widget height, and the extension sets the node height to
the host's computeSize() after every render, keeping the width.
- Hidden or detached panels are not measured, the first measurement is
retried for a few frames, and a ResizeObserver on the panel children
refits when the stylesheet arrives after the first render (the coverage
run exposed that race; a held-stylesheet regression test pins it).
- Workflows load at their saved width and are re-fitted on load; the spec
and docs describe the new sizing rule.
- table validation accepts sides 64..8192, matching the widget min/max
- parse_size_label (Python and JS) caps digits and rejects out-of-range
sizes so create() falls back to width/height instead of overflowing
- family_labels() and the combo default now read the merged table, so an
appended family is selectable and a removed one is not offered
- an alias used as the override default is normalised to its label
- the frontend rebuilds the model options from the payload and keeps a
saved family that is no longer listed so old workflows still show it
- describe the families.json schema and the user override file with a full example
- document the warnings behaviour and resolution dropdown precedence
- add the dropdown sync rule to web/ui/README.md
- Set resolution to custom whenever the panel has no selection (wired,
failed, non-finite or loading) so a stale label cannot override width/height.
- Compute label megapixels with 1 MP = 1,048,576 px, matching the panel
header, with half-up rounding so Python and JS labels agree on ties.
- Add a native resolution COMBO (shipped sizes only) so a size can be picked
and saved in the workflow without the panel; custom or unparseable labels
fall back to width/height on both sides.
- Mirror the dropdown with the chips: options follow the active chip, the
value tracks the current size, and picking a label writes width/height.
- Draw a decorative ratio shape on each ratio chip and show the first
families warning in the status line.
- VALIDATE_INPUTS lets unknown family labels reach create()
- no size is listed under two chips; SD 1.5 3:4 gets true 3:4 sizes
- model change before the families payload loads is applied on load
- custom ratio: clear error on chip click, cap sides at 8192, accept X
- real-host assertions for model change and wired-in state
- add README tools row, section and status row
- add ui-migration row and web/ui README section
- add per-node doc with family table and manual GPU check
- restore keyboard focus to the equivalent button after each render
- keep the accent background when hovering a pressed chip or size
- refresh the panel when input links change
- treat a size listed in the clicked chip as a no-op
- add resolution picker view with chip grid, size list and custom ratio input
- add extension that projects native widgets and writes sizes via callbacks
- add browser tests for rendering, theming, idempotent mount and disposal
- Treat a missing preset widget like preset value 'custom' in swapDimensions
- Keep every preset access behind the custom check
- Add a test that swaps width and height directly on a preset-less node