/* ════════════════════════════════════════════════════════════
   知趣 · 前端  zhiqu-ui.css
   设计令牌 + 基础样式 + 应用外壳 + 组件类。
   一套中性配色（第四十轮，用户 2026-10-06 定的「中性风」「白天白色，晚上黑色」；第四十一轮看过截图定了「主题就黑白的吧」）：
     :root                                  浅色（白）+ 黑白强调 —— 默认
     html[data-zq-mode="dark"]              深色（黑）+ 黑白强调
     html[data-zq-accent="gold"]            强调色换成金色（浅色）—— 可选，用户说过喜欢金色
     html[data-zq-mode="dark"][data-zq-accent="gold"]   强调色换成金色（深色）
   data-zq-mode 由每页头上那行内联脚本和 zhiqu-ui.js 定：默认跟着系统外观走（白天浅、晚上深），菜单里可以固定成浅色或深色。
   原来的五套配色（暖纸墨青、石墨蓝、纸墨松绿、黛紫、玄墨鎏金）× 明暗共 10 套，第四十轮收成这一套。
   对比度：各级文字在底色、卡片、浅底上都 ≥ 4.5 : 1，强调色作文字和按钮上的字也是 —— DesignTokensTest 照这里的值算。
   ════════════════════════════════════════════════════════════ */

:root{
  /* 灰阶（浅色） */
  --zq-bg: #FAFAFA;
  --zq-card: #FFFFFF;
  --zq-cmd: #1D4ED8;   /* 第一百一十八轮：输入框和面板里的 / 命令 */
  --zq-card-soft: #F4F4F5;
  --zq-text: #232326;
  --zq-text2: #52525B;
  --zq-text3: #6B6B74;
  --zq-border: #E4E4E7;
  --zq-border-soft: #EDEDEF;
  /* 强调色：黑白（浅色时是近黑） */
  --zq-primary: #18181B;
  --zq-primary-dark: #3F3F46;
  --zq-on-primary: #FFFFFF;
  --zq-tint: rgba(24,24,27,0.06);
  --zq-tint-strong: rgba(24,24,27,0.14);
  --zq-accent: #18181B;
  --zq-focus: 0 0 0 3px rgba(24,24,27,0.16);
  /* 状态色 */
  --zq-ok: #2F7A55;
  --zq-ok-tint: rgba(47,122,85,0.10);
  --zq-warn: #A15C07;
  --zq-warn-tint: rgba(161,92,7,0.10);
  --zq-bad: #B42318;
  --zq-bad-tint: rgba(180,35,24,0.08);
  /* 四象限：重要且紧急 / 重要不紧急 / 紧急不重要 / 不重要不紧急 —— 有语义，不跟强调色走 */
  --zq-q1: #B42318;
  --zq-q1-bg: #FDF3F2;
  --zq-q1-border: #F3D3CF;
  --zq-q2: #1D5BA8;
  --zq-q2-bg: #F0F5FC;
  --zq-q2-border: #CFDDF2;
  --zq-q3: #A15C07;
  --zq-q3-bg: #FBF4EA;
  --zq-q3-border: #EED9B8;
  --zq-q4: #2F7A55;
  --zq-q4-bg: #EEF7F2;
  --zq-q4-border: #CBE3D6;
  /* 阴影两级：卡片几乎不用阴影（靠描边），弹出层用第二级 */
  --zq-sh1: 0 1px 2px rgba(0,0,0,0.04);
  --zq-sh2: 0 8px 24px rgba(0,0,0,0.08);
  /* 侧栏 */
  --zq-sb-bg: #F5F5F6;
  --zq-sb-text: #52525B;
  --zq-sb-border: #E9E9EC;
  --zq-sb-active-bg: rgba(24,24,27,0.06);
  --zq-sb-active-text: #18181B;
  --zq-input-bg: #FFFFFF;
  /* 迷你番茄钟的胶囊（第五十轮）：半透明的深色，浮在什么背景上都看得清 —— 不跟着明暗变，深色那一块写一样的值 */
  --zq-mini-bg: #1C1C1E;
  --zq-mini-text: #FFFFFF;
  --zq-mini-text2: #B4B4B8;
  --zq-mini-line: rgba(255,255,255,0.14);
  /* 圆角三级 */
  --zq-rs: 6px;
  --zq-rm: 10px;
  --zq-rl: 14px;
  /* 字阶、间距、字重：以后的样式只从这里取（docs/ui-plan.md 第 1 步）。
     正文 13px（第四十轮做到一半用户说「或许字体设计的稍微更小一点会更好」—— 整体小一档：正文 14 → 13、标题 24 → 20、大数字 30 → 26）；
     中文最小不低于 12px */
  --zq-fs-2xs: 11px;   /* 第七十八轮：两侧面板里的元信息、差异行这类最密的字（原来 10 / 10.5 / 11px 三种） */
  --zq-fs-xs: 12px;
  --zq-fs-sm: 13px;
  --zq-fs-base: 14px;
  --zq-fs-md: 15px;
  --zq-fs-lg: 18px;
  --zq-fs-xl: 20px;
  --zq-fs-2xl: 26px;
  /* 知识 Wiki 的正文（第八十四轮，用户要照 Obsidian：正文 16px、标题加粗、按比例递减）—— 只给 Wiki 正文和它的编辑器，全站别处不动 */
  --zq-fs-prose: 16px;
  --zq-fs-prose-h1: 28px;
  --zq-fs-prose-h2: 24px;
  --zq-fs-prose-h3: 20px;
  --zq-fs-prose-h4: 18px;
  --zq-sp-1: 4px;
  --zq-sp-2: 8px;
  --zq-sp-3: 12px;
  --zq-sp-4: 16px;
  --zq-sp-5: 20px;
  --zq-sp-6: 24px;
  --zq-sp-7: 32px;
  --zq-sp-8: 40px;
  --zq-fw-regular: 400;
  --zq-fw-medium: 500;
  --zq-fw-semibold: 600;
  /* 字体只有这一处定义。深色、强调色那几块只覆盖颜色，不设字体，所以这两个值处处生效。
     第三十九轮（用户定的「switch ui text to system sans-serif to all」）：一律用系统无衬线字体 —— 苹方 / 微软雅黑 / 系统 UI 字体，
     不再从 Google Fonts 取 Noto Serif SC：那个样式表挡渲染、也挡脚本，这台机器的网络上没缓存时一次 1.3～2.7 秒；而且衬线体做按钮、表格、标签，看着像排版作业。
     --zq-fontM 只给代码（代码块、diff、路径、命令、源码编辑器）；数字不用它，用 .zq-num（正文字体 + 等宽数位）。
     --zq-fontM 的拉丁部分是等宽字体，中文部分刻意回落到与正文同一族：字体回退是<逐字符>生效的，等宽字体都没有中文字形 ——
     于是中文和页面其余部分一样，拉丁字母与符号仍然等宽，Markdown 源码里该对齐的地方照样对齐。
     此前 --zq-fontM 从未被定义过，而 zhiqu-api.js 的源码编辑器写的是 var(--zq-fontM, monospace)，
     于是回落到裸 monospace，中文由系统随便挑一个字体顶上 —— 那就是「源码模式字体很怪」的来源。 */
  /* 象限色的 -bg / -border 曾经定义成 --zq-q1bg / --zq-q1bd（中间没有连字符），
     而所有消费方写的都是 --zq-q1-bg / --zq-q1-border —— 两边从来没对上。
     var() 找不到变量又没有回落时，属性会变成无效值并回落到初始值：background 变透明。
     于是四象限的底色胶囊一直是透明的（实测 rgba(0,0,0,0)），只有文字颜色是对的。
     这种错配没有任何报错，也不会让页面崩，只是颜色悄悄没了。 */
  --zq-fontBody: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Segoe UI", "Noto Sans CJK SC", "Source Han Sans SC", "Helvetica Neue", Arial, sans-serif;
  --zq-fontM: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", "PingFang SC", "Microsoft YaHei", monospace;
  color-scheme: light;
}

/* 深色（晚上）：近黑底，卡片一层比一层亮一点 */
html[data-zq-mode="dark"]{
  --zq-bg: #0B0B0C;
  --zq-card: #141416;
  --zq-cmd: #8AB4FF;
  --zq-card-soft: #1C1C1F;
  --zq-text: #ECECEE;
  --zq-text2: #B4B4BC;
  --zq-text3: #8E8E98;
  --zq-border: #2A2A2E;
  --zq-border-soft: #212124;
  --zq-primary: #F4F4F5;
  --zq-primary-dark: #D4D4D8;
  --zq-on-primary: #18181B;
  --zq-tint: rgba(255,255,255,0.08);
  --zq-tint-strong: rgba(255,255,255,0.18);
  --zq-accent: #F4F4F5;
  --zq-focus: 0 0 0 3px rgba(255,255,255,0.22);
  --zq-ok: #5FB98A;
  --zq-ok-tint: rgba(95,185,138,0.14);
  --zq-warn: #E0A458;
  --zq-warn-tint: rgba(224,164,88,0.14);
  --zq-bad: #F07167;
  --zq-bad-tint: rgba(240,113,103,0.13);
  --zq-q1: #F07167;
  --zq-q1-bg: rgba(240,113,103,0.12);
  --zq-q1-border: rgba(240,113,103,0.30);
  --zq-q2: #7AA7E8;
  --zq-q2-bg: rgba(122,167,232,0.12);
  --zq-q2-border: rgba(122,167,232,0.30);
  --zq-q3: #E0A458;
  --zq-q3-bg: rgba(224,164,88,0.12);
  --zq-q3-border: rgba(224,164,88,0.30);
  --zq-q4: #5FB98A;
  --zq-q4-bg: rgba(95,185,138,0.12);
  --zq-q4-border: rgba(95,185,138,0.30);
  --zq-sh1: 0 1px 2px rgba(0,0,0,0.50);
  --zq-sh2: 0 10px 28px rgba(0,0,0,0.55);
  --zq-sb-bg: #0F0F11;
  --zq-sb-text: #B4B4BC;
  --zq-sb-border: #1F1F22;
  --zq-sb-active-bg: rgba(255,255,255,0.06);
  --zq-sb-active-text: #F4F4F5;
  --zq-input-bg: #0F0F11;
  --zq-mini-bg: #1C1C1E;
  --zq-mini-text: #FFFFFF;
  --zq-mini-text2: #B4B4B8;
  --zq-mini-line: rgba(255,255,255,0.14);
  color-scheme: dark;
}

/* 强调色：金（可选；第四十一轮起默认是黑白 —— 用户看过截图说「主题就黑白的吧」）。浅色时 #8C6D22，深色时 #D4B062 */
html[data-zq-accent="gold"]{
  --zq-primary: #8C6D22;
  --zq-primary-dark: #74591A;
  --zq-on-primary: #FFFFFF;
  --zq-tint: rgba(140,109,34,0.08);
  --zq-tint-strong: rgba(140,109,34,0.20);
  --zq-accent: #8C6D22;
  --zq-focus: 0 0 0 3px rgba(140,109,34,0.22);
}
html[data-zq-mode="dark"][data-zq-accent="gold"]{
  --zq-primary: #D4B062;
  --zq-primary-dark: #E2C682;
  --zq-on-primary: #18130A;
  --zq-tint: rgba(212,176,98,0.12);
  --zq-tint-strong: rgba(212,176,98,0.26);
  --zq-accent: #D4B062;
  --zq-focus: 0 0 0 3px rgba(212,176,98,0.30);
}

*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
/* 弹窗锁定整页滚动时仍保留滚动条槽位，正文和侧栏不向右跳。旧浏览器由 openModal 按实际宽度变化补偿。 */
html{scrollbar-gutter:stable;}
body{background:var(--zq-bg);color:var(--zq-text);font-family:var(--zq-fontBody);font-size:var(--zq-fs-sm);line-height:1.6;-webkit-font-smoothing:antialiased;overflow-wrap:anywhere;}
/* 第二十轮：一个没有空格的长网址 / 长单词原来能把看板撑宽 1374px、把聊天区推出去 3000px —— 用户的内容出现在几十处，
   一处一处补 overflow-wrap 补不完（此前已经补了七八处），所以放在 body 上一次给全。
   anywhere 而不是 break-word：后者不缩小 min-content，flex / grid 里的项目照样被长单词撑宽。
   表格单元格例外：不然一张 40 列的表会被压成每格一个字，宁可让表格在自己的框里横向滚动。
   按钮、下拉框是 nowrap，不受影响 —— 包括长得像按钮的 <a class="zq-btn-ghost">：它原来不在 nowrap 里，
   手机上「回到看板」被挤成两行，有了 anywhere 之后还会从词中间断开。 */
td,th{overflow-wrap:normal;}
h1,h2,h3,h4,h5,h6,p{margin:0;}
/* 加粗：浏览器默认是 700，苹方的粗体很重 —— 和 Claude 的应用一样只用到半粗（第四十一轮，用户要「字体细一点但是也能看清」） */
b,strong{font-weight:var(--zq-fw-semibold);}
a{color:inherit;text-decoration:none;}
button,input,select,textarea{font-family:inherit;color:inherit;}
button,select,.zq-btn,.zq-btn-ghost{white-space:nowrap;}
input:not([type=checkbox]):not([type=radio]){width:100%;}
input,textarea{min-width:0;max-width:100%;}
select{max-width:100%;}
.zq-mono{font-family:var(--zq-fontM);}
/* 图标（第四十二轮）：一套线性 SVG，颜色跟着文字走；默认 16px，按钮里 15px、小按钮里 14px */
.zq-icon{display:block;width:16px;height:16px;flex:none;}
[data-zq-icon]{display:inline-flex;align-items:center;justify-content:center;flex:none;}
.zq-btn .zq-icon,.zq-btn-ghost .zq-icon,.zq-btn-danger .zq-icon{width:15px;height:15px;}
.zq-sm .zq-icon,.zq-cbtn .zq-icon,.zq-xbtn .zq-icon,.zq-tbtn .zq-icon{width:14px;height:14px;}
/* 数字、日期、时间：正文字体 + 等宽数位（一列数字照样对齐），不用等宽字体 —— 等宽字体只给代码（第三十九轮） */
.zq-num{font-family:var(--zq-fontBody);font-variant-numeric:tabular-nums;}
/* hidden 属性必须真的能藏住东西。
   它本身只是 UA 样式表里的 [hidden]{display:none}，优先级是 (0,1,0) —— 作者样式表里
   任何一个设了 display 的类选择器都能压过它。于是 <button class="zq-btn-ghost" hidden>
   是完全可见的，而 JS 里读 el.hidden 得到 true：代码、日志、断点全都说藏起来了，
   只有屏幕上还显示着。2026-09-21 在代码工作区的「上一层」「返回目录」两个按钮上实地撞到，
   实测 hidden=true 而 getComputedStyle().display='flex'。
   这一条一旦删掉，全站每个带 hidden 的 .zq-btn-ghost / .zq-ai-attachments 会一起复发，
   而且不会有任何报错 —— 由 FrontendTokenAndDateTest.hidden必须真的能藏住 盯着。 */
[hidden]{display:none !important;}

::selection{background:var(--zq-tint-strong);}
::-webkit-scrollbar{width:10px;height:10px;}
::-webkit-scrollbar-thumb{background:rgba(128,134,144,0.35);border-radius:6px;border:2px solid transparent;background-clip:content-box;}
::-webkit-scrollbar-track{background:transparent;}
input:focus,select:focus,textarea:focus{outline:none;box-shadow:var(--zq-focus);}
/* 键盘焦点：一圈强调色的光晕（鼠标点的不显示） */
button:focus-visible,a:focus-visible,[tabindex]:focus-visible{outline:none;box-shadow:var(--zq-focus);}
input::-webkit-calendar-picker-indicator{opacity:.6;cursor:pointer;}
@keyframes zqFadeIn{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:translateY(0);}}
@keyframes zqPulse{0%,100%{opacity:1;}50%{opacity:.35;}}

/* ── 应用外壳 ── */
.zq-app{display:flex;min-height:100vh;}

/* ── 折叠侧栏 ────────────────────────────────────────────────────────────
   折叠只改「宽度 + 文字可见性」，不改结构：导航项仍是同一批 <a>，
   高亮、滚动位置记忆、setAdminNav 的增删都照常工作。
   若改成折叠时渲染另一套 DOM，那三样都得各写一遍折叠版 —— 同一事实两份拷贝。 */
.zq-side.is-collapsed{width:56px;padding-left:8px;padding-right:8px;}
.zq-side.is-collapsed .zq-brand-name,
.zq-side.is-collapsed .zq-nav-group,
.zq-side.is-collapsed .zq-nav a > span:not(.zq-ic),
.zq-side.is-collapsed .zq-user > div:not(.zq-avatar){display:none;}
.zq-side.is-collapsed .zq-brand{flex-direction:column;justify-content:center;padding-left:0;padding-right:0;}
.zq-side.is-collapsed .zq-nav a{justify-content:center;padding-left:0;padding-right:0;}
.zq-side.is-collapsed .zq-user{justify-content:center;}
.zq-side.is-collapsed .zq-side-pomo{flex-direction:column;gap:2px;padding-left:0;padding-right:0;}
.zq-side.is-collapsed .zq-side-pomo-label{display:none;}
.zq-side.is-collapsed .zq-side-pomo-time{font-size:var(--zq-fs-xs);}
.zq-main.is-side-collapsed{margin-left:56px;}

/* 收起按钮：品牌那一行右边一个小图标按钮（第四十三轮），收起后在品牌标志下面；折叠后它是唯一的回路 */
.zq-side-toggle{flex:none;display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:var(--zq-rs);
  background:transparent;color:var(--zq-text3);cursor:pointer;}
.zq-side-toggle:hover{color:var(--zq-sb-active-text);background:var(--zq-sb-active-bg);}

/* 折叠后靠 title 出名称 —— 第四十五轮起由 zhiqu-ui.js 的 setupTips 画（.zq-tip）：原来说「原生的在所有平台都对」，
   可桌面应用的 WKWebView 根本不显示原生的 title 提示（用户：「鼠标悬停的时候也没有显示名字」）。 */
