import type { TokenLine } from "@/lib/decompile/decompile.worker"; import { memo, type ReactNode } from "react"; import { CopyMenuButton, type CopyOption } from "@/components/code-viewer"; /** material-dark palette (react-syntax-highlighter prism theme) */ const TOKEN_COLORS: Record = { atrule: "#c792ea", boolean: "#c792ea", builtin: "#ffcb6b", char: "#80cbc4", "class-name": "#f2ff00", comment: "#616161", constant: "#c792ea", function: "#c792ea", keyword: "#c792ea", number: "#fd9170", operator: "#89ddff", property: "#80cbc4", punctuation: "#89ddff", regex: "#f2ff00", string: "#a5e844", variable: "#ff6666", }; const BACKGROUND = "#2f2f2f"; const PLAIN = "#eee"; const GUTTER_COLOR = "#616161"; const FONT_FAMILY = "Roboto Mono, monospace"; interface DecompiledCodeViewerProps { lines: TokenLine[] | null; placeholder: string; header?: ReactNode; button?: ReactNode; height: number; copyLabel: string; copyOptions: CopyOption[]; } export default memo(function DecompiledCodeViewer({ lines, placeholder, header, button, height, copyLabel, copyOptions, }: Readonly) { return (
{header}
{button}
{lines ? (
{lines.map((_, index) => (
{index + 1}
))}
              {lines.map((line, index) => (
                
{line.map(([type, text], segmentIndex) => type === "plain" ? ( text ) : ( {text} ), )} {line.length === 0 ? " " : null}
))}
) : (
            {placeholder}
          
)}
); });