`, etc.) so the bundled `@chordsketch/react/styles.css` lights up unchanged. See [ADR-0017](https://github.com/koedame/chordsketch/blob/main/docs/adr/0017-react-renders-from-ast.md) for the architectural split. `format="text"` renders the plain-text chords-above-lyrics output inside a `
`; pick that variant if you need an
even-more-conservative preview that avoids the JSX walker
entirely.
**Trust boundary note.** The walker enforces the same URI-scheme
blocklist (`javascript:`, `vbscript:`, `data:`, `file:`,
`blob:`) `chordsketch-render-html` applies, so image directives
with dangerous schemes drop out of the output the same way they
do on the static-HTML side. Delegate sections (`{start_of_abc}`,
`{start_of_ly}`, `{start_of_musicxml}`, `{start_of_textblock}`)
are tracked as a follow-up — the walker currently ignores their
bodies rather than rendering them. If you accept untrusted
ChordPro and need full delegate-section rendering today, drive
the static `chordsketch-render-html` output yourself and embed
it in your own iframe.
Errors are surfaced via an inline `role="alert"` above the
render by default. Pass `errorFallback={(err) => }` to
customise — any ReactNode works under both `format` values
because the error lives in a sibling element of the rendered
output. `errorFallback={null}` hides errors entirely and lets
the stale previous render stay visible.
### `useChordRender` — hook for bespoke renderers
```tsx
import { useChordRender } from '@chordsketch/react';
const { output, loading, error } = useChordRender(source, 'html', {
transpose: 2,
});
```
Same render pipeline as `` but exposed as raw state —
wire the output into a custom container (e.g. a diff view, a
multi-pane preview). The renderer is memoised against
`(source, format, transpose, config)`, so re-renders with
unchanged inputs do not re-parse.
### `` — split-pane textarea + live preview (Tier 1 atom)
```tsx
import { ChordTextarea, useTranspose } from '@chordsketch/react';
export function Editor() {
const { value: transpose, setValue: setTranspose } = useTranspose();
return (
);
}
```
The left pane is a plain `