/* Courier 网页端 · 设计系统(铅字盘 Components.dc.html 的忠实转译)
   字体自托管(vendor/fonts),不引任何第三方 CDN;中文回退系统宋体栈。 */

/* ————— 活字 · FONTS(latin 子集自托管;CJK 走系统宋体) ————— */
@font-face {
  font-family: 'Instrument Serif'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/instrument-serif-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Instrument Serif'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/instrument-serif-400-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Instrument Serif'; font-style: italic; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/instrument-serif-italic-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Instrument Serif'; font-style: italic; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/instrument-serif-italic-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Courier Prime'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/courier-prime-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Courier Prime'; font-style: normal; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/courier-prime-400-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Courier Prime'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(../vendor/fonts/courier-prime-700-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Courier Prime'; font-style: normal; font-weight: 700; font-display: swap;
  src: url(../vendor/fonts/courier-prime-700-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Courier Prime'; font-style: italic; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/courier-prime-italic-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Courier Prime'; font-style: italic; font-weight: 400; font-display: swap;
  src: url(../vendor/fonts/courier-prime-italic-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ————— 色板 · PALETTE ————— */
:root{
  --paper:#FBFAF7;--ink:#1C1A15;--ink2:#6B665C;--ink3:#87827A;--ink4:#B5B0A6;--inkdis:#C9C4BA;
  --hairline:rgba(28,26,21,.12);--dotted:rgba(28,26,21,.2);
  --sleep:#5856D6;--sport:#C40E3E;--amber:#C77700;--speed:#0A6CD6;--elev:#248A3D;--sent:#248A3D;
  --track:#F2F0EA;--code:#F6F4EE;
  --awake:#FF9500;--rem:#32ADE6;--core:#0A84FF;--deep:#3634A3;
  /* R10 · 健身圆环三色(活动/锻炼/站立)与各自轨底;夜刊提亮环色、轨底转暗 */
  --ring-move:#C40E3E;--ring-ex:#248A3D;--ring-stand:#0A7E8C;
  --ring-move-tr:#F0DCE1;--ring-ex-tr:#DCE9DC;--ring-stand-tr:#D6E6E8;
  --under:#B0492F; /* 达成率 <50% 的警示红 */
  --serif:'Instrument Serif','Noto Serif SC','Songti SC','STSong',Georgia,serif;
  --scn:'Noto Serif SC','Songti SC','STSong',serif;
  --mono:'Courier Prime','Courier New',monospace;
  --sans:-apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB',sans-serif;
}
html[data-edition="night"]{
  --paper:#1B1A17;--ink:#F2EFE7;--ink2:#A39E92;--ink3:#6B675E;--ink4:#57544D;--inkdis:#45423C;
  --hairline:rgba(242,239,231,.14);--dotted:rgba(242,239,231,.22);
  --sleep:#8B89F2;--sport:#FF6B8B;--amber:#E2A546;--speed:#58A6FF;--elev:#4ED07E;--sent:#4ED07E;
  --track:#2A2823;--code:#24221D;
  --awake:#FF9F0A;--rem:#64D2FF;--core:#409CFF;--deep:#5E5CE6;
  --ring-move:#FF6B8B;--ring-ex:#4ED07E;--ring-stand:#3FB6C9;
  --ring-move-tr:#43262D;--ring-ex-tr:#24352A;--ring-stand-tr:#1F363B;
  --under:#E08A6D;
}

/* ————— 基底 ————— */
/* 滚动条槽位常驻:短页(如空档案的今日)无滚动条、长页有,视口差一条滚动条宽,
   居中的报头就会在路由间左右漂移 —— 预留槽位后四个版面纹丝不动 */
html{background:var(--paper);overflow-y:scroll;}
@supports (scrollbar-gutter:stable){html{overflow-y:auto;scrollbar-gutter:stable;}}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);-webkit-font-smoothing:antialiased;}
a{color:inherit;text-decoration:none;}
a:hover{text-decoration:underline;text-underline-offset:3px;}
::selection{background:var(--ink);color:var(--paper);}
input::placeholder{color:var(--ink4);}
input:focus{outline:1.5px solid var(--ink);}
@keyframes inkIn{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:none;}}
@keyframes wipe{from{clip-path:inset(0 100% 0 0);}to{clip-path:inset(0 0 0 0);}}
html[data-motion="off"] *{animation:none !important;transition:none !important;}
/* SWR 二次静默重绘:入场动画直接落终值不重放(duration 0 + fill both = 终帧);flowpath 属常驻动画,豁免 */
[data-repaint] *{animation-duration:0s !important;animation-delay:0s !important;}
[data-repaint] .flowpath{animation-duration:2.6s !important;}
/* 快照回填的加载(snapboot 打标,2.5s 自解):上一屏已在场,模块首绘不再放入场动画——
   否则「内容→闪→再出现」(user 实测);常驻动画同豁免 */
html[data-snap-restored] .page *{animation-duration:0s !important;animation-delay:0s !important;}
html[data-snap-restored] .flowpath{animation-duration:2.6s !important;}

/* ————— 版面器件 · FURNITURE ————— */
/* 桌面优先:整页设最小宽度,窗口再窄出横向滚动、不挤压版面(移动端自适应等设计稿另做) */
.page{min-height:100vh;background:var(--paper);min-width:940px;}
.sheet{max-width:1160px;margin:0 auto;padding:0 48px 64px;}
.sheet-narrow{max-width:860px;margin:0 auto;padding:0 48px 64px;}
.rule-thick{height:2.5px;background:var(--ink);}
.rule-thin{height:1px;background:var(--ink);opacity:.55;}
.kicker{font:700 11px var(--sans);letter-spacing:2.5px;}
.mono-note{font:11.5px var(--mono);color:var(--ink3);}

/* 主按钮(压印 3px 硬影,按下位移)与次按钮 */
.btn-primary{display:block;text-align:center;background:var(--ink);color:var(--paper);font:600 14.5px var(--sans);letter-spacing:1px;padding:14px 0;box-shadow:3px 3px 0 var(--ink3);}
.btn-primary:hover{text-decoration:none;transform:translate(-1px,-1px);box-shadow:4px 4px 0 var(--ink3);}
.btn-primary:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--ink3);}
/* padding 12.5 而非 13:加上 1.5px 描边恰好 = btn-primary 的 14px 无边框,两者并排时等高
   (landing 价目卡的免费/Pro 两枚按钮、删号弹层的取消/确认都是这样并排的) */
