cecc7f4cbb
## 日期条 → 可展开日历 首页那条七天日期带下面加了「展开整月」。展开后是整月网格(有安排的 日子带绿点),点任意一天,任务卡跟着切到那天。收起来还是七天,默认 不拉日历接口。 这块原来是计划页的「日历」tab,现在从计划页整个摘掉了——「哪天要做 什么」和「今天要做什么」本来就是一件事,分在两个 tab 里只是让人多点 两下。日历样式(.cal-* / .day-detail / .dd-*)跟着从 plan.wxss 搬到 home.wxss,plan.wxss 里没留死规则。 ## 任务卡下面挂当天的计划节点和提醒 day-plan 接口本来就返回 plan_nodes / reminders / tasks 三份。这里只取 前两份,任务列表仍然走 /tasks——因为 /tasks 会补生成当天任务而 day-plan 不会,拿它的 tasks 覆盖列表会让今天的任务凭空少掉。 ## 「接下来」卡 30 天计划里最近 3 个还没做的节点,日期显示成「今天/明天/3 天后」而不是 7月31日。带完成度进度条,右上角「完整计划」进计划页。 计划页降级成二级页之后,这张卡是它在首页的唯一露出;没有它,计划这个 功能对用户来说就等于消失了。 ## AI 计划入口 AI 页快捷区加了「生成养护计划」,直达 /pages/plan/plan?tab=aiPlan。 没有把这个表单搬进 AI 聊天页:它要渲染 extracted 四宫格和可勾选的任务 节点,塞进聊天流意味着同一个页面维护两套完全不同的渲染,收益只是少跳 一次。原本要解决的是「计划页降级后 AI 计划找不到了」,一个入口就够了。 顺带:iconfont 补了 up / down 两个 chevron(展开收起用)。 联调验证(本地 9090,新建幼犬档案): day-plan 今天 → plan_nodes=['确认免疫与驱虫计划'] plan → completion_pct=0,4 个节点,date 字段齐全 接下来筛出 → 07-29 确认免疫与驱虫计划 / 08-01 观察饮水与排便 / 08-05 体重趋势检查 calendar → 2026-7,today=29,tasked_days=[29] day-plan 未来日 → 08-01、08-05 各自返回对应节点 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
84 lines
4.4 KiB
Plaintext
84 lines
4.4 KiB
Plaintext
.top-row{display:flex;align-items:center;justify-content:space-between;margin:4rpx 0 var(--sp-4)}
|
|
.greet-h2{font-size:var(--fs-xl);line-height:1.15;letter-spacing:-.8rpx;font-weight:var(--fw-b)}
|
|
.greet-p{font-size:var(--fs-sm);color:var(--muted);margin-top:var(--sp-1)}
|
|
.icon-stack{display:flex;gap:var(--sp-2)}
|
|
.icon-btn{
|
|
width:76rpx;height:76rpx;border-radius:50%;background:#fff;box-shadow:var(--sd-1);
|
|
color:var(--text-2);display:flex;align-items:center;justify-content:center;
|
|
}
|
|
|
|
/* 门面卡 */
|
|
.hero-card{
|
|
background:
|
|
radial-gradient(circle at 95% 16%, rgba(245,169,71,.22), transparent 32%),
|
|
linear-gradient(135deg,#FFFFFF,#FFF6E9);
|
|
}
|
|
.hero-row{display:flex;align-items:center;gap:var(--sp-4)}
|
|
.ring-num{font-size:var(--fs-xl);font-weight:var(--fw-b);line-height:1}
|
|
.ring-unit{font-size:var(--fs-cap)}
|
|
.ring-cap{font-size:var(--fs-cap);color:var(--muted);margin-top:4rpx}
|
|
.hero-main{flex:1;min-width:0}
|
|
.hero-title{font-size:var(--fs-lg);font-weight:var(--fw-b);letter-spacing:-.4rpx}
|
|
.hero-sub{color:var(--muted);font-size:var(--fs-sm);margin-top:4rpx}
|
|
.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}
|
|
.hero-meta{
|
|
color:var(--muted);font-size:var(--fs-sm);margin-top:var(--sp-3);
|
|
padding-top:var(--sp-3);border-top:1rpx solid rgba(238,230,220,.8);
|
|
}
|
|
|
|
/* 一周日期条 */
|
|
.date-strip{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sp-2);margin-bottom:var(--sp-4)}
|
|
.day{
|
|
background:#fff;border-radius:var(--r-md);min-height:112rpx;text-align:center;padding:var(--sp-3) 4rpx;
|
|
border:1rpx solid var(--line);color:var(--muted);font-size:var(--fs-cap);
|
|
}
|
|
.day-b{display:block;color:var(--text);font-size:var(--fs-md);margin-top:6rpx;font-weight:var(--fw-b)}
|
|
.day.active{border-color:var(--primary-line);background:var(--primary-soft);color:var(--primary-dark)}
|
|
.day.sel{border-color:var(--primary);background:var(--primary-soft);color:var(--primary-dark);box-shadow:0 0 0 2rpx rgba(245,169,71,.35)}
|
|
.day.has-dot::after{content:"";display:block;width:8rpx;height:8rpx;border-radius:50%;background:var(--green);margin:6rpx auto 0}
|
|
|
|
.ai-text{color:var(--text-2);font-size:var(--fs-md);line-height:1.6}
|
|
.ai-cta{margin-top:var(--sp-4)}
|
|
|
|
/* ===== 日期带(原计划页「日历」tab 并过来) ===== */
|
|
.date-band{margin-bottom:var(--sp-4)}
|
|
.date-band .date-strip{margin-bottom:0}
|
|
.cal-card{margin-bottom:0}
|
|
.cal-toggle{
|
|
display:flex;align-items:center;justify-content:center;gap:4rpx;
|
|
padding:var(--sp-2) 0;font-size:var(--fs-cap);color:var(--muted);
|
|
}
|
|
.cal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-3);font-weight:var(--fw-b);font-size:var(--fs-lg)}
|
|
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sp-2);text-align:center}
|
|
.cal-w{font-size:var(--fs-cap);color:var(--muted);padding:var(--sp-1) 0}
|
|
.cal-cell{
|
|
height:76rpx;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;
|
|
font-weight:var(--fw-b);font-size:var(--fs-sm);background:var(--surface-2);position:relative;
|
|
}
|
|
.cal-cell.blank{background:transparent}
|
|
.cal-cell.today{background:var(--primary-soft);color:var(--primary-dark)}
|
|
.cal-cell.tasked::after{content:"";position:absolute;bottom:8rpx;width:8rpx;height:8rpx;border-radius:50%;background:var(--green)}
|
|
.cal-cell.sel{background:var(--primary);color:#fff}
|
|
.cal-cell.sel.tasked::after{background:#fff}
|
|
|
|
/* 某天的安排 */
|
|
.day-detail{margin-top:var(--sp-3);border-top:1rpx solid var(--line);padding-top:var(--sp-4)}
|
|
.dd-title{font-weight:var(--fw-b);font-size:var(--fs-md);margin-bottom:var(--sp-3)}
|
|
.dd-item{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) 0}
|
|
.dd-tag{flex:none;font-size:var(--fs-cap);font-weight:var(--fw-b);padding:2rpx var(--sp-2);border-radius:var(--r-full)}
|
|
.dd-tag.plan{background:var(--primary-soft);color:var(--primary-ink)}
|
|
.dd-tag.task{background:var(--green-soft);color:var(--green-ink)}
|
|
.dd-tag.rem{background:var(--blue-soft);color:var(--blue-ink)}
|
|
.dd-b{font-size:var(--fs-md);color:var(--text)}
|
|
.dd-b.done{text-decoration:line-through;color:var(--muted)}
|
|
|
|
/* ===== 接下来 ===== */
|
|
.up-list{margin-top:var(--sp-3)}
|
|
.up-item{display:flex;gap:var(--sp-3);padding:var(--sp-3) 0;border-top:1rpx solid var(--line)}
|
|
.up-item:first-child{border-top:none;padding-top:0}
|
|
.up-when{
|
|
flex:none;width:112rpx;font-size:var(--fs-cap);font-weight:var(--fw-b);
|
|
color:var(--primary-dark);padding-top:4rpx;
|
|
}
|
|
.up-body{flex:1;min-width:0}
|