from pathlib import Path from typing import Any, Literal from pydantic import BaseModel, Field class Theme(BaseModel): """ 一个封装了所有主题相关信息的模型。 """ name: str = Field(..., description="主题名称") palette: dict[str, Any] = Field( default_factory=dict, description="用于PIL渲染的调色板" ) style_css: str = Field("", description="用于HTML渲染的全局CSS内容") assets_dir: Path = Field(..., description="主题的资产目录路径") default_assets_dir: Path = Field( ..., description="默认主题的资产目录路径,用于资源回退" ) class TemplateManifest(BaseModel): """ 模板清单模型,用于描述一个模板的元数据。 """ name: str = Field(..., description="模板的人类可读名称") engine: Literal["html", "markdown"] = Field( "html", description="渲染此模板所需的引擎" ) entrypoint: str = Field( ..., description="模板的入口文件 (例如 'template.html' 或 'renderer.py')" ) schema_path: str | None = Field( None, description="用于数据验证的Pydantic模型的Python导入路径" ) render_options: dict[str, Any] = Field( default_factory=dict, description="传递给渲染引擎的额外选项 (如viewport)" )