.zq-side{position:fixed;inset:0 auto 0 0;width:188px;background:var(--zq-sb-bg);border-right:1px solid var(--zq-sb-border);display:flex;flex-direction:column;padding:var(--zq-sp-5) var(--zq-sp-3) var(--zq-sp-4);z-index:100;}
/* 桌面应用：红黄绿按钮（y 8–24）和外壳的拖拽条（0–28）在最上面，侧栏的内容从它们下面开始（第八十轮） */
html.zq-desktop .zq-side{padding-top:38px;}
/* 空的日期 / 时间框画成占位的灰色（第八十轮：WebKit 把空框画成一个具体的日期时间，看着像填了；标记由 zhiqu-ui.js 打） */
input[data-zq-empty],input[data-zq-empty]::-webkit-datetime-edit{color:var(--zq-text3);}
input[data-zq-empty]::-webkit-datetime-edit-text{color:var(--zq-text3);}   /* 「/」「:」分隔符在单独的伪元素上，不跟着上一条变灰 */
.zq-brand{display:flex;align-items:center;gap:var(--zq-sp-2);padding:0 0 var(--zq-sp-4) 8px;margin-bottom:var(--zq-sp-2);}
.zq-brand-badge{width:26px;height:26px;flex:none;border-radius:var(--zq-rs);background:var(--zq-text);color:var(--zq-card);display:flex;align-items:center;justify-content:center;font-weight:var(--zq-fw-semibold);font-size:var(--zq-fs-sm);}
.zq-brand-name{flex:1;min-width:0;white-space:nowrap;overflow:hidden;font-weight:var(--zq-fw-medium);font-size:var(--zq-fs-sm);color:var(--zq-sb-active-text);line-height:1.3;}
.zq-brand-name span{opacity:.55;font-weight:var(--zq-fw-regular);}
.zq-nav{flex:1;display:flex;flex-direction:column;gap:2px;overflow-y:auto;min-height:0;}
.zq-nav-group{padding:var(--zq-sp-4) 10px var(--zq-sp-1);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-text3);}
.zq-nav a{display:flex;align-items:center;gap:10px;min-height:32px;padding:6px 10px;border-radius:var(--zq-rs);cursor:pointer;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-regular);color:var(--zq-sb-text);text-decoration:none;}
.zq-nav a:hover{background:var(--zq-sb-active-bg);}
.zq-nav a.active{color:var(--zq-sb-active-text);background:var(--zq-sb-active-bg);font-weight:var(--zq-fw-medium);}
/* 键盘走到导航项、收起按钮上：一圈焦点环（鼠标点不出现） */
.zq-nav a:focus-visible,.zq-side-toggle:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-nav a .zq-ic{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;opacity:.7;}
.zq-nav a.active .zq-ic{opacity:1;}
.zq-main{flex:1;margin-left:188px;min-width:0;padding:var(--zq-sp-7) var(--zq-sp-8) 80px;max-width:1420px;}
/* AI 是定高的对话页：底部留白交给输入区，外层不再叠加普通页面的 80px 页脚空间。 */
.zq-main:has(#zq-chat-col){padding-bottom:0;}
/* AI 助手、Wiki 的定高容器（第七十八轮从两页的内联挪来）：减的是 .zq-main 的上下 padding（AI 助手在认 :has 的浏览器里由下一条重算）。
   原来写死 110px（上 30 + 下 80），上边距换成 --zq-sp-7（32px）以后整页比窗口高 2px，点进表格的一格整页往上跳 2px（第八十五轮 review，桌面应用里） */
.zq-fill-page{display:flex;flex-direction:column;gap:12px;height:calc(100vh - var(--zq-sp-7) - 80px);min-height:520px;}
.zq-main>div:has(#zq-chat-col){height:calc(100vh - var(--zq-sp-7))!important;height:calc(100dvh - var(--zq-sp-7))!important;}
.zq-user{display:flex;align-items:center;gap:9px;padding:8px;margin-top:8px;border-radius:var(--zq-rs);cursor:pointer;}
.zq-user:hover{background:var(--zq-sb-active-bg);}
/* 第三十轮起头像是个按钮（点开菜单）：去掉按钮自带的边框、底色、字体 */
button.zq-user{width:100%;border:none;background:transparent;color:inherit;font:inherit;text-align:left;}
.zq-user > div:not(.zq-avatar){flex:1;}
.zq-user.active,.zq-user[aria-expanded="true"]{background:var(--zq-sb-active-bg);}
.zq-user:focus-visible{outline:none;box-shadow:var(--zq-focus);}
/* 番茄钟在跑 / 暂停着：头像上面一行「专注中 18:42」（第四十九轮，全站共用一个钟）；暂停时变灰。不跑的时候 hidden（全局那条 [hidden] 带 !important，压得过这里的 display:flex） */
.zq-side-pomo{display:flex;align-items:center;gap:10px;min-height:32px;padding:6px 10px;margin-top:8px;border-radius:var(--zq-rs);font-size:var(--zq-fs-sm);color:var(--zq-sb-active-text);text-decoration:none;}
.zq-side-pomo:hover{background:var(--zq-sb-active-bg);}
.zq-side-pomo:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-side-pomo .zq-ic{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;}
.zq-side-pomo-label{flex:1;min-width:0;white-space:nowrap;}
.zq-side-pomo.is-paused{color:var(--zq-text3);}
.zq-avatar{width:28px;height:28px;flex:none;border-radius:50%;background:var(--zq-card-soft);border:1px solid var(--zq-border);color:var(--zq-text2);display:flex;align-items:center;justify-content:center;font-weight:var(--zq-fw-medium);font-size:var(--zq-fs-xs);}

/* ── 组件 ── */
.zq-eyebrow{margin:0 0 var(--zq-sp-1);color:var(--zq-text3);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);}
.zq-h1{margin:0;font-size:var(--zq-fs-xl);font-weight:var(--zq-fw-medium);letter-spacing:-.02em;line-height:1.3;}
/* 页面头部（第四十三轮）：标题 + 可选一行说明在左、操作在右，放不下就换行。每页一样写，不再各写各的内联样式；
   标题上面那行小字（「任务中心」「数据洞察」……）去掉了 —— 侧栏已经亮着在哪一页 */
.zq-page-head{display:flex;align-items:center;justify-content:space-between;gap:var(--zq-sp-3) var(--zq-sp-4);flex-wrap:wrap;min-height:36px;}
.zq-page-head>div:first-child{min-width:0;}
.zq-page-sub{display:block;margin-top:2px;color:var(--zq-text3);font-size:var(--zq-fs-sm);line-height:1.5;}
.zq-page-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--zq-sp-2);flex-wrap:wrap;}
.zq-clip{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-h2{margin:0;font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);letter-spacing:-.01em;line-height:1.4;}
.zq-card{padding:var(--zq-sp-5);border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);}
.zq-card-lg{box-shadow:var(--zq-sh2);}
.zq-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 14px;border:1px solid var(--zq-primary);border-radius:var(--zq-rs);background:var(--zq-primary);color:var(--zq-on-primary);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);cursor:pointer;transition:background .12s ease,border-color .12s ease;}
.zq-btn:hover{background:var(--zq-primary-dark);border-color:var(--zq-primary-dark);}
/* 写请求还没回来（zhiqu-api.js 的 writeStarted，第二十二轮）：刚点的按钮变淡、光标转圈；页面顶上一句「正在保存…」 */
button[aria-busy="true"]{opacity:.62;cursor:progress;}
#zq-saving{position:fixed;left:50%;top:calc(env(safe-area-inset-top, 0px) + 10px);transform:translateX(-50%);z-index:99998;padding:6px 14px;border-radius:999px;background:var(--zq-card);border:1px solid var(--zq-border);box-shadow:var(--zq-sh2);color:var(--zq-text2);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);pointer-events:none;}
#zq-saving[hidden]{display:none;}
.zq-btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 14px;border-radius:var(--zq-rs);background:var(--zq-card);color:var(--zq-text);border:1px solid var(--zq-border);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-regular);cursor:pointer;transition:background .12s ease;}
.zq-btn-ghost:hover{background:var(--zq-card-soft);}
.zq-input,.zq-select,.zq-textarea{height:32px;padding:0 12px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-input-bg);color:var(--zq-text);font-size:var(--zq-fs-sm);transition:border-color .12s ease,box-shadow .12s ease;}
.zq-input:focus,.zq-select:focus,.zq-textarea:focus{border-color:var(--zq-primary);}
.zq-input::placeholder,.zq-textarea::placeholder{color:var(--zq-text3);}
/* 不能改的时候看得出来（第四十九轮：番茄钟在跑时时长锁住，原来锁住的下拉框和能点的一模一样，点了没反应） */
.zq-input:disabled,.zq-select:disabled,.zq-textarea:disabled{color:var(--zq-text3);cursor:not-allowed;}
.zq-textarea{height:auto;min-height:64px;padding:var(--zq-sp-2) var(--zq-sp-3);line-height:1.6;resize:vertical;}
.zq-label{font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-text2);}
.zq-field{display:flex;flex-direction:column;gap:var(--zq-sp-2);}
.zq-badge{display:inline-flex;align-items:center;height:20px;padding:0 var(--zq-sp-2);border-radius:var(--zq-rs);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);}
.zq-stat{padding:var(--zq-sp-4) var(--zq-sp-5);border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);}
.zq-stat-label{display:block;color:var(--zq-text2);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-regular);}
.zq-stat-num{display:block;margin-top:var(--zq-sp-2);font-variant-numeric:tabular-nums;font-size:var(--zq-fs-2xl);font-weight:var(--zq-fw-medium);letter-spacing:-.02em;line-height:1.1;}
.zq-grid{display:grid;gap:12px;}

/* ── 看板（第四十八轮，界面打磨第 5 步）── */
/* 逾期：大于 0 时标签旁边一个红点（dashboard.js 加 is-alert）；数字不再写死大红 */
.zq-stat.is-alert .zq-stat-label::after{content:"";display:inline-block;width:6px;height:6px;margin-left:6px;vertical-align:middle;border-radius:50%;background:var(--zq-bad);}
/* 本周日历：一天一格（星期、日期、一排点、几项），点一天看那天的清单。.zq-week 是容器：窄的时候每一格换成竖排（见下面的 @container） */
.zq-week{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;container-type:inline-size;}
.zq-day{display:flex;flex-direction:column;align-items:stretch;gap:8px;min-width:0;padding:10px 10px 11px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:transparent;color:var(--zq-text);font:inherit;text-align:left;cursor:pointer;transition:background .12s ease,border-color .12s ease;}
.zq-day:hover{background:var(--zq-sb-active-bg);}
.zq-day.is-on{border-color:var(--zq-text3);background:var(--zq-card);}
.zq-day:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-day-head{display:flex;align-items:center;justify-content:space-between;gap:4px;}
.zq-day-week{color:var(--zq-text3);font-size:var(--zq-fs-xs);white-space:nowrap;}
.zq-day-num{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;margin-right:-4px;border-radius:999px;font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);}
.zq-day.is-today .zq-day-week{color:var(--zq-text);}
.zq-day.is-today .zq-day-num{background:var(--zq-primary);color:var(--zq-on-primary);}
.zq-day-dots{display:flex;flex-wrap:wrap;align-items:center;gap:3px;min-height:6px;}
.zq-day-dots i{width:6px;height:6px;border-radius:50%;background:var(--zq-text3);}
.zq-day-dots i.q1{background:var(--zq-q1);}
.zq-day-dots i.q2{background:var(--zq-q2);}
.zq-day-dots i.q3{background:var(--zq-q3);}
.zq-day-dots i.q4{background:var(--zq-q4);}
.zq-day-dots i.done{opacity:.3;}
.zq-day-more{color:var(--zq-text3);font-size:10px;line-height:1;}
.zq-day-count{color:var(--zq-text3);font-size:var(--zq-fs-xs);}
/* 日历窄了（第五十三轮，用户在桌面应用里看到的）：星期和日期并排一格至少要 74px（留白 20 + 星期 24 + 间隔 4 + 日期 26），
   桌面应用常用的 960–1200 宽里日历那张卡片只有 320–360，一格 40 上下 —— 日期被挤出格子、压在旁边一格上。
   日历本身窄于 560（7 × 74 + 6 × 6）就换成竖排：星期在上、日期在下、居中，「N 项」藏起来（读屏照念 aria-label）。
   手机上日历一样窄，原来手机那段 @media 里的这几条挪到这里，一处写 */
@container (max-width: 560px){
  .zq-day{padding:8px 3px 9px;gap:6px;align-items:center;}
  .zq-day-head{flex-direction:column;gap:3px;}
  .zq-day-num{margin-right:0;}
  .zq-day-dots{justify-content:center;}
  .zq-day-count{display:none;}
}
/* 再窄（320 宽的手机上日历不到 200）：一格 22–25，「周一」两个字 24、日期的圆 26 —— 左右不留白、星期字小一号、圆小一号 */
@container (max-width: 260px){
  .zq-day{padding-left:0;padding-right:0;}
  .zq-day-week{font-size:10px;}
  .zq-day-num{min-width:20px;height:20px;font-size:var(--zq-fs-sm);}
}
/* 清单：一条一行、行间细线 */
.zq-agenda{display:flex;flex-direction:column;}
.zq-agenda-row{display:grid;grid-template-columns:52px minmax(0,1fr) auto;gap:12px;align-items:center;padding:11px 2px;border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-base);}
.zq-agenda-row:last-child{border-bottom:none;}
.zq-agenda-row.is-done{opacity:.5;}
.zq-agenda-time{color:var(--zq-text2);font-size:var(--zq-fs-sm);}
.zq-agenda-meta{display:flex;align-items:center;gap:8px;min-width:0;margin-top:3px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-agenda-tag{display:inline-flex;align-items:center;gap:5px;flex:none;color:var(--zq-text2);}
.zq-agenda-tag i,.zq-quad-name i{width:6px;height:6px;flex:none;border-radius:50%;}
.zq-agenda-btn{height:28px;padding:0 11px;font-size:var(--zq-fs-xs);}
/* 四象限：一张卡里四格，格与格之间一道细线；象限色只留在名字前的小点上 */
.zq-quads{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-border-soft);}
.zq-quad{display:flex;flex-direction:column;gap:2px;min-width:0;padding:12px 14px 10px;background:var(--zq-card);}
.zq-quad-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:4px;}
.zq-quad-name{display:inline-flex;align-items:center;gap:6px;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);white-space:nowrap;}
.zq-quad-count{color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-quad-item{padding:5px 0;border-top:1px solid var(--zq-border-soft);font-size:var(--zq-fs-sm);line-height:1.45;}
.zq-quad-empty{padding:5px 0;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
/* 临近截止：右边写还有几天，今天和逾期的标红 */
.zq-ddl-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 0;border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-sm);}
.zq-ddl-row:last-child{border-bottom:none;}
.zq-ddl-when{display:block;margin-top:2px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-ddl-due{flex:none;color:var(--zq-text2);font-size:var(--zq-fs-xs);white-space:nowrap;}
.zq-ddl-due.is-near{color:var(--zq-bad);}
/* 番茄钟：标题和「今天第 N 轮」一行、环 160px */
.zq-pomo{text-align:center;}
.zq-pomo-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:8px;text-align:left;}
.zq-pomo-round{color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-pomo-dial{position:relative;width:160px;margin:0 auto;}
/* 专注时长、关联任务两栏（第五十三轮）：原来是内联的 1fr 1fr —— 1fr 最小是内容的宽度，任务名长时下拉框按最长的选项撑开、撑出卡片
   （WebKit 里量过：多出 331px）。minmax(0,1fr) 这一条就够了：格子可以比内容窄，下拉框跟着格子拉伸 */
.zq-pomo-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:10px 0;text-align:left;}
.zq-pomo-fields .zq-select{height:30px;}
/* ── 看板（第八十一轮从 dashboard.html / pages/dashboard.js 的内联挪进来）：上下一列；四个数是 .zq-stat-grid（手机两个一排，zq-phone-2col）；
   左右两栏（手机一栏，zq-phone-1col），右栏粘在顶上 ── */
.zq-dash{display:flex;flex-direction:column;gap:18px;}
.zq-dash-cols{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:18px;align-items:start;}
.zq-dash-main{display:flex;flex-direction:column;gap:18px;min-width:0;}
.zq-dash-aside{display:flex;flex-direction:column;gap:18px;position:sticky;top:24px;}
/* 卡片头（本周、四象限）用例行计划、统计两页同一条 .zq-card-head（原来看板自己写的下边距是 14，这里跟着它们是 12）；看板里的按钮 30 高 */
.zq-dash .zq-card-head .zq-btn-ghost{height:30px;}
/* 本周的翻页：三个一样高（原来左右两个没写高、是 32，「本周」30，差出 1px） */
.zq-week-nav{display:inline-flex;align-items:center;gap:6px;}
.zq-week-nav .is-icon{width:30px;padding:0;}
#zq-today-title{margin-bottom:6px;}
.zq-dash-ddl>.zq-h2{margin-bottom:4px;}
#zq-ddl{display:flex;flex-direction:column;}
/* 例行完成的进度：宽度是数据（dashboard.js 写 width） */
.zq-dash-progress{height:5px;margin-top:10px;overflow:hidden;border-radius:999px;background:var(--zq-tint);}
.zq-dash-progress>i{display:block;width:0;height:100%;border-radius:inherit;background:var(--zq-primary);}
/* 「今天」的一行、四象限的一条、临近截止的一条：标题最多两行 */
.zq-agenda-main,.zq-ddl-main{min-width:0;}
.zq-agenda-title{line-height:1.45;}
.zq-ddl-title{line-height:1.4;font-weight:var(--zq-fw-medium);}
.zq-agenda-title,.zq-quad-item,.zq-ddl-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.zq-agenda-desc{flex:1 1 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* 象限色的小圆点：四个象限 + 例行，按 data-q 上色（原来 JS 拼 style="background:…"） */
.zq-qdot[data-q="q1"]{background:var(--zq-q1);}
.zq-qdot[data-q="q2"]{background:var(--zq-q2);}
.zq-qdot[data-q="q3"]{background:var(--zq-q3);}
.zq-qdot[data-q="q4"]{background:var(--zq-q4);}
.zq-qdot[data-q="routine"]{background:var(--zq-text3);}
/* 番茄钟：表盘中间的时间和状态、两个下拉的标签、一排按钮、底下一行今天的数 */
.zq-pomo-dial #zq-pomo-ring{transition:stroke-dasharray .4s linear;}
.zq-pomo-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;}
.zq-pomo-time{font-size:30px;font-weight:var(--zq-fw-medium);line-height:1;}
.zq-pomo-phase{margin-top:6px;color:var(--zq-text2);font-size:var(--zq-fs-xs);}
.zq-pomo-fields .zq-field{gap:5px;}
.zq-pomo-fields .zq-label{font-size:var(--zq-fs-xs);}
.zq-pomo-acts{display:flex;justify-content:center;gap:8px;flex-wrap:wrap;}
.zq-pomo-acts .zq-btn,.zq-pomo-acts .zq-btn-ghost{height:30px;}
.zq-pomo-count{margin-top:12px;padding-top:10px;border-top:1px solid var(--zq-border-soft);color:var(--zq-text2);font-size:var(--zq-fs-xs);}
/* 任务页的上下一列（第八十一轮从 tasks.html 的内联挪进来） */
.zq-tasks-page{display:flex;flex-direction:column;gap:16px;}
/* 成就 / 设置两页打开弹窗之前那一句 */
.zq-page-loading{color:var(--zq-text3);font-size:var(--zq-fs-sm);}
.zq-row{display:flex;align-items:center;gap:12px;}
.zq-table{border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);overflow:hidden;}
.zq-table .zq-thead{background:var(--zq-card-soft);border-bottom:1px solid var(--zq-border);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-text3);padding:10px var(--zq-sp-4);}
.zq-table .zq-tr{border-bottom:1px solid var(--zq-border-soft);padding:10px 16px;}
.zq-table .zq-tr:hover{background:var(--zq-card-soft);}
.zq-scroll-x{overflow-x:auto;}

/* ── 原生下拉/日历弹层随主题 ── */
select,::picker(select){appearance:base-select;}
select{display:inline-flex;align-items:center;justify-content:space-between;white-space:nowrap;overflow:hidden;}
select::picker-icon{color:var(--zq-text3);flex:none;margin-left:8px;}
select::selectedcontent{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
::picker(select){background:var(--zq-card);color:var(--zq-text);border:1px solid var(--zq-border);border-radius:10px;box-shadow:var(--zq-sh2);padding:5px;margin-top:4px;max-width:min(360px,92vw);}
option{padding:7px 11px;border-radius:var(--zq-rs);font-size:var(--zq-fs-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
option:hover,option:focus{background:var(--zq-tint);}
option:checked{background:var(--zq-tint);color:var(--zq-text);font-weight:var(--zq-fw-medium);}
/* 不认 base-select 的（Safari、桌面应用的 WKWebView）：上面那几条都不生效，退回原生的灰渐变和上下箭头（第五十三轮，用户在桌面应用里看到的）——
   去掉原生样子，自己画一个小箭头（两段渐变拼的，颜色用令牌，明暗跟着变） */
@supports not (appearance: base-select){
  .zq-select,.zq-composer-model{-webkit-appearance:none;appearance:none;padding-right:26px;
    background-image:linear-gradient(45deg,transparent 50%,var(--zq-text3) 50%),linear-gradient(135deg,var(--zq-text3) 50%,transparent 50%);
    background-position:calc(100% - 14px) 55%,calc(100% - 9px) 55%;background-size:5px 5px,5px 5px;background-repeat:no-repeat;}
}

/* ── 面板折叠（AI 两侧 / Wiki 目录·检查；flex 容器内） ── */
.zq-pop{position:fixed;z-index:6000;width:248px;background:var(--zq-card);color:var(--zq-text);border:1px solid var(--zq-border);border-radius:var(--zq-rm);box-shadow:var(--zq-sh2);padding:var(--zq-sp-2);}
.zq-pop .zq-pop-t{font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-text3);padding:4px 8px 6px;}
.zq-pop .zq-opt{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text);cursor:pointer;font:13px/1.2 inherit;text-align:left;}
.zq-pop .zq-opt:hover{background:var(--zq-tint);}
.zq-pop .zq-opt .zq-dot{width:14px;height:14px;flex:none;border-radius:50%;border:2px solid var(--zq-border);}
.zq-pop .zq-opt.on{font-weight:var(--zq-fw-medium);}
.zq-pop .zq-opt.on .zq-dot{border-color:var(--zq-primary);background:var(--zq-primary);box-shadow:inset 0 0 0 2px var(--zq-card);}
.zq-pop .zq-sep{height:1px;background:var(--zq-border);margin:8px 4px;}
.zq-pop .zq-modes{display:flex;gap:8px;padding:2px 4px;}
.zq-pop .zq-modes .zq-m{flex:1;height:30px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-card);color:var(--zq-text2);font:var(--zq-fw-regular) var(--zq-fs-xs)/1 var(--zq-fontBody);cursor:pointer;}
.zq-pop .zq-modes .zq-m.on{border-color:var(--zq-text);color:var(--zq-text);background:var(--zq-card-soft);}
[data-zq-collapse]{--zq-panel-expanded-width:210px;position:relative;display:flex;flex-direction:column;overflow-y:auto!important;}
/* 第六十四轮：宽度连续变化，内容短暂淡出；保留原面板尺寸，不从 auto 或 display:none 瞬间跳变。
   ready 在初始布局完成后才加，首次打开 / 刷新直接呈现记住的状态。 */
[data-zq-collapse].zq-panel-ready{width:var(--zq-panel-expanded-width);overflow-x:hidden!important;transition:flex-basis .24s cubic-bezier(.22,.61,.36,1),width .24s cubic-bezier(.22,.61,.36,1),padding .24s ease,opacity .18s ease,transform .24s cubic-bezier(.22,.61,.36,1);}
[data-zq-collapse]>*:not(.zq-rail){opacity:1;transform:translateX(0);}
/* 第七十轮：内容和竖条的淡入淡出也只在 ready 之后才有。原来写在「收起」这条上、一直生效：刷新时宽度一下缩到 44px，
   里面的内容还要 0.12–0.24 秒才藏起来 —— 每次打开 Wiki 都闪一下挤成一条的目录和页面检查（PanelMotionTest） */
