Skip to main content

Supported HTML

Block tags

p, div, h1 to h6, ul, ol, li, pre, blockquote, hr, table, thead, tbody, tfoot, tr, th, td, caption, and details with summary.

Tables support colspan. rowspan is not supported yet, see Limitations.

Inline tags

span, strong and b, em and i, u, s, del and strike, ins, mark, small, code, a, br, img.

Interactive: details and summary

<details> and <summary> form a working disclosure widget. Tapping the summary row expands or collapses the content, with a ▸ or ▾ marker, accessibilityRole="button" and the expanded state exposed to assistive technology. The open attribute sets the initial state.

Configure it through renderersProps.details:

  • initialOpen starts the widget expanded.
  • markerTextStyle styles the marker.
  • onToggle(open, attribs) observes changes.

A customRenderers.details entry still takes over entirely, as for any tag.

Full documents

Complete documents work too. Literal <html> and <body> tags render as plain block containers. <head>, <title>, <style>, <script>, <link>, <meta> and <base> are ignored by default. Extend that list with the ignoredDomTags prop.

Media

<video> and <audio> render their fallback content as blocks and expose all attributes to custom renderers. For native playback add the video plugin.

Images

Images wider than contentWidth scale down proportionally. Use renderersProps.img.initialDimensions to reserve space before the image has loaded.

Entity-encoded input

HTML that arrives encoded, such as &lt;p&gt;hello&lt;/p&gt; from a CMS or API, is detected and decoded before parsing. Double-encoded input is handled as well. No pre-processing is needed on your side.

Your own tags

To give a custom tag block semantics, default styles or void behaviour, define it with customHTMLElementModels. See Custom rendering.