.btn-outline{display:block;text-align:center;border:1.5px solid var(--ink);color:var(--ink);font:600 14.5px var(--sans);letter-spacing:1px;padding:12.5px 0;}
.btn-outline:hover{text-decoration:none;background:var(--code);}
.btn-disabled{display:block;text-align:center;border:1.5px solid var(--hairline);color:var(--inkdis);font:600 14.5px var(--sans);letter-spacing:1px;padding:13px 0;cursor:not-allowed;}
/* 行内主按钮(收银入口等窄场合):主按钮的紧凑版,同款墨底硬影 */
.btn-mini{display:inline-block;text-align:center;background:var(--ink);color:var(--paper);font:600 12.5px var(--sans);letter-spacing:1px;padding:8px 16px;box-shadow:3px 3px 0 var(--ink3);white-space:nowrap;}
.btn-mini:hover{text-decoration:none;transform:translate(-1px,-1px);box-shadow:4px 4px 0 var(--ink3);}
.btn-mini:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--ink3);}

/* 印刷风开关 40×22(js 生成内部结构) */
.sw{display:inline-flex;align-items:center;gap:10px;}
.sw:hover{text-decoration:none;}
.sw .st{font:11px var(--mono);color:var(--ink3);min-width:44px;text-align:right;}
.sw .tr{position:relative;width:40px;height:22px;border:1.5px solid var(--ink);display:inline-block;transition:background .15s ease;background:var(--paper);}
.sw .kn{position:absolute;top:2.5px;left:2.5px;width:14px;height:14px;transition:left .15s ease;background:var(--ink);}
.sw.on .tr{background:var(--ink);}
.sw.on .kn{left:20.5px;background:var(--paper);}
.sw.disabled{opacity:.45;cursor:not-allowed;pointer-events:none;}
.sw.disabled .tr{border-color:var(--ink4);}
.sw.disabled .kn{background:var(--ink4);}

/* 分段选择器(选中反白) */
.seg{display:inline-flex;border:1.5px solid var(--ink);}
.seg a{font:600 12px var(--sans);letter-spacing:.5px;padding:6px 13px;color:var(--ink2);}
.seg a + a{border-left:1.5px solid var(--ink);}
.seg a.cur{background:var(--ink);color:var(--paper);}
.seg a:hover{text-decoration:none;}
.seg.disabled{border-color:var(--hairline);pointer-events:none;}
.seg.disabled a{color:var(--inkdis);}
.seg.disabled a + a{border-left-color:var(--hairline);}
.seg.disabled a.cur{background:var(--track);color:var(--ink3);}

