import React from 'react'; import Prism from 'prismjs'; import { ComponentShareButton } from './ComponentShareButton'; import { Reveal } from './Reveal'; import 'prismjs/components/prism-python'; import 'prismjs/components/prism-typescript'; import 'prismjs/components/prism-javascript'; import 'prismjs/components/prism-jsx'; import 'prismjs/components/prism-tsx'; import 'prismjs/components/prism-docker'; import 'prismjs/components/prism-yaml'; import 'prismjs/components/prism-json'; import 'prismjs/components/prism-markup'; import 'prismjs/components/prism-css'; import 'prismjs/components/prism-sql'; import 'prismjs/components/prism-bash'; import 'prismjs/components/prism-markdown'; interface BlockquoteProps { children: React.ReactNode; className?: string; } export const ArticleBlockquote: React.FC = ({ children, className = '' }) => { // Generate a quick stable hash based on content length/chars for ID const shareId = `blockquote-${Math.random().toString(36).substring(7).toUpperCase()}`; return (
{/* Subtle top shine */}
{/* Share Button top right */}
{/* Small emerald glow effect inside the icon box on hover */}
{children}
); }; interface CodeBlockProps { code?: string; children?: React.ReactNode; language?: string; showLineNumbers?: boolean; className?: string; } // Language mapping for Prism.js const prismLanguageMap: Record = { py: 'python', ts: 'typescript', tsx: 'tsx', js: 'javascript', jsx: 'jsx', dockerfile: 'docker', docker: 'docker', yml: 'yaml', yaml: 'yaml', json: 'json', html: 'markup', css: 'css', sql: 'sql', sh: 'bash', bash: 'bash', md: 'markdown', astro: 'markup', // Fallback for Astro }; // Highlight code using Prism.js const highlightCode = (code: string, language: string): { html: string; prismLanguage: string } => { const prismLanguage = prismLanguageMap[language] || language || 'markup'; try { const highlighted = Prism.highlight( code.trim(), Prism.languages[prismLanguage] || Prism.languages.markup, prismLanguage, ); return { html: highlighted, prismLanguage }; } catch (error) { console.warn('Prism highlighting failed:', error); return { html: code.trim(), prismLanguage: 'text' }; } }; export const CodeBlock: React.FC = ({ code, children, language = 'text', showLineNumbers = false, className = '' }) => { const codeContent = code || (typeof children === 'string' ? children : String(children || '')).trim(); const { html: highlightedCode, prismLanguage } = language !== 'text' ? highlightCode(codeContent, language) : { html: codeContent, prismLanguage: 'text' }; const lines = codeContent.split('\n'); return ( <>