Editing
Text
The core loop: double-click copy in the page, type a new value, commit. nextcanvas rewrites the matching JSX text in your source file.
How to edit
- Make sure the toolbar is on and Buttons is off(edit mode). Clicks on the page won't navigate or fire app handlers.
- Hover text — editable elements get an outline.
- Double-click to enter edit mode. The caret lands in the text.
- Type your change. Press Enter to save, or Escape to cancel. Clicking outside also commits.
What counts as editable text
Plain static text
A host element whose children are literal text — the classic case:
<h1>Generative AI rewires innovation</h1>
<p>Where operators get good at the pipeline.</p>Double-click the rendered headline or paragraph. The matching string in the .tsx file updates in place, formatting preserved.
Mixed text + inline elements
Text that wraps bold, links, or other inline tags is editable too — you edit the surrounding runs; the inline elements stay locked:
<p>
Still unsure?{" "}
<a href="#register">reserve your seat</a>.
</p>- You can change "Still unsure?" and the trailing period.
- You cannot delete the
<a>or empty an entire text run — the edit is rejected and reverted with a toast.
Text inside components
Copy wrapped in a plain component tag is editable when it's literal text (or supported bound text) as the children:
<Reveal as="h2">Who you'll hear from:</Reveal>
<Link href="/chat">Talk to an AI partner</Link>You edit what you see on the page. The write-back still targets the original JSX in your source — even if the component doesn't forward props.
Motion / animated tags
Elements like <motion.h1>, <motion.p>, and <motion.a> are editable the same way as plain h1 / p / a. Hero copy that lives on Motion tags is fair game.
Shared source, many instances
If the same JSX line renders many times (for example a card title inside a .map), editing one instance rewrites that shared source line — so every instance updates. That's intentional: there's only one string in the file.
What won't open an editor
- Text mixed with an expression in the same parent:
© 2026 {SITE.name} - Purely dynamic runtime strings (countdown digits, form errors, chat bubbles)
- Namespaced or deeply nested member tags beyond simple
motion.*
For data-driven single-expression children like {speaker.name}, see Bound text.