The textarea sits above the highlight overlay in paint order (same stacking
context, later in DOM). With bg-slate-950 on the textarea, its opaque
background painted over the overlay's light text — every code field (Python
Transform's script, any format:"code" or expression field) rendered as an
apparently-empty black box.
Swap: bg-slate-950 moves onto the overlay; the textarea becomes bg-transparent
and keeps its border, caret, and selection styling.
Every action/terminal node's config string fields are now run through
TemplateEngine.Render before the node sees them, so operators can pull
values from the incoming item into any config field.
- {input}, {input.a.b}, {input.tags[0]}, {input["weird.key"]}
- {{ / }} escape to literal braces
- Missing paths / null input → empty string (no 500s on absent query params)
- Unrecognised / malformed placeholders pass through so typos are visible
- Strings render raw; numbers/bools stringified; objects/arrays compact JSON
Interpolation runs executor-side (Executor.RunNodeAsync walks ConfigJson
and rewrites string leaves), so every node opts in for free. 20 new tests
(17 TemplateEngine + 2 Executor + 1 end-to-end webhook→WebResponse).