:root {
  color-scheme: light;
  --gutter: 92px;            /* 日程左侧日期列宽；颜色、字号等令牌全部在 theme.css */

}
* { box-sizing: border-box; }
html, body { margin: 0; height: 100%; }
body { font: 15px/1.6 var(--sans); color: var(--ink); background: var(--desk); font-variant-numeric: tabular-nums; }
button, input, textarea { font: inherit; color: inherit; }
[hidden] { display: none !important; }
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.muted { color: var(--pencil); }
.small { font-size: 12px; }
.err { color: var(--warn); min-height: 1.4em; margin: 0; }
code, kbd { font-family: inherit; background: var(--desk); border-radius: 3px; padding: 0 4px; font-size: 12px; }
:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }

.btn { border: 1px solid var(--rule); background: var(--sheet); border-radius: 6px; padding: 5px 12px; cursor: pointer; text-decoration: none; display: inline-block; }
.btn:hover { border-color: var(--pencil); }
.btn.primary { background: var(--ink); color: #fff; border-color: var(--ink); }
.btn.primary:disabled { opacity: .4; cursor: default; }
.btn.ghost { border-color: transparent; color: var(--blue); }
.link { border: 0; background: none; color: var(--pencil); cursor: pointer; padding: 0; text-decoration: underline; }

/* login */
.login { position: fixed; inset: 0; display: grid; place-items: center; }
.login-card { background: var(--sheet); padding: 40px 36px; border-radius: 10px; width: 320px; display: grid; gap: 12px; box-shadow: 0 1px 0 var(--rule); }
.login-card .brand { font-size: 32px; margin: 0; }
.login-card p { margin: 0; }
.login-card input { border: 1px solid var(--rule); border-radius: var(--r-sm); padding: 8px 10px; }

/* shell */
:root { --side-w: 248px; --assist-w: clamp(340px, 28vw, 460px); }
.shell { display: grid; grid-template-columns: var(--side-w) minmax(0, 1fr) var(--assist-w); grid-template-rows: auto minmax(0, 1fr); height: 100vh; }
/* the bar across the top: logo | views | search | language | account */
.gbar { grid-column: 1 / -1; grid-row: 1; display: flex; align-items: center; gap: 14px; height: 52px; padding: 0 16px 0 20px; position: relative; z-index: 30;
        background: var(--sheet); border-bottom: 1px solid var(--rule); }
.gbar .brand { flex: none; width: calc(var(--side-w) - 32px); font-size: 21px; }
.gbar .nav { flex: none; }
.gbar .gs-slot { flex: 1; max-width: 420px; margin: 0 auto 0 8px; }
.gb-btn { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border: 1px solid transparent; border-radius: 8px; background: none; color: var(--pencil); font-size: 13px; cursor: pointer; }
.gb-btn:hover, .gb-btn[aria-expanded="true"] { background: var(--desk); color: var(--ink); }
/* 头像（设计规范 通用.md「头像」，qm 11-02 定）：圆形，蓝紫渐变 135° --ai-a → --ai-c（与用户气泡同一个渐变），内圈 0.5px 白 35% 高光；白字首字 600，字号 = 尺寸 × 0.42（取整）。
   尺寸 28 / 32（PC 顶栏）/ 40（账号菜单头像卡）/ 48 / 68，用 --av 传；有真头像时是照片圆形裁切 + 0.5px rgba(14,23,38,.1) 描边（首字渐变作占位）。
   别人的头像（人物列表、人物页）不用这个：--blue-soft 底 + --blue 字。 */
.avatar, .gb-avatar { --av: 32px; flex: none; position: relative; width: var(--av); height: var(--av); border: 0; border-radius: 50%; padding: 0; overflow: visible;
  background: linear-gradient(135deg, var(--ai-a), var(--ai-c)); box-shadow: inset 0 0 0 .5px rgba(255,255,255,.35); color: #fff;
  font-size: calc(var(--av) * .42); font-weight: 600; line-height: 1; cursor: pointer; display: grid; place-items: center; }
.avatar { cursor: inherit; }
.avatar.s28 { --av: 28px; } .avatar.s40 { --av: 40px; } .avatar.s48 { --av: 48px; } .avatar.s68 { --av: 68px; }
.avatar img { position: absolute; inset: 0; width: 100%; height: 100%; border-radius: 50%; object-fit: cover; box-shadow: 0 0 0 .5px rgba(14,23,38,.1); }
.gb-avatar:hover, .gb-avatar[aria-expanded="true"] { box-shadow: inset 0 0 0 .5px rgba(255,255,255,.35), 0 0 0 3px var(--blue-soft); }      /* PC 悬停外圈 3px --blue-soft */
.gb-menu { position: absolute; top: 48px; z-index: 60; min-width: 190px; padding: 6px; background: var(--sheet); border-radius: 12px;
           box-shadow: var(--sh-float); animation: popIn .14s var(--ease) both; transform-origin: top right; }
#langMenu { right: 62px; max-height: 70vh; overflow-y: auto; }
#acctMenu { right: 12px; width: 240px; max-height: calc(100vh - 60px); overflow-y: auto; }   /* 220 → 240：右侧要放状态字；超出窗口高度时自己滚（账号入口方案 2026-10-30）*/
.gb-menu button, .gb-menu a { display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 10px; border: 0; border-radius: 8px; background: none; color: var(--ink);
           font-size: var(--fs-ms); text-align: left; text-decoration: none; cursor: pointer; }
.gb-menu button:hover, .gb-menu a:hover, .gb-menu button:focus-visible { background: var(--desk); }
.gb-menu .on { font-weight: 600; color: var(--blue); }
.gb-menu .on::after { content: ""; margin-left: auto; width: 16px; height: 16px; background: currentColor; flex: none;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / contain no-repeat; }   /* 对号：图标库 check（笔画 2.4），不再用字符 ✓ */
.gb-menu .danger { color: var(--danger); }
.gb-menu .am-head { padding: 8px 10px; margin-bottom: 4px; }   /* 头像卡：邮箱 + 会员等级 + ›，整块可点进个人中心 */
.am-who { flex: 1; min-width: 0; display: grid; gap: 2px; }
.am-mail { font-size: var(--fs-sm); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; }
.am-plan { font-size: var(--fs-xs); color: var(--pencil); }
.am-go { color: var(--pencil); flex: none; }
.am-grp { font-size: var(--fs-xs); color: var(--pencil); padding: 8px 10px 2px; }   /* 组标题 12 / --pencil，组间不画线 */
.gb-menu.acct button:not(.am-head), .gb-menu.acct a { min-height: 34px; padding-top: 0; padding-bottom: 0; }   /* 项高 34、字 14 */
.gb-menu.acct .en-hint { margin-left: auto; text-align: right; white-space: nowrap; max-width: 55%; overflow: hidden; text-overflow: ellipsis; }
.am-sep { height: 1px; background: var(--rule); margin: 6px 4px; }
.side { padding: 14px 12px 12px; display: flex; flex-direction: column; gap: 12px; min-height: 0; }
.side-ctx { display: none; flex: 1; min-height: 0; flex-direction: column; gap: 10px; overflow-y: auto; margin: 0 -4px; padding: 0 4px; }
.side-ctx.on { display: flex; }
.side-ctx .pp-list { border: 0; padding: 0; overflow: visible; }
.foot-row { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.foot-row #whoami { min-width: 0; }
.side-top { display: grid; gap: 8px; }
.brand { font-weight: 700; font-size: 20px; letter-spacing: .08em; }
/* center column top: tabs + search, then the slim bar that follows the tab */
.nav { display: flex; gap: 2px; }
.nav button { border: 0; background: none; font-size: var(--fs-ms); height: 30px; padding: 0 12px; border-radius: 7px; cursor: pointer; color: var(--pencil); }
.nav button:hover { background: rgba(0,0,0,.04); }
.nav button.on { background: var(--desk); color: var(--ink); font-weight: 600; }
.ctxbar { display: none; align-items: center; gap: 8px; padding: 5px 20px; border-bottom: 1px solid var(--rule); min-height: 38px; font-size: 13px; }
.ctxbar.on { display: flex; }
.small-btn { padding: 2px 10px; font-size: 13px; }
.seg { display: flex; gap: 2px; background: var(--desk); border-radius: 7px; padding: 2px; }
.seg button { border: 0; background: none; padding: 3px 10px; border-radius: 5px; cursor: pointer; font-size: 13px; color: var(--pencil); }
.seg button.on { background: var(--sheet); color: var(--ink); font-weight: 600; box-shadow: 0 1px 2px rgba(0,0,0,.06); }
#newNote { margin-left: auto; height: 38px; border-radius: 12px; font-size: 15px; padding: 0 16px; }   /* 主按钮标准：38 / 圆 12 / 字 15 */
.side-foot { margin-top: auto; display: grid; gap: 6px; }
.foot-links { display: flex; justify-content: space-between; }
.keys div { margin: 4px 0; font-size: 13px; }
.today-box { font-size: 12px; display: grid; gap: 2px; }
.tb-sum { color: var(--pencil); margin-bottom: 2px; }
.tb-item { border: 0; background: none; text-align: left; padding: 2px 6px; border-radius: 8px; cursor: pointer; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tb-item:hover { background: rgba(0,0,0,.05); }
.tb-bd { color: var(--pencil); padding: 0 6px; }

/* mini calendar */
.cal { background: var(--sheet); border-radius: 8px; padding: 10px; }
.cal-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; font-weight: 600; font-size: 13px; }
.cal-head button { border: 0; background: none; cursor: pointer; color: var(--pencil); padding: 2px 6px; }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; text-align: center; font-size: 12px; }
.cal-grid .wd { color: var(--pencil); font-size: 11px; }
.cal-grid button { border: 0; background: none; border-radius: 4px; padding: 3px 0; cursor: pointer; position: relative; }
.cal-grid button:hover { background: var(--desk); }
.cal-grid button.out { color: var(--pencil); }   /* 非本月的日期：用 --pencil（--faint 对白底 2.55，读不清；规范 ㉔） */
.cal-grid button.today { background: var(--mark); font-weight: 700; }
.cal-grid button.has::after { content: ""; position: absolute; left: 50%; bottom: 1px; width: 3px; height: 3px; margin-left: -1.5px; border-radius: 50%; background: var(--pencil); }
.cal-grid button.open::after { background: var(--warn); }
.cal-grid button.today.has::after { background: #fff; }   /* 今天格子是 --blue 底，--pencil 的点看不见（规范 ㉕） */
/* 有冲突的日子：右上角一个红点（不只靠颜色：另有 title / aria 文字「有冲突」），周条上同一做法 */
.cal-grid button.clash::before { content: ""; position: absolute; top: 2px; right: 3px; width: 6px; height: 6px; border-radius: 50%; background: var(--danger); box-shadow: 0 0 0 1.5px var(--sheet); }
.cal-grid button.clash.today::before { box-shadow: 0 0 0 1.5px var(--blue); }

/* main + views */
.main { background: var(--sheet); overflow: hidden; display: flex; flex-direction: column; border-left: 1px solid var(--rule); border-right: 1px solid var(--rule); }
.view { display: none; flex: 1; min-height: 0; flex-direction: column; }
.view.on { display: flex; }
.pad { padding: 24px 32px; overflow-y: auto; }
.narrow { max-width: 760px; }
.row { display: flex; gap: 10px; align-items: center; margin: 10px 0; flex-wrap: wrap; }
.row input[type=number] { width: 90px; border: 1px solid var(--rule); border-radius: var(--r-sm); padding: 4px 8px; }
textarea, input[type=search] { width: 100%; border: 1px solid var(--rule); border-radius: var(--r-sm); padding: 8px 10px; background: var(--sheet); resize: vertical; }
h2 { font-size: 17px; margin: 28px 0 6px; }
h2:first-child { margin-top: 0; }

/* notebook */
.nb-bar { display: flex; justify-content: space-between; align-items: center; padding: 10px 24px; border-bottom: 1px solid var(--rule); }
.scroller { flex: 1; overflow-y: auto; padding: 0 24px 40vh; scroll-behavior: auto; overflow-anchor: none; }   /* days are added above the view by script, which keeps the view still with an anchor element; the browser's own anchoring on top of that moved it twice (T131) */
.sentinel { height: 1px; }
.month { margin: 28px 0 4px 0; font-size: 13px; color: var(--pencil); font-weight: 600; }
.day { display: grid; grid-template-columns: var(--gutter) minmax(0, 1fr); border-top: 1px solid var(--rule); padding: 8px 0 6px; }
.day .g { padding-top: 1px; cursor: pointer; user-select: none; }
.day .g .n { font-size: 22px; line-height: 1.1; font-weight: 700; display: inline-block; padding: 0 4px; border-radius: 3px; }
.day .g .w { font-size: 12px; color: var(--pencil); margin-left: 4px; }
.day .g .lb { display: block; font-size: 12px; color: var(--blue); margin: 2px 0 0 4px; cursor: text; min-height: 1em; max-width: 84px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.day .g .lb:empty::before { content: "＋标注"; color: transparent; }
.day:hover .g .lb:empty::before { color: var(--pencil); }
.day.today .g .n { background: var(--mark); }
.day.day.future.empty .g .n, .day.past.empty .g .n { color: var(--pencil); font-weight: 400; font-size: 17px; }
.day .body { min-width: 0; }

:root { --ic-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E"); }   /* = icons.js 的 check（同一条 path），给 CSS mask 用 */

.ln { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0 6px; padding: 1px 0; position: relative; border-radius: 4px; }
.ln:hover { background: #FAFBFC; }
.ln .k { flex: none; width: 48px; display: flex; justify-content: flex-end; align-items: center; gap: 4px; padding-top: 3px; color: var(--pencil); font-size: 13px; }
.ln .ck { width: 15px; height: 15px; border: 1.5px solid var(--line); border-radius: 50%; background: none; padding: 0; cursor: pointer; flex: none; }
.ln .ck:hover { border-color: var(--done); }
/* 已完成：圆点换成绿色对号（2026-10-26 qm 定）。对号用的是 icons.js 里 `check` 那条标准路径（同一条 path），做成 mask 填 --done 令牌色，
   不用字符 ✓、不临时写颜色；圆圈自己（大小、点击区）不变——只是完成后不再是实心圆，而是同一个位置上一个绿色对号。 */
.ln.done .ck, .kid.done .kck { background: none; border-color: transparent; box-shadow: none; position: relative; }
.ln.done .ck::before, .kid.done .kck::before { content: ""; position: absolute; inset: -2px; background: var(--done);
  -webkit-mask: var(--ic-check) center / contain no-repeat; mask: var(--ic-check) center / contain no-repeat; }
.ln .num { min-width: 14px; text-align: right; }
.ln .t { flex: 1 1 180px; min-width: 0; outline: none; white-space: pre-wrap; word-break: break-word; padding: 1px 2px; }
.ln.ghost .t:empty::before { content: attr(data-ph); color: var(--pencil); opacity: 0; transition: opacity .15s var(--ease); }   /* PC：每一天底部那行空白整行都能点（cursor: text，行高不变），但占位字平时不显示——空日每行都写「在这天写」太乱（qm 10-31）；鼠标悬停到这一行、或在里面编辑时才淡淡出现 */
.ln.ghost:hover .t:empty::before, .ln.ghost .t:focus:empty::before { opacity: .6; }
.ln.ghost:hover .t:focus:empty::before { opacity: 1; }
.day.today .ln.ghost .t:empty::before { opacity: .6; }   /* 今天末尾那一行是最常用的入口，屏幕上只有一个，保留常驻的「写点什么…」 */
.day.today .ln.ghost:hover .t:empty::before, .day.today .ln.ghost .t:focus:empty::before { opacity: 1; }
body.mobile .ln.ghost .t:empty::before { opacity: .6; }   /* 手机宽度没有悬停：每一天底部的占位字常显（规范 H4，平时 60%，点进去 100%），点一下就能输入；iOS 屏幕小点不准，qm 10-31 要求保持原样 */
body.mobile .ln.ghost .t:focus:empty::before { opacity: 1; }
.ln.sub { margin-left: 50px; padding-left: 8px; border-left: 2px solid var(--rule); border-radius: 0 4px 4px 0; }
.ln.sub .k { width: 22px; }
.ln.sub .ck { width: 12px; height: 12px; opacity: 0; }
.ln.sub:hover .ck, .ln.sub.assign .ck, .ln.sub.done .ck, .ln.sub:focus-within .ck { opacity: 1; }
.ln.sub .t { color: var(--ink-2); font-size: var(--fs-ms); }
.ln.sub.assign .t { color: var(--blue); }
.ln.sub.done .t { color: var(--pencil); text-decoration: line-through; }
.ln.fold { display: none; }
.ln.done .t { color: var(--pencil); }
/* 已完成的事项：文字上画一条横线（2026-10-26 qm 定，PC 和 H5 同一份）。线色跟文字（--pencil），细 1px；只画在事项的文字上，
   不画在「原定」「冲突」「提醒」这些标签上（它们在 .chips 里，不在 .t 里），所以互不遮挡。详情行原来勾完成就是划线的（上面 .ln.sub.done），保持不变。 */
.ln.done .t, .ln.item-done .t { text-decoration: line-through; text-decoration-thickness: 1px; text-decoration-color: currentColor; }
.ln.item-done .t, .ln.sub.item-done .t { color: var(--pencil); }   /* .ln.sub .t 在 theme.css 里也有颜色,特异性相同、加载更晚,所以详情行要多写一层 .sub 才压得住(Codex 线上验收发现详情行没变灰) */   /* 事项勾完成：它下面的详情行（不管自己勾没勾）也变灰、划线（qm 10-26） */
.chip.orig { background: none; color: var(--pencil); cursor: default; padding: 0 2px; }
button.more { background: none; border: 0; color: var(--pencil); font-size: 12px; cursor: pointer; padding: 0 4px; white-space: nowrap; }
.ln.flash { animation: flash 1.2s ease-out; }
@keyframes flash { 0% { background: var(--mark); } 100% { background: transparent; } }
.ln.enter { animation: enter .3s ease-out; }
@keyframes enter { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
.ln.leaving { transition: opacity .2s, max-height .25s .1s; opacity: 0; max-height: 0 !important; overflow: hidden; }
.ln .tm { font-weight: 600; }
.ln .chips { display: flex; gap: 4px; flex-wrap: wrap; padding-top: 2px; flex: none; max-width: 40%; }
.chip { font-size: 12px; border-radius: 10px; padding: 0 8px; background: var(--blue-soft); color: var(--blue); border: 0; cursor: pointer; white-space: nowrap; }
.chip.place { background: var(--desk); color: var(--pencil); cursor: default; }
.chip.go { background: none; color: var(--pencil); text-decoration: underline; }
.ln .ops { flex: none; margin-left: auto; display: flex; gap: 2px; align-items: center; padding-top: 1px; opacity: 0; }
.ln:hover .ops, .ln:focus-within .ops, .ln .ops.open { opacity: 1; }
.ln.sub .ops, .ln.ghost .ops { display: none; }
.ln.ghost .t { cursor: text; }
.day.empty { padding: 4px 0 2px; }
.day.empty .ln.ghost { min-height: 0; }
.ops button { border: 0; background: none; color: var(--pencil); cursor: pointer; font-size: 12px; padding: 2px 6px; border-radius: 4px; }
.ops button:hover { background: var(--desk); color: var(--ink); }
.ops input[type=date] { font-size: 12px; border: 1px solid var(--rule); border-radius: 4px; }



/* assistant */
.assist { display: flex; flex-direction: column; min-height: 0; }
.chat { flex: 1; display: flex; flex-direction: column; min-height: 0; }
.msgs { flex: 1; overflow-y: auto; padding: 12px 16px; display: flex; flex-direction: column; gap: 8px; }
.msg { max-width: 92%; padding: 6px 10px; border-radius: 8px; font-size: var(--fs-ms); white-space: pre-wrap; word-break: break-word; }
.msg.user { align-self: flex-end; background: var(--ink); color: #fff; }
.msg.assistant { align-self: flex-start; background: var(--sheet); }
.msg .act { display: flex; gap: 6px; align-items: baseline; font-size: 12px; color: var(--pencil); margin-top: 4px; border-top: 1px dashed var(--rule); padding-top: 4px; }
.msg .act button { border: 0; background: none; color: var(--blue); cursor: pointer; font-size: 12px; padding: 0; }
.msg.wait { color: var(--pencil); }
/* 聊天里的字可以选中复制（手机上长按也可以） */
.msgs, .msg .txt { user-select: text; -webkit-user-select: text; -webkit-touch-callout: default; }
.msg-copy { display: block; margin-top: 4px; border: 0; background: none; padding: 0; color: var(--pencil); font-size: 12px; cursor: pointer; opacity: 0; }
.msg:hover .msg-copy, .msg-copy:focus-visible { opacity: 1; }
@media (hover: none) { .msg-copy { opacity: 1; } }
.msg .steps { font-size: 12px; color: var(--pencil); margin-bottom: 4px; white-space: normal; }
.msg .steps summary { cursor: pointer; }
.msg .steps ul, .msg .live { margin: 2px 0 0; padding-left: 16px; font-size: 12px; color: var(--pencil); white-space: normal; }
.msg .live:empty { display: none; }
.msg .act span { flex: 1; min-width: 0; color: var(--ink); }
.chat-in { display: flex; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--rule); align-items: flex-end; }
.chat-in textarea { resize: none; min-width: 0; flex: 1; min-height: 56px; max-height: 196px; }
.chat-in .btn { white-space: nowrap; flex: none; }

/* people */
.pp { display: grid; grid-template-columns: 260px minmax(0, 1fr); flex: 1; min-height: 0; }
.pp-list { border-right: 1px solid var(--rule); padding: 16px; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; }
.pp-list .pi { display: flex; justify-content: space-between; border: 0; background: none; text-align: left; padding: 6px 8px; border-radius: 8px; cursor: pointer; width: 100%; }
.pp-list .pi:hover, .pp-list .pi.on { background: var(--desk); }
.pp-list .pi small { color: var(--pencil); font-size: var(--fs-xs); }
.pp-detail { padding: 24px 32px; overflow-y: auto; }
.pp-detail h2 { font-size: var(--fs-xl); margin: 0 0 12px; }     /* 实体详情页标题（人物名 / 地点名）：22 */
.pp-detail h2 ~ h2 { font-size: var(--fs-lg); font-weight: 600; margin: 20px 0 8px; }     /* 「画像」「相关记录」等分区小标题：17/600，和人名拉开层级（规范 ㉑） */
.fields { display: grid; grid-template-columns: 70px minmax(0, 1fr); gap: 6px 10px; align-items: center; max-width: 520px; font-size: var(--fs-ms); }
.fields input, .fields textarea { border: 1px solid var(--rule); border-radius: 8px; padding: 4px 8px; width: 100%; box-sizing: border-box; }
.fields input { height: var(--h-sm); }   /* 32，不是 32.4（行高叠出来的零头，规范 ㉓） */
.profile { background: var(--desk); border-radius: 8px; padding: 12px 14px; white-space: pre-wrap; font-size: var(--fs-ms); max-width: 680px; }
.tl { max-width: 680px; }
.tl .tli { display: grid; grid-template-columns: 90px minmax(0, 1fr); gap: 8px; padding: 4px 0; border-bottom: 1px solid var(--rule); font-size: var(--fs-ms); cursor: pointer; }
.tl .tli:hover { background: #FAFBFC; }
.tl .tli .d { color: var(--pencil); }
.tl .tli.future .d { color: var(--blue); font-weight: 600; }
.empty { color: var(--pencil); }
.sres .tli { cursor: pointer; }

/* import preview */
.prev { font-size: var(--fs-ms); border: 1px solid var(--rule); border-radius: 8px; padding: 10px 14px; max-height: 360px; overflow-y: auto; }
.prev .pd { color: var(--pencil); font-size: 12px; margin-top: 6px; }
.prev .sub { padding-left: 20px; color: var(--ink-2); }

/* toasts + jump */
.toasts { position: fixed; right: calc(var(--assist-w) + 20px); bottom: 20px; display: grid; gap: 8px; z-index: 60; }   /* above the detail drawer (22), the search pane (20) and the phone chat (30): an undo prompt is never covered (T129) */
.toast { background: var(--ink); color: #fff; padding: 7px 12px; font-size: var(--fs-sm); max-width: 360px; display: flex; gap: 10px; align-items: center; }   /* 规范 H5（以 Mac 已落地的值为准）：字 13、内边距 7×12、圆角 12（ui.css），一行，不占一整排 */
.toast button { border: 0; background: none; color: var(--mark); cursor: pointer; padding: 0; }
.jump { border: 0; border-radius: 10px; padding: 16px 18px; width: 340px; box-shadow: var(--sh-dialog); }
.jump label { display: block; font-size: 13px; color: var(--pencil); margin-bottom: 6px; }
.jump input { width: 100%; border: 1px solid var(--rule); border-radius: var(--r-sm); padding: 8px 10px; font-size: 16px; }
.jump::backdrop { background: rgba(31,42,55,.15); }

@media (prefers-reduced-motion: reduce) { * { scroll-behavior: auto !important; animation: none !important; transition: none !important; } }

/* pictures */
.pics { display: inline-flex; gap: 4px; flex-wrap: wrap; }
.pic { border: 0; padding: 0; background: none; cursor: zoom-in; border-radius: 6px; line-height: 0; }
.pic img { height: 40px; width: auto; max-width: 80px; object-fit: cover; border-radius: 6px; display: block; }
.pic:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; }
.photo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 8px; margin-bottom: 8px; }
.photo-grid .pic img { height: 96px; width: 100%; max-width: none; }
.msg-pics { margin-bottom: 4px; }
.msg-pics .pic img { height: 64px; max-width: 120px; }
.img-tray { display: flex; gap: 8px; flex-wrap: wrap; padding: 8px 16px 0; border-top: 1px solid var(--rule); }
.pic-up { position: relative; line-height: 0; }
.pic-up { width: 56px; height: 56px; flex: none; }                       /* 固定大小的方块；原来 height 56 + width auto + max-width 96 + cover，宽图只露中间一条、竖图压成细线（T149） */
.pic-up img { display: block; width: 56px; height: 56px; object-fit: contain; background: var(--desk); border-radius: 6px; }   /* 整张图都看得见（contain），底下一块浅灰垫着 */
.pic-up.zoomable { cursor: zoom-in; border-radius: 6px; }
.pic-up.zoomable:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; }
.pic-up.err img { opacity: .4; outline: 1px solid #c33; }
.pic-x { position: absolute; top: -6px; right: -6px; width: 20px; height: 20px; line-height: 18px; padding: 0; border-radius: 50%; border: 0; background: var(--ink); color: #fff; cursor: pointer; font-size: var(--fs-ms); }
.pic-st { position: absolute; left: 0; right: 0; bottom: 0; font-size: 11px; line-height: 16px; text-align: center; color: #fff; background: rgba(0,0,0,.5); border-radius: 0 0 6px 6px; }
.assist.drop { outline: 2px dashed var(--blue); outline-offset: -4px; }
.pic-dlg { border: 0; padding: 12px; border-radius: 10px; max-width: min(92vw, 1000px); }
.pic-dlg::backdrop { background: rgba(0,0,0,.6); }
.pic-dlg img { display: block; max-width: 100%; max-height: 78vh; margin: 0 auto; transform-origin: center; transition: transform .12s ease-out; cursor: zoom-in; touch-action: none; user-select: none; -webkit-user-drag: none; }
.pic-dlg img.zoomed { cursor: grab; transition: none; }
.pic-stage { overflow: hidden; border-radius: 6px; }   /* 放大后超出的部分裁在图框里，不盖到标题和按钮上 */
.pic-nav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2; width: 36px; height: 56px; border: 0; border-radius: var(--r-sm, 8px); background: rgba(14,23,38,.45); color: #fff; font-size: 26px; line-height: 1; cursor: pointer; }
.pic-nav:hover { background: rgba(14,23,38,.7); }
.pic-nav[hidden] { display: none; }
.pic-prev { left: 8px; } .pic-next { right: 8px; }
.pic-count { text-align: center; font-size: var(--fs-sm, 13px); color: var(--pencil); margin-top: 6px; }
.pic-count[hidden] { display: none; }
@media (max-width: 760px) { .pic-nav { width: 44px; height: 64px; } .pic-dlg { max-width: 100vw; } }
.pic-dlg details { margin-top: 8px; font-size: 13px; color: var(--pencil); }
.pic-dlg .cap { white-space: pre-wrap; margin-top: 4px; }
.pic-close { position: absolute; top: 4px; right: 8px; border: 0; background: none; font-size: 22px; cursor: pointer; }

/* search box next to the logo; focusing it opens the results over the middle column */
.gs-slot { height: 28px; display: flex; align-items: center; }
.gs-slot .gsearch { height: 28px; }
.gsearch { width: 100%; min-width: 0; border: 1px solid var(--rule); border-radius: 14px; padding: 3px 10px; font-size: 13px; background: var(--sheet); }
.gsearch:focus { outline: none; border-color: var(--blue); }
/* focused: the box grows in place over the tabs' right side; results cover the page below the tab bar only */
.gbar .gs-slot { transition: max-width .18s ease; }
body.searching .gbar .gs-slot { max-width: 520px; }
body.searching .gsearch { font-size: 15px; height: 32px; border-color: var(--blue); }
body.searching .gs-slot { height: 32px; }
.search-pane { position: fixed; z-index: 20; left: var(--side-w); right: var(--assist-w); top: var(--topbar-h, 52px); bottom: 0;
  background: var(--sheet); padding: 18px 28px 24px; overflow-y: auto; border-left: 1px solid var(--rule); border-right: 1px solid var(--rule); }
.search-pane .sp-empty { color: var(--pencil); font-size: var(--fs-ms); }
.search-pane h4 { margin: 18px 0 6px; font-size: 12px; color: var(--pencil); font-weight: 600; }
.search-pane .hit { display: flex; gap: 8px; padding: 5px 6px; border-radius: 6px; cursor: pointer; font-size: var(--fs-ms); }
.search-pane .hit:hover, .search-pane .hit.on { background: var(--desk); }
.search-pane .hit small { color: var(--pencil); }
.pp-head { display: flex; gap: 6px; }
.pp-head input { flex: 1; min-width: 0; }
.pp-head .btn { height: 38px; padding: 0 12px; border-radius: 12px; font-size: 15px; display: inline-flex; align-items: center; justify-content: center; }   /* 主按钮 38 / 圆 12 / 字 15 */
.pi.member { padding-left: 24px; }
.pi.member span::before { content: "└ "; color: var(--pencil); }
.pi small.of { margin-left: 6px; }
.dlg-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
.jump select, .jump input + label, .jump select + label { margin-top: 10px; }
.jump select { width: 100%; border: 1px solid var(--rule); border-radius: var(--r-sm); padding: 8px 10px; font-size: 16px; background: var(--sheet); }
.members { display: flex; gap: 6px; flex-wrap: wrap; margin: 4px 0 8px; }

/* person popover over the notebook */
.pop { position: fixed; z-index: 25; width: 320px; max-height: 70vh; overflow-y: auto; background: var(--sheet); border-radius: 10px;
  box-shadow: var(--sh-float); padding: 14px 16px; }
.pop h3 { margin: 0 0 4px; font-size: 16px; }
.pop .meta { font-size: 12px; color: var(--pencil); margin-bottom: 6px; }
.pop .sec { font-size: 12px; color: var(--pencil); margin-top: 10px; }
.pop ul { margin: 4px 0; padding-left: 16px; font-size: 13px; }
.pop .x { position: absolute; top: 6px; right: 10px; border: 0; background: none; color: var(--pencil); cursor: pointer; font-size: 18px; }
.pop .row { margin: 8px 0 0; }

.ln.editing { background: #FAFBFC; box-shadow: inset 2px 0 0 var(--blue); }

/* detail page drawer */
.drawer { position: fixed; z-index: 22; top: var(--topbar-h, 52px); bottom: 0;   /* 在顶栏下面:原来 top:0 被顶栏(z 30)盖掉了标题栏 */
  right: var(--assist-w); width: min(46vw, 560px, calc(100vw - var(--assist-w) - 24px)); background: var(--sheet);   /* 贴着助理栏的左边;助理栏收起时 --assist-w 是 0,就贴着窗口右缘(T122:原来写死 clamp(360px,30vw,480px),收起后悬空 384px) */
  border-left: 1px solid var(--rule); box-shadow: -8px 0 24px rgba(31,42,55,.08); display: flex; flex-direction: column; }
.drawer[hidden] { display: none; }
.dr-head { display: flex; justify-content: space-between; gap: 12px; padding: 14px 18px 8px; border-bottom: 1px solid var(--rule); }
.dr-title { font-weight: 600; font-size: 16px; }
/* 人物抽屉(T107):和详情页同一个抽屉,里面是这个人;没有编辑工具栏、没有加块按钮 */
.drawer.person .rt-bar, .drawer.person .dr-add, .drawer.person #drBlocks { display: none; }
.pdr-list { margin: 2px 0 8px; padding: 0; list-style: none; display: grid; gap: 2px; }
.pdr-list li { padding: 6px 8px; border-radius: 8px; font-size: var(--fs-ms); cursor: pointer; }
.pdr-list li:hover { background: var(--blue-soft); }
.pdr-profile { white-space: pre-wrap; font-size: 13px; color: var(--ink); margin: 2px 0 8px; }
.dr-meta { font-size: 12px; color: var(--pencil); }
.dr-x { border: 0; background: none; font-size: 22px; color: var(--pencil); cursor: pointer; align-self: flex-start; }
.dr-scroll { flex: 1; overflow-y: auto; padding: 12px 18px; }
.dr-blocks { display: grid; gap: 12px; align-content: start; }
.dr-info { display: grid; gap: 8px; margin-bottom: 14px; }
.dr-info:empty { display: none; }
.dr-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; font-size: 13px; }
.dr-row .lab { color: var(--pencil); font-size: 12px; min-width: 30px; }
.dr-kids { border-left: 2px solid var(--rule); padding-left: 10px; display: grid; gap: 2px; }
.dr-kids .lab { color: var(--pencil); font-size: 12px; margin-bottom: 2px; }
.kid { display: flex; gap: 6px; align-items: flex-start; }
.kid .kck { flex: none; width: 13px; height: 13px; margin-top: 6px; border: 1.5px solid var(--line); border-radius: 50%; background: none; padding: 0; cursor: pointer; }

.kid textarea { display: block; flex: 1; min-width: 0; border: 0; outline: none; resize: none; overflow: hidden; font: inherit; font-size: var(--fs-ms); line-height: 1.6; padding: 1px 2px; background: transparent; color: var(--ink-2); }
.kid.assign textarea { color: var(--blue); }
.kid.done textarea, .kid.item-done textarea { color: var(--pencil); text-decoration: line-through; }
.kid-add { justify-self: start; border: 0; background: none; color: var(--pencil); font-size: 12px; cursor: pointer; padding: 2px 0; }
.kid-add:hover { color: var(--ink); }
.dr-empty { color: var(--pencil); font-size: 13px; }
.blk { border: 1px solid var(--rule); border-radius: 8px; padding: 8px 10px; position: relative; }
.blk .bx { position: absolute; top: 4px; right: 6px; border: 0; background: none; color: var(--pencil); cursor: pointer; opacity: 0; }
.blk:hover .bx, .blk:focus-within .bx, .blk.on .bx { opacity: 1; }
.blk.on { border-color: var(--blue); box-shadow: 0 0 0 2px var(--blue-soft); }
.blk:focus { outline: none; }
/* No hover on a phone: keep the × and the delete key path usable there. */
@media (hover: none) { .blk .bx { opacity: 1; } }
.blk textarea { width: 100%; border: 0; outline: none; resize: none; font: inherit; line-height: 1.6; min-height: 72px; background: transparent; }
.blk .bk { font-size: 11px; color: var(--pencil); margin-bottom: 4px; }
.blk audio { width: 100%; }
.blk .tx { white-space: pre-wrap; font-size: var(--fs-ms); background: var(--desk); border-radius: 6px; padding: 6px 8px; margin-top: 6px; }
.blk .tx-h { font-size: 11px; color: var(--pencil); margin-top: 6px; }
.blk img.pv { max-width: 100%; max-height: 260px; border-radius: 6px; cursor: zoom-in; display: block; }
.blk a.fl { display: flex; gap: 8px; align-items: baseline; color: var(--ink); text-decoration: none; }
.blk a.fl:hover { text-decoration: underline; }
.dr-add { display: flex; gap: 6px; align-items: center; padding: 10px 18px 14px; border-top: 1px solid var(--rule); flex-wrap: wrap; }
.dr-add button.rec { background: var(--warn-soft); border-color: #E5A29A; color: var(--danger); }
.drawer.drop { outline: 2px dashed var(--blue); outline-offset: -4px; }

.login-card .tabs { display: flex; gap: 4px; background: var(--desk); border-radius: 8px; padding: 3px; }
.login-card .tabs button { flex: 1; border: 0; background: none; padding: 5px 0; border-radius: 6px; cursor: pointer; font-size: var(--fs-ms); }
.login-card .tabs button.on { background: var(--sheet); font-weight: 600; box-shadow: 0 1px 2px rgba(0,0,0,.06); }
#whoami { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* first-run tour and the example bar */
.tour { position: fixed; inset: 0; z-index: 40; background: rgba(31,42,55,.35); display: grid; place-items: center; }
.tour[hidden] { display: none; }
.tour-card { background: var(--sheet); border-radius: 12px; width: min(520px, 92vw); padding: 24px 28px 18px; box-shadow: var(--sh-dialog); }
.tour-step { font-size: 12px; color: var(--pencil); }
.tour-card h2 { margin: 2px 0 10px; font-size: 20px; }
.tour-body p { margin: 0 0 10px; font-size: 15px; line-height: 1.7; }
.tour-demo { background: var(--desk); border-radius: 8px; padding: 8px 12px; font-size: var(--fs-ms); line-height: 1.9; white-space: pre-wrap; }
.tour-nav { display: flex; align-items: center; gap: 8px; margin-top: 16px; }
.tour-dots { flex: 1; display: flex; gap: 5px; justify-content: center; }
.tour-dots span { width: 6px; height: 6px; border-radius: 50%; background: var(--rule); }
.tour-dots span.on { background: var(--ink); }
.sample-bar { display: flex; gap: 10px; align-items: center; padding: 7px 24px; background: #FFFBEA; border-bottom: 1px solid var(--rule); font-size: 13px; }
.sample-bar span:first-child { flex: 1; }
.try-box { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; align-items: flex-start; }
.try { border: 1px solid var(--rule); background: var(--sheet); border-radius: 14px; padding: 2px 12px; cursor: pointer; font-size: 13px; color: var(--blue); text-align: left; }
.try:hover { border-color: var(--blue); }

/* ======================================================================== phone (H5)
   Same markup as the desktop. Everything below only applies on narrow screens; the extra phone-only elements
   (.m-top, .m-tabs, .m-dock, .voice, ...) are hidden on desktop. */
.m-top, .m-tabs, .m-dock, .m-sheet-wrap, .m-only, .m-chat-head, .voice, .hold-btn, .pp-back { display: none; }

@media (hover: none) { .ln:hover .ops { opacity: 0; } .ln:hover { background: none; } }

@media (max-width: 760px) {
  :root { --gutter: 54px; --tabbar: 58px; --dock: 56px; --safe-b: env(safe-area-inset-bottom, 0px); --safe-t: env(safe-area-inset-top, 0px); }
  html, body { height: 100%; overflow: hidden; overscroll-behavior: none; -webkit-text-size-adjust: 100%; }
  body { font-size: 16px; -webkit-tap-highlight-color: transparent; }
  input, textarea, select { font-size: 16px; }              /* iOS zooms the page on focus below 16px */
  button { touch-action: manipulation; }

  /* the three columns become: one page, a top bar, a tab bar and a dock */
  .shell { display: block; height: 100dvh; position: relative; }
  .side { display: none; }
  .main { position: absolute; left: 0; right: 0; top: calc(44px + var(--safe-t)); bottom: calc(var(--tabbar) + var(--dock) + var(--safe-b));
          border: 0; }
  .view { min-height: 0; }
  .view.m-only.on { display: flex; }
  .m-only { display: none; }

  .m-top { display: flex; align-items: center; justify-content: space-between; position: absolute; left: 0; right: 0; top: 0;
           height: calc(44px + var(--safe-t)); padding: var(--safe-t) 8px 0; background: var(--sheet); border-bottom: 1px solid var(--rule); z-index: 5; }
  .m-title { font-weight: 700; letter-spacing: .04em; }
  .m-btn { border: 0; background: none; color: var(--blue); font-size: 15px; min-width: 52px; height: 44px; cursor: pointer; }
  .m-tabs { display: flex; position: absolute; left: 0; right: 0; bottom: 0; height: calc(var(--tabbar) + var(--safe-b)); padding-bottom: var(--safe-b);
            background: var(--sheet); border-top: 1px solid var(--rule); z-index: 6; }
  .m-tabs button { flex: 1; border: 0; background: none; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px;
                   font-size: 11px; color: var(--pencil); cursor: pointer; }
  .m-tabs button i { font-style: normal; font-size: var(--fs-ms); width: 30px; height: 26px; line-height: 26px; border-radius: 11px; text-align: center; }
  .m-tabs button span { font-size: 11px; }
  .m-tabs button.on { color: var(--ink); font-weight: 600; }
  .m-tabs button.on i { background: var(--mark); }

  /* the dock: where you start typing. Tapping it lifts the chat to full screen. */
  .m-dock { display: flex; align-items: center; gap: 8px; position: absolute; left: 10px; right: 10px; z-index: 7;
            bottom: calc(var(--tabbar) + var(--safe-b) + 6px); height: 44px; padding: 0 8px; background: var(--sheet);
            border: 1.5px solid #8C84F0; border-radius: 22px; box-shadow: var(--sh-fab); }
  .m-dock[hidden] { display: none; }
  .m-dock-in, .m-dock-hold { flex: 1; min-width: 0; border: 0; background: none; text-align: left; color: var(--pencil); font-size: 15px; height: 40px; cursor: text; }
  .m-dock-hold { text-align: center; color: var(--ink); font-weight: 600; background: #F2F1FD; border-radius: 18px; touch-action: none; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; }
  .m-icon { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border: 0; background: none; font-size: 18px; cursor: pointer; flex: none; }
  .main { bottom: calc(var(--tabbar) + var(--dock) + var(--safe-b) + 8px); }


  /* the assistant: a full-screen page that slides up from the bottom */
  .assist { position: fixed; inset: 0; z-index: 30; background: var(--sheet); transform: translateY(100%); visibility: hidden;
            transition: transform .24s ease-out, visibility 0s linear .24s; display: flex; flex-direction: column; height: 100dvh; padding-top: var(--safe-t); }
  body.chat-open .assist { transform: none; visibility: visible; transition: transform .24s ease-out; }
  .m-chat-head { display: flex; align-items: center; justify-content: space-between; height: 44px; padding: 0 8px 0 16px; border-bottom: 1px solid var(--rule); flex: none; }
  .chat { flex: 1; min-height: 0; display: flex; flex-direction: column; }
  .msgs { padding: 12px 14px; }
  .msg { font-size: 16px; max-width: 88%; }
  .chat-in { padding: 8px 10px calc(8px + var(--safe-b)); gap: 6px; align-items: center; }
  .chat-in textarea { font-size: 16px; min-height: 40px; max-height: 120px; border-radius: 20px; padding: 8px 14px; }
  .chat-in #imgBtn { padding: 6px 10px; }
  .chat-in .hold-btn { display: none; flex: 1; height: 40px; border: 0; border-radius: 20px; background: #F2F1FD; font-size: 15px; font-weight: 600; touch-action: none; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; }
  .chat-in.voice-mode textarea { display: none; }
  .chat-in.voice-mode .hold-btn { display: block; }
  .chat-in .m-icon { display: inline-flex; }
  .toasts { right: 10px; left: 10px; bottom: calc(var(--tabbar) + var(--dock) + var(--safe-b) + 20px); }
  .toast { max-width: min(calc(100vw - 32px), 360px); justify-self: center; }   /* 手机：宽度跟内容走，居中，不是通栏 */

  /* notebook */
  .gbar, .ctxbar, .ctxbar.on { display: none; }
  .side-ctx { display: block; overflow-y: auto; margin: 0; }
  #sideNotes { padding: 12px 14px; gap: 6px; display: flex; flex-direction: column; overflow-y: auto; flex: 1; min-height: 0; }
  .nlist .ni { padding: 12px 8px; border-bottom: 1px solid var(--rule); border-radius: 0; }
  .scroller { padding: 0 10px 24px; }
  .day { grid-template-columns: var(--gutter) minmax(0, 1fr); }
  .day .g .n { font-size: 20px; }
  .day .g .w { display: block; margin: 0 0 0 4px; font-size: 11px; white-space: nowrap; }
  .day { padding: 6px 0 4px; }
  .day .g .lb { max-width: 48px; }
  .ln { min-height: 40px; padding: 3px 0; align-items: center; }
  .ln .ck { width: 22px; height: 22px; }
  .ln .ck::after { content: ""; position: absolute; inset: -12px; }     /* a 46px touch target around the 22px circle */
  .ln .ck { position: relative; }
  .ln .k { width: 40px; padding-top: 0; gap: 2px; }
  .ln .num { min-width: 12px; font-size: 12px; }
  .ln.sub { margin-left: 18px; padding-left: 6px; }
  .ln.sub .k { width: 14px; }
  .ln .t { font-size: 16px; padding: 4px 2px; }
  .ln.sub .t { font-size: 15px; }
  .ln .chips { max-width: 100%; }
  /* tapping a row opens its action bar (instead of hover) */
  .ln .ops { position: static; opacity: 1; display: none; width: 100%; margin: 0 0 4px 46px; gap: 6px; flex-wrap: wrap; }
  .ln.m-open .ops { display: flex; }
  .ln.sub .ops { display: none; }
  body.mobile .ln.sub.m-open .ops { display: flex; }                      /* 详情行点开后只给「提升为事项」，别的操作属于事项 */
  .ln.sub .ops button:not([data-op="indent"]) { display: none; }
  .ln.sub .t { margin-right: 44px; }                        /* 详情行右端留一块 44 宽的空白：点它展开操作条（文字区是编辑） */
  .ops button { font-size: var(--fs-ms); padding: 8px 12px; border: 1px solid var(--rule); border-radius: 16px; background: var(--sheet); color: var(--ink); }
  .ops input[type=date] { font-size: 16px; padding: 6px; }

  /* people / places: two levels instead of two columns */
  .pp { grid-template-columns: 1fr; position: relative; }
  .pp-list { border: 0; }
  .pp-detail { position: absolute; inset: 0; background: var(--sheet); transform: translateX(100%); transition: transform .22s ease-out; padding: 56px 16px 24px; z-index: 3; visibility: hidden; }
  .pp.m-detail .pp-detail { transform: none; visibility: visible; }
  .pp-back { display: none; position: absolute; left: 4px; top: 4px; z-index: 4; }
  .pp.m-detail .pp-back { display: block; }
  .pad { padding: 16px; }
  .fields { grid-template-columns: 64px minmax(0, 1fr); }
  .tl .tli { grid-template-columns: 72px minmax(0, 1fr); }

  /* the detail page and the person card */
  .drawer:not(.docked) { right: 0; left: 0; width: auto; top: 0; bottom: 0; z-index: 35; padding-top: var(--safe-t); transform: translateX(100%); transition: transform .22s ease-out; border: 0; display: flex; }
  .drawer:not(.docked)[hidden] { display: flex; visibility: hidden; transform: translateX(100%); }
  .drawer:not([hidden]) { transform: none; visibility: visible; }
  .dr-add { padding-bottom: calc(14px + var(--safe-b)); }
  .dr-add button { padding: 8px 14px; font-size: 15px; }
  .pop { left: 0 !important; right: 0; top: auto !important; bottom: 0; width: auto; max-height: 70dvh; border-radius: 16px 16px 0 0; padding-bottom: calc(14px + var(--safe-b)); z-index: 45; }

  /* search: full screen */
  body.searching .gsearch { display: none; }
  .search-pane { left: 0; right: 0; top: 0; padding: calc(56px + var(--safe-t)) 14px 24px; z-index: 40; border: 0; }
  .m-search-bar { position: fixed; left: 10px; right: 10px; top: calc(8px + var(--safe-t)); z-index: 41; display: flex; gap: 8px; }
  .m-search-bar input { flex: 1; border-radius: 20px; padding: 8px 14px; }

  /* the day sheet (calendar + what is left today) comes down from the top */
  .m-sheet-wrap { display: block; position: fixed; inset: 0; z-index: 36; }
  .m-sheet-wrap[hidden] { display: none; }
  .m-sheet-bg { position: absolute; inset: 0; background: rgba(31,42,55,.35); }
  .m-sheet { position: absolute; left: 0; right: 0; background: var(--sheet); padding: 12px 14px 16px; }
  .m-top-sheet { top: 0; padding-top: calc(12px + var(--safe-t)); border-radius: 0 0 16px 16px; max-height: 80dvh; overflow-y: auto; }
  .m-top-sheet .cal-grid button { padding: 9px 0; font-size: 15px; }

  .login-card { width: min(92vw, 360px); padding: 28px 22px; }
  .tour-card { padding: 20px 18px 14px; }
  .sample-bar { padding: 7px 12px; flex-wrap: wrap; }
  .m-list { display: grid; gap: 1px; background: var(--rule); border: 1px solid var(--rule); border-radius: 10px; overflow: hidden; margin: 12px 0; }
  .m-list button, .m-list a { border: 0; background: var(--sheet); text-align: left; padding: 14px 16px; font-size: 16px; }
  .voice { display: block; }
}

/* the push-to-talk sheet (also needs to exist on desktop CSS-wise, but is only ever opened on a phone) */
.voice { position: fixed; left: 12px; right: 12px; bottom: calc(var(--tabbar, 54px) + var(--safe-b, 0px) + 12px); z-index: 60; pointer-events: none;
         transform: translateY(24px); opacity: 0; transition: transform .22s ease-out, opacity .22s ease-out; }
.voice:not([hidden]) { transform: none; opacity: 1; }
.voice-card { position: relative; background: #fff; border-radius: 20px; padding: 14px 18px 22px; min-height: 170px;
              box-shadow: 0 0 0 1.5px var(--blue), var(--sh-float); }
.voice-title { font-weight: 700; font-size: var(--fs-ms); }
.voice-title span { font-size: 10px; background: #E6E3FF; color: #5B50D8; border-radius: 4px; padding: 0 5px; margin-left: 4px; }
.voice-msg { text-align: center; color: var(--pencil); margin: 8px 0 14px; font-size: 15px; }
.voice-bars { display: flex; gap: 3px; justify-content: center; align-items: center; height: 26px; }
.voice-bars i { width: 3px; border-radius: 2px; background: #6C63F0; height: 4px; transition: height .08s linear; }
/* 按住说话每条最长 60 秒（规范 PC规范v1/11-交互规则.md E8、E8b，qm 10-31）：前 50 秒什么计时都不显示（没有已说时长、没有「/ 1:00」、没有进度线），
   也不提示一分钟上限；最后 10 秒（.limit）中间那行换成「还可以说 N 秒」（字 17 / 600，数字 28，--warn），**只有这一行变色**，外圈 --blue、声波不变；取消优先 */
.voice-msg { height: 34px; line-height: 34px; white-space: nowrap; }   /* 提示行高度固定：倒计时里 28 的数字不把卡片撑高，卡片不忽高忽低 */
.voice-msg b { font-size: 28px; line-height: 1; vertical-align: middle; font-variant-numeric: tabular-nums; margin: 0 4px; }
.voice.limit .voice-msg { color: var(--warn); font-size: 17px; font-weight: 600; }
.voice.cancel .voice-card { box-shadow: 0 0 0 1.5px var(--danger), var(--sh-float); }
.voice.cancel .voice-bars i { background: var(--danger); }
.voice.cancel .voice-msg { color: var(--danger); font-size: 15px; font-weight: 400; }   /* 取消优先于倒计时：恢复普通字号 */
.sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; padding: 0; }
.voice.busy .voice-bars i { background: var(--faint); height: 4px !important; }

/* desktop: the list of people / places sits in the left column; the view is the page of one */
body:not(.mobile) .pp { grid-template-columns: minmax(0, 1fr); }
.side-ctx .pp-list .pi { padding: 7px 8px; }
.side-ctx .pp-head input, .side-ctx > input[type=search] { font-size: 15px; padding: 6px 10px; border-radius: 14px; }
.nlist { display: flex; flex-direction: column; gap: 1px; }
.nlist .grp { position: sticky; top: 0; background: var(--paper, #fff); padding: 6px 8px 4px; margin: 6px 0 2px; border-bottom: 1px solid var(--rule); z-index: 1; font-size: 12px; color: var(--ink); }
.nlist .fold-head { position: sticky; bottom: 0; background: var(--paper, #fff); }
.nlist .ni { border: 0; background: none; text-align: left; padding: 8px 8px; border-radius: 8px; cursor: pointer; display: grid; gap: 2px; width: 100%; }
.nlist .ni:hover { background: var(--desk); }
.nlist .ni.on { background: var(--mark); }
.nlist .ni .tt { font-weight: 600; font-size: var(--fs-ms); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nlist .ni .sn { font-size: 12px; color: var(--pencil); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nlist .ni .mt { font-size: 11px; color: var(--pencil); display: flex; gap: 6px; }
.nlist .ni .mt .bad { color: var(--danger); }
.nlist .grp { font-size: 11px; color: var(--pencil); margin: 10px 0 2px; font-weight: 600; box-sizing: border-box; }   /* margin 左右不再加 8：标题原来比列表宽 16（规范 ⑱） */

/* the detail page docked into the 笔记 tab */
.note-page { padding: 0; display: flex; }
.drawer.docked { position: static; width: auto; flex: 1; min-width: 0; box-shadow: none; border-left: 0; z-index: auto; transform: none; visibility: visible; }
.drawer.docked .dr-x { display: none; }
.dr-del { display: none; align-self: flex-start; margin-top: 4px; color: var(--pencil); }
.drawer.docked.free .dr-del { display: inline; }
.note-title { width: 100%; border: 0; border-bottom: 1px solid var(--rule); font-size: 20px; font-weight: 700; padding: 4px 0 8px; background: none; }
.note-title:focus { outline: none; border-color: var(--blue); }
.kid.ro { padding: 2px 0 2px 4px; font-size: var(--fs-ms); }
.recog { display: grid; gap: 8px; border-top: 1px dashed var(--rule); padding-top: 10px; margin-top: 4px; }
.recog:empty { display: none; }
.recog > .lab { font-size: 12px; color: var(--pencil); }
.link-add { display: flex; gap: 12px; align-items: center; }
.link-add .link { padding: 0; font-size: 12px; }
.chip-wrap { display: inline-flex; align-items: center; position: relative; }
.chip-wrap .chip-x { position: absolute; right: -4px; top: -5px; width: 15px; height: 15px; border: 0; border-radius: 50%; padding: 0; line-height: 15px; display: grid; place-items: center;
  font-size: 11px; background: #fff; color: var(--pencil); box-shadow: 0 0 0 1px var(--rule); cursor: pointer; opacity: 0; }
.chip-wrap:hover .chip-x, .chip-wrap:focus-within .chip-x { opacity: 1; }
.chip-wrap .chip-x:hover { color: var(--danger); }
@media (hover: none) { .chip-wrap .chip-x { opacity: 1; } }
/* a finger needs a bigger target than the 15px dot: an invisible ring around it (the look stays the same) */
@media (hover: none) { .chip-wrap .chip-x::before { content: ''; position: absolute; inset: -11px; } .chip-wrap { margin-right: 8px; } }
.recog-plans { display: grid; gap: 2px; flex: 1; }
.rp { border: 0; background: none; text-align: left; display: flex; gap: 8px; padding: 3px 6px; border-radius: 6px; cursor: pointer; font-size: var(--fs-ms); }
.rp:hover { background: var(--desk); }
.rp .d { color: var(--pencil); white-space: nowrap; font-size: 13px; min-width: 64px; }
.rp.done .t { text-decoration: line-through; color: var(--pencil); }
.conflict { background: #FFF4F2; border: 1px solid #F3C7C0; border-radius: 8px; padding: 8px 10px; display: grid; gap: 3px; font-size: 13px; }
.conflict .cm { font-weight: 600; color: var(--danger); }
.conflict .cs { color: var(--ink); }
.conflict .cb { display: flex; gap: 6px; margin-top: 4px; flex-wrap: wrap; }
.ln.flash { background: var(--mark); transition: background .3s; }
.chip.clash { background: var(--warn-soft); color: var(--danger); border: 0; cursor: pointer; font-weight: 600; }
.ln.plan .t { color: var(--ink-2); }
.ln.has-clash .ck { border-color: var(--danger); }
#pop .conflict { border: 0; background: none; padding: 0; }
.pic-up.fileup { min-width: 72px; }
.pic-up .fi { height: 56px; min-width: 72px; padding: 6px 8px; border-radius: 6px; background: var(--desk); font-size: 11px; line-height: 1.4; white-space: pre-wrap; display: flex; align-items: center; justify-content: center; text-align: center; color: var(--ink); word-break: break-all; }
.msg-file { font-size: 12px; background: rgba(255,255,255,.18); border-radius: 6px; padding: 3px 8px; margin-bottom: 4px; }
.msg.assistant .msg-file { background: var(--desk); }

.nlist .ni.tiny { padding: 5px 8px; opacity: .85; }
.nlist .ni.tiny .sn { display: none; }
.fold-head { border: 0; background: none; text-align: left; font-size: 12px; color: var(--pencil); padding: 10px 8px 4px; cursor: pointer; }
.fold-head:hover { color: var(--ink); }
/* the 文件 tab */
.fcounts { display: grid; gap: 4px; font-size: 13px; }
.fcounts div { display: flex; justify-content: space-between; padding: 3px 6px; color: var(--ink); }
.fgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; align-content: start; overflow-y: auto; }
.fcard { border: 1px solid var(--rule); border-radius: 10px; background: var(--sheet); overflow: hidden; display: grid; grid-template-rows: 110px auto; cursor: pointer; text-align: left; padding: 0; }
.fcard:hover { border-color: var(--pencil); }
.fcard .th { background: var(--desk); display: flex; align-items: center; justify-content: center; font-size: 13px; color: var(--pencil); overflow: hidden; }
.fcard .th img { width: 100%; height: 100%; object-fit: cover; }
.fcard .nm { padding: 6px 8px 2px; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fcard .wh { padding: 0 8px 7px; font-size: 11px; color: var(--pencil); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fcard .wh.none { color: var(--danger); }
.fgrid h3 { grid-column: 1 / -1; margin: 8px 0 0; font-size: 12px; color: var(--pencil); font-weight: 600; }
.fgrid .empty { grid-column: 1 / -1; }
/* library (资料库): the grid on the left, the panel of one item on the right; tokens only (theme.css) */
.lib-paste { box-sizing: border-box; height: var(--h-md); padding: 0 var(--sp-3); border: 1px solid var(--rule); border-radius: var(--r-md); font-size: var(--fs-sm); background: var(--sheet); color: var(--ink); }
.lib-wrap { display: flex; gap: 0; height: 100%; min-height: 0; }
.lib-wrap .fgrid { flex: 1; min-width: 0; }
.fcard.on { border-color: var(--pencil); }
.fcoll { display: flex; justify-content: space-between; width: 100%; padding: 3px 6px; background: none; border: 0; color: var(--ink); font-size: 13px; cursor: pointer; border-radius: 6px; text-align: left; }
.fcoll:hover, .fcoll.on { background: var(--hover); }
.fcolls h4 { margin: 10px 6px 2px; font-weight: 600; }
/* the toolbar of this tab. Nothing in it ever wraps INSIDE a control or gets cut; what changes with the room is the NUMBER OF ROWS:
   - the middle column is >= 700px wide (a 1280 window has 672 - see the container query below; 1400 has 758): everything on ONE line. If the room runs
     short on that line the search box shrinks first (down to 96px), then the paste box (down to 150px, its whole hint still shows).
   - narrower (a 1100 window has only ~510px: the assistant panel takes the right side) and on a phone: TWO rows. Row 1 the filters (scrolling sideways if
     they still do not fit), row 2 paste box, search, upload, bin. The two buttons never shrink or wrap.
   Judged by the column's own width (a container query), not the window's. Check every new toolbar at 1280, 1100, 900 and 390
   (tests/js/library_toolbar_check.mjs). */
.main { container-type: inline-size; container-name: mainCol; }
.ctxbar[data-for="files"] { flex-wrap: wrap; row-gap: var(--sp-2); min-width: 0; }
.ctxbar[data-for="files"] > * { flex: 0 0 auto; white-space: nowrap; }
.ctxbar[data-for="files"] #ffilters { flex: 0 1 auto; min-width: 0; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
.ctxbar[data-for="files"] #ffilters::-webkit-scrollbar { display: none; }
.ctxbar[data-for="files"] #ffilters button { flex: 0 0 auto; white-space: nowrap; }
.ctxbar[data-for="files"] .lib-paste { flex: 1 1 260px; min-width: 150px; max-width: 360px; }
.ctxbar[data-for="files"] .lib-search { flex: 0 1 200px; min-width: 96px; width: auto; }
.ctxbar[data-for="files"] .btn { flex: 0 0 auto; }
@container mainCol (max-width: 699px) {
  /* row 1: the filters alone and whole; row 2: the rest */
  .ctxbar[data-for="files"] #ffilters { flex: 1 1 100%; order: 1; }
  .ctxbar[data-for="files"] .lib-paste { order: 2; flex: 1 1 150px; max-width: none; }
  .ctxbar[data-for="files"] .lib-search { order: 3; flex: 1 1 96px; max-width: 200px; }
  .ctxbar[data-for="files"] #addFile { order: 4; }
  .ctxbar[data-for="files"] #libTrash { order: 5; }
}
.lib-paste { box-sizing: border-box; height: var(--h-md); padding: 0 var(--sp-3); border: 1px solid var(--rule); border-radius: var(--r-md); font-size: var(--fs-sm); background: var(--sheet); color: var(--ink); }
.lib-wrap { display: flex; gap: 0; height: 100%; min-height: 0; }
.lib-wrap .fgrid { flex: 1; min-width: 0; }
.fcard.on { border-color: var(--pencil); }
.fcoll { display: flex; justify-content: space-between; width: 100%; padding: 3px 6px; background: none; border: 0; color: var(--ink); font-size: 13px; cursor: pointer; border-radius: 6px; text-align: left; }
.fcoll:hover, .fcoll.on { background: var(--hover); }
.fcolls h4 { margin: 10px 6px 2px; font-weight: 600; }
#libTrash.on { border-color: var(--pencil); }
.lib-detail { flex: 0 0 320px; border-left: 1px solid var(--rule); padding: 14px; overflow-y: auto; display: grid; gap: 10px; align-content: start; background: var(--sheet); }
.lib-detail[hidden] { display: none; }
.lib-head { display: flex; justify-content: space-between; align-items: center; }
.lib-title { font-size: 16px; font-weight: 600; border: 1px solid transparent; border-radius: 6px; padding: 4px 6px; background: none; color: var(--ink); width: 100%; box-sizing: border-box; }
.lib-title:hover, .lib-title:focus { border-color: var(--rule); }
.lib-img { max-width: 100%; border-radius: 8px; cursor: zoom-in; }
.lib-link { display: block; font-size: 12px; color: var(--pencil); overflow-wrap: anywhere; }
.lib-snap { font-size: 13px; color: var(--ink); line-height: 1.55; white-space: pre-wrap; max-height: 220px; overflow-y: auto; }
.lib-note { width: 100%; box-sizing: border-box; border: 1px solid var(--rule); border-radius: 8px; padding: 6px 8px; font-size: 13px; background: var(--sheet); color: var(--ink); resize: vertical; }
.lib-tags, .lib-colls, .lib-acts, .lib-links { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.lib-links > .muted { width: 100%; }
.lib-addtag { border: 1px dashed var(--rule); border-radius: 12px; padding: 2px 8px; font-size: 12px; width: 80px; background: none; color: var(--ink); }
.lib-lk { background: none; border: 1px solid var(--rule); border-radius: 6px; padding: 2px 8px; font-size: 12px; color: var(--ink); cursor: pointer; }
.lib-lk:hover { border-color: var(--rule-strong); }
.lib-colls .chip.on { border-color: var(--pencil); }
@media (max-width: 760px) {
  .lib-detail { position: fixed; inset: 0; z-index: 30; flex: none; border-left: 0; }
  /* a phone has no slim bar for the other tabs, but this one is its only door to paste / search / upload: show it (two rows, from the
     container query above) with touch-size controls */
  body.mobile .ctxbar.on[data-for="files"] { display: flex; padding: var(--sp-2) var(--sp-3); }
  body.mobile .ctxbar[data-for="files"] .lib-paste { flex: 1 1 100%; height: var(--h-lg); font-size: var(--fs-lg); }       /* its own row */
  body.mobile .ctxbar[data-for="files"] .lib-search { flex: 1 1 0; max-width: none; min-width: 0; }                      /* search takes what the two buttons leave */
  body.mobile .ctxbar[data-for="files"] #addFile, body.mobile .ctxbar[data-for="files"] #libTrash { padding: 0 var(--sp-4); }
}
}

.pi.pending { color: var(--accent, var(--danger)); font-weight: 600; }
.crumbs { margin-bottom: 6px; }
.crumbs .link { padding: 0; }
.pend-dlg { width: min(560px, 94vw); max-height: 86vh; overflow: auto; }
.pend-dlg .dlg-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.pend { border: 1px solid var(--line, #ddd); border-radius: 8px; padding: 10px 12px; margin: 8px 0; }
.pend-h { font-weight: 600; }
.pend-a { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 8px; }
.pend-a input { flex: 1 1 140px; min-width: 120px; font-size: 16px; padding: 5px 8px; }
.pend-l { font-size: 13px; color: var(--pencil); margin-top: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.warn { color: #b45309; background: #fef3c7; border-radius: 6px; padding: 6px 10px; }

.nlist .grp { display: flex; justify-content: space-between; align-items: baseline; font-size: 13px; font-weight: 700; color: var(--ink); background: var(--desk); border-radius: 8px; padding: 5px 8px; border-bottom: 0; }
.nlist .grp small { font-weight: 400; color: var(--pencil); font-size: var(--fs-xs); }
.nlist .fold-head { width: 100%; font-size: 13px; font-weight: 600; color: var(--ink); background: var(--desk); border-radius: 8px; padding: 7px 8px; margin-top: 6px; border-top: 1px solid var(--rule); }
.msg.wait.typing { color: var(--ink); }
.msg.wait.typing .txt::after { content: "▍"; color: var(--pencil); margin-left: 1px; }
.msg .sources { margin-top: 6px; font-size: 12px; color: var(--pencil); }
.msg .sources summary { cursor: pointer; }
.msg .sources ul { margin: 4px 0 0; padding-left: 16px; }
.msg .sources li { margin: 2px 0; }
.msg .sources a { color: var(--blue); text-decoration: none; }
.msg .sources a:hover { text-decoration: underline; }
.msg .sources small { color: var(--pencil); }
.nlist button.grp { width: 100%; border: 0; cursor: pointer; text-align: left; justify-content: flex-start; gap: 6px; align-items: center; }
.nlist button.grp .gn { flex: 1; }
.nlist button.grp .car { width: 12px; color: var(--pencil); display: inline-flex; align-items: center; }
.search-pane .sp-none { color: var(--pencil); font-size: 13px; margin: 2px 0 8px; }
.cal-head .cal-nav { display: flex; }
.cal-head .cal-title { font-weight: 600; font-size: 13px; padding: 2px 6px; border-radius: 6px; color: var(--ink); }
.cal-head .cal-title:hover { background: var(--desk); }

/* the circle and the number sit in fixed slots, so every row's circle lines up whatever its number is ("1、" or "10、") */
.ln .k { justify-content: flex-start; gap: 2px; }
.ln .k .ck { margin-left: auto; }
.ln .k .num { flex: none; width: 2.2em; min-width: 0; text-align: left; font-variant-numeric: tabular-nums; }
.ln.sub .k { justify-content: flex-end; }
.ln.sub .k .num { width: 0; }
@media (max-width: 760px) { .ln .k .num { width: 2em; } }

/* assistant column: draggable width, can be hidden entirely (desktop only) */
body:not(.mobile) .assist { position: relative; }
body:not(.mobile) .assist-grip { position: absolute; left: -4px; top: 0; bottom: 0; width: 8px; cursor: col-resize; z-index: 5; }
body:not(.mobile) .assist-grip:hover, body.resizing .assist-grip { background: linear-gradient(90deg, transparent 3px, var(--blue, #3b6ef5) 3px, var(--blue, #3b6ef5) 5px, transparent 5px); }
body.resizing { cursor: col-resize; user-select: none; }
body.assist-off { --assist-w: 0px; }
body.assist-off .assist { display: none; }
body.assist-off .assist-grip { display: none; }
/* 收起 / 展开：助理栏和中栏分界线上、垂直居中的一个安静的小标签（T130 位置，T146 qm「颜色太重，能看见就行」重做样式）。
   独立组件，样式全部收在 .assist-tab 这一个类里（以后可能换成吉祥物，换这一个类就行，位置规则在最后两条）。
   低对比：浅底 + 细边 + 次要灰字，悬停才稍深并加描边。展开时标签在分界线外侧（中栏一侧的空白里），不压聊天气泡；收起后贴窗口右边缘，同一套样式。 */
.assist-tab { position: fixed; top: 50%; transform: translateY(-50%); z-index: 15; cursor: pointer; box-sizing: border-box;
  width: 20px; height: 58px; padding: 0; display: flex; align-items: center; justify-content: center;
  writing-mode: vertical-rl; letter-spacing: .15em; line-height: 1; font-size: var(--fs-xs, 12px); color: var(--pencil);
  background: var(--sheet); border: 1px solid var(--rule);
  transition: background-color var(--t-base) var(--ease), border-color var(--t-base) var(--ease), color var(--t-base) var(--ease), transform var(--t-fast) var(--ease); }
.assist-tab:hover { background: var(--desk); border-color: var(--rule-strong); color: var(--ink); }
.assist-tab:active { transform: translateY(-50%) scale(.97); }
.assist-tab:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
/* 位置：收起 = 贴窗口右边缘（左侧圆角，右边无边）；展开 = 在分界线外侧（右边贴分界线，右侧无边、左侧圆角）。
   在外侧而不是内侧，是为了不压住聊天气泡（T146）；助理栏左边留 40px 挂件位的事以后换吉祥物时再定。 */
body.assist-off .assist-tab { right: 0; border-right: 0; border-radius: var(--r-sm) 0 0 var(--r-sm); }
body:not(.assist-off) .assist-tab { right: var(--assist-w); border-right: 0; border-radius: var(--r-sm) 0 0 var(--r-sm); }
body.mobile .assist-tab, body.mobile .assist-grip { display: none !important; }
/* the chat box: icon buttons, a taller text area so the hint is not cut off */
.chat-in { align-items: flex-end; }
.chat-in .btn.ic { width: 38px; height: 38px; padding: 0; display: inline-flex; align-items: center; justify-content: center; border-radius: 10px; flex: none; }
.chat-in .btn.ic.mic.rec { background: var(--danger); color: #fff; border-color: var(--danger); animation: micpulse 1.2s ease-in-out infinite; }
.chat-in .btn.ic.mic.busy { opacity: .6; }
@keyframes micpulse { 0%,100% { box-shadow: 0 0 0 0 rgba(229,72,77,.45); } 50% { box-shadow: 0 0 0 7px rgba(229,72,77,0); } }
.chat-in textarea { min-height: 64px; line-height: 1.45; }
.chat-in textarea::placeholder { font-size: 13px; }
body:not(.mobile) .mic-live { position: fixed; z-index: 40; right: 16px; bottom: 96px; background: #fff; border-radius: 12px; padding: 10px 14px; box-shadow: 0 0 0 1.5px var(--blue), var(--sh-float); display: flex; align-items: center; gap: 10px; font-size: 13px; }   /* E8b 颜色规则：外圈用品牌蓝，不是紫 */
body:not(.mobile) .mic-live .voice-bars { height: 20px; }
body:not(.mobile) .mic-live .mic-left { margin-left: auto; padding-left: 10px; font-size: var(--fs-sm); font-weight: 600; color: var(--warn); font-variant-numeric: tabular-nums; white-space: nowrap; }   /* E8：录音条右端，--warn，13 / 600，等宽数字 */
body:not(.mobile) .mic-live .mic-left[hidden] { display: none; }
body:not(.mobile) .mic-live[hidden] { display: none; }
@media (max-width: 760px) { .chat-in .btn.ic { width: 38px; height: 38px; } .chat-in .btn.ic.mic.kb { background: var(--ink); color: #fff; } }

/* desktop chat box: the text gets the whole width on top (so the hint is never cut), the buttons sit in a row under it */
body:not(.mobile) .chat-in { display: grid; grid-template-columns: auto auto 1fr auto; grid-template-areas: "text text text text" "img mic . send"; gap: 8px; align-items: center; }
body:not(.mobile) .chat-in #cin { grid-area: text; min-height: 72px; }
body:not(.mobile) .chat-in #imgBtn { grid-area: img; }
body:not(.mobile) .chat-in #micBtn { grid-area: mic; }
body:not(.mobile) .chat-in #sendBtn, body:not(.mobile) .chat-in #stopBtn { grid-area: send; justify-self: end; }
body:not(.mobile) .chat-in #holdBtn { display: none; }
body:not(.mobile) body:not(.mobile) .msgs .older { align-self: center; font-size: 12px; color: var(--pencil); padding: 2px 0 6px; }
.msgs .try-lead { align-self: flex-start; font-size: 12px; color: var(--pencil); margin-top: 6px; }
.msgs .try-tail { margin-top: 0; }

/* 回收站 */
.trash { max-width: 760px; width: 100%; margin: 0 auto; padding-top: 18px; }
.trash-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.trash-head h2 { margin: 0; font-size: 20px; }
.trash-head .btn:first-of-type { margin-left: auto; }
.trash-row { display: flex; align-items: center; gap: 10px; padding: 12px 4px; border-top: 1px solid var(--rule); }
.trash-txt { flex: 1; min-width: 0; }
.trash-txt .tt { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.trash-txt .sn { color: var(--pencil); font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.trash-txt .mt { color: var(--pencil); font-size: 12px; margin-top: 2px; }

/* AI 平台授权 */
.connect { max-width: 760px; width: 100%; margin: 0 auto; padding-top: 18px; }
.connect h3 { margin: 22px 0 6px; font-size: var(--fs-md); font-weight: 700; color: var(--ink); }
.cn-addr { display: flex; align-items: center; gap: 10px; background: var(--desk); border-radius: 10px; padding: 8px 12px; margin: 10px 0; }
.cn-addr .lab { color: var(--pencil); font-size: 13px; flex: none; }
.cn-addr code, .cn-tok { flex: 1; min-width: 0; overflow-wrap: anywhere; font-size: 13px; direction: ltr; }
.cn-new { background: #FFF8E6; border: 1px solid #F0D58C; border-radius: 10px; padding: 12px; margin: 10px 0; display: grid; gap: 8px; }
.cn-tok { display: block; background: #fff; border-radius: 6px; padding: 6px 8px; user-select: all; }
.cn-form { display: flex; gap: 8px; flex-wrap: wrap; }
.cn-form input { flex: 1; min-width: 160px; border: 1px solid var(--rule); border-radius: 8px; padding: 6px 10px; }
.cn-form select { border: 1px solid var(--rule); border-radius: 8px; padding: 6px 8px; background: var(--sheet); }
.cn-how { display: grid; gap: 2px; padding: 8px 0; border-top: 1px solid var(--rule); font-size: var(--fs-ms); }
.cn-how span { color: var(--pencil); }
/* 我的连接（hub.js）：一张简单列表，每行 图标 + 名字 + 一句状态 + 一个按钮 */
.hub-h { margin: 22px 0 8px; font-size: var(--fs-md); font-weight: 700; color: var(--ink); }   /* 二级页分区标题统一 15/700/--ink（规范 ㊸）*/
.hub-list { background: var(--sheet); border: 1px solid var(--rule); border-radius: var(--r-md); }
.hub-row { display: flex; align-items: center; gap: 12px; padding: 12px 14px; min-height: 64px; border-bottom: 1px solid var(--rule); }
.hub-row:last-child { border-bottom: 0; }
.hub-ico { flex: none; width: 36px; height: 36px; border-radius: var(--r-sm); background: var(--desk); display: grid; place-items: center; color: var(--pencil); }
.hub-mid { flex: 1; min-width: 0; }
.hub-name { font-weight: 600; }
.hub-st { font-size: var(--fs-sm); color: var(--pencil); }
.hub-st.ok::before { content: ""; display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--done); margin-right: 6px; vertical-align: 1px; }
.hub-list a.hub-add { text-decoration: none; }
.hub-list .hub-add + .hub-add { border-top: 1px solid var(--rule); }
.hub-st.need { color: var(--warn); }
.hub-st.need::before { content: "!"; display: inline-grid; place-items: center; width: 14px; height: 14px; border-radius: 50%; background: var(--warn); color: #fff; font-size: 11px; font-weight: 700; margin-right: 6px; }
.hub-bad { color: var(--warn); }
body.mobile #connectBox > .trash-head:first-child h2, body.mobile :is(#profileBox, #settingsBox, #helpBox) > .trash-head:first-child h2 { display: none; }   /* 手机顶栏已经写了页面名 */
body.mobile #connectBox > .trash-head:first-child, body.mobile :is(#profileBox, #settingsBox, #helpBox) > .trash-head:first-child { justify-content: flex-end; margin-bottom: 4px; }
.hub-add { display: flex; align-items: center; gap: 8px; width: 100%; padding: 12px 14px; border: 0; background: none; color: var(--blue); font-size: var(--fs-sm); font-weight: 500; cursor: pointer; text-align: left; }
.hub-empty { padding: 16px 14px; color: var(--pencil); font-size: var(--fs-sm); }
.hub-note { margin: 10px 2px 0; padding: 10px 12px; background: var(--mark); border-radius: var(--r-md); font-size: var(--fs-sm); }
.hub-row.old .hub-name, .hub-row.old .hub-st, .hub-row.old .hub-ico { color: var(--faint); }
.hub-code { display: flex; gap: 10px; margin: 14px 0 6px; }
.hub-code input { width: 11em; height: 52px; border: 1px solid var(--rule); border-radius: var(--r-md); background: var(--sheet); text-align: center; font-size: 24px; font-weight: 600; letter-spacing: .35em; text-indent: .35em; font-variant-numeric: tabular-nums; }
.hub-code input:focus { outline: 2px solid var(--blue); outline-offset: 1px; }
.hub-code .btn { height: 52px; }
.hub-msg { min-height: 1.4em; margin: 4px 2px 12px; font-size: var(--fs-sm); }
.hub-more { margin: 22px 0 84px; text-align: center; font-size: var(--fs-sm); color: var(--pencil); }
.hub-link { border: 0; background: none; padding: 4px 2px; color: var(--blue); font-size: var(--fs-sm); font-weight: 500; cursor: pointer; }
.fd-card { border: 1px solid var(--rule); border-radius: 12px; padding: 12px 14px; margin: 10px 0; display: grid; gap: 6px; }
.fd-card .mt { color: var(--pencil); font-size: 12px; }
.fd-card .tt { font-weight: 600; }
.fd-opt { display: flex; gap: 8px; align-items: baseline; font-size: var(--fs-ms); cursor: pointer; }
.fd-acts { display: flex; gap: 8px; margin-top: 4px; }

/* notifications: the bell, the inbox page */
.gb-bell { position: relative; padding: 0 8px; }
.bell-dot { position: absolute; top: 3px; right: 3px; min-width: 14px; height: 14px; padding: 0 3px; border-radius: 7px; background: var(--danger); color: #fff; font-size: 10px; line-height: 14px; text-align: center; font-weight: 600; }
.inbox-row { display: flex; align-items: flex-start; gap: 10px; padding: 12px 4px; border-top: 1px solid var(--rule); cursor: default; }
.inbox-row.unread .it { font-weight: 700; }
.inbox-row.unread::before { content: ""; flex: none; width: 8px; height: 8px; margin-top: 7px; border-radius: 50%; background: var(--blue); }
.inbox-row:not(.unread)::before { content: ""; flex: none; width: 8px; }
.inbox-row .ib { flex: 1; min-width: 0; }
.inbox-row .it { font-size: 15px; }
.inbox-row .ibody { color: var(--ink); font-size: var(--fs-ms); margin-top: 2px; word-break: break-word; }
.inbox-row .imt { color: var(--pencil); font-size: 12px; margin-top: 2px; }
.inbox-row[data-link] { cursor: pointer; }
.pref-row { display: flex; align-items: center; gap: 10px; padding: 10px 4px; border-top: 1px solid var(--rule); }
.pref-row label { flex: 1; }
.pref-row .muted { font-size: 12px; }
.pref-row input[type=checkbox] { width: 20px; height: 20px; vertical-align: -4px; }
.pref-row input[type=time] { font-size: 16px; padding: 6px 8px; border: 1px solid var(--rule); border-radius: 8px; background: var(--sheet); color: var(--ink); }
/* phone: the inbox and its settings page are one narrow column; rows wrap instead of squeezing the words, and every tap target is a finger wide */
@media (max-width: 760px) {
  .inbox-row { flex-wrap: wrap; padding: 14px 4px; }
  .inbox-row .ib { flex: 1 1 calc(100% - 24px); }
  .inbox-row .btn { margin-left: 24px; min-height: 44px; padding: 6px 16px; }
  .pref-row { flex-wrap: wrap; padding: 0 4px; }
  /* the whole line is the tap target (name and box together), at least 44px tall */
  .pref-row label { flex: 1 1 100%; display: flex; align-items: center; gap: 10px; min-height: 44px; cursor: pointer; }
  .pref-row input[type=time] { min-height: 44px; }
  .pref-row input[type=time] { flex: 1 1 7em; min-width: 0; }
  #inboxBox .trash-head .btn, #inboxBox > .btn { min-height: 44px; padding: 6px 16px; }
}
.verify-box { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin: 10px 0; }
.verify-box input { width: 9em; font-size: 16px; padding: 6px 8px; letter-spacing: 3px; }

/* the entry table (js/entries.js): the same rows in the account menu and on the phone's 我的 page */
.gb-menu [data-entry] .en-t, .m-list [data-entry] .en-t { flex: 1; min-width: 0; }
.en-hint { color: var(--pencil); font-size: 12px; }
.m-list[data-group]::before { content: attr(data-group); display: block; background: var(--paper, #fff); color: var(--pencil); font-size: var(--fs-xs); padding: 10px 16px 4px; }   /* 手机「我的」页：每组一个小标题 */
.en-badge { min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--danger); color: #fff; font-size: 10px; line-height: 16px; text-align: center; font-weight: 600; }
.lang-dlg { width: min(86vw, 320px); }
.lang-dlg .m-list { display: grid; gap: 1px; background: var(--rule); border: 1px solid var(--rule); border-radius: 10px; overflow: hidden; margin: 0 0 12px; max-height: 60dvh; overflow-y: auto; }
.lang-dlg .m-list button { border: 0; background: var(--sheet); text-align: left; padding: 12px 14px; font-size: 16px; }
.lang-dlg .m-list button.on { font-weight: 600; color: var(--blue); }
@media (max-width: 760px) {
  .m-list [data-entry] { display: flex; align-items: center; gap: 8px; color: var(--ink); text-decoration: none; }
  .m-list [data-entry][hidden] { display: none; }
  .m-list [data-entry].danger { color: var(--danger); }
  .m-tabs button { position: relative; }

}
/* 日程：悬浮「回到今天」+ 左侧顶住的月份 */
.nb-float { position: relative; flex: none; height: 26px; z-index: 6; background: var(--sheet); pointer-events: none; }   /* 月份条在滚动区外面,不压在日期上(T112 根治):日期徽章滚到它旁边只是被滚动区边缘裁掉,不会被半截白底切;「回到今天」按钮自己恢复点击 */
.today-fab { pointer-events: auto; position: absolute; top: 34px; left: 50%; transform: translateX(-50%); z-index: 6; border: 0; border-radius: 18px; padding: 6px 14px; background: var(--ink); color: #fff; font-size: 13px; cursor: pointer; box-shadow: var(--sh-fab); }
.today-fab[hidden] { display: none; }
.month-tag { position: absolute; top: 5px; left: 24px; font-size: 13px; font-weight: 600; color: var(--pencil); pointer-events: none; }   /* 吸顶月份和列表里每个月份标题(.month)、日期数字(.day .g .n,自带 4px 内边距,数字本身从 4px 处开始;月份文字也从这里开始)在同一条竖线上:最左,不缩进(T148 返工) */
.month-tag:empty { display: none; }
@media (max-width: 760px) { .month-tag { left: 10px; } }   /* 手机:滚动区内边距 10px,和日期数字同线(要写在上面的基础规则之后才压得住) */

/* 会员与积分 (account.js) */
.ac-top { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 14px 0 6px; }
.ac-card { background: var(--desk); border-radius: 12px; padding: 14px 16px; }
.ac-big { font-size: 26px; font-weight: 700; margin-top: 2px; }
.ac-note { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; background: var(--desk); border-radius: 10px; padding: 10px 12px; margin: 8px 0; }
.ac-note-t { flex: 1 1 200px; }
.ac-warn { border-left: 3px solid #d98a00; background: #fff6e0; border-radius: 6px; padding: 8px 12px; margin: 8px 0; font-size: var(--fs-ms); }
.ac-meter { padding: 8px 0; border-top: 1px solid var(--rule); }
.ac-ml { display: flex; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.ac-bar { height: 6px; border-radius: 3px; background: var(--rule); margin-top: 6px; overflow: hidden; }
.ac-bar i { display: block; height: 100%; background: var(--accent, #3b6ea5); }
.ac-bar i.hot { background: #d9534f; }
.ac-tag { display: inline-block; margin-top: 4px; font-size: 12px; color: var(--pencil); border: 1px solid var(--rule); border-radius: 10px; padding: 0 8px; }
.ac-redeem { display: flex; gap: 8px; align-items: center; margin: 6px 0; }
.ac-redeem input { flex: 1; max-width: 280px; font-size: 16px; }
.ac-amt { font-weight: 600; flex: none; }
.ac-amt.neg { color: #b3392f; }
.gb-avatar.has-dot { position: relative; }
.gb-avatar.has-dot::after { content: ""; position: absolute; top: -3px; right: -3px; width: 10px; height: 10px; border-radius: 50%; background: var(--danger); border: 2px solid #fff; box-sizing: content-box; }      /* 右上 10×10，--danger，白 2px 描边（与 tab 红点同） */
@media (max-width: 760px) {
  .ac-top { grid-template-columns: 1fr; }
  /* 手机上触控区至少 44px（设计规范）：只加大点击区，字号和外观不变；只作用在会员与积分页里，不碰全局 .small-btn */
  #accountBox .btn { min-height: 44px; height: auto; padding-top: 0; padding-bottom: 0; display: inline-flex; align-items: center; justify-content: center; }
  #accountBox .ac-redeem input { min-height: 44px; box-sizing: border-box; }
  #accountBox .trash-head .btn { min-width: 64px; }
}

/* 本地模式（不登录试用，js/local-store.js）：没有 AI，聊天、录音、人物、地点、文件、搜索都不显示；底栏只留日程、笔记、我的 */
html.local-boot .assist, html.local-boot #mDock, html.local-boot .gs-slot, html.local-boot #bellBtn, html.local-boot .nav [data-view="people"], html.local-boot .nav [data-view="places"], html.local-boot .nav [data-view="files"], html.local-boot .m-tabs [data-mview="people"], html.local-boot .m-tabs [data-mview="places"], html.local-boot .m-tabs [data-mview="files"], html.local-boot #boot,
body.local .assist, body.local #assistToggle, body.local #mDock, body.local .rec-go, body.local .foot-links #guideBtn,
body.local .nav [data-view="people"], body.local .nav [data-view="places"], body.local .nav [data-view="files"],
body.local .m-tabs [data-mview="people"], body.local .m-tabs [data-mview="places"], body.local .m-tabs [data-mview="files"],
body.local .gs-slot, body.local #mSearch, body.local #bellBtn, body.local #aiState { display: none !important; }
.m-list [data-entry].locked, .gb-menu [data-entry].locked { color: var(--pencil); }

/* 事项上的提醒时间：和「原定」「地点」同一排的小标签，点开可改可关 */
.chip.remind { display: inline-flex; align-items: center; gap: 3px; background: var(--desk); color: var(--pencil); }
.chip.remind.off { background: none; color: var(--pencil); text-decoration: line-through; }
.chip.remind .ic-svg { flex: none; }
@media (hover: none) { .chip.remind { min-height: 28px; padding: 0 10px; } }

/* 笔记空状态里的「＋ 新笔记」：主按钮规格 38 / 圆 12 / 字 15；手机上命中区 ≥44 */
.empty .empty-new { height: 38px; border-radius: 12px; font-size: 15px; padding: 0 16px; margin-top: 10px; }
@media (max-width: 760px) {
  .empty .empty-new { height: 44px; min-width: 120px; }
}

/* 日程左边日期列的宽度跟着语言走：「星期 + 昨天/明天/后天」要一行放下。
   量过 9 种语言最长的一条：es「mar pasado mañana」115px、fr「dim. aujourd’hui」94 /「mar. après-demain」108、it「mar dopodomani」95、
   ru「вт послезавтра」91、de「Di übermorgen」83、en「Mon tomorrow」83；中日韩阿 ≤ 52。手机上日期列本来就是两行，不动。 */
@media (min-width: 761px) {
  html[lang="es"], html[lang="fr"], html[lang="it"], html[lang="ru"], html[lang="de"] { --gutter: 128px; }
}

/* 左栏「今天还剩 / 之前没做完」：这两段文字本身就是切换项，样子还是原来那一行；选中的更深、加粗(qm 10-26:去掉下划线)，没选中的是灰色。
   不做成带底色、边框的标签页（qm：别做成了真的 tab）。 */
.tb-sum { display: flex; flex-wrap: wrap; align-items: baseline; }
.tb-seg { border: 0; background: none; padding: 0; margin: 0; font: inherit; color: var(--pencil); cursor: pointer; text-decoration: none; }
.tb-seg:hover { color: var(--ink); }
.tb-seg.on { color: var(--ink); font-weight: 600; }
.tb-dot { color: var(--pencil); margin: 0 .3em; }
.tb-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0; max-height: 46vh; overflow-y: auto; }   /* minmax(0,1fr)：超长一行不撑开栏，靠 .tb-item 的省略号截断 */   /* 16 件也只占这么高，在左栏里自己滚，日历不会被顶走 */
.tb-prev { display: flex; align-items: center; gap: 8px; }
.tb-prev .tb-day { flex: none; color: var(--pencil); font-size: 12px; font-variant-numeric: tabular-nums; }
.tb-prev .tb-b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tb-empty { color: var(--pencil); padding: 4px 8px; }


/* 笔记页顶部「来自日程」条 + 被定位的那一句 */
.note-from { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; font-size: 12px; color: var(--pencil); padding: 0 0 8px; }
::highlight(quote-hit) { background: var(--mark); }

/* 事项的文字删光、但下面还有详情行:这一行留着,灰色占位字只是显示(伪元素,不进原文/搜索/复制)(T115) */

/* 输入框上方的一行「正在看：… ×」：小号灰字 + 文字按钮，不是卡片（T123）。没有焦点时 hidden，不占位 */
.focus-bar { display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-1) 16px 0; font-size: var(--fs-sm); color: var(--pencil); min-width: 0; }
.focus-bar[hidden] { display: none; }
.focus-bar { min-height: 28px; }   /* 固定一行高：占位时只是看不见，悬停换对象不会让输入框区域抖 */
.focus-bar.idle { visibility: hidden; }
.focus-bar .focus-txt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.focus-bar .focus-x { flex: none; padding: 0 var(--sp-2); color: var(--pencil); }
@media (max-width: 760px) { .focus-bar { padding: var(--sp-1) 14px 0; } .focus-bar .focus-x { min-width: 44px; min-height: 44px; } }
.ln.hollow .t:empty::before, .ln.hollow .t:has(> br:only-child)::before { content: attr(data-hollow); color: var(--pencil); pointer-events: none; }

.note-retitle { margin: -2px 0 6px; }
.ops button[hidden] { display: none; }

/* 派生日程的「来源已变更/已更新」提示:一行灰底小字 + 两个文字按钮,不弹窗(T120) */
.hint-bar { display: inline-flex; align-items: center; gap: 6px; padding: 1px 8px; border-radius: 10px; background: var(--desk); color: var(--pencil); font-size: 12px; }
.hint-bar button { border: 0; background: none; color: var(--blue); cursor: pointer; font-size: 12px; padding: 2px 4px; border-radius: 4px; }
.hint-bar button:hover { background: rgba(0,0,0,.05); }
@media (hover: none) { .hint-bar button { padding: 8px 8px; font-size: 13px; } }


/* 另一个端新加/改出来的行:淡入 + 左侧一条细蓝线 3 秒(「减少动态效果」下不做,见 content-sync.js)(T139) */
.ln.sync-new { animation: syncIn .5s var(--ease, ease-out) both; box-shadow: inset 2px 0 0 var(--blue); transition: box-shadow 1s ease-out 2.2s; }
@keyframes syncIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.sync-note { font-size: 12px; color: var(--pencil); background: var(--desk); border-radius: 10px; padding: 0 8px; white-space: nowrap; }

/* 从系统日历同步来的事项：灰色小标签「日历」，不抢眼，不可点（T155）；来源页签的页签和来源卡片 */
.chip.calendar { background: var(--desk); color: var(--pencil); border: 0; cursor: default; padding: 0 var(--sp-2); }
.feed-tabs { margin: var(--sp-3) 0 var(--sp-4); width: fit-content; }
.fd-src-head { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
.fd-src .mt { color: var(--pencil); font-size: var(--fs-sm); }
.feed-purge { padding: var(--sp-5); max-width: min(92vw, 420px); }
.feed-purge .fd-acts { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-4); }

/* 回复下面的下一步建议：小胶囊，浅底细边，圆角，文字可换行不溢出（T156）。和「现在可以问我」的 .try 同一套蓝字白底，悬停变浅蓝。 */
.sugg { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-3); align-items: flex-start; }
.sugg-b { border: 1px solid var(--rule); background: var(--sheet); border-radius: var(--r-full, 99px); padding: var(--sp-1) var(--sp-3); cursor: pointer; font-size: var(--fs-sm); line-height: 1.5; color: var(--blue); text-align: left; max-width: 100%; white-space: normal; overflow-wrap: anywhere; }
.sugg-b:hover { background: var(--blue-soft); border-color: var(--blue); }
.sugg-b:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
@media (max-width: 760px) { .sugg-b { min-height: 40px; font-size: var(--fs-md); padding: var(--sp-2) var(--sp-3); } }

/* 人物列表的分组标题（吸顶）和右侧字母索引条（T165；qm 通过的设计方案 docs/设计规范/方案/人物页-分组与字母索引.html，数值照第 3 节） */
.pp-list .pp-sec { position: sticky; top: 0; z-index: 2; height: 26px; margin: var(--sp-2) calc(-1 * var(--pp-padx, 0px)) 0; padding: 0; padding-inline-start: calc(var(--pp-padx, 0px) + 8px); padding-inline-end: calc(var(--idx-w) + 10px); box-sizing: border-box;
  display: flex; align-items: center; justify-content: space-between; background: var(--desk); border-top: 1px solid var(--rule); border-bottom: 1px solid var(--rule); border-radius: 0; }
.pp-list .pp-sec:first-child { margin-top: 0; }
.pp-sec-l { font-size: var(--fs-sm); font-weight: 700; color: var(--ink); line-height: 24px; }
.pp-sec-n { font-size: var(--fs-xs); font-weight: 400; color: var(--pencil); line-height: 24px; }
/* 右侧 24px 是整个列表的保留列：每种行（人物、成员、分组标题、折叠行）文字右缘 = 24 + 10，不用外边距缩短行，背景和分隔线仍铺满 */
.pp-list { --idx-w: 24px; }
.pp-list.has-idx .pi, .pp-list.has-idx #plist > .empty { padding-inline-end: calc(var(--idx-w) + 10px - var(--pp-padx, 0px)); }   /* 列表自己有 padx 的内边距，行补到 34 */
/* 字母条不放进滚动层：它是 #plist 的兄弟，盖在列表区上面（绝对定位，不随滚动走），所以滚动后照样点得到；.pp-list 是定位基准 */
.pp-list { position: relative; }
.pp-idx-wrap { position: absolute; z-index: 3; right: 0; pointer-events: none; top: var(--pp-top, 0px); height: var(--pp-vh, 0px); width: 24px; }
.pp-idx { position: absolute; top: 0; right: 2px; width: 18px; height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 0; padding: 6px 0; box-sizing: border-box; border-radius: 9px; pointer-events: auto; outline: none; transition: background-color var(--t-fast) var(--ease), opacity var(--t-fast) var(--ease); overflow: hidden; }
.pp-idx::before { content: ""; position: absolute; top: 0; bottom: 0; left: -10px; right: -2px; z-index: -1; }   /* 命中区垫在字母下面（盖在上面会吃掉字母的点击） */      /* 可点击宽度 28px（透明扩出） */
.pp-idx button, .pp-idx .pp-dot { display: block; flex: none; width: 18px; height: var(--pp-row, 16px); line-height: var(--pp-row, 16px); padding: 0; border: 0; background: none; font-size: var(--fs-xs); text-align: center; color: var(--pencil); cursor: pointer; transition: color var(--t-fast) var(--ease); }
.pp-idx .pp-dot { cursor: default; font-weight: 700; }
.pp-idx button.cur { color: var(--blue); font-weight: 700; }                                                       /* 当前所在组：蓝色加粗，不加底色 */
.pp-idx button:hover, .pp-idx button:active { color: var(--ink); font-weight: 700; }
.pp-idx:hover, .pp-idx:focus-within { background: var(--desk); }                                                  /* 悬停 / 按住 / 键盘聚焦：浅灰底 */
@media (hover: hover) { .pp-idx { opacity: .5; } .pp-idx:hover, .pp-idx:focus-within { opacity: 1; } }                 /* PC 鼠标：静止淡、进入右侧 28px 才清晰；触屏不降 */
@media (prefers-reduced-motion: reduce) { .pp-idx, .pp-idx button { transition: none; } }
html[dir="rtl"] .pp-idx { right: auto; left: 2px; }
body.mobile .pp-idx { touch-action: none; }                                                                          /* 条上的手势归字母条（按住上下拖定位），不滚页面 */
body.mobile .pp-idx::before { left: -26px; }                                                                       /* 手机可点击宽度 44px */
body.mobile .pp-idx button, body.mobile .pp-idx .pp-dot { width: 18px; }
.pp-list { --pp-padx: 0px; }
.pp .pp-list, body.mobile .pp-list { --pp-pad: 16px; --pp-padx: 16px; }
.side-ctx .pp-list { --pp-pad: 0px; --pp-padx: 0px; }

/* 人物来源（T168；方案 docs/设计规范/方案/人物来源-展示与筛选.html） */
.pp-head .pp-flt { flex: 1 1 0; min-width: 0; white-space: nowrap; font-size: var(--fs-ms); color: var(--pencil); padding: 0 var(--sp-3); overflow: hidden; text-overflow: ellipsis; justify-content: flex-start; }
.pp-head .pp-flt.on { background: var(--blue-soft); color: var(--blue); border-color: transparent; }
/* 搜索框一行，下面一行放「来源 ▾」「地点 ▾」两个同高按钮各占一半（宽栏同样；窄栏 248–300 放不下三样并排，所以分两行） */
.pp-head { flex-wrap: wrap; }
.pp-head input { flex: 1 1 calc(100% - 52px); }
.pp-head #addPerson { order: 1; }
.pp-head .pp-filt { order: 2; flex: 1 1 100%; display: flex; gap: 6px; min-width: 0; }
.src-pop { position: fixed; z-index: 40; width: 276px; background: var(--sheet); border-radius: var(--r-pop); box-shadow: var(--sh-float); padding: 6px; font-size: var(--fs-sm); }   /* 浮层内边距 6（规范 B5）*/
.src-row { display: flex; align-items: center; gap: var(--sp-2); min-height: 32px; padding: 0 var(--sp-2); border-radius: var(--r-sm); cursor: pointer; }
.src-row:hover { background: var(--desk); }
.src-row input { margin: 0; accent-color: var(--blue); }
.src-name { flex: 1; min-width: 0; color: var(--ink); }
.src-n { color: var(--pencil); font-size: var(--fs-xs); }
.src-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); border-top: 1px solid var(--rule); margin-top: var(--sp-1); padding: var(--sp-2) var(--sp-2) 0; }
.src-foot .link:disabled { color: var(--pencil); cursor: default; }
.src-sheet-bg { position: fixed; inset: 0; z-index: 39; background: rgba(31,42,55,.35); }
.src-pop.sheet { left: 0; right: 0; bottom: 0; top: auto; width: auto; border-radius: var(--r-sheet) var(--r-sheet) 0 0; padding: var(--sp-3) var(--sp-4) calc(var(--sp-4) + env(safe-area-inset-bottom)); z-index: 40; }
.src-pop.sheet .src-row { min-height: 44px; font-size: var(--fs-md); }
.src-title { font-weight: 700; color: var(--ink); padding: 0 var(--sp-2) var(--sp-2); }
.src-box { margin: var(--sp-2) 0 var(--sp-3); max-width: 520px; font-size: var(--fs-sm); }
.src-head { font-weight: 700; color: var(--ink); margin-bottom: var(--sp-1); }
.src-cnt { font-weight: 400; font-size: var(--fs-xs); color: var(--pencil); margin-inline-start: var(--sp-2); }
.src-line { display: flex; align-items: center; gap: var(--sp-2); min-height: 28px; color: var(--ink); }
.src-line.sub { padding-inline-start: var(--sp-5); }
.src-ic { color: var(--pencil); flex: none; display: inline-flex; }
.src-txt { flex: 1; min-width: 0; }
.src-txt .link { padding: 0; color: var(--blue); }
.src-at { font-size: var(--fs-xs); color: var(--pencil); flex: none; }
.src-line .link { font-size: var(--fs-xs); flex: none; }
body.mobile .src-line { min-height: 36px; }

/* 人物列表：搜索区（搜索框 + 来源 / 地点筛选 + ＋）固定在顶部不动，只有下面的 #plist 滚动（含吸顶的分组标题）。
   所以 .pp-list 自己不滚，#plist 是唯一的滚动层；分组标题的 sticky top 就是它的顶，字母条按它（不含搜索区）垂直居中 */
#v-people .pp-list, #sidePeople .pp-list { padding: 0; overflow: hidden; min-height: 0; gap: 0; }
#sidePeople .pp-list { flex: 1; }
#sidePeople.side-ctx { overflow: hidden; }
#v-people .pp-head, #sidePeople .pp-head { flex: none; padding: var(--pp-pad, 0px) var(--pp-padx, 0px) var(--sp-2); }
#plist { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--pp-padx, 0px) var(--pp-pad, 0px); display: flex; flex-direction: column; gap: 8px; }

/* 地点浮层：城市多时顶部搜索框 + 「常用」「全部城市」分组，列表最高 244 内部滚动 */
.src-q { width: 100%; box-sizing: border-box; margin-bottom: var(--sp-2); }
.src-list { max-height: 244px; overflow-y: auto; }
.src-pop.sheet .src-list { max-height: 50vh; }
.src-grp { font-size: var(--fs-xs); font-weight: 600; color: var(--pencil); padding: var(--sp-2) var(--sp-2) var(--sp-1); }
.src-empty { padding: var(--sp-3) var(--sp-2); }

/* 缩进按钮只在手机展开的操作条里出现（PC 有 Tab） */
.ops .m-only-op { display: none; }
body.mobile .ops .m-only-op { display: inline-flex; }

/* 冲突标签 / 冲突提示里的警示图标（图标库 alert，取代字符 ⚠） */
.chip.clash { display: inline-flex; align-items: center; gap: 3px; }
.nlist .ni .mt .bad { display: inline-flex; align-items: center; gap: 3px; }
.conflict .cm { display: flex; align-items: flex-start; gap: 4px; }


/* 彩色双层图标（Q120，设计组资产 ICONS_DUO）：开 = 满色渐变，关 = 灰色同形状；红点在图标右上角 9×9 */
.tabic { position: relative; display: inline-flex; align-items: center; justify-content: center; }
.tabic .ti-on, .tabic .ti-off { display: inline-flex; }
.tabic .ti-on { display: none; }
.nav button.on .tabic .ti-on, .m-tabs button.on .tabic .ti-on { display: inline-flex; }
.nav button.on .tabic .ti-off, .m-tabs button.on .tabic .ti-off { display: none; }
.tabic .icd { display: block; }
.tabic[data-tabic="me"] .ti-off .icd { filter: grayscale(1) opacity(.55); }
.nav button { display: inline-flex; align-items: center; gap: 6px; }
.nav button.on .tl { color: var(--ink); font-weight: 600; }
.has-dot .tabic::after, .tabic.has-dot::after { content: none; }
.m-tabs button.has-dot .tabic::after { content: ""; position: absolute; top: -2px; right: -2px; width: 9px; height: 9px; border-radius: 50%; background: #F0453E; border: 1.5px solid #fff; box-sizing: content-box; }
.nav button.on .tabic, .m-tabs button.on .tabic { animation: tab-pop .28s var(--spring, ease-out); }
@keyframes tab-pop { 0% { transform: scale(.88); } 100% { transform: scale(1); } }
@media (prefers-reduced-motion: reduce) { .nav button.on .tabic, .m-tabs button.on .tabic { animation: none; } }
/* 抽屉 / 「我的」页入口：彩色图标 26，无底块，行高 56 */
.en-ic { flex: none; display: inline-flex; width: 26px; height: 26px; }
.en-ic .icd { display: block; }
.gb-menu [data-entry]:has(.en-ic), .m-list [data-entry]:has(.en-ic), .pv-list [data-entry]:has(.en-ic) { gap: 12px; }
.m-list [data-entry]:has(.en-ic) { min-height: 56px; }
.gb-menu [data-entry]:has(.en-ic) { min-height: 44px; }
.gb-menu [data-entry] .en-t { white-space: nowrap; }
.gb-menu [data-entry] .en-hint { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gb-menu [data-entry] .en-hint { margin-left: auto; padding-left: 8px; }

/* 资料库卡片（Q121 彩色图标第二阶段，设计组方案「彩色图标-三端」§四）：缩略区 104 高，有预览图用预览图，没有就是类型插画（<img>，cover 填满）；左下角类型小标签 */
.fcard { grid-template-rows: 104px auto; min-height: 0; }
.fgrid { grid-auto-rows: max-content; }      /* 卡片按内容撑高：手机上列表区高度有限时，卡片不能被压扁（标题和副标题叠在一起） */
.fcard .nm, .fcard .wh { line-height: 1.4; }
.fcard .th { position: relative; }
.fcard .th img.art { background: none; }
.fcard .th .chip { position: absolute; left: 7px; bottom: 7px; height: 19px; padding: 0 7px; border-radius: 999px; background: rgba(255,255,255,.94); color: var(--ink); font-size: 11px; display: flex; align-items: center; gap: 4px; line-height: 19px; }

/* 连接页（Q121 第三阶段，设计组方案「彩色图标-三端」§三）：来源按分类分组，每组一张白色圆角卡；左边 34×34 白底圆角 10 的 logo 块（logo 占 60%），右边胶囊按钮，已连接变绿 */
.hub-gt { margin: 16px 4px 6px; font-size: var(--fs-ms); color: var(--pencil); }
.hub-gt:first-child { margin-top: 0; }
.hub-groups .hub-list { border-radius: var(--r-lg); overflow: hidden; }
.hub-ico.logo { width: 34px; height: 34px; border-radius: 10px; background: var(--sheet); box-shadow: 0 0 0 1px var(--rule), 0 1px 3px rgba(14,23,38,.08); }
.hub-ico.logo img { width: 60%; height: 60%; display: block; }
.hub-row .btn { border-radius: var(--r-full); padding: 0 16px; background: var(--sheet); color: var(--ink); border: 0; box-shadow: 0 0 0 1px var(--rule), 0 1px 3px rgba(14,23,38,.06); }
.hub-row .btn.primary { background: var(--ink); color: #fff; box-shadow: none; }      /* 要处理的（授权没开等）仍是深色主按钮 */
.hub-row .btn.on, .hub-row .btn.done { background: var(--done-soft); color: var(--done); box-shadow: none; border-color: transparent; }

/* 确认弹窗 confirmDlg()（设计组 提示类 · PC规范v1/15-提示类.md §15.2）：宽 360（含内边距，要 border-box），圆角 16，内边距 18 18 14；标题 17/600，正文 14，按钮高 32 靠右；
   危险主按钮 --danger；三选一竖排等宽。 */
.cdlg { box-sizing: border-box; width: 360px; max-width: calc(100vw - 32px); padding: 18px 18px 14px; border: 0; border-radius: var(--r-dialog); background: var(--sheet); color: var(--ink); box-shadow: var(--sh-dialog); }
.cdlg::backdrop { background: rgba(14,23,38,.18); }
.cdlg.out { opacity: 0; transition: opacity var(--t-fast, .16s) var(--ease); }
.cdlg .cd-t { font-size: var(--fs-lg); font-weight: 600; line-height: 1.35; color: var(--ink); }
.cdlg .cd-b { margin-top: 6px; font-size: var(--fs-ms); line-height: 1.6; color: var(--ink-2); white-space: pre-line; }
.cdlg .cd-a { display: flex; justify-content: flex-end; gap: 8px; margin-top: var(--sp-4, 16px); }
.cdlg .cd-a .btn { display: inline-flex; align-items: center; box-sizing: border-box; height: var(--h-sm, 32px); border-radius: var(--r-sm); padding: 0 14px; font-size: var(--fs-sm); }
.cdlg.tri .cd-a { display: grid; grid-template-columns: 1fr; gap: 8px; }              /* 三选一：竖排，三个按钮等宽撑满内容宽（360 - 36 = 324） */
.cdlg.tri .cd-a .btn { display: flex; width: 100%; box-sizing: border-box; align-items: center; justify-content: center; }
.btn.danger { background: var(--danger); border-color: var(--danger); color: #fff; }
.btn.danger:hover { background: #B02A27; border-color: #B02A27; }
@media (prefers-reduced-motion: reduce) { .cdlg[open] { animation: none; } .cdlg.out { transition: none; } }

/* 提示条的失败、警告状态（设计组 提示类 §三 / PC规范v1/15-提示类.md §15.1）：文字左边 16 的 alert 图标，亮橙 --warn-on-dark；成功和普通不加图标 */
.toast.bad, .toast.warn { color: #fff; }
.toast .toast-ic { flex: none; display: inline-flex; color: var(--warn-on-dark); }
.toast .toast-ic svg { display: block; }

.gb-menu .am-head { display: flex; align-items: center; gap: 10px; }
.gb-menu .am-head .avatar { cursor: pointer; }

/* 月历（规范「月历」方案 A，2026-11-03）：补满当前行；非本月 14 淡灰不画点；本月有事 16 粗体 + 4px 淡点；今天实心圆、选中描边圆 */
.cal .cal-grid { row-gap: 2px; }
.cal .cal-grid .wd { font-size: 12px; color: var(--pencil); }
.cal .cal-grid button { width: 32px; height: 32px; padding: 0; justify-self: center; border-radius: 50%; font-size: 16px; font-weight: 400; color: var(--ink); }
.cal .cal-grid button.out { font-size: 14px; color: var(--rule-strong); }
.cal .cal-grid button.has { font-weight: 700; }
.cal .cal-grid button.has::after { bottom: 3px; width: 4px; height: 4px; margin-left: -2px; background: rgba(43,89,255,.55); }
.cal .cal-grid button.open::after { background: var(--warn); }
.cal .cal-grid button.out.has { font-size: 14px; font-weight: 400; }
.cal .cal-grid button.out.has::after { display: none; }
.cal .cal-grid button.today, .cal .cal-grid button.out.today { background: var(--blue); color: #fff; font-weight: 600; font-size: 16px; border: 0; }
.cal .cal-grid button.today.has::after { background: #fff; }
.cal .cal-grid button.sel { box-shadow: inset 0 0 0 1.5px var(--blue); }

.cal { padding: 10px 8px; }
.cal .cal-grid { column-gap: 0; }
@media (max-width: 760px) {   /* 手机上月历格触控 ≥44（规范「月历」格尺寸） */
  .cal .cal-grid button { width: 44px; height: 44px; }
  .cal { padding: 10px 4px; }
}

/* 全局搜索面板（规范 PC.md「全局搜索面板」，2026-11-03）：内容居中 640、分组带条数、每组 3 条 + 展开更多、命中高亮 */
.search-pane .sp-inner { max-width: 640px; margin: 0 auto; padding: 20px 32px; }
.search-pane .sp-group { margin-bottom: 14px; }
.search-pane h4 { display: flex; justify-content: space-between; margin: 0 0 6px; font-size: 13px; font-weight: 600; color: var(--ink); }
.search-pane h4 .sp-n { font-weight: 400; color: var(--pencil); }
.search-pane .hit { display: flex; align-items: center; gap: 10px; min-height: 48px; border-radius: 8px; padding: 8px 10px; cursor: pointer; }
.search-pane .hit .sp-col { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.search-pane .hit .sp-t { font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.search-pane .hit small { font-size: 13px; color: var(--pencil); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.search-pane .hit-p .sp-t { font-weight: 600; }
.search-pane .sp-av { flex: none; width: 28px; height: 28px; border-radius: 50%; background: var(--blue-soft); color: var(--blue); display: grid; place-items: center; font-size: 12px; font-weight: 600; }
.search-pane .hit.more { min-height: 32px; font-size: 13px; color: var(--blue); }
.search-pane mark.sp-mark { background: var(--blue-soft); color: var(--blue-deep); font-weight: inherit; border-radius: 2px; }
.search-pane .sp-empty { font-size: 14px; color: var(--pencil); padding: 20px 32px; }
@media (min-width: 761px) { .search-pane { padding: 0; } }

/* 资料库链接详情（方案 B，设计稿「资料库链接详情页-定稿」；全部用现有令牌） */
.lk-wrap { display: grid; gap: 8px; }
.lk-url { display: flex; align-items: center; background: var(--sheet); border-radius: 12px; box-shadow: 0 0 0 1px var(--rule); padding: 10px 12px; font-size: 13px; color: var(--pencil); border: 0; cursor: pointer; text-align: left; }
.lk-url b { flex: 1; font-weight: 400; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lk-sec { font-size: 13px; font-weight: 600; color: var(--pencil); margin-top: 8px; display: flex; gap: 8px; align-items: center; }
.lk-card { background: var(--sheet); border-radius: 12px; box-shadow: 0 0 0 1px var(--rule); padding: 12px 14px; }
.lk-card p { margin: 0; font-size: 15px; line-height: 1.65; }
.lk-card p.lk-sub { margin-top: 6px; color: var(--pencil); font-size: 13px; }
.lk-card ul { margin: 0; padding-left: 18px; font-size: 15px; }
.lk-card li { margin: 3px 0; }
.lk-st { font-size: 13px; font-weight: 400; padding: 0 10px; border-radius: 999px; }
.lk-st.ok { background: var(--done-soft); color: var(--done); }
.lk-st.ing { background: var(--blue-soft); color: var(--blue-deep); }
.lk-st.bad { background: var(--warn-soft); color: var(--warn); }
.lk-st.lim { background: var(--sheet); color: var(--pencil); box-shadow: 0 0 0 1px var(--rule); }
.lk-kw { display: flex; gap: 6px; flex-wrap: wrap; }
.lk-kw i { font-style: normal; height: 26px; padding: 0 10px; border-radius: 999px; background: var(--blue-soft); color: var(--blue-deep); font-size: 13px; display: grid; place-items: center; }
.lk-sk { height: 12px; border-radius: 6px; background: var(--desk); margin: 8px 0; }
.lk-cap { font-size: 13px; color: var(--pencil); }
.lk-retry { margin-top: 10px; height: 36px; }
.lk-tools { position: sticky; bottom: -14px; margin: 0 -14px -14px; padding: 10px 14px; display: flex; gap: 10px; background: var(--sheet); border-top: 1px solid var(--rule); }
.lk-tools .btn { flex: 1; height: 36px; border-radius: 12px; }
.lk-tools .lk-open { background: var(--ink); color: #fff; border-color: var(--ink); }
.lk-retry { background: var(--ink); color: #fff; border-color: var(--ink); }

/* 资料库链接卡：解析中骨架、摘要片段 */
.fcard .fc-sk i { display: block; height: 8px; border-radius: 4px; background: var(--desk); margin-top: 6px; }
.fcard .fc-sk i:last-child { width: 60%; }
.fcard .fc-snip { margin-top: 4px; font-size: 12px; color: var(--pencil); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* 强制更新页：全屏、不可关闭 */
.upd-full { position: fixed; inset: 0; z-index: 9999; background: var(--sheet); display: grid; place-items: center; padding: 24px; }
.upd-card { max-width: 360px; text-align: center; display: grid; gap: 12px; }
.upd-t { font-size: 20px; font-weight: 600; }
.upd-m { font-size: 14px; color: var(--pencil); }

/* 强制更新页（设计稿 强制更新页-三端）：标题 + 说明 + 一个按钮 + 底部版本小字 */
.upd-full { animation: viewIn .16s var(--ease) both; }
.upd-full { flex-direction: column; }
.upd-card { gap: 0; }
.upd-t { font-size: 22px; line-height: 30px; }
.upd-m { margin: 8px auto 0; max-width: 320px; font-size: 15px; line-height: 24px; color: var(--pencil); }
.upd-go { margin-top: 24px; min-width: 160px; height: 40px; padding: 0 24px; border: 0; border-radius: var(--r-sm); background: var(--ink); color: #fff; font: 600 15px/40px inherit; font-family: inherit; cursor: pointer; }
.upd-go:hover { background: var(--ink-hover, #1B2740); }
.upd-ver { position: absolute; bottom: 18px; left: 0; right: 0; text-align: center; font-size: 12px; color: var(--pencil); }
@media (prefers-reduced-motion: reduce) { .upd-full { animation: none; } }

/* 月历修复：7 列等宽不裁切（侧栏内宽只有 208px，32px 固定格会溢出）；格子随列宽缩，最大 32；悬停不在补位格上冒灰底 */
.cal .cal-grid { grid-template-columns: repeat(7, minmax(0, 1fr)); column-gap: 0; }
.cal .cal-grid button { width: 100%; max-width: 32px; aspect-ratio: 1; height: auto; }
.cal .cal-grid button.out:hover:not(.today):not(.sel) { background: none; }
.cal .cal-head { gap: 4px; }
.cal .cal-head .cal-title { flex: 1; text-align: center; }
.cal .cal-head .cal-nav button { width: 24px; }
@media (max-width: 760px) { .cal .cal-grid button { max-width: 44px; } }