[data-zq-collapse].zq-panel-ready>*:not(.zq-rail){transition:opacity .16s ease,transform .24s ease,visibility 0s;}
/* 两侧面板的收起 / 展开按钮只是图标（第四十三轮：AI 助手统一成一种底色之后，白底描边的小方块很跳） */
/* 按钮先排在内容前面，再贴住面板的滚动口；负下边距让它仍浮在标题右侧，不挤动原布局。 */
.zq-cbtn{position:sticky;top:10px;align-self:flex-end;order:-1;flex:0 0 24px;margin:10px 10px -34px 0;z-index:6;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text3);font-size:13px;line-height:1;cursor:pointer;padding:0;}
.zq-cbtn:hover{background:var(--zq-sb-active-bg);color:var(--zq-text);}
/* 展开的面板第一行（标题那一行）右边给收起按钮让位（第四十五轮）：原来 Wiki 目录的「4 页」叠在按钮底下，
   AI 助手那边靠「新建」按钮自己写 margin-right 躲开。setupPanels 把竖条插在最前面，所以紧跟竖条的就是标题那一行 */
[data-zq-collapse]>.zq-rail+*{padding-right:44px!important;}
/* 悬停提示（第四十五轮，zhiqu-ui.js 的 setupTips）：反色的小签，不挡鼠标 */
.zq-tip{position:fixed;left:0;top:0;z-index:3000;max-width:280px;padding:5px 9px;border-radius:var(--zq-rs);background:var(--zq-text);color:var(--zq-bg);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);line-height:1.45;overflow-wrap:anywhere;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .1s ease;}
.zq-tip.is-on{opacity:1;visibility:visible;}
[data-zq-collapse].zq-collapsed{flex:0 0 44px!important;width:44px!important;min-width:44px!important;padding:10px 0!important;overflow:hidden!important;align-items:center;}
[data-zq-collapse].zq-collapsed>*:not(.zq-rail){opacity:0;visibility:hidden;pointer-events:none;transform:translateX(-8px);}
[data-zq-collapse].zq-panel-ready.zq-collapsed>*:not(.zq-rail){transition:opacity .12s ease,transform .24s ease,visibility 0s .24s;}
[data-zq-collapse="right"].zq-collapsed>*:not(.zq-rail){transform:translateX(8px);}
.zq-rail{position:absolute;left:0;right:0;top:10px;display:flex;flex-direction:column;align-items:center;gap:12px;padding-top:2px;opacity:0;visibility:hidden;pointer-events:none;}
.zq-panel-ready>.zq-rail{transition:opacity .12s ease,visibility 0s .12s;}
.zq-collapsed .zq-rail{opacity:1;visibility:visible;pointer-events:auto;}
.zq-panel-ready.zq-collapsed>.zq-rail{transition:opacity .16s ease .08s,visibility 0s;}
.zq-rail .zq-xbtn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text3);font-size:13px;cursor:pointer;padding:0;}
.zq-rail .zq-xbtn:hover{background:var(--zq-sb-active-bg);color:var(--zq-text);}
.zq-cbtn:focus-visible,.zq-rail .zq-xbtn:focus-visible{outline:none;box-shadow:var(--zq-focus);}
/* 桌面上收起的竖条只有图标按钮（第四十四轮；原来竖排着面板的名字），名字在按钮的提示里；手机上收起的面板是页签，字在 @media 里露出来 */
.zq-rail .zq-rlabel{display:none;cursor:pointer;font:var(--zq-fw-regular) var(--zq-fs-xs)/1 var(--zq-fontBody);color:var(--zq-text3);}
@media (prefers-reduced-motion:reduce){
  [data-zq-collapse].zq-panel-ready,[data-zq-collapse]>*:not(.zq-rail),[data-zq-collapse].zq-collapsed>*:not(.zq-rail),.zq-rail,.zq-collapsed .zq-rail{transition:none!important;}
}

/* 首屏遮罩：只有后台页和旧地址的跳转页还用（zhiqu-ui.js 的 holdsUntilBoot），接口渲染完成后由 zhiqu-api.js 揭示 */
html.zq-booting .zq-main{opacity:0;}
.zq-main{transition:opacity .18s ease;}

/* 页面之间切换（第三十九轮，用户说「页面切换非常不流畅」）：浏览器在新页面画出来之前一直显示旧页面，
   然后用很短的交叉淡化换过去 —— 原来是「白一下 → 主内容区空白 → 淡入」。侧栏两页一样、单独成组、不做动画，所以它不动。
   不认这几行的浏览器（Safari 18.2、Chrome 126 以前）照常整页切换，什么都不坏。 */
@view-transition{navigation:auto;}
.zq-side{view-transition-name:zq-side;}
::view-transition-old(root),::view-transition-new(root){animation-duration:.12s;}
::view-transition-group(zq-side),::view-transition-old(zq-side),::view-transition-new(zq-side){animation:none;}
@media (prefers-reduced-motion:reduce){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none !important;}}

/* ── Claude 风格弹窗（可复用；随主题切换） ── */
/* width:100vw —— 连滚动条的槽一起盖住（第七十五轮）：html 上的 scrollbar-gutter:stable 留着槽，固定定位的 inset:0 不算它，
   在占位滚动条的平台（Windows 上的浏览器、手机宽的 Chromium）右边漏一条没变暗的边 */
.zq-modal-mask{position:fixed;inset:0;width:100vw;z-index:8000;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(12,15,20,.46);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);animation:zqMaskIn .16s ease both;}
.zq-modal{width:440px;max-width:100%;max-height:calc(100vh - 48px);display:flex;flex-direction:column;background:var(--zq-card);color:var(--zq-text);border:1px solid var(--zq-border);border-radius:var(--zq-rl);box-shadow:0 24px 64px rgba(0,0,0,.24);overflow:hidden;animation:zqModalIn .2s cubic-bezier(.2,.8,.2,1) both;}
.zq-modal-head{display:flex;align-items:center;justify-content:space-between;gap:var(--zq-sp-3);padding:var(--zq-sp-4) var(--zq-sp-5);border-bottom:1px solid var(--zq-border-soft);}
.zq-modal-title{margin:0;font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);letter-spacing:-.01em;}
.zq-modal-close{width:28px;height:28px;flex:none;display:flex;align-items:center;justify-content:center;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text3);font-size:19px;line-height:1;cursor:pointer;}
.zq-modal-close:hover{background:var(--zq-card-soft);color:var(--zq-text);}
.zq-modal-body{padding:var(--zq-sp-5);overflow-y:auto;}
.zq-modal-body .zq-field{margin-bottom:var(--zq-sp-4);}
.zq-modal-actions{display:flex;justify-content:flex-end;gap:var(--zq-sp-2);margin-top:var(--zq-sp-2);}
/* 弹窗里两个一排的字段（任务表单）：手机上一个一排，见文件末尾那段 @media */
.zq-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;}
@keyframes zqMaskIn{from{opacity:0;}to{opacity:1;}}
@keyframes zqModalIn{from{opacity:0;transform:translateY(10px) scale(.98);}to{opacity:1;transform:none;}}
body.zq-modal-open{overflow:hidden;}

/* ── 头像菜单（第三十轮，zhiqu-ui.js 的 openUserMenu）：从左下角的头像向上弹出 ── */
.zq-user-menu{position:fixed;z-index:6000;padding:6px;background:var(--zq-card);color:var(--zq-text);border:1px solid var(--zq-border);border-radius:var(--zq-rm);box-shadow:var(--zq-sh2);animation:zqMenuIn .14s ease both;}
.zq-user-menu-head{display:flex;flex-direction:column;gap:2px;min-width:0;padding:7px 10px 9px;margin-bottom:4px;border-bottom:1px solid var(--zq-border-soft);}
.zq-user-menu-head strong{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-user-menu-head span{font-size:var(--zq-fs-xs);color:var(--zq-text3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-user-menu [role="menuitem"]{display:flex;align-items:center;gap:10px;width:100%;min-height:32px;padding:6px 10px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text);font:var(--zq-fw-regular) var(--zq-fs-sm)/1.2 var(--zq-fontBody);text-align:left;text-decoration:none;cursor:pointer;}
.zq-user-menu [role="menuitem"]:hover,.zq-user-menu [role="menuitem"]:focus-visible{background:var(--zq-card-soft);outline:none;box-shadow:none;}
.zq-user-menu [aria-current="page"]{color:var(--zq-text);font-weight:var(--zq-fw-medium);}
.zq-user-menu .zq-ic{width:16px;height:16px;flex:none;display:inline-flex;align-items:center;justify-content:center;opacity:.7;}
.zq-user-menu-note{margin-left:auto;padding-left:8px;font-size:var(--zq-fs-xs);color:var(--zq-text3);white-space:nowrap;}
.zq-user-menu-sep{height:1px;margin:5px 4px;background:var(--zq-border-soft);}
.zq-user-menu-group{padding:6px 10px 3px;font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-text3);}
@keyframes zqMenuIn{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:none;}}

/* ── 设置弹窗（第三十轮，assets/settings.js）：Claude 那样左边分栏、右边内容。高度固定 —— 换栏时弹窗不跟着内容一跳一跳 ── */
.zq-modal-wide{width:880px;}
.zq-modal-body:has(> .zq-settings){padding:0;display:flex;flex-direction:column;min-height:0;overflow:hidden;}
.zq-settings{display:flex;height:min(640px, calc(100vh - 120px));min-height:0;}
.zq-settings-tabs{flex:none;width:168px;display:flex;flex-direction:column;gap:2px;padding:14px 10px;border-right:1px solid var(--zq-border-soft);background:var(--zq-card-soft);}
.zq-settings-tabs button{display:flex;align-items:center;flex:none;height:32px;padding:0 12px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text2);font:var(--zq-fw-regular) var(--zq-fs-sm)/1 var(--zq-fontBody);text-align:left;white-space:nowrap;cursor:pointer;}
.zq-settings-tabs button:hover{background:var(--zq-card);color:var(--zq-text);}
.zq-settings-tabs button.on{background:var(--zq-card);color:var(--zq-text);font-weight:var(--zq-fw-medium);box-shadow:0 0 0 1px var(--zq-border);}
.zq-settings-pane{flex:1;min-width:0;overflow-y:auto;padding:20px 24px 26px;}
.zq-modal-wide .zq-field{margin-bottom:0;}
/* 各栏的样子（第七十五轮：原来 settings.js 里 76 处内联样式，开关、状态的颜色、提醒渠道的显隐都是 JS 改 style） */
.zq-set-h3{margin:0 0 var(--zq-sp-3);font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);}
.zq-set-section{margin-top:var(--zq-sp-6);}
.zq-set-note{margin:0 0 var(--zq-sp-3);font-size:var(--zq-fs-xs);color:var(--zq-text3);line-height:1.6;}
.zq-set-hint{font-size:var(--zq-fs-xs);color:var(--zq-text3);line-height:1.5;}
.zq-set-callout{margin:0 0 var(--zq-sp-3);padding:var(--zq-sp-2) var(--zq-sp-3);border-radius:var(--zq-rs);background:var(--zq-tint);font-size:var(--zq-fs-xs);color:var(--zq-text2);line-height:1.55;}
.zq-set-box{display:flex;flex-direction:column;gap:3px;padding:10px 12px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);font-size:var(--zq-fs-xs);line-height:1.6;}
.zq-set-box>strong{font-weight:var(--zq-fw-medium);}
.zq-set-box>span{color:var(--zq-text3);}
.zq-set-box-warn{margin:2px 0 0;color:var(--zq-text2);}
.zq-set-row{display:flex;align-items:center;justify-content:space-between;gap:var(--zq-sp-3);margin-bottom:var(--zq-sp-4);}
.zq-set-row-text{font-size:var(--zq-fs-sm);color:var(--zq-text2);line-height:1.55;}
.zq-set-row-text b{color:var(--zq-text);}
.zq-set-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--zq-sp-3);}
.zq-set-grid>.is-wide{grid-column:1 / -1;}
.zq-settings-pane .zq-field{gap:6px;}
.zq-settings-pane .zq-input[readonly]{background:var(--zq-card-soft);color:var(--zq-text3);}
.zq-set-actions{display:flex;justify-content:flex-end;margin-top:14px;}
.zq-set-btns{display:flex;align-items:center;gap:var(--zq-sp-2);flex-wrap:wrap;}
.zq-set-status{margin:0;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-set-status[data-state="ok"]{color:var(--zq-ok);}
.zq-set-status[data-state="bad"]{color:var(--zq-bad);}
/* 个人资料：头像（按钮，键盘也换得了）、名字和身份、三个数 */
.zq-set-profile{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding-bottom:var(--zq-sp-4);margin-bottom:var(--zq-sp-4);border-bottom:1px solid var(--zq-border-soft);}
.zq-set-avatar{width:64px;height:64px;flex:none;display:flex;align-items:center;justify-content:center;padding:0;border:none;border-radius:50%;background:var(--zq-tint-strong);color:var(--zq-primary);font:var(--zq-fw-medium) 24px/1 var(--zq-fontBody);cursor:pointer;overflow:hidden;}
.zq-set-avatar img{width:100%;height:100%;object-fit:cover;}
.zq-set-who{flex:1;min-width:0;}
.zq-set-who .zq-h2{font-size:var(--zq-fs-lg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-set-who .zq-badge{margin-top:6px;background:var(--zq-tint);color:var(--zq-primary);}
.zq-set-nums{display:flex;gap:20px;text-align:center;}
.zq-set-nums strong{display:block;font-size:var(--zq-fs-lg);font-weight:var(--zq-fw-medium);}
.zq-set-nums span{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
/* AI 模型：卡片、四格探测状态（颜色按 data-state）、表单 */
.zq-set-models{display:flex;flex-direction:column;gap:10px;margin-bottom:18px;}
.zq-set-model{padding:12px 14px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);}
.zq-set-model-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;}
.zq-set-model-who{min-width:0;}
.zq-set-model-name{font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);}
.zq-set-model-id{margin-top:2px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-set-model .zq-badge{background:var(--zq-tint);color:var(--zq-primary);}
.zq-set-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--zq-sp-2);margin-top:11px;padding-top:11px;border-top:1px solid var(--zq-border-soft);}
.zq-set-tile{min-width:0;}
.zq-set-tile>span{display:block;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-set-tile>strong{display:block;margin-top:2px;font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);color:var(--zq-text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-set-tile>strong[data-state="ok"]{color:var(--zq-ok);}
.zq-set-tile>strong[data-state="bad"]{color:var(--zq-bad);}
.zq-set-tile>strong[data-state="muted"]{color:var(--zq-text3);}
.zq-set-model-meta{margin-top:9px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-set-model-acts{display:flex;gap:6px;flex-wrap:wrap;margin-top:11px;}
.zq-set-form{display:flex;flex-direction:column;gap:var(--zq-sp-3);padding-top:var(--zq-sp-4);border-top:1px solid var(--zq-border-soft);}
.zq-set-form>.zq-set-h3{margin:0;}
/* 提醒：渠道一块（选中的那个渠道的字段才露出来：hidden），命令行：设备码一行、已登录的列表；账号：一列输入框、一张两列的表 */
.zq-set-channel{display:flex;flex-direction:column;gap:9px;padding-top:14px;border-top:1px solid var(--zq-border-soft);}
.zq-set-channel>*{max-width:520px;}
.zq-set-channel .zq-input,.zq-set-channel .zq-select,.zq-set-code .zq-input{height:30px;font-size:var(--zq-fs-sm);}
.zq-set-inline{display:flex;align-items:center;gap:9px;}
.zq-set-inline>.zq-label{flex:none;}
.zq-set-inline>.zq-select{flex:1;}
.zq-set-group{display:flex;flex-direction:column;gap:6px;}
.zq-set-code{display:flex;gap:var(--zq-sp-2);max-width:420px;}
.zq-set-code .zq-input{flex:1;text-transform:uppercase;}
.zq-set-device{margin-top:var(--zq-sp-2);}
.zq-set-list{display:flex;flex-direction:column;gap:6px;}
.zq-set-token{display:flex;align-items:center;justify-content:space-between;gap:var(--zq-sp-2);padding:6px 8px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);font-size:var(--zq-fs-xs);}
.zq-set-token-who{min-width:0;}
.zq-set-token-who strong{font-weight:var(--zq-fw-medium);}
.zq-set-token-who .zq-mono,.zq-set-token-used{color:var(--zq-text3);}
.zq-set-stack{display:flex;flex-direction:column;gap:10px;max-width:360px;}
.zq-set-stack>.zq-btn{align-self:flex-start;}
.zq-set-kv>div{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 0;font-size:var(--zq-fs-sm);}
.zq-set-kv>div+div{border-top:1px solid var(--zq-border-soft);}
.zq-set-kv>div>span:first-child{flex:none;color:var(--zq-text2);}
.zq-set-kv>div>span:last-child{font-weight:var(--zq-fw-medium);text-align:right;}
/* 开关（提醒推送、让 AI 读我的任务）：只看 aria-checked。打开时滑块用「主色上的字」那个颜色 —— 深色下主色是浅的，白钮就看不见了 */
.zq-switch{position:relative;flex:none;width:42px;height:24px;padding:0;border:none;border-radius:999px;background:var(--zq-border);cursor:pointer;transition:background .2s;}
.zq-switch>i{position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transition:left .2s,background .2s;}
.zq-switch[aria-checked="true"]{background:var(--zq-primary);}
.zq-switch[aria-checked="true"]>i{left:21px;background:var(--zq-on-primary);}
/* 成就弹窗：一行说明 + 筛选（.zq-seg）、四个数、卡片（一行几张按宽度来） */
.zq-ach-view{display:flex;flex-direction:column;gap:14px;}
.zq-ach-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;font-size:var(--zq-fs-sm);color:var(--zq-text2);}
.zq-stat.is-primary .zq-stat-num{color:var(--zq-primary);}
.zq-ach-recent>strong{display:block;margin-top:10px;font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);line-height:1.3;}
.zq-ach-recent>span:last-child{display:block;margin-top:4px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-ach-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px;}
.zq-ach{display:flex;flex-direction:column;padding:16px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);box-shadow:var(--zq-sh1);}
.zq-ach-head{display:flex;align-items:center;gap:12px;margin-bottom:10px;}
.zq-ach-badge{width:42px;height:42px;flex:none;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--zq-card-soft);color:var(--zq-text3);}
.zq-ach-who{min-width:0;}
.zq-ach-who h3{margin:0;font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);}
.zq-ach-who span{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-ach p{flex:1;margin:0 0 10px;font-size:var(--zq-fs-sm);color:var(--zq-text2);line-height:1.55;}
.zq-ach-points{display:flex;justify-content:flex-end;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-ach.is-on{border-color:var(--zq-ok-tint);}
.zq-ach.is-on .zq-ach-badge{background:var(--zq-ok-tint);color:var(--zq-ok);}
.zq-ach.is-on .zq-ach-who span{color:var(--zq-ok);}

/* ── Wiki 文档工具栏（圆角、随主题；替换旧方框内联样式） ── */
.zq-toolbar{display:inline-flex;flex-wrap:wrap;align-items:center;gap:2px;padding:2px;border-radius:var(--zq-rs);background:var(--zq-card-soft);}
/* KaTeX 给读屏准备的那份 MathML 是 position:absolute（视觉上藏起来）。#zq-doc 会滚动、但不是定位元素，
   于是它按整页定位 —— 长页面靠下的一个公式把整页撑到它那儿（1280×800 的 Wiki 整页能滚到 1388px），
   而 Wiki 页是定高、不许整页滚的（展开目录的箭头会滚出视野）。让它挂在公式自己身上。 */
.katex{position:relative;}
.zq-tbtn{height:24px;min-width:26px;padding:0 8px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:calc(var(--zq-rs) - 1px);background:transparent;color:var(--zq-text2);font-size:12px;line-height:1;cursor:pointer;}
.zq-tbtn:hover{background:var(--zq-card);color:var(--zq-primary);box-shadow:var(--zq-sh1);}
.zq-tbtn.on{background:var(--zq-card);color:var(--zq-text);font-weight:var(--zq-fw-medium);box-shadow:var(--zq-sh1);}
.zq-btn-ghost.zq-dashed{border-style:dashed;}
/* Wiki 文档视图：列表圆点用强调色，对齐 claude design 模板 */
#zq-doc ul li::marker{color:var(--zq-accent);}
#zq-doc ol li::marker{color:var(--zq-accent);font-weight:var(--zq-fw-medium);}

/* ── Notebook 资料卡片：类型底色铺满整个圆角正方形，底部玻璃化(模糊)信息栏承载完整名称 ──
   类型和信息栏都在文档流里（第七十八轮）：原来两个都是绝对定位、卡片 overflow:hidden 钉成正方形 —— 面板里一格只有 93px，
   两行名字 + 两行状态的信息栏把左上角的类型整个盖住。现在 aspect-ratio 只是下限，内容多了卡片自己长高（min-height 要留 auto：写了定值，aspect-ratio 按内容撑高的那一条就不算了）。 */
.zq-src-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;}
.zq-src-tile{position:relative;display:flex;flex-direction:column;aspect-ratio:1/1;border:1px solid color-mix(in srgb, var(--srcc, var(--zq-border)) 42%, var(--zq-border-soft));border-radius:var(--zq-rm);background:linear-gradient(155deg, color-mix(in srgb, var(--srcc, var(--zq-text3)) 34%, var(--zq-card)), color-mix(in srgb, var(--srcc, var(--zq-text3)) 14%, var(--zq-card)));cursor:pointer;transition:border-color .15s ease, box-shadow .15s ease, transform .15s ease;}
.zq-src-tile:hover{border-color:var(--srcc, var(--zq-primary));box-shadow:var(--zq-sh2);transform:translateY(-1px);}
.zq-src-type{flex:none;padding:9px 10px 6px 11px;font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);letter-spacing:.05em;color:color-mix(in srgb, var(--srcc, var(--zq-text2)) 60%, var(--zq-text));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.zq-src-glass{flex:none;margin-top:auto;padding:7px 10px 8px;border-radius:0 0 calc(var(--zq-rm) - 1px) calc(var(--zq-rm) - 1px);background:color-mix(in srgb, var(--zq-card) 58%, transparent);backdrop-filter:blur(7px) saturate(1.15);-webkit-backdrop-filter:blur(7px) saturate(1.15);border-top:1px solid color-mix(in srgb, var(--zq-border) 45%, transparent);}
.zq-src-title{font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);line-height:1.4;color:var(--zq-text);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-all;}
.zq-src-meta{margin-top:3px;font-size:var(--zq-fs-2xs);color:var(--zq-text3);display:flex;align-items:center;gap:5px;}
.zq-src-tile .zq-src-dl{position:absolute;top:7px;right:7px;width:22px;height:22px;display:none;align-items:center;justify-content:center;border-radius:6px;background:color-mix(in srgb, var(--zq-card) 78%, transparent);backdrop-filter:blur(4px);color:var(--zq-text);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);}
.zq-src-tile:hover .zq-src-dl{display:flex;}

/* ── 持久通知（测试进行中/完成；Claude 弹窗同风格） ── */
/* 提示和持久通知（第八十轮）：原来贴在右上角 top:22px，正好压在每页标题行右边的按钮上（「新建知识页」「新增任务」…）。
   挪到标题行下面也不行 —— 窗口窄时标题行的按钮折成两排（知识 Wiki 1024 宽时到 128px），照样压住。放到底部中间：提示离底 24px，
   通知叠在它上面（同时出现不互相盖）；不接鼠标，叠在什么上面点击都穿过去。居中不用 transform（通知的入场动画会盖掉它） */
.zq-toast{position:fixed;left:0;right:0;bottom:24px;margin:0 auto;width:fit-content;z-index:99999;max-width:min(360px,calc(100vw - 32px));padding:10px 14px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-card);box-shadow:var(--zq-sh2);color:var(--zq-text);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);pointer-events:none;}
.zq-toast.is-error{color:var(--zq-bad);}
.zq-notice{position:fixed;left:0;right:0;bottom:76px;margin:0 auto;width:fit-content;z-index:9000;pointer-events:none;display:flex;align-items:center;gap:var(--zq-sp-2);max-width:min(340px,calc(100vw - 32px));padding:var(--zq-sp-3) var(--zq-sp-4);border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);color:var(--zq-text);box-shadow:var(--zq-sh2);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-regular);transition:opacity .2s ease;animation:zqModalIn .22s cubic-bezier(.2,.8,.2,1) both;}
.zq-notice .zq-notice-dot{width:8px;height:8px;flex:none;border-radius:50%;background:var(--zq-primary);animation:zqPulse 1.1s ease infinite;}
.zq-notice.zq-notice-done .zq-notice-dot{background:var(--zq-ok);animation:none;}
.zq-notice.zq-notice-error .zq-notice-dot{background:var(--zq-bad);animation:none;}
/* 关掉时淡出（第八十一轮）：入场动画停在最后一帧（both）会压过普通声明，原来 JS 写的 opacity:0 不起作用、220ms 后直接消失；
   撤掉动画再改 opacity 也不行（浏览器不起过渡，当场就没了）—— 换成一个淡出动画，JS 等它播完再拿掉 */
.zq-notice.is-closing{animation:zqNoticeOut .2s ease both;}
@keyframes zqNoticeOut{from{opacity:1;}to{opacity:0;}}
/* ── 共用层的小件（第八十一轮从 zhiqu-api.js / zhiqu-ui.js 的内联挪进来） ── */
/* 询问框 / 确认框 / 说明框：正文一段、输入框下面的提示；多行输入框 */
.zq-ask-msg{margin:0 0 16px;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.7;white-space:pre-wrap;}
.zq-ask-hint{margin:0 0 12px;color:var(--zq-text3);font-size:var(--zq-fs-xs);line-height:1.6;}
textarea#zq-ask-input{min-height:100px;}   /* 单行的输入框也是这个 id：只给多行的 */
/* 列表空着时的一句（empty()） */
.zq-empty-line{padding:18px;color:var(--zq-text3);font-size:var(--zq-fs-sm);text-align:center;}
/* 页面接口暂时不可用（renderInitError） */
.zq-init-error{max-width:720px;margin:40px auto;padding:24px;}
.zq-init-error .zq-h1{margin-bottom:10px;}
.zq-init-error-msg{margin:0 0 16px;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.8;}
/* 登录 / 注册：两个页签（选中的看 aria-selected，原来 JS 改 fontWeight / color / borderBottomColor，选中时还写成 700）、两张表（hidden 切换） */
.zq-auth-tabs{display:grid;grid-template-columns:1fr 1fr;margin-bottom:18px;border-bottom:1px solid var(--zq-border-soft);}
.zq-auth-tab{height:38px;border:none;border-bottom:2px solid transparent;background:none;color:var(--zq-text2);font-size:var(--zq-fs-base);font-weight:var(--zq-fw-regular);cursor:pointer;}
.zq-auth-tab[aria-selected="true"]{border-bottom-color:var(--zq-primary);color:var(--zq-primary);font-weight:var(--zq-fw-medium);}
.zq-auth-form{display:flex;flex-direction:column;gap:14px;}
.zq-auth-form .zq-btn{height:38px;}
.zq-auth-remember{display:flex;align-items:center;gap:8px;color:var(--zq-text2);font-size:var(--zq-fs-sm);cursor:pointer;}
.zq-auth-remember input{accent-color:var(--zq-primary);}
/* 任务表单：说明框、截止前提醒一行（下拉 + 天数）、下面的说明、提醒发不出去的警告条 */
#zq-tf-desc{min-height:60px;}
.zq-tf-remind{display:flex;gap:8px;}
#zq-tf-mode{flex:none;}
#zq-tf-days{flex:1;min-width:0;}
.zq-tf-note{margin:-4px 0 13px;color:var(--zq-text3);font-size:var(--zq-fs-xs);line-height:1.6;}
#zq-tf-remind-warn{margin:-6px 0 13px;padding:8px 10px;border-radius:var(--zq-rs);background:var(--zq-q1-bg);color:var(--zq-q1);font-size:var(--zq-fs-xs);line-height:1.6;}
#zq-tf-remind-warn a{color:inherit;font-weight:var(--zq-fw-medium);}
/* 代码着色（阅读和新编辑器同一套）：注释、字符串、关键字、数字（原来每一段拼 style="color:…"） */
.zq-tok-c{color:var(--zq-text3);}
.zq-tok-s{color:var(--zq-q4);}
.zq-tok-k{color:var(--zq-q2);}
.zq-tok-n{color:var(--zq-q3);}
/* 右键浮出菜单（popMenu）：位置是数据（JS 写 left / top），样子在这里；悬停原来靠 onmouseenter / onmouseleave 写底色 */
#zq-popmenu{position:fixed;z-index:9500;min-width:120px;padding:5px;border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);box-shadow:var(--zq-sh2);}
.zq-popmenu-item{display:block;width:100%;padding:8px 12px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text);font-size:var(--zq-fs-sm);text-align:left;cursor:pointer;}
.zq-popmenu-item:hover,.zq-popmenu-item:focus-visible{background:var(--zq-tint);outline:none;}
.zq-popmenu-item.is-danger{color:var(--zq-bad);}
/* 侧栏左下角：名字、身份（zhiqu-ui.js 的 paintUser）；外观弹层里第二个小标题和上面隔开 */
.zq-user-text{min-width:0;}
.zq-user-name{overflow:hidden;color:var(--zq-sb-active-text);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);text-overflow:ellipsis;white-space:nowrap;}
.zq-user-role{color:var(--zq-text3);font-size:var(--zq-fs-2xs);}
.zq-avatar img{width:100%;height:100%;object-fit:cover;border-radius:50%;}
.zq-modes+.zq-pop-t{padding-top:12px;}

/* ── AI 工作区：真实上传、附件、思考摘要与结构化产物 ── */
.zq-ai-drop-zone{border:1px solid var(--zq-border);border-radius:var(--zq-rm);padding:7px 12px;display:flex;align-items:center;gap:8px;color:var(--zq-text3);background:var(--zq-card);font-size:var(--zq-fs-xs);cursor:pointer;transition:border-color .15s ease,background .15s ease,color .15s ease;}
/* 上传中 / 出错时才出现，当输入框上面的一条状态（第四十四轮起桌面也这样；拖文件进来是整栏盖一层 .zq-drop-overlay） */
.zq-ai-drop-zone:not(.is-uploading):not(.is-error){display:none;}
.zq-ai-drop-zone:hover,.zq-ai-drop-zone:focus-visible{border-color:var(--zq-primary);color:var(--zq-primary);outline:none;}
.zq-ai-drop-zone.is-uploading{color:var(--zq-text2);}
.zq-ai-drop-zone.is-error{border-color:var(--zq-bad);background:var(--zq-bad-tint);color:var(--zq-bad);}
.zq-ai-drop-icon{display:inline-flex;}

/* ── AI 助手的输入区（第四十四轮）：一个大圆角框 —— 附件在上、输入在中、工具一条在下；和消息一栏同宽、居中 ── */
.zq-composer-wrap{padding:4px 22px max(22px,env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:8px;flex:none;}
.zq-composer-wrap>*,.zq-msg{width:100%;max-width:760px;margin-left:auto;margin-right:auto;}
.zq-composer{display:flex;flex-direction:column;gap:6px;padding:12px 10px 8px 14px;border:1px solid var(--zq-border);border-radius:var(--zq-rl);background:var(--zq-card);box-shadow:var(--zq-sh1);transition:border-color .12s ease;}
.zq-composer:focus-within{border-color:var(--zq-text3);}
.zq-composer textarea{display:block;width:100%;height:44px;max-height:200px;padding:0 4px 0 0;border:none;outline:none;background:transparent;color:var(--zq-text);font:var(--zq-fw-regular) var(--zq-fs-base)/22px var(--zq-fontBody);resize:none;overflow-y:auto;}
.zq-composer textarea::placeholder{color:var(--zq-text3);}
/* 聚焦时里面不再画一圈（第一百零三轮，用户截图里的「矩形框」）：外框 .zq-composer:focus-within 变色就是聚焦的样子；全站的 textarea:focus 光圈在这里不要 */
.zq-composer textarea:focus{box-shadow:none;}
/* 打 / 拉出的命令面板、命令那一段的颜色（第一百一十八轮）。颜色靠后面垫一层一模一样排版的文字：只在有命令时启用，平时输入框还是原来的样子 */
.zq-draft-wrap{position:relative;min-width:0;}
.zq-draft-mirror{position:absolute;inset:0;display:none;padding:0 4px 0 0;overflow:hidden;pointer-events:none;color:var(--zq-text);font:var(--zq-fw-regular) var(--zq-fs-base)/22px var(--zq-fontBody);white-space:pre-wrap;overflow-wrap:break-word;}
.zq-draft-cmd{color:var(--zq-cmd);}
.zq-composer.has-command .zq-draft-mirror{display:block;}
.zq-composer.has-command textarea{position:relative;color:transparent;caret-color:var(--zq-text);scrollbar-width:none;}
.zq-composer.has-command textarea::-webkit-scrollbar{display:none;}
.zq-slash-menu{position:absolute;left:-4px;right:-4px;bottom:calc(100% + 14px);z-index:30;max-height:300px;overflow-y:auto;padding:5px;border:1px solid var(--zq-border);border-radius:var(--zq-rl);background:var(--zq-card);box-shadow:var(--zq-sh2);animation:zqPullUp .14s ease-out;}
.zq-slash-menu[hidden]{display:none;}
.zq-slash-item{display:flex;align-items:baseline;gap:10px;width:100%;padding:7px 10px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text2);font-size:var(--zq-fs-sm);text-align:left;cursor:pointer;}
.zq-slash-item:hover{background:var(--zq-card-soft);}
.zq-slash-item[aria-selected="true"]{background:var(--zq-tint);}
.zq-slash-name{flex:none;color:var(--zq-cmd);}
.zq-slash-args{flex:none;color:var(--zq-text3);font-size:var(--zq-fs-2xs);}
.zq-slash-desc{flex:1 1 auto;min-width:0;}
@media (prefers-reduced-motion:reduce){.zq-slash-menu{animation:none;}}
.zq-composer-bar{display:flex;align-items:center;gap:4px;min-width:0;margin-left:-6px;}
.zq-composer-icon{width:30px;height:30px;flex:none;display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text2);cursor:pointer;}
.zq-composer-icon:hover{background:var(--zq-sb-active-bg);color:var(--zq-text);}
/* 联网 / 深度思考 / 代码：按下的样子只按 aria-pressed 画（JS 只管 aria-pressed） */
.zq-chip{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;flex:none;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--zq-text2);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);cursor:pointer;transition:background .12s ease,color .12s ease;}
.zq-chip .zq-icon{width:14px;height:14px;}
.zq-chip:hover{background:var(--zq-sb-active-bg);color:var(--zq-text);}
.zq-chip[aria-pressed="true"]{border-color:var(--zq-tint-strong);background:var(--zq-tint);color:var(--zq-primary);}
.zq-composer-model{margin-left:auto;flex:0 1 auto;width:auto;min-width:0;max-width:170px;height:28px;padding:0 8px;border-color:transparent;background-color:transparent;color:var(--zq-text2);font-size:var(--zq-fs-xs);cursor:pointer;}
.zq-composer-model:hover{background-color:var(--zq-sb-active-bg);}
.zq-composer-model:focus{border-color:var(--zq-border);}
.zq-send{width:32px;height:32px;flex:none;display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;border-radius:999px;background:var(--zq-primary);color:var(--zq-on-primary);cursor:pointer;transition:opacity .12s ease,background .12s ease;}
.zq-send:hover{background:var(--zq-primary-dark);}
/* 输入框空着时箭头变淡（点了也不会发 —— sendAiMessage 先看有没有字） */
.zq-composer:has(#zq-draft:placeholder-shown) .zq-send:not(.is-busy){opacity:.35;}
.zq-send.is-busy{cursor:default;}
.zq-send.is-busy .zq-icon{display:none;}
.zq-send.is-busy::after{content:"";width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:zqSpin .8s linear infinite;}
@keyframes zqSpin{to{transform:rotate(360deg);}}
.zq-composer-icon:focus-visible,.zq-chip:focus-visible,.zq-send:focus-visible,.zq-composer-model:focus-visible{outline:none;box-shadow:var(--zq-focus);}
/* 输入框上方的项目和档位（第一百零三轮）：项目按钮在左、档位一排在右；按下的档位看 aria-pressed、当前项目看 aria-current、菜单开着看 aria-expanded */
.zq-ws-bar{display:flex;align-items:center;flex-wrap:wrap;gap:6px 8px;min-width:0;}
.zq-ws-pick{position:relative;min-width:0;flex:0 1 auto;}
.zq-ws-project{display:inline-flex;align-items:center;gap:6px;max-width:100%;height:28px;padding:0 8px;border:1px solid transparent;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text2);font-size:var(--zq-fs-xs);cursor:pointer;}
.zq-ws-project:hover,.zq-ws-project[aria-expanded="true"]{background:var(--zq-sb-active-bg);color:var(--zq-text);}
.zq-ws-project .zq-icon{width:14px;height:14px;flex:none;}
.zq-ws-project-name{min-width:0;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-ws-bar-note{flex-basis:100%;font-size:var(--zq-fs-2xs);color:var(--zq-text3);line-height:1.5;}
.zq-ws-bar-note:empty{display:none;}
.zq-ws-menu{position:absolute;left:0;bottom:calc(100% + 6px);z-index:30;width:340px;max-width:calc(100vw - 32px);max-height:50vh;overflow:auto;padding:5px;border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);box-shadow:var(--zq-sh2);}
.zq-ws-menu-head{padding:4px 8px 2px;font-size:var(--zq-fs-2xs);color:var(--zq-text3);}
.zq-ws-menu-item{display:grid;grid-template-columns:16px minmax(0,1fr);column-gap:8px;align-items:center;width:100%;padding:6px 8px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text);font-size:var(--zq-fs-sm);text-align:left;cursor:pointer;}
.zq-ws-menu-item:hover{background:var(--zq-card-soft);}
.zq-ws-menu-item[aria-current="true"]{background:var(--zq-tint);}
.zq-ws-menu-item .zq-icon{width:14px;height:14px;color:var(--zq-text2);}
.zq-ws-menu-name,.zq-ws-menu-path{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-ws-menu-path{grid-column:2;font-size:var(--zq-fs-2xs);color:var(--zq-text3);}
.zq-ws-menu-sep{height:1px;margin:4px 2px;background:var(--zq-border-soft);}
.zq-ws-project:focus-visible,.zq-ws-menu-item:focus-visible,.zq-tier-item:focus-visible{outline:none;box-shadow:var(--zq-focus);}
/* 档位（第一百零五轮）和思考档位（第一百零八轮）：输入框下面那条工具里一个按钮显示当前这一档，点开向上拉起面板，面板贴着自己的按钮。 */
.zq-tier-pick{flex:none;position:relative;}
.zq-tier .zq-icon{width:12px;height:12px;}
.zq-tier[aria-expanded="true"]{background:var(--zq-sb-active-bg);color:var(--zq-text);}
.zq-tier.is-on{border-color:var(--zq-tint-strong);background:var(--zq-tint);color:var(--zq-primary);}
.zq-tier-menu{position:absolute;left:0;bottom:calc(100% + 6px);z-index:30;width:150px;padding:5px;border:1px solid var(--zq-border);border-radius:var(--zq-rl);background:var(--zq-card);box-shadow:var(--zq-sh2);animation:zqPullUp .14s ease-out;}
.zq-tier-item{display:block;width:100%;padding:8px 10px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text);font-size:var(--zq-fs-sm);text-align:left;cursor:pointer;}
.zq-tier-item:hover{background:var(--zq-card-soft);}
.zq-tier-item[aria-checked="true"]{background:var(--zq-tint);}
@keyframes zqPullUp{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:none;}}
@media (prefers-reduced-motion:reduce){.zq-tier-menu{animation:none;}}
/* 拖文件进对话这一栏时整栏盖的那一层（ai-assistant.js 的 bindAiDropZone 给 #zq-chat-col 加 is-dragging） */
.zq-drop-overlay{position:absolute;inset:10px;z-index:9;display:none;align-items:center;justify-content:center;gap:8px;padding:0 24px;border:1.5px dashed var(--zq-text3);border-radius:var(--zq-rl);background:var(--zq-bg);color:var(--zq-text);font-size:var(--zq-fs-sm);text-align:center;pointer-events:none;}
#zq-chat-col.is-dragging .zq-drop-overlay{display:flex;}

/* ── 消息（第四十四轮）：用户的话是右边一个浅灰的气泡，AI 的回答不套气泡、不要头像，直接排在页面上（像 Claude）；一栏最宽 760px、居中 ── */
.zq-msg{display:flex;}
.zq-msg.is-me{justify-content:flex-end;}
.zq-msg-body{min-width:0;color:var(--zq-text);font-size:var(--zq-fs-base);line-height:1.7;}
.zq-msg.is-ai .zq-msg-body{flex:1;}
.zq-msg.is-me .zq-msg-body{max-width:80%;padding:8px 14px;border-radius:var(--zq-rl);background:var(--zq-tint);}
.zq-ai-attachments{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.zq-ai-attachment{min-width:0;max-width:260px;height:26px;padding:0 5px 0 8px;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--zq-tint-strong);border-radius:var(--zq-rs);background:var(--zq-tint);color:var(--zq-text2);font-size:var(--zq-fs-xs);}
.zq-ai-attachment>span:nth-child(2){min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-ai-attachment-type{flex:none;color:var(--zq-text2);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);}
.zq-ai-attachment button{width:18px;height:18px;flex:none;padding:0;border:0;background:transparent;color:var(--zq-text3);font-size:var(--zq-fs-md);line-height:1;cursor:pointer;}
.zq-ai-attachment button:hover{color:var(--zq-bad);}
.zq-ai-empty-notebook,.zq-ai-source-empty{padding:8px 4px;display:flex;flex-direction:column;gap:3px;color:var(--zq-text3);font-size:var(--zq-fs-2xs);line-height:1.5;}
.zq-ai-empty-notebook strong,.zq-ai-source-empty strong{color:var(--zq-text2);font-size:var(--zq-fs-xs);}
/*
 * 聊天气泡：首尾块的外边距不再和气泡内边距叠加。
 * renderMarkdown 给每段 <p> 都带 margin:8px 0（标题上边距 14px），在气泡里第一段的上边距、最后一段的
 * 下边距会和气泡自己的内边距叠起来 —— 一行字的气泡实测 64px 高、文字上方空 20px，标题开头的回复空 26px。
 * 只去掉最外侧那一层；块与块之间的间距不动，长回答照样分得开段。
 * 要 !important：renderMarkdown 的外边距写在内联 style 里。ChatBubbleSpacingTest 钉着这几条。
 */
