feat: 后台页头加明暗切换;内容卡改用库里的 EntryRow / EntryTile
- 后台页头新增月亮/太阳按钮:写回 site.theme 并即时切换,前后台一起变, 忽略未登录与保存中 - AppCard -> EntryRow,CesCard -> EntryTile(PosterCard 本来就用 Cover) - 删除 .app-card / .app-card-* / .ces-card / .ces-body* 手写样式, 两套卡片的点击语义与悬停反馈统一由库提供 视觉变化:头像认证勾回到库默认尺寸(20px,之前应用里压到 10px)
This commit is contained in:
@@ -178,6 +178,28 @@ export function AdminNext() {
|
||||
toast.success('侧边栏已保存')
|
||||
}
|
||||
|
||||
/** 页头的明暗切换:写回 site.theme,前后台一起变 */
|
||||
const themeSetting = draft?.site.theme ?? document?.settings.site.theme ?? 'auto'
|
||||
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
const isDark = themeSetting === 'dark' || (themeSetting === 'auto' && prefersDark)
|
||||
|
||||
const toggleTheme = async () => {
|
||||
if (document === null || draft === null) return
|
||||
const next = isDark ? 'light' : 'dark'
|
||||
setSaving(true)
|
||||
const result = await saveSettings(document.version, {
|
||||
...draft,
|
||||
site: { ...draft.site, theme: next },
|
||||
})
|
||||
setSaving(false)
|
||||
if (!result.ok) {
|
||||
toast.error(result.error)
|
||||
return
|
||||
}
|
||||
setDocument(result.document)
|
||||
setDraft(clone(result.document.settings))
|
||||
}
|
||||
|
||||
const confirmDelete = async () => {
|
||||
if (pending === null) return
|
||||
setDeleting(true)
|
||||
@@ -209,6 +231,12 @@ export function AdminNext() {
|
||||
<Brand href="/" name={brandName} mark={brandMark} logo={brandLogo} />
|
||||
|
||||
<div className="header-actions">
|
||||
<IconButton
|
||||
label={isDark ? '切换到浅色' : '切换到深色'}
|
||||
icon={<Icon name={isDark ? 'sun_line' : 'moon_line'} />}
|
||||
onClick={() => void toggleTheme()}
|
||||
disabled={!authenticated || saving}
|
||||
/>
|
||||
<IconButton
|
||||
label="返回首页"
|
||||
icon={<Icon name="arrow_left_line" />}
|
||||
|
||||
Reference in New Issue
Block a user