/* Toast · 底部墨条 2.6s 自散 */
#toast{position:fixed;left:50%;bottom:34px;transform:translateX(-50%);z-index:90;background:var(--ink);color:var(--paper);font:12px var(--mono);letter-spacing:.5px;padding:11px 20px;box-shadow:4px 4px 0 color-mix(in srgb,var(--ink) 25%,transparent);animation:inkIn .25s ease both;white-space:nowrap;}

/* 缺刊纹 / 制版纹 */
.hatch{background:repeating-linear-gradient(45deg,var(--code) 0 8px,transparent 8px 16px);}
.hatch-strong{background:repeating-linear-gradient(45deg,var(--code) 0 10px,var(--paper) 10px 20px);}

/* 手机屏(2026-07-26 user 拍板改口径):不再拦、不做手机版式——
   viewport width=940 整版等比缩放,手机与 iPad 同样直接读。
   旧的 data-small-screen 纸墨告示已撤(boot.js 也不再打标)。 */

/* 月刊书架卡片(合订本年刊):悬停描边 + 压印硬影 */
.vol-card:hover{text-decoration:none;border-color:var(--ink) !important;box-shadow:3px 3px 0 var(--hairline);}

/* ————— 可点指示器 · 三档制(照 iOS DispatchMarks / KickerRow / 标题即入口) —————
   iOS 不是「所有能点的都加箭头」而是分三档;照搬成全加箭头会让版面变吵。
   档 1 行/卡 = 常驻 chevron;档 2 文字链 = 文字后跟 › + 常驻下划线;
   档 3 标题即入口 = dotted 下划线、**不给箭头**(大字号带箭头像误植)。 */

/* 档 1 · 可点行:行尾常驻 chevron。网格模板末尾须补一列 16px 给箭头。 */
.nav-row{position:relative;color:var(--ink);}
.nav-row::after{content:'›';position:absolute;right:2px;top:50%;
  transform:translateY(-50%);font:12px var(--mono);color:var(--ink3);
  transition:color .12s ease,transform .12s ease;}
.nav-row:hover{background:var(--code);text-decoration:none;}
.nav-row:hover::after{color:var(--ink);transform:translateY(-50%) translateX(2px);}
/* 账目行(今刊场次账目 / 合订本场次与逐周小结):整行热区,与 .nav-row 并写 */
.ledger-row:hover,.ses-row:hover{background:var(--code);text-decoration:none;}

/* 档 1b · 卡片 / 日历格:chevron 走【右下角】—— 日历格右上角已被「第 N 期」占住
   (volumes.js 周历/月历格头行是 space-between),放右上必压期号。 */
.nav-card{position:relative;color:var(--ink);}
.nav-card::after{content:'›';position:absolute;bottom:9px;right:11px;
  font:12px var(--mono);color:var(--ink4);transition:color .12s ease;}
.nav-card:hover{background:var(--code);text-decoration:none;}
.nav-card:hover::after{color:var(--ink);}
/* 未付印(未来日 / 创刊前)不出箭头 —— 「没箭头 = 不可点」要能反着读。
   缺刊日是素底可点的正常格,照发链接、照出箭头,别与未付印混成一种画法(§10)。 */
.nav-card[aria-disabled="true"]::after{content:none;}

/* 档 2 · 文字链接:文字后跟 ›,下划线用当前色常驻(不靠 hover 才出现) */
.lk{border-bottom:1px solid currentColor;}
.lk::after{content:' ›';font-family:var(--mono);opacity:.75;}
.lk:hover{text-decoration:none;}
.lk.off{color:var(--inkdis);border-bottom:0;pointer-events:none;}
.lk.off::after{content:none;}

/* 档 3 · 标题即入口:dotted 下划线常驻,无箭头;hover 转实线墨色,不改字号 */
.title-lk{border-bottom:1px dotted var(--dotted);padding-bottom:3px;}
.title-lk:hover{border-bottom:1px solid var(--ink);text-decoration:none;}

/* 注:iOS 行首那颗发行状态点(DispatchMarks 的 5pt 圆)不移植 —— 见 §0b 架构前提:
   web 是发行之后的展示,能出现在这里的数据按定义已发行,服务端载荷也无 outbox 字段。
   web 行只有箭头,没有点。 */

