mirror of
https://github.com/vercel/streamdown.git
synced 2026-09-19 02:18:37 +08:00
57cd3b5a07
* feat: support custom starting line number in code blocks Add support for specifying a custom starting line number via the code fence meta string, e.g.: ```js startLine=10 const x = 1; ``` Implementation: - Add `remarkCodeMeta` remark plugin that forwards the fenced-code meta string to hast as the `metastring` property so it is available to the custom React code component. - Update the rehype-sanitize default schema to allow the `metastring` attribute on `code` elements. - Parse `startLine=N` from the meta string in `CodeComponent` and pass the value down as a `startLine` prop. - In `CodeBlockBody`, apply `counter-reset: line N-1` as an inline style when `startLine > 1`, which overrides the Tailwind counter-reset class and makes CSS counters begin from the specified number. - Pass `startLine` through the `CodeBlock` and `HighlightedCodeBlockBody` call chains. - Add 12 tests covering the remark plugin, CodeBlockBody prop, and CodeBlock integration. Closes: resolves #287 * fix: lint errors — use literal keys, hoist regex, sort imports * feat: allow customizing icons via icons prop Add an IconContext-based system that lets users override any of the built-in icons (CheckIcon, CopyIcon, DownloadIcon, etc.) by passing a Partial<IconMap> via the new `icons` prop on <Streamdown>. - Created lib/icon-context.tsx with IconMap type, IconProvider, and useIcons hook - Updated all sub-components to consume icons via useIcons() instead of direct imports - Added icons prop to StreamdownProps with IconProvider wrapper - Exported IconMap type from package entry Closes #412 * style: fix biome lint and formatting errors * Merge branch 'main' into feat/custom-icons * fix: review fixes for icons and startLine features - Add missing changeset for icons feature (minor) - Fix IconComponent type to include size prop matching actual usage - Fix IconProvider memoization: use shallow comparison instead of referential equality so inline icon objects don't cause re-renders - Move START_LINE_PATTERN constant below all imports - Add bounds checking for startLine (must be >= 1) - Convert dynamic imports to top-level imports in startLine tests - Add icon-context tests (5 tests) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Dmitrii Troitskii <jsleitor@gmail.com> Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
22 lines
700 B
TypeScript
22 lines
700 B
TypeScript
import type { Code, Root } from "mdast";
|
|
import type { Plugin } from "unified";
|
|
import { visit } from "unist-util-visit";
|
|
|
|
/**
|
|
* Remark plugin that forwards code fence meta strings to hast properties.
|
|
* This makes the meta string available as a `metastring` prop to the custom
|
|
* code component, enabling features like custom starting line numbers
|
|
* (e.g. `startLine=10`).
|
|
*/
|
|
export const remarkCodeMeta: Plugin<[], Root> = () => (tree) => {
|
|
visit(tree, "code", (node: Code) => {
|
|
if (node.meta) {
|
|
node.data = node.data ?? {};
|
|
node.data.hProperties = {
|
|
...((node.data.hProperties as Record<string, unknown>) ?? {}),
|
|
metastring: node.meta,
|
|
};
|
|
}
|
|
});
|
|
};
|