Gatsby + Tailwind CSS + prism-react-rendererでコードをシンタックスハイライトする
Posted: March 29, 2022
実装
いくつかのサイトを参考にしながら1 2 3、以下のような感じでスタイリングするといい感じになった。inlineのコードのスタイルは inlineCode
で、コードブロックのスタイルは code
で指定する4。
mdx_components.tsx12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152import React from 'react';import Highlight, { defaultProps } from 'prism-react-renderer';import dracula from "prism-react-renderer/themes/dracula"const MDXComponents = {inlineCode: props => <code className='leading-relaxed text-xs sm:text-sm lg:text-base py-0.5 px-1 bg-slate-200 text-slate-700 rounded-sm shadow-sm' {...props} />,code: ({ children, className }) => {// Pull the classNameconst language = className?.replace(/language-/, '') || ""return (<Highlight {...defaultProps}code={children.trim()}language={language}theme={dracula}>{({ className, style, tokens, getLineProps, getTokenProps }) => (<divclassName={className + ' flex flex-row p-2 sm:p-4 md:p-6 text-sm sm:text-base mb-4 overflow-x-auto rounded-lg shadow-lg'}style={{ ...style }}><pre><div className='flex flex-row gap-1.5 sm:gap-3'><div className='flex flex-col items-end'>{tokens.map((_, index) => {return (<span className='opacity-30'>{index + 1}</span>)})}</div><div className='flex flex-col items-start'>{tokens.map((line, index) => {const lineProps = getLineProps({ line, key: index })return (<div key={index} {...lineProps}>{line.map((token, key) => (<span key={key}{...getTokenProps({ token, key })} />))}</div>)})}</div></div></pre></div>)}</Highlight>)},};export default MDXComponents;