/* 合订本逐日趋势图:整列热区,悬停读当日、点击开当期 */
[data-chx] svg{cursor:pointer;}

/* 顶栏细节 */
.ed-toggle{color:var(--ink);border-bottom:1px solid var(--ink);}
.stamp{width:19px;height:19px;border:1px solid var(--ink);display:inline-grid;place-items:center;font:11px var(--serif);color:var(--ink);}
/* 左上角刊标(App 同款 icon;自带奶油纸底,夜刊下像一枚小邮票;外层 inline-flex 垂直居中) */
.site-ic{width:20px;height:20px;border-radius:5px;border:1px solid var(--hairline);display:block;}
/* 读者身份戳(FREE/PRO,报头用户名旁,masthead.js 注入) */
.plan-stamp{font:700 8.5px var(--sans);letter-spacing:1.5px;padding:1px 4.5px;border:1px solid var(--hairline);color:var(--ink4);}
.plan-stamp.pro{color:var(--amber);border-color:var(--amber);}
/* 顶部「解锁 PRO」入口(free 订户,夜刊切换左侧,masthead.js 注入) */
.go-pro{font:700 9.5px var(--sans);letter-spacing:2px;color:var(--amber);border:1.5px solid var(--amber);padding:2.5px 7px;white-space:nowrap;}
.go-pro:hover{background:var(--amber);color:var(--paper);text-decoration:none;}

/* 地图制版(Workout 页,workout-map.html 的滤镜照搬) */
.map-plate{position:relative;height:540px;border:1px solid var(--ink);}
.map-plate .leaflet-container{background:#EDEBE4;font:inherit;}
html[data-edition="night"] .map-plate .leaflet-container{background:#22211D;}
.map-plate .leaflet-tile{filter:grayscale(1) brightness(1.07) contrast(0.82) sepia(0.14);}
html[data-edition="night"] .map-plate .leaflet-tile{filter:grayscale(1) invert(1) brightness(0.78) contrast(0.95) sepia(0.18);}
.map-plate .leaflet-control-scale-line{font:10px var(--mono);background:rgba(251,250,247,.8);border-color:#1C1A15;color:#1C1A15;}
html[data-edition="night"] .map-plate .leaflet-control-scale-line{background:rgba(27,26,23,.8);border-color:#F2EFE7;color:#F2EFE7;}
.map-plate .leaflet-control-attribution{font:9px var(--mono);background:rgba(251,250,247,.75)!important;color:#87827A;}
html[data-edition="night"] .map-plate .leaflet-control-attribution{background:rgba(27,26,23,.75)!important;color:#6B675E;}
.map-plate .leaflet-control-attribution a{color:inherit;}
.map-plate .leaflet-bar a{font-family:var(--mono);color:#1C1A15;}
.mk{font:10.5px/1.3 'Courier Prime','Courier New',monospace;white-space:nowrap;color:#1C1A15;}
.mk b{display:inline-block;background:#1C1A15;color:#FBFAF7;padding:2px 6px;letter-spacing:1px;font-weight:400;}
.mk i{display:inline-block;font-style:normal;background:rgba(251,250,247,.9);border:1px solid #1C1A15;padding:1px 5px;margin-top:2px;}
html[data-edition="night"] .mk b{background:#F2EFE7;color:#1B1A17;}
html[data-edition="night"] .mk i{background:rgba(27,26,23,.9);border-color:#F2EFE7;color:#F2EFE7;}
.flowpath{stroke-dasharray:2 14;animation:flow 2.6s linear infinite;}
@keyframes flow{to{stroke-dashoffset:-16;}}
@media (prefers-reduced-motion: reduce){.flowpath{animation:none;}}
html[data-motion="off"] .flowpath{animation:none !important;}

/* 跨文档 View Transitions:MPA 导航交叉淡化(Chrome/Safari 18+ 生效,其余无感降级)。
   报纸式翻页动效留待设计定稿后细化。 */
@view-transition { navigation: auto; }

/* ————— 批注正文:档案馆里 3 行截断,点开原地展开(§10 超长批注不撑破网格) —————
   iOS 只给 1 行(屏窄),web 给 3 行;第 4 行起截断,展开不跳详情页。 */
.note-body{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;}
.note-body.open{display:block;-webkit-line-clamp:none;overflow:visible;}
