/* =========================================================
   证书管理系统 · 双主题样式
   主题通过 <html data-theme="teal|dark"> 切换（持久化于 localStorage）
   teal = 浅色侧边栏 + 青绿主色 #16baaa（对齐参考系统业务页）
   dark = 深色侧边栏 + 蓝紫主色 #5b8def（对齐参考系统旧版 layuiAdmin）
   ========================================================= */

/* ---------- 共享令牌（圆角/阴影/字体） ---------- */
:root {
  --radius: 6px;
  --radius-md: 8px;
  --radius-lg: 10px;
  --radius-xl: 12px;
  --shadow-sm: 0 1px 4px rgba(0,0,0,.06);
  --shadow-md: 0 2px 8px rgba(0,0,0,.06);
  --shadow-lg: 0 16px 48px rgba(0,0,0,.18);
  --font: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", sans-serif;
}

/* ---------- 主题：青绿 + 浅色侧边栏（默认） ---------- */
:root,
[data-theme="teal"] {
  --primary: #16baaa;
  --primary-hover: #14a89a;
  --primary-2: #0e9e8e;
  --primary-soft: #E6F0FF;
  --primary-soft-border: #cfe0ff;
  --focus-ring: rgba(22,186,170,.18);
  --field-border: rgba(22,186,170,.4);
  --field-sel: rgba(22,186,170,.3);
  --bg: #f1f2f7;
  --card: #fff;
  --border: #e8e8e8;
  --text: #333;
  --text-2: #555;
  --muted: #999;
  --sidebar-bg: #fff;
  --sidebar-text: #333;
  --sidebar-muted: #999;
  --sidebar-border: #e8e8e8;
  --sidebar-hover-bg: #E6F0FF;
  --sidebar-hover-text: #16baaa;
  --sidebar-active-bg: #16baaa;
  --sidebar-active-text: #fff;
  --sidebar-group: #999;
  --sidebar-logo-bg: #16baaa;
  --topbar-bg: #fff;
  --topbar-border: #e8e8e8;
  --scroll-thumb: #c1c1c1;
}

/* ---------- 主题：深色侧边栏 + 蓝紫主色 ---------- */
[data-theme="dark"] {
  --primary: #5b8def;
  --primary-hover: #4a7ce0;
  --primary-2: #6a5acd;
  --primary-soft: #eaf0fe;
  --primary-soft-border: #c5d3f5;
  --focus-ring: rgba(91,141,239,.18);
  --field-border: rgba(91,141,239,.4);
  --field-sel: rgba(91,141,239,.3);
  --bg: #f1f2f7;
  --card: #fff;
  --border: #e3e6ee;
  --text: #222;
  --text-2: #555;
  --muted: #888;
  --sidebar-bg: #2b2f3a;
  --sidebar-text: #c5ccda;
  --sidebar-muted: #8a93a6;
  --sidebar-border: #3a3f4d;
  --sidebar-hover-bg: rgba(91,141,239,.18);
  --sidebar-hover-text: #fff;
  --sidebar-active-bg: rgba(91,141,239,.30);
  --sidebar-active-text: #fff;
  --sidebar-group: #8a93a6;
  --sidebar-logo-bg: #5b8def;
  --topbar-bg: #fff;
  --topbar-border: #e3e6ee;
  --scroll-thumb: #c1c1c1;
}

* { box-sizing: border-box; }
html, body { margin: 0; height: 100%; overflow: hidden; }
body { font-family: var(--font); -webkit-font-smoothing: antialiased; background: var(--bg); color: var(--text); }
a { color: var(--primary); }

