summaryrefslogtreecommitdiffhomepage
path: root/packages/web/src/components/CodeBlock.tsx
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-05-30 20:47:56 -0400
committerDax Raad <[email protected]>2025-05-30 20:48:36 -0400
commitf3da73553c45f17e04b1e77cb13eb0fca714d1bd (patch)
treea24317a19e1ab2a89da50db669dc6894f15d00d1 /packages/web/src/components/CodeBlock.tsx
parent9a26b3058ffc1023e5c7e54b6d571c903d15888e (diff)
downloadopencode-f3da73553c45f17e04b1e77cb13eb0fca714d1bd.tar.gz
opencode-f3da73553c45f17e04b1e77cb13eb0fca714d1bd.zip
sync
Diffstat (limited to 'packages/web/src/components/CodeBlock.tsx')
-rw-r--r--packages/web/src/components/CodeBlock.tsx47
1 files changed, 47 insertions, 0 deletions
diff --git a/packages/web/src/components/CodeBlock.tsx b/packages/web/src/components/CodeBlock.tsx
new file mode 100644
index 000000000..17559ece1
--- /dev/null
+++ b/packages/web/src/components/CodeBlock.tsx
@@ -0,0 +1,47 @@
+import {
+ type JSX,
+ onCleanup,
+ splitProps,
+ createEffect,
+ createResource,
+} from "solid-js"
+import { codeToHtml } from "shiki"
+import { transformerNotationDiff } from '@shikijs/transformers'
+
+interface CodeBlockProps extends JSX.HTMLAttributes<HTMLDivElement> {
+ code: string
+ lang?: string
+}
+function CodeBlock(props: CodeBlockProps) {
+ const [local, rest] = splitProps(props, ["code", "lang"])
+ let containerRef!: HTMLDivElement
+
+ const [html] = createResource(async () => {
+ return (await codeToHtml(local.code, {
+ lang: local.lang || "text",
+ themes: {
+ light: 'github-light',
+ dark: 'github-dark',
+ },
+ transformers: [
+ transformerNotationDiff(),
+ ],
+ })) as string
+ })
+
+ onCleanup(() => {
+ if (containerRef) containerRef.innerHTML = ""
+ })
+
+ createEffect(() => {
+ if (html() && containerRef) {
+ containerRef.innerHTML = html() as string
+ }
+ })
+
+ return (
+ <div ref={containerRef} {...rest}></div>
+ )
+}
+
+export default CodeBlock