Skip to content

fix(deps): update dependency streamdown to v2 - #34

Closed
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/streamdown-2.x
Closed

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/streamdown-2.x

Conversation

@renovate

@renovate renovate Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
streamdown (source) ^1.6.9 → ^2.0.0 age confidence

Release Notes

vercel/streamdown (streamdown)

v2.7.1

Compare Source

Patch Changes
  • 4c55fad: fix(animate): split CJK text per character in sep: "word" mode so every character of a CJK paragraph animates as it streams in, instead of only the first batch

  • 32050fc: fix: export HighlightResult and HighlightToken types from the package entry

  • 976cf12: fix(translations): add Mermaid chart accessibility translations

    • Add Mermaid chart ARIA label translation
    • Add Mermaid rendering error translation
  • 70f6d07: docs(security): call out that remote images are allowed by default and document restricting image origins for AI chat apps

  • 2206c22: fix: resolve reference links whose definition is in another block

    Documents with link reference definitions ([label]: url) are now kept in a single block, the same way documents with footnotes are, so [text][label] resolves instead of rendering as raw text.

  • fea4ef5: fix: set data-* and aria-* props on the root element. They were only forwarded to the Markdown renderer and the blocks, so with the default renderer attributes such as data-testid or aria-busy reached no element.

  • f25e0ae: Avoid rendering and parsing mode="static" documents twice on mount

v2.7.0

Compare Source

Minor Changes
  • 6b14de4: Add a disableAutolinkProtocols prop to <Streamdown> for disabling GFM autolinking of specific URL protocols (e.g. mailto).

    <Streamdown disableAutolinkProtocols={["mailto"]}>
      {"Contact us at hello@example.com"}
    </Streamdown>

    Bare emails and bare URLs whose protocol matches the list (case-insensitive, "mailto" and "mailto:" are equivalent) are unwrapped back to plain text. Explicit markdown links ([text](url)) are left as links, including when the label reconstructs the URL (e.g. [foo@x.com](mailto:foo@x.com)). When the prop is omitted, autolinking behavior is completely unchanged.

    Closes #​607.

  • b1965bb: feat: add fallbackComponent prop for missing map entries / allowedTags

    Adds a new fallbackComponent prop to <Streamdown>. When provided, it is
    used as a fallback renderer for any HTML tag or allowed custom tag that does
    not have an explicit entry in the components map:

    <Streamdown
      allowedTags={{ mention: ["user_id"] }}
      fallbackComponent={({ node, children, ...props }) =>
        createElement(node!.tagName, props, children)
      }
    >
      {markdown}
    </Streamdown>

    fallbackComponent applies to custom tags declared via allowedTags (with no
    explicit component entry) and to standard HTML tags absent from the built-in
    component set (e.g. <span>, <em>, <div>, <br>). Built-in and explicit
    components entries always win — this is not a full unstyled mode.

    Refs #​543

