+ {/*
+ * aria-busy on the chart region tells AT the area is being updated (arch §10.2;
+ * spec §04). The overlay is a non-blocking sibling inside the relative-positioned
+ * body; it never covers the header or editor, so editing stays fully interactive.
+ */}
+
{/* Frame is React-owned and carries the fit-sizing class; the inner host
is owned by vega-embed (it brands it `.vega-embed` and mutates its
classList at runtime), so its className stays static and React never
@@ -234,6 +275,18 @@ export function LivePreview() {
editor pane's role="alert" (one producer, two subscribers; doc §10.1),
so adding one here would double-announce it. */}
{error !== null &&
{error}}
+ {/*
+ * Busy overlay: non-blocking, overlays only the chart body, never the header
+ * or the editor (arch §10.2; spec §04/§10). Shown only after the ~1s threshold
+ * so sub-1s renders produce no flicker. The spinner animation is suppressed
+ * under prefers-reduced-motion (base.css *{animation-duration:0.01ms}).
+ */}
+ {busy && (
+
+
+ Rendering…
+
+ )}