User feedback on the schema-driven inspector (#71), with screenshots:
- Color arrays & fills:
colors arrays must render one color picker per entry (add/remove), not a raw JSON textarea; fill-type fields (string | gradient object) need a mode selector (Single / Linear / Radial) with per-stop pickers and angle.
- Effective defaults: unset properties must display the engine's effective default (weight → Regular·400, font-family → Inter placeholder), not empty controls.
- end_at UX: start_at/end_at grouped in a "Timing" section — "Visible from / until (s)", bounded by scene duration, placeholder "end of scene".
- Multiline strings:
code (and any string containing newlines) renders as a textarea, not a single-line input.
- Sync bug: gauge
show_value showed unchecked while the render displayed the value — raw-JSON display vs engine default. Fixed by the effective-value design below.
Frozen design for 2/5: display layer = typed round-trip of the selected element (serde_json::from_value::<Component> → to_value) so serde fills every default; controls show effective values (dimmed/"default" marker when absent from raw); writes keep targeting the raw document.
User feedback on the schema-driven inspector (#71), with screenshots:
colorsarrays must render one color picker per entry (add/remove), not a raw JSON textarea; fill-type fields (string | gradient object) need a mode selector (Single / Linear / Radial) with per-stop pickers and angle.code(and any string containing newlines) renders as a textarea, not a single-line input.show_valueshowed unchecked while the render displayed the value — raw-JSON display vs engine default. Fixed by the effective-value design below.Frozen design for 2/5: display layer = typed round-trip of the selected element (
serde_json::from_value::<Component>→to_value) so serde fills every default; controls show effective values (dimmed/"default" marker when absent from raw); writes keep targeting the raw document.