'use client' import { useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' 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' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' const themeColors = [ { name: '经典黑', value: '#1a1a1a' }, { name: '深蓝', value: '#1e40af' }, { name: '墨绿', value: '#065f46' }, { name: '深紫', value: '#5b21b6' }, { name: '酒红', value: '#991b1b' }, { name: '海蓝', value: '#0369a1' }, { name: '森绿', value: '#166534' }, { name: '靛蓝', value: '#1e3a8a' }, { name: '玫红', value: '#9d174d' }, { name: '橙色', value: '#c2410c' }, { name: '棕褐', value: '#713f12' }, { name: '石墨', value: '#374151' }, ] interface StyleConfigDialogProps { value: RendererOptions onChangeAction: (options: RendererOptions) => void } export function StyleConfigDialog({ value, onChangeAction }: StyleConfigDialogProps) { const [currentOptions, setCurrentOptions] = useState(value) const [customizedFields, setCustomizedFields] = useState>(new Set()) const handleOptionChange = ( category: keyof RendererOptions, subcategory: string, value: string | null ) => { setCustomizedFields(prev => { const next = new Set(prev) if (value === null) { next.delete(`${category}.${subcategory}`) } else { next.add(`${category}.${subcategory}`) } return next }) const newOptions = { ...currentOptions, [category]: { ...currentOptions[category], [subcategory]: value === null ? undefined : value } } // 如果是主题颜色变更,同时更新标题颜色 if (category === 'base' && subcategory === 'themeColor') { if (value === null) { // 重置为模板默认值 newOptions.block = { ...newOptions.block, h1: { ...(newOptions.block?.h1 || {}), color: undefined }, h2: { ...(newOptions.block?.h2 || {}), color: undefined }, h3: { ...(newOptions.block?.h3 || {}), color: undefined } } } else { newOptions.block = { ...newOptions.block, h1: { ...(newOptions.block?.h1 || {}), color: value }, h2: { ...(newOptions.block?.h2 || {}), color: value }, h3: { ...(newOptions.block?.h3 || {}), color: value } } } } setCurrentOptions(newOptions) onChangeAction(newOptions) } const resetToDefault = (field: string) => { const [category, subcategory] = field.split('.') handleOptionChange(category as keyof RendererOptions, subcategory, null) } return ( 样式配置
{customizedFields.has('base.themeColor') && ( )}
{themeColors.map((color) => (
handleOptionChange('base', 'themeColor', e.target.value)} /> handleOptionChange('base', 'themeColor', e.target.value)} />

此颜色将应用于一级到三级标题

{customizedFields.has('base.fontSize') && ( )}
handleOptionChange('base', 'fontSize', `${e.target.value}px`)} /> px
{customizedFields.has('base.textAlign') && ( )}
{customizedFields.has('base.lineHeight') && ( )}
handleOptionChange('base', 'lineHeight', e.target.value)} />
) }