/* ============ 树形菜单布局（视口约束：body不滚动，各区域独立滚） ============ */
.layout { display: flex; height: 100vh; overflow: hidden; }
.sidebar { width: 200px; flex-shrink: 0; background: var(--sidebar-bg); color: var(--sidebar-text); display: flex; flex-direction: column; transition: background .2s, color .2s; overflow: hidden; }
.sidebar .logo { display: flex; align-items: center; gap: 10px; height: 54px; padding: 0 16px; flex-shrink: 0; border-bottom: 1px solid var(--sidebar-border); box-shadow: var(--shadow-sm); }
.logo-icon { width: 32px; height: 32px; border-radius: var(--radius); background: var(--sidebar-logo-bg); display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background .2s; }
.logo-icon i { color: #fff; font-size: 18px; line-height: 1; }
.logo-text { display: flex; flex-direction: column; line-height: 1.2; min-width: 0; }
.logo-text b { font-size: 15px; font-weight: 700; color: var(--sidebar-text); letter-spacing: 1px; }
.logo-text small { font-size: 11px; color: var(--sidebar-muted); }
.menu { padding: 10px 0; overflow-y: auto; flex: 1; border-right: 1px solid var(--sidebar-border); }
.menu-group { margin-bottom: 4px; }
.menu-group-title { padding: 10px 16px 4px; font-size: 12px; color: var(--sidebar-group); letter-spacing: .5px; }
.menu-item { display: flex; align-items: center; gap: 8px; padding: 10px 14px; margin: 2px 8px; font-size: 14px; cursor: pointer; color: var(--sidebar-text); border-radius: var(--radius); transition: background .15s, color .15s; }
.menu-item i { color: var(--primary); font-size: 16px; margin: 0; transition: color .15s; }
.menu-item:hover { background: var(--sidebar-hover-bg); color: var(--sidebar-hover-text); }
.menu-item:hover i { color: var(--sidebar-hover-text); }
.menu-item.active { background: var(--sidebar-active-bg); color: var(--sidebar-active-text); font-weight: 600; }
.menu-item.active i { color: var(--sidebar-active-text); }
.side-footer { height: 54px; flex-shrink: 0; border-top: 1px solid var(--sidebar-border); display: flex; align-items: center; justify-content: space-between; padding: 0 14px; background: var(--sidebar-bg); transition: background .2s; }
.sf-name { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--sidebar-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sf-name i { color: var(--primary); }
.sf-theme-btn { width: 30px; height: 30px; border: none; border-radius: var(--radius); background: transparent; color: var(--sidebar-muted); cursor: pointer; font-size: 17px; display: flex; align-items: center; justify-content: center; transition: all .2s; flex-shrink: 0; }
.sf-theme-btn:hover { background: var(--sidebar-hover-bg); color: var(--sidebar-hover-text); }

.main { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }
.topbar { display: flex; align-items: center; gap: 24px; padding: 0 20px; height: 56px; background: var(--topbar-bg); border-bottom: 1px solid var(--topbar-border); flex-shrink: 0; z-index: 10; }
.crumb { font-size: 14px; color: var(--text-2); font-weight: 600; }
.user-box { margin-left: auto; display: flex; align-items: center; gap: 12px; font-size: 13px; color: var(--text-2); }
.view { padding: 18px 20px; flex: 1; overflow-y: auto; min-height: 0; }

/* 通用按钮/迷你按钮 */
.btn-mini { background: #eef1f7; border: 1px solid var(--border); color: var(--text-2); padding: 6px 12px; border-radius: var(--radius); cursor: pointer; font-size: 13px; }
.btn-mini:hover { background: #e2e7f0; }

/* ============ 通用组件 ============ */
.card { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 16px; }
.card h3 { margin: 0 0 12px; font-size: 16px; }
.form { display: flex; flex-direction: column; gap: 10px; }
.form input, .form select, .form textarea { padding: 9px 10px; border: 1px solid var(--border); border-radius: var(--radius); font-size: 14px; font-family: inherit; }
.form textarea { resize: vertical; }
.form button, .upload button, .btn { background: var(--primary); color: #fff; border: none; padding: 10px; border-radius: var(--radius); cursor: pointer; font-size: 14px; text-decoration: none; display: inline-block; text-align: center; }
.btn-danger { background: #e74c3c; }
.btn-danger:hover { background: #c0392b; }
.upload { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; padding: 12px; border: 1px dashed var(--border); border-radius: var(--radius-md); }
.upload span { font-size: 13px; color: var(--muted); }
.upload input[type=file] { font-size: 13px; }
.row-between { display: flex; justify-content: space-between; align-items: center; }
.msg { font-size: 13px; margin-top: 8px; color: #c0392b; white-space: pre-wrap; }
.hint { font-size: 12px; color: var(--muted); background: var(--primary-soft); padding: 8px; border-radius: var(--radius); }
.tip { font-size: 13px; color: var(--text-2); background: var(--primary-soft); padding: 9px 12px; border-radius: var(--radius); margin: 0 0 14px; line-height: 1.6; }
.muted { color: var(--muted); font-size: 13px; }
.subtabs { display: flex; gap: 6px; margin-bottom: 14px; }
.subtab { border: 1px solid var(--border); background: #fff; padding: 8px 16px; border-radius: 20px; cursor: pointer; font-size: 14px; color: var(--text-2); }
.subtab.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.subpanel { display: none; } .subpanel.active { display: block; }
.table-wrap { overflow: auto; max-height: calc(100vh - 180px); border: 1px solid var(--border); border-radius: var(--radius-md); }
table { border-collapse: collapse; width: 100%; font-size: 13px; }
th, td { border-bottom: 1px solid var(--border); padding: 8px 10px; text-align: left; white-space: nowrap; }
th { background: #f7f8fc; position: sticky; top: 0; z-index: 2; color: var(--text-2); }
/* 首列固定（头像/姓名列）：在 .table-wrap 内生效 */
.table-wrap th:first-child,
.table-wrap td:first-child { position: sticky; left: 0; z-index: 3; background: inherit; }
.table-wrap th:first-child { background: #f7f8fc; z-index: 4; }
.table-wrap th:first-child,
.table-wrap td:first-child { box-shadow: 1px 0 0 var(--border); }
.list { display: flex; flex-direction: column; gap: 8px; }
.list .item { border: 1px solid var(--border); border-radius: var(--radius-md); padding: 10px; font-size: 13px; }
.del { color: #c0392b; cursor: pointer; float: right; }
a.link { color: var(--primary); cursor: pointer; }
img.avatar { width: 36px; height: 36px; border-radius: var(--radius); object-fit: cover; vertical-align: middle; cursor: pointer; transition: transform .15s; }
img.avatar:hover { transform: scale(1.08); }
.no-photo { color: var(--muted); }

/* toast 顶部提示（成功绿 / 失败红） */
.toast { position: fixed; top: 72px; left: 50%; transform: translateX(-50%); padding: 12px 22px; border-radius: var(--radius-md); color: #fff; font-size: 14px; z-index: 9999; box-shadow: 0 6px 20px rgba(0,0,0,.2); white-space: pre-wrap; max-width: 86vw; animation: toastIn .2s ease; }
.toast-success { background: #2ecc71; }
.toast-error { background: #e74c3c; }
.toast.hide { opacity: 0; transition: opacity .4s; }
@keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(-10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }

/* 头像放大弹层 */
.lightbox { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.78); z-index: 10000; align-items: center; justify-content: center; cursor: zoom-out; }
.lightbox img { max-width: 90vw; max-height: 90vh; border-radius: var(--radius-md); box-shadow: 0 8px 32px rgba(0,0,0,.5); cursor: default; }

/* 编辑弹窗 */
.modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 9999; align-items: center; justify-content: center; }
.modal-overlay.show { display: flex; animation: fadeIn .15s ease; }
@keyframes fadeIn { from{opacity:0} to{opacity:1} }
.modal-box { background: #fff; border-radius: var(--radius-xl); width: 680px; max-width: 92vw; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-lg); display: flex; flex-direction: column; }
.modal-header { display: flex; justify-content: space-between; align-items: center; padding: 14px 18px; border-bottom: 1px solid var(--border); position: sticky; top: 0; background: #fff; border-radius: var(--radius-xl) var(--radius-xl) 0 0; z-index: 1; }
.modal-header h3 { margin: 0; font-size: 16px; }
.modal-close { background: none; border: none; font-size: 24px; cursor: pointer; color: var(--muted); line-height: 1; padding: 2px 8px; border-radius: 4px; }
.modal-close:hover { background: #f0f0f0; color: #c0392b; }
.modal-form { padding: 16px 18px; }
.modal-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.modal-grid input, .modal-grid select { padding: 9px 10px; border: 1px solid var(--border); border-radius: var(--radius); font-size: 13px; font-family: inherit; }
.modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--border); }

/* 模板可视化编辑器（方案B：背景图 + 可拖拽文字层） */
.btn-outline { background: #fff; color: var(--primary); border: 1px solid var(--primary); }
.btn-outline:hover { background: var(--primary-soft); }
.tpl-bg-upload { margin-bottom: 10px; }
.tpl-canvas-wrap { display: flex; flex-direction: column; gap: 8px; }
.tpl-canvas-toolbar { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; padding: 8px; background: #f7f8fc; border-radius: var(--radius); border: 1px solid var(--border); }
.toolbar-label { font-size: 12px; color: var(--muted); margin-right: 4px; font-weight: 600; }
.btn-field { background: var(--primary-soft); color: var(--primary); border: 1px solid var(--primary-soft-border); font-size: 12px; padding: 4px 10px; border-radius: 14px; cursor: pointer; transition: all .15s; white-space: nowrap; }
.btn-field:hover { background: var(--primary); color: #fff; border-color: var(--primary); }
.tpl-canvas { position: relative; overflow: auto; background: #eee url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"><rect fill="%23ddd" width="1" height="1"/><rect fill="%23ddd" x="10" y="10" width="1" height="1"/></svg>'); border: 2px solid var(--border); border-radius: var(--radius-md); padding: 16px; min-height: 240px; display: flex; justify-content: center; align-items: flex-start; }
.tpl-canvas-hint { grid-column: 1/-1; text-align: center; color: var(--muted); font-size: 13px; padding: 60px 20px; user-select: none; }
.tpl-bg-layer { position: relative; flex-shrink: 0; box-shadow: 0 2px 12px rgba(0,0,0,.12); border-radius: 2px; }
.tpl-field { position: absolute; cursor: move; padding: 2px 6px; border: 1px dashed var(--field-border); border-radius: 2px; background: rgba(255,255,220,.55); z-index: 5; min-width: 20px; line-height: 1.3; user-select: none; font-family: var(--font) !important; transition: box-shadow .1s, border-color .1s; }
.tpl-field:hover { border-color: var(--field-border); box-shadow: 0 0 0 2px var(--field-sel); }
.tpl-field.field-selected { border-color: var(--primary); border-style: solid; box-shadow: 0 0 0 2px var(--field-sel), 0 2px 8px rgba(0,0,0,.15); background: rgba(255,255,180,.7); z-index: 6; }
.tpl-field-props { padding: 10px; background: #fafbfd; border: 1px solid var(--border); border-radius: var(--radius); }
.tpl-field-props > b { font-size: 13px; }
.props-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 6px; font-size: 12px; }
.props-grid label { display: flex; align-items: center; gap: 6px; }
.props-grid input[type=number] { width: 56px; padding: 3px 6px; border: 1px solid var(--border); border-radius: 4px; font-size: 12px; }
.props-grid input[type=color] { width: 32px; height: 26px; border: 1px solid var(--border); border-radius: 4px; cursor: pointer; padding: 1px; }
.props-grid select { padding: 3px 6px; border: 1px solid var(--border); border-radius: 4px; font-size: 12px; }
.tpl-editor-row { margin-bottom: 6px; }
.upload-inline { display: flex !important; flex-direction: row !important; align-items: center; gap: 8px; border: none !important; padding: 0 !important; }
.upload-inline span { font-size: 12px; color: var(--primary); max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.btn-sm { padding: 5px 12px; font-size: 13px; }
.tpl-preview-details { border: 1px solid var(--border); border-radius: var(--radius-md); padding: 10px; cursor: pointer; }
.tpl-preview-details summary { outline: none; user-select: none; }
.tpl-preview-box { min-height: 80px; border-radius: var(--radius); overflow: hidden; background: #fffbf0; border: 1px solid #f0e4c8; }
.cert-preview-frame { transform: scale(.38); transform-origin: top left; width: 263%; pointer-events: none; line-height: 1.6; font-family: var(--font); color: #222; }

/* 模板列表（含缩略图） */
.tpl-list .tpl-item { display: grid; grid-template-columns: auto 200px; gap: 10px; position: relative; }
.tpl-item-info b { font-size: 14px; }
.tpl-item-info div { font-size: 11px; color: var(--muted); margin-top: 2px; }
.tpl-tag { display: inline-block; background: var(--primary-soft); color: var(--primary); padding: 0 6px; border-radius: 3px; font-size: 11px; margin-right: 4px; }
.tpl-thumb { border: 1px solid var(--border); border-radius: var(--radius); padding: 6px; overflow: hidden; background: #fffdf6; height: 90px; transform: scale(.32); transform-origin: top left; width: 312%; line-height: 1.5; font-family: var(--font); color:#333; font-size:14px; pointer-events:none; }

/* 筛选栏：申报日期范围 + 查询按钮 */
.filter-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.date-filter-group { display: inline-flex; flex-wrap: wrap; gap: 4px; align-items: center; background: #f8f9fc; border: 1px solid var(--border); border-radius: var(--radius); padding: 5px 10px; }
.date-filter-group label { font-size: 13px; color: var(--muted); white-space: nowrap; }
.date-filter-group input[type=date] { padding: 5px 7px; border: 1px solid var(--border); border-radius: 4px; font-size: 13px; }
.date-filter-group span.tilde { color: var(--muted); font-size: 13px; }
.date-shortcuts a { display: inline-block; padding: 3px 8px; margin-right: 2px; font-size: 12px; color: var(--primary); background: #fff; border: 1px solid var(--primary-soft-border); border-radius: 10px; cursor: pointer; text-decoration: none; transition: all .15s; }
.date-shortcuts a:hover { background: var(--primary); color: #fff; border-color: var(--primary); }
.btn-primary { background: var(--primary); color: #fff; border: none; padding: 9px 16px; border-radius: var(--radius); cursor: pointer; font-size: 14px; display: inline-block; text-align: center; }
.btn-primary:hover { background: var(--primary-hover); }
#stuBatchDelBtn.disabled { opacity: .45; cursor: not-allowed; }
#stuBatchDelBtn:disabled { opacity: .45; cursor: not-allowed; }

/* 通用表单/输入 */
.filter-bar input, .filter-bar select,
.grid-form input, .grid-form select, .grid-form textarea,
.org-form input, .org-form select,
.modal-body input, .modal-body select,
.card input, .card select { padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius); font-size: 14px; font-family: inherit; }
.date-range { display: inline-flex; align-items: center; gap: 4px; background: #f8f9fc; border: 1px solid var(--border); border-radius: var(--radius); padding: 4px 8px; }
.date-range input[type=date] { border: none; background: transparent; padding: 2px; font-size: 13px; }
.quick { font-size: 12px; color: var(--primary); background: #fff; border: 1px solid var(--primary-soft-border); border-radius: 10px; padding: 3px 9px; cursor: pointer; }
.quick:hover { background: var(--primary); color: #fff; }
.count-line { font-size: 13px; color: var(--muted); margin: 10px 0; }
.count-line b { color: var(--text); }
.grid-form { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px; align-items: center; }
.grid-form label { font-size: 13px; color: var(--text-2); }
.row-actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-top: 12px; }
.btn-link { color: var(--primary); text-decoration: none; font-size: 14px; }
.btn-link:hover { text-decoration: underline; }
.req { color: #e53935; font-weight: bold; }
.up-zone { display: flex; align-items: center; min-height: 32px; padding: 4px 0; }
.course-level-list { display: flex; flex-wrap: wrap; gap: 8px 16px; padding: 6px 0; max-height: 140px; overflow-y: auto; border: 1px solid #eee; border-radius: 4px; padding: 8px; background: #fafbfc; }
.course-level-list .cl-item { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; cursor: pointer; }
.course-level-list .cl-item input { cursor: pointer; }

/* 录入新表单 - 美化样式 */
.entry-page { max-width: 1180px; margin: 0 auto; padding: 0 16px; }
.entry-header { background: linear-gradient(135deg, var(--primary), var(--primary-2)); color: #fff; padding: 24px 28px; border-radius: var(--radius-lg); margin-bottom: 16px; box-shadow: var(--shadow-md); }
.entry-header h2 { margin: 0 0 6px 0; font-size: 22px; font-weight: 600; }
.entry-sub { margin: 0; font-size: 13px; opacity: .9; }
.entry-card { background: #fff; border-radius: var(--radius-lg); padding: 22px 24px; box-shadow: var(--shadow-md); margin-bottom: 16px; }
.entry-section { margin-bottom: 18px; }
.entry-section:last-child { margin-bottom: 0; }
.entry-label { display: block; font-size: 13px; color: var(--text-2); margin-bottom: 6px; font-weight: 500; }
.entry-label .red-dot { color: #e53935; margin-right: 2px; font-weight: bold; }
.entry-label .entry-tip { color: #999; font-weight: normal; font-size: 12px; margin-left: 4px; }
.entry-input { width: 100%; max-width: 560px; padding: 8px 12px; border: 1px solid #e0e0e0; border-radius: var(--radius); font-size: 14px; transition: border-color .2s; box-sizing: border-box; }
.entry-input:focus { border-color: var(--primary); outline: none; box-shadow: 0 0 0 3px var(--focus-ring); }
.entry-input[readonly] { background: #f5f5f5; color: #777; }
.drop-zone-horizontal { display: flex; align-items: center; justify-content: center; min-height: 90px; padding: 12px 16px; border: 2px dashed #d0d0d0; border-radius: var(--radius-md); background: #fafbfc; cursor: pointer; transition: all .2s; }
.drop-zone-horizontal.dragover { border-color: var(--primary); background: var(--primary-soft); }
.drop-preview { display: flex; align-items: center; gap: 14px; color: #888; font-size: 13px; }
.drop-icon-box { font-size: 32px; }
.drop-text { text-align: left; line-height: 1.7; }
.drop-text em { color: var(--primary); font-style: normal; text-decoration: underline; cursor: pointer; }
.preview-img { max-height: 80px; max-width: 120px; border-radius: 4px; object-fit: contain; }
.extracted-fields { margin-top: 12px; padding: 14px 16px; background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius); }
.ef-row { display: flex; align-items: center; gap: 16px; margin-bottom: 8px; }
.ef-row:last-child { margin-bottom: 0; }
.ef-row label { width: 70px; color: #666; font-size: 13px; }
.ef-row .ef-val { flex: 1; font-size: 14px; color: #222; font-weight: 500; }
.entry-cl-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px 12px; max-width: 480px; }
.entry-cl-item { display: flex; align-items: center; gap: 6px; padding: 6px 10px; border: 1px solid #e0e0e0; border-radius: var(--radius); cursor: pointer; font-size: 13px; background: #fafbfc; transition: all .15s; }
.entry-cl-item:hover { border-color: var(--primary); background: var(--primary-soft); }
.entry-cl-item input { cursor: pointer; }
.entry-submit-wrap { text-align: center; margin: 24px 0 12px; }
.entry-submit { background: linear-gradient(135deg, var(--primary), var(--primary-2)); color: #fff; border: 0; padding: 10px 60px; font-size: 15px; font-weight: 500; border-radius: var(--radius); cursor: pointer; box-shadow: var(--shadow-md); transition: all .2s; }
.entry-submit:hover { transform: translateY(-1px); }
.entry-extra { display: flex; gap: 18px; padding-top: 12px; border-top: 1px dashed #eee; flex-wrap: wrap; }
.entry-list-card { background: #fff; border-radius: var(--radius-lg); padding: 18px 22px; box-shadow: var(--shadow-md); }
.entry-list-card h4 { margin: 0 0 4px 0; font-size: 15px; color: #333; }
.entry-list-card p { margin: 0 0 12px 0; font-size: 12px; }
.crop-box { width: 380px; }
.crop-wrap { width: 300px; height: 300px; margin: 12px auto; border: 1px solid #ccc; overflow: hidden; }
.crop-wrap canvas { width: 100%; height: 100%; }
.face-row { display: flex; align-items: stretch; gap: 12px; max-width: 600px; flex-wrap: wrap; }
.face-row .face-drop { flex: 1; min-width: 260px; }
.face-crop { display: flex; align-items: center; gap: 14px; padding: 10px 14px; border: 1px solid var(--primary-soft-border); background: var(--primary-soft); border-radius: var(--radius-md); }
.fc-canvas-wrap { width: 150px; height: 210px; background: #222; border-radius: 4px; overflow: hidden; flex-shrink: 0; cursor: grab; touch-action: none; }
.fc-canvas-wrap:active { cursor: grabbing; }
.fc-canvas-wrap canvas { width: 100%; height: 100%; display: block; }
.fc-side { display: flex; flex-direction: column; gap: 6px; }
.fc-hint { font-size: 12px; font-weight: 600; line-height: 1.4; color: var(--primary); background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius); padding: 4px 8px; }
.fc-actions { display: flex; flex-direction: column; gap: 6px; }
.fc-tip { font-size: 11px; color: #888; }
.face-result { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border: 1px solid var(--primary-soft-border); background: var(--primary-soft); border-radius: var(--radius-md); }
.face-result img { max-height: 80px; max-width: 80px; border-radius: 4px; object-fit: contain; }
.muted { color: var(--muted); font-size: 13px; }

/* 标签/选择 */
.tag-list { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0; }
.tag { background: var(--primary-soft); color: var(--primary); border: 1px solid var(--primary-soft-border); padding: 4px 10px; border-radius: 14px; font-size: 13px; }
.tag .danger { margin-left: 4px; }
.danger { color: #e74c3c; cursor: pointer; text-decoration: none; }
.danger:hover { text-decoration: underline; }

/* 证书设置 */
.tpl-list { display: flex; flex-direction: column; gap: 6px; }
.tpl-row { padding: 8px 12px; border: 1px solid var(--border); border-radius: var(--radius); font-size: 14px; display: flex; gap: 10px; align-items: center; }
.tpl-preview { margin-top: 10px; padding: 16px; border: 1px dashed var(--border); border-radius: var(--radius-md); background: #fffdf6; font-family: var(--font); line-height: 1.7; color: #333; }

/* 机构管理 */
.org-form { background: #f8f9fc; border: 1px solid var(--border); border-radius: var(--radius-md); padding: 14px; margin-bottom: 8px; }
.org-tree { display: flex; flex-direction: column; gap: 6px; }
.lv1 { padding: 10px 12px; background: var(--primary-soft); border-radius: var(--radius); font-size: 14px; }
.lv2-list { margin: 4px 0 8px 24px; padding-left: 8px; border-left: 2px solid var(--primary-soft-border); }
.lv2 { font-size: 13px; color: var(--text-2); padding: 2px 0; list-style: none; }
.org-ops { margin-left: 10px; }
.org-ops .btn-mini, .lv2 .btn-mini { margin-right: 2px; }
.danger-text { color: #e74c3c !important; }
.danger-text:hover { background: #fdecea !important; }
.kv { display: flex; gap: 12px; padding: 9px 2px; border-bottom: 1px solid var(--border); font-size: 14px; }
.kv .k { width: 88px; color: var(--muted); flex-shrink: 0; }
.kv .v { flex: 1; word-break: break-all; }

/* 用户管理 */
#userTable th, #userTable td { font-size: 13px; }

/* 角色管理 */
.role-list { display: flex; flex-direction: column; gap: 8px; }
.role-row { display: flex; align-items: center; gap: 14px; padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--radius-md); flex-wrap: wrap; }
.role-row > b { min-width: 110px; }
.chips { display: flex; flex-wrap: wrap; gap: 6px; flex: 1; }
.chip { background: #eef7ee; color: #2e8b57; border: 1px solid #bfe3c8; padding: 2px 9px; border-radius: 12px; font-size: 12px; }
.ops { display: flex; gap: 10px; }
.perm-box { display: flex; flex-wrap: wrap; gap: 16px; margin: 10px 0; }
.perm-group { border: 1px solid var(--border); border-radius: var(--radius-md); padding: 10px 14px; min-width: 240px; }
.perm-group-title { font-weight: 600; margin-bottom: 8px; font-size: 14px; color: #444; }
.perm-item { display: block; font-size: 13px; margin: 5px 0; cursor: pointer; }

/* 编辑弹窗（新结构） */
.modal-mask { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 9999; align-items: center; justify-content: center; }
.modal { background: #fff; border-radius: var(--radius-xl); width: 720px; max-width: 94vw; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-lg); display: flex; flex-direction: column; }
.modal-head { display: flex; justify-content: space-between; align-items: center; padding: 14px 18px; border-bottom: 1px solid var(--border); font-size: 16px; font-weight: 600; }
.modal-close { background: none; border: none; font-size: 24px; cursor: pointer; color: var(--muted); line-height: 1; }
.modal-close:hover { color: #c0392b; }
.modal-body { padding: 16px 18px; display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px; }
.modal-body label { font-size: 13px; color: var(--text-2); }
.modal-foot { display: flex; gap: 10px; justify-content: flex-end; padding: 14px 18px; border-top: 1px solid var(--border); }

/* 登录验证码 */
.cap-q { color: var(--primary); font-weight: 700; font-size: 15px; margin-right: 6px; }
#captchaBox label { font-size: 13px; color: var(--text-2); margin: 14px 0 6px; }
#captchaBox input { width: 100%; box-sizing: border-box; padding: 11px 12px; border: 1px solid #d8dee9; border-radius: 7px; font-size: 14px; }

/* 证书预览缺字段提示 */
.cert-warn { background: #fff4e5; border: 1px solid #ffd591; color: #ad6800; padding: 12px 18px; font-size: 14px; text-align: center; }

/* 证书设置：颁证机构 / JPG 模板 / 证书名称 / 收费标准 表单 */
.dropzone { border: 2px dashed #c2cad6; border-radius: var(--radius-md); padding: 22px; text-align: center; color: #667; background: #fafbfc; cursor: pointer; margin-top: 8px; }
.dropzone.drag { border-color: #e67e22; background: #fff6ec; color: #c0560b; }
.ctpl-preview { margin-top: 8px; }
.ctpl-preview img { border: 1px solid #ddd; border-radius: 4px; max-height: 320px; }
.cn-form { background: #f7f9fc; border: 1px solid #e3e8ef; border-radius: var(--radius-md); padding: 14px; margin: 12px 0; }
.summary-line { padding: 10px 14px; background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius-md); margin: 10px 0; font-size: 14px; color: #234; }
.fd-actual { padding: 4px 6px; border: 1px solid #ccc; border-radius: 4px; width: 90px; }
.tip { color: #667; font-size: 13px; margin: 4px 0 14px; }
.muted { color: #99a; font-size: 13px; }
.danger-text { color: #c0392b; font-weight: 600; }

/* 证书费用明细（结算） */
.settle-h { margin: 18px 0 10px; font-size: 15px; color: #234; }
.my-payable { background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius-lg); padding: 14px 16px; margin: 12px 0; }
.mp-head { font-size: 15px; font-weight: 600; color: #1f3a5f; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; }
.mp-grid { display: flex; flex-wrap: wrap; gap: 14px 26px; font-size: 14px; color: #345; }
.mp-grid b { color: #1f3a5f; font-size: 15px; }
.ok-text { color: #1e8e3e !important; }
.warn-text { color: #e6a23c !important; font-weight: 600; }
.debtor-card { border: 1px solid var(--border); border-radius: var(--radius-lg); margin: 10px 0; overflow: hidden; }
.dc-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 18px; padding: 12px 16px; background: #fafbfd; font-size: 14px; }
.dc-name { font-weight: 700; font-size: 15px; color: #1f3a5f; }
.badge { padding: 2px 10px; border-radius: 12px; font-size: 12px; font-weight: 600; }
.badge-ok { background: #e6f4ea; color: #1e8e3e; }
.badge-warn { background: #fdecea; color: #c0392b; }
.badge-danger { background: #fbe9e7; color: #a32d2d; }
.fee-table { width: 100%; border-collapse: collapse; margin: 10px 0 4px; font-size: 13px; }
.fee-table th, .fee-table td { border: 1px solid #e3e8ef; padding: 8px 10px; text-align: center; }
.fee-table thead th { background: #eef2f8; color: #2d4a73; font-weight: 600; }
.fee-table tbody tr:nth-child(4n+1) { background: #fafbfd; }
.fee-table .link { color: var(--primary); cursor: pointer; text-decoration: none; }
.fee-table .link:hover { text-decoration: underline; }
.fee-table .debtor-chk { width: 16px; height: 16px; cursor: pointer; }
.fee-table .dc-detail td { background: #f7f9fc; text-align: left; }
.dc-body { padding: 8px 16px 16px; border-top: 1px solid var(--border); }
.sub-table { width: 100%; border-collapse: collapse; margin: 8px 0; font-size: 13px; }
.sub-table th, .sub-table td { border: 1px solid #e3e8ef; padding: 6px 8px; text-align: center; }
.sub-table th { background: #f5f7fa; color: #445; }
.sub-table details, .my-payable details { margin-top: 6px; }
.sub-table summary, .my-payable summary { cursor: pointer; color: var(--primary); font-size: 13px; }

/* 证书模板字段可视化定位 */
.ctpl-field-editor { margin-top: 12px; border: 1px solid var(--border); border-radius: var(--radius-md); padding: 12px; background: #fbfcfe; }
.fe-tip { font-size: 13px; color: #556; margin-bottom: 10px; }
/* 画布占位容器：JS 按缩放后尺寸精确预留空间，避免 transform 缩放后布局塌陷 */
.fe-holder { position: relative; }
/* 画布本体：绝对定位，尺寸与缩放完全由 JS 控制（不再受 max-width 干扰） */
.fe-canvas { position: absolute; top: 0; left: 0; transform-origin: top left; border: 1px solid #ddd; background: #fff; line-height: 0; touch-action: none; user-select: none; }
.fe-canvas img { display: block; width: 100%; height: auto; }
/* 网格标尺：每 10% 一条淡线，辅助精确对齐（不影响数据） */
#feOverlay { position: absolute; inset: 0; background-image: linear-gradient(rgba(120,130,150,.10) 1px, transparent 1px), linear-gradient(90deg, rgba(120,130,150,.10) 1px, transparent 1px); background-size: 10% 10%; pointer-events: none; }
#feOverlay > * { pointer-events: auto; }
.fe-chip-on { position: absolute; transform: translate(-50%, -50%); background: var(--primary); color: #fff; font-size: 12px; padding: 3px 8px; border-radius: 12px; cursor: grab; white-space: nowrap; box-shadow: 0 2px 6px rgba(0,0,0,.25); line-height: 1.4; touch-action: none; }
.field-checks { display: flex; flex-wrap: wrap; gap: 6px 14px; margin: 6px 0 4px; padding: 8px 10px; background: #fff; border: 1px dashed #c2cad6; border-radius: var(--radius-md); }
.field-checks .fcb { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; color: #445; cursor: pointer; }
.field-checks .fcb input { margin: 0; }
.fe-chip-on:active { cursor: grabbing; background: #e67e22; }

/* 统计看板 */
.stat-cards { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 18px; }
.stat-card { flex: 1; min-width: 150px; background: linear-gradient(135deg, var(--primary-soft), #fff); border: 1px solid var(--primary-soft-border); border-radius: var(--radius-lg); padding: 16px; text-align: center; }
.sc-val { font-size: 30px; font-weight: 700; color: var(--primary); }
.sc-label { font-size: 14px; color: #445; margin-top: 4px; }
.sc-sub { font-size: 12px; color: #889; margin-top: 4px; }
.stat-charts { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.stat-block h4 { margin: 4px 0 10px; font-size: 14px; color: #334; }
.bar-row { display: flex; align-items: center; gap: 8px; margin: 6px 0; font-size: 13px; }
.bar-name { width: 130px; color: var(--text-2); text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bar-track { flex: 1; background: #eef0f5; border-radius: var(--radius); height: 16px; overflow: hidden; }
.bar-fill { height: 100%; background: linear-gradient(90deg, var(--primary), var(--primary-2)); border-radius: var(--radius); }
.bar-num { width: 36px; text-align: left; color: #445; font-weight: 600; }
@media (max-width: 760px) { .stat-charts { grid-template-columns: 1fr; } }

/* 模板字段样式面板 */
.fe-panel { margin-top: 12px; border: 1px dashed #c2cad6; border-radius: var(--radius-md); padding: 12px 14px; background: #fff; }
.fe-panel-title { font-size: 13px; color: #334; margin-bottom: 8px; }
.fe-panel-title .muted { font-weight: 400; font-size: 12px; }
.fe-row { display: flex; align-items: center; gap: 8px; margin: 8px 0; font-size: 13px; color: #445; }
.fe-row label { width: 36px; }
.fe-row input[type=range] { flex: 1; max-width: 340px; }
.fe-fontval { display: inline-block; min-width: 26px; text-align: center; font-weight: 600; color: var(--primary); }
.fe-align-btn { padding: 4px 12px; border: 1px solid #c2cad6; background: #fafbfc; border-radius: var(--radius); cursor: pointer; font-size: 13px; }
.fe-align-btn.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.fe-chip-on.fe-sel { outline: 2px solid #fff; box-shadow: 0 0 0 3px #e67e22, 0 2px 6px rgba(0,0,0,.25); background: #e67e22; }
/* 段落文本预览框（拖拽定位） */
.fe-para { position: absolute; background: rgba(230,126,34,.10); color: #b3540f; outline: 1.5px dashed #e67e22; padding: 0; font-size: 12px; cursor: grab; max-width: 90%; line-height: 1.4; word-wrap: break-word; overflow-wrap: break-word; white-space: pre-wrap; }
.fe-para.fe-sel { outline: 2px solid #e67e22; }
/* 段落文本编辑面板 */
.para-tip { font-size: 12px; color: #667; margin: 4px 0 8px; line-height: 1.6; }
.para-tip code { background: #eef2f7; padding: 1px 5px; border-radius: 4px; color: #c0392b; font-size: 12px; }
.para-box { border: 1px dashed #cdd5e0; border-radius: var(--radius); padding: 10px; background: #fafbfc; }
/* 段落区域实时信息行 */
.fe-para-info { margin-top: 8px; font-size: 12px; color: #556; background: #fff; border: 1px dashed #c2cad6; border-radius: 6px; padding: 6px 10px; line-height: 1.6; }
.fe-para-info b { color: #334; }
.para-item { border: 1px solid #e3e8ef; border-radius: var(--radius); padding: 8px; margin-top: 8px; background: #fff; }
.para-head { font-weight: 600; font-size: 13px; margin-bottom: 6px; display: flex; justify-content: space-between; align-items: center; }
.para-item textarea.para-text { width: 100%; border: 1px solid #cdd5e0; border-radius: var(--radius); padding: 6px 8px; font-size: 13px; resize: vertical; font-family: inherit; line-height: 1.5; }
.para-grid { display: grid; grid-template-columns: auto 1fr auto 1fr auto 1fr; gap: 6px 8px; align-items: center; margin-top: 6px; }
.para-grid label { font-size: 12px; color: #667; }
.para-grid input, .para-grid select { width: 100%; border: 1px solid #cdd5e0; border-radius: var(--radius); padding: 4px 6px; font-size: 12px; }
.para-grid input[type=number] { width: 100%; }
.stat-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin-bottom: 14px; padding: 10px 12px; background: #f7f9fc; border: 1px solid #e3e8ef; border-radius: var(--radius-md); font-size: 13px; color: #445; }
.stat-filters label { color: #556; }
.stat-filters select, .stat-filters input[type=date] { padding: 5px 8px; border: 1px solid #cdd5e0; border-radius: var(--radius); font-size: 13px; }

/* ============ Layui 主题统一：按钮配色对齐主色 ============ */
.layui-btn,
.layui-btn-normal { background-color: var(--primary); }
.layui-btn:hover,
.layui-btn-normal:hover { background-color: var(--primary-hover); }
.layui-btn-primary { background-color: #fff; border-color: #cdd5e0; color: #445; }
.layui-btn-primary:hover { border-color: var(--primary); color: var(--primary); background-color: var(--primary-soft); }
.layui-btn-danger { background-color: #e74c3c; }
.layui-btn-danger:hover { background-color: #c0392b; }
.layui-btn[disabled],
.layui-btn.disabled { background-color: #c2c8d2 !important; cursor: not-allowed; opacity: .75; }
.layui-btn[disabled]:hover { background-color: #c2c8d2 !important; }
.layui-btn:not([disabled]):hover { box-shadow: 0 2px 6px var(--focus-ring); }

/* ============ 输入框 / 下拉统一 ============ */
input.layui-input, select.layui-input, textarea.layui-input {
  border: 1px solid #d9dee6; border-radius: var(--radius); height: 36px; line-height: 36px;
  padding: 0 10px; font-size: 14px; color: #333; transition: border-color .15s, box-shadow .15s;
}
input.layui-input:focus, select.layui-input:focus, textarea.layui-input:focus {
  border-color: var(--primary); box-shadow: 0 0 0 3px var(--focus-ring); outline: none;
}
.layui-table thead th { background: #f3f6fc !important; color: #2c3a52 !important; font-weight: 600; position: sticky; top: 0; z-index: 2; }
.layui-table tbody tr:hover { background: var(--primary-soft) !important; }

/* ============ 主内容区 / 弹窗 输入框统一 ============ */
.view input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not(.fd-actual),
.view select,
.view textarea,
.modal-body input:not([type=hidden]):not([type=checkbox]):not([type=radio]),
.modal-body select,
.modal-body textarea {
  border: 1px solid #d9dee6; border-radius: var(--radius); height: 36px; line-height: 34px;
  padding: 0 10px; font-size: 14px; color: #333; background: #fff;
  transition: border-color .15s, box-shadow .15s;
}
.modal-body input:not([type=hidden]):not([type=checkbox]):not([type=radio]),
.modal-body select,
.modal-body textarea { width: 100%; }
.view textarea, .modal-body textarea { height: auto; line-height: 1.5; padding: 8px 10px; min-height: 64px; }
.view input:focus, .view select:focus, .view textarea:focus,
.modal-body input:focus, .modal-body select:focus, .modal-body textarea:focus {
  border-color: var(--primary); box-shadow: 0 0 0 3px var(--focus-ring); outline: none;
}
.query-bar input, .query-bar select { height: 34px; line-height: 32px; }
.entry-cl-note { margin-top: 8px; font-size: 12px; color: var(--primary); background: var(--primary-soft); border: 1px solid var(--primary-soft-border); border-radius: var(--radius); padding: 6px 10px; }
.entry-cl-note.warn { color: #b45309; background: #fff7ed; border-color: #fed7aa; }

/* ============ 滚动条美化 ============ */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { background-color: var(--scroll-thumb); border-radius: 3px; }
::-webkit-scrollbar-track { background-color: transparent; }
