Skip to content

Commit 76b68bf

Browse files
fix: more data attributes for code block elements (#82)
* add more code block data attributes * Create brown-goats-serve.md
1 parent faba69f commit 76b68bf

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

.changeset/brown-goats-serve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"streamdown": patch
3+
---
4+
5+
add more code block data attributes

packages/streamdown/__tests__/code-block.test.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,31 @@ describe('CodeBlock with multiple languages', () => {
231231
expect(languageLabels[2].textContent).toBe('typescript');
232232
}, { timeout: 5000 });
233233
});
234+
235+
it('should have data attributes on container, header, and code block elements', async () => {
236+
const { container } = render(
237+
<ShikiThemeContext.Provider value={['github-light', 'github-dark']}>
238+
<CodeBlock code="const x = 1;" language="javascript" />
239+
</ShikiThemeContext.Provider>
240+
);
241+
242+
await waitFor(() => {
243+
// Check container has data attributes
244+
const containerElement = container.querySelector('[data-code-block-container]');
245+
expect(containerElement).toBeTruthy();
246+
expect(containerElement?.getAttribute('data-language')).toBe('javascript');
247+
248+
// Check header has data attributes
249+
const headerElement = container.querySelector('[data-code-block-header]');
250+
expect(headerElement).toBeTruthy();
251+
expect(headerElement?.getAttribute('data-language')).toBe('javascript');
252+
253+
// Check code block has data attributes
254+
const codeBlockElements = container.querySelectorAll('[data-code-block]');
255+
expect(codeBlockElements.length).toBeGreaterThan(0);
256+
codeBlockElements.forEach(element => {
257+
expect(element.getAttribute('data-language')).toBe('javascript');
258+
});
259+
}, { timeout: 5000 });
260+
});
234261
});

packages/streamdown/lib/code-block.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,21 +193,33 @@ export const CodeBlock = ({
193193

194194
return (
195195
<CodeBlockContext.Provider value={{ code }}>
196-
<div className="my-4 w-full overflow-hidden rounded-xl border">
197-
<div className="flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs">
196+
<div
197+
className="my-4 w-full overflow-hidden rounded-xl border"
198+
data-code-block-container
199+
data-language={language}
200+
>
201+
<div
202+
className="flex items-center justify-between bg-muted/80 p-3 text-muted-foreground text-xs"
203+
data-code-block-header
204+
data-language={language}
205+
>
198206
<span className="ml-1 font-mono lowercase">{language}</span>
199207
<div>{children}</div>
200208
</div>
201209
<div className="w-full">
202210
<div className="min-w-full">
203211
<div
204212
className={cn('overflow-x-auto dark:hidden', className)}
213+
data-code-block
214+
data-language={language}
205215
// biome-ignore lint/security/noDangerouslySetInnerHtml: "this is needed."
206216
dangerouslySetInnerHTML={{ __html: html }}
207217
{...rest}
208218
/>
209219
<div
210220
className={cn('hidden overflow-x-auto dark:block', className)}
221+
data-code-block
222+
data-language={language}
211223
// biome-ignore lint/security/noDangerouslySetInnerHtml: "this is needed."
212224
dangerouslySetInnerHTML={{ __html: darkHtml }}
213225
{...rest}

0 commit comments

Comments
 (0)