import { Button, Form, Input, InputNumber } from "antd"; import { IconButton, SegmentedControl, Select, Tooltip } from "@/pages/admin/ui/controls"; import { Check, Copy, LockKeyhole, Moon, Plus, Sparkles, Sun, Trash2 } from "lucide-react"; import { useMemo, useState } from "react"; import { SKIN_COLOR_GROUPS, SKIN_COMPONENT_NUMBER_FIELDS, skinSwatches, type SkinComponentTokens, type SkinDefinition, type SkinModeTokens, type SkinThemeMode } from "@/lib/skin-themes"; import { cn } from "@/lib/utils"; import { AdminStatusBadge } from "@/pages/admin/components/admin-ui"; export function SkinThemeEditor({ themes, selectedID, disabled, onSelect, onCreate, onDuplicate, onDelete, onChange, }: { themes: SkinDefinition[]; selectedID: string; disabled: boolean; onSelect: (id: string) => void; onCreate: () => void; onDuplicate: (id: string) => void; onDelete: (id: string) => void; onChange: (theme: SkinDefinition) => void; }) { const [mode, setMode] = useState("light"); const selected = useMemo(() => themes.find((theme) => theme.id === selectedID) || themes[0], [selectedID, themes]); if (!selected) return null; const editorDisabled = disabled || selected.locked; const updateIdentity = (patch: Partial>) => onChange({ ...selected, ...patch }); const updateColor = (key: keyof SkinModeTokens, value: string) => onChange({ ...selected, tokens: { ...selected.tokens, [mode]: { ...selected.tokens[mode], [key]: value.trim().toLowerCase() } }, }); const updateComponent = (key: Key, value: SkinComponentTokens[Key]) => onChange({ ...selected, tokens: { ...selected.tokens, components: { ...selected.tokens.components, [key]: value } } }); return (
主题库 共 {themes.length} 套,最多 16 套
{themes.map((theme) => { const active = theme.id === selected.id; const swatches = skinSwatches(theme); return (
= 16} onClick={() => onDuplicate(theme.id)} />
); })}
当前编辑 {selected.name}
{selected.locked ? (
) : null}
updateIdentity({ name: event.target.value })} /> updateIdentity({ description: event.target.value })} />
颜色体系 同一用途的控件统一消费下列语义颜色
ariaLabel="皮肤预览模式" value={mode} options={[ { label: ( 浅色 ), value: "light", }, { label: ( 深色 ), value: "dark", }, ]} onChange={setMode} />
{SKIN_COLOR_GROUPS.map((group, index) => (
{group.label} {group.fields.length} 项
{group.fields.map((field) => ( updateColor(field.key, value)} /> ))}
))}
控件尺寸、圆角与反馈 17 项
{SKIN_COMPONENT_NUMBER_FIELDS.map((field) => ( ))}
); } function SkinThemePreview({ theme, mode }: { theme: SkinDefinition; mode: SkinThemeMode }) { const color = theme.tokens[mode]; const component = theme.tokens.components; const shadow = component.shadowStyle === "none" ? "none" : component.shadowStyle === "strong" ? "0 18px 44px #0000003d" : "0 10px 28px #00000024"; return (
控件组合预览 按钮、输入、选中与状态均来自同一套主题参数
已选中 后台菜单 输入框状态 主要操作 删除
); }