import type { ArchivedFontStatus } from "./text-font-loader.js"; import { searchTextTemplates, type TextTemplateCategory, type TextTemplateDefinition } from "./text-assets.js"; const categories: Array<{ id?: TextTemplateCategory; label: string }> = [ { label: "全部" }, { id: "flower", label: "花字" }, { id: "title", label: "标题" }, { id: "tag", label: "标签" }, { id: "simple", label: "简约" }, ]; export function TextTemplatePanel(props: { canAdd: boolean; category?: TextTemplateCategory; fontStatuses: Readonly>; onAdd: (template: TextTemplateDefinition) => void; onCategory: (category?: TextTemplateCategory) => void; onQuery: (query: string) => void; onRetry: () => void; query: string; recentIds: readonly string[]; templates: readonly TextTemplateDefinition[]; }) { const visible = searchTextTemplates(props.templates, { ...(props.category ? { category: props.category } : {}), query: props.query }); const recent = props.recentIds.map((id) => props.templates.find((template) => template.templateId === id)).filter((item): item is TextTemplateDefinition => Boolean(item)); const loadFailed = props.templates.some((template) => template.available && props.fontStatuses[template.defaultFontId] === "unavailable"); return

文字模板

props.onQuery(event.target.value)} placeholder="搜索文字模板显示名称" type="search" value={props.query} />
{categories.map((item) => )}
{loadFailed ? : null} {recent.length > 0 ?

最近使用

{recent.map((template) => {template.templateId}{template.displayName})}
: null}
{visible.map((template) => { const status = props.fontStatuses[template.defaultFontId] ?? "idle"; const unavailable = !template.available || status === "unavailable"; return ; })}
{visible.length === 0 ?

没有匹配的文字模板

: null}
; }