/* MS Archive — 管理后台专用样式（仅在 /admin 下加载，不计入前台性能预算） */
/* ---------------- 介质行（含盘面照片） ---------------- */
/* 第一行：序号 | 类型 | 正面 Part No. | 卷标 | 盘面标注 | 盘面照片。
   第二行：内环 Part No. + 内环其他信息（数据面内圈的字）。
   正面 Part No. 与卷标是两种东西（前者是包装上印的编号，后者是盘上那串），所以各占一列，
   并由 .media-head 给每个输入框一个列名 —— 光靠 placeholder 看不出哪列是哪个。 */
.media-rows {display: flex; flex-direction: column; gap: 10px;}
.media-row {display: flex; flex-direction: column; gap: 6px; padding-bottom: 8px; border-bottom: 1px dotted var(--border);}
.media-row:last-child {border-bottom: 0; padding-bottom: 0;}
.mr-line,
.media-head {display: grid; grid-template-columns: 34px minmax(112px, 150px) minmax(96px, 1fr) minmax(96px, 1fr) minmax(96px, 1fr) minmax(140px, 200px); gap: 10px;}
.mr-line {align-items: center;}
.media-head {align-items: end; padding: 0 0 2px; font-size: 11px; color: var(--text-mute);}
.media-head > span {display: flex; flex-direction: column; gap: 1px; line-height: 1.25;}
.media-head i {font-style: normal; font-size: 10px; color: #b3aea4;}
.media-head .mh-seq {text-align: left;}
/* 关键：main.js 用 row.hidden 收起超出「介质数量」的行，而上面的 display:flex 会盖掉 [hidden]，
   于是 20 行全显示出来（后台每次编辑都能看到）。这条必须留着。 */
.media-row[hidden] {display: none;}
.mr-line select, .mr-line input[type="text"], .mr-line textarea {border: 1px solid var(--border); padding: 6px 9px; font-size: 13px; font-family: var(--sans); background: var(--surface); color: var(--text); min-width: 0;}
.mr-line textarea {resize: vertical; min-height: 32px; line-height: 1.35;}
/* 输入框 + 置信度徽标：徽标自己占一格，不能直接行内跟在输入框后面 ——
   那样它会被当成 grid 的一列，把后面所有单元格挤到下一行（实测过）。 */
.mr-cell {display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px; align-items: center; min-width: 0;}
.mr-cell > input[type="text"], .mr-cell > textarea {width: 100%;}
.mr-cell > .ai-conf {margin-left: 0;}
/* 内环那一行：左两列是组名，编号对齐「类型」列，其余信息占满右侧三列 */
.mr-line.mr-inner {align-items: start;}
.mr-inner-k {grid-column: 1 / 3; display: flex; flex-direction: column; gap: 1px; font-size: 11px; color: var(--text-mute); padding-top: 7px;}
.mr-inner-k i {font-style: normal; font-size: 10px; color: #b3aea4;}
.mr-inner-part {grid-column: 3;}
.mr-inner-note {grid-column: 4 / 7;}
.media-photo {display: flex; align-items: center; gap: 8px; flex-wrap: wrap;}
/* 缩略图固定 44×44 的方框 + overflow:hidden：不管原图是横是竖都不会溢出、
   遮住旁边的「删除图片」控件（2026-10-26 反馈的遮挡问题）。 */
.mp-thumb {display: block; width: 44px; height: 44px; border: 1px solid var(--border); overflow: hidden; flex: 0 0 auto; background: var(--zebra, #f6f6f4);}
.mp-thumb .pic {display: block; width: 44px; height: 44px; border: 0;}
.mp-thumb .pic img {display: block; width: 44px; height: 44px; object-fit: cover;}
.mp-empty {display: inline-block; width: 44px; text-align: center; color: #c4c0b8; font-size: 11px;}
.media-photo input[type="file"] {font-size: 11px; max-width: 120px; border: 0; padding: 0;}
/* 删除盘面照片：做成看得见的按钮（勾选后保存才生效），不再是 11px 的一行「删」 */
.mp-remove {display: inline-flex; align-items: center; gap: 4px; padding: 5px 8px; border: 1px solid var(--border); background: var(--surface); color: var(--text-mute); font-size: 12px; line-height: 1; cursor: pointer; white-space: nowrap;}
.mp-remove:hover {border-color: #b23b3b; color: #8a2020;}
.mp-remove:has(input:checked) {border-color: #b23b3b; color: #8a2020; background: #fdf2f2;}
.mp-remove input {margin: 0; accent-color: #b23b3b;}
.mr-seq {color: var(--text-mute); font-size: 11px;}
/* 窄屏：介质行改成两列堆叠，表头就没意义了（列与输入框不再对齐），直接藏掉 */
@media (max-width: 900px) {
  .media-head {display: none;}
  .mr-line {grid-template-columns: 34px 1fr; align-items: start;}
  .mr-line .media-photo {grid-column: 2;}
  .mr-inner-k {grid-column: 1 / -1; padding-top: 0;}
  .mr-inner-part, .mr-inner-note {grid-column: 2;}
}
/* ---------------- 后台框架（顶栏只放身份，导航在左栏） ---------------- */
.admin-head {position: sticky; top: 0; z-index: 50; display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 54px; background: var(--surface); border-bottom: 1px solid var(--border); padding: 8px 20px;}
.admin-head-actions {display: flex; align-items: center; gap: 16px; font-size: 12px;}
.admin-head-link {color: var(--text-mute); text-decoration: none;}
.admin-head-link:hover {color: var(--accent);}
.admin-user {color: var(--text);}
.admin-shell {display: grid; grid-template-columns: 188px minmax(0, 1fr); gap: 28px; max-width: 1280px; margin: 0 auto; padding: 20px 24px 48px;}
.admin-side {position: sticky; top: 72px; align-self: start; max-height: calc(100vh - 88px); overflow-y: auto; padding-right: 4px;}
.admin-nav {display: flex; flex-direction: column; gap: 1px;}
.an-group {margin: 16px 0 4px; padding: 0 9px; font-size: 10px; letter-spacing: .12em; color: #b3aea4;}
.an-link {display: flex; align-items: center; gap: 7px; padding: 6px 9px; border-left: 2px solid transparent; color: var(--text-mute); text-decoration: none; font-size: 12.5px; line-height: 1.45;}
.an-link:hover {color: var(--accent); background: #f6f3ed;}
.an-link.is-on {color: var(--text); background: #efece5; border-left-color: var(--accent); font-weight: 600;}
.an-link .nav-badge {margin-left: auto;}
.admin-main {min-width: 0; max-width: none; margin: 0; padding: 0;}
.admin-main-plain {max-width: 1080px; margin: 0 auto; padding: 20px;}
/* ---------------- 内容页标签 ---------------- */
.page-tabs {display: flex; gap: 6px; margin-bottom: 14px; flex-wrap: wrap;}
.page-tabs a {border: 1px solid var(--border); padding: 4px 12px; text-decoration: none; background: var(--surface);}
.page-tabs a:hover {border-color: var(--accent); color: var(--accent);}
.page-tabs a.is-on {background: var(--text); color: var(--surface); border-color: var(--text);}
.form-ok {border: 1px solid var(--ok); color: var(--ok); padding: 6px 12px; margin-bottom: 12px; font-size: 13px;}
/* ---------------- 登录 ---------------- */
.login-wrap {max-width: 360px; margin: 60px auto; border: 1px solid var(--border); background: var(--surface); padding: 24px;}
.login-form {margin-top: 14px;}
/* 验证码：图与「换一道」并排；图带边框，方便看清噪点里的字 */
.captcha-row {display: flex; align-items: center; gap: 10px; margin: -4px 0 12px;}
.captcha-img {display: block; border: 1px solid var(--border); background: #fff; width: 200px; height: 64px;}
.captcha-refresh {font-size: 12px; color: var(--text-mute); text-decoration: underline;}
.captcha-refresh:hover {color: var(--accent);}
/* ---------------- 概览统计 ---------------- */
.stat-grid {display: grid; grid-template-columns: repeat(auto-fit, minmax(158px, 1fr)); gap: 10px; margin-bottom: 16px;}
.stat {display: flex; flex-direction: column; gap: 1px; border: 1px solid var(--border); background: var(--surface); padding: 10px 12px; text-decoration: none;}
a.stat:hover {border-color: #cfc8bc; background: #fcfbf8;}
.st-k {color: var(--text-mute); font-size: 11px;}
.st-n {font-size: 25px; line-height: 1.2;}
.st-l {color: var(--text-mute); font-size: 12px;}
.st-sub {color: #a8a399; font-size: 11px;}
.admin-cols {display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 16px;}
.admin-panel {border: 1px solid var(--border); background: var(--surface); padding: 12px 14px; margin-bottom: 14px; min-width: 0;}
.admin-panel h2 {margin: 0; font-size: 14px;}

.panel-head {display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 8px;}
.panel-head > a {font-size: 11px; text-decoration: none;}
.panel-meta {color: var(--text-mute); font-size: 11px;}
.page-lede {margin: -4px 0 14px; color: var(--text-mute); font-size: 12.5px;}
.admin-search {display: flex; gap: 8px; margin-bottom: 10px; flex-wrap: wrap;}
.admin-search input, .admin-search select {border: 1px solid var(--border); padding: 6px 9px; font-size: 13px; background: var(--surface);}
.admin-table {border-collapse: collapse; width: 100%;}
.admin-table th {text-align: left; font-weight: 400; font-family: var(--mono); font-size: 10.5px; color: #a8a399; padding: 4px 8px 5px 0; border-bottom: 1px solid var(--border); white-space: nowrap;}
.admin-table td {font-size: 12px; padding: 5px 8px 5px 0; border-bottom: 1px dotted var(--border); vertical-align: top;}
.admin-table tr:last-child td {border-bottom: 0;}
.admin-table .num {text-align: right; padding-right: 0;}
.table-scroll {overflow-x: auto;}
.nowrap {white-space: nowrap;}
.item-table .it-title {min-width: 280px;}
.item-table .it-version {min-width: 150px;}
.admin-table .at-title {min-width: 260px;}
.admin-row-actions a + a {margin-left: 9px;}
.admin-row-actions a {text-decoration: none;}
/* ---------------- 概览：待办 / 变更 / 访问 ---------------- */
.dash-grid {display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(248px, .75fr); gap: 14px; margin-bottom: 14px; align-items: start;}
.dash-side {display: flex; flex-direction: column; gap: 14px; min-width: 0;}
.dash-side .admin-panel {margin-bottom: 0;}
.queue-block + .queue-block {margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--border);}
.mini-head {display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 3px;}
.mini-head h3 {margin: 0; font-size: 12px; font-weight: 600;}
.mini-head a {font-size: 11px; text-decoration: none;}
.mini-list {list-style: none; margin: 0; padding: 0;}
.mini-list li {display: flex; align-items: baseline; gap: 8px; padding: 5px 0; border-bottom: 1px dotted var(--border); font-size: 12px; min-width: 0;}
.mini-list li:last-child {border-bottom: 0;}
.mini-list a {flex: 0 0 auto; font-size: 11px;}
.ml-title {min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.ml-meta {margin-left: auto; flex: 0 0 auto; color: #a8a399; font-size: 10.5px; white-space: nowrap;}
.mini-empty {margin: 4px 0 0; color: var(--text-mute); font-size: 12px;}
.mini-note {margin: 8px 0 0; font-size: 11px; line-height: 1.6;}
.quick-actions {display: flex; flex-wrap: wrap; gap: 6px; margin: 0;}
.quick-actions .btn {padding: 4px 10px; font-size: 12px;}
.changelog {list-style: none; padding: 0; margin: 0;}
.changelog li {display: flex; align-items: baseline; gap: 8px; padding: 4px 0; border-bottom: 1px dotted var(--border); font-size: 11px; min-width: 0;}
.changelog li:last-child {border-bottom: 0;}
.cl-at {flex: 0 0 auto; color: #a8a399;}
.cl-action {flex: 0 0 auto; color: var(--text);}
.cl-target {min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.cl-actor {flex: 0 0 auto; margin-left: auto;}
.visit-now {display: flex; align-items: baseline; gap: 8px; margin: 2px 0 8px;}
.visit-now strong {font-size: 34px; line-height: 1; font-weight: 500;}
.visit-now > span {font-size: 11px; color: var(--text-mute); line-height: 1.45;}
.mini-chart {display: flex; align-items: flex-end; gap: 4px; height: 64px; padding: 0 1px;}
.mc-col {flex: 1 1 0; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; gap: 2px;}
.mc-bar {display: block; width: 100%; max-width: 16px; background: var(--accent); opacity: .78; border-radius: 1px 1px 0 0;}
.mc-col:hover .mc-bar {opacity: 1;}
.mc-x {font-family: var(--mono); font-size: 9px; color: #b3aea4; line-height: 1;}
.visit-meta {margin: 8px 0 0; font-size: 11px; color: var(--text-mute);}
.dash-login .login-fails summary {display: flex; align-items: baseline; justify-content: space-between; gap: 10px; list-style: none; cursor: pointer;}
.dash-login .lf-title {font-size: 14px; font-weight: 600;}
.dash-login .login-fails summary::-webkit-details-marker {display: none;}
.dash-login .login-fails[open] summary {margin-bottom: 8px;}
.dash-login .plain-list {max-height: 180px; overflow: auto;}
.mini-kv {margin: 2px 0 0;}
.mini-kv li {padding: 2px 0;}
/* ---------------- 访问量 ---------------- */
.traffic-chart {display: flex; align-items: flex-end; gap: 3px; height: 176px; padding: 4px 0 0; overflow-x: auto;}
.tc-col {flex: 1 0 8px; min-width: 8px; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; gap: 3px;}
.tc-stack {display: flex; align-items: flex-end; justify-content: center; gap: 1px; width: 100%; height: 150px;}
.tc-bar {display: block; width: 50%; max-width: 8px; min-height: 0; border-radius: 1px 1px 0 0;}
.tc-bar-human {background: var(--accent); opacity: .8;}
.tc-bar-bot {width: 32%; background: #d9d3c8;}
.tc-col:hover .tc-bar-human {opacity: 1;}
.tc-x {font-family: var(--mono); font-size: 9px; line-height: 1; color: #b3aea4; white-space: nowrap;}
.traffic-cols {display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(240px, .65fr); gap: 14px;}
.traffic-stats {grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));}
.traffic-table .tr-path {display: block; font-size: 10px; margin-top: 1px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 360px;}
.traffic-log .tr-ua {max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.traffic-log tr.is-bot {opacity: .62;}
.pill-bot {border-color: #c9c2b6; color: #8c8578;}
@media (max-width: 1080px) {
  .dash-grid, .dash-grid-lower, .traffic-cols {grid-template-columns: 1fr;}
  .dash-side {display: grid; grid-template-columns: 1fr 1fr; gap: 14px;}
}
@media (max-width: 860px) {
  .admin-head {position: static; flex-wrap: wrap; padding: 8px 14px;}
  .admin-head-actions {width: 100%; justify-content: flex-end; gap: 12px;}
  .admin-shell {display: block; padding: 12px 14px 36px;}
  .admin-side {position: static; max-height: none; overflow: visible; margin: 0 0 16px; padding: 0;}
  .admin-nav {flex-direction: row; flex-wrap: nowrap; overflow-x: auto; gap: 4px; padding-bottom: 6px;}
  .an-group {display: none;}
  .an-link {white-space: nowrap; border: 1px solid var(--border); background: var(--surface); padding: 4px 9px;}
  .an-link.is-on {border-color: var(--text); border-left-width: 1px; background: var(--text); color: var(--surface);}
  .an-link .nav-badge {margin-left: 3px;}
  .admin-main-plain {padding: 0;}
  .admin-cols, .dash-side {grid-template-columns: 1fr;}
}
@media (max-width: 640px) {
  .stat-grid {grid-template-columns: 1fr 1fr;}
  .stat {padding: 8px 10px;}
  .st-n {font-size: 22px;}
  .ml-meta {display: none;}
  .traffic-chart {height: 150px;}
  .tc-stack {height: 124px;}
  .tr-ua {display: none;}
}
/* ---------------- 表单与字段 ---------------- */
.admin-form {border: 1px solid var(--border); background: var(--surface); padding: 16px; margin-bottom: 16px;}
.fieldset {border: 1px solid var(--border); margin: 0 0 14px; padding: 10px 14px 14px; display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px 14px;}
.fieldset legend {font-size: 12px; font-weight: 600; padding: 0 6px; color: var(--text-mute);}
.field {display: flex; flex-direction: column; gap: 3px;}
.field-wide {grid-column: 1 / -1;}
.f-label {font-size: 12px; color: var(--text-mute);}
.f-hint {font-size: 11px; color: #b0aca2;}
/* 浏览器端压缩状态（public/assets/js/upload-compress.js 写入） */
.upload-status {font-family: var(--mono); font-size: 11px; color: var(--text-mute);}
.upload-status:empty {display: none;}
.upload-status[data-tone="busy"] {color: var(--warn);}
.upload-status[data-tone="ok"] {color: var(--ok);}
.upload-status[data-tone="warn"] {color: var(--warn);}
.f-ai-req {font-family: var(--mono); font-size: 10px; color: var(--accent); border: 1px solid var(--accent); padding: 0 5px; margin-left: 4px;}
/* ---------------- AI 置信度（条目编辑页） ----------------
   门槛与「待确认」页一致：≥90% 绿 / 75–90% 黄 / <75% 红。颜色只用在标签与徽标上，
   不动输入框本身 —— 免得一屏全红的边框让人以为是校验报错。 */
.ai-conf {display: inline-block; margin-left: 5px; padding: 0 5px; border-radius: 9px; border: 1px solid transparent; font-family: var(--mono); font-size: 10px; line-height: 16px;}
.ai-conf[data-level="high"] {color: #2c6e4a; background: #eaf5ee; border-color: #c6e3d2;}
.ai-conf[data-level="mid"]  {color: #8a6410; background: #fbf3e0; border-color: #ecdcb2;}
.ai-conf[data-level="low"]  {color: #a4342a; background: #fbebe8; border-color: #f0cbc5;}
/* 低置信度字段：标签左侧一条浅红，扫读时能一眼圈出要核的地方 */
.field.ai-low > .f-label {border-left: 2px solid #e2a49c; padding-left: 6px;}
.ai-confbar {border: 1px solid var(--border); border-left: 3px solid var(--accent); background: var(--surface); padding: 10px 14px; margin-bottom: 14px; font-size: 12.5px;}
.acb-head {margin: 0 0 4px; display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline;}
.acb-legend {margin-left: auto; display: inline-flex; gap: 2px; align-items: center;}
.acb-note {margin: 0 0 8px; color: var(--text-mute); line-height: 1.7;}
.acb-low {list-style: none; margin: 0 0 8px; padding: 0; display: flex; flex-wrap: wrap; gap: 4px 14px;}
.acb-low li {display: flex; align-items: center; gap: 2px;}
.acb-key {color: var(--text-mute); font-size: 11px;}
.acb-uncertain {margin-top: 6px;}
.acb-uncertain summary {cursor: pointer; font-size: 12px; color: var(--text-mute);}
.acb-uncertain ul {margin: 6px 0 0; padding-left: 20px; line-height: 1.75;}
.field input, .field select, .field textarea {border: 1px solid var(--border); padding: 6px 9px; font-size: 13px; font-family: var(--sans); background: var(--surface); color: var(--text);}
.field textarea {font-family: var(--mono); font-size: 12px; resize: vertical;}
.field input:focus, .field select:focus, .field textarea:focus {outline: none; border-color: var(--accent);}
.form-errors {color: var(--accent); border: 1px solid var(--accent); padding: 8px 12px; margin-bottom: 12px; font-size: 13px;}
/* 待确认草稿提示：提醒这里是"核对完就发布"的流程 */
.form-warn-note {border: 1px solid var(--warn, #9c6b00); color: #7a5400; background: #fdf8ec; padding: 6px 12px; margin-bottom: 12px; font-size: 13px;}
.form-actions {display: flex; gap: 10px; align-items: center; flex-wrap: wrap;}
/* 列表分页器：上下各一份，别让「还有第 2 页」这件事只出现在表格底下 */
.pager {margin: 8px 0;}
.pager a, .pager strong {display: inline-block; min-width: 20px; text-align: center;}
/* ---------------- 编辑页：该条目的图片条 ---------------- */
.edit-images {margin: 0 0 16px;}
.ei-head {display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 8px;}
.ei-head .block-title {margin: 0;}
.ei-manage {font-size: 12px;}
.ei-strip {display: flex; flex-wrap: wrap; gap: 10px;}
.ei-item {margin: 0; width: 96px;}
.ei-item img {display: block; width: 96px; height: 96px; object-fit: cover; border: 1px solid var(--border); background: var(--surface);}
.ei-item.is-cover img {border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent);}
.ei-item figcaption {font-size: 10px; color: var(--text-mute); margin-top: 3px; line-height: 1.4;}
.edit-mode-bar {display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 0 0 14px; padding: 8px 12px; border: 1px solid var(--border); background: var(--surface);}
.edit-mode-label {font-size: 12px; color: var(--text-mute);}
.edit-mode-bar select {border: 1px solid var(--border); background: var(--bg); color: var(--text); padding: 5px 9px; font-size: 13px; font-family: var(--sans);}
[data-edit-panel][hidden] {display: none !important;}
.item-image-workspace {margin: 20px 0 8px; padding-top: 16px; border-top: 1px solid var(--border);}
.item-upload-form {margin-bottom: 14px;}
.item-upload-form .fieldset {margin-bottom: 10px;}
.item-image-workspace .admin-images {margin-top: 8px;}
[data-item-images-empty] {margin: 8px 0 0;}
[data-item-upload-status][data-tone="ok"] {color: #2f6b3a;}
[data-item-upload-status][data-tone="warn"] {color: #9a3b2a;}
[data-item-upload-status][data-tone="busy"] {color: var(--text-mute);}
.ei-flag {color: var(--accent); margin-left: 3px;}
.ei-nofiles {display: flex; align-items: center; justify-content: center; width: 96px; height: 96px; border: 1px dashed var(--border); font-size: 11px; color: var(--text-mute);}
/* 发布按钮：与「保存」区分开（保存不发布，这个会发布） */
.btn-publish {background: var(--ok, #2d6a4f); border-color: var(--ok, #2d6a4f); color: #fff;}
.btn-publish:hover {background: var(--accent); border-color: var(--accent); color: #fff;}
/* ---------------- 按钮 ---------------- */
.btn {display: inline-block; border: 1px solid var(--border); background: var(--surface); color: var(--text); padding: 6px 14px; font-size: 13px; text-decoration: none; cursor: pointer; font-family: var(--sans);}
.btn:hover {border-color: var(--accent); color: var(--accent);}
.btn-primary {background: var(--text); color: var(--surface); border-color: var(--text);}
.btn-primary:hover {background: var(--accent); color: var(--surface); border-color: var(--accent);}
.btn-danger {color: var(--accent); border-color: var(--accent);}
/* ---------------- 待确认队列 ---------------- */
.review-summary {margin: 0 0 14px; font-size: 13px;}
.review-card {border: 1px solid var(--border); background: var(--surface); padding: 12px 14px; margin-bottom: 12px;}
/* 没权限批准的草稿淡一档并加左侧标记，一眼看出「这条不归我管」 */
.review-card.rc-locked {opacity: .72; border-left: 3px solid var(--border);}
.rc-top {display: flex; gap: 14px; align-items: flex-start;}
.rc-thumb {flex: none; width: 88px;}
.rc-thumb img {display: block; width: 88px; height: 112px; object-fit: cover; border: 1px solid var(--border); background: var(--zebra);}
.rc-thumb .noimg {display: flex; align-items: center; justify-content: center; width: 88px; height: 112px; border: 1px dashed var(--border); color: var(--text-mute); font-size: 11px;}
.rc-info {flex: 1 1 auto; min-width: 0;}
.rc-head {display: flex; gap: 12px; align-items: baseline; flex-wrap: wrap;}
.rc-src {font-family: var(--mono); font-size: 10px; border: 1px solid var(--border); color: var(--text-mute); padding: 0 5px;}
.rc-src-mine {border-color: var(--accent); color: var(--accent);}
.rc-owner {margin: 7px 0 0; font-size: 13px;}
.rc-locked-note {color: var(--accent);}
.rc-meta {margin: 6px 0; color: var(--text-mute);}
.rc-ai pre {background: var(--zebra); border: 1px solid var(--border); padding: 8px; font-size: 11px; overflow: auto;}
.rc-actions {display: flex; gap: 8px; margin-top: 10px; align-items: center; flex-wrap: wrap;}
.rc-actions form {margin: 0;}
/* 退回理由：默认收起，点开后才占一整行 —— 待确认页一屏有很多张卡，不能每条都摊一个输入框 */
.rc-return {margin: 0;}
.rc-return summary {list-style: none; cursor: pointer;}
.rc-return summary::-webkit-details-marker {display: none;}
.rc-return[open] {flex: 1 1 100%;}
.rc-return form {display: flex; gap: 8px; align-items: flex-end; margin-top: 8px;}
.rc-return .field {flex: 1 1 auto; margin: 0;}
.rc-return textarea {width: 100%;}
.article-return-note {margin-top: 4px; max-width: 320px; white-space: normal;}

/* ---------------- 文章审核页（非作者的管理员，只读 + 审核动作） ---------------- */
.article-review-facts {display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px 18px; margin: 0;}
.article-review-facts dt {font-family: var(--mono); font-size: 10px; letter-spacing: .08em; color: var(--text-mute);}
.article-review-facts dd {margin: 2px 0 0; font-size: 13px;}
.article-review-action-row {display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom: 14px;}
.article-review-action-row p {margin: 0;}
.article-review-reason, .article-review-delete {max-width: 620px; margin: 0 0 14px;}
.article-review-reason textarea, .article-review-delete textarea {width: 100%;}
.article-review-body {max-width: 760px; padding-top: 4px;}
.article-review-images {display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; margin: 0 0 24px;}
.article-review-images figure {margin: 0;}
.article-review-images img {display: block; width: 100%; height: 150px; object-fit: contain; border: 1px solid var(--border); background: var(--zebra);}
.article-review-images figcaption {margin-top: 4px; font-size: 11px;}

/* ---------------- 疑似重复面板（编辑页顶部 / 待确认卡片里 / 新建表单的实时预检） ----------------
   三级配色与 AI 置信度一致：高=红、疑似=橙、留意=灰。这是**提示**不是报错，所以用左边框 +
   浅底，别做成刺眼的红框 —— 管理员每改一次条目都会看到它。 */
.dup-panel {border: 1px solid var(--warn, #9c6b00); border-left: 3px solid var(--warn, #9c6b00); background: #fdf8ec; padding: 10px 14px; margin-bottom: 14px; font-size: 13px;}
.review-card .dup-panel {margin: 8px 0 4px;}
.dup-title {margin: 0 0 6px; font-size: 13px; letter-spacing: .04em;}
.dup-count {font-family: var(--mono); font-weight: 400; color: #7a5400; margin-left: 4px;}
.dup-note {margin: 0 0 8px; color: #7a5400;}
.dup-list {list-style: none; margin: 0; padding: 0;}
.dup-row {padding: 6px 0; border-top: 1px dotted rgba(156, 107, 0, .35);}
.dup-list > .dup-row:first-child {border-top: 0;}
.dup-main {display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap;}
.dup-main form {margin: 0;}
.dup-level {font-family: var(--mono); font-size: 10px; padding: 1px 5px; border: 1px solid currentColor;}
.dup-level[data-level="high"] {color: #a11; background: #fdecec;}
.dup-level[data-level="mid"] {color: #7a5400; background: #fbf1dc;}
.dup-level[data-level="low"] {color: var(--text-mute);}
.dup-draft {font-family: var(--mono); font-size: 10px; border: 1px solid var(--accent); color: var(--accent); padding: 0 5px;}
.dup-reasons {margin: 4px 0 0 2px; padding-left: 16px; color: #6b4a00; font-size: 12.5px; list-style: none;}
.dup-reasons li::before {content: '· '; color: var(--text-mute);}
.dup-done {margin-top: 8px;}
/* 全都确认过之后整段收成一行：编辑页每次都顶着一块黄色的「疑似重复」标题太吵 */
.dup-panel.dup-done {padding: 6px 12px;}
.dup-panel.dup-done > summary {cursor: pointer; margin: 0;}
.dup-done summary {cursor: pointer; color: var(--text-mute); font-size: 12.5px;}
.dup-live {margin: 0 0 12px; padding: 6px 10px; border-left: 3px solid var(--warn, #9c6b00); background: #fdf8ec; font-size: 12.5px; color: #7a5400;}
.dup-live.is-clear {border-left-color: var(--border); background: transparent; color: var(--text-mute);}
.dup-live .dl-item[data-level="high"] {color: #a11;}
.dup-live .dl-item[data-level="low"] {color: var(--text-mute);}
.dup-live .dl-why {color: var(--text-mute);}
.dup-live .dl-note {display: block; margin-top: 4px; color: var(--text-mute);}
.import-result {border: 1px solid var(--border); padding: 10px 14px; margin-bottom: 14px;}
.token-reveal {border: 1px solid var(--ok); background: var(--surface); padding: 12px 14px; margin-bottom: 16px;}
.token-reveal code {font-size: 13px; word-break: break-all; color: var(--ok);}

/* ---------------- 图片卡片（增 / 查 / 改 / 删） ---------------- */
.admin-images {display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px;}
.ai-card {display: flex; flex-direction: column; gap: 8px; border: 1px solid var(--border); background: var(--surface); padding: 10px;}
.ai-thumb {position: relative; border: 1px solid var(--border); background: var(--zebra);}
.ai-thumb img {display: block; width: 100%; max-height: 220px; object-fit: contain;}
.ai-flag {position: absolute; top: 6px; left: 6px; font-family: var(--mono); font-size: 10px; padding: 1px 6px; background: var(--surface); border: 1px solid var(--text); color: var(--text);}
.ai-flag-media {left: auto; right: 6px; border-color: var(--accent); color: var(--accent);}
.ai-id {margin: 0; word-break: break-all;}
.ai-form {display: flex; flex-wrap: wrap; gap: 6px; align-items: center;}
.ai-form select, .ai-form input[type="text"] {flex: 1 1 90px; min-width: 0; border: 1px solid var(--border); padding: 5px 8px; font-size: 12px; font-family: var(--sans); background: var(--surface); color: var(--text);}
.ai-form textarea {flex: 1 1 100%; min-width: 0; border: 1px solid var(--border); padding: 5px 8px; font-size: 12px; font-family: var(--sans); line-height: 1.45; background: var(--surface); color: var(--text); resize: vertical;}
.ai-form input[type="file"] {flex: 1 1 140px; min-width: 0; font-size: 11px;}
.ai-actions {display: flex; gap: 6px; flex-wrap: wrap; align-items: center;}
.ai-actions form {margin: 0;}
.btn.is-disabled {color: var(--text-mute); border-color: var(--border); background: var(--zebra); cursor: default;}
/* ---------------- 条目附件 ---------------- */
.item-attachment-workspace {margin: 0 0 24px; border-top: 1px solid var(--border); padding-top: 18px;}
.attachment-warn {border: 1px solid #d8b36a; background: #fbf4e3; color: #6b4d13; padding: 9px 12px; font-size: 12px; line-height: 1.6; margin: 0 0 12px;}
.attachment-upload {margin-bottom: 16px;}
.attachment-admin-list {border: 1px solid var(--border); background: var(--surface);}
.attachment-admin-row {display: flex; justify-content: space-between; gap: 14px; padding: 12px 14px; border-bottom: 1px dotted var(--border);}
.attachment-admin-row:last-child {border-bottom: 0;}
.attachment-admin-main {display: flex; gap: 10px; align-items: flex-start; min-width: 0;}
.attachment-admin-main strong {display: block; font-size: 13px;}
.attachment-admin-actions {display: flex; gap: 6px; align-items: flex-start; flex-wrap: wrap;}
.attachment-admin-actions form {margin: 0;}
.attachment-edit summary {list-style: none; cursor: pointer;}
.attachment-edit summary::-webkit-details-marker {display: none;}
.attachment-edit-form {display: flex; flex-wrap: wrap; gap: 6px; align-items: flex-end; margin-top: 8px; padding: 8px; border: 1px solid var(--border); background: var(--zebra);}
.attachment-edit-form .field {margin: 0;}
.attachment-edit-form input[type="text"], .attachment-edit-form input[type="number"], .attachment-edit-form textarea {border: 1px solid var(--border); padding: 5px 8px; font-size: 12px; font-family: var(--sans); background: var(--surface); color: var(--text);}
.attachment-edit-form textarea {min-width: 260px; resize: vertical;}
@media (max-width: 640px) {
  .attachment-admin-row {flex-direction: column;}
  .attachment-edit-form textarea {min-width: 0; width: 100%;}
}
/* ---------------- 管理员列表 ---------------- */
.user-list {display: flex; flex-direction: column; gap: 10px;}
.user-row {border: 1px solid var(--border); background: var(--surface); padding: 12px 14px;}
.user-row.is-off {background: var(--zebra);}
.ur-head {display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 10px;}
.ur-name {font-weight: 600;}
.ur-tag {font-family: var(--mono); font-size: 10px; border: 1px solid var(--accent); color: var(--accent); padding: 0 5px;}
.ur-role {color: var(--text-mute);}
.ur-state {font-size: 12px;}
.ur-meta {margin-left: auto; font-size: 11px;}
.ur-form {display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: flex-end;}
.ur-field {display: flex; flex-direction: column; gap: 3px; flex: 1 1 150px; min-width: 0;}
.ur-field-wide {flex: 1 1 100%;}
.ur-field input, .ur-field select, .ur-field textarea {border: 1px solid var(--border); padding: 6px 9px; font-size: 13px; font-family: var(--sans); background: var(--surface); color: var(--text);}
.ur-field textarea {font-family: var(--sans); resize: vertical;}
.ur-check {font-size: 12px; display: flex; align-items: center; gap: 5px; padding-bottom: 7px;}
.ur-self {font-size: 11px; padding-bottom: 9px;}
.ur-delete {margin-top: 8px;}

/* ---------------- 站点标识 ---------------- */
.admin-head .brand {display: inline-flex; align-items: center; gap: 8px; text-decoration: none;}
.admin-head .brand-text {display: inline-flex; align-items: baseline; gap: 8px;}

/* ---------------- 打码与 AI 风险提示 ---------------- */
.ai-redacted {margin: 6px 0 0; font-size: 11.5px; color: var(--accent); font-family: var(--mono);}
.review-warn {border-left: 3px solid var(--accent); background: #fdf3ef; padding: 8px 10px; margin: 8px 0; font-size: 12.5px;}
.review-note {border-left: 3px solid var(--border); padding: 6px 10px; margin: 6px 0; font-size: 12px; color: var(--text-mute);}

/* ---------------- 录入 Skill 页 ---------------- */
.skill-cmd {background: var(--zebra); border: 1px solid var(--border); padding: 12px 14px; font-size: 12px; line-height: 1.7; overflow-x: auto; margin: 10px 0;}

/* ---------------- 环境提示（开发版本） ---------------- */
.env-banner {display: flex; gap: 12px; align-items: flex-start; border: 1px solid var(--accent); border-left-width: 3px; padding: 12px 14px; margin: 0 0 18px; background: #fdf8f6;}
.env-tag {flex: 0 0 auto; font-family: var(--mono); font-size: 11px; color: #fff; background: var(--accent); padding: 2px 7px;}
.env-banner p {margin: 5px 0 0; font-size: 12.5px;}

/* 未关联介质的警示标记 */
.ai-flag-warn {background: var(--accent); border-color: var(--accent);}

/* 勾选框类字段（.field 是 column 方向，这里必须显式改回 row）：
   否则 flex-wrap 在 column 方向上是「折成第二列」—— 提示文字会横着溢出格子，
   压在右边那一栏的标签上（「测试版（Beta / RC）」曾经就是这样）。
   提示单独占一行靠的是 basis 100%，只有 row 方向才是「换行」。 */
.field-check {display: flex; flex-direction: row; align-items: center; gap: 8px; flex-wrap: wrap;}
.field-check input[type=checkbox] {width: auto;}
.field-check .f-hint {flex: 1 1 100%;}

/* 缺少衍生档文件的图片占位 */
.ai-nofiles {display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 90px; font-size: 12px; color: var(--accent); border: 1px dashed var(--accent); background: #fdf8f6; text-align: center;}


/* ---------------- 图片编辑器（旋转 / 翻转 / 裁剪 / 打码） ---------------- */
.ie-blocked {border: 1px solid var(--accent); border-left-width: 3px; background: #fdf8f6; padding: 12px 14px; margin: 12px 0; font-size: 12.5px; line-height: 1.7;}
.ie-blocked p {margin: 6px 0 0;}
.ie-draft {border: 1px solid var(--accent); color: var(--accent); padding: 0 5px; font-size: 11px;}

.ie {margin-top: 12px;}
.ie-bar {display: flex; flex-wrap: wrap; gap: 8px 20px; align-items: center; border: 1px solid var(--border); background: var(--surface); padding: 10px 12px;}
.ie-group {display: flex; align-items: center; gap: 6px; flex-wrap: wrap;}
.ie-group.ie-end {margin-left: auto;}
.ie-label {font-family: var(--mono); font-size: 11px; color: var(--text-mute);}
.ie-bar .btn {padding: 5px 10px; font-size: 12px;}

.ie-body {display: flex; flex-wrap: wrap; gap: 18px; align-items: flex-start; margin-top: 14px;}
.ie-stage {flex: 1 1 420px; min-width: 0; border: 1px solid var(--border); background: var(--zebra); padding: 12px; overflow: auto;}
.ie-side {flex: 0 1 280px; min-width: 220px; display: flex; flex-direction: column; gap: 12px;}

.ie-canvas {position: relative; display: inline-block; max-width: 100%; line-height: 0; overflow: hidden; touch-action: none; user-select: none; background: #fff;}
.ie-canvas img {display: block; max-width: 100%; max-height: 68vh; width: auto; height: auto;}
.ie-canvas.is-drawing, .ie-canvas.is-masking {cursor: crosshair;}
.ie-hint {font-size: 11.5px; color: var(--text-mute); line-height: 1.7; margin: 10px 0 0;}

.ie-layer {position: absolute; box-sizing: border-box;}
/* 摆正（任意角度）的浮层容器：它的框就是「成品里摆正前那块内容」，
   整体 rotate(角度)，所以里面的打码块/裁剪框仍然用摆正前的百分比坐标。
   角度为 0 时它正好铺满画布，行为与没有这一层时完全一样。 */
.ie-geo {position: absolute; transform-origin: 50% 50%;}
.ie-num {display: inline-flex; align-items: center; gap: 3px; font-size: 11px; color: var(--text-mute);}
.ie-num input {width: 66px; padding: 4px 6px; font-size: 12px;}
.ie-crop {border: 1px solid #fff; outline: 1px solid rgba(0,0,0,.55); box-shadow: 0 0 0 9999px rgba(0,0,0,.55); cursor: move;}
/* 打码的「效果」由服务端渲染进画布图片里（涂黑/马赛克/模糊是三种真实像素效果），
   这里只画虚线框 + 四角手柄，不叠任何近似色块，避免看起来三种样式一个样。 */
.ie-mask {cursor: move; border: 1px dashed rgba(255,255,255,.9); outline: 1px solid rgba(0,0,0,.5);}
.ie-mask:hover {border-style: solid;}
.ie-mask.is-pending {border-style: solid; border-color: #fff; background: rgba(255,255,255,.14);}
.ie-mask.is-sel, .ie-crop.is-sel {border-color: var(--accent); outline-color: var(--accent);}
/* 工具栏上的「模式」按钮（打码样式 / 画裁剪框）激活态 */
.ie-bar .btn.is-active {border-color: var(--accent); color: var(--accent); background: #fdf6f4;}
/* 「当前工具」那一行：占满一整行、放在保存按钮左边，是模式的唯一权威说明 */
.ie-bar .ie-toolbar-note {flex: 1 1 100%; color: var(--text-mute); font-size: 11.5px;}
.ie-tool {color: var(--accent);}

.ie-h {position: absolute; width: 11px; height: 11px; background: #fff; border: 1px solid rgba(0,0,0,.7); box-sizing: border-box; display: none;}
.is-sel .ie-h, .ie-crop .ie-h {display: block;}
.ie-h-nw {left: 0; top: 0; transform: translate(-50%, -50%); cursor: nwse-resize;}
.ie-h-n  {left: 50%; top: 0; transform: translate(-50%, -50%); cursor: ns-resize;}
.ie-h-ne {left: 100%; top: 0; transform: translate(-50%, -50%); cursor: nesw-resize;}
.ie-h-e  {left: 100%; top: 50%; transform: translate(-50%, -50%); cursor: ew-resize;}
.ie-h-se {left: 100%; top: 100%; transform: translate(-50%, -50%); cursor: nwse-resize;}
.ie-h-s  {left: 50%; top: 100%; transform: translate(-50%, -50%); cursor: ns-resize;}
.ie-h-sw {left: 0; top: 100%; transform: translate(-50%, -50%); cursor: nesw-resize;}
.ie-h-w  {left: 0; top: 50%; transform: translate(-50%, -50%); cursor: ew-resize;}

.ie-panel {border: 1px solid var(--border); background: var(--surface); padding: 12px 14px;}
.ie-ptitle {margin: 0 0 8px; font-size: 12px; font-family: var(--mono); color: var(--text-mute); font-weight: 400; letter-spacing: .04em;}
.ie-empty {font-size: 12px; color: var(--text-mute); line-height: 1.7; margin: 0;}
.ie-selkind {font-size: 12px; margin: 0 0 8px;}
.ie-row {display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 8px; font-size: 12px;}
.ie-row label {display: flex; align-items: center; gap: 5px;}
.ie-row select, .ie-row input {border: 1px solid var(--border); padding: 4px 6px; font-size: 12px; background: var(--surface); color: var(--text); font-family: var(--mono);}
.ie-row input[type=number] {width: 62px;}
.ie-grid4 {display: grid; grid-template-columns: 1fr 1fr; gap: 6px 10px; margin-bottom: 10px;}
.ie-grid4 label {display: flex; align-items: center; justify-content: space-between; gap: 6px; font-family: var(--mono); font-size: 11px;}
.ie-grid4 input {width: 66px; border: 1px solid var(--border); padding: 4px 6px; font-size: 12px; font-family: var(--mono); background: var(--surface); color: var(--text);}
.ie-meta {font-size: 11.5px; margin: 0 0 6px;}
.ie-summary {font-size: 12.5px; margin: 0; line-height: 1.6;}
.ie-dirty {font-size: 11.5px; color: var(--accent); margin: 6px 0 0;}
.ie-note {font-size: 11.5px; line-height: 1.6; margin: 0 0 8px;}
.ie-warn {font-size: 12px; color: var(--accent); margin: 6px 0 0; line-height: 1.6;}

/* 后台「录入 Skill」：令牌输入行 + 给 agent 的提示词块 */
.sk-line {display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 10px;}
.sk-token {width: 320px; max-width: 100%; border: 1px solid var(--border); padding: 6px 9px; font-family: var(--mono); font-size: 12px; background: var(--surface); color: var(--text);}
.sk-token:focus {outline: none; border-color: var(--accent);}
#sk-agent {white-space: pre-wrap; word-break: break-word; margin: 0; padding: 12px; border: 1px solid var(--border); background: var(--zebra); font-size: 12px; line-height: 1.7;}

/* ---------------- 访客纠错 / 补充（/admin/reports） ---------------- */
/* 导航上的待处理徽标：红底数字，扫一眼就知道有没有新反馈 */
.nav-badge {display: inline-block; margin-left: 5px; padding: 0 6px; border-radius: 9px;
  background: var(--accent); color: #fff; font-size: 10px; line-height: 16px; vertical-align: 1px;}
/* 条目编辑页里「有未处理反馈」的那个链接：加粗提醒（普通状态沿用 .mono dim 的淡样式） */
.rp-open {color: var(--accent); font-weight: 600;}
/* 提示条：采纳失败这类要显眼，别用绿色的 .form-ok */
.form-err {border: 1px solid var(--accent); color: var(--accent); background: #fdf6f4; padding: 6px 12px; margin-bottom: 12px; font-size: 13px;}

.rp-card {border: 1px solid var(--border); background: var(--surface); padding: 12px 14px; margin-bottom: 12px;}
.rp-card.is-done {background: var(--zebra); opacity: 0.85;}
.rp-head {display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; margin-bottom: 8px;}
.rp-id {color: var(--text-mute);}
.rp-title {font-size: 13px;}
.rp-field {font-size: 12px; border: 1px solid var(--border); background: var(--zebra); padding: 1px 7px;}
.rp-kind {font-size: 11px; color: var(--text-mute); border: 1px solid var(--border); padding: 0 5px;}
.rp-status {font-size: 11px; padding: 1px 7px; border: 1px solid var(--border);}
.rp-status-new {border-color: var(--accent); color: var(--accent);}
.rp-status-accepted {border-color: var(--ok, #2d6a4f); color: var(--ok, #2d6a4f);}
.rp-status-rejected {color: var(--text-mute);}

/* 「条目现在是 / 访客建议」两栏对照：采纳前要能一眼看出差在哪 */
.rp-diff {display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px; margin-bottom: 8px;}
.rp-box {border: 1px solid var(--border); background: var(--bg); padding: 8px 10px; min-width: 0;}
.rp-box-new {border-color: #d8c4b8; background: #fdf9f6;}
.rp-l {display: block; font-size: 11px; color: var(--text-mute); margin-bottom: 3px;}
.rp-box .mono {font-size: 12px; word-break: break-word;}
.rp-note {font-size: 13px; margin: 6px 0;}
.rp-stale {font-size: 12px; color: var(--warn, #9c6b00); background: #fdf8ec; border: 1px solid var(--warn, #9c6b00); padding: 5px 9px; margin: 6px 0;}
.rp-meta {font-size: 11px; margin: 4px 0;}
.rp-applied {color: var(--ok, #2d6a4f);}
.rp-ua {display: inline;}
/* 看着得像能点的：只写 cursor 的话，浏览器默认的小三角被 display:inline 吃掉，就剩一个孤零零的「UA」 */
.rp-ua summary {display: inline; cursor: pointer; color: var(--text-mute); border-bottom: 1px dotted currentColor;}
.rp-ua summary:hover {color: var(--accent); border-bottom-color: var(--accent);}
.rp-ua span {display: block; word-break: break-all; padding: 3px 0 0;}
.rp-actions {display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px;}
.rp-actions form {display: flex; align-items: center; gap: 6px; margin: 0;}
.rp-actions input[type="text"] {border: 1px solid var(--border); padding: 5px 8px; font-size: 12px; background: var(--surface); color: var(--text);}
.rp-pages {margin-top: 10px;}

/* ---------------- 文章（后台） ---------------- */
.admin-toolbar {display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 14px;}
.admin-row-actions {text-align: right; white-space: nowrap;}
.pill {display: inline-block; border: 1px solid var(--border); padding: 0 6px; font-size: 11px; font-family: var(--mono); color: var(--text-mute);}
.pill-ok {border-color: var(--ok); color: var(--ok);}
.article-images {display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 12px;}
.article-images[hidden] {display: none;}

/* 文章编辑器：标题独立一行；正文占主栏，发布/设置放右栏（Typecho 的写法）。
   右栏 sticky，保存按钮在滚动正文时一直看得见；窄屏改为底部吸底操作栏。 */
.article-title-field {margin: 0 0 12px;}
.article-title-field input {font-size: 20px; font-weight: 600; padding: 10px 12px;}
.article-edit-grid {display: grid; grid-template-columns: minmax(0, 1fr) 280px; gap: 18px; align-items: start;}
.article-main {min-width: 0;}
.article-side {display: flex; flex-direction: column; gap: 12px; position: sticky; top: 14px;}
.publish-box {border: 1px solid var(--border); background: var(--surface); padding: 12px;}
.pb-head {display: flex; align-items: center; justify-content: space-between; gap: 10px;}
.pb-head strong {font-size: 14px;}
.pb-meta {margin: 7px 0 0; font-size: 11px; color: var(--text-mute);}
.pb-actions {display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 0;}
.pb-actions .btn {padding: 5px 10px; font-size: 12px;}
.pb-hint {margin: 8px 0 0; font-size: 11px; color: var(--text-mute); line-height: 1.5;}
.article-meta-line {display: flex; gap: 12px; align-items: flex-start; justify-content: space-between;}
.article-count {flex: 0 0 auto; font-size: 11px; color: var(--text-mute); padding-top: 2px;}
.article-bottom-actions {display: none;}
@media (max-width: 1024px) {
  .article-edit-grid {grid-template-columns: 1fr;}
  .article-side {position: static;}
  .article-side .pb-actions {display: none;}
  .article-bottom-actions {display: flex; position: sticky; bottom: 0; z-index: 8;
    background: var(--surface); border-top: 1px solid var(--border); padding: 10px 0;
    margin-top: 18px; box-shadow: 0 -4px 12px rgba(0, 0, 0, .04);}
}
.ai-md {display: flex; gap: 6px; align-items: center; margin: 4px 0 6px;}
.ai-md code {flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: 11px; border: 1px solid var(--border); padding: 3px 6px; background: var(--zebra);}
.ai-md .btn {font-size: 11px; padding: 3px 8px; white-space: nowrap;}
.ai-actions {display: flex; gap: 10px; align-items: center; flex-wrap: wrap; font-size: 11px;}
.inline-form {display: inline;}
.link-btn {border: 0; background: none; padding: 0; font: inherit; color: var(--accent); cursor: pointer; text-decoration: underline;}

/* 精选星按钮（条目 / 文章列表里那一列，见 Repo\Featured）
   未精选是浅灰星、精选后填金 —— 一列扫下来哪些挑了哪些没挑一眼分得清。
   它不是装饰而是开关，所以给足点击区（22px）。 */
.star-btn {border: 1px solid transparent; background: none; padding: 0; width: 22px; height: 22px; line-height: 1;
  font-size: 14px; color: #c9c5bd; cursor: pointer;}
.star-btn:hover {color: var(--star, #b8860b); border-color: var(--border);}
.star-btn.is-on {color: var(--star, #b8860b);}
.c-star {width: 26px; text-align: center;}

/* 文章配图：拖拽上传高亮 / 新建页的本地预览 / 换图入口 */
.admin-form.is-drop {border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent);}
.ai-status {min-height: 16px; font-size: 11px; color: var(--text-mute); margin: 6px 0 0;}
.ai-status[data-tone="ok"] {color: var(--ok);}
.ai-status[data-tone="warn"] {color: var(--warn);}
.ai-status[data-tone="busy"] {color: var(--warn);}
.ai-stage {display: flex; flex-wrap: wrap; gap: 8px; align-items: center;}
.ai-stage-item {display: inline-flex; flex-direction: column; gap: 2px; align-items: center; font-size: 11px;}
.ai-stage-item img {width: 84px; height: 84px; object-fit: cover; border: 1px solid var(--border);}
.ai-replace {display: inline-flex; align-items: center; cursor: pointer;}
.ai-replace input[type="file"] {position: absolute; width: 1px; height: 1px; opacity: 0; overflow: hidden;}
.ai-replace .link-btn {cursor: pointer;}

/* ---------------- Markdown 工具栏 + 条目选择器（文章编辑器） ----------------
   工具栏和正文在同一个 .field 里（flex 纵向、gap 3px），所以两者各留自己的边框，
   不玩"拼成一个框"那种把边框拆来拆去的把戏 —— 换行、缩放时它是最先散架的地方。 */
.md-bar {position: relative;}
.md-image-input {display: none;}
.md-upload-status {display: block; min-height: 16px; margin: 5px 0 0; font-size: 11px; color: var(--text-mute);}
.md-upload-status:empty {display: none;}
.md-upload-status[data-tone="ok"] {color: var(--ok);}
.md-upload-status[data-tone="warn"],
.md-upload-status[data-tone="busy"] {color: var(--warn);}
textarea.is-drop {outline: 2px dashed var(--accent); outline-offset: -2px;}
/* 图标精灵：只留 <symbol> 给 <use> 引用，本身不占位置 */
.md-sprite {position: absolute; width: 0; height: 0; overflow: hidden;}
.md-tools {display: flex; flex-wrap: wrap; gap: 2px; align-items: center;
  border: 1px solid var(--border); background: var(--zebra); padding: 4px 6px;}
.md-tb {display: inline-flex; align-items: center; justify-content: center; min-width: 26px; height: 26px;
  padding: 0 4px; border: 1px solid transparent; background: none; color: var(--text-dim);
  cursor: pointer; font-family: var(--mono); font-size: 11px; line-height: 1;}
.md-tb:hover {border-color: var(--border); background: var(--surface); color: var(--accent);}
.md-tb:focus-visible {outline: 2px solid var(--accent); outline-offset: 1px;}
.md-tb .md-i {width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;}
.md-tb .md-tb-txt {font-weight: 600; letter-spacing: .02em;}
.md-tb[data-md-color-trigger] .md-tb-txt {font-weight: 700; border-bottom: 3px solid var(--md-color, #c0392b);
  line-height: 1.15; padding: 0 1px;}
.md-color-input {position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none;}
.md-sep {width: 1px; height: 16px; background: var(--border); margin: 0 4px;}
.md-picker {position: absolute; left: 0; right: 0; top: 100%; z-index: 20; max-height: 380px; overflow: auto;
  border: 1px solid var(--accent); background: var(--surface); padding: 10px 12px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .08);}
.md-picker[hidden] {display: none;}
.md-picker-top {display: flex; gap: 8px; align-items: center;}
.md-picker-q {flex: 1 1 auto; border: 1px solid var(--border); padding: 6px 9px; font-size: 13px;
  background: var(--surface); color: var(--text); font-family: var(--sans);}
.md-picker-status {margin: 8px 0; font-size: 11px;}
.md-picker-row {display: flex; align-items: center; gap: 10px; padding: 5px 4px; border-bottom: 1px dotted var(--border);}
.md-picker-row:last-child {border-bottom: 0;}
.md-picker-row img {width: 34px; height: 34px; object-fit: cover; border: 1px solid var(--border); flex: 0 0 auto;}
.md-picker-info {display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto;}
.md-picker-title {font-size: 13px;}
.md-picker-meta {font-size: 10px; color: var(--text-mute);}
.md-picker-btn {padding: 3px 10px; font-size: 12px;}

/* 通用 Markdown 编辑器（页面内容 / 站点设置）：工具栏 + textarea + 预览 */
.md-editor {display: flex; flex-direction: column; gap: 3px;}
.md-editor > textarea {width: 100%;}
/* 并列图选择器 */
.md-pair-panel {position: absolute; left: 0; right: 0; top: 100%; z-index: 21;
  border: 1px solid var(--accent); background: var(--surface); padding: 10px 12px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .08);}
.md-pair-panel[hidden] {display: none;}
.md-pair-top {display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;}
.md-pair-title {font-weight: 600; font-size: 13px;}
.md-pair-hint {font-size: 11px; color: var(--text-mute);}
.md-pair-top .link-btn {margin-left: auto; font-size: 11px;}
.md-pair-size {display: flex; gap: 18px; flex-wrap: wrap; margin-top: 10px; padding-top: 9px;
  border-top: 1px solid var(--border);}
.md-pair-size label {display: flex; align-items: center; gap: 8px; font-size: 12px;}
.md-pair-size input[type="range"] {width: 150px; accent-color: var(--accent);}
.md-pair-size output {min-width: 62px; font-family: var(--mono); font-size: 11px; color: var(--text-mute);}
.md-pair-list {display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; margin-top: 10px; max-height: 300px; overflow: auto;}
.md-pair-pick {display: flex; flex-direction: column; gap: 4px; border: 1px solid var(--border); padding: 6px; cursor: pointer; font-size: 12px; min-width: 0;}
.md-pair-pick:has(input:checked) {border-color: var(--accent); background: #fdf8ec;}
.md-pair-pick input {position: absolute; opacity: 0; width: 1px; height: 1px;}
.md-pair-pick img {width: 100%; height: 92px; object-fit: contain; background: var(--zebra); border: 1px solid var(--border);}
.md-pair-pick span {overflow-wrap: anywhere;}
.md-pair-actions {display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 10px;}
.md-pair-actions .btn {margin-left: auto;}
/* 页面图片 */
.page-image-tools {display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0 0 12px;}
.page-image-tools .btn {cursor: pointer;}
.page-image-list {display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px;}
.page-image-list[hidden] {display: none;}
.page-image-card {display: flex; flex-direction: column; gap: 7px; border: 1px solid var(--border); background: var(--surface); padding: 10px;}
.page-image-thumb {border: 1px solid var(--border); background: var(--zebra);}
.page-image-thumb img {display: block; width: 100%; height: 150px; object-fit: contain;}
.page-image-missing {display: block; padding: 30px 10px; text-align: center; color: var(--text-mute); font-size: 11px;}
.page-image-caption-edit {display: flex; align-items: center; gap: 6px;}
.page-image-caption-edit label {display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; font-size: 11px; color: var(--text-mute);}
.page-image-caption-edit input {flex: 1; min-width: 0; width: 100%; border: 1px solid var(--border); padding: 4px 7px;
  font-size: 12px; background: var(--surface); color: var(--text);}
.page-image-caption-status {margin: 0; font-size: 10px; color: var(--text-mute); min-height: 0;}
.page-image-caption-status[data-tone="ok"], [data-page-image-status][data-tone="ok"] {color: var(--ok);}
.page-image-caption-status[data-tone="warn"], [data-page-image-status][data-tone="warn"] {color: #9a3b2a;}
.page-image-md {display: block; max-height: 46px; overflow: hidden; font-size: 10px; color: var(--text-mute); overflow-wrap: anywhere;}
.page-image-actions {display: flex; gap: 8px; align-items: center; flex-wrap: wrap;}

/* ---------------- 图形化预览（编辑框下方，正文片段） ---------------- */
.article-live {margin-top: 10px; border: 1px solid var(--border); background: var(--surface);}
.article-live[hidden] {display: none;}
.al-bar {display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 7px 10px; border-bottom: 1px solid var(--border); background: var(--zebra);}
.al-title {font-size: 12px; font-weight: 600;}
.al-status {font-size: 11px; color: var(--text-mute);}
.al-status[data-tone="ok"] {color: var(--ok);}
.al-status[data-tone="warn"], .al-status[data-tone="busy"] {color: var(--warn);}
.al-bar .link-btn {margin-left: auto; font-size: 11px;}
.al-doc {padding: 18px 20px; min-height: 140px; max-height: 620px; overflow: auto; background: #fff;
  font-size: 14px; line-height: 1.9;}
.al-doc:empty::before {content: "图形化预览会显示在这里"; color: var(--text-mute); font-size: 12px;}
@media (max-width: 640px) {
  .al-doc {padding: 12px 14px; max-height: 480px;}
}

/* ---------------- 文章预览（还没保存的整页） ---------------- */
.article-preview {margin-top: 10px; border: 1px solid var(--border); background: var(--zebra); padding: 10px;}
.article-preview[hidden] {display: none;}
.ap-bar {display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 6px;}
.ap-title {font-size: 11px; color: var(--text-mute);}
.ap-widths {display: inline-flex; gap: 4px; margin-left: auto;}
.ap-widths .btn {padding: 2px 10px; font-size: 12px;}
.ap-widths .btn.is-on {background: var(--text); color: var(--surface); border-color: var(--text);}
.ap-frame {display: flex; justify-content: center; background: #fff; border: 1px solid var(--border); padding: 8px;}
.ap-doc {width: 100%; height: 720px; border: 0; background: #fff;}
.ap-frame[data-width="phone"] .ap-doc {width: 390px; max-width: 100%; box-shadow: 0 0 0 1px var(--border);}

/* ---------------- 未保存内容提示条（public/assets/js/unsaved-guard.js） ----------------
   两种状态共用一条：有改动（已本地备份）/ 上次没保存走了（可恢复）。
   平时 hidden，不占版面。 */
.unsaved-strip {display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 0 0 12px; padding: 6px 10px; font-size: 11px;
  border: 1px solid var(--warn, #9c6b00); border-left-width: 3px; background: #fdf8ec; color: #7a5400;}
.unsaved-strip[hidden] {display: none;}
.unsaved-strip .us-actions {display: inline-flex; gap: 8px; align-items: center; margin-left: auto;}
.unsaved-strip .btn {padding: 2px 10px; font-size: 12px;}

/* 文章分类管理：一行一个分类，名称 / slug / 排序都可改 */
.admin-panel-row {display: flex; gap: 12px; align-items: flex-start; justify-content: space-between;
  padding: 9px 0; border-top: 1px solid var(--border); flex-wrap: wrap;}
.admin-panel-row:first-child {border-top: 0; padding-top: 0;}
.admin-inline-form {display: flex; gap: 8px; align-items: flex-end; flex-wrap: wrap; flex: 1 1 auto;}
.admin-inline-form label {display: flex; flex-direction: column; gap: 3px; font-size: 11px; color: var(--text-mute);}
.admin-inline-form input {border: 1px solid var(--border); background: var(--surface); color: var(--text);
  padding: 6px 8px; font-size: 12px; min-width: 120px;}
.admin-inline-form input[name="name"] {min-width: 180px;}

/* 条目编辑页的图片编辑器：同页 dialog + iframe，关掉只刷新图片卡片 */
.item-editor-dialog {width: min(1480px, 97vw); height: 92vh; max-height: 92vh; padding: 0;
  border: 1px solid var(--border); background: var(--surface); color: var(--text);}
.item-editor-dialog::backdrop {background: rgba(20, 18, 15, .72);}
.ied-bar {display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 8px 12px; border-bottom: 1px solid var(--border);}
.item-editor-dialog iframe {display: block; width: 100%; height: calc(100% - 39px); border: 0; background: #fff;}

/* ---------------- 贡献者 ---------------- */
.admin-image-card {border:1px solid var(--border);background:var(--surface);padding:8px;}
.admin-image-card img {display:block;width:100%;height:160px;object-fit:cover;}
.admin-image-card figcaption {font-size:11px;color:var(--text-mute);margin:6px 0;}

/* ---------------- 侵权投诉（仅 SuperAdmin） ---------------- */
.complaint-head {display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;}
.complaint-head .page-title {margin-bottom: 4px;}
.complaint-head-right {display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end;}
.complaint-layout {display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(260px, .75fr); gap: 14px; align-items: start;}
.complaint-main, .complaint-side {min-width: 0;}
.complaint-side .admin-panel {margin-bottom: 14px;}
.complaint-notice {white-space: normal; word-break: break-word; font-size: 12.5px; line-height: 1.8; color: var(--text);}
.complaint-target {padding: 10px 0; border-top: 1px solid var(--border);}
.complaint-target:first-of-type {border-top: 0; padding-top: 0;}
.complaint-target-top {display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin-bottom: 3px;}
.complaint-target-title {margin: 0 0 5px; font-size: 13px;}
.complaint-action {margin: 8px 0; padding: 8px 10px; border: 1px solid var(--border); background: var(--zebra);}
.complaint-action summary {cursor: pointer; font-size: 12px; color: var(--text-mute);}
.complaint-action form {margin-top: 10px;}
.complaint-action .field {margin-bottom: 8px;}
.complaint-action textarea {width: 100%; box-sizing: border-box;}
.complaint-decision {border-top: 1px dashed var(--border); margin-top: 8px; padding-top: 8px;}
.complaint-decision .field {margin-bottom: 8px;}
.takedown-admin-row {display: flex; justify-content: space-between; gap: 14px; align-items: flex-start; padding: 10px 0; border-top: 1px solid var(--border);}
.takedown-admin-row:first-of-type {border-top: 0; padding-top: 0;}
.takedown-admin-main {min-width: 0; display: flex; flex-direction: column; gap: 2px;}
.takedown-admin-main .mono {word-break: break-all;}
.takedown-admin-main p {margin: 2px 0 0;}
.takedown-admin-actions {display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end;}
.complaint-counter {margin: 4px 0 12px; padding: 10px 12px; border-left: 3px solid var(--warn, #9c6b00); background: #fdf8ec;}
.complaint-counter p {margin: 0 0 6px; font-size: 12px;}
.pill-warn {border-color: var(--warn, #9c6b00); color: #7a5400;}
.complaint-side .takedown-meta {grid-template-columns: 1fr; gap: 7px; border-bottom: 0; padding-bottom: 0; margin-bottom: 0;}
.complaint-side .takedown-meta dt {font-size: 10.5px;}
.complaint-side .takedown-meta dd {font-size: 12px;}
@media (max-width: 1080px) {
  .complaint-layout {grid-template-columns: 1fr;}
  .complaint-side {display: grid; grid-template-columns: 1fr 1fr; gap: 14px;}
}
@media (max-width: 700px) {
  .complaint-side {display: block;}
  .complaint-head {flex-direction: column;}
  .complaint-head-right {justify-content: flex-start;}
  .takedown-admin-row {flex-direction: column;}
  .takedown-admin-actions {justify-content: flex-start;}
}

/* ---------------- 敏感操作二次确认 ---------------- */
/* 原生 <dialog>：点删除 / 封禁 / 角色变更才 showModal()，确认按钮在弹窗里再点一次 */
.confirm-dialog {width: min(420px, 92vw); border: 1px solid var(--border); background: var(--surface); color: var(--text); padding: 18px 20px;}
.confirm-dialog::backdrop {background: rgba(26, 26, 26, .42);}
.confirm-dialog h2 {margin: 0 0 8px; font-size: 15px;}
.confirm-dialog p {margin: 0 0 16px; font-size: 13px; line-height: 1.7; color: var(--text-mute);}
.confirm-actions {display: flex; gap: 8px; justify-content: flex-end;}

/* 邀请链接：一次性显示的地址 + 复制按钮 */
.invite-row {display: flex; gap: 8px; align-items: center;}
.invite-row .invite-url {flex: 1 1 auto; min-width: 0; word-break: break-all; padding: 4px 6px; border: 1px solid var(--border); background: var(--zebra, #f6f6f4); font-size: 12px;}

/* ---------------- 待审文章修改：改动高亮 ---------------- */
/* 绿 = 贡献者新增 / 改动，红删除线 = 被删掉的内容；正文按 Markdown 原文对照 */
.revision-panel {border: 1px solid var(--border); background: var(--surface); padding: 14px 16px; margin: 0 0 18px;}
.revision-head {display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px; margin-bottom: 4px;}
.revision-head .block-title {margin: 0;}
.revision-legend {margin: 0 0 10px; font-size: 12px;}
.revision-fields {display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: 6px 14px; margin: 10px 0 14px; align-items: baseline;}
.revision-fields dt {color: var(--text-mute); font-size: 12px;}
.revision-fields dd {margin: 0; font-size: 13px; line-height: 1.7; word-break: break-word;}
.revision-sub {font-size: 13px; margin: 14px 0 6px;}
.revision-body {white-space: pre-wrap; word-break: break-word; max-height: 460px; overflow: auto; margin: 0 0 14px; padding: 12px 14px; border: 1px solid var(--border); background: var(--zebra, #f7f7f5); font-size: 12.5px; line-height: 1.8;}
.rev-del {background: #fbe3e3; color: #8a2020; text-decoration: line-through;}
.rev-ins {background: #e2f4e2; color: #1b5e20; text-decoration: none;}
.revision-actions {margin-top: 4px;}
.rc-changed {font-size: 12px; margin-top: 2px;}

/* 条目待审对照：长文本块 + 逐张介质 */
.revision-body-sm {max-height: 220px; margin: 2px 0 6px; padding: 8px 10px; font-size: 12px; line-height: 1.7;}
.revision-media {border-top: 1px dashed var(--border); margin-top: 6px;}
.revision-media-row {padding: 8px 0; border-bottom: 1px dashed var(--border); font-size: 13px; line-height: 1.7;}
.revision-media-row:last-child {border-bottom: 0;}
.revision-media-change {margin-top: 3px;}
.revision-media-change .dim {margin-right: 6px; font-size: 12px;}

/* 盘面照片：也可以直接选条目已上传的扫描件 */
.mp-pick {display: flex; flex-direction: column; gap: 2px; flex: 1 1 100%; min-width: 0;}
.mp-pick .f-hint {font-size: 10px; color: var(--text-mute);}
.mp-pick select {width: 100%; max-width: 100%; font-size: 12px; padding: 4px 6px; border: 1px solid var(--border); background: var(--surface); color: var(--text);}

/* ---------------- 相关视频（条目编辑页） ---------------- */
/* 一行 = 标题 + 链接 + 删除；手机上标题与删除一行、链接独占一行 */
.fieldset.video-fieldset {grid-template-columns: 1fr;}
.video-fieldset .f-hint {margin: 0;}
.vrow-list {display: flex; flex-direction: column; gap: 8px;}
.vrow {display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 2fr) auto; gap: 8px; align-items: end;}
.vrow-cell {display: flex; flex-direction: column; gap: 3px; min-width: 0;}
.vrow input {width: 100%; box-sizing: border-box; border: 1px solid var(--border); padding: 6px 9px;
  font-size: 13px; font-family: var(--sans); background: var(--surface); color: var(--text);}
.vrow input:focus {outline: none; border-color: var(--accent);}
.vrow-del {width: 32px; height: 32px; border: 1px solid var(--border); background: var(--surface);
  color: var(--text-mute); font: inherit; font-size: 13px; line-height: 1; cursor: pointer;}
.vrow-del:hover, .vrow-del:focus-visible {color: var(--accent); border-color: var(--accent); outline: none;}
.vrow-add {justify-self: start;}
@media (max-width: 700px) {
  .vrow {grid-template-columns: 1fr auto; grid-template-areas: "title del" "url url"; align-items: end;}
  .vrow-title {grid-area: title;}
  .vrow-url {grid-area: url;}
  .vrow-del {grid-area: del;}
}

/* ---------------- 条目「参考资料」（图片 + 链接） ---------------- */
.item-reference-workspace {margin: 0 0 24px; border-top: 1px solid var(--border); padding-top: 18px;}
.ref-hint {font-size: 12px; line-height: 1.65; margin: 0 0 12px; max-width: 860px;}
.ref-form-grid {display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 10px 14px; align-items: end;}
.ref-form-grid .field-wide {grid-column: 1 / -1;}
.ref-form-grid-link {grid-template-columns: minmax(180px, .7fr) minmax(260px, 1.3fr);}
.ref-check {justify-content: flex-end;}
.ref-check-line {display: inline-flex; align-items: center; gap: 5px; font-size: 13px; padding: 6px 0;}
.ref-files-line {display: inline-flex; align-items: center; gap: 10px; min-height: 16px; font-size: 11px; color: var(--text-mute);}
.ref-files-status:empty {display: none;}
.ref-files-clear {border: 0; background: none; padding: 0; color: var(--accent); font-size: 11px; cursor: pointer; text-decoration: underline;}
.ref-upload-actions {grid-column: 1 / -1; margin: 0 0 2px;}
.ref-list-head {display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 4px 0 8px; font-size: 12px;}
.ref-select-all {display: inline-flex; align-items: center; gap: 5px; color: var(--text-mute); cursor: pointer;}
.ref-admin-list {border: 1px solid var(--border); background: var(--surface); margin-bottom: 12px;}
.ref-admin-row {display: grid; grid-template-columns: 22px 72px minmax(0, 1fr) auto; gap: 10px;
  align-items: start; padding: 10px 12px; border-bottom: 1px dotted var(--border);}
.ref-admin-row:last-child {border-bottom: 0;}
.ref-admin-row-link {grid-template-columns: 46px minmax(0, 1fr) auto; align-items: center;}
.ref-pick {padding-top: 22px;}
.ref-pick input, .ref-del input {margin: 0;}
.ref-admin-thumb .pic, .ref-admin-thumb .pic img {height: 72px; width: auto; max-width: 96px; object-fit: contain;}
.ref-admin-thumb .placeholder {height: 72px; width: 56px;}
.ref-fields {display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr) auto; gap: 6px 10px; align-items: end; min-width: 0;}
.ref-fields .field {min-width: 0;}
.ref-fields .field input {width: 100%; box-sizing: border-box;}
.ref-link-fields {grid-template-columns: minmax(0, .9fr) minmax(0, 1.6fr);}
.ref-wm {font-size: 12px; color: var(--text-mute); display: inline-flex; align-items: center; gap: 5px;
  white-space: nowrap; padding-bottom: 8px; cursor: pointer;}
.ref-wm input {margin: 0;}
.ref-del {font-size: 12px; color: var(--text-mute); display: inline-flex; align-items: center; gap: 4px;
  padding-top: 22px; white-space: nowrap; cursor: pointer;}
.ref-admin-row-link .ref-del {padding-top: 0;}
.ref-kind {font-size: 10px; color: var(--text-mute); border: 1px solid var(--border); padding: 2px 5px; justify-self: start;}
.ref-bulk {display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px 10px; border-top: 1px solid var(--border);
  padding-top: 12px; margin-top: 4px;}
.ref-bulk-source {display: flex; flex-direction: column; gap: 3px; min-width: 240px;}
.ref-bulk-source input {border: 1px solid var(--border); padding: 6px 9px; font-size: 13px; font-family: var(--sans);
  background: var(--surface); color: var(--text);}
.ref-bulk-status {font-size: 11px;}
.ref-save-btn {margin-left: auto;}
@media (max-width: 760px) {
  .ref-admin-row {grid-template-columns: 22px minmax(0, 1fr);}
  .ref-admin-thumb {grid-column: 2; grid-row: 1;}
  .ref-admin-thumb .pic, .ref-admin-thumb .pic img {height: 88px;}
  .ref-fields {grid-column: 2; grid-row: 2; grid-template-columns: 1fr;}
  .ref-del {grid-column: 2; grid-row: 3; padding-top: 0; justify-self: start;}
  .ref-pick {grid-row: 1; padding-top: 28px;}
  .ref-admin-row-link {grid-template-columns: 46px minmax(0, 1fr);}
  .ref-admin-row-link .ref-fields {grid-column: 2; grid-row: 1;}
  .ref-admin-row-link .ref-del {grid-column: 2; grid-row: 2;}
  .ref-form-grid, .ref-form-grid-link {grid-template-columns: 1fr;}
  .ref-save-btn {margin-left: 0;}
}
