diff --git a/client/harmony/entry/src/main/ets/pages/CalendarPage.ets b/client/harmony/entry/src/main/ets/pages/CalendarPage.ets
index ad51643..e0e55b8 100644
--- a/client/harmony/entry/src/main/ets/pages/CalendarPage.ets
+++ b/client/harmony/entry/src/main/ets/pages/CalendarPage.ets
@@ -1063,6 +1063,32 @@ export struct CalendarPage {
*/
if (this.cellShowsChips() && cell.label > 0) {
Column({ space: 2 }) {
+ /*
+ * ★★ 2026-09-21 补:**空列要有「—」占位**。
+ *
+ * WebUI `WeekGrid`(`CalendarView.tsx:649`)是:
+ * {list.length === 0
+ * ?
—
+ * : list.map(...)}
+ * 我们原来**只有 if 没有 else** ⇒ 没日程的那几列是**全空**的。
+ *
+ * 为什么不是“反正也没内容”:
+ * 七列等高,有日程的列有卡片、没日程的列一片白 ⇒
+ * 看上去像“这几列没渲染出来”(用户说的“一塌糊涂”包含这一条)。
+ * 一个破折号把“查明过、这天真没有”与“还没查/没画”区分开 ——
+ * 与右栏「这一天没有日程」同一个道理(本页注释里已有这句话)。
+ *
+ * 颜色:WebUI 是 `text-gray-300`(周格)/`text-gray-200`(时刻表),
+ * 本仓取 `textSubtleFor()` —— 三级文字就是这两个档的对应物,
+ * 且它自带深浅两套(手写 gray-300 在深色下会发亮)。
+ */
+ if (this.eventsOf(cell.iso).length === 0) {
+ Text('—')
+ .fontSize(Theme.fontTiny)
+ .fontColor(Theme.textSubtleFor(this.isDarkNow))
+ .width('100%')
+ .padding({ left: 4, top: 6 })
+ }
ForEach(this.eventsOf(cell.iso), (ev: CalendarEvent) => {
this.EventChip(ev)
}, (ev: CalendarEvent) => ev.event_id)