feat(content): 分组对所有内容类型生效,统一分区/分组/条目模型

- 分区=容器,分组=任意类型的可选子容器,条目可挂分区或分组(直属分区)
- catalog 所有类型统一输出 groups + items,条目查询按节点取
- 详情/侧栏/首页卡片预览支持所有类型的分组;多组显示小标题 + 未分组
- 后台「分区」「侧栏导航」对所有类型可建组;「内容」弹窗分组可选直属分区,编辑可换组
- 修复首页卡片配置为「整个分区」时预览为空
- 测试 59 passed
This commit is contained in:
2026-10-30 18:56:17 +08:00
parent cc08188c1e
commit c84c41dc7d
11 changed files with 264 additions and 200 deletions
@@ -1,23 +1,24 @@
import { Space, Title } from '@stash/ui'
import type { AppGroup } from '../../data/types'
import { AppGrid } from './AppGrid'
import type { ReactNode } from 'react'
/**
* 明细页的分组块:小标题 + 该组的应用网格。
* 分类被拆成多个分组时重复使用,单个分组时明细页不渲染标题。
* 明细页的分组块:小标题 + 该组的内容网格。
*
* 具体网格由调用方传入(应用 / 海报 / 图文共用同一层外壳),
* 这样三种类型的「分组」渲染方式保持一致。
*/
type GroupBlockProps = {
group: AppGroup
onOpen?: (itemId: string) => void
name: string
children: ReactNode
}
export function GroupBlock({ group, onOpen }: GroupBlockProps) {
export function GroupBlock({ name, children }: GroupBlockProps) {
return (
<Space direction="column" gap="sm" align="stretch" className="group-block">
<Title level={4} as="h3">
{group.name}
{name}
</Title>
<AppGrid items={group.items} variant="detail" onOpen={onOpen} />
{children}
</Space>
)
}