.zq-msg-body>:first-child,.zq-msg-body>:first-child>:first-child{margin-top:0!important;}
.zq-msg-body>:last-child,.zq-msg-body>:last-child>:last-child,.zq-msg-body>:last-child>:last-child>:last-child{margin-bottom:0!important;}
.zq-ai-reasoning{margin-bottom:9px;padding:8px 11px;border-left:2px solid var(--zq-tint-strong);background:var(--zq-card-soft);border-radius:0 var(--zq-rs) var(--zq-rs) 0;}
.zq-ai-reasoning summary{cursor:pointer;font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-text3);user-select:none;}
.zq-ai-reasoning>span{display:block;margin-top:6px;font-size:var(--zq-fs-xs);color:var(--zq-text3);line-height:1.65;white-space:pre-wrap;}
.zq-artifact-card{padding:9px 11px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card);}
.zq-artifact-head{display:flex;align-items:center;justify-content:space-between;gap:8px;color:var(--zq-text3);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);}
.zq-artifact-head em{font-style:normal;color:var(--zq-text3);font-weight:var(--zq-fw-regular);}
.zq-artifact-title{margin-top:4px;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);line-height:1.45;overflow-wrap:anywhere;}
.zq-artifact-link{color:var(--zq-primary);text-decoration:underline;text-underline-offset:2px;}
.zq-artifact-meta{margin-top:3px;color:var(--zq-text3);font-size:var(--zq-fs-2xs);}
.zq-artifact-preview{margin:6px 0 0;color:var(--zq-text2);font-size:var(--zq-fs-2xs);line-height:1.55;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;}
.zq-artifact-items{margin:6px 0 0;padding-left:17px;color:var(--zq-text2);font-size:var(--zq-fs-2xs);line-height:1.55;}
.zq-artifact-details{margin-top:7px;border-top:1px solid var(--zq-border-soft);padding-top:6px;}
.zq-artifact-details summary{cursor:pointer;color:var(--zq-primary);font-size:var(--zq-fs-2xs);font-weight:var(--zq-fw-medium);user-select:none;}
.zq-artifact-part{margin-top:7px;display:flex;flex-direction:column;gap:3px;color:var(--zq-text2);font-size:var(--zq-fs-2xs);line-height:1.5;}
.zq-artifact-part strong{color:var(--zq-text);}
.zq-artifact-part span{white-space:pre-wrap;overflow-wrap:anywhere;}
.zq-artifact-json{max-height:220px;margin:7px 0 0;padding:8px;overflow:auto;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);color:var(--zq-text2);font:10px/1.55 var(--zq-fontM);white-space:pre-wrap;overflow-wrap:anywhere;}
/* 生成的文件（第一百一十六轮）：一行一个，名字太长省略；这一栏窄（手机）时操作换到下一行，名字不被挤没 */
.zq-gen-files{list-style:none;margin:7px 0 0;padding:0;display:flex;flex-direction:column;gap:3px;}
.zq-gen-file{display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;min-width:0;color:var(--zq-text3);font-size:var(--zq-fs-2xs);}
.zq-gen-file svg{flex:none;width:13px;height:13px;}
.zq-gen-name{flex:1 1 72px;min-width:72px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zq-text);}
.zq-gen-size{flex:none;}
.zq-gen-act{flex:none;padding:2px 5px;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-primary);font-size:var(--zq-fs-2xs);cursor:pointer;}
.zq-gen-act:hover{background:var(--zq-sb-active-bg);}
.zq-gen-act:focus-visible{outline:2px solid var(--zq-primary);outline-offset:1px;}
.zq-gen-skip{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-style:normal;}
.zq-gen-frame{display:block;width:100%;height:min(70vh,640px);border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:white;}
.zq-gen-text{max-height:70vh;margin:0;padding:10px 12px;overflow:auto;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);color:var(--zq-text);font-size:var(--zq-fs-xs);line-height:1.55;font-family:var(--zq-fontM);white-space:pre;}
.zq-gen-markdown{max-height:70vh;overflow:auto;}
.zq-gen-image{display:block;max-width:100%;max-height:70vh;margin:0 auto;}
.zq-gen-note{color:var(--zq-text2);font-size:var(--zq-fs-sm);}
.zq-artifact-actions{display:flex;gap:6px;margin-top:8px;}
.zq-artifact-actions button{height:23px;padding:0 9px;border:1px solid var(--zq-tint-strong);border-radius:var(--zq-rs);background:var(--zq-tint);color:var(--zq-primary);font-size:var(--zq-fs-2xs);font-weight:var(--zq-fw-medium);cursor:pointer;}
.zq-artifact-actions .zq-btn-ghost{border-color:var(--zq-border);background:var(--zq-card);color:var(--zq-text2);}
.zq-src-meta span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* AI 计划草稿确认弹窗：计划确认后才写入日历，故用弹窗而非仅右侧卡片，避免用户漏看 */
.zq-plan-confirm .zq-plan-hint{margin:0 0 12px;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.6;}
.zq-plan-confirm .zq-plan-hint strong{color:var(--zq-text);}
.zq-plan-group{margin-bottom:14px;}
.zq-plan-group h4{margin:0 0 var(--zq-sp-2);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);color:var(--zq-text2);}
.zq-plan-row{display:flex;gap:9px;align-items:flex-start;padding:8px 10px;margin-bottom:6px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card);cursor:pointer;}
.zq-plan-row:hover{border-color:var(--zq-tint-strong);}
.zq-plan-row input[type=checkbox]{margin-top:3px;accent-color:var(--zq-primary);flex:none;}
.zq-plan-row-body{min-width:0;flex:1;display:flex;flex-direction:column;gap:4px;}
.zq-plan-name{font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);color:var(--zq-text);line-height:1.45;overflow-wrap:anywhere;}
.zq-plan-meta{font-size:var(--zq-fs-xs);color:var(--zq-text3);line-height:1.5;}
.zq-plan-row input.zq-plan-title,.zq-plan-row input.zq-plan-when{width:100%;height:30px;padding:0 9px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-bg);color:var(--zq-text);font-size:var(--zq-fs-sm);}
.zq-plan-row input.zq-plan-when{font-size:var(--zq-fs-xs);color:var(--zq-text2);}
.zq-plan-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:12px;border-top:1px solid var(--zq-border-soft);}
.zq-plan-actions button{height:32px;padding:0 14px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-card);color:var(--zq-text);font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-regular);cursor:pointer;}
.zq-plan-actions button:hover{background:var(--zq-card-soft);}
.zq-plan-actions .zq-btn-primary{background:var(--zq-primary);border-color:var(--zq-primary);color:var(--zq-on-primary);}
.zq-plan-actions .zq-btn-primary:hover{background:var(--zq-primary-dark);border-color:var(--zq-primary-dark);color:var(--zq-on-primary);}

/* ── AI 助手的骨架和两侧面板（第七十八轮从 ai-assistant.html / pages/ai-assistant.js 的内联挪进来） ── */
.zq-ai-work{flex:1;min-height:0;border-top:1px solid var(--zq-border-soft);overflow:hidden;display:flex;flex-direction:column;}
.zq-ai-cols{flex:1;display:flex;min-height:0;align-items:stretch;}
/* 两侧面板：展开时的宽度只写在这里（setupPanels 读算出来的 flex-basis 当展开宽度）；手机上浮在对话上面，要和页面同一个不透明的底色 */
.zq-ai-side{flex:0 0 218px;min-width:0;border-right:1px solid var(--zq-border-soft);background:var(--zq-bg);display:flex;flex-direction:column;overflow-y:auto;}
.zq-ai-side[data-zq-collapse="right"]{flex-basis:262px;border-right:0;border-left:1px solid var(--zq-border-soft);}
.zq-ai-side-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-bottom:1px solid var(--zq-border-soft);}
.zq-ai-side-title{display:block;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);}
.zq-ai-side-sub{font-size:var(--zq-fs-2xs);color:var(--zq-text3);}
#zq-new-notebook{height:26px;padding:0 10px;font-size:var(--zq-fs-xs);}
.zq-ai-notebooks{padding:10px 12px;display:flex;flex-direction:column;gap:6px;border-bottom:1px solid var(--zq-border-soft);}
.zq-nb{padding:9px 11px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card);cursor:pointer;}
.zq-nb[aria-current="true"]{border-color:var(--zq-tint-strong);background:var(--zq-tint);}
.zq-nb-name{font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-nb-meta{margin-top:2px;font-size:var(--zq-fs-2xs);color:var(--zq-text3);}
.zq-ai-src-actions{display:grid;grid-template-columns:1fr 1fr;gap:6px;padding:10px 12px;}
.zq-ai-src-actions .zq-btn-ghost{height:28px;border-style:dashed;font-size:var(--zq-fs-xs);}
.zq-ai-sources{padding:2px 12px 14px;display:flex;flex-direction:column;gap:6px;}
.zq-src-meta+.zq-src-meta{margin-top:4px;}
.zq-src-dot{width:6px;height:6px;flex:none;border-radius:50%;background:var(--zq-text3);}
.zq-src-dot[data-state="ok"]{background:var(--zq-ok);}
.zq-src-dot[data-state="bad"]{background:var(--zq-bad);}
.zq-src-dot[data-state="indexed"]{background:var(--zq-primary);}
.zq-src-dot[data-state="warn"]{background:var(--zq-warn);}
.zq-fp-item .zq-icon{width:14px;height:14px;}
/* 工作区设置、选文件夹两个弹窗 */
.zq-fp-cur{margin-bottom:8px;font-size:var(--zq-fs-xs);color:var(--zq-text2);word-break:break-all;}
.zq-fp-bar{display:flex;gap:6px;margin-bottom:8px;}
.zq-fp-bar .zq-btn,.zq-fp-bar .zq-btn-ghost{height:28px;font-size:var(--zq-fs-xs);}
.zq-fp-bar .zq-btn-ghost:disabled{opacity:.4;cursor:default;}
#zq-fp-pick{margin-left:auto;}
.zq-fp-list{max-height:46vh;overflow:auto;display:flex;flex-direction:column;gap:1px;padding:6px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);}
.zq-fp-item{display:flex;align-items:center;gap:7px;width:100%;padding:7px 9px;border:0;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text2);font-size:var(--zq-fs-sm);text-align:left;cursor:pointer;}
.zq-fp-item:hover{background:var(--zq-card-soft);}
.zq-fp-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-fp-note{padding:8px 9px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
/* 对话这一栏：拖文件进来时整栏盖一层（.zq-drop-overlay 按它铺满），所以是定位容器 */
.zq-ai-chat-col{flex:1;display:flex;flex-direction:column;min-width:0;position:relative;}
.zq-ai-chat-wrap{position:relative;display:flex;flex-direction:column;flex:1;min-height:0;}
#zq-chat{flex:1;overflow-y:auto;padding:24px 22px;display:flex;flex-direction:column;gap:22px;}
#zq-chat-jump{position:absolute;right:20px;bottom:14px;z-index:3;display:inline-flex;align-items:center;gap:4px;height:30px;padding:0 13px;border:1px solid var(--zq-border);border-radius:999px;background:var(--zq-card);color:var(--zq-text2);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);cursor:pointer;box-shadow:var(--zq-sh2);}
.zq-chat-more{display:flex;justify-content:center;padding:2px 0 6px;}
.zq-chat-more button{display:inline-flex;align-items:center;gap:4px;height:26px;padding:0 12px;border:1px solid var(--zq-border);border-radius:999px;background:var(--zq-card-soft);color:var(--zq-text2);font-size:var(--zq-fs-xs);cursor:pointer;}
.zq-msg-wait{color:var(--zq-text3);}
.zq-msg-note{margin-top:8px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-msg-note[data-state="bad"]{color:var(--zq-bad);}
.zq-msg-note[data-state="warn"]{color:var(--zq-warn);}
.zq-ai-empty{max-width:460px;margin:48px auto 0;text-align:center;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.7;}
.zq-ai-empty-title{margin-bottom:6px;color:var(--zq-text);font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);}
.zq-ai-empty-actions{margin-top:14px;}
.zq-ai-empty-actions.is-examples{display:flex;flex-direction:column;gap:8px;}
.zq-ai-empty-actions.is-examples .zq-btn-ghost{justify-content:flex-start;height:auto;min-height:34px;white-space:normal;text-align:left;}
/* 右边：执行轨迹、产物 */
.zq-ai-trace{padding:12px 14px;border-bottom:1px solid var(--zq-border-soft);}
.zq-ai-products{padding:12px 14px;}
.zq-ai-steps{display:flex;flex-direction:column;margin-top:10px;}
.zq-ai-artifacts{display:flex;flex-direction:column;gap:7px;margin-top:10px;}
.zq-step{display:flex;gap:9px;padding:5px 0;}
.zq-step-rail{display:flex;flex-direction:column;align-items:center;flex:none;width:10px;}
.zq-step-dot{width:8px;height:8px;margin-top:4px;border-radius:50%;background:var(--zq-text3);}
.zq-step-line{flex:1;width:1px;margin-top:2px;background:var(--zq-border-soft);}
.zq-step-body{min-width:0;padding-bottom:6px;}
.zq-step-name{font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);line-height:1.45;}
.zq-step-meta{margin-top:1px;font-size:var(--zq-fs-2xs);color:var(--zq-text3);}
.zq-step[data-state="ok"] .zq-step-dot{background:var(--zq-ok);}
.zq-step[data-state="ok"] .zq-step-meta{color:var(--zq-ok);}
.zq-step[data-state="bad"] .zq-step-dot{background:var(--zq-bad);}
.zq-step[data-state="bad"] .zq-step-meta{color:var(--zq-bad);}
.zq-step-note{margin-top:2px;font-size:var(--zq-fs-2xs);color:var(--zq-text2);word-break:break-all;}
.zq-step-note[data-state="bad"]{color:var(--zq-bad);}
.zq-step-note[data-state="warn"]{color:var(--zq-warn);}
.zq-step-out{margin:2px 0 3px 12px;padding:4px 6px;border-radius:4px;background:var(--zq-card-soft);color:var(--zq-text2);font-size:var(--zq-fs-2xs);line-height:1.4;white-space:pre-wrap;word-break:break-all;}
/* 代码改动草稿的逐行对比：新增 --zq-q2、删除 --zq-bad，底色是同色 12% */
.zq-plan-group.is-code{margin-bottom:10px;}
.zq-plan-group.is-code .zq-plan-row{align-items:center;}
.zq-plan-tag{margin-left:6px;font-size:var(--zq-fs-2xs);color:var(--zq-q2);}
.zq-plan-tag[data-state="bad"]{color:var(--zq-bad);}
.zq-diff{max-height:46vh;overflow:auto;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);font-size:var(--zq-fs-xs);line-height:1.55;}
.zq-diff-row{display:flex;color:var(--zq-text3);}
.zq-diff-row[data-op="add"]{background:color-mix(in srgb, var(--zq-q2) 12%, transparent);color:var(--zq-q2);}
.zq-diff-row[data-op="del"]{background:color-mix(in srgb, var(--zq-bad) 12%, transparent);color:var(--zq-bad);}
.zq-diff-mark{flex:none;width:16px;text-align:center;}
.zq-diff-text{flex:1;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere;}
.zq-diff-row[data-op="same"] .zq-diff-text{color:var(--zq-text2);}
.zq-diff-gap{padding:2px 8px;font-size:var(--zq-fs-2xs);color:var(--zq-text3);}
.zq-diff-note{padding:8px;color:var(--zq-text3);}
#zq-nb-desc{min-height:70px;}

/* ── 以后几步要用的组件（docs/ui-plan.md 第 1 步定下写法；页面一页一页收内联样式时换成这些类） ── */
.zq-btn-danger{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 14px;border:1px solid var(--zq-bad);border-radius:var(--zq-rs);background:var(--zq-bad);color:#FFFFFF;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);cursor:pointer;}
.zq-btn-danger:hover{filter:brightness(.94);}
.zq-btn.zq-sm,.zq-btn-ghost.zq-sm,.zq-btn-danger.zq-sm{height:28px;padding:0 10px;font-size:var(--zq-fs-xs);}
/* 分段控件：几个互斥的选项排一行（日 / 周 / 月、全部 / 待办 / 已完成） */
.zq-seg{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-card-soft);}
.zq-seg>button{height:28px;padding:0 12px;border:none;border-radius:calc(var(--zq-rs) - 2px);background:transparent;color:var(--zq-text2);font:var(--zq-fw-regular) var(--zq-fs-xs)/1 var(--zq-fontBody);cursor:pointer;}
.zq-seg>button:hover{color:var(--zq-text);}
.zq-seg>button.on,.zq-seg>button[aria-pressed="true"]{background:var(--zq-card);color:var(--zq-text);box-shadow:0 0 0 1px var(--zq-border),var(--zq-sh1);}
/* 页签：下划线式 */
.zq-tabs{display:flex;align-items:flex-end;gap:var(--zq-sp-5);border-bottom:1px solid var(--zq-border);}
.zq-tabs>button,.zq-tabs>a{height:34px;padding:0;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;background:transparent;color:var(--zq-text2);font:var(--zq-fw-regular) var(--zq-fs-sm)/1 var(--zq-fontBody);cursor:pointer;}
.zq-tabs>button:hover,.zq-tabs>a:hover{color:var(--zq-text);}
.zq-tabs>.on,.zq-tabs>[aria-selected="true"]{color:var(--zq-text);border-bottom-color:var(--zq-text);}
/* 空状态：一句说明 + 一个动作，居中、不抢眼 */
.zq-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--zq-sp-2);padding:var(--zq-sp-8) var(--zq-sp-5);text-align:center;color:var(--zq-text3);font-size:var(--zq-fs-sm);}
.zq-empty strong{color:var(--zq-text);font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);}
/* 骨架：数据还没到时占住位置的灰条 */
.zq-skeleton{display:block;height:12px;border-radius:var(--zq-rs);background:linear-gradient(90deg,var(--zq-card-soft) 25%,var(--zq-border-soft) 50%,var(--zq-card-soft) 75%);background-size:200% 100%;animation:zqShimmer 1.2s ease infinite;}
@keyframes zqShimmer{from{background-position:200% 0;}to{background-position:-200% 0;}}
@media (prefers-reduced-motion:reduce){.zq-skeleton{animation:none;}}

/* ── Markdown（第五十五轮）：renderMarkdown 原来给每个标签带一串内联样式，挪到这里 —— 编辑器插进去的标题、列表、勾选项和渲染出来的长一个样。
   这一段的数值和原来内联的一模一样（AI 助手的消息就是这一套，前后量过计算样式）；知识 Wiki 的正文另加 .zq-prose（下面）。 */
