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>
20 lines
561 B
TypeScript
20 lines
561 B
TypeScript
import { useIcons } from "../icon-context";
|
|
import { useCn } from "../prefix-context";
|
|
|
|
export const CodeBlockSkeleton = () => {
|
|
const { Loader2Icon } = useIcons();
|
|
const cn = useCn();
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"w-full divide-y divide-border overflow-hidden rounded-xl border border-border"
|
|
)}
|
|
>
|
|
<div className={cn("h-[46px] w-full bg-muted/80")} />
|
|
<div className={cn("flex w-full items-center justify-center p-4")}>
|
|
<Loader2Icon className={cn("size-4 animate-spin")} />
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|