/* 金蝶云星空风格 · 成品库存管理系统 Web 版 */
:root{
  --kd:#1478FF; --kd-dark:#0D5FD6; --kd-light:#EAF2FF; --kd-border:#D6E4FF;
  --canvas:#F0F2F5; --card:#FFFFFF; --border:#E4E7EC; --text:#1F2329;
  --muted:#606B7A; --orange:#FA8C16; --orange-light:#FFF3E6;
  --red:#F52225; --green:#52C41A; --purple:#722ED1; --cyan:#00AEEF;
  --radius:8px; --shadow:0 1px 4px rgba(31,35,41,.08);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
html{overflow-y:scroll}   /* 纵向滚动条常驻：页面宽度恒定，切换页签不左右晃动 */
body{
  background:var(--canvas); color:var(--text);
  font-family:"Microsoft YaHei","微软雅黑",-apple-system,"PingFang SC",sans-serif;
  font-size:14px; min-height:100vh;
}
.hidden{display:none !important}

/* ---------- 顶栏（标题居中，对照原表主界面）---------- */
.topbar{background:linear-gradient(120deg, var(--kd-dark) 0%, var(--kd) 55%, #3E9BFF 100%); color:#fff;
  box-shadow:0 2px 12px rgba(13,95,214,.35); position:sticky; top:0; z-index:100}
.topbar::after{content:""; position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(600px 120px at 18% 120%, rgba(255,255,255,.14), transparent 70%)}
.topbar-inner{position:relative; max-width:1600px; margin:0 auto; padding:14px 20px; min-height:76px;
  display:flex; align-items:center; justify-content:center}
.brand{text-align:center}
.brand-cn{font-size:21px; font-weight:700; letter-spacing:2px}
.brand-en{font-size:19px; font-weight:700; letter-spacing:1.5px; margin-top:3px; opacity:.95}
.topbar-right{position:absolute; right:20px; top:50%; transform:translateY(-50%); display:flex; align-items:center; gap:12px}
.badge{background:rgba(255,255,255,.18); padding:4px 10px; border-radius:12px; font-size:12px}
.btn-ghost{background:transparent; border:1px solid rgba(255,255,255,.6); color:#fff; padding:5px 14px;
  border-radius:6px; cursor:pointer; font-size:13px; font-family:inherit}
.btn-ghost:hover{background:rgba(255,255,255,.16)}

/* ---------- 面包屑 ---------- */
.crumb{max-width:1600px; margin:14px auto 0; padding:0 20px; display:flex; align-items:center; gap:14px}
.crumb .btn-ghost{background:var(--card); color:var(--kd); border-color:var(--kd-border)}
.crumb .btn-ghost:hover{background:var(--kd-light)}
#crumbText{font-size:16px; font-weight:700; color:var(--text)}

/* ---------- 容器 ---------- */
.view{max-width:1600px; margin:0 auto; padding:16px 20px 60px}

/* ---------- 主界面（金蝶云星空风格：左模块标签 + 内容区 + 磁贴卡片）---------- */
.home-shell{display:flex; gap:12px; align-items:flex-start}
.home-side{flex:0 0 150px; width:150px; background:var(--card); border:1px solid var(--border);
  border-radius:var(--radius); box-shadow:var(--shadow); overflow:hidden; position:sticky; top:96px}
.hs-cap{padding:12px 16px 6px; font-size:12px; font-weight:700; color:var(--muted); letter-spacing:2px}
.hs-item{padding:12px 16px; font-size:14px; font-weight:600; color:var(--text); cursor:pointer;
  border-left:3px solid transparent; transition:background .15s, color .15s, border-color .15s}
.hs-item:hover{background:var(--kd-light); color:var(--kd)}
.hs-item.on{background:var(--kd-light); color:var(--kd); border-left-color:var(--kd)}
.home-main{flex:1; min-width:0}
.lib-soon-ico{width:64px; height:64px; margin:0 auto; border-radius:16px; background:var(--kd-light);
  display:flex; align-items:center; justify-content:center; color:var(--kd)}
.lib-soon-ico svg{width:32px; height:32px}
.home-grid{display:grid; gap:12px}
.section-card{background:var(--card); border:1px solid var(--border); border-radius:var(--radius);
  box-shadow:var(--shadow); display:flex; overflow:hidden; min-height:150px}
.section-label{width:200px; flex:0 0 200px;
  background:linear-gradient(160deg, var(--kd) 0%, var(--kd-dark) 100%);
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  color:#fff; padding:16px 10px; text-align:center; position:relative}
.section-label::after{content:""; position:absolute; right:8px; top:12px; width:26px; height:26px;
  border-radius:50%; background:rgba(255,255,255,.10)}
.section-label .cn{font-size:18px; font-weight:700; letter-spacing:2px}
.section-label .en{font-size:12px; font-weight:600; margin-top:6px; letter-spacing:.5px; opacity:.82}
.section-body{flex:1; display:flex; flex-wrap:wrap; align-items:center; gap:12px 14px; padding:16px 26px}
/* 商务磁贴：白卡 + 浅蓝图标底座 + 名称，hover 上浮描边 */
.menu-item{flex:0 0 calc(25% - 14px); min-width:168px; max-width:230px; box-sizing:border-box;
  display:flex; align-items:center; gap:12px; padding:13px 16px;
  background:#FBFCFE; border:1px solid var(--border); border-radius:10px; cursor:pointer;
  transition:border-color .18s, box-shadow .18s, transform .18s, background .18s; user-select:none}
.menu-item:hover{background:#fff; border-color:var(--kd); transform:translateY(-2px);
  box-shadow:0 8px 20px rgba(20,120,255,.16)}
.menu-item:active{transform:translateY(0); box-shadow:0 3px 8px rgba(20,120,255,.12)}
.mi-ico{width:42px; height:42px; flex:0 0 42px; border-radius:9px;
  background:linear-gradient(150deg, var(--kd-light), #DCE9FF);
  display:flex; align-items:center; justify-content:center; color:var(--kd);
  transition:background .18s, color .18s}
.mi-ico svg{width:24px; height:24px; display:block}
.menu-item:hover .mi-ico{background:linear-gradient(150deg, var(--kd), var(--kd-dark)); color:#fff}
.mi-name{font-size:14px; font-weight:600; color:var(--text); transition:color .18s}
.menu-item:hover .mi-name{color:var(--kd)}

/* ---------- 通用卡片 / 标题 ---------- */
.card{background:var(--card); border:1px solid var(--border); border-radius:var(--radius);
  box-shadow:var(--shadow); margin-bottom:14px}
.card-hd{padding:12px 16px; border-bottom:1px solid var(--border); display:flex; align-items:center;
  justify-content:space-between; gap:12px; flex-wrap:wrap}
.card-hd h3{margin:0; font-size:15px; font-weight:700}
.card-hd h3::before{content:""; display:inline-block; width:3px; height:14px; background:var(--kd);
  margin-right:8px; vertical-align:-2px; border-radius:2px}
.card-bd{padding:14px 16px}
.card-bd.flush{padding:0}

/* ---------- 表单控件 ---------- */
.toolbar{display:flex; flex-wrap:wrap; gap:10px; align-items:flex-end}
.field{display:flex; flex-direction:column; gap:4px}
.field label{font-size:12px; color:var(--muted)}
input[type=text],input[type=number],input[type=date],input[type=password],select,textarea{
  border:1px solid var(--border); border-radius:6px; padding:6px 10px; font-size:13px;
  font-family:inherit; background:#fff; color:var(--text); outline:none; min-width:120px}
input:focus,select:focus,textarea:focus{border-color:var(--kd); box-shadow:0 0 0 2px rgba(20,120,255,.12)}
input[readonly]{background:#FAFBFC; color:var(--muted)}
.btn{border:1px solid var(--kd); background:#fff; color:var(--kd); border-radius:6px; padding:7px 16px;
  font-size:13px; cursor:pointer; font-family:inherit; font-weight:600; transition:all .15s}
.btn:hover{background:var(--kd); color:#fff}
.btn.primary{background:var(--kd); color:#fff}
.btn.primary:hover{background:var(--kd-dark)}
.btn.warn{border-color:var(--orange); color:var(--orange)}
.btn.warn:hover{background:var(--orange); color:#fff}
.btn.danger{border-color:var(--red); color:var(--red)}
.btn.danger:hover{background:var(--red); color:#fff}
.btn.sm{padding:4px 10px; font-size:12px}
.btn.gray{border-color:var(--border); color:var(--muted)}
.btn.gray:hover{background:#F5F6F8; color:var(--text)}
.btn:disabled{opacity:.5; cursor:not-allowed}

/* ---------- 表格 ---------- */
.tbl-wrap{overflow:auto; max-height:70vh}
table.tbl{width:100%; border-collapse:collapse; font-size:13px; white-space:nowrap}
table.tbl th{background:var(--kd-light); color:var(--kd); font-weight:700; padding:8px 10px;
  border-bottom:1px solid var(--kd-border); position:sticky; top:0; z-index:2; text-align:left}
table.tbl td{padding:7px 10px; border-bottom:1px solid #F0F1F3}
table.tbl tbody tr:hover{background:#F7FAFF}
table.tbl tbody tr.sel{background:var(--kd-light)}
table.tbl td.num,table.tbl th.num{text-align:right; font-variant-numeric:tabular-nums}
table.tbl td.ctr,table.tbl th.ctr{text-align:center}
table.tbl tfoot td{background:#FAFBFC; font-weight:700; border-top:1px solid var(--border)}
.tag{display:inline-block; padding:1px 8px; border-radius:10px; font-size:11px; font-weight:700}
.tag.blue{background:var(--kd-light); color:var(--kd)}
.tag.red{background:#FFECE8; color:var(--red)}
.tag.green{background:#E8F8E0; color:var(--green)}
.tag.orange{background:var(--orange-light); color:var(--orange)}
.tag.gray{background:#F0F1F3; color:var(--muted)}
.empty{padding:36px; text-align:center; color:var(--muted)}

/* ---------- 看板 ---------- */
.kpi-row{display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:12px}
.kpi{background:#fff; border:1px solid var(--border); border-radius:var(--radius); padding:14px 16px; position:relative; overflow:hidden}
.kpi .k-label{font-size:13px; color:var(--muted)}
.kpi .k-value{font-size:28px; font-weight:800; margin-top:6px; font-variant-numeric:tabular-nums}
.kpi .k-sub{font-size:12px; color:var(--muted); margin-top:4px}
.kpi .k-bar{position:absolute; left:0; top:0; bottom:0; width:4px}
.kpi.c-in .k-bar{background:var(--kd)} .kpi.c-out .k-bar{background:var(--orange)}
.kpi.c-trip .k-bar{background:var(--cyan)} .kpi.c-bal .k-bar{background:var(--purple)}
.up{color:var(--red)} .down{color:var(--green)}
.chart{width:100%; height:300px}
.tabs{display:flex; gap:4px; border-bottom:1px solid var(--border); padding:0 16px}
.tabs .tab{flex:0 0 118px; width:118px; text-align:center; padding:9px 0; cursor:pointer; font-size:13px; font-weight:600; color:var(--muted);
  border-bottom:2px solid transparent; margin-bottom:-1px; transition:color .15s, border-color .15s, background .15s}
.tabs .tab:hover{color:var(--kd); background:var(--kd-light)}
.tabs .tab.on{color:var(--kd); border-bottom-color:var(--kd)}
/* 看板分页：统一最小高度 + 淡入过渡，切换无顿挫 */
.pane{min-height:560px}
.pane:not(.hidden){animation:paneIn .18s ease}
@keyframes paneIn{from{opacity:0; transform:translateY(4px)} to{opacity:1; transform:none}}

/* ---------- 单据 ---------- */
.doc-head{display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:10px}
.doc-title{font-size:18px; font-weight:800; text-align:center; margin-bottom:4px}
.doc-sub{text-align:center; font-size:12px; color:var(--muted); margin-bottom:10px}
.grid-table input{border:1px solid transparent; background:transparent; width:100%; padding:4px 6px}
.grid-table input:hover{border-color:var(--border)}
.grid-table input:focus{background:#fff; border-color:var(--kd)}

/* ---------- 单据版式（入库单，对照原表纸质单据）---------- */
.voucher{display:flex; gap:16px; align-items:flex-start; flex-wrap:wrap;
  background:var(--card); border:1px solid var(--border); border-radius:4px; padding:14px 16px}
.voucher-body{flex:1 1 760px; min-width:0}
.voucher-title{margin:2px 0 12px; text-align:center; font-size:22px; font-weight:700; letter-spacing:3px}
.voucher-meta{display:flex; align-items:center; gap:8px; margin-bottom:8px}
.voucher-meta .vm-brand{font-size:16px; font-weight:700; color:var(--kd); letter-spacing:1px; margin-right:16px; white-space:nowrap}
.voucher-meta label{font-size:13px; white-space:nowrap}
.vm-input{border:1px solid var(--border); border-radius:3px; padding:3px 7px; font-family:inherit;
  font-size:13px; outline:none; background:#fff}
.vm-input:focus{border-color:var(--kd); box-shadow:0 0 0 2px rgba(20,120,255,.12)}
.vm-underline{border:0; border-bottom:1px solid #98A3B3; border-radius:0; padding:2px 4px}
.voucher-grid-wrap{overflow-x:auto}
table.voucher-grid{width:100%; border-collapse:collapse; font-size:12.5px}
table.voucher-grid th{position:static; background:var(--kd); color:#fff; font-weight:700; text-align:center;
  padding:6px 5px; border:1px solid #3F8DFF; white-space:nowrap; z-index:auto}
table.voucher-grid td{border:1px solid #D5DEEA; padding:0; text-align:center}
table.voucher-grid tbody tr:nth-child(even) td{background:#F4F8FF}
table.voucher-grid tbody tr:hover td{background:#EDF5FF}
table.voucher-grid tbody tr.row-sel td{background:#FFF3D6}
table.voucher-grid td input{width:100%; height:26px; border:0; background:transparent; padding:2px 6px;
  font-family:inherit; font-size:12.5px; outline:none}
table.voucher-grid td input:focus{background:#E8F1FF; box-shadow:inset 0 0 0 1px var(--kd)}
table.voucher-grid td input::placeholder{color:#B6BFCB}
table.voucher-grid td.num input{text-align:right}
table.voucher-grid tfoot td{background:#EAF2FF; border:1px solid #D5DEEA; font-weight:700; padding:5px 6px; text-align:center}
table.voucher-grid tfoot tr.memo td{background:#F7F9FC}
table.voucher-grid tfoot td input{width:100%; border:0; background:transparent; font-family:inherit;
  font-size:12.5px; outline:none; padding:2px 6px; text-align:left}
.voucher-sign{display:flex; justify-content:flex-end; align-items:center; gap:6px; margin-top:10px; font-size:13px}
.voucher-side{flex:0 0 152px; width:152px; display:flex; flex-direction:column; gap:12px}
.vs-row{margin-bottom:9px}
.vs-row label{display:block; font-size:12px; color:var(--muted); margin-bottom:4px}
.vs-row input{width:100%; border:1px solid var(--border); border-radius:3px; padding:5px 7px;
  font-family:inherit; font-size:13px; outline:none}
.vs-row input:focus{border-color:var(--kd); box-shadow:0 0 0 2px rgba(20,120,255,.12)}
.vs-btns{display:flex; flex-direction:column; gap:7px}
.vs-btns .btn{width:100%; height:32px; padding:0; font-size:13px}
.btn.red-text{border-color:#F5C2C2; color:var(--red)}
.btn.red-text:hover{background:#FFF1F1; color:var(--red)}

/* ---------- 弹窗 ---------- */
.mask{position:fixed; inset:0; background:rgba(31,35,41,.45); z-index:1000; display:flex;
  align-items:center; justify-content:center; padding:20px}
.mask .dlg{background:#fff; border-radius:10px; box-shadow:0 12px 40px rgba(0,0,0,.22);
  max-width:92vw; max-height:88vh; display:flex; flex-direction:column; overflow:hidden}
.dlg-hd{padding:12px 18px; border-bottom:1px solid var(--border); font-weight:700; font-size:15px;
  display:flex; justify-content:space-between; align-items:center}
.dlg-hd .x{cursor:pointer; color:var(--muted); font-size:20px; line-height:1}
.dlg-bd{padding:14px 18px; overflow:auto; flex:1}
.dlg-ft{padding:12px 18px; border-top:1px solid var(--border); display:flex; justify-content:flex-end; gap:10px}
/* 固定尺寸弹窗（opt.fixed）—— 资料查询专用：
   数据区恒定高度（内滚），说明行/按钮行按内容自然排布，任何环境下都不会被裁切；
   各区块高度恒定 → 弹窗整体尺寸恒定 = 窗体大小锁定 */
.mask .dlg.dlg-fixed{height:auto}
.mask .dlg.dlg-fixed .dlg-bd{display:flex; flex-direction:column; overflow:visible; padding:10px 14px 8px}
.mask .dlg.dlg-fixed .py-pick{display:flex; flex-direction:column; gap:8px}
.mask .dlg.dlg-fixed .py-pg1,
.mask .dlg.dlg-fixed .py-pg2{display:flex; flex-direction:column; gap:8px}
.mask .dlg.dlg-fixed .py-pg2.hidden,
.mask .dlg.dlg-fixed .py-pg1.hidden{display:none}
/* 数据区：恒定高度，内部滚动 */
.mask .dlg.dlg-fixed .py-pg1 .py-grid-wrap{flex:0 0 auto; height:min(46vh, 500px); max-height:none}
/* 说明行、底部按钮区：内容自然高度，永不参与伸缩、永不被裁 */
.mask .dlg.dlg-fixed .py-foot{flex:0 0 auto}
.mask .dlg.dlg-fixed .py-bbar{flex:0 0 auto; flex-wrap:wrap; row-gap:6px}
/* AB包转换页：列表恒高、右栏自然高度（确定转换按钮始终可见） */
.mask .dlg.dlg-fixed .py-ab{flex:0 0 auto}
.mask .dlg.dlg-fixed .py-ab-main{display:flex; flex-direction:column; gap:8px}
.mask .dlg.dlg-fixed .py-ab-main .py-grid-wrap{height:min(40vh, 430px)}
.mask .dlg.dlg-fixed .py-recwrap{height:min(20vh, 200px); max-height:none}
.mask .dlg.dlg-fixed .py-abconv{margin-top:6px}

/* ---------- Toast ---------- */
.toast-root{position:fixed; top:70px; right:20px; z-index:2000; display:flex; flex-direction:column; gap:8px}
.toast{background:#fff; border-left:4px solid var(--kd); border-radius:6px; padding:10px 16px;
  box-shadow:0 4px 16px rgba(0,0,0,.14); font-size:13px; min-width:180px; animation:slideIn .2s}
.toast.ok{border-left-color:var(--green)} .toast.err{border-left-color:var(--red)}
.toast.warn{border-left-color:var(--orange)}
@keyframes slideIn{from{opacity:0; transform:translateX(30px)}to{opacity:1; transform:none}}

/* ---------- 杂项 ---------- */
.row{display:flex; gap:10px; align-items:center; flex-wrap:wrap}
.spacer{flex:1}
.muted{color:var(--muted)}
.small{font-size:12px}
.right{text-align:right}
.nowrap{white-space:nowrap}
.mono{font-variant-numeric:tabular-nums}
.pager{display:flex; gap:8px; align-items:center; justify-content:flex-end; padding:10px 16px}
.hint{background:var(--kd-light); border:1px solid var(--kd-border); color:var(--kd-dark);
  padding:8px 12px; border-radius:6px; font-size:12px; margin-bottom:12px}

/* ================= 资料查询（frm资料查询 移植） =================
   配色沿用 VBA：表头 金蝶蓝底白字、文字 RGB(31,35,41)、
   选中行 RGB(234,242,255)、命中单元格 红# F52225 加粗、边框 RGB(217,217,217) */
.py-pick{display:flex; flex-direction:column; gap:10px}
.py-bar{display:flex; align-items:center; gap:10px; flex-wrap:wrap}
.py-bar .py-lb{font-weight:700; color:var(--kd-dark); font-size:13px}
.py-bar .py-kw{flex:1; min-width:280px; height:34px; border:1px solid var(--kd);
  border-radius:5px; padding:0 10px; font-size:14px; font-family:inherit}
.py-bar .py-kw:focus{outline:none; box-shadow:0 0 0 3px rgba(20,118,255,.16)}
.py-scopes{display:flex; gap:12px; align-items:center}
.py-scopes label{display:inline-flex; align-items:center; gap:4px; cursor:pointer;
  font-size:13px; color:var(--muted); user-select:none}
.py-scopes input{margin:0; accent-color:var(--kd)}
.py-scopes input:checked + span{color:var(--kd); font-weight:700}
.py-cnt{font-size:12px}

.py-grid-wrap{border:1px solid #D9D9D9; border-radius:5px; overflow:auto; max-height:56vh; background:#fff}
.py-grid{border-collapse:collapse; width:100%; table-layout:fixed; font-size:12.5px}
.py-grid th{position:sticky; top:0; z-index:2; background:var(--kd); color:#fff; font-weight:700;
  padding:7px 8px; text-align:left; white-space:nowrap; border-right:1px solid rgba(255,255,255,.28)}
.py-grid th:last-child{border-right:none}
.py-grid th.sortable{cursor:pointer; user-select:none}
.py-grid th.sortable:hover{background:#0F63D6}
.py-grid td{padding:4px 8px; border-bottom:1px solid #EDEDED; border-right:1px solid #F0F0F0;
  color:#1F2329; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.py-grid td:last-child{border-right:none}
.py-grid tbody tr{cursor:pointer}
.py-grid tbody tr:hover td{background:#F7FAFF}
.py-grid tbody tr.sel td{background:#EAF2FF}
/* 命中搜索词的单元格：红字加粗（VBA 渲染逻辑，差额列除外） */
.py-grid td.hit{color:#F52225; font-weight:700}
/* 差额列着色：<0 红加粗；0<x<10 绿加粗 */
.py-grid td.neg{color:#F52225; font-weight:700}
.py-grid td.low{color:#00B050; font-weight:700}
.py-grid td.empty{text-align:center; color:#BBB; padding:22px}
.py-foot{display:flex; flex-direction:column; gap:4px; font-size:12px}
.py-foot b{color:var(--kd)}

/* 独立页面版：占满卡片宽度 */
.py-page .py-grid-wrap{max-height:calc(100vh - 300px); min-height:420px}

/* 资料查询：自动清除 / 状态行（对应 VBA ob自动清除 与 Me.Caption） */
.py-auto{display:inline-flex; align-items:center; gap:4px; cursor:pointer; font-size:12.5px;
  color:var(--muted); user-select:none; border-left:1px solid var(--border); padding-left:10px}
.py-auto input{margin:0; accent-color:var(--kd)}
.py-auto input:checked + span{color:var(--kd); font-weight:700}
.py-status{color:var(--kd); font-weight:700}

/* ================= 资料查询 1:1 版式（MultiPage 页签 / 双搜索框 / 底部按钮区） ================= */
.py-tabs{display:flex; gap:2px; border-bottom:2px solid var(--kd); margin-bottom:10px}
.py-tab{border:1px solid var(--kd-border); border-bottom:none; background:#F5F8FF; color:var(--muted);
  padding:7px 26px; cursor:pointer; font-size:13px; font-weight:700; font-family:inherit;
  border-radius:6px 6px 0 0; position:relative; top:2px}
.py-tab.on{background:var(--kd); color:#fff; border-color:var(--kd)}
.py-top1{display:flex; align-items:center; gap:8px; margin-bottom:8px; flex-wrap:wrap}
.py-top1 .py-lb{font-weight:700; color:var(--kd-dark); font-size:13px; white-space:nowrap;
  border:1px solid var(--kd-border); background:var(--kd-light); padding:5px 10px; border-radius:4px}
.py-top1 .py-kw2{width:120px; height:32px; border:1px solid var(--border); border-radius:5px; padding:0 8px; font-size:13px; font-family:inherit}
.py-top1 .py-kw{flex:1; min-width:260px; height:34px; border:1px solid var(--kd);
  border-radius:5px; padding:0 10px; font-size:14px; font-family:inherit}
.py-top1 .py-kw:focus{outline:none; box-shadow:0 0 0 3px rgba(20,118,255,.16)}
.py-bbar{display:flex; align-items:center; gap:8px; margin-top:10px; flex-wrap:wrap}
.py-rgroup{display:inline-flex; align-items:center; gap:10px; font-size:12.5px; color:var(--muted);
  border-left:1px solid var(--border); padding-left:12px}
.py-rgroup b{color:#1F2329; font-weight:700; white-space:nowrap}
.py-rgroup label{display:inline-flex; align-items:center; gap:4px; cursor:pointer; user-select:none; white-space:nowrap}
.py-rgroup input{margin:0; accent-color:var(--kd)}
.py-rgroup input:checked + span{color:var(--kd); font-weight:700}

/* AB包转换页 */
.py-ab{display:flex; gap:12px; align-items:stretch}
.py-ab-main{flex:1; min-width:0}
.py-ab-side{width:320px; flex:0 0 320px; display:flex; flex-direction:column; gap:10px;
  border:1px solid var(--kd-border); background:var(--kd-light); border-radius:6px; padding:10px}
.py-ab-box{display:flex; flex-direction:column; gap:6px}
.py-ab-box .py-lb{font-weight:700; color:var(--kd-dark); font-size:12.5px}
.py-ab-box .row{display:flex; gap:6px}
.py-ab-box input[type=number]{flex:1; height:32px; border:1px solid var(--kd); border-radius:5px; padding:0 8px; font-family:inherit}
.py-recwrap{max-height:200px; min-height:120px}
.py-abconv{margin-top:auto; padding:9px; font-weight:700}
.py-editform .edit-grid{display:grid; grid-template-columns:1fr 1fr; gap:10px}