Patch Changes
  • b651249: Give animated word spans a style object instead of a CSS string, so rendering skips parsing a style declaration for every word on every update. createAnimatePlugin still writes CSS strings.

  • b651249: Check whether a stream only appended text by comparing a slice of the new input with the previous one instead of calling startsWith, which compared the whole document character by character on every update.

  • b651249: Hide the caret after a table or an unfinished code fence by marking the last element instead of changing the container's class and style. Each toggle used to restyle the whole document, which cost tens of milliseconds per flip on long streams.

  • c971f42: Wire onCopy and onError through default code and Mermaid copy controls via controls.code.copy and controls.mermaid.copy.

  • 4ec5639: Bound the code highlight cache. Results of streaming code blocks are no longer cached (each is superseded by the next update), and finished code blocks are kept in a least-recently-used cache bounded by their size (tokens, lines and characters) and by a limit of 5,000 results. Lookups compare the full code, so blocks that differ only in the middle no longer share tokens. A code block also ignores highlight results for code it has already moved past.

  • 16e7e65: Export defaultComponents so custom components overrides can compose Streamdown's built-in renderers (styles, data-streamdown, link safety, code/mermaid/table behavior) instead of reimplementing them.

  • 163c63b: fix(code-block): use absolute positioning for action buttons to fix click events in nested scroll containers

    Switches the code block action button wrapper from position: sticky to
    position: absolute (with position: relative on the container) so that
    hit-testing works correctly in layouts with multiple nested overflow: auto
    scroll containers. Previously, the sticky + pointer-events-none/auto
    pattern caused browsers to mis-route click events to the code block wrapper
    rather than the buttons when the component was embedded in 2+ nested scroll
    containers.

  • e0ce123: Incomplete images during streaming now render a loading placeholder instead of being removed entirely. Incomplete images (e.g. ![alt](https://exampl) are replaced with ![alt](streamdown:incomplete-image) by remend, and the streamdown ImageComponent renders an animated skeleton for this special URL. This mirrors the existing behavior for incomplete links (streamdown:incomplete-link). The streamdown protocol is allowlisted for img[src] in the default sanitize schema so the sentinel survives rehype-sanitize + rehype-harden.

  • e7a23ef: Render Mermaid diagrams one at a time while their code fence streams, pausing after each render for as long as it took, so a growing diagram no longer holds up the stream. Once the fence closes or the stream stops, the final diagram renders without a pause.

  • b651249: Pin streaming code blocks and tables to the bottom once per frame instead of on every update, avoiding a forced layout per streamed chunk.

  • 5504e50: Preserve literal HTML tags and character entities when copying or downloading tables as Markdown.

  • 5b26c28: Speed up block parsing by lexing only block tokens and reusing already parsed blocks while a document streams.

  • 18dcb20: Add a top-level portal prop for configuring the container used by Mermaid fullscreen, table fullscreen, and the built-in link safety modal.

  • fdf4e33: Fix Mermaid diagrams so text is readable and diagrams auto-fit container.

    • Normalize SVG to remove responsive shrinking
    • Extract intrinsic size from viewBox
    • Add width-and-height auto-fit in PanZoom
    • Preserve user zoom/pan after initial fit
    • Add tests for SVG utilities and auto-fit behavior
  • 53812cf: fix: unwrap a single paragraph child inside list items

    Loose list items from the markdown pipeline are often wrapped in a <p>. MemoLi now detects that sole paragraph child (including the memoized paragraph component) and renders its contents directly, so list items stay visually tight. Also updates the list animation retrigger test to match the unwrapped markup.

    Fixes #​475

  • a155a9e: Update marked from ^17.0.1 to ^18.0.11.

    marked v18 no longer folds a block token's trailing blank line(s) into its own raw; that whitespace now surfaces as a separate space token immediately following the block (e.g. after html, heading, and table tokens). This changed the token stream shape that parseMarkdownIntoBlocks consumes, causing a dangling space token after a closed custom-tag HTML block to be emitted as its own standalone block. parseMarkdownIntoBlocks now folds a space token into the preceding block instead of pushing it as a new one, restoring v17-identical block boundaries and counts. The lossless token.raw concatenation invariant is preserved.

  • Updated dependencies [cf0ac1c]

  • Updated dependencies [e0ce123]

  • Updated dependencies [fdd1351]

    • remend@​1.4.0

v2.6.0

Compare Source

Minor Changes
  • 49bd143: fix(animate): serialize streaming animation across blocks

    Word stagger now runs on a shared wall-clock timeline so sibling sections no longer fade in on top of each other during streaming. Related cleanup: trailing spaces stay inside animated spans (no early link underlines), animate wrappers drop when streaming ends, already-seen text stays steady under StrictMode, and un-animated streaming is no longer deferred behind a starvable transition.

    Inspired by #​493, #​531, and #​536.

    Fixes #​482
    Fixes #​535
    Fixes #​550
    Fixes #​570

  • b734cbf: - Add custom download filenames for code, table, and mermaid via the controls prop

    • Configure downloads with download: { filename: "customName" } while keeping boolean true/false to show or hide
    • Preserve automatic file-extension mapping based on language or export format
    • Remove the codeDownload prop in favor of the unified controls API
  • 5faa6fa: Add codeBlockMaxHeight and tableMaxHeight props with streaming auto-scroll

  • 4436b56: - Add controls.table.csvSeparator ("," | ";" | "\t" | "auto") for table copy and download CSV

    • Reuse tableDataToCSV separator handling, including locale-aware "auto" mode
    • Improve CSV escaping to respect the selected separator for Excel compatibility
Patch Changes
  • 6ec3c48: fix(animate): animate inline code during streaming

    Skip the animate visitor on pre (and svg/math/annotation) only — not bare code. Fenced/highlighted blocks stay un-split via their pre ancestor; inline backtick spans now get the same per-word fade-in as surrounding prose.

    Fixes #​594

  • 725e390: Forward rest props through block code. The code component spread its rest props on the inline branch and dropped them on the block branch, so an attribute a consumer put on a fenced code element never reached the DOM. CodeBlockBody now takes part in that comparison, so a forwarded attribute updates instead of keeping the value it first rendered with.

  • 7e82400: Fix dir="auto" in static mode to detect text direction per semantic block (instead of once for the whole document), keep code LTR, and use content-majority direction for mixed-script prose.

  • fb5d7b9: Serialize Mermaid SVGs before download so HTML-style tags render as valid SVG markup.

  • fe38e75: Added accessibility improvements for code block controls by adding aria labels to copy/download buttons and announcing copy success state for screen readers.

  • b25dbdb: fix(custom-tags): render Markdown inside custom tags with multiline content

    Adds a preprocessing step (preprocessCustomTags) that normalizes multiline
    custom tags into a blank-line-sandwiched HTML block so CommonMark interrupts
    the raw-HTML block and parses the nested content as Markdown, with
    parseMarkdownIntoBlocks re-merging the interrupted open/content/close tokens
    so streaming still treats the whole custom tag as one block. Previously, when a
    custom tag contained multiline content (e.g. <ai-thinking> **bold**</ai-thinking>), CommonMark treated the block as raw HTML, stripping
    Markdown formatting. Tags listed in literalTagContent are excluded from
    re-parsing.

    Closes #​478

  • 26a8440: Fix doubled user-content- prefix on footnote ids

    Footnote list items were rendered with id="user-content-user-content-fn-1" because both remark-rehype and rehype-sanitize default their clobberPrefix to user-content-, so the prefix was applied twice. Disabled clobberPrefix on rehype-sanitize so remark-rehype remains the single, consistent prefixer of both footnote ids and backref hrefs — restoring working footnote navigation.

  • f7d1fb5: fix(table): add data-streamdown="table-wrapper" to fullscreen portal so copy/download dropdowns can find the table

  • f0a726b: Add aria-hidden="true" to decorative SVG icon components so screen readers rely on parent button labels instead of unlabeled icons.

  • 2ed2faa: Allow remend's streamdown: incomplete-link sentinel through the default sanitize schema so streamed incomplete links render as pending instead of harden [blocked].

  • 8fffa9d: Render the link safety modal through a portal to document.body so it is no longer nested inside the paragraph's <p> element. This fixes the React hydration error "In HTML, <div> cannot be a descendant of <p>" that occurred when a link with link safety enabled appeared inside a paragraph.

  • 2733922: fix(mermaid): add aria-hidden to decorative SVG icons in mermaid toolbar buttons

    Mermaid toolbar buttons (download, fullscreen, pan/zoom controls) already have
    accessible titles/labels, but the inline SVG icons were exposed to the accessibility
    tree causing "Content with images must be labeled" warnings. Added aria-hidden={true}
    to all decorative icon elements in download-button, fullscreen-button, and pan-zoom
    components.

    Fixes #​485

  • 8d36719: fix(deps): remove mermaid as a hard runtime dependency

    This patch replaces the type import with a local structural type for MermaidConfig so no type-level coupling to the mermaid package remains in the distributed typings. Users who want fully-typed mermaid config can still import type { MermaidConfig } from 'mermaid' themselves; the structural type is compatible.

    Fixes #​501

  • ea02609: Fix: shikiTheme prop priority chain is now fully reachable.

    Previously, shikiTheme had a default value in the props destructuring (= defaultShikiTheme), making the plugins?.code?.getThemes() fallback unreachable in both orderings. The fix removes the destructuring default and moves it to the end of the nullish coalescing chain, so all three levels are reachable:

    1. Explicit shikiTheme prop (highest priority)
    2. Code plugin's getThemes() (second priority)
    3. Built-in defaultShikiTheme (final fallback)
  • 9813dd6: Fix type declarations requiring a shiki install.

    BundledLanguage, BundledTheme, and ThemeRegistrationAny are now defined locally and re-exported from streamdown, so consumers can type-check without installing shiki. Runtime highlighting remains in @streamdown/code, which still depends on shiki.

  • d893759: Fix mermaid fullscreen overlay accessibility and add stable selector

    • Add data-streamdown="mermaid-fullscreen" to fullscreen overlay for stable CSS targeting
    • Update fullscreen overlay semantics to match table fullscreen behavior
    • Change role from button to dialog
    • Add aria-modal="true" for correct screen reader modal behavior
    • Improve accessibility consistency between mermaid and table fullscreen overlays
  • 79c8575: fix issue with list markers, task-list checkboxes, images, and hr animations

  • a1a7142: feat: add image control options (controls.image) to disable hover overlay and download button on images

    Add image to the controls prop, matching existing code, table, and mermaid patterns:

    • controls={{ image: false }} hides the hover overlay and download button
    • controls={{ image: { download: false } }} keeps the hover overlay but hides the download button
  • b250038: Fix accessibility warnings for Mermaid toolbar icon buttons:

    • Add aria-hidden="true" to all decorative SVG icons to hide them from screen readers
    • Add aria-label attributes to all icon-only buttons for proper screen reader announcements
    • Add translation keys (zoomIn, zoomOut, resetView) for zoom controls
  • 89c6877: Re-render memoized markdown components when their rendered output changes. The comparators compared source position, so a replacement of the same length — occupying the same lines and columns — was treated as unchanged and the component kept rendering the previous text.

  • e7bdf57: fix(mermaid): render the download and copy controls inside the Mermaid fullscreen portal so they're reachable when the diagram is expanded

  • 8f02c09: Fix table copy and download actions not working in fullscreen mode.

    • Support table lookup inside the fullscreen portal container.
    • Restore copy and download functionality for fullscreen tables.
    • Keep existing inline table controls behavior unchanged.
  • f46cd3c: - Fixed table copy losing line breaks inside cells containing <br> elements.

    • Preserved multiline content during table data extraction.
    • Improved copied Markdown, CSV, and TSV output consistency for multiline cells.
    • Added coverage for <br> handling in table extraction.
  • dc3f1d2: - Fix code block line wrapping when line numbers are disabled.

    • Ensure code block lines are rendered as block elements regardless of the lineNumbers setting.
    • Prevent multiple code lines from collapsing into a single visual line when lineNumbers={false}.
  • Updated dependencies [a99d675]

  • Updated dependencies [9f96409]

  • Updated dependencies [8093f2a]

  • Updated dependencies [57c3089]

    • remend@​1.3.1

v2.5.0

Compare Source

Minor Changes
  • d6666b6: Add lineNumbers prop to disable line numbers in code blocks
  • d4ec6c0: Add meta prop to CustomRendererProps. Custom renderers now receive the raw metastring from the code fence (everything after the language identifier, e.g. ```rust {1} title="foo" → meta = '{1} title="foo"'). The prop is optional (meta?: string) and is undefined when no metastring is present. Existing custom renderers are unaffected.
Patch Changes
  • ac8d839: Add staggered animation-delay to streaming word/character animations so new content cascades in sequentially instead of all animating simultaneously. Configurable via the new stagger option (default 40ms). Set stagger: 0 to restore the previous behavior.

  • add5374: Enable horizontal scrolling on code blocks so long lines are accessible instead of being clipped by overflow-hidden.

  • 75845c0: Fix unnecessary re-renders of code blocks during streaming updates.

    Problem: In streaming mode, when new content arrives (e.g. a paragraph is appended), completed code blocks that haven't changed were still re-rendering. This happened because the Streamdown component used inline object literals as default parameter values for linkSafety ({ enabled: true }). Every time children changed and Streamdown re-rendered, these inline defaults created new references, which caused the contextValue useMemo to recompute a new StreamdownContext object. Since React propagates context changes through memo boundaries, any context consumer inside a memoized Block (such as CodeBlock) would re-render even though the block's own props were unchanged.

    Fix: Extract the inline default values for linkSafety into module-level constants (defaultLinkSafetyConfig). This ensures referential stability across renders, so contextValue only recomputes when the actual values change — not just because children updated.

  • 8b1c262: fix: prepend UTF-8 BOM to CSV downloads for Excel compatibility

    • save() now prepends \uFEFF for text/csv string content so Excel on
      Windows detects UTF-8 encoding instead of falling back to ANSI.
    • TableDownloadButton refactored to use save() instead of inline Blob
      creation, ensuring the public API also gets the BOM fix.
  • b105c64: Fix custom tag content being prematurely split when content follows the opening tag on the same line and contains double newlines (\n\n). The preprocessor now ensures proper HTML block structure so the parser treats the entire tag as a single unit.

  • 9e6f991: Increase dropdown z-index for table copy and download menus to prevent clipping by surrounding elements.

  • 9c18748: docs: document required CSS custom properties (shadcn/ui design tokens) in README

  • 7b62e9a: Replace Tailwind v4-only *:last: and *:first: variant syntax with [&>*:last-child]: and [&>*:first-child]: arbitrary variants for compatibility with both Tailwind CSS v3 and v4. Fixes caret rendering on every line instead of only the last child in v3.

  • Updated dependencies [e50b0c4]

  • Updated dependencies [716a5f0]

    • remend@​1.3.0

v2.4.0

Compare Source

Minor Changes
  • 5edff75: Clarified Tailwind @source configuration for Streamdown and optional plugins.
    Updated documentation to keep the global @source for core streamdown only, move plugin @source guidance to plugin docs with examples, and add a caveat to include plugin entries only if installed.

  • 57cd3b5: Add support for custom starting line numbers in code blocks via the startLine meta option.

    Code blocks can now specify a starting line number in the meta string:

    ```js startLine=10
    const x = 1;
    ```

    This renders line numbers beginning at 10 instead of the default 1. The feature works by parsing the startLine=N value from the fenced-code meta string and applying counter-reset: line N-1 to the <code> element.

  • 57cd3b5: Add support for customizing icons via the icons prop on <Streamdown>.

    Users can override any subset of the built-in icons (copy, download, zoom, etc.) by passing a Partial<IconMap>:

    import { Streamdown, type IconMap } from "streamdown";
    
    <Streamdown icons={{ CheckIcon: MyCheckIcon }}>{content}</Streamdown>;

    Unspecified icons fall back to defaults.

  • 01d27e9: Add support for custom Shiki themes via a themes option on createCodePlugin, accepting a [light, dark] pair of bundled theme names or full theme registration objects.

  • 2cf559d: Add a virtual inlineCode key to the components prop, allowing inline code spans to be styled independently from fenced code blocks without manually detecting block vs. inline context.

  • 27c7b03: Export table action components (TableCopyDropdown, TableDownloadButton, TableDownloadDropdown) and utilities (extractTableDataFromElement, tableDataToCSV, tableDataToTSV, tableDataToMarkdown, escapeMarkdownTableCell, TableData), enabling custom table overrides to preserve copy/download interactivity.

  • fb76275: Add a fullscreen overlay for tables with Escape/backdrop-click to close and scroll locking, controlled via controls.table.fullscreen. Copy and download controls remain available in the fullscreen view.

  • b392fbe: Add literalTagContent prop that accepts an array of custom HTML tag names (e.g. ['mention']) whose children should be treated as plain text, escaping markdown metacharacters so user-supplied labels aren't interpreted as formatting.

  • c4c86fa: Add a dir prop that accepts "ltr", "rtl", or "auto". When set to "auto", each block's text direction is detected by scanning for the first strong Unicode character (Arabic, Hebrew, Thaana, etc.).

  • 00872f0: Add a prefix prop that prepends a namespace to all generated Tailwind utility classes (e.g. flex becomes tw:flex), enabling Tailwind v4's prefix() feature for projects that need to avoid class name collisions.

  • 401b901: Add support for custom renderers via plugins.renderers, allowing fenced code blocks with specific languages to be rendered by a custom component instead of the default CodeBlock.

Patch Changes
  • f398611: Add onAnimationStart and onAnimationEnd callback props that fire when streaming animation begins and completes, useful for coordinating UI state with the animation lifecycle.

  • f2a7e51: Fix empty lines in syntax-highlighted code blocks collapsing into nothing by rendering a newline character for empty token rows, preserving whitespace when copying.

  • 9ba8511: fix: prevent ordered list animation retrigger during streaming

    When streaming content contains multiple ordered (or unordered) lists,
    the Marked lexer merges them into a single block. As each new item appears
    the block is re-processed through the rehype pipeline, re-creating all
    data-sd-animate spans. This caused already-visible characters to re-run
    their CSS entry animation.

    Two changes address the root cause:

    1. Per-block prevContentLength tracking – each Block component
      now keeps a useRef with the content length from its previous render.
      Before each render the animatePlugin.setPrevContentLength(n) method is
      called so the rehype plugin can detect which text-node positions were
      already rendered. Characters whose cumulative hast-text offset falls below
      the previous raw-content length receive --sd-duration:0ms, making them
      appear in their final state instantly rather than re-animating.

    2. Stable animatePlugin reference – the animatePlugin useMemo
      now uses value-based dependency comparison instead of reference equality
      for the animated option object. This prevents the plugin from being
      recreated on every parent re-render when the user passes an inline object
      literal (e.g. animated={{ animation: 'fadeIn' }}). A stable reference
      is required because the rehype processor cache uses the function name as
      its key and always returns the first cached closure; only the original
      config object is ever read by the processor.

  • 781178b: Add a granular controls prop that accepts a boolean to toggle all controls or an object with per-feature flags (code, table, mermaid) for fine-grained control over copy, download, fullscreen, and pan/zoom buttons.

  • e129f09: Add a translations prop for overriding all user-facing UI strings (copy/download button labels, modal text, image alt text, etc.), enabling full i18n support.

  • Updated dependencies [a725579]

    • remend@​1.2.2

v2.3.0

Compare Source

Minor Changes
  • 3657e42: Add useIsCodeFenceIncomplete hook for detecting incomplete code fences during streaming

    Custom components can now detect when the code fence in their block is still being streamed. This is useful for deferring expensive renders (syntax highlighting, Mermaid diagrams) until the code block is complete.

    import { useIsCodeFenceIncomplete } from "streamdown";
    
    const MyCodeBlock = ({ children }) => {
      const isIncomplete = useIsCodeFenceIncomplete();
    
      if (isIncomplete) {
        return <div>Loading code...</div>;
      }
    
      return (
        <pre>
          <code>{children}</code>
        </pre>
      );
    };

    The hook returns true when:

    • Streaming is active (isAnimating={true})
    • The component is in the last block being streamed
    • That block has an unclosed code fence

    The default code block component now uses this hook to set a data-incomplete attribute when incomplete, enabling CSS-based loading states.

  • 32fb079: fix: hide download button on broken images and display a custom "Image not available" message instead

  • d73d7bb: Make the action buttons in code block header sticky.
    Ensures copy buttons remain accessible for long code blocks.
    Improves usability when viewing large snippets.

  • 15645da: Move code block lazy loading to the highlighting layer so block shells render immediately with plain text content before syntax colors resolve. This improves visual stability and removes the spinner fallback for standard code blocks.

Patch Changes
  • 0987479: fix: codeblock highlight flicker while streaming
  • 5d438ca: Add support for copying table data as Markdown in TableCopyDropdown.
    Introduces a Markdown copy option alongside existing formats.
    Allows users to quickly copy tables in valid Markdown format.
  • ce9b4c2: Fix syntax highlighting
  • ba03332: Redesign Mermaid diagram
  • 6e91867: fix nested same-tag HTML block parsing in parseMarkdownIntoBlocks
  • 7f9127b: Add normalizeHtmlIndentation prop to prevent indented HTML tags from being treated as code blocks
  • fdef60d: Bump rehype-harden to fix "can't access property "type", node is undefined"
  • 1abbf1e: Redesign table
  • fb9f97c: handle custom tags with blank lines in content
  • Updated dependencies [6374fbf]
    • remend@​1.2.1

v2.2.0

Compare Source

Minor Changes
  • c1e1e66: Bake animate into streamdown as built-in animated prop
Patch Changes
  • d5fe6d6: fix: properly handle HTML void elements in parse-blocks

  • 6bb03ca: fix: escape HTML when rehype-raw is omitted (#​330)

  • a12de57: Custom tags in components

  • 83f043c: Fix: certain LaTeX syntaxes e.g. (...) are not rendering

  • aabb9ab: Fix $$ inside code blocks being treated as math delimiters

    Code blocks can contain $$ as shell syntax (e.g., pstree -p $$ for current process ID). The math block merging logic was incorrectly counting $$ inside code blocks, causing subsequent content to be merged as if it were part of a math block.

    Added tracking of previous token type to skip math merging when the previous block was a code block.

  • 9f72224: Fix footnote detection incorrectly matching regex character classes

    The footnote reference and definition patterns were too permissive, using [^\]\s] which matches any character except ] and whitespace. This caused regex negated character classes like [^\s...] in code blocks to be incorrectly detected as footnotes, resulting in the entire document being returned as a single block.

    Updated the patterns to only match valid footnote identifiers (alphanumeric characters, underscores, and hyphens) using [\w-] instead.

  • 6b42a85: Remove CJS builds

  • aeadcd6: Fix single-line indented code blocks

  • 82bc4a6: Fix tel links being blocked by default

  • fd5533c: fix: Tables cause vertical scroll trap

  • e633ff7: Strip trailing newlines in code blocks

  • 6be5da8: Fix carets and dark code blocks on Tailwind v3

  • 573ece6: Add documentation for monorepos

  • 48756b5: Extend ReactMarkdown props

  • Updated dependencies [c347b53]

  • Updated dependencies [6b42a85]

  • Updated dependencies [4fffb9f]

  • Updated dependencies [3e6a77d]

    • remend@​1.2.0

v2.1.0

Compare Source

Minor Changes
Patch Changes
  • 32bcb5d: Fix: className styles not applied during active streaming
  • e45f2a2: fix: table element receives incorrect data-streamdown attribute (table-wrapper instead of table)
  • 8e24a9e: Add fallback for downloading images CORS issue
  • e7e5390: Improve caret rendering
  • 900d726: Code blocks render inside

    tags causing hydration errors

  • f0641f4: fix: initialize displayBlocks with blocks value
  • Updated dependencies [3376255]
  • Updated dependencies [add8eda]
  • Updated dependencies [19dae64]
  • Updated dependencies [1d4a3c7]
    • remend@​1.1.0

v2.0.1

Compare Source

Patch Changes

v2.0.0

Major Changes
  • 75faa2e: Reduce bundle size by 98%, create Streamdown CDN
Minor Changes
Patch Changes
  • 104798e: Make remend configurable

  • 23f2a40: Attempt to fallback to raw to prevent cdn-loader blocking

  • 133c6c8: Load KaTeX CSS from CDN

  • 0c830f5: Fix Mermaid pan/zoom controls layout issues in fullscreen and non-fullscreen modes

  • 68109f2: Fix setext heading issues

  • 2c32b2e: Fix shouldParseIncompleteMarkdown leaking to DOM

  • ee12ec8: Add support for self-hosted CDN

  • 5653400: Fix loading langs dynamically

  • 1b898b0: Fix dynamic module imports

  • 6a7dc7c: Optimize Mermaid rendering performance with viewport-based lazy loading

    • Add useDeferredRender hook for lazy loading components when entering viewport
    • Use Intersection Observer + debounce + requestIdleCallback for optimal performance
    • Only render Mermaid charts when they are visible or about to enter viewport
    • Prevents page freezing when loading chat history with many Mermaid diagrams
    • Fixes white screen issue when scrolling through chat messages with multiple diagrams
  • 8d8d67f: Add rehype sanitize

  • 271265c: Fix list indentation

  • 8157e80: Fix fullscreen mermaid

  • 91b425f: Refactor click outside handler for Shadow DOM compatibility

  • 16df4a4: Fix KaTeX parsing

  • 6bd211d: Update rehype-harden to fix relative URLs

  • 48c9c51: Fix autolink parsing to stop at CJK punctuation boundaries.

  • d1635f0: Fix bug: Code block line numbers over 100 wrap and start new line

  • Updated dependencies [104798e]

  • Updated dependencies [6769e7a]

  • Updated dependencies [217b128]

  • Updated dependencies [68109f2]

  • Updated dependencies [e0ee74e]

  • Updated dependencies [45f0f4d]

  • Updated dependencies [b8c8c79]

  • Updated dependencies [68f29c0]

  • Updated dependencies [e7eca51]

  • Updated dependencies [d708864]

    • remend@​1.0.2

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot requested a review from codeSTACKr as a code owner November 13, 2026 15:55
@codeSTACKr

Copy link
Copy Markdown
Contributor

Superseded by #39, which batches the frontend major updates (resolved with pnpm 12, validated locally and in CI).

@codeSTACKr codeSTACKr closed this Nov 13, 2026
@renovate
renovate Bot deleted the renovate/streamdown-2.x branch November 13, 2026 18:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant