/* SoftKb 触摸软键盘（RU-018；设计稿 vibe/specs/260808/1739-feeder-soft-keyboard/keyboard-preview.html）
   尺寸一律 rem（随 RU-014 根字号等比缩放）；色彩沿用既有令牌，确认=选中蓝（不用绿，绿专表运行中）。 */
/* z=65：高于对话框 dlg-veil(60)（对话框内「操作原因」输入也走软键盘），低于 toasts(70) 与演示 fitchip(80) */
.softkb{position:fixed;z-index:65;font:var(--fs-16)/1.5 var(--font-ui,inherit);color:var(--ink)}
.softkb *{box-sizing:border-box}
.softkb .kb-key{border:1.5px solid var(--line-strong);background:#fff;color:var(--ink);border-radius:var(--r-md);
  font:600 var(--fs-24)/1 inherit;font-family:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:.375rem;
  user-select:none;-webkit-user-select:none;box-shadow:0 1px 0 rgba(23,32,43,.06);padding:0;position:relative}
.softkb .kb-key:active,.softkb .kb-key[data-press="1"]{background:var(--c-sel-bg);border-color:var(--c-sel);transform:translateY(1px);box-shadow:none}
.softkb .kb-key .sub{position:absolute;top:.3125rem;right:.5rem;font-size:var(--fs-12);color:var(--ink-3)}
.softkb .kb-key.fn{background:var(--bg-well);color:var(--ink-2);font-size:var(--fs-18)}
.softkb .kb-key.acc{background:var(--c-sel);border-color:var(--c-sel);color:#fff;font-size:var(--fs-20)}
.softkb .kb-key.acc:active{background:var(--c-sel-strong);border-color:var(--c-sel-strong)}
.softkb .kb-key.warn{background:#fff;border-color:var(--c-alarm-line);color:var(--c-alarm);font-size:var(--fs-18)}
.softkb .kb-key.on{background:var(--ink);border-color:var(--ink);color:#fff}
.softkb .kb-key[disabled]{background:var(--bg-well);border-color:var(--line);color:var(--ink-dis);cursor:not-allowed;box-shadow:none;transform:none}

/* 尺寸恒定（UI-5.7）：回显/提示/候选三行全部锁定高度（height 而非 min-height），内容溢出裁剪不换行 —— 键盘总高不随内容变化 */
.softkb .kb-echo{display:flex;align-items:center;gap:var(--sp-3);height:3.75rem;background:#fff;border:1.5px solid var(--line-strong);
  border-radius:var(--r-md);padding:0 var(--sp-3);cursor:text;overflow:hidden}
.softkb .kb-echo .val{flex:1;font:700 var(--fs-28)/1 inherit;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;letter-spacing:.03em;display:flex;align-items:center}
.softkb .kb-echo .val.text{font-weight:600;font-size:var(--fs-24);letter-spacing:0}
.softkb .kb-echo .val .ph{color:var(--ink-dis);font-weight:500}
.softkb .kb-echo .val .sel{background:var(--c-sel-bg);box-shadow:0 0 0 2px var(--c-sel-bg);border-radius:3px}
.softkb .kb-echo .unit{color:var(--ink-3);font-size:var(--fs-16);font-weight:600}
.softkb .caret{display:inline-block;width:2px;height:1.05em;background:var(--c-sel);margin:0 1px;animation:kb-blink 1.05s steps(1) infinite}
@keyframes kb-blink{50%{opacity:0}}
.softkb .kb-hint{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-14);color:var(--ink-3);height:1.375rem;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.softkb .kb-hint b{color:var(--ink-2);font-variant-numeric:tabular-nums}
.softkb .kb-hint[data-bad="1"]{color:var(--c-alarm);font-weight:600}
.softkb .kb-hint[data-bad="1"]::before{content:"▲"}
.softkb .shake{animation:kb-shake .3s}
@keyframes kb-shake{25%{transform:translateX(-.375rem)}75%{transform:translateX(.375rem)}}

/* K1 数值浮层 */
.softkb.kpad{width:24.875rem;background:linear-gradient(180deg,#FAFCFE,#EFF3F7);
  border:1px solid var(--line-strong);border-radius:var(--r-lg);box-shadow:0 12px 34px rgba(23,32,43,.22);padding:var(--sp-3);
  display:flex;flex-direction:column;gap:var(--sp-2);animation:kb-pop .16s cubic-bezier(.2,.8,.2,1)}
@keyframes kb-pop{from{opacity:0;transform:translateY(.5rem) scale(.98)}}
.softkb .kpad-head{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-14);color:var(--ink-2);font-weight:600;cursor:grab;touch-action:none}
.softkb.kpad[data-drag="1"]{cursor:grabbing;box-shadow:0 20px 50px rgba(23,32,43,.34)}
.softkb .kpad-head .who{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.softkb .kpad-head .x{height:2.125rem;padding:0 .75rem;border-radius:var(--r-sm);border:1px solid var(--c-alarm-line);background:#fff;color:var(--c-alarm);font:600 var(--fs-12) inherit;cursor:pointer}
.softkb .kpad-head .abc{height:2.125rem;padding:0 .625rem;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--bg-well);color:var(--ink-dis);font:700 var(--fs-12) inherit;cursor:not-allowed}
.softkb .kpad-head .pos{height:2.125rem;padding:0 .625rem;border-radius:var(--r-sm);border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);font:700 var(--fs-12) inherit;cursor:pointer}
.softkb .kpad-head .pos[data-on="1"]{background:var(--c-sel-bg);border-color:var(--c-sel);color:var(--c-sel)}
.softkb .posmenu{position:absolute;z-index:5;top:2.75rem;right:.625rem;width:11.625rem;background:#fff;border:1px solid var(--line-strong);
  border-radius:var(--r-md);box-shadow:0 12px 34px rgba(23,32,43,.22);padding:.375rem;display:flex;flex-direction:column;gap:.25rem}
.softkb .posmenu button{min-height:2.5rem;border:1px solid transparent;background:none;border-radius:var(--r-sm);text-align:left;
  padding:0 .625rem;font:600 var(--fs-14) inherit;color:var(--ink-2);cursor:pointer}
.softkb .posmenu button:hover{background:var(--bg-well)}
.softkb .posmenu button[data-on="1"]{background:var(--c-sel-bg);color:var(--c-sel);border-color:var(--c-sel-line)}
.softkb .posmenu .sepr{height:1px;background:var(--line);margin:2px 0}
.softkb .posmenu .rst{color:var(--c-alarm)}
.softkb .kpad-tools{display:flex;gap:.375rem}
.softkb .kpad-tools button{flex:1;height:2.375rem;border-radius:var(--r-sm);border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);font:600 var(--fs-12) inherit;cursor:pointer}
.softkb .kpad-tools button:active{background:var(--c-sel-bg);border-color:var(--c-sel)}
.softkb .kpad-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:4.5rem;gap:.5rem}
.softkb .kpad-grid .k-ok{grid-row:span 2}
/* 手动位被临时让开的提示（KB-6：偏好不被改写） */
.softkb.kpad[data-yield="1"] .kpad-head::after{content:"偏好位置会挡住当前字段，本次已临时让开";
  font:600 .6875rem/1 inherit;color:var(--c-warn);background:var(--c-warn-bg);border:1px solid var(--c-warn-line);
  border-radius:999px;padding:2px .5rem;flex:none;white-space:nowrap}

/* K2 定宽浮层（KB-9，2026-08-22）：宽度只由 --kb2-w 决定，不随候选内容 / 中英态 / 层切换伸缩；
   不占全宽，摆位 / 让位 / 拖拽 / 记忆与 K1 同一套机制（solvePlacement + POS.dock）。--kb2-w 是唯一可调常量。 */
.softkb.kb-dock{--kb2-w:75rem;width:var(--kb2-w);background:linear-gradient(180deg,#F7F9FB,#E8EDF2);
  border:1px solid var(--line-strong);border-radius:var(--r-lg);box-shadow:0 12px 34px rgba(23,32,43,.22);padding:var(--sp-3) var(--sp-4) var(--sp-4);
  display:flex;flex-direction:column;gap:.625rem;animation:kb-pop .16s cubic-bezier(.2,.8,.2,1)}
.softkb.kb-dock[data-drag="1"]{cursor:grabbing;box-shadow:0 20px 50px rgba(23,32,43,.34)}
.softkb .kdock-in{width:100%;min-width:0;display:flex;flex-direction:column;gap:.625rem}
/* 顶栏即把手：按钮与回显条以外的区域可拖（grip 图标 + 字段名 + 间隙） */
.softkb .kdock-top{display:flex;align-items:center;gap:var(--sp-3);min-width:0;cursor:grab;touch-action:none}
.softkb .kdock-top .grip{flex:none;color:var(--ink-3);font-size:var(--fs-18);line-height:1;padding:0 .125rem;user-select:none;-webkit-user-select:none}
.softkb .kdock-top .who{width:10rem;font-size:var(--fs-14);color:var(--ink-2);font-weight:600;text-align:right;flex:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.softkb .kdock-top .kb-echo{flex:1;min-width:8rem}
.softkb .kdock-top .pos{height:2.875rem;padding:0 .875rem;border-radius:var(--r-sm);border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);font:700 var(--fs-14) inherit;cursor:pointer;flex:none}
.softkb .kdock-top .pos[data-on="1"]{background:var(--c-sel-bg);border-color:var(--c-sel);color:var(--c-sel)}
.softkb.kb-dock .posmenu{top:3.5rem;right:var(--sp-4)}
.softkb .kdock-top .eye{height:2.875rem;padding:0 .875rem;border-radius:var(--r-sm);border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);font:600 var(--fs-14) inherit;cursor:pointer;flex:none}
.softkb .kdock-top .eye[data-on="1"]{background:var(--c-sel-bg);border-color:var(--c-sel);color:var(--c-sel)}
.softkb .kdock-top .tb{height:2.875rem;padding:0 1rem;border-radius:var(--r-sm);border:1.5px solid var(--line-strong);background:#fff;
  color:var(--ink-2);font:600 var(--fs-16) inherit;cursor:pointer;flex:none}
.softkb .kdock-top .tb.warn{border-color:var(--c-alarm-line);color:var(--c-alarm)}
.softkb .krow{display:grid;grid-template-columns:repeat(23,1fr);gap:.5rem;height:4.25rem}
.softkb.kb-dock .kb-key{font-size:var(--fs-24)}
.softkb.kb-dock .kb-key.fn{font-size:var(--fs-16)}
.softkb .kpad-in-dock{width:32.5rem;margin:0 auto;display:flex;flex-direction:column;gap:var(--sp-2)}
.softkb .kpad-in-dock .kpad-grid{grid-auto-rows:4.75rem}
/* 偏好位置被临时让开的提示（KB-6：偏好不被改写），与 K1 同一口径 */
.softkb.kb-dock[data-yield="1"] .kdock-top::after{content:"偏好位置会挡住当前字段，本次已临时让开";
  font:600 var(--fs-12)/1 inherit;color:var(--c-warn);background:var(--c-warn-bg);border:1px solid var(--c-warn-line);
  border-radius:999px;padding:.25rem .625rem;flex:none;white-space:nowrap}

/* 候选行（键盘内侧、键区上缘）：分节拼音 + 候选 + ▲▼。候选数 −/＋ 与 全拼/双拼 是设置件，移至顶栏（KB-9：给候选让宽）。
   宽度恒定优先：候选行在定宽内收缩（拼音串限宽、候选按钮可缩并省略号），绝不把面板撑宽。 */
.softkb .cand{display:flex;align-items:center;gap:var(--sp-3);height:3.5rem;min-width:0;background:#fff;border:1.5px solid var(--c-sel-line);
  border-radius:var(--r-md);padding:0 var(--sp-3);overflow:hidden}
/* 候选行英文/密码占位态（常驻保高度，弱化视觉） */
.softkb .cand[data-idle="1"]{border-color:var(--line);background:var(--bg-well)}
.softkb .cand[data-idle="1"] .py{color:var(--ink-dis);border-bottom-color:var(--line-strong)}
.softkb .cand .py{font:600 var(--fs-18) inherit;color:var(--c-sel);border-bottom:2px solid var(--c-sel);
  padding-bottom:2px;white-space:nowrap;flex:none;letter-spacing:.05em;max-width:12rem;overflow:hidden;text-overflow:ellipsis}
.softkb .cand .py .sep{color:var(--ink-3);font-weight:400;margin:0 1px}
.softkb .cand .py .rest{color:var(--ink-dis)}
/* 显式锁 row：app.css 有全局 `.list{flex-direction:column}`（物料列表用），不声明方向会被渗透成竖排 */
.softkb .cand .list{flex:1;min-width:0;display:flex;flex-direction:row;align-items:center;gap:.375rem;overflow:hidden}
.softkb .cand .list button{flex:0 1 auto;min-width:3rem;height:2.75rem;padding:0 .625rem;border:1px solid var(--line);background:#fff;border-radius:var(--r-sm);
  font:600 var(--fs-20) inherit;color:var(--ink);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.softkb .cand .list button:first-child{border-color:var(--c-sel);background:var(--c-sel-bg);color:var(--c-sel-strong)}
.softkb .cand .list button .i{font:600 var(--fs-12) inherit;color:var(--ink-3);margin-right:.25rem}
.softkb .cand .pg{display:flex;gap:.375rem;flex:none}
.softkb .cand .pg button{width:2.75rem;height:2.75rem;border:1px solid var(--line-strong);background:#fff;border-radius:var(--r-sm);
  color:var(--ink-2);font-size:var(--fs-18);cursor:pointer}
.softkb .cand .pg button[disabled]{color:var(--ink-dis);background:var(--bg-well);cursor:not-allowed}
/* 拼音设置件（顶栏）：候选数 −/＋ 与 全拼/双拼；英文态/密码态禁用占位 */
.softkb .cpp{display:flex;align-items:center;gap:.25rem;flex:none;height:2.875rem;border:1px solid var(--line);border-radius:var(--r-sm);padding:0 .25rem;background:var(--bg-well)}
.softkb .cpp b{font:600 var(--fs-14) inherit;color:var(--ink-2);min-width:2.75rem;text-align:center;font-variant-numeric:tabular-nums}
.softkb .cpp button{width:2.25rem;height:2.25rem;border:1px solid var(--line-strong);background:#fff;border-radius:var(--r-sm);
  color:var(--ink-2);font:700 var(--fs-18)/1 inherit;cursor:pointer}
.softkb .cpp button[disabled]{color:var(--ink-dis);background:var(--bg-well);cursor:not-allowed}
.softkb .scheme{display:flex;border:1px solid var(--line-strong);border-radius:var(--r-sm);overflow:hidden;flex:none}
.softkb .scheme button{border:0;background:#fff;color:var(--ink-2);font:600 var(--fs-14) inherit;height:2.75rem;padding:0 .75rem;cursor:pointer}
.softkb .scheme button+button{border-left:1px solid var(--line)}
.softkb .scheme button[data-on="1"]{background:var(--c-sel);color:#fff}
.softkb .scheme button[disabled]{color:var(--ink-dis);background:var(--bg-well);cursor:not-allowed}
.softkb .cand .empty{flex:1;color:var(--ink-3);font-size:var(--fs-14)}

/* 焦点行持久高亮（键盘挡住别处时仍一眼可辨"我在编辑这一行"）＋ 输入态禁用底部主导航 */
.field[data-kbfocus="1"]{position:relative;background:var(--c-sel-bg);border-radius:var(--r-sm);
  box-shadow:inset 3px 0 0 var(--c-sel);padding:.375rem .5rem .375rem .75rem;margin:-.375rem -.5rem -.375rem -.75rem}
.field[data-kbfocus="1"] .lb{color:var(--c-sel-strong);font-weight:600}
input[data-kb-active="1"]{border-color:var(--c-sel)!important;box-shadow:var(--focus)}
.nav[data-kboff="1"]{opacity:.42;pointer-events:none}
