-
-
Notifications
You must be signed in to change notification settings - Fork 316
Expand file tree
/
Copy pathCodeExampleCard.tsx
More file actions
46 lines (41 loc) · 1.38 KB
/
CodeExampleCard.tsx
File metadata and controls
46 lines (41 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { useState } from 'react'
import { Card } from '~/components/Card'
import { HighlightedCodeBlock } from '~/components/markdown'
import { FrameworkIconTabs } from '~/components/FrameworkIconTabs'
import type { Framework } from '~/libraries'
interface CodeExampleCardProps {
title?: string
frameworks: Framework[]
/** Pre-highlighted HTML by framework (from server-side Shiki) */
codeByFramework: Partial<Record<Framework, { lang: string; html: string }>>
}
export function CodeExampleCard({
title = 'Just a quick look...',
frameworks,
codeByFramework,
}: CodeExampleCardProps) {
const [framework, setFramework] = useState<Framework>(frameworks[0])
const selected =
codeByFramework[framework] || Object.values(codeByFramework)[0]
if (!selected) return null
return (
<div className="px-4 space-y-4 flex flex-col items-center">
<div className="text-3xl font-black">{title}</div>
<Card className="group overflow-hidden max-w-full mx-auto [&_pre]:bg-transparent! [&_pre]:p-4!">
<div>
<FrameworkIconTabs
frameworks={frameworks}
value={framework}
onChange={setFramework}
/>
<HighlightedCodeBlock
html={selected.html}
lang={selected.lang}
showCopyButton={false}
className="mt-0 border-0"
/>
</div>
</Card>
</div>
)
}