.zq-md{font-size:13.5px;line-height:1.75;}
.zq-md h1,.zq-md h2,.zq-md h3,.zq-md h4,.zq-md h5,.zq-md h6{margin:14px 0 8px;font-weight:var(--zq-fw-medium);}
.zq-md h1{font-size:20px;}
.zq-md h2{font-size:17px;}
.zq-md h3{font-size:15.5px;padding-bottom:6px;border-bottom:1px solid var(--zq-border-soft);}
.zq-md h4{font-size:var(--zq-fs-base);}
.zq-md h5{font-size:var(--zq-fs-base);}
.zq-md h6{font-size:var(--zq-fs-sm);color:var(--zq-text2);}
.zq-md p{margin:8px 0;}
.zq-md ul{margin:8px 0;padding-left:22px;}
.zq-md ol{margin:8px 0;padding-left:24px;}
.zq-md li{margin:4px 0;}
.zq-md blockquote{margin:12px 0;padding:10px 16px;border-left:3px solid var(--zq-accent);border-radius:0 var(--zq-rs) var(--zq-rs) 0;background:var(--zq-card-soft);color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.7;}
.zq-md pre{margin:12px 0;padding:12px 14px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);overflow-x:auto;}
.zq-md pre code{font-size:12.5px;line-height:1.65;white-space:pre;}
.zq-md :not(pre)>code{padding:1px 5px;border-radius:4px;background:var(--zq-card-soft);font-size:.92em;}
.zq-md-table{margin:12px 0;overflow-x:auto;}
.zq-md table{width:100%;border-collapse:collapse;font-size:var(--zq-fs-sm);line-height:1.6;}
.zq-md th,.zq-md td{padding:7px 16px 7px 0;border-bottom:1px solid var(--zq-border-soft);text-align:left;vertical-align:top;}
.zq-md th{border-bottom-color:var(--zq-border);color:var(--zq-text2);font-weight:var(--zq-fw-medium);}
.zq-md hr{margin:16px 0;border:none;border-top:1px solid var(--zq-border-soft);}
.zq-md a[href]{color:var(--zq-primary);text-decoration:underline;text-underline-offset:3px;}
.zq-md a[data-wikilink]{color:var(--zq-primary);text-decoration:underline;text-decoration-color:var(--zq-text3);text-underline-offset:3px;cursor:pointer;}
.zq-md-image{display:inline-block;max-width:100%;vertical-align:middle;}
.zq-md-image img{display:block;max-width:100%;height:auto;border-radius:var(--zq-rs);}
.zq-md-image-missing{padding:5px 8px;border:1px dashed var(--zq-border);border-radius:var(--zq-rs);color:var(--zq-text3);font-size:var(--zq-fs-xs);}
/* Typed, authenticated Obsidian embeds: media, notes and source previews share one quiet frame. */
.zq-embed{display:block;max-width:100%;min-width:0;margin:8px 0;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);overflow:hidden;background:var(--zq-card);user-select:text;-webkit-user-select:text;}
.zq-embed-head{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-xs);color:var(--zq-text2);overflow-wrap:anywhere;}
.zq-embed-head>a{flex-shrink:0;}
.zq-embed-status{display:block;padding:10px 12px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-embed-content{display:block;padding:12px 16px;max-height:560px;overflow:auto;}
/* One scroll surface under the pointer: a full-height inner pre with overflow-x:auto
   becomes a second scroll node in WebKit and prevents reliable vertical wheel targeting. */
.zq-embed-text{display:block;min-width:0;}
.zq-embed-text pre,.zq-prose .zq-md .zq-embed-text pre{max-height:460px;margin:0;border:0;border-radius:0;overflow:auto;white-space:pre;}
.zq-embed-media{display:block;padding:12px;}
.zq-embed-media img,.zq-embed-media video{display:block;max-width:100%;max-height:640px;height:auto;object-fit:contain;}
.zq-embed-media audio{display:block;width:100%;}
.zq-embed-media iframe{display:block;width:100%;max-height:1200px;border:0;}
.zq-canvas-preview{display:block;overflow:auto;}
.zq-canvas-preview svg{display:block;width:100%;height:380px;background:var(--zq-card-soft);}
.zq-canvas-edge{fill:none;stroke:var(--zq-text3);stroke-width:2;}
.zq-canvas-node rect{fill:var(--zq-card);stroke:var(--zq-border);stroke-width:1.5;}
.zq-canvas-node text,.zq-canvas-label{fill:var(--zq-text);font-size:var(--zq-fs-base);}
.zq-canvas-group rect{stroke-dasharray:6 4;}
.zq-canvas-source summary{padding:8px 12px;font-size:var(--zq-fs-xs);color:var(--zq-text2);cursor:pointer;}
.zq-attachment-list{max-height:520px;overflow:auto;margin-top:12px;}
.zq-attachment-row{display:flex;justify-content:space-between;gap:12px;width:100%;padding:12px 8px;border:0;border-bottom:1px solid var(--zq-border-soft);background:transparent;color:var(--zq-text);font:inherit;text-align:left;cursor:pointer;}
.zq-attachment-row:hover{background:var(--zq-tint);}
.zq-attachment-row>span:first-child{min-width:0;overflow-wrap:anywhere;}
.zq-attachment-size{flex-shrink:0;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
/* 自动保存的状态（第八十三轮，代替原来浮在底上的「保存 / 取消」）：浮在正文卡片右下角的一小块，不占排版（出现、消失时正文不挪）；
   没存上、别处改过时带按钮 */
.zq-wiki-save-state{position:absolute;right:18px;bottom:12px;z-index:2;display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px;max-width:calc(100% - 36px);
  padding:4px 10px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);box-shadow:var(--zq-sh1);color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-wiki-save-state:empty{display:none;}
.zq-wiki-save-state[data-state="error"],.zq-wiki-save-state[data-state="conflict"],.zq-wiki-save-state[data-state="empty"]{color:var(--zq-warn);}
/* 勾选项：勾上了就划掉、变淡 —— 按 input:checked 画（原来渲染时写死在文字上，点一下勾选框样子不跟着变） */
.zq-task-row{display:flex;align-items:flex-start;gap:9px;margin:7px 0;}
.zq-task-row>input[type="checkbox"]{flex:none;margin-top:5px;accent-color:var(--zq-primary);}
.zq-task-row>input:checked+span{color:var(--zq-text3);text-decoration:line-through;}
/* 嵌套列表（第七十一轮）：任务项下面的子项缩到勾选项文字的位置；列表项里的子列表贴着上一行，不用整段列表的上下留白 */
.zq-task-children{padding-left:22px;}
.zq-md li>ul,.zq-md li>ol,.zq-prose .zq-md li>ul,.zq-prose .zq-md li>ol{margin:4px 0 0;}
.zq-math{margin:12px 0;padding:13px 16px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);text-align:center;font-size:var(--zq-fs-md);overflow-x:auto;}
.zq-math>.zq-mono{color:var(--zq-text2);font-size:12.5px;}
.zq-math-i{padding:0 2px;}
.zq-math-i>.zq-mono{color:var(--zq-text2);font-size:.92em;}

/* ── 知识 Wiki 的正文（第五十五轮起）：正文 15px、行距 1.85，标题节前留白比节后多。
   第六十五轮：阅读与编辑均使用卡片可用宽度，取消 42em 的上限，宽窗口不再到一半就换行。
   长网址沿用 body 的 anywhere 换行，代码和表格继续在自己的容器里横向滚动。 */
/* 第八十四轮：字号行距照 Obsidian（原来 15px、行高 1.85、标题 500 —— 第四十一轮「字要细」）；行高比 Obsidian 的 1.5 多一点，中文挤 */
.zq-prose .zq-md{width:100%;max-width:none;min-width:0;font-size:var(--zq-fs-prose);line-height:1.6;}
.zq-prose .zq-md h1,.zq-prose .zq-md h2,.zq-prose .zq-md h3,.zq-prose .zq-md h4,.zq-prose .zq-md h5,.zq-prose .zq-md h6{font-weight:var(--zq-fw-semibold);}
.zq-prose .zq-md>:first-child{margin-top:0;}
.zq-prose .zq-md h1{margin:28px 0 14px;font-size:var(--zq-fs-prose-h1);line-height:1.3;}
.zq-prose .zq-md h2{margin:30px 0 10px;font-size:var(--zq-fs-prose-h2);line-height:1.35;}
.zq-prose .zq-md h3{margin:24px 0 8px;padding-bottom:0;border-bottom:none;font-size:var(--zq-fs-prose-h3);line-height:1.4;}
.zq-prose .zq-md h4{margin:20px 0 6px;font-size:var(--zq-fs-prose-h4);}
.zq-prose .zq-md h5{margin:18px 0 6px;font-size:var(--zq-fs-prose);}
.zq-prose .zq-md h6{margin:16px 0 6px;font-size:var(--zq-fs-prose);color:var(--zq-text2);}
.zq-prose .zq-md p{margin:0 0 12px;}
.zq-prose .zq-md ul,.zq-prose .zq-md ol{margin:0 0 12px;padding-left:24px;}
.zq-prose .zq-md li{margin:5px 0;}
.zq-prose .zq-md blockquote{margin:16px 0;padding:2px 0 2px 16px;border-left-color:var(--zq-border);border-radius:0;background:transparent;font-size:inherit;line-height:inherit;}
.zq-prose .zq-md pre{margin:16px 0;}
.zq-prose .zq-md pre code{font-size:13px;}
.zq-prose .zq-md table{font-size:var(--zq-fs-base);}
.zq-prose .zq-md hr{margin:28px 0;}
.zq-prose .zq-task-row{margin:6px 0;}
.zq-prose .zq-task-row>input[type="checkbox"]{margin-top:6px;}
/* 重复页名在阅读与排版编辑中保持隐藏；源码模式仍可修改，切换编辑不会插入额外高度。 */
.zq-prose .zq-dup-title{display:none;}
.zq-prose .zq-wiki-empty{color:var(--zq-text3);}
/* ── 知识 Wiki 的骨架（第七十九轮从 knowledge-wiki.html 的内联挪进来）：目录、正文卡片、页面检查三栏 ── */
.zq-wiki-pending{border-color:var(--zq-tint-strong);background:var(--zq-tint);color:var(--zq-primary);font-weight:var(--zq-fw-medium);}
.zq-wiki-cols{display:flex;gap:12px;align-items:stretch;margin:0 -8px;flex:1;min-height:0;}
/* 两侧面板：展开的宽度只写在这里（setupPanels 读算出来的 flex-basis） */
.zq-wiki-side{flex:0 0 210px;align-self:stretch;overflow:hidden;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);box-shadow:var(--zq-sh1);}
.zq-wiki-side[data-zq-collapse="right"]{flex-basis:250px;}
.zq-wiki-side-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--zq-border-soft);}
.zq-wiki-side[data-zq-collapse="right"] .zq-wiki-side-head{background:var(--zq-card-soft);}
.zq-wiki-side-head h2{margin:0;font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);}
#zq-tree-count{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-wiki-filter{display:flex;flex-direction:column;gap:8px;padding:10px 12px;border-bottom:1px solid var(--zq-border-soft);}
.zq-wiki-filter .zq-input,.zq-wiki-filter .zq-select{height:28px;font-size:var(--zq-fs-xs);}
#zq-tree{display:flex;flex-direction:column;gap:2px;padding:8px;}
/* 正文卡片：flex 列 + min-height:0，#zq-doc 在里面滚，不把整页撑长 */
.zq-wiki-doc{position:relative;flex:1;min-width:0;display:flex;flex-direction:column;min-height:0;overflow:hidden;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);box-shadow:var(--zq-sh2);}
.zq-wiki-tabbar{display:flex;align-items:stretch;border-bottom:1px solid var(--zq-border-soft);background:var(--zq-card-soft);}
/* 标签栏左内边距 = 0：第一个标签贴着卡片的左边缘（WikiTabsTest.第一个标签贴卡片左边缘） */
#zq-wiki-tabs{display:flex;align-items:stretch;flex:1;min-width:0;padding-left:0;overflow-x:auto;scrollbar-width:thin;}
.zq-wiki-nav{display:flex;align-items:center;gap:2px;flex:none;padding:0 12px 0 6px;}
.zq-wiki-nav .zq-btn-ghost{width:24px;height:26px;padding:0;line-height:1;}
.zq-wiki-nav .zq-btn-ghost:disabled{opacity:.35;cursor:default;}
/* 标题行的左内边距和 #zq-doc 的一样是 26px：页名和正文落在同一条竖线上（WikiTabsTest.标题与正文左边缘要对齐） */
.zq-wiki-head{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap;padding:14px 20px 14px 26px;border-bottom:1px solid var(--zq-border-soft);}
/* overflow-anchor:none：嵌入预览长高时浏览器不替人挪滚动位置（第六十六轮）；只读 / 加载中光标是箭头（aria-readonly 由 syncWikiEditMode 写） */
#zq-doc{flex:1;min-height:0;overflow-y:auto;padding:22px 26px 30px;overflow-anchor:none;outline:none;cursor:text;}
#zq-doc[aria-readonly="true"]{cursor:default;}
#zq-doc[data-editing="1"]{padding-bottom:90px;}
/* 目录的一项、标签页（第七十九轮从 pages/knowledge-wiki.js 的内联挪进来）：选中的是 aria-current */
.zq-wiki-item{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:var(--zq-rs);cursor:pointer;}
.zq-wiki-item>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zq-text2);font-size:var(--zq-fs-sm);}
.zq-wiki-item:hover{background:var(--zq-card-soft);}
.zq-wiki-item[aria-current="page"]{background:var(--zq-tint);}
.zq-wiki-item[aria-current="page"]>span{font-weight:var(--zq-fw-medium);}
.zq-wiki-tab{display:flex;align-items:center;gap:6px;max-width:190px;padding:7px 8px 7px 12px;border-right:1px solid var(--zq-border-soft);color:var(--zq-text2);font-size:var(--zq-fs-sm);white-space:nowrap;cursor:pointer;}
.zq-wiki-tab[aria-current="page"]{background:var(--zq-card);color:var(--zq-text);font-weight:var(--zq-fw-medium);box-shadow:inset 0 2px 0 var(--zq-primary);}
.zq-wiki-tab-name{overflow:hidden;text-overflow:ellipsis;}
.zq-wiki-tab-x{flex:none;width:16px;height:16px;display:flex;align-items:center;justify-content:center;border-radius:4px;color:var(--zq-text3);}
.zq-wiki-tab-x:hover{background:var(--zq-sb-active-bg);color:var(--zq-text);}
.zq-wiki-tab-x .zq-icon{width:12px;height:12px;}
.zq-wiki-tab-new{display:flex;align-items:center;justify-content:center;flex:none;width:30px;color:var(--zq-text3);cursor:pointer;}
.zq-wiki-tab-new:hover{color:var(--zq-text);}
.zq-wiki-tab-new .zq-icon{width:14px;height:14px;}
/* 页名在正文顶上（第八十四轮，照 Obsidian 的 inline title）：跟着正文滚，大小和一级标题一样；没开只读时直接点进去改（syncWikiEditMode 开关 contenteditable），
   回车 / 点别处就存、Esc 放弃。原来在工具栏那一行、点了弹窗改 */
.zq-wiki-inline-title{margin:0 0 18px;font-size:var(--zq-fs-prose-h1);font-weight:var(--zq-fw-semibold);line-height:1.3;outline:none;overflow-wrap:anywhere;cursor:default;}
.zq-wiki-inline-title[contenteditable="plaintext-only"],.zq-wiki-inline-title[contenteditable="true"]{cursor:text;}
/* 没打开页面时页名是空的、改不了：藏起来。能改的删空了不藏，给个「无标题」（review：原来一删空就整个不见，光标跟着没了，再打的字没地方去）。
   看的是能不能改、不是 :focus —— 窗口没有焦点时 :focus 不成立，正在改的页名会被藏掉，藏的时候不发 blur，原名回不来 */
.zq-wiki-inline-title[contenteditable="false"]:empty,.zq-wiki-inline-title:not([contenteditable]):empty{display:none;}
.zq-wiki-inline-title[contenteditable="plaintext-only"]:empty::before,.zq-wiki-inline-title[contenteditable="true"]:empty::before{content:"无标题";color:var(--zq-text3);}
/* 页面检查 */
.zq-wiki-insp{padding:12px 14px;color:var(--zq-text2);font-size:var(--zq-fs-xs);line-height:1.6;}
.zq-wiki-insp-tip{color:var(--zq-text3);}
/* 这一页有没保存的修改：正文上面一条 */
#zq-wiki-draft{display:flex;align-items:center;gap:8px;margin:0 0 12px;padding:9px 12px;border:1px solid var(--zq-tint-strong);border-radius:var(--zq-rs);background:var(--zq-tint);color:var(--zq-text);font-size:var(--zq-fs-sm);}
#zq-wiki-draft>span{flex:1;}
#zq-wiki-draft .zq-btn,#zq-wiki-draft .zq-btn-ghost{height:28px;}
/* 源码编辑框；编辑时底下那一条按钮 */
#zq-src-ta{display:block;width:100%;min-height:360px;padding:12px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-input-bg);color:var(--zq-text);font-family:var(--zq-fontM);font-size:var(--zq-fs-sm);line-height:1.7;resize:vertical;box-sizing:border-box;}
#zq-wiki-del{margin-left:auto;}
/* Wiki 的弹窗：说明、提示、列表 */
.zq-wiki-note{margin:0 0 12px;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.6;}
.zq-wiki-note.is-message{margin-bottom:16px;line-height:1.7;white-space:pre-wrap;}
.zq-wiki-hint{margin:0 0 12px;color:var(--zq-text3);font-size:var(--zq-fs-xs);line-height:1.6;}
.zq-wiki-ref{overflow-wrap:anywhere;}
.zq-wiki-qs{max-height:52vh;overflow:auto;display:flex;flex-direction:column;gap:2px;margin-top:10px;}
.zq-wiki-qs-item{display:block;padding:8px 10px;border-radius:var(--zq-rs);color:var(--zq-text2);font-size:var(--zq-fs-sm);cursor:pointer;}
.zq-wiki-qs-item:hover{background:var(--zq-card-soft);color:var(--zq-text);}
#zq-imp-content{min-height:110px;}
#zq-imp-file{height:auto;padding:7px 12px;}
#zq-vault-preview{max-height:38vh;overflow:auto;margin:12px 0;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.6;}
#zq-vault-preview p{margin:0 0 8px;}
#zq-vault-preview ul{margin:0 0 10px;padding-left:20px;}
.zq-wiki-list{display:flex;flex-direction:column;gap:8px;max-height:55vh;overflow-y:auto;}
.zq-wiki-list.is-patches{gap:10px;max-height:62vh;}
.zq-wiki-source{display:block;height:auto;padding:12px;border-color:var(--zq-border-soft);text-align:left;white-space:normal;}
.zq-wiki-source strong{display:block;font-size:var(--zq-fs-base);}
.zq-wiki-source-when{display:block;margin-top:3px;color:var(--zq-text3);font-size:var(--zq-fs-2xs);}
.zq-wiki-source-sum{display:block;margin-top:5px;color:var(--zq-text2);font-size:var(--zq-fs-xs);line-height:1.6;}
.zq-wiki-pager{color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-wiki-source-text{margin:0;padding:14px;max-height:55vh;overflow-y:auto;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);font-family:var(--zq-fontBody);font-size:var(--zq-fs-sm);line-height:1.8;white-space:pre-wrap;overflow-wrap:anywhere;}
/* 健康检查 */
.zq-wiki-issues{display:flex;flex-direction:column;gap:6px;max-height:280px;margin-bottom:16px;overflow-y:auto;}
.zq-wiki-issue{padding:7px 10px;border:1px solid var(--zq-border-soft);border-left:3px solid var(--zq-warn);border-radius:var(--zq-rs);background:var(--zq-card-soft);font-size:var(--zq-fs-sm);line-height:1.55;}
.zq-wiki-ok{display:flex;align-items:center;gap:6px;margin:0 0 16px;color:var(--zq-ok);font-size:var(--zq-fs-base);font-weight:var(--zq-fw-medium);}
/* 图谱：节点的颜色是 SVG 的 fill（数据），图例的点是 --c */
.zq-graph{overflow:hidden;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card-soft);}
.zq-graph svg{display:block;width:100%;height:auto;}
.zq-graph-node{cursor:pointer;}
.zq-graph-label{font-size:var(--zq-fs-2xs);fill:var(--zq-text2);}
.zq-graph-legend{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;}
.zq-graph-key{display:inline-flex;align-items:center;gap:5px;color:var(--zq-text2);font-size:var(--zq-fs-2xs);}
.zq-graph-key i{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--c, var(--zq-text3));}
.zq-graph-note{margin:8px 0 0;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-graph-note[data-state="bad"]{margin-top:10px;color:var(--zq-bad);}
/* 待合入变更：一组一张卡片，里面每一页可以点开看 */
.zq-patch{padding:11px 13px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card-soft);}
.zq-patch-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;}
.zq-patch-what{min-width:0;}
.zq-patch-what strong{font-size:var(--zq-fs-base);}
.zq-patch-what p{margin:4px 0 0;color:var(--zq-text2);font-size:var(--zq-fs-xs);line-height:1.6;}
.zq-patch-when{margin-left:8px;color:var(--zq-text3);font-size:var(--zq-fs-2xs);}
.zq-patch-acts{display:flex;gap:6px;flex:none;}
.zq-patch-acts .zq-btn,.zq-patch-acts .zq-btn-ghost{height:28px;padding:0 11px;font-size:var(--zq-fs-xs);}
.zq-patch-item{margin-top:6px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card);}
.zq-patch-item summary{padding:7px 10px;font-size:var(--zq-fs-sm);cursor:pointer;}
.zq-patch-item .zq-badge{margin-right:6px;background:var(--zq-tint);color:var(--zq-primary);}
.zq-patch .zq-wiki-hint{margin:6px 0 0;}
.zq-rev-body{max-height:260px;padding:4px 12px 10px;overflow-y:auto;font-size:var(--zq-fs-sm);line-height:1.7;}
/* 页名（点了改名）和工具栏 */
.zq-wiki-tools{display:flex;align-items:center;justify-content:flex-end;gap:var(--zq-sp-2);flex-wrap:wrap;min-width:0;max-width:100%;margin-left:auto;}
.zq-wiki-mode-label{min-width:3em;color:var(--zq-text3);font-size:var(--zq-fs-xs);white-space:nowrap;}
#zq-wiki-mode{min-width:100px;height:30px;gap:8px;flex-shrink:0;white-space:nowrap;}
#zq-wiki-mode::before{content:"";width:26px;height:14px;flex:none;border-radius:999px;background:radial-gradient(circle at 7px 7px,var(--zq-card) 0 4px,transparent 4.5px),var(--zq-border);}
#zq-wiki-mode[aria-checked="true"]::before{background:radial-gradient(circle at 19px 7px,var(--zq-card) 0 4px,transparent 4.5px),var(--zq-primary);}
.zq-wiki-tools [data-wiki-cmd]:disabled,#zq-wiki-block:disabled{opacity:.45;cursor:default;}
.zq-wiki-tools .zq-select{height:28px;min-width:92px;padding:0 8px;font-size:var(--zq-fs-xs);}
.zq-wiki-tools .zq-tbtn{min-width:28px;padding:0 6px;}
.zq-wiki-tools .zq-tbtn[aria-pressed="true"]{background:var(--zq-card);color:var(--zq-text);box-shadow:var(--zq-sh1);}
/* ZIP 导入：把原生文件框藏在可操作的按钮后，文件名在窄窗口里保持可读。 */
.zq-vault-file{display:flex;align-items:center;gap:12px;min-width:0;padding:10px;border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card-soft);}
.zq-vault-file #zq-vault-file{display:none;}
.zq-vault-file #zq-vault-pick{flex:none;height:36px;border-color:var(--zq-primary);border-radius:8px;background:var(--zq-primary);color:var(--zq-on-primary);font-weight:var(--zq-fw-medium);box-shadow:var(--zq-sh1);transition:background .16s ease,border-color .16s ease,transform .16s ease,box-shadow .16s ease;}
.zq-vault-file #zq-vault-pick:hover{border-color:var(--zq-primary-dark);background:var(--zq-primary-dark);box-shadow:var(--zq-sh2);transform:translateY(-1px);}
.zq-vault-file #zq-vault-pick:active{transform:translateY(0);box-shadow:var(--zq-sh1);}
.zq-vault-file #zq-vault-pick:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-vault-file #zq-vault-selected{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zq-text2);font-size:var(--zq-fs-sm);}
@media (max-width:460px){.zq-vault-file{align-items:stretch;flex-direction:column;}.zq-vault-file #zq-vault-pick{align-self:flex-start;}.zq-vault-file #zq-vault-selected{max-width:100%;}}
@media (prefers-reduced-motion:reduce){.zq-vault-file #zq-vault-pick{transition:none;}.zq-vault-file #zq-vault-pick:hover{transform:none;}}

/* ── 页面里常用的几样小件（第五十六轮在例行计划页起头，第五十七轮参考计划、专注统计也用，改成通用的名字） ──────────
   卡片头（标题 + 右边一句小字）、弹窗里的勾选列表、一行勾选框 + 说明、矮一点的多行框、分段放在字段里不撑满。 */
.zq-page-stack{display:flex;flex-direction:column;gap:16px;}
.zq-card-head{display:flex;align-items:center;justify-content:space-between;gap:var(--zq-sp-3);flex-wrap:wrap;margin-bottom:var(--zq-sp-3);}
.zq-card-note{color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-field>.zq-seg{align-self:flex-start;}
.zq-textarea-sm{min-height:60px;}
.zq-btn-xs{height:24px;padding:0 9px;font-size:var(--zq-fs-xs);}
.zq-check-line{display:flex;align-items:flex-start;gap:8px;margin:0 0 var(--zq-sp-4);color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.5;cursor:pointer;}
.zq-check-line input{flex:none;margin-top:3px;accent-color:var(--zq-primary);}
.zq-pick-head{display:flex;align-items:center;justify-content:space-between;gap:var(--zq-sp-2);margin:2px 0 var(--zq-sp-2);}
.zq-pick-tools{display:flex;gap:6px;}
.zq-pick-list{display:flex;flex-direction:column;max-height:240px;margin:var(--zq-sp-2) 0 var(--zq-sp-3);overflow-y:auto;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);}
.zq-pick-tall{max-height:260px;}
.zq-pick-group{padding:8px 12px 4px;color:var(--zq-text2);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);}
.zq-pick-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-sm);cursor:pointer;}
.zq-pick-row:last-child{border-bottom:none;}
.zq-pick-row:hover{background:var(--zq-card-soft);}
.zq-pick-row input{flex:none;accent-color:var(--zq-primary);}

