/**
 * Markdown 编辑器 / 渲染样式（statics/vender/markdown/）
 *
 * 主题约定：所有配色走 --md-* 变量，而 --md-* 全部继承 --pg-ui-*（前台经 home.css
 * 桥接到站点 --primary/--bg/--text-*，后台经 admin.css 覆盖），因此：
 *   - 主题色（primary）自动跟随站点设置；
 *   - 暗黑模式（<html data-theme="dark">）自动跟随，无需在别的样式里再打补丁。
 * 最后的浅色值是「没有 pg-ui 变量时」的兜底（单独引用本文件的离线页面）。
 */
:root{
    /* ⚠️ 本文件所有「内容层」底（输入区 / 全屏编辑 / 弹窗 / 表单控件 / 附件卡）都映射到 --pg-ui-content-bg。
     * 它默认退 --pg-ui-body-bg，保证后台与离线页面行为不变；
     * 前台（statics/css/home.css）把它桥接到站点 --card，于是亮主题下输入区是白色卡片底而不是灰页底。 */
    --md-bg:var(--pg-ui-content-bg,var(--pg-ui-body-bg,#fff));
    --md-surface:var(--pg-ui-tertiary-bg,#f8f9fa);          /* 工具栏 / 表头等次级底 */
    --md-surface-2:var(--pg-ui-secondary-bg,#e9ecef);        /* hover / active 底 */
    --md-border:var(--pg-ui-border-color,#dee2e6);
    --md-text:var(--pg-ui-body-color,#212529);
    --md-muted:var(--pg-ui-secondary-color,#6c757d);
    --md-faint:var(--pg-ui-tertiary-color,#adb5bd);
    --md-primary:var(--pg-ui-primary,#0d6efd);
    --md-primary-rgb:var(--pg-ui-primary-rgb,13,110,253);
    --md-on-primary:#fff;                           /* 压在主题色实底上的前景 */
    --md-radius:var(--pg-ui-border-radius,6px);
    --md-shadow:var(--pg-ui-box-shadow,0 .5rem 1rem rgba(0,0,0,.15));
}
/* 暗色下站点 --primary 是亮薄荷（#2cc7b5），白字压上去只有约 2.1:1，
   按前台既有口径换成深墨绿（--primary-light 在暗色档就是深色）。 */
[data-theme="dark"]{--md-on-primary:var(--primary-light,#0f2b28)}
.md-editor-field{display:flex;flex-direction:column;gap:0;margin:0 0 12px}
.md-editor-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:0;padding:0;border:1px solid var(--md-border);border-bottom:0;border-radius:6px 6px 0 0;background:var(--md-surface)}
.md-editor-toolbar button{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;padding:0 7px;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--md-muted);cursor:pointer;transition:all .15s ease}
.md-editor-toolbar button svg{display:block;width:16px;height:16px;flex:0 0 auto}
.md-editor-toolbar button:hover{border-color:var(--md-border);background:var(--md-bg);color:var(--md-text)}
.md-editor-toolbar button:focus-visible{outline:2px solid var(--md-primary);outline-offset:1px}
.md-editor-toolbar button:active{background:var(--md-surface-2)}
.md-editor-textarea{width:100%;box-sizing:border-box;min-height:160px;padding:12px;border:1px solid var(--md-border);border-radius:0 0 6px 6px;background:var(--md-bg);color:var(--md-text);caret-color:var(--md-primary); font-size:14px;line-height:1.6;resize:vertical;outline:none}
.md-editor-textarea::placeholder{color:var(--md-faint)}
.md-editor-textarea:focus{border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-editor-field:focus-within .md-editor-toolbar{border-color:var(--md-primary)}
.md-editor-dialog-overlay{position:fixed;inset:0;z-index:10550;display:none;align-items:center;justify-content:center;background:rgba(0,0,0,.5)}
.md-editor-dialog-overlay[data-show]{display:flex}
.md-editor-dialog{display:flex;flex-direction:column;width:100%;max-width:460px;max-height:calc(100vh - 32px);margin:16px;background:var(--md-bg);color:var(--md-text);border-radius:8px;box-shadow:var(--md-shadow);overflow:hidden}
.md-editor-dialog-title{flex:0 0 auto;padding:16px 20px;margin:0;font-size:16px;font-weight:600;border-bottom:1px solid var(--md-border)}
.md-editor-dialog-body{flex:1 1 auto;padding:20px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.md-editor-dialog-field{display:grid;gap:6px;margin-bottom:14px;color:var(--md-text);font-size:14px}
.md-editor-dialog-field input{box-sizing:border-box;width:100%;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;background:var(--md-bg);color:var(--md-text)}
.md-editor-dialog-field input:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-editor-dialog-hint{font-size:12px;color:var(--md-faint)}
.md-editor-dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid var(--md-border)}
/* 弹窗底部按钮：「取消」与「确定 / 插入图片 / 插入视频 / 插入附件」是两套底色。
 * ⚠️ 主按钮那条 hover 必须自己把 background / border / color 三样重申一遍，
 * 且次按钮的 hover 要排除 .btn-primary —— 否则「确认」hover 时会被次按钮的 hover 规则
 * 刷成浅灰底（权重 0,3,0 压过 .btn-primary 的 0,2,0），白字留在浅灰上直接看不见（帖子 758 圈的就是这个）。 */
.md-editor-dialog-actions .btn{padding:6px 16px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;cursor:pointer;background:var(--md-bg);color:var(--md-text)}
.md-editor-dialog-actions .btn:not(.btn-primary):hover{background:var(--md-surface);color:var(--md-text)}
.md-editor-dialog-actions .btn-primary{background:var(--md-primary);border-color:var(--md-primary);color:var(--md-on-primary)}
.md-editor-dialog-actions .btn-primary:hover{background:var(--md-primary);border-color:var(--md-primary);color:var(--md-on-primary);filter:brightness(.92)}
.md-editor-emoji-grid{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:4px;max-height:280px;overflow-y:auto}
.md-editor-emoji-grid button{display:grid;place-items:center;min-width:0;height:36px;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;font-size:20px;line-height:1;cursor:pointer}
.md-editor-emoji-grid button:hover,.md-editor-emoji-grid button:focus-visible{border-color:var(--md-border);background:var(--md-surface);outline:0}
.md-table-wrap{box-sizing:border-box;width:100%;max-width:100%;overflow-x:auto;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
.md-table-wrap table{width:100%;min-width:0;table-layout:auto;border-collapse:collapse}
.md-table-wrap th,.md-table-wrap td{border:1px solid var(--md-border);padding:8px 12px;color:var(--md-text)}
.md-table-wrap th{background:var(--md-surface);font-weight:600}
.md-table-wrap::-webkit-scrollbar{height:8px}
.md-table-wrap::-webkit-scrollbar-track{background:transparent}
.md-table-wrap::-webkit-scrollbar-thumb{border-radius:4px;background:var(--md-border)}
@media(max-width:720px){.md-table-wrap table{min-width:max-content}}
@media(max-width:480px){.md-editor-toolbar{flex-wrap:wrap;gap:2px;padding:4px 6px}.md-editor-toolbar button{flex:0 0 auto;min-width:30px;height:30px;padding:0 5px}.md-toolbar-divider{display:none}}
.md-video-form{display:flex;flex-direction:column;gap:0}
.md-video-form select{box-sizing:border-box;width:100%;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;background:var(--md-bg);color:var(--md-text)}
.md-video-form select:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-video-preview{position:relative;width:100%;aspect-ratio:16/9;max-height:260px;background:#000;border-radius:6px;overflow:hidden;margin-top:4px}
.md-video-preview video,.md-video-preview iframe{display:block;width:100%;height:100%;border:0}
.md-video-preview-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--md-faint);font-size:13px}
.md-video-wrap{position:relative;width:100%;padding-top:56.25%;margin:12px 0;border-radius:6px;overflow:hidden;background:#000}
.md-video-wrap video,.md-video-wrap iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.md-preview .md-video-wrap{margin:16px 0}
.md-toolbar-divider{flex:0 0 auto;width:1px;height:20px;margin:6px 4px;background:var(--md-border)}
.md-btn-fullscreen{margin-left:auto!important}
.md-editor-fullscreen{position:fixed!important;inset:0!important;z-index:9999!important;margin:0!important;border-radius:0!important;background:var(--md-bg)}
.md-editor-fullscreen .md-editor-toolbar{border-radius:0;border-left:0;border-right:0;border-top:0}
.md-editor-fullscreen .md-editor-textarea{border-radius:0;border-left:0;border-right:0;border-bottom:0;flex:1 1 auto;height:auto!important;min-height:0!important;resize:none!important}
.md-editor-fullscreen .md-btn-fullscreen svg{transform:rotate(180deg)}
.md-image-form{display:flex;flex-direction:column;gap:0}
.md-image-form select{box-sizing:border-box;width:100%;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;background:var(--md-bg);color:var(--md-text)}
.md-image-form select:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-image-size{flex:0 0 auto}
.md-image-custom-size{box-sizing:border-box;width:100%;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;background:var(--md-bg);color:var(--md-text)}
.md-image-custom-size:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-image-preview{box-sizing:border-box;width:100%;min-height:120px;max-height:280px;overflow:auto;margin-top:4px;padding:12px;border:1px solid var(--md-border);border-radius:6px;background:var(--md-surface);display:flex;align-items:center;justify-content:center}
.md-image-preview img{max-width:100%;max-height:256px;border-radius:6px;display:block}
.md-image-preview-empty{color:var(--md-faint);font-size:13px}
/* 空行占位行：连续空行中第 2 行起，每行输出一个等高占位（1.8em ≈ 一个文本行） */
.md-blank{display:block;height:1.8em;line-height:1.8;overflow:hidden}
/* ===== 网盘附件卡片 ::file{...} =====
 * v2.0.44：整张卡只认站内那一个强调色。
 * 以前 --md-file-brand 是服务端按网盘品牌下发的（蓝奏 #1296db、115 #f97316…），
 * 一屏里挤着三四家网盘的颜色，跟本站的青绿对不上；现在这个变量长在 CSS 里，
 * 值就是 --md-primary —— 它在前台桥到站点 --primary、后台桥到 --pg-primary，
 * 站长改主题色时卡片跟着改，网盘是谁由名字那两个字说，不由颜色说。
 * 压在实色底上的前景一律用 --md-on-primary（暗色档那是深墨绿，白字压亮薄荷只有 2.1:1）。
 */
.md-file-card{--md-file-brand:var(--md-primary);display:flex;align-items:center;gap:12px;box-sizing:border-box;max-width:100%;margin:12px 0;padding:14px;border:1px solid var(--md-border);border-radius:12px;background:var(--md-bg);color:var(--md-text);transition:border-color .18s ease,box-shadow .18s ease}
.md-file-card:hover{border-color:var(--md-file-brand);box-shadow:0 4px 16px rgba(15,23,42,.08)}
.md-file-icon{flex:0 0 auto;display:grid;place-items:center;width:46px;height:46px;border-radius:12px;background:var(--md-file-brand);color:var(--md-on-primary)}
.md-file-icon i{display:block;font-size:24px;line-height:1}
.md-file-body{flex:1 1 auto;min-width:0}
.md-file-title{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:15px;font-weight:600;color:var(--md-text);line-height:1.4}
.md-file-name{overflow-wrap:anywhere}
.md-file-ext{flex:0 0 auto;padding:1px 6px;border-radius:4px;background:var(--md-surface);color:var(--md-muted);font-size:11px;font-weight:600;letter-spacing:.3px}
.md-file-meta{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:6px}
.md-file-brand{padding:0 8px;border:1px solid currentColor;border-radius:999px;color:var(--md-file-brand);font-size:12px;line-height:18px;font-weight:600}
.md-file-size,.md-file-expire{color:var(--md-muted);font-size:12.5px}
.md-file-desc{margin-top:6px;color:var(--md-muted);font-size:13.5px;line-height:1.6}
.md-file-desc p{margin:0}
.md-file-action{flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-end;gap:6px}
/* 提取码胶囊：中性档，靠「虚线边 + 次级字色」认出这是个可点的取件凭据，不靠颜色抢戏。
   复制成功那一刻换成主色实底 —— 全站唯一的强调色只留给「已经办好了」这一瞬。 */
.md-file-code{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px dashed var(--md-border);border-radius:8px;background:var(--md-surface);color:var(--md-muted);font-size:12px;cursor:pointer;transition:all .15s ease}
.md-file-code:hover{background:var(--md-surface-2);color:var(--md-text)}
.md-file-code.is-copied{border-style:solid;border-color:var(--md-file-brand);background:var(--md-file-brand);color:var(--md-on-primary)}
.md-file-code-value{font-size:13px;letter-spacing:.5px}
.md-file-copy{font-size:14px;line-height:1;opacity:.65}
.md-file-pwd{color:var(--md-muted);font-size:12px}
.md-file-pwd b{color:var(--md-text)}
.md-file-btn{display:inline-flex;align-items:center;gap:5px;padding:7px 16px;border-radius:8px;background:var(--md-file-brand);box-shadow:0 1px 4px rgba(15,23,42,.18);font-size:13px;font-weight:600;white-space:nowrap;transition:filter .15s ease,transform .15s ease}
/* 提高优先级：防止全局 a / .md-preview a / a:hover 的颜色与下划线穿透按钮。
   color 在这里必须跟着重申一遍（库的 a:hover 权重更高，不重申就把字色刷成链接蓝），
   而且不许写死 #fff —— 暗色档的主色是亮薄荷，白字压上去只有 2.1:1，走 --md-on-primary。 */
a.md-file-btn,.md-preview a.md-file-btn,a.md-file-btn:visited,.md-preview a.md-file-btn:visited{color:var(--md-on-primary);text-decoration:none}
a.md-file-btn:hover,.md-preview a.md-file-btn:hover,a.md-file-btn:focus-visible{color:var(--md-on-primary);text-decoration:none;filter:brightness(.9)}
.md-file-btn:active{transform:translateY(1px)}
.md-file-btn i{display:block;font-size:15px;line-height:1}
@media(max-width:560px){
  .md-file-card{flex-direction:column;align-items:stretch;gap:10px;padding:12px}
  .md-file-action{flex-direction:row;align-items:center;justify-content:space-between;flex-wrap:wrap}
  .md-file-btn{flex:1 1 auto;justify-content:center}
}
/* ===== 网盘附件录入弹窗 ===== */
.md-netdisk-form{display:flex;flex-direction:column}
.md-netdisk-form select,.md-netdisk-form textarea{box-sizing:border-box;width:100%;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;background:var(--md-bg);color:var(--md-text);font-family:inherit}
.md-netdisk-form select:focus,.md-netdisk-form textarea:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-netdisk-form textarea{min-height:60px;resize:vertical}
.md-netdisk-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.md-netdisk-items{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.md-netdisk-item{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--md-border);border-radius:6px;background:var(--md-surface);color:var(--md-text);font-size:13px}
.md-netdisk-item-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--md-text)}
/* 颜色原本由脚本按网盘品牌下发（tag.style.color = 品牌色），现在跟着卡片一起只认中性档：
   弹窗里那枚只是「这是哪家网盘」的标签，不该比正文里的卡片还显眼。 */
.md-netdisk-item-type{flex:0 0 auto;padding:0 7px;border:1px solid currentColor;border-radius:999px;color:var(--md-muted);font-size:11px;line-height:17px;font-weight:600}
.md-netdisk-item-del{flex:0 0 auto;width:22px;height:22px;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--md-faint);cursor:pointer;font-size:14px;line-height:1}
.md-netdisk-item-del:hover{border-color:#fecaca;background:#fef2f2;color:#dc2626}
.md-netdisk-empty{color:var(--md-faint);font-size:12.5px}
@media(max-width:480px){.md-netdisk-grid{grid-template-columns:1fr}}
/* ===== 工具栏 AI 下拉菜单 ===== */
.md-ai{position:relative;display:inline-flex;flex:0 0 auto}
.md-ai-toggle .md-ai-text{margin-left:3px;font-size:11px;font-weight:700;letter-spacing:.4px}
.md-ai-open .md-ai-toggle{border-color:var(--md-border);background:var(--md-bg);color:var(--md-text)}
.md-ai-toggle.is-busy{opacity:.6}
.md-ai-menu{position:absolute;top:calc(100% + 6px);left:0;z-index:10560;display:flex;flex-direction:column;gap:2px;min-width:116px;padding:4px;background:var(--md-bg);border:1px solid var(--md-border);border-radius:var(--md-radius);box-shadow:var(--md-shadow)}
/* 选择器带 .md-editor-toolbar 前缀：工具栏按钮的通用规则是 (0,1,1)，不加前缀会被它的 32px 方形尺寸套住 */
.md-editor-toolbar .md-ai-menu button{display:flex;align-items:center;gap:8px;width:100%;min-width:0;height:auto;padding:7px 9px;border:0;border-radius:4px;background:transparent;color:var(--md-text);font-size:13px;line-height:1.2;text-align:left;cursor:pointer}
.md-editor-toolbar .md-ai-menu button:hover,.md-editor-toolbar .md-ai-menu button:focus-visible{background:var(--md-surface);border-color:transparent;color:var(--md-text);outline:0}
.md-editor-toolbar .md-ai-menu button[disabled]{opacity:.5;cursor:not-allowed}
.md-editor-toolbar .md-ai-menu button svg{width:15px;height:15px;color:var(--md-muted)}
.md-ai-status{display:none;align-items:center;gap:6px;flex:0 0 auto;margin-left:8px;padding:3px 10px;border-radius:999px;font-size:12px;line-height:18px;max-width:46ch;overflow-wrap:anywhere}
.md-ai-status[data-show]{display:inline-flex}
.md-ai-status[data-type="loading"]{background:var(--md-surface);color:var(--md-muted)}
.md-ai-status[data-type="ok"]{background:rgba(22,163,74,.12);color:#16a34a}
.md-ai-status[data-type="error"]{background:rgba(220,38,38,.1);color:#dc2626}
.md-ai-spin{flex:0 0 auto;width:11px;height:11px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;animation:md-ai-spin .7s linear infinite}
@keyframes md-ai-spin{to{transform:rotate(360deg)}}
@media(max-width:480px){.md-ai-status{margin-left:0;order:9}}

/* ===== 视频合集（版式 A：一个播放器 + 底部缩略条） =====
 * 配色只认 --md-*，不引入新色相；缩略条横向滚动是手机档的唯一出路（375 放不下四格）。
 * 封面缺图时回落成「色块 + 首字」，虚拟主机没有 ffmpeg 截不了帧，别为它加请求。
 */
.md-video-set{box-sizing:border-box;width:100%;margin:16px 0;padding:12px;border:1px solid var(--md-border);border-radius:12px;background:var(--md-bg)}
.md-video-set-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.md-video-set-title{font-size:15px;font-weight:600;color:var(--md-text);overflow-wrap:anywhere}
.md-video-set-summary{font-size:12px;color:var(--md-muted)}
.md-video-set-stage{position:relative;width:100%;border-radius:8px;overflow:hidden;background:#000}
.md-video-set-slide{display:none}
.md-video-set-slide.is-on{display:block}
/* 内层沿用单条 ::video 的 .md-video-wrap（比例壳已经由服务端按 ratio 写好），合集里只要去掉它自己的外边距 */
.md-video-set-slide .md-video-wrap{margin:0;border-radius:0}
.md-video-set-cap{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-top:8px}
.md-video-set-cap b{font-size:13px;font-weight:600;color:var(--md-text);overflow-wrap:anywhere}
.md-video-set-cap span{font-size:12px;color:var(--md-muted)}
/* 缩略条 = 播放列表条（v2.0.64 站长嫌 132 的方块太大）：小图在左，右边两行
 * 第一行标题省略号，第二行直接吃服务端已有的 data-md-video-meta，前端不拼字。
 * 一条 140×60（手机档 124×56），比原来那档方块矮一半；集数多了照样横向滚。 */
.md-video-set-strip{display:flex;gap:6px;margin-top:10px;padding-bottom:4px;overflow-x:auto;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
.md-video-set-strip::-webkit-scrollbar{height:6px}
.md-video-set-strip::-webkit-scrollbar-track{background:transparent}
.md-video-set-strip::-webkit-scrollbar-thumb{border-radius:3px;background:var(--md-border)}
.md-video-set-item{box-sizing:border-box;position:relative;flex:0 0 auto;display:flex;flex-wrap:wrap;align-items:center;gap:5px 6px;width:140px;padding:4px;border:1px solid var(--md-border);border-radius:7px;background:var(--md-surface);color:var(--md-muted);font:inherit;text-align:left;cursor:pointer}
.md-video-set-item:focus-visible{outline:2px solid var(--md-primary);outline-offset:2px;border-radius:7px}
.md-video-set-thumbwrap{position:relative;flex:0 0 auto;display:block;width:46px;aspect-ratio:16/9;border-radius:4px;overflow:hidden;background:var(--md-surface-2)}
.md-video-set-thumb{display:block;width:100%;height:100%;object-fit:cover;border:0}
/* 封面那一格没有图就画集数（v2.0.71 站长点名「这个显示第几集」，原来画的是标题首字）：
 * 46 宽的格子放「第1集」按原来 13px 会顶到边，收到 10px。
 * v2.0.72：原来压在右下角的时长角标撤了 —— 它和「第1集」在这 46×26 的格子里叠成一团
 * （「第8:12集」），时长改到卡片第二行，服务端 videoItemMeta() 是唯一出口。 */
.md-video-set-thumb-f{display:grid;place-items:center;font-size:10px;font-weight:700;color:var(--md-muted);background:var(--md-surface-2);font-variant-numeric:tabular-nums}
/* 标题这一行永远待在封面格的右边（v2.0.72）：原来写 flex:1 1 auto，基准是内容宽，
 * 长标题放不下就整行折到封面下面 —— 一合集里卡片有高有矮，站长说的「太乱」有一半是这个。
 * 改成 1 1 0 后它只吃剩下的宽度，放不下就省略号 + 跑马灯，形状恒定。 */
.md-video-set-item-cap{flex:1 1 0;min-width:0;display:block;margin:0;font-size:11px;line-height:1.3;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--md-muted)}
/* 标题太长放不下：鼠标放上去滚一遍（跑马灯）。
 * --md-vset-marquee 是 markdown.js 当场量出来的「超出多少像素」，只有真超长的才挂 is-long，
 * 所以短标题不会莫名其妙动起来；距离交给 CSS，滚多长由内容说了算，这里不写死。
 * v2.0.72 站长说「跑马灯效果也没出来」—— 实测动画确实在跑，但上一版是「起步 1.2 秒 + 每像素 22ms」，
 * 178px 要 5.1 秒走完，头 15% 还专门停着等人眼（0.77 秒），鼠标一挪过去什么动静都看不见。
 * 现在按 ~100px/秒 走，停顿收到 6%（约 0.15 秒），一眼就知道它在滚。 */
.md-video-set-item:hover .md-video-set-item-cap.is-long{text-overflow:clip;animation:md-vset-marquee calc(500ms + var(--md-vset-marquee, 0) * 9ms) linear infinite alternate}
@keyframes md-vset-marquee{
  0%,6%{text-indent:0}
  94%,100%{text-indent:calc(var(--md-vset-marquee, 0) * -1px)}
}
/* 系统关了动画的用户：不滚，但也不能让他只剩一个省略号 —— 放上去把标题折出来给他看全。
 * 上一版这里是 animation:none 什么都不做，等于「关了动画 = 这个功能没有」。 */
@media(prefers-reduced-motion:reduce){
  .md-video-set-item:hover .md-video-set-item-cap.is-long{animation:none;text-indent:0;white-space:normal;
    display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;text-overflow:clip}
}
/* 选中态（v2.0.72 站长：「哪一集被选中，看的也不是很清楚」）
 * 原来只有 1px 青绿描边 + 底色从 #f3f6f8 抬到 #eef2f6 —— 实测这两档底色差 5 个级，肉眼分不出来，
 * 封面格那枚「第N集」选中与否长得一模一样。现在三件事一起说同一句话：
 * 描边加到 2px、整张卡铺一层 10% 的主题色、封面格翻成主题色实底（前景走 --md-on-primary，
 * 暗色下它是深墨绿，压在亮薄荷上才不会糊成一片）。配色只认 --md-*，不引入新色相。
 * padding 跟着从 4 收到 3：box-sizing 是 border-box，2px 边比 1px 边多吃 2px 内宽，
 * 不补这一格就有选中的那张标题行比别人窄 2px（浏览器回归量的就是这三个数）。 */
.md-video-set-item::after{content:attr(data-md-video-meta);flex:0 0 100%;display:block;font-size:10px;line-height:1.3;color:var(--md-faint);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}
.md-video-set-item.is-on{border:2px solid var(--md-primary);padding:3px;background:rgba(var(--md-primary-rgb),.10)}
.md-video-set-item.is-on .md-video-set-thumb-f{background:var(--md-primary);color:var(--md-on-primary)}
.md-video-set-item.is-on .md-video-set-item-cap{color:var(--md-text);font-weight:600}
.md-video-set-item.is-on::after{color:var(--md-muted)}
/* hover 那圈浅描边只留给没选中的：.is-on:hover 权重 (0,3,0) 压过 :hover (0,2,0)，所以不必靠书写顺序 */
.md-video-set-item:hover{border-color:var(--md-faint)}
.md-video-set-item.is-on,.md-video-set-item.is-on:hover{border-color:var(--md-primary)}
/* 提权：正文里的 .post-content p 是 (0,1,1)，单类 (0,1,0) 压不住它的下边距 */
.md-video-set .md-video-set-noscript{margin:8px 0 0;font-size:12px;color:var(--md-muted)}
@media(max-width:560px){
  .md-video-set{margin:12px -4px;padding:10px;border-radius:10px}
  /* 手机档再收一档：124 宽一条，一屏能看见两条半，仍然横向滚 */
  .md-video-set-item{width:124px}
  .md-video-set-thumbwrap{width:40px}
}

/* ===== 视频合集录入弹窗（一集一行：第几集 / 集数标签 / 标题 在上，地址 / 时长 在下） ===== */
.md-vset-form{display:flex;flex-direction:column}
.md-vset-form textarea{box-sizing:border-box;width:100%;min-height:68px;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:13.5px;line-height:1.5;font-family:inherit;background:var(--md-bg);color:var(--md-text);resize:vertical}
.md-vset-form textarea:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-vset-items{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.md-vset-row{display:flex;flex-direction:column;gap:6px;padding:8px 10px;border:1px solid var(--md-border);border-radius:6px;background:var(--md-surface)}
.md-vset-row-head,.md-vset-row-line{display:flex;align-items:center;flex-wrap:wrap;gap:6px}
.md-vset-row-num{flex:0 0 auto;font-size:12px;font-weight:600;color:var(--md-primary)}
.md-vset-row input{box-sizing:border-box;min-width:0;padding:5px 8px;border:1px solid var(--md-border);border-radius:4px;font-size:12.5px;background:var(--md-bg);color:var(--md-text)}
.md-vset-row input:focus{outline:none;border-color:var(--md-primary)}
.md-vset-row input::placeholder{color:var(--md-faint)}
.md-vset-row-title{flex:1 1 140px}
.md-vset-row-tag{flex:0 0 auto;padding:0 7px;border:1px solid currentColor;border-radius:999px;color:var(--md-muted);font-size:11px;line-height:17px;font-weight:600}
/* 长地址是这次要解决的事：不给它 flex:1，未聚焦时用省略号收住，悬停看全文（title 由 JS 写） */
.md-vset-row-url{flex:1 1 180px;min-width:120px;overflow:hidden;text-overflow:ellipsis}
.md-vset-row-dur{flex:0 0 auto;width:62px}
.md-vset-row-move,.md-vset-row-del{flex:0 0 auto;width:22px;height:22px;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--md-faint);font-size:13px;line-height:1;cursor:pointer}
.md-vset-row-move:hover:not(:disabled){border-color:var(--md-border);background:var(--md-bg);color:var(--md-text)}
.md-vset-row-move:disabled{opacity:.35;cursor:default}
.md-vset-row-del:hover{border-color:#fecaca;background:#fef2f2;color:#dc2626}
.md-vset-row.is-bad{border-color:#fecaca}
.md-vset-row.is-bad .md-vset-row-tag{color:#dc2626}
.md-vset-add{align-self:flex-start;padding:5px 12px;margin-bottom:10px;border:1px dashed var(--md-border);border-radius:4px;background:transparent;color:var(--md-muted);font-size:13px;cursor:pointer}
.md-vset-add:hover{border-color:var(--md-primary);color:var(--md-primary)}
/* 批量粘贴是次要入口：默认收起，看起来也不像主按钮 */
.md-vset-batch-toggle{align-self:flex-start;padding:0;border:0;background:none;color:var(--md-faint);font-size:12.5px;text-decoration:underline;cursor:pointer}
.md-vset-batch-toggle:hover{color:var(--md-muted)}
.md-vset-batch{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.md-vset-batch-apply{align-self:flex-start;padding:4px 12px;border:1px solid var(--md-border);border-radius:4px;background:var(--md-bg);color:var(--md-text);font-size:12.5px;cursor:pointer}
.md-vset-batch-apply:hover{border-color:var(--md-primary);color:var(--md-primary)}
.md-vset-tip{display:block;margin-top:8px;color:#dc2626}
.md-vset-tip.is-ok{color:var(--md-primary)}
.md-vset-tip:empty{display:none}

/* ===== v2.0.73 丁 + 戊：合集「插入后再编辑」 =====
 * 戊：镜像条挂在编辑区右边。它只读，正文一个字不经它的手，所以不需要反向解析器，
 * 也永远不会和站长正在打的字打架。配色沿用前台那条卡条的三件套（描边 + 10% 主题底 + 实底角标），
 * 选中态和 .md-video-set-item.is-on 同一个说法；padding 补 1px 是因为 2px 边比 1px 边多吃一格内宽。 */
.md-editor-field.has-vrail{display:grid;grid-template-columns:minmax(0,1fr) 268px;grid-template-rows:auto minmax(160px,1fr);column-gap:10px}
.md-editor-field.has-vrail .md-editor-toolbar{grid-column:1 / -1}
.md-editor-field.has-vrail .md-editor-textarea{grid-column:1;grid-row:2}
.md-vset-rail{grid-column:2;grid-row:2;box-sizing:border-box;min-height:0;display:flex;flex-direction:column;gap:8px;padding:10px;border:1px solid var(--md-border);border-radius:6px;background:var(--md-surface)}
.md-vset-rail[hidden]{display:none}
.md-vset-rail-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.md-vset-rail-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;color:var(--md-text)}
.md-vset-rail-sum{flex:0 0 auto;font-size:11px;color:var(--md-muted)}
.md-vset-rail-list{min-height:0;flex:1 1 auto;display:flex;flex-direction:column;gap:6px;overflow-y:auto;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
.md-vset-rail-card{box-sizing:border-box;display:flex;align-items:center;gap:6px;width:100%;padding:5px 6px;border:1px solid var(--md-border);border-radius:7px;background:var(--md-bg);color:var(--md-muted);font:inherit;text-align:left;cursor:pointer}
.md-vset-rail-card:hover{border-color:var(--md-faint)}
.md-vset-rail-card:focus-visible{outline:2px solid var(--md-primary);outline-offset:1px}
.md-vset-rail-num{flex:0 0 auto;padding:2px 6px;border-radius:4px;background:var(--md-surface-2);color:var(--md-muted);font-size:10px;font-weight:700;font-variant-numeric:tabular-nums}
.md-vset-rail-main{flex:1 1 0;min-width:0;display:flex;flex-direction:column;gap:2px}
.md-vset-rail-cap{display:block;font-size:11.5px;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.md-vset-rail-meta{display:block;font-size:10px;line-height:1.3;color:var(--md-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.md-vset-rail-jump{flex:0 0 auto;font-size:10.5px;color:var(--md-faint)}
.md-vset-rail-card.is-on{border:2px solid var(--md-primary);padding:4px 5px;background:rgba(var(--md-primary-rgb),.10)}
.md-vset-rail-card.is-on .md-vset-rail-num{background:var(--md-primary);color:var(--md-on-primary)}
.md-vset-rail-card.is-on .md-vset-rail-cap{color:var(--md-text);font-weight:600}
.md-vset-rail-card.is-on .md-vset-rail-jump{color:var(--md-primary);font-weight:600}
/* 窄屏不跟正文抢宽度：镜像条回到编辑区下面，仍然只读 */
@media(max-width:900px){
  .md-editor-field.has-vrail{grid-template-columns:minmax(0,1fr)}
  .md-vset-rail{grid-column:1;grid-row:auto;max-height:230px}
}
/* 丁：小卡（编辑这一集 / 编辑合集标题）。最后一行是「这一行会写成什么样」，所见即所存 */
.md-vset-mini{display:flex;flex-direction:column}
.md-vset-mini select{box-sizing:border-box;width:100%;padding:8px 12px;border:1px solid var(--md-border);border-radius:4px;font-size:14px;background:var(--md-bg);color:var(--md-text)}
.md-vset-mini select:focus{outline:none;border-color:var(--md-primary);box-shadow:0 0 0 .2rem rgba(var(--md-primary-rgb),.15)}
.md-vset-mini-line{display:flex;align-items:center;gap:6px;margin-bottom:12px;padding:6px 8px;border:1px solid var(--md-border);border-radius:6px;background:var(--md-surface)}
.md-vset-mini-line.is-bad{border-color:#fecaca}
.md-vset-mini-line.is-bad .md-vset-row-tag{color:#dc2626}
.md-vset-mini-preview{flex:1 1 0;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.4;color:var(--md-text);white-space:nowrap;overflow-x:auto;scrollbar-width:thin}
