'use client' import { useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Label } from '@/components/ui/label' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Settings } from 'lucide-react' import { type RendererOptions } from '@/lib/markdown' const stylePresets = { default: { name: '默认样式', options: { base: { primaryColor: '#333333', textAlign: 'left', lineHeight: '1.75' }, block: { h1: { fontSize: '24px', color: '#1a1a1a' }, h2: { fontSize: '20px', color: '#1a1a1a' }, h3: { fontSize: '18px', color: '#1a1a1a' }, p: { fontSize: '15px', color: '#333333' }, code_pre: { fontSize: '14px', color: '#333333' } }, inline: { link: { color: '#576b95' }, codespan: { color: '#333333' }, em: { color: '#666666' } } } }, modern: { name: '现代简约', options: { base: { primaryColor: '#2d3748', textAlign: 'left', lineHeight: '1.8' }, block: { h1: { fontSize: '28px', color: '#1a202c' }, h2: { fontSize: '24px', color: '#1a202c' }, h3: { fontSize: '20px', color: '#1a202c' }, p: { fontSize: '16px', color: '#2d3748' }, code_pre: { fontSize: '15px', color: '#2d3748' } }, inline: { link: { color: '#4299e1' }, codespan: { color: '#2d3748' }, em: { color: '#718096' } } } } } interface StyleConfigDialogProps { value: RendererOptions onChangeAction: (options: RendererOptions) => void } export function StyleConfigDialog({ value, onChangeAction }: StyleConfigDialogProps) { const [currentOptions, setCurrentOptions] = useState<RendererOptions>(value) const handlePresetChange = (preset: keyof typeof stylePresets) => { const newOptions = stylePresets[preset].options setCurrentOptions(newOptions) onChangeAction(newOptions) } const handleOptionChange = ( category: keyof RendererOptions, subcategory: string, value: string ) => { const newOptions = { ...currentOptions, [category]: { ...currentOptions[category], [subcategory]: value } } setCurrentOptions(newOptions) onChangeAction(newOptions) } return ( <Dialog> <DialogTrigger asChild> <Button variant="outline" size="sm"> <Settings className="h-4 w-4 mr-2" /> 样式设置 </Button> </DialogTrigger> <DialogContent className="max-w-2xl"> <DialogHeader> <DialogTitle>样式配置</DialogTitle> </DialogHeader> <Tabs defaultValue="presets" className="w-full"> <TabsList> <TabsTrigger value="presets">预设样式</TabsTrigger> <TabsTrigger value="base">基础</TabsTrigger> <TabsTrigger value="block">块级元素</TabsTrigger> <TabsTrigger value="inline">行内元素</TabsTrigger> </TabsList> <TabsContent value="presets" className="space-y-4"> <div className="grid grid-cols-2 gap-4"> {Object.entries(stylePresets).map(([key, preset]) => ( <div key={key} className="p-4 border rounded-lg cursor-pointer hover:border-primary" onClick={() => handlePresetChange(key as keyof typeof stylePresets)} > <h3 className="font-medium mb-2">{preset.name}</h3> <div className="space-y-2"> <p style={{ fontSize: preset.options.block?.p?.fontSize, color: preset.options.block?.p?.color }}> 正文示例 </p> <h2 style={{ fontSize: preset.options.block?.h2?.fontSize, color: preset.options.block?.h2?.color }}> 标题示例 </h2> </div> </div> ))} </div> </TabsContent> <TabsContent value="base" className="space-y-4"> <div className="grid grid-cols-2 gap-4"> {currentOptions.base && Object.entries(currentOptions.base).map(([key, value]) => ( <div key={key} className="space-y-2"> <Label>{key}</Label> <Input value={value} onChange={(e) => handleOptionChange('base', key, e.target.value)} /> </div> ))} </div> </TabsContent> <TabsContent value="block" className="space-y-4"> <div className="grid grid-cols-2 gap-4"> {currentOptions.block && Object.entries(currentOptions.block).map(([key, value]) => ( <div key={key} className="space-y-2"> <Label>{key}</Label> <Input value={JSON.stringify(value)} onChange={(e) => handleOptionChange('block', key, e.target.value)} /> </div> ))} </div> </TabsContent> <TabsContent value="inline" className="space-y-4"> <div className="grid grid-cols-2 gap-4"> {currentOptions.inline && Object.entries(currentOptions.inline).map(([key, value]) => ( <div key={key} className="space-y-2"> <Label>{key}</Label> <Input value={JSON.stringify(value)} onChange={(e) => handleOptionChange('inline', key, e.target.value)} /> </div> ))} </div> </TabsContent> </Tabs> </DialogContent> </Dialog> ) }