# Changelog

## 1.4.0

- 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.

## 1.3.0

- 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 `&lt;` or `&gt;`, 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.

## 1.2.0

- Add an optional responsive image adapter to `insertArticlePhotos`, preserving approved metadata, exact placements and canonical source identity. Feeds keep portable original image URLs.
- Distinguish unavailable or incomplete topic-cluster reads from a valid empty list or confirmed detail 404.

## 1.1.0

- Distinguish unavailable article reads from confirmed 404s; never report a partial archive as complete.
- Add server-only revision-bound preview and immutable sent-issue archive helpers.
- Use representative images with actual dimensions for search metadata while retaining social cards.
- Improve mobile publication columns and newsletter loading, retry, and accepted-receipt states.
- Add reusable publication definitions and distinct starting designs.

## 1.0.0

- 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.
