-
Live mode lands valid TSX through the wrap → preview → accept → carbonize loop on Vite/Next React/TSX projects. The wrapper now keeps a single JSX-slot child instead of three adjacent siblings, so it round-trips cleanly inside
return (...), array.map(...), andasChildparents like Radix's<DialogPrimitive.Title>. Carbonize stopped double-wrapping CSS in nested template literals on TSX targets, accept and discard restore the picked element at its original indent (with relative depth between lines preserved), and the screenshot overlay no longer flashes solid black on default-background pages. Closes #114, with thanks again to @dergachoff for the detailed bug report. -
Wrap correctly disambiguates repeated identical-class siblings. A list of
<Card className="card">rendered three times with the same classes used to land on the first one regardless of which the user picked.live-wrap.mjsnow accepts--text TEXT(the picked element'stextContent) and narrows candidates accordingly, falling back to first-match when the text is too short or doesn't appear literally in source (data-driven children like{title}), and erroring withelement_ambiguouswhen multiple branches still match equally. -
live-injectCSP-meta unwrap now byte-for-byte preserves self-closing tag whitespace. The patch+revert cycle on a<meta http-equiv="Content-Security-Policy" ... />tag was eating the space before/>via a double-space artifact in the marker insertion path; common Vite shapes that ship a CSP meta now round-trip cleanly. -
live.mdspec gained explicit guidance for three real authoring traps. Variant CSS must use a descendant combinator (:scope > .card, not bare:scope) or it lands on the wrapper instead of the picked element. JSX<style>bodies need{...}template-literal wrapping. Aborting an in-flight session useslive-poll --reply EVENT_ID error "msg", notlive-accept --discard; the latter only mutates source while the bar stays stuck on GENERATING dots forever.