// Adapted from Kibo UI (MIT), with owned React/CSS APIs. See THIRD_PARTY_NOTICES.md. "use client"; import { useEffect, useState, type ComponentProps } from "react"; import { codeToTokens, type BundledLanguage } from "./_ynrlib/shiki.js"; export type CodeBlockProps = ComponentProps<"div"> & { code: string; language?: BundledLanguage | "text"; lineNumbers?: boolean; }; export function CodeBlock({ code, language = "text", lineNumbers = true, className = "", ...props }: CodeBlockProps) { const [tokens, setTokens] = useState>["tokens"]>(); const [notice, setNotice] = useState(""); useEffect(() => { let active = true; setTokens(undefined); if (language !== "text") codeToTokens(code, { lang: language, theme: "github-dark" }) .then((result) => { if (active) setTokens(result.tokens); }) .catch(() => { if (active) setNotice("Highlighting unavailable; showing plain text."); }); return () => { active = false; }; }, [code, language]); return (
{language}
        
          {code.split("\n").map((line, i) => (
            
              {lineNumbers && (
                
              )}
              {tokens?.[i]
                ? tokens[i].map((token, j) => (
                    
                      {token.content}
                    
                  ))
                : line}
              {"\n"}
            
          ))}
        
      
{notice}
); }