All checks were successful
Deploy / deploy (push) Successful in 9m29s
- Modified redirects in next.config.ts to change the destination for "/sohbet" to "/listem". - Added new dependencies in package.json: marked, motion, react-markdown, remark-breaks, remark-gfm, shiki, and use-stick-to-bottom. - Updated pnpm-lock.yaml to reflect the new package versions and dependencies. - Removed obsolete stack files for Flutter, Nuxt, Nuxt.js, React Native, and Svelte from the UI/UX Pro Max skill data. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
95 lines
2.0 KiB
TypeScript
95 lines
2.0 KiB
TypeScript
"use client"
|
|
|
|
import { cn } from "@/lib/utils"
|
|
import React, { useEffect, useState } from "react"
|
|
import { codeToHtml } from "shiki"
|
|
|
|
export type CodeBlockProps = {
|
|
children?: React.ReactNode
|
|
className?: string
|
|
} & React.HTMLProps<HTMLDivElement>
|
|
|
|
function CodeBlock({ children, className, ...props }: CodeBlockProps) {
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"not-prose flex w-full flex-col overflow-clip border",
|
|
"border-border bg-card text-card-foreground rounded-xl",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export type CodeBlockCodeProps = {
|
|
code: string
|
|
language?: string
|
|
theme?: string
|
|
className?: string
|
|
} & React.HTMLProps<HTMLDivElement>
|
|
|
|
function CodeBlockCode({
|
|
code,
|
|
language = "tsx",
|
|
theme = "github-light",
|
|
className,
|
|
...props
|
|
}: CodeBlockCodeProps) {
|
|
const [highlightedHtml, setHighlightedHtml] = useState<string | null>(null)
|
|
|
|
useEffect(() => {
|
|
async function highlight() {
|
|
if (!code) {
|
|
setHighlightedHtml("<pre><code></code></pre>")
|
|
return
|
|
}
|
|
|
|
const html = await codeToHtml(code, { lang: language, theme })
|
|
setHighlightedHtml(html)
|
|
}
|
|
highlight()
|
|
}, [code, language, theme])
|
|
|
|
const classNames = cn(
|
|
"w-full overflow-x-auto text-[13px] [&>pre]:px-4 [&>pre]:py-4",
|
|
className
|
|
)
|
|
|
|
// SSR fallback: render plain code if not hydrated yet
|
|
return highlightedHtml ? (
|
|
<div
|
|
className={classNames}
|
|
dangerouslySetInnerHTML={{ __html: highlightedHtml }}
|
|
{...props}
|
|
/>
|
|
) : (
|
|
<div className={classNames} {...props}>
|
|
<pre>
|
|
<code>{code}</code>
|
|
</pre>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export type CodeBlockGroupProps = React.HTMLAttributes<HTMLDivElement>
|
|
|
|
function CodeBlockGroup({
|
|
children,
|
|
className,
|
|
...props
|
|
}: CodeBlockGroupProps) {
|
|
return (
|
|
<div
|
|
className={cn("flex items-center justify-between", className)}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export { CodeBlockGroup, CodeBlockCode, CodeBlock }
|