/* createel.cn 工作台 · 设计系统（沿用 prototype/原型预览.html 的 token 与视觉语言）
   无框架、无构建：所有断点与尺寸用原生 CSS */

:root{
  --ink:#0f1222; --ink-2:#3a3f55; --ink-3:#6b7280; --ink-4:#9aa0ae;
  --line:#e7e8ee; --line-2:#f0f1f5; --bg:#f7f7fa; --card:#ffffff;
  --accent:#4f46e5; --accent-soft:#eef0ff; --accent-2:#7c3aed;
  --ok:#0f9d58; --ok-soft:#e8f7ef; --warn:#d97706; --warn-soft:#fdf3e3;
  --bad:#dc2626; --bad-soft:#fdecec;
  --cpu:#2563eb; --cpu-soft:#e8efff; --disk:#0d9488; --disk-soft:#e6f5f3;
  --radius:14px; --radius-sm:10px;
  --shadow:0 1px 2px rgba(16,18,34,.04), 0 8px 24px -12px rgba(16,18,34,.10);
  --shadow-lg:0 2px 4px rgba(16,18,34,.04), 0 24px 48px -20px rgba(16,18,34,.16);
  /* 笔记模块语义 token（R-40）：间距 4/8/12/16/24、圆角 8/12；
     颜色只引用主题变量，浅色/深色共用同一套规则 */
  --note-space-1:4px; --note-space-2:8px; --note-space-3:12px;
  --note-space-4:16px; --note-space-5:24px;
  --note-radius-sm:8px; --note-radius:12px;
  --note-line:var(--line); --note-line-strong:#d6d8e4;
  --note-surface:var(--card); --note-surface-2:var(--bg);
  --note-shadow:0 1px 2px rgba(16,18,34,.04), 0 10px 24px -16px rgba(16,18,34,.18);
  --note-shadow-hover:0 2px 6px rgba(16,18,34,.06), 0 16px 32px -18px rgba(16,18,34,.22);
  --note-ease:cubic-bezier(.22,.61,.36,1);
  --note-dur-fast:120ms; --note-dur:160ms; --note-dur-slow:180ms;
  --mono:"SF Mono", ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace;
  --sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif;
  --topbar-h:56px;
  --tap:44px;              /* 最小热区 */
  --gap:16px;
  --page-max:1600px;      /* 内容区最大宽度（不含左侧菜单） */
  --side-w:236px;
  --safe-b:env(safe-area-inset-bottom, 0px);
  /* 底栏底部留白：只留 6px 缓冲 + 真实安全区。
     以前写的是 max(safe,34px)，安卓 safe=0 时也硬留 34px —— 底栏被顶起一大截，
     下面还露出一条颜色对不上的边，这正是「dock 太靠上 + 底边不一样」的来源。 */
  --tab-pad-b:calc(6px + var(--safe-b));
  --tab-bg:rgba(255,255,255,.96);
  --tab-bg-solid:#fff;
  /* 表单控件/滚动条跟着确定的主题走：页头声明了 light dark，但真正的深浅由 data-theme 决定，
     不写这一条，用户手动选浅色、系统却是深色时滚动条会变黑 */
  color-scheme:light;
}

*,*::before,*::after{box-sizing:border-box}
html{overflow-x:clip;background:var(--bg)}      /* 兜底：任何溢出都不得横滚；画布底色跟随主题，别在暗色下露出系统白 */
body{min-height:100dvh;margin:0;font-family:var(--sans);background:var(--bg);color:var(--ink);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:clip}
img,svg,video{max-width:100%}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
[hidden]{display:none !important}
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.skip-link{position:absolute;left:-9999px;top:0}
.skip-link:focus{left:8px;top:8px;z-index:90}

/* ---------- 通用组件 ---------- */
.mono{font-family:var(--mono)}
.muted{color:var(--ink-3)}
.chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;padding:4px 10px;border-radius:999px;background:var(--line-2);color:var(--ink-2);border:0}
.chip.ok{background:var(--ok-soft);color:var(--ok)}
.chip.warn{background:var(--warn-soft);color:var(--warn)}
.chip.bad{background:var(--bad-soft);color:var(--bad)}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 20px;min-width:0}
.card > header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:-18px -20px 16px;padding:14px 20px;border-bottom:1px solid var(--line-2);min-height:var(--tap)}
.card > header h3{margin:0;font-size:15px;letter-spacing:-.01em;display:flex;align-items:center;gap:8px;min-width:0}
.card-body{min-width:0}
.btn{min-height:var(--tap);padding:0 16px;border:1px solid var(--line);border-radius:var(--radius-sm);background:#fff;color:var(--ink-2);font-weight:600;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}
.btn:hover{border-color:#d6d8e4;box-shadow:var(--shadow)}
.btn:active{transform:translateY(1px)}
.btn-primary{border:0;background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;box-shadow:0 6px 16px -8px rgba(79,70,229,.7)}
.btn-primary:hover{box-shadow:0 10px 22px -10px rgba(79,70,229,.75);transform:translateY(-1px);border-color:transparent}
.btn-ghost{background:transparent;border-color:transparent}
.btn-ghost:hover{background:var(--line-2);box-shadow:none}
.btn-icon{width:var(--tap);min-width:var(--tap);padding:0;border-radius:var(--radius-sm)}
.btn-icon svg{width:18px;height:18px}
.empty{border:1px dashed var(--line);border-radius:var(--radius-sm);background:#fbfbfd;color:var(--ink-4);font-size:13.5px;padding:22px 16px;text-align:center}

/* 登录页样式在 css/login.css —— 那一页和外壳的改造节奏不同，不混在这里。
   历史上这里有一套 .login-wrap / .login-card，v7 重做登录页时删掉了。 */

/* ---------- 外壳顶栏 ---------- */
.topbar{position:sticky;top:0;z-index:40;display:flex;align-items:center;gap:10px;min-height:var(--topbar-h);padding:6px 16px;background:rgba(255,255,255,.9);backdrop-filter:saturate(180%) blur(12px);border-bottom:1px solid var(--line)}
.topbar .brand{display:flex;align-items:center;gap:8px;font-weight:700;font-size:14px;letter-spacing:-.01em;white-space:nowrap}
.topbar .brand .dot{width:24px;height:24px;border-radius:8px;display:block}
.topbar .spacer{flex:1}
.topbar .brand{text-decoration:none;color:inherit}
/* 搜索框：顶栏正中的真输入框；结果只在回车/点「搜索」后出现在正下方 */
.topsearch{position:relative;flex:1 1 auto;max-width:560px;margin:0 auto;min-width:0}
.topsearch-form{display:flex;align-items:center;gap:8px;min-height:38px;padding:0 4px 0 12px;border:1px solid var(--line);border-radius:999px;background:#fff;transition:border-color .18s,box-shadow .18s}
.topsearch-form:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px rgba(79,70,229,.12)}
.topsearch-form>svg{width:16px;height:16px;flex:0 0 auto;color:var(--ink-4)}
.topsearch-form input{flex:1 1 auto;min-width:0;height:36px;border:0;background:none;color:var(--ink);font-size:14px;outline:none}
.topsearch-form input::placeholder{color:var(--ink-4)}
.topsearch-form input::-webkit-search-cancel-button{cursor:pointer}
.topsearch-go{flex:0 0 auto;min-height:30px;padding:0 14px;border:0;border-radius:999px;background:var(--accent);color:#fff;font-size:13px;font-weight:600;cursor:pointer}
.topsearch-go:hover{filter:brightness(1.06)}
.search-drop{position:absolute;left:0;right:0;top:calc(100% + 8px);z-index:50;background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:6px;max-height:min(60vh,520px);overflow:auto}
.search-drop[hidden]{display:none}
.search-drop .search-results{max-height:none}
.search-drop .search-results li{cursor:pointer}
.search-drop .search-results li:hover{background:var(--line-2)}
.search-drop .search-results li .kind{margin-left:auto}
.search-drop .search-hint{padding:6px 10px}

/* 右上角：通知铃铛 + 问工作台 + 账号。三件都固定高度，图标在按钮正中。 */
.topnotify{position:relative;flex:0 0 auto;display:flex;align-items:center}
.top-icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:36px;height:36px;padding:0;border:1px solid transparent;border-radius:50%;
  background:none;color:var(--ink-3);line-height:0;cursor:pointer;
  transition:background .15s,color .15s,border-color .15s;
}
.top-icon svg{display:block;width:19px;height:19px;margin:0}
.top-icon:hover{background:var(--line-2);color:var(--ink)}
.top-icon[aria-expanded="true"],.top-icon.is-open{background:var(--accent-soft);color:var(--accent);border-color:var(--accent-soft)}
.topai{
  display:inline-flex;align-items:center;justify-content:center;gap:7px;flex:0 0 auto;
  height:36px;padding:0 13px;border:1px solid var(--line);border-radius:999px;
  background:var(--card);color:var(--ink-2);font-family:inherit;font-size:13px;font-weight:650;
  text-decoration:none;white-space:nowrap;cursor:pointer;
  transition:border-color .15s,color .15s,box-shadow .15s,background .15s;
}
.topai svg{width:17px;height:17px;flex:0 0 auto}
.topai:hover{border-color:#c9cdf8;color:var(--accent);text-decoration:none;box-shadow:var(--shadow)}
.topai.is-open,.topai[aria-expanded="true"]{background:var(--accent-soft);border-color:var(--accent-soft);color:var(--accent)}

/* 通知面板：贴着铃铛往下展开，窄屏不超出视口 */
.notify-pop{
  position:absolute;right:0;top:calc(100% + 10px);z-index:50;
  width:min(326px,calc(100vw - 24px));padding:16px;
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow-lg);
}
.notify-pop[hidden]{display:none}
.notify-head{margin-bottom:12px}
.notify-head h4{margin:0 0 2px;font-size:14px;letter-spacing:-.01em}
.notify-head p{margin:0;font-size:12px;color:var(--ink-4)}
.notify-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 0;border-top:1px solid var(--line-2)}
.notify-k{font-size:13px;color:var(--ink-2)}
.notify-hint{margin:8px 0 0;font-size:12px;line-height:1.6;color:var(--ink-3)}
.notify-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.notify-actions .btn{flex:1 1 auto}
.notify-link{display:inline-block;margin-top:12px;font-size:12px;color:var(--ink-3);text-decoration:none}
.notify-link:hover{color:var(--accent);text-decoration:none}

/* 右上角账号：头像常显，菜单里有更换头像 / 设置 / 退出登录 */
.topuser{position:relative;flex:0 0 auto}
.avatar-btn{display:block;padding:0;border:0;background:none;cursor:pointer;border-radius:50%}
.avatar{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-size:13px;font-weight:700;line-height:1;background-size:cover;background-position:center;flex:0 0 auto;overflow:hidden}
.avatar.has-img{background-color:var(--line-2)}
.avatar-sm{width:30px;height:30px;font-size:12.5px}
.avatar-btn:hover .avatar{box-shadow:0 0 0 3px rgba(79,70,229,.14)}
.user-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:50;min-width:192px;background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:6px}
.user-menu[hidden]{display:none}
.user-menu-head{display:flex;align-items:center;gap:9px;padding:7px 9px 9px;border-bottom:1px solid var(--line-2);margin-bottom:5px}
.user-name{font-size:13.5px;font-weight:650;max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.user-item{display:block;width:100%;min-height:var(--tap);padding:0 10px;border:0;border-radius:8px;background:none;color:var(--ink-2);font-size:13.5px;text-align:left;cursor:pointer}
.user-item:hover{background:var(--line-2);color:var(--ink)}
.user-item.danger{color:var(--bad)}
.user-item.danger:hover{background:var(--bad-soft)}

/* ---------- 外壳布局 ---------- */
.shell{display:grid;grid-template-columns:1fr;min-height:calc(100vh - var(--topbar-h));min-height:calc(100dvh - var(--topbar-h))}
.side{display:none}
.main{min-width:0;width:100%;max-width:var(--page-max);padding:20px 16px calc(70px + var(--tab-pad-b))}
.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:18px}
/* 标题列要吃掉剩余宽度：不给 flex 的话，右边有「刷新」这类按钮时，
   左边只剩内容最小宽，一行副标题会被挤成两行（手机上尤其明显） */
.page-head>div:first-child{flex:1 1 auto;min-width:0}
.page-head h1{font-size:22px;margin:0 0 4px;letter-spacing:-.02em;line-height:1.3}
.page-head h1:empty{display:none}
.page-head > div:has(> h1:empty):has(> p[hidden]){display:none}
.page-head .desc{color:var(--ink-3);font-size:13.5px;margin:0}
.page-tools{display:flex;gap:8px;flex-wrap:wrap}
.page-tools:empty{display:none}

/* 导航项通用 */
.nav-item{display:flex;align-items:center;gap:10px;min-height:var(--tap);padding:0 10px;border-radius:9px;color:var(--ink-2);font-size:13.5px;font-weight:500;text-decoration:none}
.nav-item:hover{background:var(--line-2);text-decoration:none;color:var(--ink)}
.nav-item[aria-current="page"]{background:var(--accent-soft);color:var(--accent);font-weight:650}
.nav-item svg{width:17px;height:17px;flex:0 0 auto}
.nav-sect{margin-top:14px}
.nav-sect h4{margin:0 0 6px;padding:0 10px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-4)}

/* 底部导航（手机） */
.tabbar{position:fixed;left:0;right:0;bottom:0;z-index:45;display:grid;grid-template-columns:repeat(5,1fr);background:var(--tab-bg);backdrop-filter:blur(12px);border-top:1px solid var(--line);padding-bottom:var(--tab-pad-b)}
/* PWA / 全面屏底部：手势条那一块如果没被底栏盖住，露出的就是画布白底
   （暗色主题下一道白边特别刺眼）。底栏本身是半透明 + 毛玻璃，采不到内容时也会偏白。
   这里在最底下铺一层与底栏同色的不透明块，env() 报 0 也照样兜住。 */
@media (max-width:899px){
  body::before{content:"";position:fixed;left:0;right:0;bottom:0;z-index:44;pointer-events:none
    ;height:var(--tab-pad-b);background:var(--tab-bg-solid)}
}
.tabbar a{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:calc(var(--tap) + 12px);font-size:11px;font-weight:600;color:var(--ink-3);text-decoration:none}
.tabbar a:hover{text-decoration:none;color:var(--ink)}
.tabbar a[aria-current="page"]{color:var(--accent)}
.tabbar a svg{width:20px;height:20px}

