mirror of
https://github.com/jakejarvis/jarv.is.git
synced 2025-04-26 13:58:25 -04:00
36 lines
1.0 KiB
TypeScript
36 lines
1.0 KiB
TypeScript
import clsx from "clsx";
|
|
import CopyButton from "../CopyButton";
|
|
import type { ComponentPropsWithoutRef } from "react";
|
|
|
|
import styles from "./Code.module.css";
|
|
|
|
export type CodeProps = ComponentPropsWithoutRef<"code"> & {
|
|
"data-language"?: string;
|
|
"data-theme"?: string;
|
|
};
|
|
|
|
// a simple wrapper component that "intelligently" picks between inline code and code blocks (w/ optional syntax
|
|
// highlighting & a clipboard button)
|
|
const Code = ({
|
|
"data-language": dataLanguage, // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
"data-theme": dataTheme,
|
|
className,
|
|
children,
|
|
...rest
|
|
}: CodeProps) => {
|
|
return (
|
|
<>
|
|
{
|
|
// detect if this input has been touched by shiki via rehype-pretty-code and if so, include a copy-to-clipboard
|
|
// button as its sibling.
|
|
dataTheme && <CopyButton className={styles.copyButton} source={children} />
|
|
}
|
|
<code className={clsx(styles.code, className)} {...rest}>
|
|
{children}
|
|
</code>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default Code;
|