Add ArticleShare in a dedicated @sonordev/press-kit/articles/share client entry: native title/URL sharing, copy confirmation and a selectable-link fallback. Keep article content on the server and omit the controls from private previews.
The docs now describe Sonor's article sanitizer as live, since 2026-10-20. The article HTML a site receives from Sonor's public reads has already been cleaned by an allowlist, and the README and the content_html type notes no longer say it's pending.
Render an article's content_html and nothing else. content is the source text and Sonor doesn't sanitize it, so the stock Article, the RSS feed and the Atom feed no longer fall back to it when content_html is blank: the body is empty instead.
Article no longer converts content_html from Markdown. The body is the HTML Sonor sent.
Remove the marked dependency.
Heading anchors, the table of contents, addExternalLinkTargets and wrapArticleTables now find tags the same way, and a > inside a quoted attribute value stays inside its tag. Before, the first three ended a tag at that >, which could turn the rest of the attribute's text into live markup. Output for ordinary article HTML is unchanged. A link written inside an HTML comment is no longer rewritten, and a heading written inside one gets no anchor or table-of-contents entry either.
Tags are found the way the HTML tokenizer finds them, in every transform that reads them. A quote opens an attribute value only right after =: a stray quote in an attribute name or an unquoted value no longer pairs with another one, and a tag that never closes is left alone along with all the text after it, because a browser reads that text as part of the tag. Before, an unclosed or stray quote could make a heading anchor, an external link or a table wrapper write its own quote into text a browser still treated as attribute data, which turned the rest of that text into live markup. Comments close at -->, --!>, <!--> and <!--->, and <!x>, <?x> and </ x> end at the first >. The table labels read captions and column headers with the same tag finder. Output for ordinary article HTML is unchanged.
Heading anchors and the table of contents read the body once. A body with thousands of unclosed headings used to take seconds to scan, once for the anchors and again for the contents, and now takes milliseconds.
The text of an RSS description or an Atom summary made from the article body holds no < or >. A bracket left over once the tags are gone is written as < or >, so a reader that renders the description as HTML shows it as text.
Escape the featured image URL in the RSS <enclosure>. A URL with a query string such as ?w=800&h=600 no longer makes the feed malformed XML.
The TableOfContents component reads headings with the same scan as the table of contents Article builds on the server, so the two can't list different headings. It had its own pattern, which skipped a heading whose title held a quoted > before its id and one whose id was single-quoted or unquoted. It now also lists a heading that has no id, linking to the slug of its text, so the page needs those ids; the stock Article adds them. Its client bundle grows by about 430 B gzipped, so the articles entry's size budget baseline moves from 13,280 B to 13,640 B to keep the headroom it had.
The table of contents links a heading that has its own id to that id. It used to link to the slug of the heading's text, so <h2 id="pricing">Costs</h2> got a link to nothing. A heading that only mentions id inside another attribute (data-id="x", title="see id=x") now gets an anchor like any other heading.
Extract the established publication and newsletter components, article data helpers, routing, metadata, author/cluster pages, feeds and news sitemap from Site Kit into one canonical Press Kit implementation.
Preserve server/client boundaries, shared runtime authentication and multi-site routing.
Include strategic article photo placement and artwork helpers from Site Kit 8.2. Site Kit 8.3 retains compatible article imports built from the same source.