/* ---------- 视图容器与骨架 ---------- */
.view-root{min-width:0}
.view-root > [data-view]:not([hidden]){display:block}
.grid{display:grid;gap:var(--gap);min-width:0}
.grid > *{min-width:0}
@media (min-width:720px){
  .g-2,.g-2b{grid-template-columns:1fr 1fr}
  .main{padding:24px 24px 64px}
  .page-head h1{font-size:24px}
}
@media (min-width:1080px){
  .shell{grid-template-columns:var(--side-w) minmax(0,1fr)}
  .side{display:flex;flex-direction:column;padding:16px 12px;background:#fff;border-right:1px solid var(--line);position:sticky;top:var(--topbar-h);height:calc(100vh - var(--topbar-h));height:calc(100dvh - var(--topbar-h));overflow-y:auto}
  .side nav{display:flex;flex-direction:column;gap:2px}
  .side .foot{margin-top:20px;padding:12px 10px 0;border-top:1px solid var(--line-2);font-size:11px;color:var(--ink-4);line-height:1.7}
  .side .foot a{color:inherit;text-decoration:none;border-bottom:1px solid transparent}
  .side .foot a:hover{color:var(--accent);border-bottom-color:currentColor}
  /* 设置钉底：nav 高度只由内容撑开，所以底段必须是 side 的直接子元素才吃得到 auto margin */
  .side .nav-foot{margin-top:auto;padding-top:10px;border-top:1px solid var(--line-2);display:flex;flex-direction:column;gap:2px}
  .main{padding:28px 32px 72px;margin:0 auto}
  .tabbar{display:none}
  .g-2{grid-template-columns:1.55fr 1fr}
}

/* 1000–1079（横屏平板 / 小屏笔记本）：底部标签栏在 768 高的屏上吃掉一整条，
   正文又按手机单列铺开，横向空间浪费。这里换成 64px 窄侧栏：图标 + 读屏文字，
   正文拿到 ~960px 宽度；<1000 仍走底部标签栏，<720 的抽屉式移动布局不变。 */
@media (min-width:1000px) and (max-width:1079px){
  .shell{grid-template-columns:64px minmax(0,1fr)}
  .side{display:flex;flex-direction:column;align-items:center;padding:12px 8px;background:#fff;border-right:1px solid var(--line);position:sticky;top:var(--topbar-h);height:calc(100vh - var(--topbar-h));height:calc(100dvh - var(--topbar-h));overflow-y:auto}
  .side nav{display:flex;flex-direction:column;gap:2px;width:100%}
  .side .nav-main,.side .nav-sect,.side .nav-foot{display:flex;flex-direction:column;gap:2px;width:100%}
  .side .nav-item{justify-content:center;padding:0}
  /* 文字视觉隐藏但保留可访问名称：display:none 会把它从读屏树里一起删掉 */
  .side .nav-item span,.side .nav-sect h4{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
  .side .nav-sect{margin-top:8px;padding-top:8px;border-top:1px solid var(--line-2)}
  .side .nav-foot{margin-top:auto;padding-top:8px;border-top:1px solid var(--line-2)}
  .side .foot{display:none}
  .main{padding:24px 28px 64px}
  .tabbar{display:none}
}

/* ---------- 搜索结果（顶栏内联，Ctrl+K 聚焦输入框） ---------- */
.search-results{list-style:none;margin:0;padding:0;max-height:50vh;overflow:auto}
.search-results li{min-height:var(--tap);display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--radius-sm);font-size:14px;color:var(--ink-2)}
.search-results li .kind{font-size:11px;font-weight:700;color:var(--ink-4);margin-left:auto;white-space:nowrap}
.search-hint{font-size:12px;color:var(--ink-4);padding:4px 10px 6px}

/* ---------- toast ---------- */
.toast-host{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(66px + var(--tab-pad-b));z-index:80;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;width:max-content;max-width:calc(100vw - 32px)}
.toast{max-width:100%;background:var(--ink);color:#fff;font-size:13.5px;line-height:1.45;padding:10px 16px;border-radius:999px;box-shadow:var(--shadow-lg);opacity:0;transform:translateY(6px);transition:opacity .18s ease,transform .18s ease}
.toast.in{opacity:1;transform:none}
.toast.ok{background:#0b7a45}
.toast.warn{background:#b4600a}
.toast.bad{background:#b91c1c}
@media (min-width:1080px){.toast-host{bottom:28px}}

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

/* ---------- 手机端收紧（375×667 验收口径） ---------- */
@media (max-width:719px){
  .card{padding:16px}
  .card > header{margin:-16px -16px 14px;padding:12px 16px}
  .topbar{padding:6px 12px;gap:6px}
  .topbar .brand .txt{display:none}
  /* 手机上两个入口只留图标：搜索框还要占走剩下的宽度 */
  .top-icon{width:32px;height:32px}
  .top-icon svg{width:18px;height:18px}
  .topai{width:34px;height:34px;padding:0;gap:0}
  .topai .txt{display:none}
  /* 面板宽 326px，手机上一旦贴着铃铛对齐就会从左边溢出；改成贴视口右边 */
  .notify-pop{position:fixed;left:auto;right:12px;top:calc(var(--topbar-h) + 8px);width:min(340px,calc(100vw - 24px))}
  /* 铃铛和 AI 各占一个位置后，搜索框更窄了：去掉前置放大镜，
     把宽度留给输入框和「搜索」按钮，placeholder 才不会被拦腰截断 */
  .topsearch-form>svg{display:none}
  .topsearch-go{padding:0 12px}
  .search-trigger .txt,.search-trigger kbd{display:none}
  .search-trigger{justify-content:center;padding:0}
  .search-results{max-height:none}
  .topbar .brand .dot{width:26px;height:26px}
  .avatar{width:30px;height:30px}
}

/* ================= 视图组件（W5/W6/W7） ================= */
.row-between{display:flex;align-items:center;justify-content:space-between;gap:10px}
.small{font-size:12.5px}
.input{min-height:var(--tap);padding:0 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:#fff;font-size:14px;width:100%;max-width:260px}
.input.sm{min-height:36px;font-size:13px;width:auto;max-width:140px}
.btn-sm{min-height:38px;padding:0 12px;font-size:13px;border-radius:9px}
.btn-icon.sm{width:38px;min-width:38px}
.row-tools{display:flex;gap:4px;align-items:center;flex-shrink:0}
.row-tools svg{width:16px;height:16px}
.sub-title{margin:16px 0 6px;font-size:12.5px;font-weight:700;letter-spacing:.02em;color:var(--ink-3);text-transform:none}
.sub-title.bad{color:var(--bad)}

/* 首页看板：手机一列到底；桌面左列（今天条 / 清单四数 / 四张汇总卡）+ 右列本月。
   右列固定 380px —— 本月是按格子铺开的，列太窄会把日期挤成 8px（v6 的教训）。 */
/* 间隙分层：列与列 22px > 卡与卡 18px > 卡内 12px，读起来才分得清哪两块是一组。
   今日条与看板之间也留 16px（手机上 12px）—— 以前两块贴在一起，像同一张卡。 */
.home-board{display:grid;grid-template-columns:1fr;gap:16px;margin-top:12px}
@media (min-width:720px){.home-board{margin-top:16px}}
@media (min-width:1080px){.home-board{grid-template-columns:minmax(0,1fr) 384px;gap:22px;align-items:start;margin-top:20px}}
/* 宽屏把本月卡放宽一点：字号放大后 380px 会把 4 个字的农历挤掉。
   右列比原来 +4px，正好抵掉卡片内边距从 20px 放宽到 22px，月历格子宽度不变 */
@media (min-width:1280px){.home-board{grid-template-columns:minmax(0,1fr) 424px;gap:24px}}
.home-col{display:flex;flex-direction:column;gap:16px;min-width:0}
@media (min-width:1080px){.home-col{gap:18px}}
/* 卡片内边距比通用卡宽 2px，卡头跟着一起让（卡头用的是负 margin，必须成对改） */
@media (min-width:720px){
  .home-col .card{padding:20px 22px}
  .home-col .card > header{margin:-20px -22px 18px;padding:15px 22px}
}

/* 四张汇总卡：手机 2×2，桌面一行四张。卡里只有数字和去处，点开才是内容 */
.tile-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;min-width:0}
@media (min-width:720px){.tile-grid{grid-template-columns:repeat(4,1fr)}}
.tile{display:flex;flex-direction:column;gap:6px;padding:14px;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);color:var(--ink);text-decoration:none;min-width:0}
.tile:hover{text-decoration:none;border-color:var(--accent);color:var(--ink)}
.tile:active{background:var(--accent-soft)}
.tile-h{display:flex;align-items:center;justify-content:space-between;gap:6px;font-size:12.5px;font-weight:650;color:var(--ink-3)}
.tile-go{font-style:normal;font-size:16px;line-height:1;color:var(--ink-4)}
.tile-v{display:flex;align-items:baseline;gap:5px;min-width:0}
.tile-v b{font-size:27px;font-weight:750;line-height:1.1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.tile-v em{font-style:normal;font-size:11.5px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tile-sub{font-size:11.5px;color:var(--ink-3);line-height:1.45}
.tile.on .tile-v b{color:var(--accent)}
.tile.ok .tile-v b{color:var(--ok)}
.tile.warn .tile-v b{color:var(--warn)}
.tile.bad .tile-v b{color:var(--bad)}
.tile-sub .bad{color:var(--bad);font-weight:650}

/* 清单四数下面那句结论 */
.card-note{margin:10px 2px 0;font-size:12.5px;color:var(--ink-3);line-height:1.5}

/* 今日条：公历 + 农历 + 法定节假日 + 天津河西天气（数据见 /api/day）
   一整行通栏放在首页最上方：一眼看完「今天几号、什么日子、天气怎么样」 */
.day-card{padding:18px 22px;display:flex;align-items:center;gap:22px;flex-wrap:wrap}
.day-cal{display:flex;align-items:baseline;gap:7px;flex:0 0 auto;padding-right:22px;border-right:1px solid var(--line-2)}
.day-num{font-size:38px;font-weight:750;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.day-unit{font-size:13px;color:var(--ink-3);font-weight:600}
.day-info{flex:1 1 240px;min-width:0;display:grid;gap:3px}
.day-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;color:var(--ink-2)}
.day-line b{font-size:14.5px;color:var(--ink);font-weight:700}
.day-sub{font-size:12.5px;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 每日一话：整行占满今日条宽度（不再挤在格子列里），左边一道竖线当引号 */
.day-quote{margin:7px 0 0;padding-left:11px;border-left:2px solid var(--accent);font-size:14px;line-height:1.55;color:var(--ink-2);letter-spacing:.01em;min-width:0;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.day-quote .q-txt{font-weight:600;min-width:0}
/* 来源角标：只标 online / cache，builtin 不标（标出来像报错） */
.day-quote .q-src{flex:none;font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--accent);opacity:.62;border:1px solid currentColor;border-radius:4px;padding:0 4px;line-height:1.4}
@media (max-width:719px){.day-quote{font-size:13.5px;line-height:1.5;gap:6px}}
.chip.day-off{background:var(--bad-soft);color:var(--bad)}
.chip.day-work{background:var(--warn-soft);color:var(--warn)}
.chip.fest{background:#f3ecff;color:var(--accent-2)}
.day-wx{display:flex;align-items:center;gap:12px;flex:0 0 auto;margin-left:auto;padding-left:22px;border-left:1px solid var(--line-2)}
.day-wx.is-empty{border-left-color:transparent;margin-left:auto;color:var(--ink-4);font-size:12.5px}
.wx-ic{width:42px;height:42px;display:grid;place-items:center;color:var(--ink-3);flex:0 0 auto}
.wx-ic svg{width:32px;height:32px}
.wx-ic[data-kind="sun"]{color:#f59e0b}
.wx-ic[data-kind="cloud-sun"]{color:#d99a2b}
.wx-ic[data-kind="rain"],.wx-ic[data-kind="drizzle"]{color:#3b82f6}
.wx-ic[data-kind="thunder"]{color:#7c3aed}
.wx-ic[data-kind="snow"],.wx-ic[data-kind="sleet"]{color:#60a5fa}
.wx-ic[data-kind="fog"]{color:var(--ink-4)}
.wx-ic[data-kind="moon"],.wx-ic[data-kind="cloud-moon"]{color:#818cf8}
.wx-body{display:grid;gap:1px;min-width:0}
.wx-top{display:flex;align-items:baseline;gap:7px}
.wx-top b{font-size:26px;font-weight:750;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.wx-top span{font-size:13px;color:var(--ink-2)}
.wx-meta{display:flex;flex-wrap:wrap;gap:0 4px;font-size:11.5px;color:var(--ink-3)}
.wx-meta .mi{white-space:nowrap}
.wx-meta .mi:not(:last-child)::after{content:"·";margin-left:4px;color:var(--ink-4);opacity:.7}
.wx-time{font-size:11px;color:var(--ink-4);white-space:nowrap}
/* 手机：日期与农历一行，天气另起一行横铺，别把「最高/最低/湿度/风」挤成一列 */
@media (max-width:719px){
  .day-card{padding:14px 16px;gap:12px}
  .day-cal{padding-right:0;border-right:0}
  .day-num{font-size:32px}
  .day-info{flex:1 1 140px}
  .day-sub{white-space:normal}
  .day-wx{flex:1 1 100%;margin-left:0;padding:10px 0 0;border-left:0;border-top:1px dashed var(--line-2)}
  .wx-ic{width:36px;height:36px}
  .wx-ic svg{width:28px;height:28px}
  /* 手机上收掉体感/降水这类次要指标，避免最后一行只剩「73%」 */
  .wx-meta .mi.opt{display:none}
}

/* 数字摘要 */
.stat-row{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:6px}
.stat{background:var(--line-2);border-radius:var(--radius-sm);padding:10px 8px;text-align:center;min-width:0}
.stat b{display:block;font-size:20px;line-height:1.2;letter-spacing:-.02em}
.stat span{display:block;font-size:11.5px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stat.accent b{color:var(--accent)}
.stat.bad b{color:var(--bad)}
.stat.ok b{color:var(--ok)}

/* 条目行（首页与清单共用） */
.items{display:flex;flex-direction:column;gap:2px}
.item{display:flex;align-items:center;gap:10px;min-height:var(--tap);padding:4px 6px;border-radius:9px;min-width:0}
.item:hover{background:var(--line-2)}
.item.sub{padding-left:30px}
.item .tick{width:20px;height:20px;flex:0 0 auto;accent-color:var(--accent);cursor:pointer}
.item-label{flex:1 1 auto;min-width:0;text-align:left;background:none;border:0;padding:0;font-size:14.5px;line-height:1.45;color:var(--ink);cursor:pointer;overflow-wrap:break-word;word-break:normal}
.item-label:hover{text-decoration:underline}
.item-label.done{color:var(--ink-4);text-decoration:line-through}
.item-meta{display:flex;gap:4px;align-items:center;flex:0 1 auto;flex-wrap:nowrap;min-width:0}
.item-meta .chip{white-space:nowrap;flex:0 0 auto}
.chip.agent{background:#f3ecff;color:var(--accent-2)}

/* 事件行 */
.event-row,.server-row,.expiry-row{display:flex;align-items:center;gap:10px;min-height:36px;font-size:13.5px;min-width:0}
.ev-time{font-size:12px;color:var(--ink-3);flex:0 0 46px}
.ev-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.expiry-row .nm,.server-row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 简报 */
.brief-excerpt{margin:8px 0 12px;font-size:14px;color:var(--ink-2);line-height:1.7;max-height:11.9em;overflow:hidden}
.brief-excerpt img{display:none}

/* 快捷入口瓦片 */
.link-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px}
.link-tile{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:80px;padding:10px 6px;border:1px solid var(--line);border-radius:var(--radius-sm);background:#fbfbfd;color:var(--ink-2);text-decoration:none;font-size:12.5px;font-weight:600;text-align:center}
.link-tile:hover{border-color:#d6d8e4;box-shadow:var(--shadow);text-decoration:none}
.link-tile .abbr{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;font-size:12px;font-weight:800;letter-spacing:-.02em}
/* 有站点图标时换成白底（标签页的观感），文字角标让位；抓不到就还是渐变角标 */
.link-tile .abbr.has-icon,.link-body .abbr.has-icon{background:#fff;box-shadow:inset 0 0 0 1px rgba(15,23,42,.1)}
.link-tile .abbr.has-icon .abbr-text,.link-body .abbr.has-icon .abbr-text{display:none}
.abbr-icon{display:block;width:100%;height:100%;padding:4px;box-sizing:border-box;object-fit:contain;border-radius:inherit}
.abbr-icon.is-broken{display:none}
.link-tile .nm{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dot-status{width:8px;height:8px;border-radius:50%;background:var(--ink-4);flex:0 0 auto}
.dot-status.ok{background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}
.dot-status.warn{background:var(--warn);box-shadow:0 0 0 3px var(--warn-soft)}
.dot-status.bad{background:var(--bad);box-shadow:0 0 0 3px var(--bad-soft)}
.dot-status.unknown{background:var(--ink-4)}
.link-tile .dot-status{position:absolute;top:8px;right:8px}

/* 快捷入口 / 服务器：卡片网格。首页那块是 96px 的小瓦片，这里要带域名与探测时间，单卡更大 */
.link-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px}
@media (min-width:720px){.link-cards{gap:var(--gap)}}
.link-card{position:relative;display:flex;flex-direction:column;justify-content:space-between;gap:14px;padding:16px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow);min-width:0}
.link-card.is-picked{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.link-body{display:flex;align-items:center;gap:11px;min-width:0;padding-left:26px;padding-right:16px}
.link-body .abbr{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),var(--accent-2));color:#fff;font-size:13px;font-weight:800;letter-spacing:-.02em;flex:0 0 auto}
.link-meta{display:flex;flex-direction:column;gap:2px;min-width:0}
.link-meta .nm{font-size:15px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.link-meta .host{font-family:var(--mono);font-size:11.5px;color:var(--ink-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.link-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}
.link-foot .when{font-size:12px;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 操作按钮压在覆盖链接之上（z-index:2），默认半透明，悬停/聚焦时全显 */
.link-ops{display:flex;gap:2px;flex:0 0 auto;position:relative;z-index:2;opacity:.55;transition:opacity .18s var(--mo-ease)}
.link-card:hover .link-ops,.link-card:focus-within .link-ops{opacity:1}
.link-card .dot-status{position:absolute;top:16px;right:16px;z-index:2;pointer-events:none}
/* 勾选框常显在左上角：多选的入口必须一眼看得见，不能藏在悬停里 */
.pick{position:absolute;top:14px;left:14px;z-index:3;display:grid;place-items:center;width:22px;height:22px;border-radius:6px;cursor:pointer}
.pick .tick,.pick-all .tick{width:16px;height:16px;margin:0;accent-color:var(--accent);cursor:pointer}
/* 整卡可点：覆盖式 <a> / <button> 铺满卡片，按钮再压在它上面 */
.link-cover{position:absolute;inset:0;z-index:1;border-radius:inherit;border:0;background:transparent;padding:0;font:inherit;cursor:pointer}
.link-cover:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* 拖动排序把手：压在覆盖链接之上（z-index:4），只在有鼠标的设备上渲染（见 cardPicker） */
.link-card.has-drag .link-foot{padding-right:30px}
.link-drag{position:absolute;right:10px;bottom:10px;z-index:4;display:grid;place-items:center;width:28px;height:28px;border-radius:8px;color:var(--ink-4);background:var(--card);cursor:grab;user-select:none;font-size:15px;line-height:1;letter-spacing:-2px}
.link-drag:hover{color:var(--accent);background:var(--accent-soft)}
.link-drag:active{cursor:grabbing}
.link-drag:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.link-card.is-dragging{opacity:.4}
.link-card.drop-before{box-shadow:inset 3px 0 0 var(--accent)}
.link-card.drop-after{box-shadow:inset -3px 0 0 var(--accent)}
/* 多选工具条：全选 / 计数 / 删除所选 */
.pick-wrap{min-width:0}
.pick-bar{display:flex;align-items:center;gap:12px;margin:0 0 12px;flex-wrap:wrap}
.pick-all{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink-2);cursor:pointer}
/* 计数紧跟全选、删除按钮紧跟计数：三件事读起来是一句话。之前 count 撑开
   margin-right:auto，红色按钮被甩到整行最右，离勾选的卡片有 1000 多像素远。 */
.pick-bar .count{white-space:nowrap}
@media (max-width:719px){
  .link-cards{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px}
  .link-card{padding:13px;gap:12px}
  .link-body{padding-left:24px;padding-right:12px}
  .link-body .abbr{width:34px;height:34px;border-radius:10px;font-size:12px}
  .pick{top:12px;left:12px}
  .link-card .dot-status{top:13px;right:13px}
  .link-ops{opacity:1}
}

/* ---------- 服务器健康：卡片比入口卡大一号，状态与内存直接读 ----------
   入口卡回答「去哪」，服务器卡回答「还活着吗、内存还剩多少」，
   后者要在一屏里扫完，所以字号与色块都比入口卡重。 */
.srv-cards{grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:var(--gap)}
.srv-card{padding:20px;gap:18px;min-height:200px;border-top-width:4px;border-top-color:var(--ink-4)}
.srv-card[data-status="ok"]{border-top-color:var(--ok)}
.srv-card[data-status="warn"]{border-top-color:var(--warn)}
.srv-card[data-status="bad"]{border-top-color:var(--bad)}
.srv-card .pick{top:16px;left:16px}
/* 数据陈旧：一条琥珀提示压在指标上面，同时把指标轻微压暗 —— 数字还是那些数字，
   但「这是上一次上报的，不一定代表现在」必须第一眼看得出来 */
.srv-stale{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 8px;margin:-4px 0 0;padding:8px 11px;border-radius:10px;background:var(--warn-soft);color:var(--ink-2);font-size:12.5px;line-height:1.5}
.srv-stale b{color:var(--warn);font-weight:700}
.srv-card.is-stale .srv-metrics{opacity:.78}
.srv-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding-left:26px;min-width:0}
.srv-id{display:flex;flex-direction:column;gap:6px;min-width:0}
.srv-name{font-size:19px;font-weight:700;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.srv-role{align-self:flex-start;max-width:100%;padding:2px 8px;border-radius:6px;background:var(--line-2);color:var(--ink-3);font-family:var(--mono);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.srv-state{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;padding:5px 11px;border-radius:999px;background:var(--line-2);color:var(--ink-2);font-size:13px;font-weight:700}
.srv-state.ok{background:var(--ok-soft);color:var(--ok)}
.srv-state.warn{background:var(--warn-soft);color:var(--warn)}
.srv-state.bad{background:var(--bad-soft);color:var(--bad)}
.srv-card .srv-state .dot-status{position:static;box-shadow:none;width:9px;height:9px}
.srv-metrics{display:flex;flex-direction:column;gap:14px;min-width:0}
.srv-metric{display:flex;flex-direction:column;gap:8px;min-width:0}
.srv-metric-head{display:flex;align-items:baseline;gap:8px;min-width:0}
.srv-metric-head .lbl{font-size:12px;color:var(--ink-3)}
.srv-metric-head .pct{font-size:24px;font-weight:750;line-height:1;letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--ink)}
.srv-metric-head .pct.warn{color:var(--warn)}
.srv-metric-head .pct.bad{color:var(--bad)}
.srv-metric-head .num{margin-left:auto;font-family:var(--mono);font-size:12.5px;color:var(--ink-3);font-variant-numeric:tabular-nums;white-space:nowrap}
.srv-metric.is-empty{flex-direction:row;align-items:center;justify-content:space-between;gap:8px;min-height:32px;padding:0 12px;border:1px dashed var(--line);border-radius:var(--radius-sm);background:var(--bg)}
.srv-metric.is-empty .lbl{font-size:12.5px}
.srv-none{font-size:12.5px;color:var(--ink-4)}
.srv-bar{height:8px;border-radius:999px;background:var(--line-2);overflow:hidden}
.srv-bar i{display:block;height:100%;border-radius:inherit;background:var(--ok);transition:width .4s var(--mo-ease-out)}
.srv-bar.disk i{background:var(--disk)}
.srv-bar.warn i{background:var(--warn)}
.srv-bar.bad i{background:var(--bad)}
.srv-metric-foot{font-size:12px;color:var(--ink-4)}
/* CPU 单独一套蓝色：与内存的绿/黄/红区分，「这是另一个指标」一眼能看出来；
   磁盘用青绿，同样只在「没吃满」时保留自己的颜色，warn/bad 仍然压过它。
   CPU 现在也会在 >85% / >95% 变色，所以这里必须排除警告态，否则蓝会盖掉琥珀和红 */
.srv-metric.cpu .pct:not(.warn):not(.bad){color:var(--cpu)}
.srv-bar.cpu:not(.warn):not(.bad) i{background:var(--cpu)}
.srv-metric.disk .pct:not(.warn):not(.bad){color:var(--disk)}
.srv-foot{display:flex;align-items:center;gap:10px;min-width:0;padding-top:12px;border-top:1px solid var(--line-2)}
.srv-foot .when{flex:0 0 auto;font-size:12px;color:var(--ink-4)}
.srv-note{flex:1 1 auto;min-width:0;font-size:12px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 进程内存：默认收成一行，点开才铺开 —— 四张卡都常开会被列表撑高，扫不动 */
.srv-procs{display:flex;flex-direction:column;gap:8px;min-width:0}
.srv-procs.is-empty{flex-direction:row;align-items:center;justify-content:space-between;gap:8px;min-height:32px;padding:0 12px;border:1px dashed var(--line);border-radius:var(--radius-sm);background:var(--bg)}
.srv-procs.is-empty .lbl{font-size:12.5px}
.srv-procs-toggle{position:relative;z-index:2;display:flex;align-items:center;gap:8px;min-height:32px;padding:0 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);color:var(--ink-2);font:inherit;font-size:12.5px;cursor:pointer}
.srv-procs-toggle:hover{border-color:var(--ink-4)}
.srv-procs-toggle .lbl{font-weight:600}
.srv-procs-toggle .hint{font-family:var(--mono);font-size:11.5px;color:var(--ink-4)}
.srv-procs-toggle .chev{margin-left:auto;color:var(--ink-4);transition:transform .2s var(--mo-ease-out)}
.srv-procs-toggle[aria-expanded="true"] .chev{transform:rotate(180deg)}
.srv-procs-list{display:flex;flex-direction:column;gap:7px;padding:10px 12px;border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--bg)}
.srv-proc{display:grid;grid-template-columns:minmax(0,1fr) 84px auto;align-items:center;gap:10px}
.srv-proc .nm{min-width:0;font-family:var(--mono);font-size:12px;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.srv-proc .mb{font-family:var(--mono);font-size:11.5px;color:var(--ink-3);text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.srv-proc-bar{height:6px;border-radius:999px;background:var(--line);overflow:hidden}
.srv-proc-bar i{display:block;height:100%;border-radius:inherit;background:var(--cpu);transition:width .4s var(--mo-ease-out)}
@media (max-width:719px){
  .srv-cards{grid-template-columns:1fr;gap:12px}
  .srv-proc{grid-template-columns:minmax(0,1fr) 56px auto;gap:8px}
  .srv-card{padding:16px;gap:15px;min-height:0}
  .srv-card .pick{top:13px;left:13px}
  .srv-head{padding-left:24px}
  .srv-name{font-size:17px}
  .srv-metric-head .pct{font-size:22px}
  .srv-metric-head .num{font-size:11.5px}
  .srv-metrics{gap:12px}
  /* 360px 下「上次上报 / 备注 / 曲线」挤不进一行：备注整行落到最后，
     别把「曲线」压成竖排两个字 */
  .srv-foot{flex-wrap:wrap;row-gap:8px}
  .srv-note{flex:1 1 100%;order:3;white-space:normal;overflow:visible}
}

/* 历史曲线（B2 / B3）：自绘 SVG，颜色全取主题变量，暗色主题不用另写一套 */
.srv-hist-btn{position:relative;z-index:2;margin-left:auto;flex:0 0 auto;white-space:nowrap}
.hist{display:flex;flex-direction:column;gap:12px;min-width:0}
.hist-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.hist-note{margin:0}
.hist-body{min-width:0}
.hist-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-bottom:10px}
.hist-stat{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--bg)}
.hist-stat .lbl{font-size:11.5px;color:var(--ink-4)}
.hist-stat .val{font-size:15px;font-variant-numeric:tabular-nums}
.hist-chart{display:block;width:100%;height:auto}
.hist-grid{stroke:var(--line);stroke-width:1}
.hist-vgrid{stroke:var(--line-2);stroke-width:1}
.hist-y,.hist-x{fill:var(--ink-4);font-size:9px;font-family:var(--mono)}
.hist-line{fill:none;stroke-width:2;stroke-linejoin:round;stroke-linecap:round}
.hist-dot{stroke:var(--card);stroke-width:1}
.hist-legend{display:flex;flex-wrap:wrap;gap:4px 14px;margin:2px 0 0;font-size:11.5px;color:var(--ink-3)}
.hist-legend span{display:inline-flex;align-items:center;gap:5px}
.hist-legend i{display:inline-block;width:8px;height:8px;border-radius:2px}
.hist-strip-wrap{display:flex;flex-direction:column;gap:3px;margin-top:10px}
.hist-strip-label{font-size:11.5px;color:var(--ink-4)}
.hist-strip{display:block;width:100%;height:10px}
.hist-st-ok{fill:var(--ok)}
.hist-st-warn{fill:var(--warn)}
.hist-st-bad{fill:var(--bad)}
.hist-st-off{fill:var(--ink-4)}
.hist-st-unknown{fill:var(--line)}
@media (max-width:719px){
  .hist-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* 迷你日历 */
.mini-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-size:14.5px}
/* minmax(0,1fr)：默认的 1fr 下限是 auto，格子里「国庆节」这类三字标签
   会把列撑宽，七列一起溢出卡片（手机上最后一列直接被裁掉） */
.mini-week,.mini-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:3px}
.mini-week span{text-align:center;font-size:12px;color:var(--ink-4);font-weight:600}
.mini-grid .pad{aspect-ratio:1}
/* 公历 14px + 农历 10.5px：这是"扫一眼读得清"的下限。
   桌面端两列等宽后单格约 70px，手机上约 44px，两行都放得下。 */
/* min-width:0 同上：aspect-ratio + min-height 会把最小宽度传递成 50px */
.mini-day{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;aspect-ratio:1;min-height:50px;min-width:0;border-radius:10px;color:var(--ink-2);position:relative;line-height:1.05}
.mini-day:hover{background:var(--line-2);text-decoration:none}
.mini-day .n{font-size:18px;font-weight:650;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.mini-day .lunar{font-style:normal;font-size:12px;line-height:1.15;color:var(--ink-4);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mini-day.is-weekend .n{color:var(--bad)}
.mini-day.is-off .n,.mini-day.is-off .lunar{color:var(--bad)}
.mini-day.is-off .lunar{font-weight:650}
.mini-day.is-work .lunar{color:var(--warn);font-weight:700}
.mini-day.is-fest .lunar{color:var(--accent)}
.mini-day.has::after{content:"";position:absolute;top:4px;right:4px;width:5px;height:5px;border-radius:50%;background:var(--accent)}
.mini-day.today{background:var(--accent);color:#fff;font-weight:700}
.mini-day.today .n,.mini-day.today .lunar{color:#fff}
.mini-day.today.has::after{background:#fff}

/* 清单 + 时间轴 */
.sched{grid-template-columns:1fr}
/* 清单是主体，版本时间轴只是右栏参考：给它一个固定窄列（260–360），剩下全给清单。
   之前 1.35fr : 1fr 让历史面板吃到 42% 的宽度，清单反而被挤窄 —— 主次是反的。 */
@media (min-width:720px){.sched{grid-template-columns:minmax(0,1fr) minmax(260px,300px)}}
@media (min-width:1080px){.sched{grid-template-columns:minmax(0,1fr) minmax(300px,360px);align-items:start}}
.section-card{margin-bottom:var(--gap)}
.timeline-card{position:static}
@media (min-width:1080px){.timeline-card{position:sticky;top:calc(var(--topbar-h) + 16px);max-height:calc(100vh - var(--topbar-h) - 32px);display:flex;flex-direction:column}
  .timeline-card .timeline{overflow-y:auto}}
.timeline{display:flex;flex-direction:column;gap:2px}
.rev{border-bottom:1px solid var(--line-2)}
.rev-head{display:flex;align-items:center;gap:8px;width:100%;min-height:var(--tap);padding:6px 4px;background:none;border:0;cursor:pointer;text-align:left;font-size:13.5px;min-width:0}
.rev-head:hover{background:var(--line-2);border-radius:8px}
.rev-no{font-size:12px;color:var(--ink-4);flex:0 0 auto}
.rev-msg{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-2)}
.rev-time{flex:0 0 auto}
.rev-body{padding:0 4px 10px}
.rev-actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.md-pre{margin:0;max-height:240px;overflow:auto;background:#fbfbfd;border:1px solid var(--line);border-radius:var(--radius-sm);padding:10px;font-family:var(--mono);font-size:12px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere}
.diff{margin-top:8px;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:auto;max-height:260px;font-family:var(--mono);font-size:12px;line-height:1.55}
.diff-line{display:flex;gap:6px;padding:1px 8px;white-space:pre-wrap;overflow-wrap:anywhere}
.diff-line .sign{flex:0 0 10px;color:var(--ink-4)}
.diff-line.add{background:var(--ok-soft);color:#0b5d36}
.diff-line.del{background:var(--bad-soft);color:#8c1d1d}
.diff-line.keep{color:var(--ink-3)}

/* 陈旧折叠区 */
.stale-box{margin-top:10px;display:flex;flex-direction:column;gap:2px}
.stale-box[hidden]{display:none}

/* 日历：月视图 + 周视图（跨天事件画成横跨的长条） */
:root{--bar-h:18px}
.cal-head{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.cal-head .spacer{flex:1}
/* 年月标题做成按钮：点开年月面板，不用连点 12 次箭头 */
.cal-title-btn{padding:0;border:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;border-radius:8px}
.cal-title-btn:hover b{color:var(--accent)}
.cal-title-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.cal-datebtn{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--ink)}
.cal-datebtn .caret{font-size:10px;color:var(--ink-4)}

/* 年月选择层：自绘 DOM，登录页没有 ui.js 也能用 */
.hub-mp-layer{position:fixed;inset:0;z-index:1200;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(15,18,34,.38)}
.hub-mp{width:min(360px,100%);background:var(--card);border:1px solid var(--line);border-radius:16px;box-shadow:0 24px 60px -24px rgba(16,18,34,.45);padding:16px}
.hub-mp-head{display:flex;align-items:center;gap:6px;margin-bottom:12px}
.hub-mp-year{flex:1;text-align:center;font-size:16px;font-weight:750;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.hub-mp-nav{width:32px;height:32px;display:grid;place-items:center;border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--ink-2);font-size:16px;line-height:1;cursor:pointer}
.hub-mp-nav:hover{border-color:var(--accent);color:var(--accent)}
.hub-mp-close{height:32px;padding:0 10px;border:0;border-radius:9px;background:transparent;color:var(--ink-3);font:inherit;font-size:12.5px;cursor:pointer}
.hub-mp-close:hover{background:var(--line-2);color:var(--ink)}
.hub-mp-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.hub-mp-month{height:42px;border:1px solid transparent;border-radius:10px;background:var(--line-2);color:var(--ink-2);font:inherit;font-size:13px;font-weight:600;cursor:pointer}
.hub-mp-month:hover{border-color:var(--accent);color:var(--accent)}
.hub-mp-month.is-on{background:var(--accent);color:#fff;font-weight:750}
.hub-mp-month:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.cal-week,.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.cal-week span{text-align:center;font-size:11.5px;color:var(--ink-4);font-weight:600;padding-bottom:4px}

/* 视图切换（月/周）：分段控件，别用两个独立按钮 —— 那样看不出「当前是哪个」 */
.seg{display:inline-flex;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden;background:#fff}
.seg-btn{min-height:32px;padding:0 12px;border:0;background:transparent;color:var(--ink-3);font-size:12.5px;font-weight:650;cursor:pointer}
.seg-btn.on{background:var(--accent);color:#fff}
/* ================= 设置页 ================= */
/* 分组而不是七张卡一路排下去：每组一个标题、组内按内容并排，
   长页面有了段落感，桌面上也不用把表单拉成一整行宽。 */
.settings{display:grid;gap:30px;grid-template-columns:1fr;align-items:start;min-width:0;max-width:1180px;padding-bottom:12px}
.settings-group{display:grid;gap:12px;min-width:0}
.settings-ghead{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:0 2px 0 11px;border-left:3px solid var(--accent)}
.settings-ghead h2{margin:0;font-size:13.5px;font-weight:700;letter-spacing:.02em;color:var(--ink-2)}
.settings-ghead p{margin:0;font-size:12px;color:var(--ink-4);line-height:1.5}
.settings-cards{display:grid;gap:var(--gap);grid-template-columns:1fr;align-items:start;min-width:0}
@media (min-width:900px){
  .settings-cards.two{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* 键值行：标签弱、值强 —— 两段同粗读起来像列表标题，不像信息 */
.kv{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:11px 0;border-bottom:1px solid var(--line-2);min-width:0}
.kv:first-child{padding-top:2px}
.kv:last-child{padding-bottom:2px;border-bottom:0}
.kv .k{color:var(--ink-3);font-size:13px;flex:0 0 auto}
.kv .v{color:var(--ink);font-size:13.5px;font-weight:600;text-align:right;min-width:0;overflow-wrap:anywhere}

/* 令牌行：名字/状态一行，scope 与签发日期一行 —— 五行挤一行在窄屏会变成竖排 */
.tok{display:flex;flex-direction:column;gap:5px;padding:13px 0;border-bottom:1px solid var(--line-2);min-width:0}
.tok:first-child{padding-top:2px}
.tok:last-child{padding-bottom:2px;border-bottom:0}
.tok-top{display:flex;align-items:center;gap:10px;min-width:0}
.tok-name{flex:1;min-width:0;font-size:14px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tok-act{display:flex;align-items:center;gap:4px;flex:0 0 auto}
.tok-sub{font-size:12px;color:var(--ink-3);line-height:1.6;overflow-wrap:anywhere}
.tok-sub .mono{font-size:11.5px}

/* 卡片里的说明：与内容隔一条细线，正文和注解不糊在一起 */
.card .note{margin:16px 0 0;padding-top:12px;border-top:1px solid var(--line-2);color:var(--ink-3);font-size:12.5px;line-height:1.65}

/* 卡底操作区 */
.settings-actions{display:flex;justify-content:flex-end;align-items:center;gap:8px;flex-wrap:wrap;margin-top:18px;padding-top:15px;border-top:1px solid var(--line-2)}
.settings-actions .spacer{flex:1}

/* 外观：分段控件加高一点，别像贴在标题下面 */
.settings-seg{margin:2px 0 12px}
.settings-seg .seg-btn{min-height:36px;padding:0 16px}
.settings-state{margin:0;color:var(--ink-2)}

/* 每日一话来源：下拉 + 自定义段 + 试抓结果。自定义段整块收起，不留半行空 label */
.set-custom{margin:10px 0 0}
.set-custom[hidden]{display:none}
.set-custom .input,.settings-select{max-width:none}
.set-lbl{display:block;margin:14px 0 6px;font-size:12.5px;font-weight:650;color:var(--ink-2)}
.set-lbl:first-child{margin-top:0}

/* AI 配置：地址占一整行，模型与 Key 并排；窄屏自动回到单列 */
.set-grid{display:grid;grid-template-columns:1fr;gap:14px 16px}
.set-form.set-grid{margin-top:14px}
.set-grid .set-field{min-width:0}
.set-grid .set-lbl{margin-top:0}
.set-grid .note-inline{margin-top:6px}
@media (min-width:760px){
  .set-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .set-grid .set-field.wide{grid-column:1/-1}
}
.set-form .input{min-height:42px}
.set-custom .note{margin-top:10px;padding-top:0;border-top:0}
.set-preview{margin-top:12px}
.set-preview:empty{display:none}
.set-say{margin:0;font-size:12.5px;line-height:1.65;color:var(--ink-2)}
.set-say.ok{color:var(--ok)}
.set-say.bad{color:var(--bad)}
.set-say.pending{color:var(--ink-3)}
/* 抓到的那句话：左边竖线当引号，与首页今日条同一个语气 */
.set-quote{margin:8px 0 0;padding:8px 0 8px 12px;border-left:2px solid var(--accent);
  color:var(--ink);font-size:13.5px;line-height:1.7}

/* 空状态的文案与按钮之间留气口 */
.empty p{margin:0 0 10px}
.empty p:last-child{margin-bottom:0}

@media (max-width:719px){
  /* 手机上标签与值分成两行：一行塞「连续多次错口令会临时锁定该 IP」会挤成一列竖排 */
  .kv{flex-wrap:wrap;gap:2px 12px}
  .kv .v{text-align:left}
}

/* 日历整块放进卡片里，和下面的待办分成两块，不再是一排贴边的格子 */
.cal-shell{padding:16px 18px 12px}
.cal-shell .cal-head{margin-bottom:10px}

/* 三个显示开关：默认全选，关掉就少一行信息 */
.cal-opts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 12px}
.cal-opts-label{font-size:12px;color:var(--ink-4);font-weight:600;margin-right:2px}
.cal-opt{min-height:28px;padding:0 11px;border:1px solid var(--line);border-radius:999px;background:var(--bg);color:var(--ink-3);font-size:12px;font-weight:600;cursor:pointer;transition:background-color .18s var(--mo-ease),border-color .18s var(--mo-ease),color .18s var(--mo-ease)}
.cal-opt:hover{border-color:var(--accent);color:var(--accent)}
.cal-opt.on{background:var(--accent-soft);border-color:#c7c9ff;color:var(--accent)}
.cal-opt.on::before{content:"✓";margin-right:4px;font-size:11px}

.cal-cell{position:relative;min-height:112px;border:1px solid var(--line-2);border-radius:10px;padding:6px;background:#fff;display:flex;flex-direction:column;gap:2px;min-width:0;cursor:pointer;overflow:visible}
.cal-cell.dim{background:#fcfcfe;color:var(--ink-4)}
.cal-cell.dim .cal-num,.cal-cell.dim .cal-lunar,.cal-cell.dim .cal-term{color:var(--ink-4)}
.cal-cell:hover{background:#fbfbfd}
.cal-cell.today{border-color:#c7c9ff;background:var(--accent-soft)}
/* 选中和「今天」必须一眼分得开：今天只是淡底，选中是实心描边 */
.cal-cell.selected{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent) inset}
.cal-cell.weekend .cal-num{color:var(--bad)}
.cal-cell.today .cal-num{color:var(--accent)}
.cal-cell.drop{outline:2px dashed var(--accent);outline-offset:-2px}
.cal-top{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;line-height:1.15}
.cal-num{font-size:14.5px;color:var(--ink-2);font-weight:700;font-variant-numeric:tabular-nums}
.cal-holiday{font-size:10.5px;line-height:1.2;color:var(--bad);font-weight:650;max-width:72%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cal-work{flex:0 0 auto;font-size:10px;line-height:1.35;padding:0 4px;border-radius:4px;background:var(--warn-soft);color:var(--warn);font-weight:700}
.cal-labels{display:flex;align-items:center;gap:5px;min-height:14px;min-width:0}
.cal-lunar{font-size:11px;line-height:1.2;color:var(--ink-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cal-term{flex:0 0 auto;font-size:9.5px;line-height:1.35;padding:0 4px;border-radius:4px;background:var(--ok-soft);color:var(--ok);font-weight:650}

/* 条带容器：固定行高，跨天条在每一天都占同一行，才能视觉上连成一条 */
.cal-caps{display:flex;flex-direction:column;gap:3px;min-width:0}
.cal-bar{display:flex;align-items:center;gap:4px;height:var(--bar-h);font-size:11.5px;line-height:1;padding:0 5px;background:var(--accent-soft);color:var(--accent);overflow:hidden;cursor:grab;min-width:0;border-radius:5px}
.cal-bar .t{font-family:var(--mono);font-size:10px;opacity:.85;flex:0 0 auto}
.cal-bar .n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.cal-bar .cont{opacity:.45;font-size:10px}
.cal-bar.head{border-top-left-radius:6px;border-bottom-left-radius:6px}
.cal-bar.tail{border-top-right-radius:6px;border-bottom-right-radius:6px}
/* 跨天条：头尾都要「切平」，中间保持连续 —— 圆角只在真正的开始/结束那一端 */
.cal-bar:not(.head){border-top-left-radius:0;border-bottom-left-radius:0}
.cal-bar:not(.tail){border-top-right-radius:0;border-bottom-right-radius:0}
.cal-bar.cont-tail{background:var(--accent-soft);opacity:.72}
/* 跨天条在月视图里横向贯通：相邻格同色 + 相邻端无圆角 + 负 margin 吃掉格间距。
   .cal-cell 必须 overflow:visible，否则伸出去的部分会被裁掉，又变回一格一个碎块。 */
.cal-cell .cal-bar.bleed-left{margin-left:-5px;padding-left:5px}
.cal-cell .cal-bar.bleed-right{margin-right:-5px}
.cal-cell .cal-bar.carry{opacity:.95}
.cal-cell .cal-bar .cont{opacity:.5;font-size:10px;margin-left:auto}
.cal-cell .cal-bar .n+.cont{margin-left:2px}
.cal-empty{flex:1;min-height:16px}
.cal-bar.single{background:var(--accent-soft)}
.cal-bar.holiday,.cal-bar.holiday.cont-tail{background:var(--bad-soft);color:var(--bad)}
.cal-bar.deadline,.cal-bar.deadline.cont-tail{background:var(--warn-soft);color:var(--warn)}
.cal-bar.routine,.cal-bar.routine.cont-tail{background:var(--ok-soft);color:var(--ok)}
.cal-bar.assigned,.cal-bar.assigned.cont-tail{background:#f3ecff;color:var(--accent-2)}
.cal-more{border:0;background:transparent;color:var(--ink-3);font-size:11px;font-weight:650;text-align:left;padding:0 4px;cursor:pointer;min-height:0}
.cal-more:hover{color:var(--accent)}
.cal-hint{margin-top:12px}

/* 日历与当日待办之间：按钮靠右，和下面待办卡片的右边界对齐 */
.cal-addbar{display:flex;justify-content:flex-end;margin:10px 0}
.cal-add-btn{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 14px;border-radius:999px;border:1px solid #c7c9ff;background:var(--accent-soft);color:var(--accent);font-size:13px;font-weight:650;line-height:1;white-space:nowrap;cursor:pointer;transition:background-color .18s var(--mo-ease),color .18s var(--mo-ease),transform .18s var(--mo-ease-out),box-shadow .2s var(--mo-ease)}
.cal-add-btn .ic{font-size:17px;font-weight:400;line-height:1;margin-top:-1px}
.cal-add-btn:hover{background:var(--accent);color:#fff;transform:translateY(-1px);box-shadow:0 8px 18px -10px rgba(79,70,229,.85)}
.cal-add-btn:active{transform:none}

/* 选中日期下面的待办 */
.cal-dayagenda{padding:16px 18px}
.cal-agenda-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:8px;flex-wrap:wrap}
.cal-agenda-title{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.cal-agenda-title h3{margin:0;font-size:16px;font-weight:700}
.cal-term-chip{background:var(--ok-soft);color:var(--ok)}
.cal-agenda-empty{margin:10px 0 4px;color:var(--ink-4);font-size:13px}
/* 当天日程清单：只是「记录」，没有勾选框 —— 要完成的事在「日程清单」里 */
.cal-ev-list{display:flex;flex-direction:column}
.cal-ev{display:flex;align-items:center;gap:10px;min-height:42px;border-bottom:1px solid var(--line-2);font-size:13.5px;min-width:0}
.cal-ev:last-child{border-bottom:0}
.cal-ev .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;color:var(--ink)}
.cal-ev .chip{flex:0 0 auto}
.cal-ev-time{flex:0 0 auto;min-width:42px;font-family:var(--mono);font-size:12px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.cal-ev-kind{flex:0 0 auto;font-size:11.5px;color:var(--ink-4);font-weight:650}
.cal-ev.is-series .cal-ev-kind{color:var(--accent)}
.cal-bar .rc{flex:0 0 auto;font-size:10px;opacity:.8;margin-left:auto}

/* 接下来的提醒：未来两周到点会响的事，兼作「系统通知」的开关 */
.cal-rem{margin-top:16px;padding:16px 18px}
.cal-rem-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.cal-rem-head h3{margin:0;font-size:16px;font-weight:700}
.cal-rem-notify{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px}
.cal-rem-list{display:flex;flex-direction:column}
.cal-rem-row{display:flex;align-items:baseline;gap:10px;min-height:36px;border-bottom:1px solid var(--line-2);font-size:13.5px;min-width:0}
.cal-rem-row:last-child{border-bottom:0}
.cal-rem-row .nm{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;color:var(--ink)}
.cal-rem-time{flex:0 0 auto;min-width:92px;font-family:var(--mono);font-size:12px;color:var(--accent);font-weight:600;font-variant-numeric:tabular-nums}
.cal-rem-sub{margin-left:auto;flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 周视图：7 列网格 + 绝对定位覆盖层画长条 */
.cal-weekbar{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:6px}
.cal-weekbar-cell{display:flex;flex-direction:column;align-items:center;gap:1px;padding:5px 4px;border-radius:var(--radius-sm);background:#fbfbfd;border:1px solid var(--line-2);min-width:0;cursor:pointer}
.cal-wb-top{display:flex;align-items:baseline;justify-content:center;gap:5px;min-width:0;max-width:100%}
.cal-weekbar-cell .wd{font-size:11.5px;color:var(--ink-4);font-weight:650}
.cal-weekbar-cell .dd{font-size:15px;font-weight:750;color:var(--ink-2)}
/* 周视图表头也带上农历/节日/节气，和月视图口径一致（开关同样生效） */
.cal-wb-meta{display:flex;align-items:center;justify-content:center;gap:4px;min-height:13px;max-width:100%;font-size:10.5px;line-height:1.2;color:var(--ink-4);overflow:hidden}
.cal-wb-meta .cal-lunar{font-size:10.5px}
.cal-wb-meta .cal-term{font-size:9px}
.cal-wb-meta .cal-holiday{font-size:10px;max-width:100%}
.cal-weekbar-cell.today{background:var(--accent-soft);border-color:#c7c9ff}
.cal-weekbar-cell.today .dd{color:var(--accent)}
.cal-weekbar-cell.selected{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent) inset}
.cal-wkcell.selected{box-shadow:0 0 0 2px var(--accent) inset}
.cal-weekview{position:relative;display:flex;flex-direction:column;gap:4px}
/* 周视图的长条画在网格「里面」：覆盖层与网格同起点、同列宽，行与行用 top 偏移对齐 */
.cal-weeklabel{display:none}
/* 行距 3px 要显式写成 row-gap：grid-auto-rows 只定行高，间隔得另说（漏了行会叠在一起） */
.cal-weekgrid{display:grid;grid-template-columns:repeat(7,1fr);grid-auto-rows:calc((var(--bar-h) + 3px) * var(--wk-rows,3));row-gap:3px;column-gap:3px;background:transparent}
/* 数据行高由 JS 按条数设成「行数 × 19px」：格子足够高，条在格子内部换行，不会被裁掉 */
.cal-weekgrid > .cal-wkcell{grid-row:1 / -1}
.cal-wkcell{min-height:calc(var(--bar-h) + 3px);border-radius:4px;background:#fbfbfd;border:1px solid var(--line-2);cursor:pointer;min-width:0;position:relative;overflow:visible}
/* 长条画在格子里，格子本身做底色：任意一格都能接拖放 */
.cal-wkcell.today{background:var(--accent-soft);border-color:#dfe2ff}
.cal-wkcell.drop{outline:2px dashed var(--accent);outline-offset:-2px}
.cal-wkcell .cal-bar{position:absolute;left:0;top:0;height:var(--bar-h);z-index:1;cursor:grab}
/* 行与行之间的 3px 间距在格子外侧，跨行时条要盖住它：靠负 top + 自身多 1px 高来补 */
.cal-agenda{margin-top:16px}
.agenda-list{display:flex;flex-direction:column;gap:2px}
.agenda-row{display:flex;align-items:center;gap:10px;min-height:36px;border-bottom:1px solid var(--line-2);font-size:13.5px;min-width:0}
.agenda-row:last-child{border-bottom:0}
.agenda-row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 运维列表 */
.op-list{display:flex;flex-direction:column}
.op-row{display:flex;align-items:center;gap:10px;min-height:var(--tap);border-bottom:1px solid var(--line-2);font-size:13.5px;min-width:0}
.op-row:last-child{border-bottom:0}
.op-row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;color:inherit}
.op-row .val{min-width:0;text-align:right;word-break:break-word}
.op-row .abbr{width:26px;height:26px;border-radius:8px;display:grid;place-items:center;background:var(--accent-soft);color:var(--accent);font-size:10.5px;font-weight:800;flex:0 0 auto}

/* 手机端：日历不拖拽，格子紧凑 */
@media (max-width:719px){
  /* 条目行在手机上：文案不许被 meta 挤成竖排。meta 退到第二行，行工具保持小图标 */
  .item{flex-wrap:wrap;row-gap:0;padding:6px 4px;align-items:center}
  .item .tick{order:0}
  .item-label{order:1;flex:1 1 0}
  .item .row-tools{order:2}
  .item-meta{order:3;flex:1 1 100%;margin:0 0 2px 30px}
  .item .row-tools .btn-icon.sm{width:32px;min-width:32px;min-height:32px}
  .stat-row{grid-template-columns:repeat(2,1fr)}
  /* 页头：标题左、工具右。工具**永远不许收缩** —— 一收缩文字就被按钮压住
     （390px 实测重叠 20px，360px 重叠 30px）。一行放得下就并排，放不下就
     让工具整排落到第二行靠右，而不是互相挤。 */
  .page-head{flex-wrap:wrap;align-items:center;margin-bottom:14px;row-gap:8px}
  .page-head > div:first-child{min-width:0;flex:1 1 auto}
  .page-head h1{white-space:nowrap}
  /* 手机上页头描述最多两行：一行省略号会把「10 月 24 日 周六」「月视图 / 周视图」砍成「10 月 24…」 */
  .page-head .desc{overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .page-tools{width:auto;flex:0 0 auto;flex-wrap:wrap;min-width:0;justify-content:flex-end;margin-left:auto}
  .cal-shell{padding:12px 10px 8px}
  .cal-cell{min-height:88px;padding:5px;border-radius:8px}
  :root{--bar-h:16px}
  .cal-bar .t{display:none}
  .cal-bar{font-size:10.5px;padding:0 3px}
  /* 手机上一格只有 40 多像素，单行省略号会把「上海出差」砍成「上…」，
     允许事件名折两行，常见四字标题能完整读到 */
  .cal-cell .cal-bar{height:auto;min-height:16px;align-items:flex-start;padding:1px 3px;line-height:1.2}
  .cal-cell .cal-bar .n{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .cal-hint{display:none}
  /* 标题、翻页、月/周、今天 一行放不下时，让后两个整体落到第二行靠右，
     而不是把「今天」单独甩到最左边 */
  .cal-head{gap:6px;flex-wrap:wrap;row-gap:8px}
  .cal-head .spacer{display:none}
  .cal-head .seg{margin-left:auto}
  .cal-head .btn-icon{width:34px;min-width:34px;min-height:34px}
  .cal-head .btn-sm{min-height:32px}
  .cal-num{font-size:13px}
  .cal-holiday{font-size:10px;max-width:66%}
  .cal-lunar{font-size:10px}
  .cal-term{font-size:10px;padding:0 3px}
  /* 一格放不下「农历 + 节气」时让节气换行，别把农历挤成一个省略号 */
  .cal-labels{flex-wrap:wrap;gap:1px 4px}
  /* 手机月历一格只放彩点：类型靠颜色区分，详情在下方当天清单里 */
  .cal-dots{display:flex;flex-wrap:wrap;align-items:center;gap:3px;margin-top:auto;padding:3px 1px 1px;min-height:8px}
  .cal-dot{width:6px;height:6px;border-radius:50%;background:var(--accent);flex:0 0 auto}
  .cal-dot.holiday{background:var(--bad)}
  .cal-dot.deadline{background:var(--warn)}
  .cal-dot.routine{background:var(--ok)}
  .cal-dot.assigned{background:var(--accent-2)}
  .cal-dot.carry{opacity:.5}
  .cal-dot-more{font-size:9.5px;line-height:1;color:var(--ink-4);font-weight:700}
  /* 当天清单：时间/类型一行，标题整行折行显示完整内容，格式操作落到下一行 */
  .cal-ev{flex-wrap:wrap;row-gap:2px;padding:7px 0}
  .cal-ev .cal-ev-time,.cal-ev .cal-ev-kind{order:1}
  .cal-ev .nm{order:2;flex:1 1 100%;white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;line-height:1.45}
  .cal-ev .chip,.cal-ev .btn{order:3}
  .cal-opts{gap:5px;margin-bottom:10px}
  .cal-opt{min-height:26px;padding:0 9px;font-size:11.5px}
  .cal-addbar{margin:12px 0}
  .cal-dayagenda{padding:14px}
  .cal-agenda-title h3{font-size:15px}
  .cal-weekbar-cell .wd{display:none}

  .input{max-width:none}
}

/* 360/390 这类窄屏：标题列独占第一行，工具整排落到第二行靠右。
   不这样做的话标题列会被 flex 一直压缩，副标题只剩几十像素宽。 */
@media (max-width:430px){
  .page-head > div:first-child{flex:1 1 100%}
  .page-tools{flex:0 0 auto;margin-left:auto;justify-content:flex-end}
}

/* 窄屏筛选条：5 个筛选项 + 多选在 360px 排不进一行。横向滚动会把
   「已完成 / 多选」藏到屏幕外（滚动条又是隐藏的），所以直接换行、全部可见。 */
@media (max-width:430px){
  .sched-filters{flex-wrap:wrap;overflow-x:visible;row-gap:6px}
  .sched-filters .filt-multi{margin-left:0}
}

/* ================= 对话框（public/js/ui.js） ================= */
.btn-danger{border:0;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;box-shadow:0 6px 16px -8px rgba(220,38,38,.7)}
body.dlg-open{overflow:hidden}
.dlg-mask{position:fixed;inset:0;z-index:120;background:rgba(15,18,34,.38);backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;padding:16px}
.dlg-card{width:100%;max-width:420px;max-height:calc(100dvh - 32px);overflow:auto;background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:20px}
.dlg-head h2{margin:0;font-size:17px}
.dlg-head p{margin:4px 0 0}
.dlg-body{display:flex;flex-direction:column;gap:12px;margin:16px 0 0}
.dlg-field{display:flex;flex-direction:column;gap:6px}
.dlg-field.inline{flex-direction:row;align-items:center;gap:10px}
.dlg-field label{font-size:13px;font-weight:600;color:var(--ink-2)}
.dlg-hint{font-size:12px;color:var(--ink-3)}
.dlg-body .input{min-height:var(--tap);padding:8px 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:#fff;width:100%}
.dlg-body textarea.input{min-height:76px;resize:vertical}
.dlg-err{color:var(--bad);font-size:13px;margin:10px 0 0;min-height:1em}
.dlg-foot{display:flex;align-items:center;gap:8px;margin-top:16px}
.dlg-foot .spacer{flex:1}
.dlg-foot .dlg-extra{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.dlg-foot .dlg-extra .btn{padding:0 12px}
/* 手机上「复制一条 / 删除」加起取消与保存，一行放不下 —— 附加动作单独占一行，
   左右两个键不许挤成两行字（挤了就看不出哪个是危险操作） */
@media (max-width:720px){
  .dlg-foot{flex-wrap:wrap}
  .dlg-foot .dlg-extra{flex:1 0 100%;order:-1;margin-bottom:10px}
  .dlg-foot .dlg-extra .btn{flex:1 1 0;justify-content:center}
}
@media (max-width:720px){
  .dlg-mask{align-items:flex-end;padding:0}
  .dlg-card{max-width:none;border-radius:var(--radius) var(--radius) 0 0;padding:18px 16px calc(18px + var(--safe-b))}
}

/* 条目变更历史（清单里点条目标题看的那一屏） */
.hist{display:flex;flex-direction:column;gap:2px;max-height:50vh;overflow:auto}
.hist-row{display:flex;align-items:center;gap:10px;padding:8px 4px;border-bottom:1px solid var(--line-2)}
.hist-row:last-child{border-bottom:0}

/* Token 明文一次性展示 */
.token-box{display:flex;gap:8px;align-items:center;padding:10px;border:1px dashed var(--accent);border-radius:var(--radius-sm);background:var(--accent-soft)}
.token-box code{flex:1;min-width:0;font-size:12px;word-break:break-all;color:var(--ink)}

/* 从搜索结果跳进来时闪一下那一条，否则「跳到了但不知道在哪」 */
.item.flash{background:var(--accent-soft);border-radius:var(--radius-sm);transition:background .3s ease}

/* ================= 简报整屏（public/js/views-briefings.js） ================= */
.brief-grid{align-items:start}
.brief-list{display:flex;flex-direction:column;gap:2px;margin-top:10px;max-height:60vh;overflow:auto}
.brief-row{display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;padding:10px 8px;border:0;border-bottom:1px solid var(--line-2);background:transparent;text-align:left;cursor:pointer;border-radius:var(--radius-sm);min-height:var(--tap)}
.brief-row:hover{background:#fbfbfd}
.brief-row.on{background:var(--accent-soft)}
.brief-row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;font-size:14px;text-align:left}
/* 窄屏改成两行、左对齐：横排时 390px 宽塞不下"日期+标题"，
   而且 flex 均分会把两行挤成居中 —— 列表里的居中文案是最难扫的 */
@media (max-width:719px){
  .brief-row{flex-wrap:wrap;justify-content:flex-start;gap:2px}
  .brief-row .nm{flex:1 0 100%;white-space:normal}
}
.brief-snippet{margin:0 0 6px 8px}
.brief-full{margin:10px 0 0;line-height:1.7;font-size:14.5px;overflow-wrap:anywhere}
.brief-full img{max-width:100%;height:auto;border-radius:var(--radius-sm)}
.brief-full h1,.brief-full h2,.brief-full h3{font-size:1.05em;margin:1em 0 .4em}
.brief-full p{margin:.6em 0}
.brief-full ul,.brief-full ol{padding-left:1.3em;margin:.6em 0}
.brief-full a{color:var(--accent);word-break:break-all}
.brief-full pre{overflow:auto;background:#f6f7fb;padding:10px;border-radius:var(--radius-sm)}
.brief-full mark{background:var(--warn-soft);color:inherit;padding:0 2px;border-radius:3px}
@media (min-width:720px){
  /* 左边只是目录（日期 + 标题），右边才是简报正文：目录给窄列，正文吃满剩下的 */
  .brief-grid{grid-template-columns:minmax(240px,280px) minmax(0,1fr)}
}
@media (min-width:1080px){
  .brief-grid{grid-template-columns:minmax(280px,340px) minmax(0,1fr)}
}

/* ================= 日历侧栏（C2：今天之后 7 天） ================= */

/* 首页陈旧区：每条两个动作（勾掉 / 挪到本周） */
.stale-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--line-2);flex-wrap:nowrap}
.stale-row:last-child{border-bottom:0}
.stale-row .txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 运维列表里的长地址别把行撑破（手机上尤其） */
.op-row .mono{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:40vw}
/* 窄屏：名称和地址排不下平分，地址让位（名称是给自己看的，地址点开就知道） */
@media (max-width:719px){
  .op-row{flex-wrap:wrap}
  .op-row .nm{flex:1 1 auto;min-width:6em}
  .op-row .mono{order:9;flex:1 0 100%;max-width:100%;font-size:11.5px}
}

/* ================= 动效层 =================
   原则：只动 transform / opacity（走合成层，不触发布局），时长 .15–.18s，
   错峰延迟最多 80ms —— 列表一条条铺开，但没人会觉得在等动画。
   只在「进入视图」时播放：app.js 换页时给视图容器加 .view-enter，500ms 后摘掉；
   之后筛选/排序/勾选引起的局部重渲染不会再重播（这正是快速切筛选时闪烁的来源）。
   降级：文件上部的 prefers-reduced-motion 规则会一次性关掉全部 animation/transition。 */
:root{
  --mo-ease:cubic-bezier(.22,.61,.36,1);
  --mo-ease-out:cubic-bezier(.16,1,.3,1);
}

@keyframes hub-fade-in{from{opacity:0}to{opacity:1}}
@keyframes hub-fade-up{from{opacity:0;transform:translate3d(0,10px,0)}to{opacity:1;transform:none}}
@keyframes hub-pop{from{opacity:0;transform:translate3d(0,8px,0) scale(.975)}to{opacity:1;transform:none}}
@keyframes hub-sheet{from{opacity:0;transform:translate3d(0,64px,0)}to{opacity:1;transform:none}}
@keyframes hub-row{from{opacity:0;transform:translate3d(-6px,0,0)}to{opacity:1;transform:none}}
@keyframes hub-ring{0%{box-shadow:0 0 0 0 rgba(220,38,38,.35)}70%{box-shadow:0 0 0 6px rgba(220,38,38,0)}100%{box-shadow:0 0 0 0 rgba(220,38,38,0)}}

/* —— 换页：视图容器 + 页头（页头的重放靠 app.js 的 .view-in，纯 CSS 重放不了） —— */
.view-root > [data-view]:not([hidden]){animation:hub-fade-up .18s var(--mo-ease-out) both}
.main.view-in .page-head{animation:hub-fade-up .16s var(--mo-ease-out) both}

/* —— 卡片：进入 + 同屏错峰（只在这一屏刚进来时播） —— */
.view-enter .card{animation:hub-fade-up .18s var(--mo-ease-out) both}
.view-enter .grid > .card:nth-child(2),.view-enter .settings > .card:nth-child(2){animation-delay:30ms}
.view-enter .grid > .card:nth-child(3),.view-enter .settings > .card:nth-child(3){animation-delay:50ms}
.view-enter .grid > .card:nth-child(n+4),.view-enter .settings > .card:nth-child(n+4){animation-delay:70ms}

/* —— 列表逐条铺开（清单/时间轴/运维/简报/历史/搜索） —— */
.view-enter .items > *,.view-enter .timeline > *,.view-enter .op-list > *,.view-enter .agenda-list > *,.view-enter .brief-list > *,.view-enter .stale-box > *,.view-enter .hist > *,.view-enter .search-results > li{animation:hub-row .15s var(--mo-ease-out) both}
.view-enter .items > :nth-child(2),.view-enter .timeline > :nth-child(2),.view-enter .op-list > :nth-child(2),.view-enter .agenda-list > :nth-child(2),.view-enter .brief-list > :nth-child(2),.view-enter .stale-box > :nth-child(2),.view-enter .hist > :nth-child(2),.view-enter .search-results > li:nth-child(2){animation-delay:20ms}
.view-enter .items > :nth-child(3),.view-enter .timeline > :nth-child(3),.view-enter .op-list > :nth-child(3),.view-enter .agenda-list > :nth-child(3),.view-enter .brief-list > :nth-child(3),.view-enter .stale-box > :nth-child(3),.view-enter .hist > :nth-child(3),.view-enter .search-results > li:nth-child(3){animation-delay:40ms}
.view-enter .items > :nth-child(4),.view-enter .timeline > :nth-child(4),.view-enter .op-list > :nth-child(4),.view-enter .agenda-list > :nth-child(4),.view-enter .brief-list > :nth-child(4),.view-enter .stale-box > :nth-child(4),.view-enter .hist > :nth-child(4),.view-enter .search-results > li:nth-child(4){animation-delay:60ms}
.view-enter .items > :nth-child(n+5),.view-enter .timeline > :nth-child(n+5),.view-enter .op-list > :nth-child(n+5),.view-enter .agenda-list > :nth-child(n+5),.view-enter .brief-list > :nth-child(n+5),.view-enter .stale-box > :nth-child(n+5),.view-enter .hist > :nth-child(n+5),.view-enter .search-results > li:nth-child(n+5){animation-delay:80ms}

/* —— 网格单元：日历/迷你日历/入口瓦片只淡入，位移会让格子看起来在跳 —— */
.view-enter .cal-grid > .cal-cell,.view-enter .cal-weekbar > .cal-weekbar-cell,.view-enter .mini-grid > .mini-day,.view-enter .link-grid > .link-tile,.view-enter .link-cards > .link-card,.view-enter .lm-grid > .lm-day,.view-enter .stat-row > .stat{animation:hub-fade-in .15s var(--mo-ease-out) both}

/* —— 交互反馈：统一过渡曲线，按下有回弹，悬停有轻微位移 —— */
.btn,.chip,.nav-item,.tabbar a,.search-trigger,.seg-btn,.link-tile,.link-card,.stat,.item,.op-row,.cal-cell,.cal-bar,.mini-day,.rev-head,.brief-row{transition:background-color .18s var(--mo-ease),border-color .18s var(--mo-ease),color .18s var(--mo-ease),box-shadow .2s var(--mo-ease),transform .18s var(--mo-ease-out)}
.btn:active{transform:scale(.97)}
.btn-primary:hover{transform:translateY(-1px)}
.btn-primary:active{transform:translateY(0) scale(.98)}
.btn[disabled],.btn:disabled{transform:none}

/* 侧栏：悬停右移一点，图标轻微放大；底栏当前项图标抬起来 */
.nav-item:hover{transform:translateX(2px)}
.nav-item svg,.tabbar a svg{transition:transform .2s var(--mo-ease-out)}
.nav-item:hover svg{transform:scale(1.06)}
.tabbar a[aria-current="page"] svg{transform:translateY(-1px) scale(1.06)}
.tabbar a:active svg{transform:scale(.92)}

/* 卡片内的可点块 */
.link-tile:hover{transform:translateY(-2px)}
.link-card:hover{transform:translateY(-2px);border-color:#d6d8e4}
.link-tile .abbr,.link-card .abbr{transition:transform .2s var(--mo-ease-out)}
.link-tile:hover .abbr{transform:scale(1.05)}
.stat:hover{transform:translateY(-1px)}
.cal-cell:hover{transform:translateY(-1px)}
.cal-bar:hover{transform:translateY(-1px)}
.mini-day:hover{transform:scale(1.07)}
.mini-day.today{box-shadow:0 6px 14px -9px rgba(79,70,229,.9)}
.dot-status.bad{animation:hub-ring 2.4s ease-out infinite}

/* 展开内容（版本正文/差异/简报全文）淡入，别整块"啪"地弹出来 */
.rev-body,.brief-full,.diff,.md-pre,.empty{animation:hub-fade-in .24s var(--mo-ease-out) both}

/* —— 浮层 —— */
.dlg-mask{animation:hub-fade-in .18s var(--mo-ease) both}
.dlg-card{animation:hub-pop .26s var(--mo-ease-out) both}

/* 手机：对话框从底部升起（与既有的底部贴合布局一致），并关掉 hover 位移 */
@media (max-width:720px){
  .dlg-card{animation:hub-sheet .3s var(--mo-ease-out) both}
  .link-tile:hover,.link-card:hover,.cal-cell:hover,.btn-primary:hover,.stat:hover,.mini-day:hover,.nav-item:hover{transform:none}
}

/* ================= 夜间模式 =================
   两套皮只换变量与少数写死的浅色表层，布局、尺寸、圆角一律不动。
   「跟随系统」在 JS 里已解析成 light / dark 再写进 html[data-theme]，
   所以这里只认这两个确定值 —— 不在 CSS 里再写 prefers-color-scheme 分支，
   否则用户手动选了浅色，系统偏好深色时会被反向覆盖。 */
[data-theme="dark"]{
  color-scheme:dark;
  --tab-bg:rgba(11,14,23,.94);
  --tab-bg-solid:#0b0e17;
  --ink:#e9ebf5; --ink-2:#b7bdd1; --ink-3:#8d93a8; --ink-4:#6d738a;
  --line:#252a3b; --line-2:#1c2130; --bg:#0b0e17; --card:#141827;
  --accent:#8b95fb; --accent-soft:#232848; --accent-2:#b49cfb;
  --ok:#4ade80; --ok-soft:#12301f; --warn:#fbbf24; --warn-soft:#3a2a10;
  --bad:#f87171; --bad-soft:#3b1a1d;
  --cpu:#60a5fa; --cpu-soft:#13243d;
  --disk:#2dd4bf; --disk-soft:#10312f;
  --shadow:0 1px 2px rgba(0,0,0,.55), 0 8px 24px -12px rgba(0,0,0,.75);
  --shadow-lg:0 2px 4px rgba(0,0,0,.5), 0 24px 48px -20px rgba(0,0,0,.85);
  --note-line-strong:#3a4056;
  --note-surface-2:#0f1420;
  --note-shadow:0 1px 2px rgba(0,0,0,.5), 0 10px 24px -16px rgba(0,0,0,.8);
  --note-shadow-hover:0 2px 6px rgba(0,0,0,.55), 0 16px 32px -18px rgba(0,0,0,.9);
}

/* —— 表层：顶栏 / 侧栏 / 底栏 / 输入 / 浮层 —— */
[data-theme="dark"] .topbar{background:rgba(11,14,23,.86)}
[data-theme="dark"] .side{background:var(--card)}
[data-theme="dark"] .btn{background:#1a1f30;border-color:var(--line)}
[data-theme="dark"] .btn:hover{border-color:#333b55}
[data-theme="dark"] .btn-ghost{background:transparent;border-color:transparent}
[data-theme="dark"] .btn-ghost:hover{background:#1f2436}
[data-theme="dark"] .btn-primary{background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff}
[data-theme="dark"] .btn-danger{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff}
[data-theme="dark"] .topsearch-form{background:#151a29}
[data-theme="dark"] .search-drop,[data-theme="dark"] .user-menu{background:var(--card)}
[data-theme="dark"] .field input,[data-theme="dark"] .input,[data-theme="dark"] .dlg-body .input{background:#111524;color:var(--ink)}
[data-theme="dark"] .empty{background:#10141f}
[data-theme="dark"] .link-tile{background:#171c2b}
[data-theme="dark"] .link-tile:hover{border-color:#333b55}
[data-theme="dark"] .link-tile .abbr,[data-theme="dark"] .link-card .abbr{background:linear-gradient(135deg,#4f46e5,#7c3aed)}
/* 深色主题也保持白底：favicon 是按白底设计的，压在深色块上会糊成一团 */
[data-theme="dark"] .link-tile .abbr.has-icon,[data-theme="dark"] .link-card .abbr.has-icon{background:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.14)}
[data-theme="dark"] .link-card{background:var(--card)}
[data-theme="dark"] .link-card:hover{border-color:#333b55}
[data-theme="dark"] .seg{background:#171c2b}
[data-theme="dark"] .seg-btn.on{background:#4f46e5;color:#fff}
[data-theme="dark"] .md-pre,[data-theme="dark"] .brief-full pre{background:#10141f}
[data-theme="dark"] .brief-row:hover{background:#171c2b}
[data-theme="dark"] .rev-head:hover{background:#1b2132}
[data-theme="dark"] .item:hover,[data-theme="dark"] .mini-day:hover{background:#1a2033}
[data-theme="dark"] .token-box{background:#1d2240}
[data-theme="dark"] .dlg-mask{background:rgba(3,5,12,.66)}
[data-theme="dark"] .toast{background:#2a3048}

/* —— 日历 —— */
[data-theme="dark"] .cal-cell{background:#111524}
[data-theme="dark"] .cal-cell.dim{background:#0d1120}
[data-theme="dark"] .cal-cell:hover{background:#171c2b}
[data-theme="dark"] .cal-weekbar-cell{background:#171c2b}
[data-theme="dark"] .cal-wkcell{background:#111524}
[data-theme="dark"] .cal-wkcell.today,[data-theme="dark"] .cal-cell.today{border-color:var(--accent)}
[data-theme="dark"] .cal-bar.assigned,[data-theme="dark"] .cal-bar.assigned.cont-tail{background:#2a2f5c;color:#c7d2fe}
[data-theme="dark"] .mini-day.today{background:#4f46e5;color:#fff}
[data-theme="dark"] .mini-day.today .n,[data-theme="dark"] .mini-day.today .lunar{color:#fff}

/* —— 标签与差异行：浅底上的深字在深底上会糊成一团 —— */
[data-theme="dark"] .chip.fest,[data-theme="dark"] .chip.agent{background:#2a2f5c;color:#c7d2fe}
[data-theme="dark"] .diff-line.add{color:#8ce9b6}
[data-theme="dark"] .diff-line.del{color:#ffb4b4}
[data-theme="dark"] .login-msg.err{border-color:#5a2626}
[data-theme="dark"] .login-msg.hint{border-color:#3a3f6b}
[data-theme="dark"] .login-card{background:rgba(20,24,40,.94)}

/* —— 输入占位符与选中文字：默认值是按浅底调的，深底上会糊 —— */
[data-theme="dark"] input::placeholder,[data-theme="dark"] textarea::placeholder{color:#5d6478}
[data-theme="dark"] ::selection{background:#3b4270;color:#fff}

/* ---------- 更多（手机）：模块索引页 ---------- */
.more{display:flex;flex-direction:column;gap:18px;max-width:640px}
.more-sect h4{margin:0 0 8px;padding:0 2px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-4)}
.more-list{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.more-row{display:flex;align-items:center;gap:12px;min-height:64px;padding:11px 14px;color:var(--ink);text-decoration:none;border-top:1px solid var(--line-2)}
.more-row:first-child{border-top:0}
.more-row:hover{background:var(--line-2);text-decoration:none;color:var(--ink)}
.more-row:active{background:var(--accent-soft)}
.more-ico{width:36px;height:36px;flex:0 0 auto;display:grid;place-items:center;border-radius:10px;background:var(--accent-soft);color:var(--accent)}
.more-ico svg{width:19px;height:19px}
.more-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.more-txt b{font-size:15px;font-weight:650;letter-spacing:-.01em}
.more-txt i{font-size:12.5px;font-style:normal;color:var(--ink-3)}
.more-go{margin-left:auto;color:var(--ink-4);font-size:20px;line-height:1}

/* ---------- 日程清单（全宽 + 顶部日期 / 目录 / 版本） ---------- */
.sched-page{display:flex;flex-direction:column;gap:12px;min-width:0}
.sched-head{position:relative;display:flex;align-items:flex-end;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:2px 2px 0}
.sched-date{min-width:0}
.sched-date-main{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.sched-date-main b{font-size:30px;line-height:1.15;letter-spacing:-.02em;font-weight:750}
.sched-week{font-size:14px;font-weight:650;color:var(--accent);background:var(--accent-soft);padding:3px 9px;border-radius:999px}
.sched-date-sub{margin-top:2px;font-size:12.5px;color:var(--ink-3)}
.sched-tools{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
.sched-tools .btn-on{background:var(--accent-soft);border-color:#c9cdf8;color:var(--accent)}
.sched-pop{position:absolute;right:0;top:calc(100% + 8px);z-index:60;width:min(320px,calc(100vw - 28px));max-height:min(62vh,480px);overflow:auto;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:6px}
.pop-title{padding:8px 10px 4px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-4)}
.pop-sect{padding:8px 10px 2px;font-size:11.5px;color:var(--ink-4)}
.pop-row{display:flex;align-items:center;gap:10px;width:100%;min-height:40px;padding:0 10px;border:0;border-radius:9px;background:none;color:var(--ink);font-size:14px;text-align:left;cursor:pointer}
.pop-row:hover{background:var(--line-2)}
.pop-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pop-count{flex:0 0 auto;font-size:12px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.rev-list{display:flex;flex-direction:column;gap:2px}
.rev-row{position:relative;display:flex;align-items:center;gap:8px;min-height:40px;padding:0 6px 0 10px;border-radius:9px}
.rev-row:hover,.rev-row.open{background:var(--line-2)}
.rev-when{flex:1 1 auto;font-family:var(--mono);font-size:13px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.rev-more{width:34px;height:34px;flex:0 0 auto;border:0;border-radius:8px;background:none;color:var(--ink-3);font-size:18px;line-height:1;cursor:pointer}
.rev-more:hover{background:var(--card);color:var(--ink)}
.rev-menu{position:absolute;right:4px;top:calc(100% - 2px);z-index:5;min-width:104px;padding:4px;background:var(--card);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-lg)}
.rev-menu-item{display:block;width:100%;min-height:36px;padding:0 10px;border:0;border-radius:7px;background:none;color:var(--ink);font-size:13.5px;text-align:left;cursor:pointer}
.rev-menu-item:hover{background:var(--accent-soft);color:var(--accent)}

.sched-tabs{display:flex;gap:4px;padding:3px;background:var(--line-2);border-radius:11px;width:max-content;max-width:100%}
.sched-tab{display:flex;align-items:center;gap:7px;min-height:36px;padding:0 16px;border:0;border-radius:9px;background:none;color:var(--ink-3);font-size:14px;font-weight:600;cursor:pointer}
.sched-tab.on{background:var(--card);color:var(--ink);box-shadow:0 1px 2px rgba(16,18,34,.08)}
.tab-count{font-size:11.5px;font-weight:600;color:var(--ink-4);background:var(--line-2);padding:1px 7px;border-radius:999px}
.sched-tab.on .tab-count{background:var(--accent-soft);color:var(--accent)}

.quick-add{display:flex;align-items:center;gap:8px;padding:8px;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
.quick-input{flex:1 1 auto;min-width:0;height:40px;padding:0 12px;border:1px solid var(--line);border-radius:10px;background:var(--bg);font-size:14.5px;outline:none}
.quick-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(79,70,229,.12);background:var(--card)}
.quick-sect{flex:0 0 auto;width:auto;max-width:170px;height:40px}
.quick-btn{flex:0 0 auto;min-height:40px}
.quick-add .muted{flex:1 1 auto;margin:0}

.sched-filters{display:flex;gap:6px;overflow-x:auto;padding:0 2px;scrollbar-width:none}
.sched-filters::-webkit-scrollbar{display:none}
.filter-chip{flex:0 0 auto;min-height:32px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-3);font-size:13px;cursor:pointer}
.filter-chip:hover{color:var(--ink);border-color:#d5d7e2}
.filter-chip.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}
.sched-filters .filt-multi{margin-left:auto;flex:0 0 auto}

.sel-bar{position:sticky;top:calc(var(--topbar-h) + 8px);z-index:30;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 10px;background:var(--card);border:1px solid #c9cdf8;border-radius:var(--radius);box-shadow:var(--shadow-lg)}
.sel-count{font-size:13.5px;color:var(--accent);white-space:nowrap}
.sel-actions{display:flex;gap:6px;flex-wrap:wrap}
.sel-bar > .btn-ghost{margin-left:auto}

.sched-list{display:flex;flex-direction:column;gap:var(--gap);min-width:0}

/* ---------- B1 看板 ---------- */
.sched-board-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:0 2px}
.board-hint{margin-left:auto}
.sched-board{display:flex;gap:12px;overflow-x:auto;padding:2px 2px 10px;align-items:flex-start;scrollbar-width:thin}
.board-col{flex:0 0 268px;min-width:268px;display:flex;flex-direction:column;gap:8px;background:var(--line-2);border:1px solid var(--line);border-radius:var(--radius);padding:10px;min-height:140px;transition:background-color .15s,border-color .15s}
.board-col.over{border-color:var(--accent);background:var(--accent-soft)}
.board-col-head{display:flex;align-items:center;gap:8px;min-width:0}
.board-col-title{margin:0;font-size:13.5px;font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.board-col-count{font-size:11.5px;color:var(--ink-4);background:var(--card);border-radius:999px;padding:1px 7px;font-variant-numeric:tabular-nums}
.board-col-head .chip{font-size:10.5px;padding:1px 7px}
.board-col-body{display:flex;flex-direction:column;gap:7px;min-height:60px}
.board-empty{margin:0;padding:14px 0;text-align:center;font-size:12.5px;color:var(--ink-4)}
.board-card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:9px 10px;box-shadow:0 1px 2px rgba(16,18,34,.05);cursor:grab}
.board-card:hover{border-color:#d5d7e2;box-shadow:var(--shadow)}
.board-card.dragging{opacity:.5;cursor:grabbing}
.board-card.is-done{opacity:.72}
.board-card.is-overdue{border-left:3px solid var(--bad)}
.board-card-top{display:flex;align-items:flex-start;gap:8px}
.board-card .tick{width:18px;height:18px;flex:0 0 auto;margin-top:2px;accent-color:var(--accent);cursor:pointer}
.board-card-label{flex:1 1 auto;min-width:0;text-align:left;background:none;border:0;padding:0;font-size:13.5px;line-height:1.45;color:var(--ink);cursor:pointer;overflow-wrap:break-word}
.board-card-label:hover{text-decoration:underline}
.board-card-label.done{color:var(--ink-4);text-decoration:line-through}
.board-card-meta{display:flex;flex-wrap:wrap;gap:4px;margin-top:7px}
.board-card-meta .chip{font-size:10.5px;padding:1px 7px}
.chip.board-sec-chip{background:var(--line-2);color:var(--ink-3);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.board-card-foot{display:flex;align-items:center;gap:4px;margin-top:6px}
.board-card-time{font-size:11px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.board-card-foot .icon-btn{opacity:.55}
.board-card:hover .board-card-foot .icon-btn{opacity:1}
[data-theme="dark"] .board-card:hover{border-color:#3a4157}
.section-card{margin-bottom:0;min-width:0}
.section-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.section-title{display:flex;align-items:center;gap:8px;min-width:0}
.section-title h3{margin:0;font-size:15.5px;font-weight:700;letter-spacing:-.01em}
.section-count{font-size:12px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.section-tools{display:flex;gap:2px;margin-left:auto}
.section-tools .btn-sm{min-width:34px;min-height:34px;padding:0 8px;font-size:16px;line-height:1}
.section-hint{margin:2px 0 6px;font-size:12.5px;color:var(--ink-3)}
.section-empty{margin:6px 0 2px}
.items{display:flex;flex-direction:column;gap:1px}

.sched-item{display:flex;align-items:center;gap:10px;min-height:46px;padding:6px 8px;border-radius:9px;min-width:0;border-top:1px solid var(--line-2)}
.sched-item:first-child{border-top:0}
.sched-item:hover{background:var(--line-2)}
.sched-item.child{margin-left:30px;padding-left:4px;min-height:40px}
.sched-item .tick{width:19px;height:19px;flex:0 0 auto;accent-color:var(--accent);cursor:pointer}
.sched-item .item-label{flex:1 1 auto;min-width:0;text-align:left;background:none;border:0;padding:0;font-size:14.5px;line-height:1.45;color:var(--ink);cursor:pointer;overflow-wrap:break-word}
.sched-item .item-label:hover{text-decoration:underline}
.sched-item .item-label.done{color:var(--ink-4);text-decoration:line-through}
.sched-item .item-meta{display:flex;gap:4px;align-items:center;flex:0 1 auto;flex-wrap:nowrap;min-width:0}
.sched-item .item-meta .chip{white-space:nowrap;flex:0 0 auto;font-size:11.5px;padding:2px 8px}
.item-updated{flex:0 0 auto;font-size:12px;color:var(--ink-4);font-variant-numeric:tabular-nums;white-space:nowrap}
.item-actions{display:flex;gap:2px;flex:0 0 auto;opacity:0;transition:opacity .15s}
.sched-item:hover .item-actions,.sched-item:focus-within .item-actions{opacity:1}
.icon-btn{width:32px;height:32px;border:0;border-radius:8px;background:none;color:var(--ink-3);font-size:14px;line-height:1;cursor:pointer}
.icon-btn:hover{background:var(--card);color:var(--ink)}
.icon-btn.danger:hover{background:var(--bad-soft);color:var(--bad)}
.plan-dot{width:7px;height:7px;flex:0 0 auto;border-radius:50%;background:var(--accent);opacity:.55;margin:0 6px}
.inline-edit{flex:1 1 auto;min-width:0;height:32px;padding:0 8px;border:1px solid var(--accent);border-radius:7px;background:var(--card);font-size:14.5px;outline:none;box-shadow:0 0 0 3px rgba(79,70,229,.12)}
.done-toggle{align-self:flex-start;margin:6px 0 0 4px;padding:2px 4px;border:0;background:none;color:var(--ink-3);font-size:12.5px;cursor:pointer}
.done-toggle:hover{color:var(--accent)}
.done-toggle .caret{margin-left:4px;font-size:10px}
.sched-item.is-done .item-updated{opacity:.7}
.sched-item.dragging{opacity:.45}
.sched-item.drop-over{box-shadow:inset 0 2px 0 var(--accent)}
.sched-item.flash{background:var(--accent-soft)}
.section-card.flash{box-shadow:0 0 0 3px var(--accent-soft)}
/* 多选态只切显隐，不重绘清单：非多选隐藏选择框，多选隐藏完成框/计划点 */
.sched-page:not(.selecting) .sel-tick{display:none}
.sched-page.selecting .done-tick,.sched-page.selecting .plan-dot{display:none}
.sched-page.selecting .sel-tick{display:inline-block}

.chip.prio{background:var(--line-2);color:var(--ink-2)}
.chip.prio-p0{background:var(--bad-soft);color:var(--bad)}
.chip.prio-p1{background:var(--warn-soft);color:var(--warn)}
.chip.prio-p2{background:var(--cpu-soft);color:var(--cpu)}
.chip.due-chip{background:var(--line-2);color:var(--ink-2)}
.chip.due-chip.is-soon{background:var(--warn-soft);color:var(--warn)}
.chip.due-chip.is-overdue{background:var(--bad-soft);color:var(--bad)}
.chip.rec-chip{background:var(--accent-soft);color:var(--accent)}
.chip.plan-chip{background:var(--accent-soft);color:var(--accent)}
.chip.star-chip{background:#fff7e6;color:#b45309}

.urgent-card{border-color:#f2c9c9;background:linear-gradient(180deg,#fffafa 0%,var(--card) 70px)}
.urgent-card .section-title h3{color:var(--bad)}
.chip.urgent-chip{background:var(--bad-soft);color:var(--bad);font-weight:700}
.urgent-row .item-label{color:#b91c1c;font-weight:650}
.urgent-top{border-radius:10px;background:linear-gradient(90deg,#fff1f1,#fffafa)}
.urgent-top .item-label{font-size:16px;font-weight:750;color:#a30d0d}
.urgent-top .due-chip{background:#fee2e2;color:#a30d0d;font-weight:700}
.urgent-card .item-actions{opacity:1}

@media (max-width:719px){
  .sched-date-main b{font-size:24px}
  .sched-week{font-size:12.5px}
  .sched-date-sub{font-size:11.5px}
  .sched-head{gap:8px}
  .sched-tools .btn{min-height:34px;padding:0 11px;font-size:13px}
  .sched-pop{right:auto;left:0}
  .quick-add{flex-wrap:wrap}
  .quick-input{flex:1 1 100%;order:1}
  .quick-sect{flex:1 1 auto;order:2;max-width:none}
  .quick-btn{order:3}
  .sel-bar{top:calc(var(--topbar-h) + 4px)}
  .sel-bar > .btn-ghost{margin-left:0}
  .sched-item{flex-wrap:wrap;row-gap:2px;padding:8px 6px}
  .sched-item .item-label{flex:1 1 calc(100% - 40px);order:1}
  .sched-item .tick,.sched-item .plan-dot{order:0}
  .sched-item .item-actions{order:2;opacity:1}
  .sched-item .item-meta{order:3;flex:1 1 100%;margin-left:29px;flex-wrap:wrap}
  .item-updated{order:3;margin-left:auto;font-size:11px}
  .sched-item.child{margin-left:18px}
  .section-tools .btn-sm{min-width:32px;min-height:32px}
  .urgent-top .item-label{font-size:15px}
}

[data-theme="dark"] .sched-pop,[data-theme="dark"] .rev-menu,[data-theme="dark"] .sel-bar,[data-theme="dark"] .quick-add{background:var(--card)}
[data-theme="dark"] .sched-tools .btn-on{background:#2a2f5c;border-color:#3a3f6b;color:#c7d2fe}
[data-theme="dark"] .sched-tab.on{background:#232a42;color:#fff}
[data-theme="dark"] .tab-count{background:#2a3049;color:#9aa3bd}
[data-theme="dark"] .sched-tab.on .tab-count{background:#2a2f5c;color:#c7d2fe}
[data-theme="dark"] .quick-input{background:#101526}
[data-theme="dark"] .quick-input:focus{background:#151a29}
[data-theme="dark"] .filter-chip{background:var(--card);border-color:#2a3049;color:#9aa3bd}
[data-theme="dark"] .filter-chip.on{background:var(--accent);border-color:var(--accent);color:#fff}
[data-theme="dark"] .sel-bar{border-color:#3a3f6b}
[data-theme="dark"] .urgent-card{border-color:#5a2626;background:linear-gradient(180deg,#241820 0%,var(--card) 70px)}
[data-theme="dark"] .urgent-row .item-label{color:#fca5a5}
[data-theme="dark"] .urgent-top{background:linear-gradient(90deg,#2a1a1d,#241820)}
[data-theme="dark"] .urgent-top .item-label{color:#fecaca}
[data-theme="dark"] .chip.star-chip{background:#3a2f14;color:#fbbf24}
[data-theme="dark"] .sched-item.flash{background:#2a2f5c}
[data-theme="dark"] .section-card.flash{box-shadow:0 0 0 3px #2a2f5c}

/* ---------- 版本预览（独立标签页） ---------- */
.pv-body{background:var(--bg)}
.pv-top{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:14px;flex-wrap:wrap;min-height:var(--topbar-h);padding:8px 20px;background:var(--card);border-bottom:1px solid var(--line)}
.pv-crumb{color:var(--ink-4);font-size:13.5px;font-weight:500}
.pv-actions{display:flex;gap:8px;margin-left:auto}
.pv-main{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;max-width:1600px;margin:0 auto;padding:18px 20px 60px;align-items:start}
.pv-loading{grid-column:1/-1;color:var(--ink-3);font-size:14px}
.pv-col{min-width:0;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.pv-col.old{border-color:#d9d0f2}
.pv-col-head{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-bottom:1px solid var(--line);background:var(--line-2)}
.pv-col.old .pv-col-head{background:#f6f2ff}
.pv-col-head h2{margin:0;font-size:16px;font-weight:700;letter-spacing:-.01em}
.pv-sub{margin:2px 0 0;font-size:12px;color:var(--ink-3)}
.pv-count{margin-left:auto;flex:0 0 auto;font-size:12px;color:var(--ink-3);font-variant-numeric:tabular-nums;white-space:nowrap}
.pv-sections{padding:8px 10px 14px}
.pv-sect{margin-top:10px}
.pv-sect:first-child{margin-top:0}
.pv-sect-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 4px;border-bottom:1px solid var(--line-2)}
.pv-sect-head h3{margin:0;font-size:14px;font-weight:700}
.pv-hint{font-size:12px;color:var(--ink-3)}
.pv-items{display:flex;flex-direction:column;gap:1px;padding-top:2px}
.pv-item{display:flex;align-items:center;gap:9px;min-height:38px;padding:4px 6px;border-radius:8px;flex-wrap:wrap}
.pv-item:hover{background:var(--line-2)}
.pv-item.pv-child{padding-left:28px}
.pv-item.is-done .pv-label{color:var(--ink-4);text-decoration:line-through}
.pv-box{width:17px;height:17px;flex:0 0 auto;border:1.5px solid #c6c9d6;border-radius:5px;background:var(--card)}
.pv-box.on{background:var(--accent);border-color:var(--accent);position:relative}
.pv-box.on::after{content:"✓";position:absolute;inset:0;display:grid;place-items:center;color:#fff;font-size:11px;font-weight:700}
.pv-label{flex:1 1 auto;min-width:0;font-size:14px;line-height:1.45;overflow-wrap:break-word}
.pv-meta{display:flex;gap:4px;align-items:center;flex-wrap:wrap;margin-left:auto}
.pv-meta .chip{font-size:11px;padding:2px 8px;white-space:nowrap}
.pv-diff-tag{flex:0 0 auto;font-size:10.5px;padding:1px 7px;border-radius:999px}
.pv-diff-tag.pv-only{background:var(--ok-soft);color:var(--ok)}
.pv-diff-tag.pv-changed{background:var(--warn-soft);color:var(--warn)}
.pv-item.pv-only{box-shadow:inset 3px 0 0 #86d3ae}
.pv-item.pv-changed{box-shadow:inset 3px 0 0 #f0b46a}
.pv-note{grid-column:1/-1;margin:0;font-size:12.5px;color:var(--warn)}

@media (max-width:959px){
  .pv-main{grid-template-columns:minmax(0,1fr);padding:14px 12px 48px}
  .pv-top{padding:8px 12px}
  .pv-col-head{padding:10px 12px}
  .pv-sections{padding:6px 8px 12px}
}
[data-theme="dark"] .pv-col.old{border-color:#3a3f6b}
[data-theme="dark"] .pv-col.old .pv-col-head{background:#20263c}
[data-theme="dark"] .pv-box{border-color:#4a5069}

/* 令牌明文行：长期可见 + 每行一键复制 */
.tok-secret{display:flex;align-items:center;gap:8px;min-width:0;padding:6px 8px;border:1px dashed var(--line);border-radius:8px;background:var(--bg)}
.tok-secret code{flex:1 1 auto;min-width:0;font-size:11.5px;line-height:1.5;color:var(--ink-2);overflow-wrap:anywhere}
.tok-secret .btn{flex:0 0 auto;min-height:30px;padding:0 10px;font-size:12px}
[data-theme="dark"] .tok-secret{background:#101526;border-color:#2a3049}
[data-theme="dark"] .tok-secret code{color:#c3c9db}

/* ===================================================================
   首页看板（v7）
   左列回答「今天要做什么」，右列回答「今天是什么日子」。
   每张卡都带一句上下文和一个去处；空状态也给下一步，不留一块白。
   =================================================================== */

.chip.accent-chip{background:var(--accent-soft);color:var(--accent)}

/* 卡片头右侧的「更多 →」 */
.home-more{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;padding:4px 0 4px 8px;font-size:12px;font-weight:600;color:var(--ink-3)}
.home-more:hover{color:var(--accent);text-decoration:none}
.home-more-arrow{line-height:1;transition:transform .18s var(--mo-ease)}
.home-more:hover .home-more-arrow{transform:translateX(2px)}

/* 空状态：一句解释 + 一个能去的入口 */
.home-empty{padding:20px 16px;border-radius:10px;background:var(--bg);text-align:center}
.home-empty-t{margin:0;font-size:13px;line-height:1.65;color:var(--ink-3)}
.home-empty-go{display:inline-block;margin-top:8px;font-size:13px;font-weight:650;color:var(--accent)}
.home-empty-go:hover{text-decoration:underline}

/* 卡底：一句上下文 + 去向 */
.home-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;padding-top:12px;border-top:1px solid var(--line-2)}
.home-foot-text{min-width:0;font-size:12px;line-height:1.5;color:var(--ink-4)}
.home-foot .home-more{padding:0}
.home-more-note{margin:10px 2px 0;font-size:12px;line-height:1.5;color:var(--ink-4)}
.home-ev-hint{margin:2px 2px 6px;font-size:12.5px;line-height:1.5;color:var(--ink-3)}
.home-ev.is-upcoming .home-ev-time{flex-basis:92px;color:var(--ink-2)}

/* 今日日程：时间在左，标题在右，类型小签收尾 —— 扫的是「几点、什么事」
   行高 42px、行间 2px：一行是一件事，扫的时候眼睛不必在两条之间找缝 */
.home-events{display:flex;flex-direction:column;gap:2px}
.home-ev{display:flex;align-items:center;gap:10px;min-height:42px;padding:6px 8px;border-radius:8px;color:var(--ink)}
.home-ev:hover{background:var(--line-2);text-decoration:none}
.home-ev-time{flex:0 0 44px;font-size:11.5px;font-weight:600;color:var(--ink-3);font-variant-numeric:tabular-nums}
.home-ev-main{display:flex;flex-direction:column;gap:1px;flex:1 1 auto;min-width:0}
.home-ev-title{font-size:14px;font-weight:600;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-ev-sub{font-size:11.5px;line-height:1.35;color:var(--ink-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-ev .chip{flex:0 0 auto;font-size:11px;padding:2px 8px}

/* 待办：按逾期 / 今天 / 近期分组，组头带计数 */
.home-tasks{display:flex;flex-direction:column;gap:2px}
/* 组头上方留 14px：把「逾期 / 今天 / 近期」三段分开，下面 6px 才归它自己那组 */
.home-group{display:flex;align-items:center;gap:6px;margin:14px 2px 6px;font-size:11px;font-weight:700;letter-spacing:.05em;color:var(--ink-4)}
.home-group:first-child{margin-top:0}
.home-group-n{min-width:18px;padding:0 5px;border-radius:999px;background:var(--line-2);font-size:10.5px;line-height:1.7;text-align:center;letter-spacing:0}
.home-task .item-label{color:var(--ink);text-decoration:none}
.home-task .item-label:hover{color:var(--accent);text-decoration:underline}
.home-task .item-meta .chip{font-size:10.5px;padding:2px 7px}

/* 最新简报：日期块 + 标题摘要，像一张折起来的报纸 */
.home-brief{display:flex;align-items:stretch;gap:16px;padding:14px;border:1px solid var(--line-2);border-radius:12px;background:var(--bg);color:var(--ink)}
.home-brief:hover{border-color:var(--accent);text-decoration:none}
.home-brief-date{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:0 0 auto;width:52px;border-radius:10px;background:var(--card);border:1px solid var(--line);line-height:1}
.home-brief-date b{font-size:21px;font-weight:750;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.home-brief-date span{margin-top:3px;font-size:10.5px;color:var(--ink-4)}
.home-brief-txt{display:flex;flex-direction:column;justify-content:center;gap:2px;min-width:0}
.home-brief-kicker{font-size:11px;color:var(--ink-4)}
.home-brief-title{font-size:15px;font-weight:700;line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.home-brief-excerpt{font-size:12.5px;line-height:1.6;color:var(--ink-3);overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}

/* 积压：一行一条，右侧写「几天没动」 */
.home-stale{display:flex;flex-direction:column}
.home-stale-row{display:flex;align-items:center;gap:10px;min-height:38px;padding:6px 2px;border-bottom:1px solid var(--line-2);color:var(--ink)}
.home-stale-row:last-child{border-bottom:0}
.home-stale-row:hover{text-decoration:none}
.home-stale-row:hover .home-stale-t{color:var(--accent)}
.home-stale-t{flex:1 1 auto;min-width:0;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-stale-d{flex:0 0 auto;padding:0 7px;border-radius:999px;background:var(--line-2);font-size:10.5px;line-height:1.8;color:var(--ink-4);font-variant-numeric:tabular-nums}

/* 快捷入口：小瓦片，最多两行；多出来的收进「更多」 */
.home-links{grid-template-columns:repeat(auto-fill,minmax(100px,1fr))}
.home-link-more .abbr{background:var(--line-2);color:var(--ink-3)}

/* 到期提醒 */
.home-exps{display:flex;flex-direction:column}
.home-exp{display:flex;align-items:center;gap:8px;min-height:38px;padding:6px 0;border-bottom:1px solid var(--line-2);color:var(--ink)}
.home-exp:last-child{border-bottom:0}
.home-exp:hover{text-decoration:none}
.home-exp:hover .home-exp-nm{color:var(--accent)}
.home-exp-kind{flex:0 0 auto;padding:1px 6px;border-radius:5px;background:var(--line-2);font-size:10.5px;font-weight:650;color:var(--ink-3)}
.home-exp-nm{flex:1 1 auto;min-width:0;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-exp .chip{flex:0 0 auto;font-size:10.5px;padding:2px 7px}

/* 服务器：状态点 + 名字/角色 + 内存/磁盘两条细条（宽度是真实占用）。
   两条并排会让 56px 更挤，所以竖着叠；「内 / 盘」一个字标不占地方，
   颜色之外还留一层可以读的标记，色差之外也能分清。 */
.home-srvs{display:flex;flex-direction:column}
.home-srv{display:flex;align-items:center;gap:9px;min-height:42px;padding:6px 0;border-bottom:1px solid var(--line-2);color:var(--ink)}
.home-srv:last-child{border-bottom:0}
.home-srv:hover{text-decoration:none}
.home-srv:hover .home-srv-nm{color:var(--accent)}
.home-srv-main{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-width:0}
.home-srv-nm{font-size:13.5px;font-weight:600;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-srv-role{font-size:10.5px;line-height:1.35;color:var(--ink-4);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-srv-meters{display:flex;flex-direction:column;gap:3px;flex:0 0 62px;min-width:0}
.home-srv-meter{display:flex;align-items:center;gap:3px;min-width:0}
.home-srv-meter em{flex:0 0 auto;font-style:normal;font-size:9px;line-height:1;color:var(--ink-4)}
.home-srv-track{flex:1 1 auto;height:4px;border-radius:999px;background:var(--line-2);overflow:hidden}
.home-srv-bar{display:block;height:100%;border-radius:inherit;background:var(--ok);transition:width .3s var(--mo-ease)}
.home-srv-bar.disk{background:var(--disk)}
.home-srv-bar.is-high{background:var(--warn)}

/* ---------- 首页月历：复用登录页面板，尺寸按卡片重写 ----------
   大月视图的 .cal-cell 是 112px 的事件格子；这里必须整体压回
   「日期 + 一个小字」的密度，否则 380px 的侧栏里一行都放不下。 */
.home-cal-body{display:grid;grid-template-columns:minmax(0,1fr)}
.home-cal-wrap{order:1;min-width:0}
.home-cal-key{order:2;display:flex;flex-wrap:wrap;justify-content:center;gap:6px 14px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line-2);font-size:11px;color:var(--ink-4)}
.home-cal-key-item{display:inline-flex;align-items:center;gap:5px}
.home-cal-key .cal-dot{width:6px;height:6px}
.home-cal-side{order:3;display:grid;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line-2)}

.home-cal-card .cal-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 10px;flex-wrap:nowrap}
.home-cal-card .cal-title{display:flex;flex-direction:column;gap:0;min-width:0}
.home-cal-card .cal-title b{font-size:15px;font-weight:750;letter-spacing:-.01em;white-space:nowrap}
.home-cal-card .cal-gz{display:block;font-size:10.5px;line-height:1.4;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.home-cal-card .cal-nav{display:flex;align-items:center;gap:2px;flex:0 0 auto}
.home-cal-card .cal-btn{width:28px;height:28px;display:grid;place-items:center;border:0;border-radius:8px;background:transparent;color:var(--ink-3);font-size:15px;line-height:1;cursor:pointer;transition:background-color .15s var(--mo-ease),color .15s var(--mo-ease)}
.home-cal-card .cal-btn:hover{background:var(--line-2);color:var(--ink)}
.home-cal-card .cal-btn-text{width:auto;padding:0 8px;font-size:11.5px;font-weight:650}

.home-cal-card .cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:3px}
.home-cal-card .cal-wd{padding:0 0 5px;text-align:center;font-size:10.5px;font-weight:700;color:var(--ink-4);letter-spacing:.02em}
.home-cal-card .cal-wd.is-weekend{color:var(--bad)}

.home-cal-card .cal-cell{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;min-width:0;min-height:44px;padding:4px 1px 5px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--ink-2);font:inherit;line-height:1.1;cursor:pointer;overflow:visible;animation:none}
.home-cal-card .cal-cell:hover{background:var(--line-2);transform:none}
.home-cal-card .cal-cell.is-muted{opacity:.42}
.home-cal-card .cal-day{font-size:13px;font-weight:650;letter-spacing:-.01em;color:var(--ink);font-variant-numeric:tabular-nums}
.home-cal-card .cal-cell.is-weekend .cal-day{color:var(--bad)}
.home-cal-card .cal-sub{max-width:100%;font-size:9px;line-height:1.15;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.home-cal-card .cal-sub.is-lunar-month{color:var(--ink-3);font-weight:600}
.home-cal-card .cal-sub.is-term{color:var(--ok);font-weight:600}
.home-cal-card .cal-sub.is-fest{color:var(--accent-2);font-weight:600}
.home-cal-card .cal-sub.is-legal{color:var(--bad);font-weight:700}

/* 今天：淡底 + 细描边；选中：实心 —— 两者叠在一起时选中优先 */
.home-cal-card .cal-cell.is-today{background:var(--accent-soft);box-shadow:inset 0 0 0 1px var(--accent)}
.home-cal-card .cal-cell.is-today .cal-day{color:var(--accent);font-weight:800}
.home-cal-card .cal-cell.is-legal{background:var(--bad-soft)}
.home-cal-card .cal-cell.is-legal .cal-day{color:var(--bad);font-weight:750}
.home-cal-card .cal-cell.is-selected{background:var(--accent);border-color:var(--accent);box-shadow:none}
.home-cal-card .cal-cell.is-selected .cal-day,
.home-cal-card .cal-cell.is-selected .cal-sub,
.home-cal-card .cal-cell.is-selected.is-weekend .cal-day{color:var(--card)}
.home-cal-card .cal-cell.is-selected .cal-dot{background:var(--card)}

.home-cal-card .cal-marks{position:absolute;left:0;right:0;bottom:3px;display:flex;justify-content:center;gap:2px;pointer-events:none}
.home-cal-card .cal-dot{display:block;width:4px;height:4px;border-radius:50%}
.home-cal-card .cal-dot.is-event{background:var(--accent)}
.home-cal-card .cal-dot.is-task{background:var(--warn)}
.home-cal-card .cal-dot.is-overdue{background:var(--bad)}

/* 侧栏：下个假期 + 本月关键日。月度标题与图例在大月历里已经有了，这里收掉 */
.home-cal-card .lp-side-top,
.home-cal-card .lp-side-legend{display:none}
.home-cal-card .lp-side-next{display:flex;align-items:baseline;flex-wrap:wrap;gap:2px 8px;padding:9px 11px;border-radius:10px;background:var(--accent-soft)}
.home-cal-card .lp-side-next.is-empty{background:var(--line-2)}
.home-cal-card .lp-side-next-label{font-size:11px;font-weight:650;letter-spacing:.03em;color:var(--ink-3)}
.home-cal-card .lp-side-next-name{font-size:14px;font-weight:750;color:var(--ink)}
.home-cal-card .lp-side-next-count{font-size:11.5px;font-weight:700;color:var(--accent)}
.home-cal-card .lp-side-next-date{margin-left:auto;font-size:11px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.home-cal-card .lp-side-list{list-style:none;margin:0;padding:0;display:grid;gap:1px;max-height:118px;overflow:auto;scrollbar-width:thin}
.home-cal-card .lp-side-row{display:flex;align-items:center;gap:8px;min-height:26px;padding:2px 6px;border-radius:6px;font-size:12px}
.home-cal-card .lp-side-row:hover{background:var(--line-2)}
.home-cal-card .lp-side-row b{flex:0 0 22px;text-align:right;font-size:11.5px;font-weight:700;color:var(--ink-3);font-variant-numeric:tabular-nums}
.home-cal-card .lp-side-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-2)}
.home-cal-card .lp-side-tag{flex:0 0 auto;padding:0 5px;border-radius:4px;font-size:10px;font-weight:700;line-height:1.7;background:var(--bad-soft);color:var(--bad)}
.home-cal-card .lp-side-row.is-term .lp-side-tag{background:var(--ok-soft);color:var(--ok)}
.home-cal-card .lp-side-empty{padding:4px 6px;font-size:11.5px;color:var(--ink-4)}

/* 手机 / 窄屏：两列折叠成一列。第一屏先给「今天的日程」——
   这是打开首页最想看的；月历紧随其后，点日期仍一键进月视图。 */
@media (max-width:1079px){
  .home-col{display:contents}
  .home-board{grid-template-columns:minmax(0,1fr);gap:16px}
  .home-card-events{order:1}
  .home-cal-card{order:2}
  .home-card-tasks{order:3}
  .home-card-brief{order:4}
  .home-card-exp{order:5}
  .home-card-srv{order:6}
  .home-card-stale{order:7}
  .home-card-links{order:8}
}

/* ===================================================================
   每日简报：列表页 + 阅读页
   进页面先看列表（一天一张卡，按月分组），点进去才读全文。
   读的时候左边是整篇目录（h1/h2/h3 全收，滚动跟着高亮），右边是正文；
   两栏加起来正好铺满 .main 的内容宽，中间只留 24px 的缝，不再叠左右留白。
   正文 18px / 1.85，窄屏 16.5px / 1.8。
   =================================================================== */

.brief-page{display:flex;flex-direction:column;gap:16px;min-width:0}

/* ---------- 刊头 ---------- */
.brief-hero{display:flex;flex-direction:column;gap:12px;padding:22px 24px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow)}
.brief-kicker{margin:0;font-size:11px;font-weight:750;letter-spacing:.14em;color:var(--accent)}
.brief-hero-row{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;flex-wrap:wrap}
.brief-hero-main{min-width:0}
.brief-h1{margin:0;font-size:30px;line-height:1.15;font-weight:750;letter-spacing:-.03em}
.brief-sub{margin:5px 0 0;font-size:13.5px;line-height:1.5;color:var(--ink-3)}
.brief-stats{display:flex;gap:20px;flex-wrap:wrap}
.brief-stat{display:flex;flex-direction:column;gap:1px;min-width:52px}
.brief-stat b{font-size:20px;line-height:1.1;font-weight:750;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.brief-stat span{font-size:11px;color:var(--ink-4)}
.brief-search{min-width:0}
/* .input 自带 max-width:260px，会把搜索框缩成一个小药丸；这里放开，让它铺满刊头一行 */
.brief-search-input{display:block;width:100%;max-width:none;min-height:44px;border-radius:12px;background:var(--bg)}

/* ---------- 列表：按月分组，卡片铺开 ---------- */
.brief-index{min-width:0}
.brief-month-b{margin:0 0 22px}
.brief-month-b:last-child{margin-bottom:0}
.brief-month-b-h{display:flex;align-items:baseline;gap:8px;margin:0 0 10px;font-size:14px;font-weight:750;color:var(--ink-2);letter-spacing:-.01em}
.brief-month-b-n{margin-left:auto;padding:0 7px;border-radius:999px;background:var(--line-2);font-size:10.5px;font-weight:600;line-height:1.7;color:var(--ink-4);font-variant-numeric:tabular-nums}
.brief-cards{display:grid;grid-template-columns:minmax(0,1fr);gap:12px}
@media (min-width:720px){.brief-cards{grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:14px}}
.brief-card{display:flex;flex-direction:column;width:100%;min-width:0;padding:0;overflow:hidden;border:1px solid var(--line);border-radius:16px;background:var(--card);box-shadow:var(--shadow);color:var(--ink);text-align:left;cursor:pointer;transition:border-color .15s,box-shadow .15s,transform .15s}
.brief-card:hover{border-color:var(--accent);box-shadow:var(--shadow-lg);transform:translateY(-2px)}
.brief-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.brief-card-media{display:block;position:relative;aspect-ratio:16/7;overflow:hidden;background:var(--line-2)}
.brief-card-media img{display:block;width:100%;height:100%;object-fit:cover}
.brief-card-body{display:flex;flex:1 1 auto;flex-direction:column;gap:8px;min-width:0;padding:15px 18px 14px}
.brief-card-top{display:flex;align-items:center;gap:9px;min-width:0}
.brief-card-day{font-size:26px;font-weight:800;line-height:.9;letter-spacing:-.03em;color:var(--ink);font-variant-numeric:tabular-nums}
.brief-card-ym{font-size:11.5px;font-weight:650;color:var(--ink-4);font-variant-numeric:tabular-nums;white-space:nowrap}
.brief-card-kicker{margin-left:auto;max-width:52%;padding:2px 9px;border-radius:999px;background:var(--accent-soft);font-size:10.5px;font-weight:700;color:var(--accent);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.brief-card-title{font-size:17px;font-weight:750;line-height:1.4;letter-spacing:-.015em;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* 没封面时整张卡靠文字撑，标题放大一号、多给一行，不然卡片显得空 */
.brief-card:not(.has-media) .brief-card-title{font-size:18px;-webkit-line-clamp:3}
.brief-card-excerpt{font-size:13px;line-height:1.6;color:var(--ink-3);overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.brief-card-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:9px;border-top:1px solid var(--line-2);font-size:11px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.brief-card-foot > span:last-child{margin-left:auto}

/* 骨架与空状态 */
.brief-skel-card{display:flex;flex-direction:column;gap:9px;padding:16px 18px;border:1px solid var(--line);border-radius:16px;background:var(--card)}
.brief-skel-l1,.brief-skel-l2,.brief-skel-l3{display:block;height:11px;border-radius:999px;background:var(--line-2)}
.brief-skel-l1{width:38%}
.brief-skel-l2{width:86%;height:15px}
.brief-skel-l3{width:64%}
.brief-skel-l1,.brief-skel-l2,.brief-skel-l3,.brief-loading span,.brief-loading i{animation:hub-pulse 1.4s ease-in-out infinite}
@keyframes hub-pulse{0%,100%{opacity:.5}50%{opacity:1}}

.brief-empty-list{padding:40px 12px;text-align:center}
.brief-empty-t{margin:0 0 6px;font-size:14.5px;font-weight:700;color:var(--ink-2)}
.brief-empty-d{margin:0 0 14px;font-size:12.5px;line-height:1.7;color:var(--ink-4)}
.brief-empty-d:last-child{margin-bottom:0}
.brief-empty-list .btn{margin:0 auto}

/* ---------- 阅读页 ---------- */
.brief-read{display:flex;flex-direction:column;gap:12px;min-width:0}
.brief-readbar{display:flex;align-items:center;gap:10px;min-width:0}
.brief-back{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-2);font-size:12.5px;font-weight:650;cursor:pointer}
.brief-back:hover{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}
.brief-toc-toggle{display:inline-flex;align-items:center;padding:6px 12px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-2);font-size:12.5px;font-weight:650;cursor:pointer}
.brief-toc-toggle:hover{border-color:var(--accent);color:var(--accent)}
.brief-read-date{margin-left:auto;font-size:12.5px;font-weight:650;color:var(--ink-3);font-variant-numeric:tabular-nums}

/* 目录 + 正文：加起来正好等于内容宽，中间 24px 的缝 */
.brief-read-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:start;min-width:0}
@media (min-width:1080px){
  .brief-read-grid{grid-template-columns:320px minmax(0,1fr);gap:24px}
  .brief-toc-toggle{display:none}
}
.brief-read-grid.no-rail{grid-template-columns:minmax(0,1fr)}
.brief-read-grid.no-rail .brief-rail{display:none}

/* 目录要一直贴住左侧：粘住的盒子只能在父盒子里走，
   网格默认 align-items:start 会让 aside 只有目录自身那么高，
   一滚就跟着页面跑没了 —— 让这一列撑满整行，内部盒子才有一整篇文章的行程。 */
.brief-rail{min-width:0;align-self:stretch}
.brief-rail-box{display:flex;flex-direction:column;padding:14px 12px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow)}
@media (min-width:1080px){
  .brief-rail-box{position:sticky;top:calc(var(--topbar-h) + 16px);max-height:calc(100dvh - var(--topbar-h) - 32px)}
  .brief-toc-tree{flex:1 1 auto;min-height:0;overflow:auto;scrollbar-width:thin;overscroll-behavior:contain}
}
.brief-rail-h{margin:0 0 8px;padding:0 6px;font-size:10.5px;font-weight:750;letter-spacing:.1em;color:var(--ink-4)}
.brief-toc-tree{list-style:none;margin:0;padding:0}
.brief-toc-node{margin:0;padding:0}
.brief-toc-link{display:flex;align-items:baseline;gap:6px;width:100%;padding:5px 8px;border:0;border-left:2px solid transparent;border-radius:0 8px 8px 0;background:none;color:var(--ink-3);font-size:12.5px;font-weight:500;line-height:1.4;text-align:left;cursor:pointer}
.brief-toc-link:hover{background:var(--line-2);color:var(--ink)}
.brief-toc-tx{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
.brief-toc-no{flex:0 0 auto;font-size:10.5px;font-weight:700;color:var(--ink-4);font-variant-numeric:tabular-nums;letter-spacing:.01em}
.brief-toc-node.lv1 > .brief-toc-link{font-size:13px;font-weight:750;color:var(--ink-2)}
.brief-toc-node.lv2{margin-top:7px}
.brief-toc-node.lv2:first-child{margin-top:0}
.brief-toc-node.lv2 > .brief-toc-link{padding:7px 8px 5px;font-size:12.5px;font-weight:700;color:var(--ink-2)}
.brief-toc-node.lv3{padding-left:8px}
.brief-toc-node.lv3 > .brief-toc-link{padding-left:14px;font-size:12px;font-weight:500;color:var(--ink-3)}
.brief-toc-node.is-on > .brief-toc-link{border-left-color:var(--accent);background:var(--accent-soft);color:var(--accent);font-weight:700}
.brief-toc-node.is-on > .brief-toc-link .brief-toc-no{color:var(--accent);opacity:.75}

/* 正文栏：不再限宽居中，直接吃掉目录剩下的全部宽度 */
.brief-article{min-width:0;padding:24px 20px 18px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow)}
@media (min-width:720px){.brief-article{padding:34px 44px 28px}}
.brief-art-head{margin:0 0 20px;padding-bottom:16px;border-bottom:1px solid var(--line-2)}
.brief-art-kicker{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 8px;font-size:11.5px;color:var(--ink-4)}
.brief-art-tag{padding:2px 8px;border-radius:999px;background:var(--accent-soft);font-size:10.5px;font-weight:750;letter-spacing:.06em;color:var(--accent)}
.brief-art-date{font-weight:600}
.brief-art-title{margin:0;font-size:27px;line-height:1.26;font-weight:750;letter-spacing:-.025em;overflow-wrap:anywhere}
@media (min-width:720px){.brief-art-title{font-size:36px}}
.brief-art-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:10px 0 0;font-size:12px;color:var(--ink-4)}
.brief-dot{opacity:.6}

/* 正文排版 */
/* 今日头条：生成端写在正文最前面的导语块，也是列表卡片标题和封面的唯一来源。
   用 accent 实色块压住正文，跟下面淡紫的生成说明拉开主次 —— 两个都是淡紫底的话，
   读者第一眼分不出哪个才是今天要看的。 */
.brief-lead{margin:0 0 24px;padding:19px 22px;border:0;border-radius:14px;background:var(--accent);color:#fff}
.brief-prose .brief-lead-t{margin:0;font-size:1.06em;font-weight:750;line-height:1.45;letter-spacing:-.015em;color:#fff}
.brief-prose .brief-lead-why{margin:8px 0 0;font-size:.86em;line-height:1.7;color:rgba(255,255,255,.85)}
.brief-prose .brief-lead figure{margin:14px 0 0}
.brief-prose .brief-lead img{display:block;width:100%;max-height:240px;object-fit:cover;border-radius:10px}
@media (min-width:720px){.brief-prose .brief-lead img{max-height:320px}}
.brief-prose{font-size:17px;line-height:1.85;color:var(--ink-2);overflow-wrap:break-word}
@media (min-width:720px){.brief-prose{font-size:18px}}
@media (min-width:1600px){.brief-prose{font-size:19px}}
.brief-prose > *:first-child{margin-top:0}
.brief-prose p{margin:0 0 1.15em}
.brief-prose > p:first-of-type{font-size:1.05em;color:var(--ink)}
.brief-prose h1,.brief-prose h2,.brief-prose h3,.brief-prose h4{color:var(--ink);line-height:1.4;letter-spacing:-.01em;scroll-margin-top:calc(var(--topbar-h) + 20px)}
.brief-prose h1{font-size:1.5em;margin:1.5em 0 .6em}
.brief-prose h2{font-size:1.32em;font-weight:750;margin:1.6em 0 .6em}
.brief-prose h2::before{content:"";display:block;width:26px;height:3px;margin-bottom:.35em;border-radius:2px;background:var(--accent)}
.brief-prose h3{font-size:1.14em;font-weight:700;margin:1.35em 0 .45em}
.brief-prose h4{font-size:1.02em;font-weight:700;margin:1.4em 0 .4em}
.brief-prose strong{color:var(--ink);font-weight:700}
.brief-prose ul,.brief-prose ol{margin:0 0 1.15em;padding-left:1.5em}
.brief-prose li{margin:.35em 0}
.brief-prose li::marker{color:var(--ink-4)}
.brief-prose blockquote{margin:1.4em 0;padding:12px 18px;border-left:3px solid var(--accent);border-radius:0 10px 10px 0;background:var(--accent-soft);color:var(--ink-2)}
.brief-prose blockquote p:last-child{margin-bottom:0}
.brief-prose a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;word-break:break-word}
.brief-prose code{padding:2px 5px;border-radius:5px;background:var(--line-2);color:var(--ink);font-family:var(--mono);font-size:.86em}
.brief-prose pre{margin:1.3em 0;padding:14px 16px;border:1px solid var(--line-2);border-radius:10px;background:var(--bg);overflow:auto;font-size:13px;line-height:1.6}
.brief-prose pre code{padding:0;background:none;font-size:inherit}
.brief-prose img{display:block;max-width:100%;height:auto;margin:1.4em auto;border:1px solid var(--line-2);border-radius:10px}
.brief-prose figure{margin:1.4em 0}
.brief-prose figcaption{margin-top:6px;text-align:center;font-size:12px;color:var(--ink-4)}
.brief-prose hr{margin:2em 0;border:0;border-top:1px solid var(--line)}
.brief-prose table{width:100%;margin:1.3em 0;border-collapse:collapse;font-size:.92em}
.brief-prose th,.brief-prose td{padding:8px 10px;border:1px solid var(--line);text-align:left;vertical-align:top}
.brief-prose th{background:var(--line-2);font-weight:700;color:var(--ink)}
.brief-prose mark{padding:0 2px;border-radius:3px;background:var(--warn-soft);color:inherit}
.brief-prose h1.is-flash,.brief-prose h2.is-flash,.brief-prose h3.is-flash{border-radius:6px;background:var(--accent-soft);box-shadow:0 0 0 6px var(--accent-soft);transition:background .2s}

/* 底部翻页：带标题，读完可以接着读 */
.brief-pager-row{display:grid;grid-template-columns:1fr;gap:10px;margin-top:30px;padding-top:20px;border-top:1px solid var(--line-2)}
@media (min-width:720px){.brief-pager-row{grid-template-columns:1fr 1fr}}
.brief-pager{display:flex;flex-direction:column;gap:2px;min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--card);color:var(--ink);text-align:left;cursor:pointer}
.brief-pager:hover{border-color:var(--accent);background:var(--accent-soft)}
.brief-pager.is-newer{align-items:flex-end;text-align:right}
.brief-pager-dir{font-size:10.5px;font-weight:700;letter-spacing:.06em;color:var(--ink-4)}
.brief-pager-t{max-width:100%;font-size:13.5px;font-weight:650;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.brief-pager-d{font-size:11px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.brief-pager.is-empty{opacity:.55;background:transparent;border-style:dashed;cursor:default}

/* 加载骨架 */
.brief-loading{display:flex;flex-direction:column;gap:10px;padding:40px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow)}
.brief-loading.is-inline{padding:6px 0 0;border:0;border-radius:0;background:none;box-shadow:none}
.brief-loading span,.brief-loading i{display:block}
.brief-loading-kicker{width:76px;height:10px;border-radius:999px;background:var(--line-2)}
.brief-loading-title{width:min(70%,420px);height:26px;margin-top:4px;border-radius:8px;background:var(--line-2)}
.brief-loading-meta{width:180px;height:10px;border-radius:999px;background:var(--line-2)}
.brief-loading-body{display:flex;flex-direction:column;gap:12px;margin-top:18px}
.brief-loading-body i{height:12px;border-radius:999px;background:var(--line-2)}
.brief-loading-body i:nth-child(3n){width:92%}
.brief-loading-body i:nth-child(4n){width:70%}

@media (max-width:1079px){
  /* 窄屏目录收成「目录」按钮下拉，正文独占整行 */
  .brief-rail{display:none}
  .brief-rail.is-open{display:block}
  .brief-rail-box{max-height:min(52vh,420px)}
  .brief-toc-tree{overflow:auto;scrollbar-width:thin}
  .brief-h1{font-size:26px}
  .brief-hero{padding:18px}
  .brief-stats{gap:14px}
}
@media (max-width:719px){
  .brief-page{gap:14px}
  .brief-hero{padding:16px}
  .brief-h1{font-size:24px}
  .brief-sub{font-size:12.5px}
  .brief-stat b{font-size:17px}
  .brief-article{padding:22px 16px 16px;border-radius:12px}
  .brief-art-title{font-size:23px}
  .brief-prose{font-size:16.5px;line-height:1.8}
  .brief-prose h2::before{width:22px;height:2px}
  .brief-card-title{font-size:16px}
  .brief-card:not(.has-media) .brief-card-title{font-size:17px}
  .brief-pager-row{margin-top:22px;padding-top:16px}
  .brief-loading{padding:26px 20px}
}

/* ================= 到期提醒 =================
   概览数字 → 分类筛选 → 按分类分组的卡片网格。
   卡片宽度锁在 236–300px 之间：到期项通常只有十来条，
   铺满整行会显得空，固定上限又保证一排能对齐。 */
.exp-body{display:flex;flex-direction:column;gap:16px;min-width:0}
.exp-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.exp-stat{display:flex;flex-direction:column;gap:1px;padding:11px 14px;border:1px solid var(--line-2);border-radius:var(--radius-sm);background:var(--bg);min-width:0}
.exp-stat b{font-size:20px;line-height:1.25;letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--ink)}
.exp-stat span{font-size:12px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.exp-stat.bad b{color:var(--bad)}
.exp-stat.warn b{color:var(--warn)}
.exp-stat.accent b{color:var(--accent)}

.exp-filter{display:flex;flex-wrap:wrap;gap:8px}
.exp-chip{display:inline-flex;align-items:center;gap:6px;min-height:34px;padding:0 13px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-2);font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background-color .16s,border-color .16s,color .16s}
.exp-chip:hover{border-color:#d6d8e4}
.exp-chip .n{font-size:11.5px;font-weight:700;color:var(--ink-4);font-variant-numeric:tabular-nums}
.exp-chip.is-on{border-color:transparent;background:var(--accent-soft);color:var(--accent)}
.exp-chip.is-on .n{color:var(--accent)}

.exp-groups{display:grid;grid-template-columns:repeat(auto-fill,minmax(252px,1fr));gap:18px 20px;align-items:start;min-width:0}
.exp-group{display:flex;flex-direction:column;gap:9px;min-width:0}
.exp-group-head{display:flex;align-items:baseline;gap:8px}
.exp-group-head h3{margin:0;font-size:13.5px;font-weight:700;color:var(--ink-2);letter-spacing:-.01em}
/* 看板里一类一列，卡片占满列宽；筛成单类时这一类铺开成多列卡阵 */
.exp-group .exp-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:10px}
.exp-group.is-wide{grid-column:1/-1}
.exp-group.is-wide .exp-grid{grid-template-columns:repeat(auto-fill,minmax(236px,300px));justify-content:start;gap:12px}

.exp-card{display:flex;flex-direction:column;gap:7px;min-width:0;padding:13px 15px;border:1px solid var(--line);border-left:3px solid var(--line);border-radius:var(--radius-sm);background:var(--card);box-shadow:0 1px 2px rgba(16,18,34,.03);transition:border-color .18s,box-shadow .2s,transform .18s var(--mo-ease-out),background-color .18s}
.exp-card:hover{box-shadow:var(--shadow);transform:translateY(-1px)}
.exp-card[data-sev="bad"]{border-left-color:var(--bad)}
.exp-card[data-sev="warn"]{border-left-color:var(--warn)}
.exp-card[data-sev="ok"]{border-left-color:var(--ok)}
.exp-card-head{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}
.exp-cat{flex:0 0 auto;font-size:11.5px;font-weight:700;padding:2px 9px;border-radius:999px;background:var(--line-2);color:var(--ink-3);white-space:nowrap;max-width:12em;overflow:hidden;text-overflow:ellipsis}
.exp-days{flex:0 0 auto;font-size:12px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap;font-variant-numeric:tabular-nums}
.exp-days.bad{background:var(--bad-soft);color:var(--bad)}
.exp-days.warn{background:var(--warn-soft);color:var(--warn)}
.exp-days.ok{background:var(--ok-soft);color:var(--ok)}
.exp-days.none{background:var(--line-2);color:var(--ink-4)}
.exp-name{margin:1px 0 0;font-size:15px;line-height:1.45;letter-spacing:-.01em;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
.exp-due{margin:0;font-size:12.5px;color:var(--ink-3)}
.exp-note{margin:0;font-size:12.5px;line-height:1.5;color:var(--ink-3);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
.exp-card-foot{display:flex;gap:6px;margin-top:auto;padding-top:9px;border-top:1px solid var(--line-2)}
.exp-card-foot .btn{min-height:34px;padding:0 11px;font-size:12.5px;border-radius:8px}
.exp-card-foot .exp-del:hover{background:var(--bad-soft);color:var(--bad)}

[data-theme="dark"] .exp-chip:hover{border-color:#333b55}
[data-theme="dark"] .exp-card{box-shadow:none}

@media (max-width:719px){
  .exp-summary{grid-template-columns:repeat(2,1fr)}
  .exp-groups{grid-template-columns:minmax(0,1fr)}
  .exp-group.is-wide .exp-grid{grid-template-columns:minmax(0,1fr)}
  .exp-card{padding:12px 14px}
}

/* ================= 快捷入口分类 =================
   分类筛选 → 按分类分组的卡片墙。分类是自由文本（「1号服务器」这类），
   「未分类」排最后；组内仍按原有 sort 排，拖动只在同组内生效。 */
.pick-groups{display:flex;flex-direction:column;gap:18px;min-width:0}
.link-group{display:flex;flex-direction:column;gap:8px;min-width:0}
.link-group-head{display:flex;align-items:baseline;gap:8px;padding:0 2px}
.link-group-head h3{margin:0;font-size:13.5px;font-weight:700;color:var(--ink-2);letter-spacing:-.01em}

.link-filter{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.link-chip{display:inline-flex;align-items:center;gap:6px;min-height:34px;padding:0 13px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-2);font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background-color .16s,border-color .16s,color .16s}
.link-chip:hover{border-color:#d6d8e4}
.link-chip .n{font-size:11.5px;font-weight:700;color:var(--ink-4);font-variant-numeric:tabular-nums}
.link-chip.is-on{border-color:transparent;background:var(--accent-soft);color:var(--accent)}
.link-chip.is-on .n{color:var(--accent)}

.link-foot-meta{display:flex;align-items:center;gap:7px;min-width:0}
.link-foot-meta .when{min-width:0}
.link-cat{flex:0 0 auto;max-width:10em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;font-weight:700;padding:2px 9px;border-radius:999px;background:var(--line-2);color:var(--ink-3)}

[data-theme="dark"] .link-chip:hover{border-color:#333b55}

@media (max-width:719px){
  .pick-groups{gap:14px}
  .link-filter{gap:6px;margin-bottom:12px}
  .link-chip{min-height:32px;padding:0 11px;font-size:12.5px}
  .link-cat{max-width:7em}
}

/* ================= 订阅信息流（A1） =================
   筛选条 + 条目流。不做左右分栏：手机上左栏会把正文挤成一条缝，
   而订阅源的唯一用途就是「切到某个源」，一排胶囊按钮就够了。 */
.feed-bar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}
.feed-chip .nm{max-width:14em;overflow:hidden;text-overflow:ellipsis}
.feed-chip .dot-status{width:7px;height:7px;box-shadow:none}
.feed-chip.is-broken{border-color:var(--bad)}
.feed-tools{display:flex;gap:8px;margin-bottom:14px;min-width:0}
/* .input 自带 max-width:260px，搜索框要铺满一行 */
.feed-search{flex:1 1 auto;max-width:none;min-width:0}
.feed-list{display:flex;flex-direction:column;gap:10px;min-width:0}
.feed-loading{margin:0;padding:16px 2px}

.feed-item{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);transition:border-color .16s,background-color .16s}
.feed-item:hover{border-color:#d6d8e4}
/* 未读只加一层极淡的底和一枚小点：整卡加粗会把已读条目也推得发胀 */
.feed-item.is-unread{background:var(--accent-soft)}
.feed-item-main{flex:1 1 auto;min-width:0}
.feed-item-top{display:flex;align-items:baseline;gap:7px;min-width:0}
.feed-unread-dot{flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--accent);transform:translateY(-2px)}
.feed-item-title{font-size:14px;font-weight:600;line-height:1.45;color:var(--ink-2);text-decoration:none;overflow-wrap:anywhere}
.feed-item-title:hover{color:var(--accent)}
.feed-item.is-unread .feed-item-title{font-weight:700;color:var(--ink)}
.feed-item-sum{margin:4px 0 0;font-size:12.5px;line-height:1.55;color:var(--ink-3);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.feed-item-meta{display:flex;align-items:center;gap:8px;margin-top:7px;font-size:11.5px;color:var(--ink-4);min-width:0}
.feed-src{max-width:12em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;padding:1px 8px;border-radius:999px;background:var(--line-2);color:var(--ink-3)}
.feed-read-btn{flex:0 0 auto}

.feed-manage{display:flex;flex-direction:column;max-height:52vh;overflow:auto;min-width:0}
.feed-manage-row{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;padding:10px 0;border-bottom:1px solid var(--line)}
.feed-manage-row:last-child{border-bottom:0}
.feed-manage-main{display:flex;flex-direction:column;gap:3px;min-width:0}
.feed-manage-ops{display:flex;gap:6px;flex:0 0 auto}
.feed-err{color:var(--bad);overflow-wrap:anywhere}

[data-theme="dark"] .feed-item:hover{border-color:#333b55}

@media (max-width:719px){
  .feed-bar{gap:6px;margin-bottom:8px}
  .feed-tools{margin-bottom:10px}
  .feed-item{padding:10px 12px;gap:8px}
  .feed-item-sum{-webkit-line-clamp:3}
  .feed-manage-row{flex-direction:column}
  .feed-manage-ops{align-self:flex-end}
}

/* ================= 命令面板（A2） =================
   顶部第三条留白处落下，不是正中：面板打开时人还在看页面，
   居中会像「打断」，靠上更像「补一行输入框」。 */
.palette-mask{position:fixed;inset:0;z-index:130;display:flex;align-items:flex-start;justify-content:center;padding:12vh 16px 16px;background:rgba(15,18,34,.34);backdrop-filter:blur(2px);animation:hub-fade-in .16s var(--mo-ease) both}
.palette-card{display:flex;flex-direction:column;width:100%;max-width:560px;max-height:min(64vh,560px);background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);overflow:hidden;animation:hub-pop .22s var(--mo-ease-out) both}
.palette-input{width:100%;padding:15px 18px;border:0;border-bottom:1px solid var(--line);background:transparent;color:var(--ink);font:inherit;font-size:15px;outline:none}
.palette-input::placeholder{color:var(--ink-4)}
.palette-list{flex:1 1 auto;min-height:0;padding:6px;overflow:auto}
.palette-item{display:flex;align-items:center;gap:10px;width:100%;padding:9px 12px;border:0;border-radius:8px;background:transparent;color:var(--ink-2);font:inherit;font-size:14px;text-align:left;cursor:pointer}
.palette-item.is-on{background:var(--accent-soft);color:var(--ink)}
.palette-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.palette-hint{flex:0 0 auto;font-size:11.5px;color:var(--ink-4)}
.palette-item.is-on .palette-hint{color:var(--accent)}
.palette-empty{margin:0;padding:18px 12px;font-size:13px;color:var(--ink-4);text-align:center}
.palette-foot{margin:0;padding:8px 14px;border-top:1px solid var(--line);font-size:11.5px;color:var(--ink-4)}
[data-theme="dark"] .palette-mask{background:rgba(4,6,12,.58)}

@media (max-width:719px){
  .palette-mask{padding:8vh 10px 10px}
  .palette-card{max-height:min(70vh,600px)}
  .palette-item{min-height:40px;font-size:13.5px}
}

/* ==========================================================================
   笔记（A4）：左边列表、右边正文；手机上换成列表 / 正文两屏
   ========================================================================== */
.notes-bar{display:flex;gap:8px;flex-wrap:wrap;padding:0 0 10px}
.note-tag-chip .n{color:var(--ink-4)}
/* 工具条：搜索框吃掉剩余宽度，按钮不参与收缩，窄屏时按钮整体掉到下一行而不是挤成竖排 */
.notes-tools{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:14px}
.notes-tools>.btn{flex:0 0 auto;white-space:nowrap}
.notes-search{flex:1 1 320px;max-width:720px;min-width:200px}
.notes-sort{flex:0 0 auto;width:auto;min-width:104px}
.note-folder-pick{display:none}

/* 宽屏三栏：文件夹树 / 列表 / 正文。窄一档收成两栏（文件夹改下拉），手机上仍是两屏 */
.notes-split{display:grid;grid-template-columns:220px 320px minmax(0,1fr);gap:var(--note-space-4);align-items:start}

/* 笔记模块铺满整屏：route-notes 由 app.js 切换视图时挂在 #main 上。
   主栏取消 1600px 上限，阅读正文也不再用 760px 居中，而是吃掉正文栏的全部宽度；
   有目录时目录仍固定在右侧 186px。其它模块不受影响。 */
.main.route-notes{max-width:none}
.route-notes .note-view-skeleton{max-width:none}
.route-notes .note-read .note-md{max-width:none}
.route-notes .note-read.has-toc{grid-template-columns:minmax(0,1fr) 186px}

.note-folders{display:flex;flex-direction:column;gap:1px;max-height:calc(100vh - 250px);overflow:auto;padding:8px 6px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card)}
.note-folders::-webkit-scrollbar{width:8px}
.note-folders-head{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:1px 6px 7px}
.note-folders-title{font-size:12px;font-weight:700;color:var(--ink-3);letter-spacing:.02em}
.note-folder-add{width:24px;height:24px;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--ink-3);font:inherit;font-size:14px;line-height:1;cursor:pointer}
.note-folder-add:hover{border-color:var(--accent);color:var(--accent)}
.note-folder-row{display:flex;align-items:center;gap:1px;border-radius:7px;transition:background-color .14s}
.note-folder-row:hover{background:var(--bg)}
.note-folder-row.is-on{background:var(--accent-soft)}
.note-folder-row.is-dragging{opacity:.45}
.note-folder-row.is-drop{outline:1px dashed var(--accent);outline-offset:-1px}
.note-folder-row[draggable="true"]{cursor:grab}
.note-folder-caret{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:18px;height:27px;padding:0;border:0;background:none;color:var(--ink-4);font:inherit;font-size:10px;line-height:1;cursor:pointer}
.note-folder-caret .note-ico{width:12px;height:12px;vertical-align:0;transition:transform var(--note-dur-fast) var(--note-ease)}
.note-folder-caret.is-open .note-ico{transform:rotate(90deg)}
.note-folder-caret.is-empty{visibility:hidden;pointer-events:none}
.note-folder-name .note-folder-dot{width:6px;height:6px}
.note-folder-name{flex:1 1 auto;display:flex;align-items:center;gap:5px;min-width:0;padding:5px 4px;border:0;background:none;color:var(--ink-2);font:inherit;font-size:13px;text-align:left;cursor:pointer}
.note-folder-name .nm{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.note-folder-name .n{flex:0 0 auto;font-size:11px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.note-folder-row.is-on .note-folder-name{color:var(--accent);font-weight:600}
.note-folder-actions{display:flex;flex-wrap:wrap;gap:2px;margin-top:6px;padding:6px 4px 0;border-top:1px solid var(--line)}
.note-folder-actions .btn{padding:2px 6px;font-size:11.5px}

.note-list-pane{min-width:0}
.note-list-foot{display:flex;align-items:center;justify-content:center;padding:10px 0 2px}
.note-load-more{width:100%}
.note-bulkbar{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:8px 10px;margin-bottom:8px;border:1px solid var(--accent);border-radius:var(--radius-sm);background:var(--accent-soft)}
.note-bulkbar[hidden]{display:none}
.note-bulk-count{flex:1 1 100%;font-size:12px;font-weight:600;color:var(--accent)}
.note-bulkbar .btn[disabled]{opacity:.5;cursor:not-allowed}
.note-pick{position:absolute;top:8px;right:9px;display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;border:1.5px solid var(--line);border-radius:5px;background:var(--card);color:var(--card);font-size:11px;line-height:1}
.note-pick.is-on{border-color:var(--accent);background:var(--accent)}
.note-card.is-picked{border-color:var(--accent);background:var(--accent-soft)}

/* R-40：图标统一用内联 lucide SVG（NOTE_ICONS），这里只负责尺寸和基线 */
.note-ico{display:inline-block;width:15px;height:15px;flex:0 0 auto;vertical-align:-2px}
.note-ico-lg{width:24px;height:24px}
.btn .note-ico,.note-state .btn .note-ico{width:14px;height:14px}

.note-list{display:flex;flex-direction:column;gap:var(--note-space-2);max-height:calc(100vh - 280px);overflow:auto;padding-right:2px}
.note-list::-webkit-scrollbar{width:8px}
.note-card{position:relative;display:flex;flex-direction:column;gap:6px;width:100%;padding:12px 14px;border:1px solid var(--note-line);border-radius:var(--note-radius-sm);background:var(--note-surface);color:inherit;font:inherit;text-align:left;cursor:pointer;transition:border-color var(--note-dur) var(--note-ease),background-color var(--note-dur) var(--note-ease),box-shadow var(--note-dur) var(--note-ease)}
.note-card:hover{border-color:var(--note-line-strong);background:var(--note-surface-2);box-shadow:var(--note-shadow-hover)}
.note-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.note-card.is-on{border-color:var(--accent);background:var(--accent-soft)}
.note-card.is-on::before{content:"";position:absolute;left:0;top:9px;bottom:9px;width:3px;border-radius:0 3px 3px 0;background:var(--accent)}
.note-card-top{display:flex;align-items:flex-start;gap:5px;min-width:0}
.note-pin{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;height:19px;color:var(--warn)}
.note-pin .note-ico{width:13px;height:13px}
.note-card-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:14px;line-height:1.4;font-weight:650;color:var(--ink);overflow-wrap:anywhere}
.note-excerpt{font-size:12.5px;line-height:1.5;color:var(--ink-3);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
.note-card-tags{display:block;min-width:0}
.note-card-tags .note-tags,.note-card-tags .note-tag{max-width:100%}
.note-card-tags .note-tag{overflow:hidden;text-overflow:ellipsis}
.note-tag-more{background:transparent;border:1px dashed var(--note-line-strong);color:var(--ink-4);cursor: default}
.note-card-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11.5px;color:var(--ink-4);min-width:0}
.note-card-foot .note-folder{overflow:hidden}
.note-folder{display:inline-flex;align-items:center;gap:5px;padding:1px 8px;border-radius:999px;background:var(--line-2);color:var(--ink-3);font-size:11px;font-weight:600;white-space:nowrap;min-width:0}
.note-folder>span:last-child{overflow:hidden;text-overflow:ellipsis}
.note-folder-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;display:inline-block;background:var(--ink-4)}
.note-meta .note-folder{background:transparent;padding:0}
.note-meta .note-folder-dot{width:8px;height:8px}
.note-tags{display:flex;flex-wrap:wrap;gap:4px}
.note-tag{display:inline-flex;padding:1px 7px;border-radius:999px;background:var(--line-2);color:var(--ink-4);font-size:11px;white-space:nowrap}
.note-tag.is-btn{border:0;font:inherit;font-size:11px;cursor:pointer}
.note-tag.is-btn:hover{background:var(--accent-soft);color:var(--accent)}

/* 悬停/键盘聚焦时才出现的快捷操作；触屏没有 hover，保持不占位 */
.note-card-ops{position:absolute;right:8px;bottom:8px;display:flex;gap:1px;padding:2px;border:1px solid var(--note-line);border-radius:8px;background:var(--note-surface);box-shadow:var(--note-shadow);opacity:0;visibility:hidden;transform:translateY(2px);transition:opacity var(--note-dur-fast) var(--note-ease),transform var(--note-dur-fast) var(--note-ease),visibility 0s linear var(--note-dur-fast)}
.note-card:hover .note-card-ops,.note-card:focus-within .note-card-ops{opacity:1;visibility:visible;transform:none;transition-delay:0s}
.note-card-op{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;border:0;border-radius:6px;background:transparent;color:var(--ink-4);cursor:pointer}
.note-card-op:hover{background:var(--line-2);color:var(--ink)}
.note-card-op.is-danger:hover{background:var(--bad-soft);color:var(--bad)}
.note-card-op .note-ico{width:14px;height:14px;vertical-align:0}
@media (hover:none){.note-card-ops{display:none}}

/* 骨架屏：高度对齐真实卡片，接口回来时列表不跳 */
.note-skeleton{display:flex;flex-direction:column;gap:var(--note-space-2)}
.note-skeleton-card{display:flex;flex-direction:column;gap:8px;height:132px;box-sizing:border-box;padding:12px 14px;border:1px solid var(--note-line);border-radius:var(--note-radius-sm);background:var(--note-surface)}
.note-skeleton-line{display:block;height:10px;border-radius:999px;background:linear-gradient(90deg,var(--line-2) 25%,var(--line) 37%,var(--line-2) 63%);background-size:400% 100%;animation:noteShimmer 1.4s ease-in-out infinite}
.note-skeleton-line.is-title{height:14px;width:62%}
.note-skeleton-line.is-short{width:48%}
.note-skeleton-line.is-meta{width:30%}
.note-skeleton-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--line)}
.note-skeleton-foot{display:flex;align-items:center;gap:7px;margin-top:auto}
.note-view-skeleton{display:flex;flex-direction:column;gap:12px;max-width:760px;padding:26px 24px;border:1px solid var(--note-line);border-radius:var(--note-radius);background:var(--note-surface)}
.note-view-skeleton .is-title{height:20px;width:52%}
@keyframes noteShimmer{0%{background-position:100% 0}100%{background-position:0 0}}

/* 空状态 / 搜索无结果 / 加载失败：图标 + 标题 + 说明 + 下一步 */
.note-state{display:flex;flex-direction:column;align-items:center;gap:6px;padding:36px 18px;border:1px dashed var(--note-line);border-radius:var(--note-radius);background:var(--note-surface);text-align:center;color:var(--ink-3)}
.note-state-icon{display:inline-flex;align-items:center;justify-content:center;width:46px;height:46px;margin-bottom:2px;border-radius:50%;background:var(--line-2);color:var(--ink-3)}
.note-state-title{margin:0;font-size:14px;font-weight:650;color:var(--ink)}
.note-state-desc{margin:0;max-width:34em;font-size:12.5px;line-height:1.6;color:var(--ink-4);overflow-wrap:anywhere}
.note-state-ops{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:8px}
.note-state.is-error{border-color:var(--bad);background:var(--bad-soft)}
.note-state.is-error .note-state-icon{background:var(--card);color:var(--bad)}
.note-state.is-error .note-state-title{color:var(--ink)}

/* 首次挂载才播放入场；筛选/翻页只换内容不重播。reduced-motion 由全局规则关掉 */
@keyframes noteCardIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.note-card.is-enter,.note-state.is-enter{animation:noteCardIn var(--note-dur-slow) var(--note-ease) both}
.note-card.is-enter:nth-child(2){animation-delay:16ms}
.note-card.is-enter:nth-child(3){animation-delay:32ms}
.note-card.is-enter:nth-child(4){animation-delay:48ms}
.note-card.is-enter:nth-child(n+5){animation-delay:64ms}

.note-detail{min-width:0}
.note-empty{margin-top:0}
.note-view{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;box-shadow:var(--shadow)}
.note-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.note-title{flex:1 1 auto;min-width:0;margin:0;font-size:20px;line-height:1.35;font-weight:700;color:var(--ink);word-break:break-word}
.note-head-ops{display:flex;gap:4px;flex-wrap:wrap;margin-left:auto}
.note-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:8px 0 10px;font-size:12px;color:var(--ink-4)}
.note-meta .when.is-bad{color:var(--bad)}
.note-trash-banner{margin:10px 0 4px;padding:8px 11px;border-radius:var(--radius-sm);background:var(--warn-soft);color:var(--ink-2);font-size:12.5px;line-height:1.6}
.note-view .note-tags{margin-bottom:10px}
.notes-back{display:none}

.note-md{font-size:14px;line-height:1.72;color:var(--ink-2);overflow-wrap:anywhere}
.note-md>:first-child{margin-top:0}
.note-md>:last-child{margin-bottom:0}
.note-md h1,.note-md h2,.note-md h3,.note-md h4,.note-md h5,.note-md h6{margin:18px 0 8px;line-height:1.4;color:var(--ink);font-weight:700}
.note-md h1{font-size:20px}
.note-md h2{font-size:17px}
.note-md h3{font-size:15.5px}
.note-md h4,.note-md h5,.note-md h6{font-size:14.5px}
.note-md p{margin:0 0 10px}
.note-md ul,.note-md ol{margin:0 0 10px;padding-left:22px}
.note-md li{margin:2px 0}
.note-md blockquote{margin:0 0 10px;padding:2px 0 2px 12px;border-left:3px solid var(--line);color:var(--ink-3)}
.note-md pre{margin:0 0 12px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--bg);overflow:auto}
.note-md pre code{padding:0;background:none;font-size:12.5px}
.note-md code{padding:1px 5px;border-radius:5px;background:var(--line-2);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px}
.note-md a{color:var(--accent);text-decoration:none}
.note-md a:hover{text-decoration:underline}
.note-md hr{margin:16px 0;border:0;border-top:1px solid var(--line)}
.note-md img{max-width:100%;border-radius:var(--radius-sm)}

/* 阅读排版（R-37）：正文最大 760px、行高 1.75；有目录时右侧栏跟随滚动 */
.note-read{display:block;min-width:0}
.note-read .note-md{max-width:760px;margin:0 auto;line-height:1.75}
.note-read.has-toc{display:grid;grid-template-columns:minmax(0,760px) 186px;gap:26px;align-items:start;justify-content:center}
.note-toc{position:sticky;top:calc(var(--topbar-h) + 16px);max-height:calc(100vh - var(--topbar-h) - 40px);overflow:auto;padding:8px 0 10px 12px;border-left:1px solid var(--line);font-size:12px;line-height:1.5}
.note-toc-title{margin:0 0 6px;padding-left:8px;color:var(--ink-4);font-weight:700;letter-spacing:.04em}
.note-toc-link{display:block;margin-left:-13px;padding:3px 0 3px 8px;border-left:2px solid transparent;color:var(--ink-4);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.note-toc-link.is-h2{padding-left:18px}
.note-toc-link.is-h3{padding-left:28px}
.note-toc-link:hover{color:var(--ink)}
.note-toc-link.is-on{border-left-color:var(--accent);color:var(--accent);font-weight:600}
.note-stats{font-variant-numeric:tabular-nums}

.note-edit{display:flex;flex-direction:column;gap:10px;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;box-shadow:var(--shadow)}
.note-edit-meta{display:grid;grid-template-columns:1fr 1fr;gap:8px}
/* 每个输入框都带看得见的标签：占位符一输入就没了，标签不会（R-30） */
.note-field{display:flex;flex-direction:column;gap:4px;min-width:0}
.note-field-label{font-size:12px;font-weight:600;line-height:1.3;color:var(--ink-3)}
.note-edit .input{max-width:none}
.note-title-input{font-size:16px;font-weight:600;min-height:44px}
.note-body-input{min-height:260px;padding:10px 12px;line-height:1.65;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;resize:vertical}
.note-preview{min-height:260px;border:1px dashed var(--line);border-radius:var(--radius-sm);padding:12px 14px;background:var(--bg)}
.note-edit-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px;color:var(--ink-4)}
.note-count{white-space:nowrap}
/* 有没保存到服务端的改动：字数旁边给个琥珀色状态，别让「自动存草稿」看起来像已保存 */
.note-count.is-dirty{color:var(--warn);font-weight:600}
.note-count.is-saved{color:var(--ok)}
.note-count.is-bad{color:var(--bad);font-weight:600}
/* 另一处已更新：停在提示条，等用户选版本，不自动覆盖 */
.note-conflict{margin:0;padding:10px 12px;border:1px solid var(--bad);border-radius:var(--radius-sm);background:var(--bad-soft);color:var(--ink-2);font-size:12.5px;line-height:1.6}
.note-conflict[hidden]{display:none}
.note-conflict p{margin:0 0 8px}
.note-conflict-ops{display:flex;flex-wrap:wrap;gap:6px}

/* 富文本编辑器：工具栏和书写区拼成一块，中间不留缝 */
.note-canvas{display:flex;flex-direction:column;min-width:0}
.note-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:3px;padding:6px 8px;border:1px solid var(--line);border-bottom:0;border-radius:var(--radius-sm) var(--radius-sm) 0 0;background:var(--bg)}
.note-tb-btn{min-width:30px;height:30px;padding:0 7px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--ink-2);font:inherit;font-size:13px;font-weight:600;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.note-tb-btn:hover{background:var(--line-2);color:var(--ink)}
.note-tb-btn:active{transform:translateY(1px)}
/* 当前光标处已生效的格式：按钮保持按下态，不然点完不知道到底设没设上（R-33） */
.note-tb-btn.is-on{background:var(--accent-soft);color:var(--accent);border-color:var(--accent)}
/* 桌面上「更多格式」的容器直接铺开，22 个控件一行排；手机上再收成可展开面板（R-28） */
.note-tb-more{display:contents}
.note-tb-more-btn{display:none}
.note-tb-sep{width:1px;height:18px;margin:0 3px;background:var(--line)}
.note-tb-select{height:30px;padding:0 3px;border:1px solid var(--line);border-radius:7px;background:var(--card);color:var(--ink-2);font:inherit;font-size:12.5px;cursor:pointer}
.note-tb-colorwrap{position:relative;display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:7px;color:var(--ink-2);font-size:13px;font-weight:700;cursor:pointer}
.note-tb-colorwrap:hover{background:var(--line-2)}
.note-tb-colorwrap.is-mark span{background:var(--warn-soft);border-radius:3px;padding:0 2px}
.note-tb-color{position:absolute;inset:0;width:100%;height:100%;padding:0;border:0;opacity:0;cursor:pointer}
.note-rich{min-height:300px;max-height:calc(100vh - 360px);overflow:auto;padding:14px 16px;border:1px solid var(--line);border-radius:0 0 var(--radius-sm) var(--radius-sm);background:var(--card);color:var(--ink-2);font-size:14px;line-height:1.72;outline:none;overflow-wrap:anywhere}
.note-rich:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.note-rich:empty::before{content:attr(data-placeholder);color:var(--ink-4);pointer-events:none}
.note-rich>:first-child{margin-top:0}
.note-rich h1,.note-rich h2,.note-rich h3,.note-rich h4,.note-rich h5,.note-rich h6{margin:18px 0 8px;line-height:1.4;color:var(--ink);font-weight:700}
.note-rich h1{font-size:20px}
.note-rich h2{font-size:17px}
.note-rich h3{font-size:15.5px}
.note-rich h4,.note-rich h5,.note-rich h6{font-size:14.5px}
.note-rich p{margin:0 0 10px}
.note-rich ul,.note-rich ol{margin:0 0 10px;padding-left:22px}
.note-rich li{margin:2px 0}
.note-rich blockquote{margin:0 0 10px;padding:2px 0 2px 12px;border-left:3px solid var(--line);color:var(--ink-3)}
.note-rich pre{margin:0 0 12px;padding:12px 14px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--bg);overflow:auto}
.note-rich code{padding:1px 5px;border-radius:5px;background:var(--line-2);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px}
.note-rich a{color:var(--accent);text-decoration:none}
.note-rich hr{margin:16px 0;border:0;border-top:1px solid var(--line)}

/* R-35：TipTap 内核的块级能力。外壳只负责布局，样式仍沿用上面的 .note-rich 排版。 */
.note-editor-host{display:flex;flex-direction:column;min-width:0}
.note-editor-fail{margin:0;padding:14px 16px;border:1px solid var(--line);border-radius:0 0 var(--radius-sm) var(--radius-sm);background:var(--card);color:var(--bad);font-size:13px;line-height:1.6}
/* TipTap 的空段落占位：ProseMirror 里永远有一个 <p>，所以 :empty 不成立 */
.note-rich p.is-editor-empty:first-child::before{content:attr(data-placeholder);float:left;height:0;color:var(--ink-4);pointer-events:none}
.note-rich .note-code{white-space:pre-wrap}
.note-rich pre code{padding:0;background:none;border-radius:0;color:var(--ink-2);font-size:12.5px}
/* 代码块工具条：语言选择 + 复制；<pre> 让位给外层圆角边框 */
.note-rich .note-codeblock{margin:0 0 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--bg);overflow:hidden}
.note-rich .note-codeblock pre{margin:0;padding:12px 14px;border:0;border-radius:0;background:none}
.note-codebar{display:flex;align-items:center;gap:8px;padding:4px 6px;border-bottom:1px solid var(--line);background:var(--card)}
.note-codelang{height:24px;padding:0 4px;border:1px solid var(--line);border-radius:6px;background:var(--card);color:var(--ink-3);font:inherit;font-size:11.5px;cursor:pointer}
.note-codecopy{height:24px;margin-left:auto;padding:0 9px;border:1px solid var(--line);border-radius:6px;background:var(--card);color:var(--ink-3);font:inherit;font-size:11.5px;cursor:pointer}
.note-codecopy:hover{border-color:var(--accent);color:var(--accent)}
.note-rich table{border-collapse:collapse;width:100%;margin:0 0 12px;table-layout:fixed}
.note-rich th,.note-rich td{min-width:48px;padding:6px 9px;border:1px solid var(--line);text-align:left;vertical-align:top;overflow-wrap:anywhere}
.note-rich th{background:var(--bg);color:var(--ink);font-weight:650}
.note-rich img{display:block;max-width:100%;height:auto;margin:6px 0 12px;border-radius:var(--radius-sm)}
.note-rich ul[data-type="taskList"]{padding-left:2px;list-style:none}
.note-rich ul[data-type="taskList"] li{display:flex;align-items:flex-start;gap:8px;margin:3px 0}
.note-rich ul[data-type="taskList"] li>label{flex:0 0 auto;display:inline-flex;align-items:center;padding-top:3px;user-select:none}
.note-rich ul[data-type="taskList"] li>label input{width:15px;height:15px;margin:0;accent-color:var(--accent);cursor:pointer}
.note-rich ul[data-type="taskList"] li>div{flex:1 1 auto;min-width:0}
.note-rich ul[data-type="taskList"] li>div>p{margin:0 0 4px}
.note-rich ul[data-type="taskList"] li[data-checked="true"]>div{color:var(--ink-4);text-decoration:line-through}

/* 选中文字浮出的 Bubble 菜单（挂到 body，fixed 定位由内核计算） */
.note-bubble{display:flex;align-items:center;gap:2px;padding:4px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);box-shadow:var(--shadow);z-index:60}
.note-bubble-btn{min-width:28px;height:28px;padding:0 6px;border:0;border-radius:6px;background:transparent;color:var(--ink-2);font:inherit;font-size:12.5px;font-weight:650;line-height:1;cursor:pointer}
.note-bubble-btn:hover{background:var(--line-2);color:var(--ink)}
.note-bubble-btn.is-on{background:var(--accent-soft);color:var(--accent)}

/* 块左侧的拖动把手（由内核定位，绝对坐标） */
.note-drag-handle{display:flex;align-items:center;justify-content:center;width:22px;height:24px;border-radius:6px;color:var(--ink-4);font-size:14px;line-height:1;cursor:grab;user-select:none}
.note-drag-handle:hover{background:var(--line-2);color:var(--ink)}
.note-drag-handle:active{cursor:grabbing}

/* 斜杠命令：输入「/」就地选块类型 */
.note-slash{position:fixed;z-index:70;display:flex;flex-direction:column;width:248px;max-height:min(320px,60vh);overflow:auto;padding:5px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card);box-shadow:var(--shadow)}
.note-slash[hidden]{display:none}
.note-slash-item{display:flex;align-items:baseline;gap:10px;width:100%;padding:8px 10px;border:0;border-radius:7px;background:transparent;color:var(--ink-2);font:inherit;text-align:left;cursor:pointer}
.note-slash-item:hover,.note-slash-item.is-on{background:var(--accent-soft);color:var(--ink)}
.note-slash-item.is-on .note-slash-label{color:var(--accent)}
.note-slash-label{flex:0 0 auto;font-size:13px;font-weight:600}
.note-slash-hint{margin-left:auto;font-size:11.5px;color:var(--ink-4);white-space:nowrap}

/* 查看密码：没设过 → 设置页；设过 → 解锁页 */
.notes-lock{display:flex;justify-content:center;padding:44px 16px 64px}
.notes-lock-card{display:flex;flex-direction:column;gap:10px;width:100%;max-width:420px;padding:30px 28px;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);text-align:center}
.notes-lock-icon{font-size:34px;line-height:1;margin-bottom:2px}
.notes-lock-title{margin:0;font-size:19px;line-height:1.4;color:var(--ink)}
.notes-lock-desc{margin:0 0 6px;font-size:13px;line-height:1.7;color:var(--ink-3)}
.notes-lock-card .input{max-width:none;text-align:center}
.notes-lock-error{min-height:18px;font-size:12.5px;line-height:1.5;color:var(--bad)}
.notes-lock-btn{width:100%;min-height:42px}
.notes-lock-hint{margin:2px 0 0;font-size:12px;line-height:1.6;color:var(--ink-4)}
.notes-lock-forgot{align-self:center;margin-top:2px}
/* 设置页把「查看密码」和「密保问题」分成两段，别让五个输入框糊成一团 */
.notes-lock-split{display:flex;align-items:center;gap:10px;margin:6px 0 0;font-size:11.5px;line-height:1.4;color:var(--ink-4);white-space:nowrap}
.notes-lock-split::before,.notes-lock-split::after{content:"";flex:1;height:1px;background:var(--line)}

[data-theme="dark"] .note-card:hover{border-color:#3a4056;background:#0f1420}
[data-theme="dark"] .note-card.is-on{background:#232848}
[data-theme="dark"] .note-md pre,[data-theme="dark"] .note-preview,[data-theme="dark"] .note-rich pre{background:#0f1420}
/* 代码块工具条已经给了整块底色，内层 <pre> 再铺一层会露边 */
[data-theme="dark"] .note-rich .note-codeblock pre{background:transparent}
[data-theme="dark"] .note-toolbar{background:#0f1420}
[data-theme="dark"] .note-bulkbar{background:#232848}

/* 放不下三栏时（<1280）收起文件夹树，用工具条里的下拉代替；目录也让位给正文 */
@media (max-width:1279px){
  .notes-split{grid-template-columns:320px minmax(0,1fr)}
  .note-folders{display:none}
  .note-folder-pick{display:block;flex:0 0 auto;width:auto;max-width:180px}
  .note-read.has-toc{display:block}
  .note-toc{display:none}
}

@media (max-width:719px){
  .notes-bar{overflow-x:auto;flex-wrap:nowrap;padding-bottom:8px;-webkit-overflow-scrolling:touch}
  .notes-bar::-webkit-scrollbar{display:none}
  .notes-tools{gap:6px;margin-bottom:10px}
  .notes-search{flex:1 1 100%;max-width:none;min-width:0}
  .note-folder-pick{flex:1 1 auto;max-width:none}
  .notes-sort{flex:1 1 auto;min-width:0}
  .notes-split{display:block}
  .note-list{max-height:none}
  .note-detail{display:none}
  .is-detail .note-list,.is-detail .note-list-pane,.is-detail .notes-bar,.is-detail .notes-tools{display:none}
  .is-detail .note-detail{display:block}
  .notes-back{display:inline-flex}
  .note-view,.note-edit{padding:14px 14px}
  .note-title{font-size:17px}
  .note-head-ops{width:100%;margin-left:0}
  .note-edit-meta{grid-template-columns:1fr}
  .note-body-input,.note-preview{min-height:220px}
  .notes-lock{padding:28px 4px 44px}
  .notes-lock-card{padding:24px 20px}
  /* 手机：常用 5 个格式直接露出，其余收进「⋯」面板，靠换行而不是横向滚动（R-28）；
     每个控件至少 44×44，手指点得中（R-29）；工具条吸顶，往下写正文时随时能改格式 */
  .note-toolbar{position:sticky;top:var(--topbar-h);z-index:5;flex-wrap:wrap;overflow:visible;padding:5px 6px;gap:2px}
  .note-tb-btn,.note-tb-select,.note-tb-colorwrap{flex:0 0 auto}
  .note-tb-btn{min-width:44px;height:44px;font-size:15px}
  .note-tb-select{height:44px;font-size:13px}
  .note-tb-colorwrap{width:44px;height:44px;font-size:15px}
  .note-tb-more-btn{display:inline-flex}
  .note-tb-more{display:none;flex-basis:100%;flex-wrap:wrap;align-items:center;gap:2px;padding-top:4px;border-top:1px solid var(--line);margin-top:2px}
  .note-tb-more.is-open{display:flex}
  .note-tb-more .note-tb-sep{display:none}
  .note-rich{min-height:calc(100vh - 330px);max-height:none}
}

/* ==========================================================================
   世界时钟（A3）
   ========================================================================== */
.clock-card{display:flex;flex-direction:column;gap:4px;padding:14px 16px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow)}
.clock-card.is-local{background:var(--accent-soft);border-color:transparent}
.clock-card.is-local .clock-time{color:var(--accent)}
.clock-head{display:flex;align-items:center;gap:8px;min-width:0}
.clock-city{font-size:13.5px;font-weight:650;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.clock-diff{margin-left:auto;font-size:11.5px;color:var(--ink-4);white-space:nowrap}
.clock-del{flex-shrink:0;width:24px;height:24px;margin-right:-4px;border:0;border-radius:7px;background:transparent;color:var(--ink-4);font:inherit;font-size:16px;line-height:1;cursor:pointer}
.clock-del:hover{background:var(--line-2);color:var(--bad)}
.clock-time{font-size:32px;line-height:1.1;font-weight:700;font-variant-numeric:tabular-nums;letter-spacing:-.02em;color:var(--ink)}
.clock-time .sec{font-size:14px;font-weight:600;color:var(--ink-4);margin-left:2px;letter-spacing:0}
.clock-date{font-size:12px;color:var(--ink-3)}
.clock-bar{display:flex;gap:8px;margin:14px 0 10px}
.clock-home-toggle{display:inline-flex;align-items:center;gap:8px;margin:0 0 14px;font-size:12.5px;color:var(--ink-2);cursor:pointer}
.clock-home-toggle input{width:16px;height:16px;accent-color:var(--accent)}
/* 首页世界时钟：北京永远排第一，后面跟关注的城市，一个城市一张卡。
   列数按城市数量写死（cols-N），城市少时卡片变宽、把整行占满，加城市就自动变窄。
   这里不用 auto-fill：它会先铺出一排空轨道，城市少的时候右侧就留一大片空白。 */
.home-clock-section{margin-bottom:16px}
@media (min-width:1080px){.home-clock-section{margin-bottom:20px}}
.home-clock-grid{display:grid;gap:10px}
.home-clock-grid.cols-1{grid-template-columns:minmax(0,1fr)}
.home-clock-grid.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.home-clock-grid.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.home-clock-grid.cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}
.home-clock-grid.cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}
.home-clock-grid.cols-many{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
.home-clock-card{display:flex;flex-direction:column;gap:2px;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:var(--bg)}
/* 城市少 → 卡片宽，字号跟着放大，否则一张大卡里全是空的 */
.cols-1 .home-clock-card{padding:18px 20px}
.cols-1 .hc-time{font-size:44px}
.cols-1 .hc-time .sec{font-size:16px}
.cols-1 .hc-city{font-size:15px}
.cols-1 .hc-date{font-size:13px}
.cols-2 .home-clock-card{padding:14px 16px}
.cols-2 .hc-time{font-size:34px}
.cols-2 .hc-time .sec{font-size:13px}
.cols-3 .hc-time{font-size:28px}
.cols-3 .hc-time .sec{font-size:12px}
.home-clock-card.is-local{background:var(--accent-soft);border-color:transparent}
.hc-head{display:flex;align-items:center;gap:6px;min-width:0}
.hc-city{font-size:12.5px;font-weight:650;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hc-badge{flex-shrink:0;padding:0 6px;border-radius:999px;background:var(--accent);color:var(--card);font-size:10px;font-weight:700;line-height:1.6}
.hc-diff{margin-left:auto;font-size:10.5px;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hc-time{font-size:24px;line-height:1.15;font-weight:750;font-variant-numeric:tabular-nums;letter-spacing:-.02em;color:var(--ink)}
.home-clock-card.is-local .hc-time{color:var(--accent)}
.hc-time .sec{font-size:11px;font-weight:600;color:var(--ink-4);margin-left:1px;letter-spacing:0}
.hc-date{font-size:11px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
[data-theme="dark"] .home-clock-card.is-local{background:#232848}
.clock-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}
.clock-conv{margin-top:22px;padding:16px 18px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow)}
.clock-conv h3{margin:0 0 2px;font-size:14.5px;font-weight:700;color:var(--ink)}
.clock-conv-inputs{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0}
.clock-conv-inputs .input{max-width:180px}
.clock-conv-list{display:flex;flex-direction:column;gap:1px}
.clock-conv-row{display:grid;grid-template-columns:1fr auto 84px 48px;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;font-size:13px}
.clock-conv-row:nth-child(odd){background:var(--bg)}
.clock-conv-row.is-local{background:var(--accent-soft)}
.conv-name{font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.conv-day{font-size:12px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.conv-time{font-size:15px;font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums;text-align:right}
.conv-mark{font-size:10.5px;font-weight:700;color:var(--warn);text-align:right}
/* 添加城市：全部预置城市按大洲分组，可搜索，点一下加入 */
.clock-picker{display:flex;flex-direction:column;gap:10px}
.clock-picker-search{width:100%}
.clock-picker-sum{margin:0;font-size:12px;color:var(--ink-4)}
.clock-picker-list{display:flex;flex-direction:column;gap:14px;max-height:46vh;overflow:auto;padding-right:2px}
.clock-picker-region h4{margin:0 0 6px;font-size:12px;font-weight:700;letter-spacing:.02em;color:var(--ink-3)}
.clock-city-list{display:flex;flex-wrap:wrap;gap:6px}
.clock-city-chip{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:6px 10px;border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--ink);font:inherit;font-size:13px;line-height:1.25;text-align:left;cursor:pointer;transition:border-color .15s,background .15s}
.clock-city-chip:hover:not(:disabled){border-color:var(--accent);background:var(--accent-soft)}
.clock-city-chip .chip-name{font-weight:600}
.clock-city-chip .chip-zone{font-size:10.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.clock-city-chip.is-added{opacity:.45;cursor:default;background:var(--bg)}
.clock-city-chip.is-added .chip-zone{color:var(--accent)}
[data-theme="dark"] .clock-card.is-local{background:#232848}
[data-theme="dark"] .clock-conv-row:nth-child(odd){background:#0f1420}
[data-theme="dark"] .clock-conv-row.is-local{background:#232848}
[data-theme="dark"] .clock-city-chip.is-added{background:#0f1420}
@media (max-width:719px){
  .clock-grid{grid-template-columns:1fr 1fr}
  .clock-time{font-size:26px}
  /* 桌面的 cols-N 是按城市数量分列的，手机上统一压回两列（多城市时两列更可读）。
     必须带着 .cols-N 一起写，否则被桌面的 .home-clock-grid.cols-3 高优先级压回来。 */
  .home-clock-grid,
  .home-clock-grid.cols-2,
  .home-clock-grid.cols-3,
  .home-clock-grid.cols-4,
  .home-clock-grid.cols-5,
  .home-clock-grid.cols-many{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* 手机上单城市也铺满；奇数个城市时最后一张跨两列，右下角不留空 */
  .home-clock-grid.cols-1{grid-template-columns:minmax(0,1fr)}
  .home-clock-grid.cols-3 > :last-child,
  .home-clock-grid.cols-5 > :last-child{grid-column:1 / -1}
  .cols-1 .hc-time{font-size:34px}
  .cols-1 .home-clock-card{padding:14px 16px}
  .cols-2 .hc-time,.cols-3 .hc-time{font-size:22px}
  .hc-diff{display:none}
  .hc-time{font-size:22px}
  .clock-conv-row{grid-template-columns:1fr auto 76px 44px;font-size:12.5px}
  .clock-picker-list{max-height:56vh}
  .clock-city-chip{padding:5px 9px;font-size:12.5px}
}

/* ==========================================================================
   设置：AI 对话配置 / 导出与恢复（C2、B4）
   ========================================================================== */
.set-form .input{max-width:none}
.set-form .note-inline{margin:6px 0 0;font-size:12px;line-height:1.6;color:var(--ink-4)}
.set-check{display:flex;align-items:center;gap:8px;margin:14px 0 0;font-size:13px;color:var(--ink-2)}
.set-check .tick{width:16px;height:16px;accent-color:var(--accent)}
.set-check label{cursor:pointer}
.card .set-say:empty{display:none}
.set-say{margin:12px 0 0}

.data-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px}
.data-actions a.btn{text-decoration:none;color:var(--ink-2)}
.data-counts{display:grid;grid-template-columns:1fr 1fr;gap:4px 18px;margin:2px 0 4px}
.data-count-row{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px solid var(--line-2);font-size:12.5px}
.data-count-row .k{color:var(--ink-3)}
.data-count-row .v{font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink)}
@media (max-width:719px){
  .data-counts{grid-template-columns:1fr}
  .data-actions .btn{flex:1 1 auto}
}

/* ==========================================================================
   问工作台（C2）：手动对话。没有任何自动生成，气泡只跟随发送动作出现。
   ========================================================================== */
.ai-wrap{display:flex;flex-direction:column;gap:10px;height:calc(100vh - 250px);min-height:400px}
.ai-status{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-height:26px;font-size:12px;color:var(--ink-3)}
.ai-state{color:var(--ink-3)}
.ai-state.bad{color:var(--bad)}
.ai-log{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding:16px;border:1px solid var(--line);border-radius:var(--radius);background:var(--card)}
.ai-empty{margin:auto;text-align:center;max-width:520px}
.ai-empty p{margin:0 0 14px;color:var(--ink-3);font-size:13px}
.ai-prompts{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}
.ai-msg{display:flex}
.ai-msg.is-me{justify-content:flex-end}
.ai-bubble{max-width:min(660px,88%);padding:10px 14px;border-radius:14px;border:1px solid var(--line);background:var(--bg);font-size:14px;line-height:1.75;overflow-wrap:anywhere}
.ai-msg.is-me .ai-bubble{background:var(--accent-soft);border-color:transparent;white-space:pre-wrap}
.ai-bubble>:first-child{margin-top:0}
.ai-bubble>:last-child{margin-bottom:0}
.ai-bubble p{margin:0 0 8px}
.ai-bubble ul,.ai-bubble ol{margin:0 0 8px;padding-left:20px}
.ai-bubble li{margin:2px 0}
.ai-bubble h1,.ai-bubble h2,.ai-bubble h3{font-size:15px;margin:12px 0 6px}
.ai-bubble code{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;background:var(--line-2);padding:1px 4px;border-radius:4px}
.ai-bubble pre{padding:10px 12px;border-radius:8px;background:var(--line-2);overflow-x:auto;margin:0 0 8px}
.ai-bubble pre code{background:none;padding:0}
.ai-bubble a{color:var(--accent)}
.ai-typing{display:flex;gap:5px;padding:14px 16px;background:var(--bg)}
.ai-typing .dot{width:6px;height:6px;border-radius:50%;background:var(--ink-4);animation:ai-blink 1.2s infinite ease-in-out}
.ai-typing .dot:nth-child(2){animation-delay:.18s}
.ai-typing .dot:nth-child(3){animation-delay:.36s}
@keyframes ai-blink{0%,80%,100%{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}
.ai-error{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;border-radius:var(--radius-sm);background:var(--bad-soft);color:var(--bad);font-size:12.5px}
.ai-error p{margin:0}
.ai-compose{display:flex;gap:8px;align-items:flex-end}
.ai-input{flex:1;max-width:none;min-height:56px;padding:9px 12px;line-height:1.6;font-family:inherit;font-size:13.5px;resize:vertical}
.ai-compose-side{display:flex;flex-direction:column;gap:6px}
.ai-note{margin:0;font-size:11.5px;color:var(--ink-4);line-height:1.6}
@media (max-width:719px){
  .ai-compose{flex-direction:column;align-items:stretch}
  .ai-compose-side{flex-direction:row;justify-content:flex-end}
  .ai-bubble{max-width:94%}
}

/* ---------- 右侧对话栏（问工作台） ----------
   不占路由，不挡顶栏；桌面端由 JS 写 --ai-w，shell 让出同样宽度，
   所以左边该看什么还能看什么。左边缘是拖动条，宽度存在 localStorage。 */
.ai-side{
  position:fixed;right:0;top:var(--topbar-h);bottom:0;z-index:60;
  display:flex;flex-direction:column;width:var(--ai-w,420px);max-width:100vw;
  background:var(--card);border-left:1px solid var(--line);
  box-shadow:-12px 0 32px rgba(24,27,43,.08);
}
.ai-side[hidden]{display:none}
.ai-side-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line-2);flex:0 0 auto}
.ai-side-title{display:flex;flex-direction:column;gap:1px;min-width:0}
.ai-side-title strong{font-size:14px;letter-spacing:-.01em}
.ai-side-title span{font-size:11px;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ai-side-acts{display:flex;align-items:center;gap:4px;flex:0 0 auto}
.ai-close{width:30px;height:30px;padding:0;border:0;border-radius:8px;background:none;color:var(--ink-3);font-size:20px;line-height:1;cursor:pointer}
.ai-close:hover{background:var(--line-2);color:var(--ink)}
.ai-side .ai-wrap{flex:1;min-height:0;height:auto;gap:8px;padding:12px 14px 14px}
.ai-side .ai-log{border-radius:var(--radius-sm);padding:12px}
.ai-side .ai-empty p{max-width:260px;margin-left:auto;margin-right:auto;line-height:1.65}
.ai-side .ai-prompts{flex-direction:column;align-items:stretch}
.ai-side .link-chip{justify-content:flex-start;white-space:normal;text-align:left;line-height:1.4;padding:7px 11px;border-radius:9px}
.ai-side .ai-bubble{max-width:100%;font-size:13px;line-height:1.7;padding:9px 12px}
.ai-side .ai-note{margin:0}

/* 拖动条：压在面板左边缘上，10px 热区；视觉上只有三条小横线 */
.ai-resizer{
  position:absolute;left:-5px;top:0;bottom:0;width:10px;z-index:2;
  cursor:col-resize;touch-action:none;outline:none;
}
.ai-resizer::after{
  content:"";position:absolute;left:4px;top:50%;width:3px;height:38px;margin-top:-19px;
  border-radius:2px;background:var(--line);opacity:0;transition:opacity .15s,background .15s;
}
.ai-resizer:hover::after,.ai-resizer:focus-visible::after,.ai-resizer.is-active::after{opacity:1;background:var(--accent)}
.ai-resizer:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-soft)}
body.ai-resizing{cursor:col-resize;user-select:none}
body.ai-resizing .ai-resizer::after{opacity:1;background:var(--accent)}

/* 只有挤掉面板后主内容仍有 900px 时（JS 加 .ai-push）才把页面推开；
   否则面板改成浮层压在右侧，绝不把四列卡片挤成一列字。 */
body.ai-open.ai-push .shell{padding-right:var(--ai-w,420px)}

@media (max-width:719px){
  .ai-side{top:0;bottom:0;width:100vw;max-width:100vw;border-left:0;box-shadow:none;z-index:70}
  .ai-resizer{display:none}
  body.ai-open{overflow:hidden}
  body.ai-open .shell,body.ai-open.ai-push .shell{padding-right:0}
  .ai-side .ai-wrap{padding:10px 12px calc(12px + var(--tab-pad-b))}
  .ai-side .ai-log{padding:10px}
}

/* ================= 手机端可读性与热区（R-15 / R-21） =================
   R-21：390/360 下辅助信息不再用 10–11.5px 硬撑层级 —— 统一抬到 12px，
   层级交给颜色（--ink-3/--ink-4）和字重，而不是把字缩到看不清。
   只抬「要读的文字」；纯装饰（头像缩写、图表刻度、勾选符号）保持原样。 */
@media (max-width:719px){
  .tabbar a,
  .nav-sect h4,
  .search-results li .kind,
  .tile-v em,.tile-sub,
  .day-quote .q-src,
  .wx-meta,.wx-time,
  .stat span,
  .link-meta .host,
  .srv-role,.srv-procs-toggle .hint,.srv-proc .mb,.srv-metric-head .num,
  .hist-stat .lbl,.hist-legend,.hist-strip-label,
  .cal-week span,.cal-lunar,.cal-term,.cal-holiday,.cal-work,.cal-bar,.cal-more,
  .cal-ev-kind,.cal-weekbar-cell .wd,.cal-wb-meta,.cal-wb-meta .cal-lunar,.cal-wb-meta .cal-term,.cal-wb-meta .cal-holiday,
  .op-row .mono,
  .more-sect h4,.pop-title,.pop-sect,.tab-count,
  .board-col-count,.board-col-head .chip,.board-card-meta .chip,.board-card-time,
  .sched-item .item-meta .chip,.sched-date-sub,.item-updated,
  .pv-meta .chip,.pv-diff-tag,.tok-sub .mono,.tok-secret code,
  .home-ev-time,.home-ev-sub,.home-ev .chip,.home-group,.home-group-n,
  .home-task .item-meta .chip,.home-brief-date span,.home-brief-kicker,.home-stale-d,
  .home-exp-kind,.home-exp .chip,.home-srv-role,.home-srv-meter em,
  .home-cal-key,.home-cal-card .cal-gz,.home-cal-card .cal-btn-text,.home-cal-card .cal-wd,
  .home-cal-card .cal-sub,
  .home-cal-card .lp-side-next-label,.home-cal-card .lp-side-next-count,.home-cal-card .lp-side-next-date,
  .home-cal-card .lp-side-row b,.home-cal-card .lp-side-tag,.home-cal-card .lp-side-empty,
  .brief-kicker,.brief-stat span,.brief-month-b-n,.brief-card-ym,.brief-card-kicker,.brief-card-foot,
  .brief-rail-h,.brief-toc-no,.brief-art-kicker,.brief-art-tag,.brief-pager-dir,.brief-pager-d,
  .exp-chip .n,.exp-cat,.link-chip .n,.link-cat,.feed-item-meta,
  .palette-hint,.palette-foot,
  .note-card-foot,.note-folder,.note-tag,.note-tag.is-btn,.notes-lock-split,
  .clock-diff,.hc-badge,.hc-diff,.hc-time .sec,.hc-date,.conv-mark,.clock-city-chip .chip-zone,
  .ai-note,.ai-side-title span,
  .dlg-hint{
    font-size:12px;
  }
  /* 正文类辅助行再给 13px，读起来不费劲 */
  .home-ev-sub,.note-card-foot,.feed-item-meta,.ai-note{font-size:12.5px}
}

/* R-15：手机端命中区。
   勾选框是 input，不能上伪元素，所以直接给到 24×24（WCAG 2.5.8 下限），
   行高不变（flex 居中，视觉上只大 4px）。图标按钮/文字链用伪元素把
   可点范围扩到 ≥44×44，视觉尺寸一点不动。 */
@media (max-width:719px){
  .item .tick,.sched-item .tick,.board-card .tick{width:24px;height:24px}
  .pick .tick,.pick-all .tick{width:20px;height:20px}

  .top-icon,.topai,.avatar-btn,.icon-btn,.cal-datebtn,.home-cal-card .cal-btn,
  .home-more,.card > header a,.card > header button,.home-foot .home-more,
  .cal-more,.link-foot a,.item-updated a{
    position:relative;
  }
  .top-icon::after,.topai::after,.avatar-btn::after,.icon-btn::after,
  .cal-datebtn::after,.home-cal-card .cal-btn::after,
  .home-more::after,.card > header a::after,.card > header button::after,
  .home-foot .home-more::after,.cal-more::after,.link-foot a::after,.item-updated a::after{
    content:"";position:absolute;left:50%;top:50%;
    width:max(100%,44px);height:max(100%,44px);
    transform:translate(-50%,-50%);border-radius:12px;
  }
}

/* R-22：深色模式卡片边界。
   背景 rgb(11,14,23) 与卡片 rgb(20,24,39) 只差 9 级，1440 大屏上边界几乎看不见。
   不动配色：边框提亮一档 + 1px 内高光，浅色模式完全不受影响。 */
[data-theme="dark"] .card,
[data-theme="dark"] .more-list,
[data-theme="dark"] .note-card,
[data-theme="dark"] .note-skeleton-card,
[data-theme="dark"] .note-state{
  border-color:rgba(148,163,184,.22);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06),0 1px 2px rgba(0,0,0,.35),0 10px 28px -16px rgba(0,0,0,.75);
}
[data-theme="dark"] .note-card:hover{box-shadow:var(--note-shadow-hover)}
[data-theme="dark"] .note-state.is-error{border-color:rgba(248,113,113,.5)}

/* R-37：专注模式。工具条、文件夹树、列表全部收起，只留正文，居中一条阅读栏。 */
.note-focus-exit{
  position:fixed;right:16px;top:calc(var(--topbar-h) + 12px);z-index:60;
  padding:6px 12px;border:1px solid var(--line);border-radius:999px;
  background:var(--card);color:var(--ink-2);font-size:12.5px;box-shadow:var(--shadow)
}
.note-focus-exit:hover{color:var(--ink);border-color:var(--accent)}
.note-focus-exit[hidden]{display:none}
.notes-focus .notes-bar,
.notes-focus .notes-tools,
.notes-focus .notes-split>.note-folders,
.notes-focus .note-list-pane{display:none}
.notes-focus .notes-split{display:block}
.notes-focus .note-detail{max-width:880px;margin:0 auto}
.notes-focus .note-read .note-md{max-width:100%}
.notes-focus .note-read.has-toc{display:block}
.notes-focus .note-toc{display:none}

/* R-37：打印只输出正文。别把侧栏、工具条和按钮一起印到纸上。 */
@media print{
  .topbar,.side,.notes-bar,.notes-tools,.note-folders,.note-list-pane,
  .note-toc,.note-head-ops,.notes-back,.note-trash-banner,.note-conflict,
  .note-bulkbar,.note-focus-exit,.note-list-foot,.notes-lock{display:none!important}
  .main,.view-root{padding:0!important;margin:0!important}
  .notes-split,.note-read.has-toc{display:block!important}
  .note-detail{display:block!important;max-width:none!important}
  .note-view,.note-read .note-md{max-width:none!important;border:0!important;box-shadow:none!important;padding:0!important}
  body{background:white;color:#111}
  a{color:inherit;text-decoration:underline}
  .note-view a[href]::after{content:" (" attr(href) ")";font-size:10px;color:#666}
}

/* R-37：历史版本面板。左边列表点开看，右边只读预览，不把整篇正文塞进对话框。 */
.note-version{display:grid;grid-template-columns:minmax(180px,220px) minmax(0,1fr);gap:14px;max-height:min(62vh,520px)}
.note-version-list{overflow:auto;border-right:1px solid var(--line);padding-right:10px}
.note-version-row{display:flex;flex-direction:column;gap:6px;padding:8px 0;border-bottom:1px solid var(--line)}
.note-version-row:last-child{border-bottom:0}
.note-version-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px;font-size:12.5px}
.note-version-ops{display:flex;gap:6px}
.note-version-preview{overflow:auto;min-width:0;padding-left:2px}
.note-version-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px;margin-bottom:8px;font-size:13px}
.note-version-body{font-size:13.5px}
@media (max-width:719px){
  .note-version{grid-template-columns:1fr;max-height:none}
  .note-version-list{max-height:200px;border-right:0;padding-right:0;border-bottom:1px solid var(--line);padding-bottom:8px}
  .note-version-preview{max-height:46vh}
}

/* R-39：正文下面的附件与双链。区块异步填充，空的时候直接隐藏（附件区例外：
   没附件也留着「添加附件」入口）。 */
.note-extras{margin-top:22px;padding-top:14px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:16px}
.note-block-title{margin:0 0 8px;font-size:12.5px;font-weight:600;letter-spacing:.04em;color:var(--ink-3)}
.note-block-head{display:flex;align-items:center;gap:8px}
.note-block-head .note-block-title{margin:0}
.note-attach-list,.note-link-list{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.note-attach-row,.note-link-row{display:flex;align-items:center;gap:9px;min-height:40px;padding:7px 10px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--line-2);font-size:13px;text-align:left}
.note-attach-icon{flex:none;padding:2px 5px;border-radius:4px;background:var(--card);border:1px solid var(--line);color:var(--ink-3);font-size:10px;font-weight:700;letter-spacing:.06em}
.note-attach-main{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}
.note-attach-name{color:var(--ink);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.note-attach-name:hover{color:var(--accent)}
.note-link-row.is-btn{width:100%;cursor:pointer;font:inherit}
.note-link-row.is-btn:hover{border-color:var(--accent-soft);background:var(--accent-soft)}
.note-link-row.is-missing{border-style:dashed;background:transparent}
.note-link-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);font-weight:500}

/* R-39：导入预览 / 备份列表都在对话框里滚动，不把弹窗撑出屏幕 */
.note-import-list{display:flex;flex-direction:column;gap:2px;max-height:min(40vh,320px);overflow:auto;margin-top:8px}
.note-import-row{display:flex;align-items:baseline;gap:8px;padding:5px 0;border-bottom:1px solid var(--line);font-size:13px}
.note-import-row:last-child{border-bottom:0}
.note-import-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
.note-tag-mini{flex:none;padding:0 7px;border:1px solid var(--line);border-radius:999px;color:var(--ink-3);font-size:11px}
.note-backup-head{display:flex;align-items:flex-start;gap:12px;justify-content:space-between}
.note-backup-head p{margin:0}
.note-backup-list{display:flex;flex-direction:column;gap:6px;max-height:min(52vh,420px);overflow:auto;margin-top:10px}
.note-backup-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:var(--radius-sm)}
.note-backup-main{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1;font-size:13px}
.note-backup-main strong{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.note-backup-ops{display:flex;gap:6px;flex:none}
@media (max-width:719px){
  .note-backup-row{flex-wrap:wrap}
  .note-backup-ops{width:100%;justify-content:flex-end}
}

/* ==========================================================================
   R-38：手机全屏笔记编辑
   进入编辑后 .note-edit 固定铺满视口，顶栏只留返回 / 标题 / 状态 / 预览，
   格式条沉到底部并带安全区；「更多」从底部向上弹出。桌面完全不受影响。
   ========================================================================== */
.note-tb-mobile-only,.note-tb-mobile-action{display:none}

@media (max-width:719px){
  body.notes-fullscreen{overflow:hidden}
  body.notes-fullscreen .tabbar{display:none}
  /* 视图入场动画用 animation-fill-mode:both 保留了一个单位变换，
     它会让 position:fixed 以 section 而不是视口为参照，全屏编辑必须关掉 */
  body.notes-fullscreen .view-root > [data-view]{animation:none!important;transform:none!important}

  .is-editing .note-edit{
    position:fixed;top:0;left:0;right:0;z-index:80;
    display:flex;flex-direction:column;
    height:100vh;height:100dvh;max-height:100dvh;width:100%;
    gap:6px;padding:calc(4px + env(safe-area-inset-top,0px)) 12px 0;
    border:0;border-radius:0;box-shadow:none;background:var(--bg);
    overflow:hidden;
  }
  .is-editing .note-head-mobile{
    order:0;flex:0 0 auto;display:flex;align-items:center;gap:6px;flex-wrap:nowrap;
    min-height:44px;
  }
  .is-editing .note-head-mobile .notes-back{display:inline-flex;flex:0 0 auto;min-height:40px;padding:0 8px}
  .is-editing .note-head-title{flex:1 1 auto;min-width:0;display:flex}
  .is-editing .note-head-title .note-title-input{
    width:100%;min-width:0;min-height:40px;height:40px;padding:0 6px;
    border-color:transparent;background:transparent;font-size:16px;font-weight:650;
  }
  .is-editing .note-head-title .note-title-input:focus{
    border-color:var(--accent);background:var(--card);box-shadow:0 0 0 3px var(--accent-soft);
  }
  .is-editing .note-head-mobile .note-count{
    flex:0 0 auto;max-width:68px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-size:11px;line-height:1.2;text-align:right;
  }
  .is-editing .note-head-mobile .note-count:empty{display:none}
  .is-editing .note-head-preview{flex:0 0 auto;min-height:40px;padding:0 10px}

  .is-editing .note-conflict{order:1;flex:0 0 auto;max-height:24vh;overflow:auto}
  .is-editing .note-edit-meta{order:2;flex:0 0 auto;grid-template-columns:1fr 1fr;gap:4px 8px}
  .is-editing .note-edit-meta .note-field{gap:2px}
  .is-editing .note-edit-meta .note-field-label{font-size:10.5px}
  .is-editing .note-edit-meta .input{min-height:34px;height:34px;padding:0 9px;font-size:13px}
  .is-editing .note-edit-foot{display:none}

  /* 书写区吃满剩余高度，只有正文内部滚动；格式条固定在它下面 */
  .is-editing .note-canvas{order:3;flex:1 1 auto;min-height:0}
  .is-editing .note-editor-host{order:1;flex:1 1 auto;min-height:0}
  .is-editing .note-rich{
    flex:1 1 auto;min-height:0;max-height:none;height:100%;
    padding:8px 2px 22px;border:0;border-radius:0;background:transparent;
    font-size:15px;line-height:1.75;overflow:auto;overscroll-behavior:contain;
    -webkit-overflow-scrolling:touch;
  }
  .is-editing .note-rich:focus{border-color:transparent;box-shadow:none}
  .is-editing .note-preview{
    order:3;flex:1 1 auto;min-height:0;max-height:none;overflow:auto;
    padding:8px 2px 22px;border:0;background:transparent;
    -webkit-overflow-scrolling:touch;
  }

  .is-editing .note-toolbar{
    order:2;position:relative;top:auto;z-index:6;flex:0 0 auto;
    flex-wrap:nowrap;overflow:visible;gap:2px;
    padding:4px 0 calc(4px + env(safe-area-inset-bottom,0px));
    border:0;border-top:1px solid var(--line);border-radius:0;
    background:var(--bg);box-shadow:0 -6px 16px rgba(15,18,34,.06);
  }
  .note-tb-mobile-only{display:inline-flex}
  .note-tb-mobile-action{display:inline-flex}
  .is-editing .note-tb-more .note-tb-sep.note-tb-mobile-only{
    display:block;width:100%;height:1px;margin:4px 0;background:var(--line);
  }

  /* 「更多」不再把工具条撑高，而是作为浮层从底栏上方弹出 */
  .is-editing .note-tb-more{
    position:absolute;left:0;right:0;bottom:calc(100% + 6px);
    display:none;flex-basis:auto;flex-wrap:wrap;align-items:center;gap:4px;
    max-height:min(46vh,320px);overflow:auto;margin:0;padding:8px;
    border:1px solid var(--line);border-radius:var(--radius);background:var(--card);
    box-shadow:var(--shadow-lg);z-index:20;
  }
  .is-editing .note-tb-more.is-open{display:flex}
  .is-editing .note-tb-more .note-tb-btn{min-width:52px;height:42px;font-size:14px}
  .is-editing .note-tb-more .note-tb-colorwrap{width:42px;height:42px}
  .is-editing .note-tb-mobile-action{
    flex:0 0 auto;min-height:42px;padding:0 14px;
    border:1px solid var(--line);border-radius:8px;background:var(--bg);
  }
}

/* 320px 级小屏：底栏放不下 7 个 44px 控件时收起「标题」，保留加粗/列表/更多 */
@media (max-width:359px){
  .is-editing .note-toolbar .note-tb-mobile-only{display:none}
}