/* ── 例行计划页（第五十六轮，界面打磨第 8 步）：「今天」和「全部例行计划」两块，新建 / 从任务生成是页头的两个弹窗 ──────────
   原来两张表单常驻在列表上面，每一行两个字按钮、样子全在 JS 拼的内联样式里。「今天」一行的画法和看板的「今天」同一套（.zq-agenda-row）。 */
/* 两块并排放不下（各不到 300px）就一上一下，不另写断点 —— 最窄的桌面窗口（960）里两块各 333px，还是并排 */
.zq-rt-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:16px;align-items:start;}
.zq-rt-main{display:flex;flex-direction:column;min-width:0;}
/* 名字最多两行（和看板的「今天」一样），再长的悬停看全 */
.zq-rt-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.45;}
/* 一行的画法就是 .zq-agenda-row（第五十八轮 review：原来这里把它的网格、留白、分隔线原样又写了一遍）；这里只管已结束变淡、删除按钮 */
.zq-rt-row.is-ended{color:var(--zq-text3);}
/* 删除悬停或键盘移到这一行时才出现（手机上一直在，见最后那段 @media） */
.zq-rt-acts{display:flex;gap:2px;opacity:0;transition:opacity .12s ease;}
.zq-rt-row:hover .zq-rt-acts,.zq-rt-row:focus-within .zq-rt-acts{opacity:1;}
.zq-rt-days{display:flex;flex-wrap:wrap;gap:6px;}
.zq-rt-days .zq-chip{border-color:var(--zq-border);}
/* 选上的那几天要一眼看得出来：和主按钮一样实心（.zq-chip 默认按下的样子是浅灰底，在七个里分不清） */
.zq-rt-days .zq-chip[aria-pressed="true"]{border-color:var(--zq-primary);background:var(--zq-primary);color:var(--zq-on-primary);}

/* ── 参考计划页（第五十七轮，界面打磨第 8 步）：工具条一行、卡片、详情（openModal）、我的投稿 ──────────
   原来筛选是三个带小标题的下拉 +「刷新」；分类是一块彩色底的牌子；点赞是字符；详情是 HTML 里另写的一套弹窗。 */
.zq-plan-bar{display:flex;align-items:center;gap:var(--zq-sp-2);flex-wrap:wrap;}
.zq-plan-bar .zq-select{width:auto;min-width:132px;}
.zq-plan-bar .zq-card-note{margin-left:auto;}
.zq-plan-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(300px,100%),1fr));gap:14px;}
.zq-plan-card{display:flex;flex-direction:column;gap:6px;padding:16px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease;}
.zq-plan-card:hover{border-color:var(--zq-border);box-shadow:var(--zq-sh1);}
.zq-plan-card:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-plan-top{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.zq-plan-cat{display:inline-flex;align-items:center;gap:6px;color:var(--zq-text2);font-size:var(--zq-fs-xs);}
.zq-plan-cat i{width:6px;height:6px;flex:none;border-radius:50%;background:var(--zq-text3);}
.zq-plan-cat[data-q="q1"] i{background:var(--zq-q1);}
.zq-plan-cat[data-q="q2"] i{background:var(--zq-q2);}
.zq-plan-cat[data-q="q3"] i{background:var(--zq-q3);}
.zq-plan-cat[data-q="q4"] i{background:var(--zq-q4);}
.zq-plan-likes{display:inline-flex;align-items:center;gap:4px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-plan-likes .zq-icon{width:13px;height:13px;}
.zq-plan-title{margin:2px 0 0;font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);line-height:1.4;}
.zq-plan-desc{margin:0;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.55;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.zq-plan-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:auto;padding-top:8px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
/* 详情 */
.zq-plan-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-plan-like{display:inline-flex;align-items:center;gap:5px;height:26px;margin-left:auto;padding:0 10px;border:1px solid var(--zq-border);border-radius:999px;background:var(--zq-card);color:var(--zq-text2);font:inherit;cursor:pointer;}
.zq-plan-like .zq-icon{width:14px;height:14px;}
.zq-plan-like:hover{color:var(--zq-text);}
.zq-plan-like[aria-pressed="true"]{border-color:var(--zq-bad);color:var(--zq-bad);}
.zq-plan-like[aria-pressed="true"] .zq-icon{fill:currentColor;}
.zq-plan-detail-desc{margin:0 0 10px;color:var(--zq-text2);font-size:var(--zq-fs-sm);line-height:1.65;}
.zq-plan-aud{margin:0 0 16px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-plan-sec{margin:14px 0 6px;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);}
.zq-plan-items{margin:0;padding:0;list-style:none;border-top:1px solid var(--zq-border-soft);}
.zq-plan-items li{padding:8px 2px;border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-sm);}
.zq-plan-none{margin:0;color:var(--zq-text3);font-size:var(--zq-fs-sm);}
.zq-plan-apply{display:flex;align-items:flex-end;gap:var(--zq-sp-2);margin-top:18px;padding-top:16px;border-top:1px solid var(--zq-border-soft);}
.zq-plan-apply .zq-field{flex:1;margin-bottom:0;}
/* 我的投稿 */
.zq-plan-mine{margin-top:22px;}
.zq-plan-mine .zq-h2{margin-bottom:10px;}
.zq-plan-subs{display:flex;flex-direction:column;gap:10px;}
.zq-plan-sub{padding:13px 15px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rm);background:var(--zq-card);}
.zq-plan-sub-top{display:flex;align-items:center;gap:10px;}
.zq-plan-sub-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:var(--zq-fw-medium);}
.zq-plan-status{flex:none;color:var(--zq-text2);font-size:var(--zq-fs-xs);}
.zq-plan-status[data-status="APPROVED"]{color:var(--zq-q2);}
.zq-plan-status[data-status="REJECTED"]{color:var(--zq-q1);}
.zq-plan-status[data-status="OFFLINE"]{color:var(--zq-text3);}
.zq-plan-sub-when{margin-top:4px;color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-plan-reject{margin:8px 0 0;padding:9px 11px;border-radius:var(--zq-rs);background:var(--zq-q1-bg);color:var(--zq-q1);font-size:var(--zq-fs-sm);line-height:1.55;}
.zq-plan-reject.is-empty{padding:0;background:transparent;color:var(--zq-text3);font-size:var(--zq-fs-xs);}

/* ── 专注统计页（第五十七轮，界面打磨第 8 步）：柱子、两张卡一样高、图例 ──────────
   原来每一根柱子上都写数（零也写）、零的是一道灰线、有数的也是浅灰；「日 / 周 / 月」按下是 JS 改背景色；两张卡一高一矮。 */
.zq-stat-grid{grid-template-columns:repeat(4,minmax(0,1fr));}
.zq-stat-num+.zq-stat-label{margin-top:9px;}
.zq-stats-cols{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(280px,1fr);gap:16px;}
.zq-trend{display:flex;flex-direction:column;}
.zq-bars{flex:1;display:flex;align-items:stretch;gap:7px;min-height:220px;padding:0 4px;container-type:inline-size;}
.zq-bar{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:6px;}
.zq-bar-val{min-height:14px;color:var(--zq-text2);font-size:11px;}
/* 高度是数据：--v（0–1）由脚本给；有数的至少 4px，零的只是一道底线 */
.zq-bar-fill{display:block;width:100%;max-width:34px;height:max(4px,calc(var(--v,0) * 168px));border-radius:4px 4px 2px 2px;background:var(--zq-primary);}
.zq-bar.is-zero .zq-bar-fill{height:2px;border-radius:1px;background:var(--zq-border);}
.zq-bar-label{max-width:100%;overflow:hidden;color:var(--zq-text3);font-size:10.5px;white-space:nowrap;}
/* 柱子挤的时候（「日」十四根，放在最窄的桌面窗口或手机上）每根不到 30px，「10/10」写不下、被截成「10」：隔一根写一个日期，写全 */
@container (max-width: 460px){
  .zq-bar:nth-child(even) .zq-bar-label{visibility:hidden;}
  .zq-bar-label{max-width:none;overflow:visible;}
}
.zq-donut{position:relative;width:172px;height:172px;margin:6px auto 16px;}
.zq-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;}
.zq-donut-center .zq-num{font-size:var(--zq-fs-2xl);font-weight:var(--zq-fw-medium);line-height:1;}
.zq-donut-center span{margin-top:4px;color:var(--zq-text2);font-size:11px;}
.zq-legend{display:flex;flex-direction:column;gap:8px;}
.zq-legend-row{display:flex;align-items:center;gap:8px;font-size:var(--zq-fs-sm);}
.zq-legend-row i{width:10px;height:10px;flex:none;border-radius:3px;}
.zq-legend-row i[data-q="1"]{background:var(--zq-q1);}
.zq-legend-row i[data-q="2"]{background:var(--zq-q2);}
.zq-legend-row i[data-q="3"]{background:var(--zq-q3);}
.zq-legend-row i[data-q="4"]{background:var(--zq-q4);}
.zq-legend-name{flex:1;color:var(--zq-text2);}

/* ── 任务页（第五十二轮，界面打磨第 6 步）──────────────────────────────────────────
   一行工具条：搜索、状态分段（.zq-seg）、「筛选」展开第二行（改了就查，原来五个下拉 +「查询」）。截止和提醒挤在一格：最窄的桌面窗口（960）里正文 700 上下，表格不横着滚。
   表格的列宽只在 .zq-task-grid 写一处（原来表头一遍、每一行又拼一遍内联样式）；象限是小圆点 + 名字（和看板一样，不再是整块彩色底）；
   逾期没做完的截止时间红字；编辑 / 删除悬停或键盘移到这一行时才出现（手机上一直在，见最后那段 @media）。
   行的类名是 .zq-task-line（第五十五轮改的）：原来叫 .zq-task-row，和 Markdown 勾选项的类重名，知识 Wiki 里的勾选项被套上了这一行的边框和内边距。 */
.zq-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}
.zq-task-tools{display:flex;flex-wrap:wrap;align-items:center;gap:var(--zq-sp-2);}
.zq-search{display:flex;align-items:center;gap:var(--zq-sp-2);flex:1 1 240px;max-width:360px;height:32px;padding:0 10px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-input-bg);color:var(--zq-text3);}
.zq-search:focus-within{border-color:var(--zq-primary);}
.zq-search .zq-ic{width:15px;height:15px;flex:none;display:inline-flex;}
.zq-search input{flex:1;min-width:0;height:100%;padding:0;border:none;outline:none;background:transparent;color:var(--zq-text);font:inherit;font-size:var(--zq-fs-sm);}
.zq-search input::placeholder{color:var(--zq-text3);}
.zq-task-more{height:32px;padding:0 12px;font-size:var(--zq-fs-sm);color:var(--zq-text2);}
.zq-task-more[aria-expanded="true"],.zq-task-more.is-active{color:var(--zq-text);border-color:var(--zq-text3);}
.zq-task-more .zq-ic{width:15px;height:15px;display:inline-flex;}
.zq-task-filters{display:flex;flex-wrap:wrap;align-items:center;gap:var(--zq-sp-3);}
.zq-task-filter{display:inline-flex;align-items:center;gap:var(--zq-sp-2);font-size:var(--zq-fs-xs);color:var(--zq-text2);}
.zq-task-filter .zq-select{height:30px;}
.zq-task-scroll{min-width:640px;}
.zq-task-grid{display:grid;grid-template-columns:minmax(200px,1fr) 96px 44px 72px 128px 60px;gap:var(--zq-sp-3);align-items:center;}
.zq-task-line{padding:9px var(--zq-sp-4);border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-sm);}
.zq-task-line:last-child{border-bottom:none;}
.zq-task-line:hover,.zq-task-line:focus-within{background:var(--zq-card-soft);}
.zq-task-line.is-done{color:var(--zq-text3);}
.zq-task-main{min-width:0;}
.zq-task-title{display:block;max-width:100%;padding:0;border:none;background:none;color:inherit;font:inherit;font-size:var(--zq-fs-base);text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;}
.zq-task-title:hover{text-decoration:underline;text-underline-offset:3px;}
.zq-task-title:focus-visible{outline:none;box-shadow:var(--zq-focus);border-radius:4px;}
.zq-task-desc{margin-top:2px;color:var(--zq-text3);font-size:var(--zq-fs-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-task-quad{display:inline-flex;align-items:center;gap:6px;min-width:0;color:var(--zq-text2);font-size:var(--zq-fs-xs);white-space:nowrap;}
.zq-task-quad i{width:6px;height:6px;flex:none;border-radius:50%;background:var(--zq-text3);}
.zq-task-quad i.q1{background:var(--zq-q1);}
.zq-task-quad i.q2{background:var(--zq-q2);}
.zq-task-quad i.q3{background:var(--zq-q3);}
.zq-task-quad i.q4{background:var(--zq-q4);}
.zq-task-pri{color:var(--zq-text2);font-size:var(--zq-fs-xs);}
.zq-task-time{display:flex;flex-direction:column;gap:1px;min-width:0;}
.zq-task-when{color:var(--zq-text2);font-size:var(--zq-fs-xs);}
.zq-task-remind{color:var(--zq-text3);font-size:var(--zq-fs-xs);}
.zq-task-when.is-overdue{color:var(--zq-bad);}
.zq-task-line.is-done .zq-task-quad,.zq-task-line.is-done .zq-task-pri,.zq-task-line.is-done .zq-task-when{color:var(--zq-text3);}
.zq-task-status{display:inline-flex;align-items:center;height:22px;padding:0 9px;border:1px solid var(--zq-border);border-radius:999px;background:var(--zq-card);color:var(--zq-text2);font-size:var(--zq-fs-xs);white-space:nowrap;cursor:pointer;}
.zq-task-status:hover{border-color:var(--zq-text3);color:var(--zq-text);}
.zq-task-status.is-doing{border-color:var(--zq-text3);color:var(--zq-text);}
.zq-task-status:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-task-acts{display:flex;justify-content:flex-end;gap:2px;opacity:0;transition:opacity .12s ease;}
.zq-task-line:hover .zq-task-acts,.zq-task-line:focus-within .zq-task-acts{opacity:1;}
.zq-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:var(--zq-rs);background:transparent;color:var(--zq-text2);cursor:pointer;}
.zq-icon-btn:hover{background:var(--zq-card);color:var(--zq-text);}
.zq-icon-btn.is-danger:hover{color:var(--zq-bad);}
.zq-icon-btn:focus-visible{outline:none;box-shadow:var(--zq-focus);}
.zq-icon-btn .zq-icon{width:15px;height:15px;}
.zq-task-more-row{padding:var(--zq-sp-3) var(--zq-sp-4);text-align:center;}

/* ── 迷你番茄钟（第五十轮，mini.html；docs/mini-pomodoro-plan.md 第 2 步）────────────────────────────
   半透明的深色胶囊（用户定的，像网易云的桌面歌词）。页面本身透明：第 3 步的悬浮面板是透明窗口，只露出胶囊。
   窄到 240px 也放得下：任务名先省略，「第 N 轮」不动。选择器带 html.zq-mini-page：这个窗口比手机还窄，
   最后那段 @media 里 .zq-main 要给侧栏让出 56px —— 这里要盖过它（迷你窗没有侧栏）。 */
html.zq-mini-page,html.zq-mini-page body{background:transparent;min-height:0;overflow:hidden;}
html.zq-mini-page .zq-main{display:flex;align-items:center;gap:var(--zq-sp-3);height:56px;margin:6px;padding:0 10px 0 8px;max-width:none;min-width:0;box-sizing:border-box;
  border-radius:999px;background:color-mix(in srgb,var(--zq-mini-bg) 86%,transparent);color:var(--zq-mini-text);border:1px solid var(--zq-mini-line);
  box-shadow:0 8px 24px rgba(0,0,0,.28);-webkit-backdrop-filter:blur(18px) saturate(1.4);backdrop-filter:blur(18px) saturate(1.4);-webkit-user-select:none;user-select:none;}
.zq-mini-go{position:relative;flex:none;width:40px;height:40px;padding:0;border:none;border-radius:50%;background:transparent;color:var(--zq-mini-text);cursor:pointer;display:flex;align-items:center;justify-content:center;}
.zq-mini-go:hover,.zq-mini-expand:hover{background:var(--zq-mini-line);}
.zq-mini-go:focus-visible,.zq-mini-expand:focus-visible{outline:none;box-shadow:0 0 0 2px var(--zq-mini-text);}
.zq-mini-dial{position:absolute;inset:0;width:40px;height:40px;}
.zq-mini-track{fill:none;stroke:var(--zq-mini-line);stroke-width:2.5;}
.zq-mini-arc{fill:none;stroke:var(--zq-mini-text);stroke-width:2.5;stroke-linecap:round;transition:stroke-dasharray .4s linear;}
.zq-mini-go .zq-ic{width:15px;height:15px;display:inline-flex;}
.zq-mini-go .zq-icon{fill:currentColor;}
.zq-mini-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;}
.zq-mini-time{font-size:var(--zq-fs-xl);line-height:1.15;font-weight:var(--zq-fw-medium);}
html.zq-mini-page .zq-main.is-paused .zq-mini-time{color:var(--zq-mini-text2);}
.zq-mini-sub{display:flex;gap:6px;min-width:0;font-size:var(--zq-fs-xs);color:var(--zq-mini-text2);white-space:nowrap;}
.zq-mini-note{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;}
.zq-mini-round{flex:none;}
.zq-mini-round:empty{display:none;}
.zq-mini-round::before{content:'·';margin-right:6px;}
.zq-mini-out{display:none;padding-left:var(--zq-sp-2);font-size:var(--zq-fs-sm);color:var(--zq-mini-text2);}
html.zq-signed-out .zq-mini-go,html.zq-signed-out .zq-mini-time,html.zq-signed-out .zq-mini-sub{display:none;}
html.zq-signed-out .zq-mini-out{display:block;}
.zq-mini-expand{flex:none;width:28px;height:28px;padding:0;border:none;border-radius:50%;background:transparent;color:var(--zq-mini-text2);cursor:pointer;display:flex;align-items:center;justify-content:center;}
.zq-mini-expand:hover{color:var(--zq-mini-text);}
.zq-mini-expand .zq-ic{width:14px;height:14px;display:inline-flex;}

