import {Button, InlineCode, Link} from '@remotion/design'; import React, {useEffect, useState} from 'react'; import {codeToHtml} from 'shikiji'; import { Dialog, DialogContent, DialogDescription, DialogHeader, } from '~/components/ui/dialog'; import {copyText} from './copy-text'; import {generateCode} from './generate-code'; import type {TimingComponent} from './types'; const CodeBlock: React.FC<{ readonly code: string; readonly highlightedHtml: string; }> = ({code, highlightedHtml}) => { return (
{highlightedHtml ? (
) : (
					{code}
				
)}
); }; export const CodeModal: React.FC<{ readonly open: boolean; readonly onOpenChange: (open: boolean) => void; readonly components: TimingComponent[]; }> = ({open, onOpenChange, components}) => { const [highlightedImports, setHighlightedImports] = useState(''); const [highlightedCode, setHighlightedCode] = useState(''); const [copied, setCopied] = useState<'imports' | 'code' | null>(null); const generated = generateCode(components); useEffect(() => { if (!open) return; if (generated.imports) { codeToHtml(generated.imports, { lang: 'typescript', theme: 'github-dark', }).then((html) => { setHighlightedImports(html); }); } codeToHtml(generated.code, { lang: 'typescript', theme: 'github-dark', }).then((html) => { setHighlightedCode(html); }); }, [generated.imports, generated.code, open]); const handleCopy = async (type: 'imports' | 'code') => { const textToCopy = type === 'imports' ? generated.imports : generated.code; try { await copyText(textToCopy); setCopied(type); setTimeout(() => setCopied(null), 2000); } catch { // Fallback using clipboard API directly await navigator.clipboard.writeText(textToCopy); setCopied(type); setTimeout(() => setCopied(null), 2000); } }; return ( Copy this code into your Remotion project:
{generated.imports ? (
Imports
) : null}
Code
frame is from the{' '} useCurrentFrame() {' '} hook.
fps is from the{' '} useVideoConfig() {' '} hook.
See also:{' '} Animating properties
); };