搜索态:用顶栏 title 区变搜索框,或在 body 顶部展开搜索条(与现网一致);退出搜索后回到 + · ⋯
搜索态仍可保留 +(搜完想记一条不必先退出);归档只读时隐藏 +
不推荐把 + 也塞进 more:会把最高频写操作藏一级
C. 状态对照 · 分组展开 / 分组收拢 / 纯时间扁平
注意第三列:跨子项目连续排列,只有记录间时间 gap,没有组头、没有组间距。
D. 数据字段(含标记色)
sub_projects (
id, project_id, title,
color TEXT NULL, -- null = auto from palette by sort_order index
sort_order INTEGER,
created_at, updated_at
)
timeline_records.sub_project_id NULLABLE -- null = 未归组
// pure time projection
records
.sortedBy(createdAt, asc|desc)
.map(r => RecordCard(badge: r.subproject?)) // no headers, no group gaps
.withInterRecordGaps() // same as today's timeline
// group projection
for sp in subprojects.orderedBy(sort_order):
header(sp) + (expanded ? records+gaps : peek)
ungrouped section (optional, same rules)