/* ── 手机（第二十轮）──────────────────────────────────────────────────────
   原来这份样式表一条 @media 都没有：375px 宽时侧栏照样 188px，正文剩 150px，标题一个字一行，整页横向多出 246px。
   侧栏在手机上默认就是折叠态（zhiqu-ui.js 的 isMobile），展开时浮在正文上面、不推正文。
   页面级的多栏布局都写在内联 style 里，所以只能按 style 属性认：并排的几栏改成一栏，四个一排的数字卡改成两个一排；
   行内部的「时间 + 标题」、本身就会横向滚动的（一周日历、任务表）、auto-fit 本来就会换行的，不动。
   新加一种 grid-template-columns 时 MobileLayoutTest 会要求你决定它在手机上怎么排。
   这一段必须留在文件最后：@media 不加优先级，同优先级的规则谁在后谁赢。它原来夹在文件中间，
   后面的 .zq-main{margin-left:188px; padding:30px 34px 80px} 压过了它 —— 手机上一展开侧栏，正文就被推到 188px、换回桌面 padding
   （收起时 .zq-main.is-side-collapsed 优先级更高，所以平时看不出来）。MobileLayoutTest 钉着「最后」。 */
/* ── 后台四页（第七十七轮，界面打磨第 8 步的最后一段：原来 admin.js 40 处、四页 HTML 21 处内联样式；数字、状态的颜色看数据（data-state）） ── */
.zq-admin{display:flex;flex-direction:column;gap:var(--zq-sp-4);}
.zq-admin-metrics{grid-template-columns:repeat(6,minmax(0,1fr));}
.zq-admin-stat{padding:14px 16px;}
.zq-admin-stat .zq-stat-num{margin-top:7px;font-size:var(--zq-fs-xl);line-height:1;}
.zq-admin-stat[data-state="attention"] .zq-stat-num{color:var(--zq-primary);}
.zq-admin-stat[data-state="bad"] .zq-stat-num{color:var(--zq-bad);}
.zq-admin-stat-note{display:block;margin-top:5px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-admin-cols{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(300px,1fr);gap:var(--zq-sp-4);align-items:start;}
.zq-admin-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--zq-sp-3);margin-bottom:var(--zq-sp-4);}
.zq-admin-card-head>span{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-admin-card-head p{margin:5px 0 0;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-admin-card-title{margin-bottom:var(--zq-sp-3);}
.zq-admin-health{display:flex;flex-direction:column;max-height:340px;overflow-y:auto;}
.zq-admin-issue{padding:9px 0;border-bottom:1px solid var(--zq-border-soft);}
.zq-admin-issue-head{display:flex;justify-content:space-between;gap:10px;}
.zq-admin-issue-head>strong{font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);}
.zq-admin-issue-head>span{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-admin-issue>p{margin:4px 0 0;font-size:var(--zq-fs-xs);color:var(--zq-text2);line-height:1.45;}
.zq-admin-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;}
.zq-admin-tile{min-width:0;padding:10px 12px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);}
.zq-admin-tile>span{display:block;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-admin-tile>strong{display:block;margin-top:5px;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);overflow-wrap:anywhere;}
.zq-admin-tile>strong[data-state="ok"]{color:var(--zq-ok);}
.zq-admin-tile>strong[data-state="warn"]{color:var(--zq-warn);}
.zq-admin-tile>strong[data-state="bad"]{color:var(--zq-bad);}
.zq-admin-tile>strong[data-state="primary"]{color:var(--zq-primary);}
.zq-admin-facts{display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;font-size:var(--zq-fs-xs);color:var(--zq-text2);}
.zq-admin-list{margin-top:14px;border-top:1px solid var(--zq-border-soft);}
.zq-admin-line{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--zq-border-soft);font-size:var(--zq-fs-xs);}
.zq-admin-line-id{width:32px;color:var(--zq-text3);}
.zq-admin-line>strong{min-width:76px;font-weight:var(--zq-fw-medium);}
.zq-admin-line-text{flex:1;min-width:0;overflow-wrap:anywhere;color:var(--zq-text2);}
.zq-admin-dead{margin-top:12px;}
.zq-admin-dead>summary{cursor:pointer;font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);color:var(--zq-bad);}
.zq-admin-btns{display:flex;gap:var(--zq-sp-2);margin-top:14px;}
.zq-admin-note{margin:0 0 10px;font-size:var(--zq-fs-sm);color:var(--zq-text2);}
.zq-admin-secret{margin:0 0 16px;padding:10px 14px;border:1px solid var(--zq-border);border-radius:var(--zq-rs);background:var(--zq-card-soft);font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);user-select:all;}
.zq-admin-count{font-size:var(--zq-fs-sm);color:var(--zq-text3);}
/* 次要按钮的语气：通过 / 重新发布、下架、删除 / 驳回 / 丢弃 */
.zq-btn-ghost.is-ok{color:var(--zq-ok);}
.zq-btn-ghost.is-warn{color:var(--zq-warn);}
.zq-btn-ghost.is-danger{color:var(--zq-bad);}
/* 账号管理：列宽只写这一处（表头和行同一个类）；操作那一列按内容宽 —— 原来 128px 放不下三个按钮，往左溢出盖住了日期 */
.zq-acct-row{display:grid;grid-template-columns:minmax(120px,1.1fr) minmax(150px,1.3fr) 76px 62px 76px 92px 176px;gap:8px;align-items:center;padding:10px 16px;}
.zq-acct-row:not(.zq-thead){border-bottom:1px solid var(--zq-border-soft);}
.zq-acct-row.is-off{opacity:.6;}
.zq-acct-who{display:flex;align-items:center;gap:9px;min-width:0;}
.zq-acct-avatar{width:28px;height:28px;flex:none;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--zq-tint);color:var(--zq-primary);font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);}
.zq-acct-name{font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-acct-mail{min-width:0;font-size:var(--zq-fs-xs);color:var(--zq-text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.zq-acct-row .zq-badge[data-state="admin"]{background:var(--zq-tint);color:var(--zq-primary);}
.zq-acct-row .zq-badge[data-state="user"]{background:var(--zq-card-soft);color:var(--zq-text2);}
.zq-acct-status{font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-medium);}
.zq-acct-status[data-state="on"]{color:var(--zq-ok);}
.zq-acct-status[data-state="off"]{color:var(--zq-bad);}
.zq-acct-meta{font-size:var(--zq-fs-xs);color:var(--zq-text2);}
.zq-acct-acts{display:flex;justify-content:flex-end;gap:6px;}
.zq-acct-foot{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 16px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
/* 全局有一条 input:not([type=checkbox]):not([type=radio]){width:100%}（权重 0,2,1），这里得压过它（页头的操作区按 PageHeadTest 只许是一个干净的 .zq-page-actions，所以按 id） */
#zq-acct-search{width:200px;}
/* 反馈管理 */
.zq-feedback-list{display:flex;flex-direction:column;gap:10px;}
.zq-feedback-head{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap;}
.zq-feedback-head>strong{font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);}
.zq-feedback-head>.zq-num{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-feedback-head>button{margin-left:auto;}
.zq-feedback>p{margin:0;font-size:var(--zq-fs-sm);line-height:1.6;}
.zq-feedback .zq-badge[data-state="open"]{background:var(--zq-bad-tint);color:var(--zq-bad);}
.zq-feedback .zq-badge[data-state="closed"]{background:var(--zq-ok-tint);color:var(--zq-ok);}
.zq-seg-count{color:var(--zq-text3);}
/* 共享计划审核：两列、卡片按自己的高度（原来同一行的被拉成一样高，矮的那张下面空一大块） */
.zq-reviews{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start;}
.zq-review-section{grid-column:1 / -1;margin:8px 2px 0;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);color:var(--zq-text2);}
.zq-review.is-dim{opacity:.72;}
.zq-review-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px;}
.zq-review-head .zq-badge{background:var(--zq-tint);color:var(--zq-primary);}
.zq-review-head .zq-num{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-review h3{margin:0 0 5px;font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);}
/* 标题是按钮（键盘点得到）：全局给按钮的 white-space:nowrap 要解开，不然一串没有空格的长标题把卡片和整页撑宽 */
.zq-review-title{max-width:100%;padding:0;border:none;background:none;color:inherit;font:inherit;text-align:left;white-space:normal;overflow-wrap:anywhere;cursor:pointer;}
.zq-review-title>span{display:inline-flex;align-items:center;gap:2px;margin-left:6px;vertical-align:middle;font-size:var(--zq-fs-xs);font-weight:var(--zq-fw-regular);color:var(--zq-primary);}
.zq-review>p{margin:0 0 10px;font-size:var(--zq-fs-sm);color:var(--zq-text2);line-height:1.55;}
.zq-review-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;padding-top:10px;border-top:1px solid var(--zq-border-soft);font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-review-acts{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px;}
.zq-review-desc{margin:0 0 4px;font-size:var(--zq-fs-sm);color:var(--zq-text2);line-height:1.7;}
.zq-review-meta{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-review-sec{margin:14px 0 7px;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);}
.zq-review-items{display:flex;flex-direction:column;gap:6px;}
.zq-review-item{padding:8px 11px;border:1px solid var(--zq-border-soft);border-radius:var(--zq-rs);background:var(--zq-card-soft);}
.zq-review-item>strong{display:block;font-size:var(--zq-fs-sm);font-weight:var(--zq-fw-medium);}
.zq-review-item>p{margin:2px 0 0;font-size:var(--zq-fs-xs);color:var(--zq-text2);line-height:1.5;}
.zq-review-item>span{display:block;margin-top:3px;font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-review-log{font-size:var(--zq-fs-xs);color:var(--zq-text2);line-height:1.6;}
.zq-review-log .zq-num{color:var(--zq-text3);}
.zq-review-textarea{min-height:100px;}

/* ── 下载桌面版（第八十二轮）：共用层的弹窗（zhiqu-api.js 的 openDesktopDownload），落地页的按钮和头像菜单都打开它。
   这台电脑那一项排在前面、边框深一点、标「你的电脑」；桌面应用里入口不出现（头像菜单那项不画，落地页的按钮靠下面这条藏起来）。 */
html.zq-desktop [data-zq-download]{display:none !important;}
.zq-dl{display:flex;flex-direction:column;gap:var(--zq-sp-3);}
.zq-dl-lead{margin:0;font-size:var(--zq-fs-sm);color:var(--zq-text2);line-height:1.6;}
.zq-dl-item{display:flex;flex-direction:column;gap:var(--zq-sp-3);padding:var(--zq-sp-4);border:1px solid var(--zq-border);border-radius:var(--zq-rm);background:var(--zq-card);}
.zq-dl-item[data-mine="true"]{border-color:var(--zq-text3);}
.zq-dl-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--zq-sp-3);}
.zq-dl-name{display:flex;flex-direction:column;gap:2px;min-width:0;}
.zq-dl-name>strong{font-size:var(--zq-fs-md);font-weight:var(--zq-fw-medium);}
.zq-dl-name>span{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-dl-mine{flex:none;padding:2px 8px;border-radius:999px;background:var(--zq-tint);font-size:var(--zq-fs-xs);color:var(--zq-text2);}
.zq-dl-get{display:flex;align-items:center;flex-wrap:wrap;gap:var(--zq-sp-3);}
.zq-dl-meta{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-dl-steps{margin:0;padding-left:1.3em;font-size:var(--zq-fs-sm);color:var(--zq-text2);line-height:1.65;}
.zq-dl-steps code,.zq-dl-note code{padding:1px 5px;border-radius:var(--zq-rs);background:var(--zq-card-soft);font-family:var(--zq-fontM);font-size:var(--zq-fs-xs);overflow-wrap:anywhere;}
.zq-dl-none{margin:0;font-size:var(--zq-fs-sm);color:var(--zq-text3);}
.zq-dl-warn{margin:0;padding:8px 10px;border-radius:var(--zq-rs);background:var(--zq-warn-tint);color:var(--zq-warn);font-size:var(--zq-fs-sm);line-height:1.55;}
.zq-dl-sum{font-size:var(--zq-fs-xs);color:var(--zq-text3);}
.zq-dl-sum>summary{width:max-content;cursor:pointer;}
.zq-dl-sum>code{display:block;margin-top:4px;font-family:var(--zq-fontM);overflow-wrap:anywhere;user-select:all;}
.zq-dl-note{margin:0;font-size:var(--zq-fs-xs);color:var(--zq-text3);line-height:1.6;}

@media (max-width: 760px){
  /* 后台四页（第七十七轮）：六个数两个一排、两栏变一栏；账号一行叠成几行（不横着滚）；共享计划一列 */
  .zq-admin-metrics{grid-template-columns:repeat(2,minmax(0,1fr));}
  .zq-admin-cols,.zq-reviews{grid-template-columns:minmax(0,1fr);}
  #zq-acct-search{flex:1 1 100%;width:auto;}
  .zq-acct .zq-thead{display:none;}
  .zq-acct-row:not(.zq-thead){display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;padding:12px 14px;}
  .zq-acct-who{flex:1 1 auto;}
  .zq-acct-row>:nth-child(3){order:1;}
  .zq-acct-status{order:2;}
  .zq-acct-mail{order:3;flex:1 1 100%;}
  .zq-acct-row>.zq-acct-meta{order:4;}
  .zq-acct-joined::before{content:"注册于 ";}
  .zq-acct-acts{order:5;flex:1 1 100%;justify-content:flex-start;}

  .zq-main,.zq-main.is-side-collapsed{margin-left:56px;padding:18px 12px 64px;}
  .zq-side:not(.is-collapsed){box-shadow:0 0 0 100vmax rgba(0,0,0,.35);}
  /* 原来这里有两条按内联 style 认网格的规则（[style*="grid-template-columns"] 压成一栏、[style*="repeat(4"]… 两个一排）：
     第八十一轮看板的最后两处内联网格挪进了类（.zq-stat-grid + zq-phone-2col、.zq-dash-cols + zq-phone-1col），它们没人用了，删掉 */
  /* 页头：标题一侧和按钮一侧放不下就上下排（原来按钮被挤成两行、或者把标题挤成一个字一行） */
  .zq-main header{flex-wrap:wrap;}
  .zq-form-grid{grid-template-columns:minmax(0,1fr);}
  /* 看板（第四十八轮）：七个日子挤一排，格子里只留星期、日期、点；四象限一格一行 */
  .zq-week{gap:3px;}
  .zq-quads{grid-template-columns:minmax(0,1fr);}
  /* 任务页（第五十二轮）：手机上没有悬停 —— 编辑 / 删除一直在；搜索框占一整行。
     一行不再是一排格子（横着滚的话状态、时间、编辑删除都在屏幕外）：标题占一整行，象限、优先级、状态、时间、编辑删除排在下面、放不下就换行；表头藏起来 */
  .zq-task-acts{opacity:1;}
  .zq-rt-acts{opacity:1;}
  .zq-search{flex-basis:100%;max-width:none;}
  .zq-task-scroll{min-width:0;}
  .zq-thead.zq-task-grid{display:none;}
  .zq-task-line.zq-task-grid{display:flex;flex-wrap:wrap;align-items:center;column-gap:10px;row-gap:6px;}
  .zq-task-main{flex:1 1 100%;}
  .zq-task-time{flex-direction:row;gap:8px;}
  .zq-task-acts{margin-left:auto;}

  /* 设置、成就弹窗（第三十轮）：手机上铺满屏幕，分栏变成顶上一排可以横着滑的页签。
     弹窗不在 .zq-main 里，上面那两条按 style 认的规则管不到它 —— 里面的多栏用类名说自己在手机上怎么排 */
  .zq-modal-mask:has(.zq-modal-wide){padding:0;}
  .zq-modal-wide{width:100%!important;height:100%;max-height:100%;border:none;border-radius:0;}
  .zq-modal-wide .zq-modal-body{flex:1;min-height:0;}
  .zq-settings{flex-direction:column;flex:1;height:auto;}
  .zq-settings-tabs{width:auto;flex-direction:row;overflow-x:auto;padding:8px;border-right:none;border-bottom:1px solid var(--zq-border-soft);scrollbar-width:none;}
  .zq-settings-tabs::-webkit-scrollbar{display:none;}
  .zq-settings-tabs button{padding:0 10px;}
  .zq-settings-pane{padding:16px 14px 28px;}
  .zq-phone-1col{grid-template-columns:minmax(0,1fr)!important;}
  .zq-phone-2col{grid-template-columns:repeat(2,minmax(0,1fr))!important;}

  /* 两侧可收起的面板（AI 助手、Wiki）：桌面上是三栏，收起时各留一条 44px 的竖条。
     手机上两条竖条加间距吃掉将近 100px，320px 宽时 Wiki 正文只剩 82px、工具栏被切掉 163px；展开一侧聊天区只剩 30px。
     所以手机上：收起的面板变成正文上方的一排两个页签，正文拿满宽；展开的面板浮在正文上面，不挤它。
     .zq-panel-host 由 zhiqu-ui.js 的 setupPanels 加在面板的父元素上。 */
  .zq-panel-host{display:grid!important;grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-rows:36px minmax(0,1fr);gap:8px!important;position:relative;margin:0!important;}
  .zq-panel-host>:not([data-zq-collapse]){grid-column:1 / -1;grid-row:2;min-width:0;}
  .zq-panel-host>[data-zq-collapse="left"]{grid-column:1;grid-row:1;}
  .zq-panel-host>[data-zq-collapse="right"]{grid-column:2;grid-row:1;}
  .zq-panel-host>[data-zq-collapse].zq-collapsed{width:auto!important;min-width:0!important;padding:4px 8px!important;align-items:stretch;}
  .zq-panel-host>.zq-collapsed .zq-rail{position:static;flex-direction:row;gap:8px;padding-top:0;}
  .zq-panel-host>[data-zq-collapse].zq-collapsed:not(.zq-panel-closing)>*:not(.zq-rail){display:none!important;}
  .zq-panel-host>[data-zq-collapse="right"].zq-collapsed .zq-rail{flex-direction:row-reverse;}
  .zq-panel-host>.zq-collapsed .zq-rlabel{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
  .zq-panel-host>[data-zq-collapse]:not(.zq-collapsed),.zq-panel-host>[data-zq-collapse].zq-panel-closing{position:absolute!important;top:0;bottom:0;z-index:8;width:min(300px,88%)!important;box-shadow:0 8px 30px rgba(0,0,0,.28)!important;transition:opacity .18s ease,transform .24s cubic-bezier(.22,.61,.36,1);}
  .zq-panel-host>[data-zq-collapse="left"]:not(.zq-collapsed),.zq-panel-host>[data-zq-collapse="left"].zq-panel-closing{left:0;}
  .zq-panel-host>[data-zq-collapse="right"]:not(.zq-collapsed),.zq-panel-host>[data-zq-collapse="right"].zq-panel-closing{right:0;}
  .zq-panel-host>[data-zq-collapse].zq-panel-opening,.zq-panel-host>[data-zq-collapse].zq-panel-closing{opacity:0;transform:translateX(-12px);}
  .zq-panel-host>[data-zq-collapse="right"].zq-panel-opening,.zq-panel-host>[data-zq-collapse="right"].zq-panel-closing{transform:translateX(12px);}
  .zq-panel-host>.zq-panel-closing .zq-rail{visibility:hidden;}

  /* AI 输入区（第四十四轮起输入框本来就单独一行）：工具那一条放不下 —— 三个开关只留图标（名字在 aria-label 里），模型窄一点 */
  .zq-composer-wrap{padding:4px 0 max(22px,env(safe-area-inset-bottom));}
  .zq-chip{padding:0 8px;}
  .zq-chip-label{display:none;}
  .zq-composer-model{max-width:120px;}
  /* 思考档位写着名字，比原来的图标宽（第一百零八轮）：一行放不下时模型和发送换到第二行，不把模型名挤没；面板向左展开，不出屏幕 */
  .zq-composer-bar{flex-wrap:wrap;}
  #zq-effort-pick .zq-tier-menu{left:auto;right:0;}
  /* 命令面板窄了：说明另起一行，名字和参数不被挤成竖排（第一百一十八轮） */
  .zq-slash-item{flex-wrap:wrap;gap:2px 10px;}
  .zq-slash-desc{flex-basis:100%;}
  #zq-chat{padding:14px 12px!important;}
  /* AI 助手、Wiki 的定高容器：桌面上减的是 .zq-main 的上下 padding（32 + 80），手机上 padding 是 18+64=82px，
     照减桌面那份底下白空 30px。dvh 跟着手机浏览器地址栏的收放走；不支持 dvh 的浏览器丢掉这一条，退回 .zq-fill-page 的 100vh。
     （第七十八轮之前定高写在两页的内联里，这里按 [style*="calc(100vh - 110px)"] 认、带 !important） */
  .zq-main>.zq-fill-page{height:calc(100dvh - 82px);}
  .zq-main>div:has(#zq-chat-col){height:calc(100vh - 18px)!important;height:calc(100dvh - 18px)!important;}
  /* Wiki 正文头上那行静态提示（「点击正文或标题即可编辑」「段落」）：手机上让给正文 */
  .zq-main div:has(> #zq-wiki-block)>span{display:none;}
}
