:root{font-family:'Noto Sans SC',system-ui,sans-serif;color:#293e38;background:#f5f7f4;font-synthesis:none;--green:#23765d;--muted:#84928b;--line:#e4eae4}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button,a,select{ -webkit-tap-highlight-color:transparent}button{cursor:pointer}button{border:1px solid var(--line);border-radius:9px;background:white;color:inherit;padding:10px 16px}button:hover{border-color:#79a38c;background:#f2f8f3}button:focus-visible,a:focus-visible{outline:3px solid #e9b665;outline-offset:3px}button.primary{background:var(--green);color:white;border-color:var(--green)}button.danger{color:#b35b43}button.small{font-size:12px;padding:7px 12px}.sidebar{position:fixed;inset:0 auto 0 0;width:226px;background:#fff;border-right:1px solid var(--line);padding:32px 20px;display:flex;flex-direction:column}.brand{display:flex;gap:12px;align-items:center;color:#245a47;text-decoration:none;font-size:27px;font-weight:700;letter-spacing:2px}.brand-icon{background:#e6eee0;border-radius:16px;width:48px;height:48px;display:grid;place-items:center;font-size:34px}.brand small{display:block;font-size:10px;letter-spacing:3px;font-weight:400;color:#8c9a90}.nav-label{font-size:10px;color:#9da79f;letter-spacing:2px;margin:26px 0 10px;padding-left:12px}nav{display:grid;gap:3px}nav button{display:flex;align-items:center;gap:11px;text-align:left;border:0;background:transparent;padding:11px 12px;border-radius:10px;font-size:14px;color:#5c6d61}nav button i{font-style:normal;width:22px;flex-shrink:0;text-align:center;font-size:15px;color:#8a9985;line-height:1}nav button:hover{background:#f2f7f0;color:#2f4a3c}nav button:hover i{color:#23765d}nav button.active{background:#e7f0e4;color:#22624a;font-weight:600;box-shadow:inset 3px 0 0 #3c8f6d}nav button.active i{color:#23765d}.sidebar-bottom{margin-top:auto}.sidebar-bottom>button{display:flex;align-items:center;gap:11px;width:100%;text-align:left;border:0;background:transparent;padding:11px 12px;border-radius:10px;font-size:13.5px;color:#5c6d61}.sidebar-bottom>button i{font-style:normal;width:22px;flex-shrink:0;text-align:center;color:#8a9985}.sidebar-bottom>button:hover{background:#f2f7f0;color:#2f4a3c}.user{display:flex;gap:12px;align-items:center;border-top:1px solid var(--line);margin-top:20px;padding-top:22px;font-size:13px}.user small{display:block;font-size:10px;color:var(--muted);margin-top:5px}.avatar{width:38px;height:38px;border-radius:50%;background:#eee6d9;display:grid;place-items:center}main{margin-left:226px}header{height:76px;background:#ffffffd9;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 36px;font-size:12px}.breadcrumb{color:#98a198}.header-right{display:flex;align-items:center;gap:22px}.sync{color:#4e8566;font-size:11px}select,input,textarea{border:1px solid #dbe3da;border-radius:8px;background:white;color:#354a3f;padding:10px 12px}select{max-width:100%}.demo{background:#f1eee3;color:#88734a;font-size:11px;padding:9px 36px}#app{padding:32px 36px;max-width:1800px;margin:auto}.page-title{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-bottom:28px}.eyebrow{font-size:10px;letter-spacing:3px;color:#84997a;margin-bottom:8px}h1{font-size:28px;font-weight:600;margin:0 0 9px;letter-spacing:1px}p{line-height:1.8}.subtitle{font-size:12px;color:var(--muted);margin:0}.actions{display:flex;gap:10px;align-items:center}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:30px}.stat{padding:20px 22px;border:1px solid var(--line);border-radius:12px;background:#fff;position:relative}.stat small{color:#85928a;font-size:12px}.stat strong{display:block;font-size:31px;font-weight:500;margin-top:9px}.stat strong span{font-size:12px;margin-left:7px;color:#98a298}.stat .symbol{position:absolute;right:20px;top:22px;background:#edf3e9;color:#8aab7b;border-radius:10px;padding:9px}.stat:nth-child(3) .symbol{background:#fcf0e0;color:#c29d59}.toolbar{display:flex;align-items:center;gap:10px;margin:0 0 20px;flex-wrap:wrap}.toolbar h2{font-size:17px;margin:0 auto 0 0}.search{width:190px;font-size:12px}.chip{font-size:12px;border-radius:25px;padding:8px 15px}.chip.on{background:#e3ede0;color:#316445;border-color:#cfdec8}.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.child{border:1px solid var(--line);border-radius:14px;background:#fff;padding:21px;transition:box-shadow .2s;min-width:0}.child:hover{box-shadow:0 5px 20px #244e3810}.child-head{display:flex;align-items:center;gap:12px}.child-avatar{height:45px;width:45px;flex-shrink:0;display:grid;place-items:center;border-radius:15px;background:#eef0df;color:#829768;font-size:23px}.child:nth-child(3n+2) .child-avatar{background:#f6e9df;color:#b18e73}.child:nth-child(3n) .child-avatar{background:#e4eef0;color:#73979c}.child h3{font-size:17px;margin:0 0 5px}.age{font-size:11px;color:#99a197}.badge{display:inline-block;border-radius:5px;font-size:10px;padding:4px 7px;margin-left:auto;background:#f3f4ef;color:#8a9985}.alert{font-size:11px;margin-top:18px;padding:8px 10px;border-radius:6px;background:#fbefe6;color:#b6794e;min-height:32px;overflow-wrap:anywhere}.alert.clear{color:#80987d;background:#f1f6ee}.alert.unknown{background:#f7f1db;color:#a58a43}.feed-summary{display:flex;justify-content:space-between;align-items:end;margin:20px 0}.feed-summary small{display:block;color:#8f9a90;font-size:10px;margin-bottom:6px}.feed-summary strong{font-size:26px;font-weight:500;letter-spacing:-1px}.feed-summary strong i{font-size:11px;font-style:normal;color:#9aa497;letter-spacing:0;margin-left:5px}.feed-summary .time{text-align:right}.feed-summary .time strong{font-size:18px;letter-spacing:0}.child-bottom{display:flex;align-items:center;justify-content:space-between;border-top:1px dashed #e1e7dc;padding-top:15px;font-size:11px;color:#929d91}.child-bottom button{color:#397b56;background:#edf4e9;border:0;padding:8px 14px;font-size:12px}.note{font-size:11px;color:#93a08f;margin:0 0 15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.empty{padding:60px;text-align:center;background:#fff;border-radius:12px;color:#9aa398;grid-column:1/-1}footer{font-size:9px;letter-spacing:2px;padding:12px 36px 25px;color:#a2aca0;display:flex;justify-content:space-between}footer span{letter-spacing:1px}.panel{background:white;border:1px solid var(--line);border-radius:14px;padding:24px;margin-bottom:20px}.panel h2{font-size:18px;margin-top:0}.panel p,.panel li{font-size:13px;line-height:1.9;color:#748574}.table-scroll{overflow-x:auto}table{width:100%;border-collapse:collapse;white-space:nowrap;font-size:12px}th{text-align:left;color:#91a08e;font-weight:400;background:#f6f8f3}th,td{padding:15px;border-bottom:1px solid var(--line)}.void{opacity:.5}.wrap{white-space:normal;min-width:130px;max-width:240px;overflow-wrap:anywhere}dialog{width:480px;max-width:calc(100% - 28px);border:0;border-radius:18px;padding:27px;color:#354b3d;box-shadow:0 25px 90px #233a3830}dialog::backdrop{background:#203d3460;backdrop-filter:blur(3px)}.modal-title{display:flex;align-items:center;justify-content:space-between}dialog h2{margin:0;font-size:21px}.close{border:0;font-size:22px;padding:2px 9px}label.field{display:block;font-size:12px;margin:18px 0 7px}label.field input,label.field select,label.field textarea{display:block;width:100%;margin-top:8px}textarea{min-height:76px;resize:vertical}.presets{display:flex;gap:9px;margin-top:10px}.presets button{flex:1;padding:8px}.form-actions{display:flex;gap:10px;margin-top:25px}.form-actions button{flex:1}.hint{font-size:11px;color:#93a08f;line-height:1.7}#toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:#275b45;color:white;border-radius:10px;padding:14px 23px;box-shadow:0 8px 30px #0002;display:none;z-index:10;max-width:90%;font-size:13px}.board-mode .sidebar,.board-mode header,.board-mode footer{display:none}.board-mode main{margin-left:0}.board-mode{background:#172f2b;color:#f3f5e9}.board-mode .demo{background:#203a31;color:#a6bca7}.board-mode #app{padding:32px 42px}.board-mode .child{background:#234039;border-color:#3a5449}.board-mode .child h3{font-size:24px}.board-mode .age{font-size:14px;color:#b8c9b6}.board-mode .child .note{font-size:15px;white-space:normal;color:#bccab7}.board-mode .alert{font-size:15px}.board-mode .feed-summary strong{font-size:42px}.board-mode .feed-summary small{font-size:13px;color:#a7bca4}.board-mode .feed-summary .time strong{font-size:30px}.board-mode .grid{grid-template-columns:repeat(3,minmax(0,1fr))}.board-mode .child-bottom{font-size:14px}.board-mode .subtitle{color:#b5c6b1}.board-mode .empty{background:#234039}.privacy{min-height:65vh;display:grid;place-content:center;text-align:center}.privacy h1{font-size:44px}.board-controls{display:flex;justify-content:space-between;align-items:center;margin-top:24px}
/* 大屏翻页（2026-10-27）：每页最多 10 位，翻页看，字号不再随人数缩小 */
.board-pager{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.board-pager button{font-size:14px;padding:8px 16px;border-radius:9px}
.board-pager button:disabled{opacity:.32;cursor:not-allowed}
.board-page{font-size:15px;color:#cfe0c8;font-variant-numeric:tabular-nums;letter-spacing:.02em}
.board-page b{font-size:19px;color:#f4e4bc;font-weight:700}
.board-pager-info{font-size:12.5px;color:#9fb5a8}

/* ========== 班级下拉（自绘，2026-10-27）：班名正常字 + 班级类型小字 ========== */
.csel{position:relative;display:inline-block;vertical-align:middle}
.csel-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 11px;border:1px solid #dbe3da;border-radius:9px;background:#fff;color:#2f4b3d;font-size:14px;line-height:1.2;cursor:pointer;max-width:100%}
.csel-btn:hover{background:#f6faf4;border-color:#9cc0a2}
.csel-btn:focus-visible{outline:3px solid #e9b665;outline-offset:2px}
.csel-name{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.csel-type{font-size:11.5px;font-weight:400;color:#6f8168;background:#f1f5ee;border:1px solid #e2ead9;border-radius:5px;padding:1px 6px;white-space:nowrap}
.csel-caret{font-size:11px;color:#7d8d77;flex:0 0 auto;transition:transform .16s}
.csel.open .csel-caret{transform:rotate(180deg)}
.csel-menu{position:absolute;top:calc(100% + 6px);right:0;min-width:100%;width:max-content;max-width:min(340px,86vw);max-height:min(62vh,340px);overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 14px 34px #1f2f2824;padding:5px;z-index:30}
.csel-item{display:flex;align-items:baseline;gap:8px;width:100%;text-align:left;padding:9px 10px;border:0;background:transparent;border-radius:8px;color:#33473c;cursor:pointer;font-size:14px}
.csel-item:hover{background:#f2f7f0}
.csel-item.on{background:#e7f0e4;color:#22624a}
.csel-item-name{font-weight:600;font-size:14px;white-space:nowrap}
.csel-item-type{font-size:11.5px;font-weight:400;color:#8a9a83;white-space:nowrap}
.csel-item.on .csel-item-type{color:#4f7a5f}
.csel-tick{margin-left:auto;color:#2f7a4f;font-size:12px;line-height:1}
/* 大屏：按钮与选项都放大一档，电视上看得清 */
.board-mode .csel-btn{padding:10px 14px;background:#f4f7ee;color:#274d3c}
.board-mode .csel-btn:hover{background:#e6efe0}
.board-mode .csel-name{font-size:16px}
.board-mode .csel-type{font-size:12px}
.board-mode .csel-menu .csel-item{background:transparent;color:#33473c;border:0}
.board-mode .csel-menu .csel-item:hover{background:#f2f7f0}
.board-mode .csel-item.on{background:#e7f0e4;color:#22624a}
.board-mode .csel-item-name{font-size:16px}
.board-mode .csel-item-type{font-size:12.5px}
@media(max-width:680px){
  .csel-btn{padding:7px 9px}
  .csel-name{font-size:13px}
  .csel-type{font-size:10.5px;padding:1px 5px}
  .csel-menu{max-width:88vw}
  .csel-item{padding:10px}
}.clock{font-size:35px;font-variant-numeric:tabular-nums}.status-line{font-size:11px;color:#9fae99;margin-bottom:20px}.error{color:#b34d39;font-size:12px;min-height:18px}
/* 班级设置复制（2026-10-26）：一班阅读理解式的两块勾选区，目标班列表限高滚动 */
.cc-block{border:1px solid var(--line);border-radius:10px;margin-top:14px;overflow:hidden}
.cc-head{display:flex;align-items:center;gap:8px;background:#f6f8f3;font-size:12px;color:#5c6d61;padding:8px 12px;border-bottom:1px solid var(--line)}
.cc-head button:first-of-type{margin-left:auto}
.cc-head button{padding:5px 9px;font-size:11px}
.cc-list{max-height:200px;overflow:auto;padding:4px 12px 8px}
.cc-list label{display:flex;gap:9px;align-items:flex-start;padding:8px 0;border-bottom:1px dashed #ebeceb;font-size:12.5px;cursor:pointer}
.cc-list label:last-child{border-bottom:0}
.cc-list input{margin-top:2px;flex:0 0 auto}
.cc-list b{font-weight:600;color:#354a3f}
.cc-list small{display:block;color:#93a08f;font-size:11px;line-height:1.6;margin-top:2px}
.cc-list label.cc-self{opacity:.45;cursor:not-allowed}
@media(min-width:1600px){.grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(max-width:1100px){.sidebar{width:190px;padding:25px 15px}main{margin-left:190px}#app{padding:26px 24px}.grid{grid-template-columns:repeat(2,minmax(0,1fr))}.stats{gap:10px}.stat{padding:16px}.stat .symbol{display:none}.page-title{align-items:start}.actions{flex-wrap:wrap;justify-content:end}header{padding:0 24px}.board-mode .grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:680px){.sidebar{z-index:3;inset:auto 0 0 0;width:100%;height:68px;padding:4px 6px;border-right:0;border-top:1px solid var(--line)}.brand,.campus,.nav-label,.sidebar-bottom{display:none}nav{display:flex;gap:0;justify-content:space-around}nav button{font-size:16px;flex-direction:column;gap:2px;align-items:center;padding:6px 8px;border-radius:6px}nav button span{font-size:10px;font-weight:500}nav button i{width:auto;font-size:19px;color:inherit}nav button.active{box-shadow:none}nav small{display:none}main{margin:0;padding-bottom:68px}header{height:60px;padding:0 16px}.header-right{gap:5px}.sync{display:none}header select{font-size:11px;padding:7px}.demo{padding:8px 16px;font-size:10px}#app{padding:23px 16px}.page-title{flex-direction:column;gap:15px;margin-bottom:20px}h1{font-size:25px}.actions{width:100%;justify-content:start}.actions select{flex:1}.stats{grid-template-columns:repeat(2,1fr);margin-bottom:24px}.stat{padding:14px 16px}.stat strong{font-size:27px}.grid{grid-template-columns:1fr}.toolbar{gap:8px}.toolbar h2{flex-basis:100%;margin-bottom:8px}.search{width:100%;order:3}.child{padding:19px}.child-head h3{font-size:19px}.child-bottom button{padding:12px 20px}footer{padding:15px;font-size:8px}.board-mode #app{padding:22px 16px}.board-mode .grid{grid-template-columns:1fr}.board-mode .page-title .actions{flex-wrap:wrap}.board-mode main{padding-bottom:0}.board-controls{gap:8px;flex-wrap:wrap}.panel{padding:17px}dialog{padding:22px}}

/* Whole-class requirements board: all 15 children on one screen. */
.requirements{margin:16px 0;font-size:13px}.requirements>div{display:grid;grid-template-columns:90px 1fr;gap:8px;margin:10px 0}.requirements dt{color:#88978b;font-size:11px}.requirements dd{margin:0;overflow-wrap:anywhere}.board-mode #app{max-width:none;padding:16px 24px}.board-mode .page-title{margin-bottom:10px}.board-mode .eyebrow{display:none}.board-mode h1{font-size:26px;margin-bottom:5px}.board-mode .status-line{margin-bottom:10px;font-size:13px}.board-table-wrap{width:100%;overflow-x:auto}.board-table{table-layout:fixed;width:100%;white-space:normal;color:#e5eee5;border-collapse:separate;border-spacing:0}.board-table th{background:#315048;color:#c1d3c1;font-size:16px;padding:11px 12px;white-space:nowrap}.board-table td{background:#223e36;border-bottom:1px solid #3b5347;padding:4px 12px;font-size:clamp(15px,1.05vw,20px);line-height:1.4;overflow-wrap:break-word;word-break:normal;line-break:strict;height:calc(var(--board-h, calc(100dvh - 196px)) / var(--rows))}
/* 排敏食物的「更新日期」并到同一行：单独占一行会把整行撑高 20px，10 行就撑出屏幕、触发整体缩放 */
.board-table .cleared-foods .foods-updated{display:inline;margin-left:5px;font-size:.72em;white-space:nowrap}.board-table tr:nth-child(even) td{background:#28453c}.board-table strong{font-size:1.15em}.board-table small{display:block;color:#b7c8b1;font-size:.82em;margin-top:3px}.board-table .milk{font-weight:600;color:#f4e4bc}.board-table .board-allergy{color:#ffd0ad}.board-table .clear{color:#b2c9ad}.board-table .unknown{color:#f4d88c}.board-mode .board-controls{margin-top:10px;font-size:12px}.board-mode .board-controls button{font-size:12px;padding:7px 12px}.board-mode .clock{display:inline-flex;align-items:baseline;gap:1px;padding:6px 14px;border-radius:12px;background:rgba(0,0,0,.28);border:1px solid rgba(247,234,208,.28);font-size:48px;font-weight:700;line-height:1.05;letter-spacing:1px;color:#f7ead0;font-variant-numeric:tabular-nums;text-shadow:0 2px 10px rgba(0,0,0,.35)}.board-mode .clock-sec{font-size:.6em;color:#e8cfa0}.board-mode .subtitle{font-size:11px}.board-mode .demo{font-size:10px;padding:6px 24px}.board-mode .privacy{min-height:65vh}
@media(max-width:900px){.board-table{min-width:1000px}.board-table td{height:auto;min-height:36px}.board-mode .page-title{flex-direction:row}.board-mode .board-controls{flex-wrap:wrap}.board-mode #app{padding:14px 12px}.board-mode h1{font-size:20px}.board-mode .actions{width:auto}.board-mode .clock{font-size:22px;padding:3px 8px;border-radius:8px;letter-spacing:0}}@media(min-width:901px) and (max-height:800px){.board-mode #app{padding:10px 18px}.board-mode .board-table td{font-size:15px;padding:5px 10px;height:calc(var(--board-h, calc(100dvh - 170px)) / var(--rows))}.board-mode .board-table th{padding:6px 10px;font-size:14px}.board-mode h1{font-size:22px}.board-mode .clock{font-size:32px;padding:4px 10px}.board-mode .page-title{margin-bottom:6px}.board-mode .status-line{margin-bottom:6px}.board-mode .board-controls{margin-top:6px}.board-mode .board-table small{display:inline;margin-left:5px}}
.board-mode button{color:#274d3c;background:#f4f7ee}.board-mode button:hover{background:#e0eadb}

.plan-label{font-size:11px;color:#81917f;margin-bottom:10px}.member-slots{display:grid;gap:6px}.milk-slot{display:flex;align-items:center;gap:9px;background:#eff4ec;padding:8px;border-radius:6px;font-size:12px}.slot-index{font-size:10px;opacity:.6}.milk-slot strong{margin-left:auto;white-space:normal;overflow-wrap:anywhere}.slot-time{overflow-wrap:anywhere}.plan-prep{font-size:12px;color:#61755f;overflow-wrap:anywhere}.pending{color:#af9870;font-size:12px}.board-slots{display:flex;gap:5px;flex-wrap:wrap}.board-slots .milk-slot{display:inline-flex;background:#385246;color:#edf3db;padding:4px 7px;font-size:inherit;max-width:100%}.board-slots .milk-slot strong{font-size:1em;color:#f4e4bc;margin-left:5px}.board-slots .slot-index{display:none}.board-table .pending{color:#e1cca1}.row-actions{display:flex;gap:6px}.removed-row{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding:10px}.slot-edit{display:grid;grid-template-columns:42px 1fr 1fr 25px;gap:8px;align-items:end;background:#f2f6ee;padding:10px;border-radius:8px;margin-bottom:10px}.slot-edit label{font-size:11px;color:#70836b}.slot-edit input{width:100%;min-width:0;font-size:12px;padding:9px 7px;margin-top:5px}.slot-edit label{display:block}.slot-row{display:flex;align-items:center;gap:5px;margin-top:5px}.slot-field{position:relative;display:block;flex:1;min-width:0}.slot-field input{width:100%;min-width:0;font-size:12px;padding:9px 7px;margin-top:0}.slot-field select{width:100%;min-width:0;font-size:12px;padding:8px 6px;height:34px;margin-top:0;cursor:pointer}.slot-field input[type=number]{padding-right:32px;-moz-appearance:textfield}.slot-field input[type=number]::-webkit-outer-spin-button,.slot-field input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.slot-field .unit{position:absolute;right:9px;top:50%;transform:translateY(-50%);font-size:11px;color:#84928b;pointer-events:none}.slot-mode{flex:0 0 auto;height:32px;min-width:32px;padding:0 5px;border:1px solid var(--line);border-radius:7px;background:#fff;color:#70836b;font-size:10px;line-height:1}.slot-mode:hover{border-color:#79a38c;background:#f2f8f3;color:#23765d}.slot-number{font-size:11px;align-self:center}.slot-delete{border:0;padding:8px 0;color:#a66755;background:transparent}.slot-delete:disabled{opacity:.3;cursor:default}#addSlot{width:100%;border-style:dashed;color:#347855;font-size:12px;margin:4px 0 6px}@media(max-width:680px){.slot-edit{grid-template-columns:32px 1fr 1fr 20px;gap:5px;padding:8px}.slot-row{gap:4px}.slot-mode{min-width:26px;height:30px;padding:0 3px;font-size:9px}.row-actions{flex-wrap:wrap}}

.food-info{display:grid;grid-template-columns:75px 1fr auto;gap:8px;align-items:center;background:#f3f6ed;border-radius:8px;padding:10px;font-size:12px}.food-info>span{font-size:11px;color:#71816a}.food-info>div{overflow-wrap:anywhere}.foods-updated{display:block;font-size:10px;color:#8a9b83;margin-top:5px}.board-table .cleared-foods{color:#d4e5bc}.board-table .foods-updated{font-size:.7em;color:#a3b69b}.row-actions{flex-wrap:wrap}

.brand{flex-direction:column;align-items:flex-start;gap:12px;font-size:23px;letter-spacing:1px}.brand-logo{display:block;width:100%;max-width:188px;height:auto;object-fit:contain}.brand small{letter-spacing:2px;margin-top:2px;color:#8fa297}.header-title{display:flex;align-items:center;gap:10px}.mobile-logo,.board-logo{display:none}.page-heading{display:flex;align-items:center;gap:18px;min-width:0}.board-mode .board-logo{display:block;width:175px;height:60px;object-fit:contain;background:#fff;border-radius:9px;padding:3px}.privacy-logo{width:350px;max-width:80vw;background:#fff;border-radius:18px;margin:0 auto 28px;object-fit:contain}.board-mode .eyebrow{display:block;font-size:10px;color:#c2d4bd;letter-spacing:2px;margin-bottom:5px}@media(max-width:680px){.mobile-logo{display:block;width:92px;height:36px;object-fit:contain}.breadcrumb{display:none}.header-title{gap:5px;font-size:10px}.board-mode .board-logo{width:100px;height:40px}.board-mode .page-heading{gap:10px}.board-mode .eyebrow{font-size:8px;letter-spacing:0}}

body.auth-screen .sidebar,body.auth-screen header,body.auth-screen footer,body.auth-screen .demo{display:none}body.auth-screen main{margin:0;padding:0}.login-shell{min-height:90vh;display:grid;place-items:center}.login-card{background:white;border:1px solid var(--line);padding:36px;border-radius:18px;width:420px;max-width:100%}.login-card img{width:220px;max-width:100%;display:block;margin:0 auto 20px}.login-card h1{text-align:center;font-size:24px}.login-card button{width:100%}.account-class-checks{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}.account-class-checks label{padding:8px;background:#eef3e9;border-radius:6px;font-size:12px}.account-class-checks input{margin-right:5px}.cloud-actions{display:flex;gap:10px;flex-wrap:wrap}.demo.offline{background:#f8e6dc;color:#a34d32}#identity{font-size:12px}#boardSync{color:#b7d2a7}.board-mode .demo.offline{background:#703e31;color:#fff}.cloud-help{max-width:760px}.cloud-help li{margin:8px 0}.account-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:14px 0;border-bottom:1px solid var(--line)}@media(max-width:680px){#identity{max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.login-card{padding:24px}.header-right{gap:8px}}
body.board-mode{min-height:100dvh;background:#1e302b}.board-mode main{min-height:100dvh}
.child .actions{flex-wrap:wrap;gap:8px}.child .actions button{padding:8px 12px;font-size:12px}

/* ========== 一日流程记录（班级大屏右侧按钮 + 填写弹窗） ========== */
.board-table td.daily-cell{vertical-align:middle;padding:6px 8px}
.board-mode button.daily-btn{display:flex;flex-direction:column;gap:4px;width:100%;min-height:48px;padding:7px 9px;border:1px solid rgba(244,228,188,.45);border-radius:10px;background:rgba(247,234,208,.1);color:#f4e4bc;text-align:left;line-height:1.25}
.board-mode button.daily-btn:hover{background:rgba(247,234,208,.22);border-color:#f4e4bc}
.board-mode button.daily-btn.has{background:#3d6a52;border-color:#8fbf8d;color:#eaf5d9}
.board-mode button.daily-btn.has:hover{background:#46795c}
.daily-btn-main{font-size:1em;font-weight:600;white-space:nowrap}
.brief-empty{font-size:.74em;color:#cddcc6;opacity:.9}
.daily-btn:not(.has) .brief-empty{color:#e6d3ab}
.brief-tags{display:flex;flex-wrap:wrap;gap:3px}
.brief-tags i{font-style:normal;font-size:.66em;padding:1px 5px;border-radius:9px;background:rgba(255,255,255,.18);white-space:nowrap}
.brief-when{font-size:.64em;opacity:.75;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.board-mode .board-table td.daily-cell{padding:5px 7px}
.board-mode button.daily-btn{min-height:0}
@media(min-width:901px) and (max-height:800px){.board-mode button.daily-btn{padding:4px 7px;gap:2px}.board-mode .daily-btn-main{font-size:.92em}}

/* 出勤勾选（大屏最前一列） */
.board-table td.attend-cell{vertical-align:middle;padding:4px 6px;text-align:center}
.attend-check{display:inline-flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;user-select:none}
.attend-check input{width:22px;height:22px;margin:0;accent-color:#6fbf73;cursor:pointer;flex:0 0 auto}
.attend-check input:disabled{cursor:not-allowed;opacity:.55}
.attend-check span{font-size:.72em;color:#d9c9a6;white-space:nowrap}
.attend-check.on span{color:#b9e6b0;font-weight:600}
.board-table tr.absent td{opacity:.62}
.board-table tr.absent .daily-cell .daily-btn{opacity:.75}
.board-mode button.daily-btn:disabled{cursor:not-allowed;opacity:.7;border-style:dashed;filter:saturate(.6)}
.board-mode button.daily-btn:disabled:hover{background:rgba(247,234,208,.1)}
.dadd{margin-top:7px;font-size:12px;padding:5px 12px;border-radius:15px;border:1px solid #cfe0cb;background:#f4f9f1;color:#2f6b4c;white-space:nowrap}
.dadd:hover:not(:disabled){background:#e4f1de;border-color:#9cc0a2}
.dadd:disabled{opacity:.5;cursor:not-allowed}
.dr-no{flex:0 0 auto;width:18px;height:18px;border-radius:50%;background:#eaf2e6;color:#6d8464;font-size:10px;display:grid;place-items:center}
.dr-del{flex:0 0 auto;width:22px;height:22px;line-height:1;padding:0;border-radius:50%;border:1px solid #e2cfc4;background:#fdf5f1;color:#b3705a;font-size:13px}
.dr-del:hover:not(:disabled){background:#f7e6dd}
.dr-del:disabled{opacity:.35;cursor:not-allowed}

/* 弹窗加宽，方便老师用平板/触屏填写 */
dialog:has(.daily-meta){width:min(1140px,calc(100vw - 24px));max-height:92dvh;padding:20px 22px 14px;overflow:auto}
#modalBody:has(.daily-meta){display:flex;flex-direction:column;max-height:calc(92dvh - 34px)}
#modalBody:has(.daily-meta) .dgrid{flex:0 1 auto}
.daily-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:14px 0 6px;max-width:520px}
.dm-item{background:#f2f6ee;border-radius:9px;padding:7px 9px;min-width:0}
.dm-item small{display:block;font-size:10px;color:#7d8d77;margin-bottom:2px}

/* ========== 体格测量（乳儿班 / 托小班 · 每月第二个周二） ========== */
[data-view="measure"]{position:relative}
.nav-badge{position:absolute;right:8px;top:50%;transform:translateY(-50%);font-style:normal;font-size:10px;line-height:1;background:#c9772f;color:#fff;border-radius:9px;padding:3px 5px;min-width:16px;text-align:center;font-weight:600}
.me-tip{border-radius:10px;padding:11px 15px;margin:-6px 0 18px;font-size:12.5px;line-height:1.7;background:#f2f6ee;border:1px solid #e2eadb;color:#5d7260}
.me-tip.warn{background:#fdf3e4;border-color:#f0dfc2;color:#96703c}
.me-tip.good{background:#eef5e9;border-color:#d8e7cf;color:#4d7a52}
.stats.mestats{grid-template-columns:repeat(3,minmax(0,1fr))}
.me-panel .panel-head span b{color:#b4763a}
.me-table{font-size:13px}
.me-table th{font-size:11.5px}
.me-table td{padding:11px 12px;vertical-align:middle}
.me-name .me-open{border:0;background:transparent;padding:0;font-size:13.5px;font-weight:600;color:#2f5f47;text-align:left;border-radius:0}
.me-name .me-open:hover{background:transparent;text-decoration:underline}
.me-name small{display:block;font-size:10.5px;color:#93a08f;font-weight:400;margin-top:2px}
.me-num{font-variant-numeric:tabular-nums;font-weight:600;color:#33473c}
.me-num small{font-size:10px;color:#93a08f;margin-left:2px;font-weight:400}
.me-row.done{background:#fbfdf9}
.me-st{font-size:11px;border-radius:20px;padding:3px 9px;white-space:nowrap;display:inline-block}
.me-st.done{background:#e9f3e3;color:#477a4e}
.me-st.late{background:#fceee0;color:#a9662c;font-weight:600}
.me-st.near{background:#f3f2e2;color:#8a8446}
.me-home-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.me-home-num{font-size:34px;font-weight:500;color:#2f5f47;line-height:1;font-variant-numeric:tabular-nums}
.me-home-num.warn{color:#c07a34}
.me-home-txt{flex:1;min-width:170px}
.me-home-txt b{display:block;font-size:14px;color:#33473c}
.me-home-txt small{font-size:11.5px;color:#8d9b8a;line-height:1.6}
.me-home-names{margin-top:12px}
.me-home-ok{font-size:12.5px;color:#6d816b;margin:0}
.me-form-head{display:flex;justify-content:space-between;gap:10px;align-items:baseline;border-bottom:1px dashed #e1e7dc;padding-bottom:10px;margin:12px 0 2px;flex-wrap:wrap}
.me-form-head b{font-size:16px;color:#2f5f47}
.me-form-head>div{font-size:12px}
.me-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.me-grid label.field{margin:12px 0 0}
.me-trend{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:14px 0 4px}
.me-spark{background:#f5f8f2;border:1px solid #e6ede0;border-radius:10px;padding:9px 11px;min-width:0}
.me-spark>span{display:block;font-size:10.5px;color:#84947f}
.me-spark>b{display:block;font-size:17px;font-weight:600;color:#2f5f47;margin:2px 0 4px}
.me-spark>b small{font-size:10px;color:#93a08f;margin-left:2px;font-weight:400}
.me-spark>b em{font-style:normal;font-size:10px;margin-left:6px;color:#6f8a5f}
.me-spark>b em.down{color:#b3763a}
.me-spark-svg{width:100%;height:54px;display:block;overflow:visible}
.me-spark-svg path{fill:none;stroke:#4f9070;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.me-spark-svg circle{fill:#4f9070}
.me-spark>small{display:block;font-size:10px;color:#9aa79a;margin-top:4px}
.me-hist{margin:18px 0 0;padding:14px 0 0;border:0;border-top:1px dashed #e1e7dc;border-radius:0;background:transparent}
.me-hist .panel-head{margin-bottom:6px}
.me-remind-on{align-items:flex-start;gap:9px}
.me-remind-time{display:flex;align-items:center;gap:10px;margin:10px 0 4px;padding-left:2px;font-size:12px;color:#61755f;flex-wrap:wrap}
@media(max-width:900px){.me-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.me-trend{grid-template-columns:1fr}}
@media(max-width:680px){.stats.mestats{grid-template-columns:1fr 1fr}.me-table td,.me-table th{padding:9px 8px}nav button .nav-badge{position:static;transform:none;margin-left:2px;font-size:9px;padding:1px 4px}.me-home-num{font-size:27px}}
/* 弹窗里内容多（表单 + 三条趋势 + 历次记录），单独加宽，不然日期框会被挤成半截 */
dialog:has(#meForm){width:min(780px,calc(100vw - 24px));max-height:92dvh;overflow:auto}
#meForm .me-grid{grid-template-columns:1.25fr 1fr 1fr 1fr}
.me-grid input[type=number]{-moz-appearance:textfield}
.me-grid input[type=number]::-webkit-outer-spin-button,.me-grid input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.me-mini{display:none;font-size:10.5px;color:#8ba08a;margin-top:2px;font-weight:400;letter-spacing:0}
.me-last .hint{margin-left:5px;font-size:10.5px;color:#9aa79a}
.me-remind-time .slot-pair{flex:0 0 auto;width:186px}
.me-remind-time .slot-pair select{width:82px;flex:0 0 auto;text-align:center;text-align-last:center;padding:8px 4px}
.me-hist .me-table td:nth-child(5){white-space:normal;max-width:210px;overflow-wrap:anywhere}
/* 每个人自己的周期（按月龄分段，同一行里可能不一样） */
.me-cycle{display:block;margin-top:3px;font-size:10.5px;color:#9aa79a;letter-spacing:0;font-variant-numeric:tabular-nums}
/* 测量周期设置弹窗（2026-10-26 晚）：月龄段 + 频率，一行一段 */
.mer-row{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap;padding:9px 0;border-bottom:1px dashed #e2e9e0}
.mer-row:last-child{border-bottom:0}
.mer-cell{display:flex;flex-direction:column;gap:3px;flex:1 1 92px;min-width:0;max-width:132px;font-size:11px;color:#7d8d77}
.mer-cell input{width:100%;min-width:0;font-size:14px;padding:7px 8px;border:1px solid #d7e2d5;border-radius:7px;background:#fff;text-align:center;font-variant-numeric:tabular-nums}
.mer-sep{font-size:13px;color:#9aa79a;padding-bottom:10px}
.mer-acts{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0 2px}
.mer-row .mer-del{margin-bottom:2px}
/* 手机：表格只留「姓名 / 上次测量（含三个数值的小字）/ 状态 / 录入」，其余列交给弹窗看 */
@media(max-width:680px){
  dialog:has(#meForm){width:calc(100vw - 16px);padding:18px 14px}
  #meForm .me-grid{grid-template-columns:1fr 1fr}
  .me-table .me-col-age,.me-table .me-col-val{display:none}
  .me-mini{display:block}
  .me-cards{display:grid;gap:8px}
  .me-card{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px 10px;text-align:left;padding:11px 13px;border:1px solid #e4eae4;border-radius:11px;background:#fff;color:inherit;width:100%}
  .me-card:hover{background:#f6faf4;border-color:#c9dcc4}
  .me-card-top{font-size:14.5px;font-weight:600;color:#2f5f47;min-width:0}
  .me-card-top i{font-style:normal;font-size:10.5px;color:#93a08f;margin-left:6px;font-weight:400}
  .me-card .me-st{align-self:center;justify-self:end}
  .me-card-mid{grid-column:1;font-size:11px;color:#84948b;font-variant-numeric:tabular-nums}
  .me-card-act{grid-column:2;grid-row:1/3;align-self:center;font-size:12px;color:#31704f;white-space:nowrap}
  .me-remind-time .slot-pair{width:100%}
  .me-remind-time .slot-pair select{width:auto;flex:1 1 0}
}
.dm-item strong{font-size:14px}
.dm-item input,.dm-item select{width:100%;min-width:0;font-size:13px;padding:3px 5px;border:1px solid #d7e2d5;border-radius:6px;background:#fff;margin:0}
.dhint{font-size:11px;color:#7d8d77;margin:8px 0 4px}
.dalert{background:#fff3e6;border:1px solid #f0d3b0;color:#9b5a33;border-radius:8px;padding:6px 10px;font-size:12px;margin:6px 0}
.dalert b{font-weight:600}
.dalert-box{background:#fdf1e3;border-left:4px solid #d9a45c;color:#8a5a2e;padding:8px 12px;border-radius:6px;font-size:12px;margin:8px 0}
/* 本机草稿提示条（2026-10-26）：上次没保存成功的内容还在，提醒老师可以一键恢复 */
.ddraft-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:#fff8dc;border:1px solid #e8cf7a;border-radius:8px;padding:7px 12px;margin:8px 0;font-size:12px;color:#7a5c12}
.ddraft-bar>span{flex:1 1 auto;min-width:180px}
.ddraft-bar button{padding:4px 10px;font-size:12px}
.ddraft-bar button.primary{background:#c8961e;border-color:#c8961e;color:#fff}
.dgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;max-height:min(58vh,540px);overflow:auto;padding:2px 4px 4px 2px}
.dcard-other{grid-column:span 3}
.dgrid.is-readonly{opacity:.62;pointer-events:none}
.dcard{border:1px solid #e3e9e0;border-radius:12px;padding:10px 12px;background:#fff;min-width:0}
.dcard-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:8px}
.dcard-head h3{margin:0;font-size:14px;color:#2d5a45;letter-spacing:.5px}
.card-tip{font-size:10px;color:#8a9a83;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:50%}
.dcard textarea{width:100%;min-height:78px;font-size:13px;line-height:1.6;padding:8px 10px;border-radius:9px;border:1px solid #dbe3da;resize:vertical}
.drow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.drow+.drow{margin-top:6px}
.dr-time{display:flex;align-items:center;gap:5px;font-size:11px;color:#7d8d77;white-space:nowrap}
.dr-time select{width:auto;min-width:88px;font-size:13px;padding:6px 4px;margin:0;border:1px solid #d7e2d5;border-radius:7px;background:#fff;cursor:pointer}
.dr-note{position:relative;flex:1;min-width:120px;display:block}
.dr-note input{width:100%;font-size:14px;padding:7px 9px;margin:0;border:1px solid #d7e2d5;border-radius:7px;background:#fff}
.dr-note input[type=text]:focus{border-color:#6aa07e;box-shadow:0 0 0 3px #e3f0e4}
.dr-note .unit{position:absolute;right:9px;top:50%;transform:translateY(-50%);font-size:11px;color:#98a698;pointer-events:none}
.dr-note input+ .unit{padding-right:2px}
.dr-count{display:flex;align-items:center;gap:5px;font-size:11px;color:#7d8d77}
.dr-count input{width:80px;font-size:13px;padding:6px 8px;margin:0;border:1px solid #d7e2d5;border-radius:7px}
.dr-other{flex:1;min-width:110px}
.dr-other input{width:100%;font-size:13px;padding:6px 8px;margin:0;border:1px solid #d7e2d5;border-radius:7px}
.dr-now,.dr-time-now{flex:0 0 auto;font-size:11px;padding:5px 9px;border-radius:16px;border:1px solid #bcd7bf;background:#eef6ec;color:#2b6b4b;white-space:nowrap}
.dr-now:hover,.dr-time-now:hover{background:#dcefdc}
.dr-now.flash,.dr-time-now.flash{background:#23765d;color:#fff;border-color:#23765d}
.dseg,.seg-group{display:flex;flex-wrap:wrap;gap:5px}
.seg{font-size:12px;padding:6px 11px;border-radius:16px;border:1px solid #d7e2d5;background:#fff;color:#4a5f50;white-space:nowrap}
.seg.on{background:#23765d;border-color:#23765d;color:#fff}
.seg-label{font-size:10px;color:#8a9a83;margin:8px 0 4px}
/* 进食记录：左边餐次名 + 右边四选一（未进食 / 少量 / 光盘 / 加量） */
.drow-fixed{gap:8px}
.dr-meal{flex:0 0 auto;min-width:52px;font-size:13px;font-weight:600;color:#3d5445;background:#eef3e9;border:1px solid #dbe6d6;border-radius:8px;padding:6px 8px;text-align:center}
.dr-seg-meal{flex:1 1 auto;display:flex;flex-wrap:wrap;gap:6px}
/* 大便记录：时间 + 拉稀 / 正常 / 偏硬（单选），没有次数、没有「现在」 */
.drow-seg-opts{flex:1 1 auto;display:flex;flex-wrap:wrap;gap:6px;min-width:150px}
/* 窄屏（手机竖屏）放不下「时间 + 三个方框 + 删除」一行时：
   把删除按钮留在时间那一行，三个方框整行换到下一行，避免 × 孤零零掉到第三行 */
@media(max-width:420px){
  .drow-seg .dr-del{order:2;margin-left:auto}
  .drow-seg .drow-seg-opts{order:3;flex:1 1 100%;min-width:0}
}
/* 体温的输入框紧跟在「异常」按钮后面（2026-10-26）：没选「异常」时灰掉不可填 */
.dr-note-inline{position:relative;display:inline-flex;align-items:center;flex:0 1 96px;min-width:78px}
.dr-note-inline input{width:100%;font-size:13px;padding:7px 26px 7px 9px;margin:0;border:1px solid #d7e2d5;border-radius:7px;background:#fff}
.dr-note-inline input:focus{outline:none;border-color:#6aa07e;box-shadow:0 0 0 3px #e3f0e4}
.dr-note-inline input:disabled{background:#f2f4f1;color:#a9b3a6;cursor:not-allowed}
.dr-note-inline .unit{position:absolute;right:8px;font-size:11px;color:#98a698;pointer-events:none}
/* 食量那组前面的小标题「进食量」 */
.dr-seg-label{flex:0 0 auto;font-size:11px;color:#7d8d77;background:#eef3e9;border:1px solid #dbe6d6;border-radius:6px;padding:5px 7px;white-space:nowrap}
/* 附属选项卡（选了「少量进食」才出现：余饭 / 余菜 / 余饭菜） */
.dr-seg-sub{flex:0 1 auto;display:inline-flex;flex-wrap:wrap;gap:6px;margin-left:2px}
.dr-seg-sub.hidden{display:none}
.dr-seg-sub .seg{background:#fdf6ec;border-color:#ecd8b8;color:#8a5a2e;font-size:12px;padding:7px 9px}
.dr-seg-sub .seg.on{background:#d9a45c;border-color:#d9a45c;color:#fff}
/* 2026-10-26 新增模块：入园检查（固定几行，每行一组选项）、托大大便 / 午睡（下拉 + 一组选项）、社交表现 */
.drow-fixedrow{gap:8px}
.drow-fixedrow .dr-note-row,.drow-single .dr-note-row{position:relative;flex:1 1 120px;min-width:110px;display:block}
.dr-note-row input{width:100%;font-size:13px;padding:7px 9px;margin:0;border:1px solid #d7e2d5;border-radius:7px;background:#fff}
.dr-note-row input:focus{outline:none;border-color:#6aa07e;box-shadow:0 0 0 3px #e3f0e4}
.dr-note-row .unit{position:absolute;right:9px;top:50%;transform:translateY(-50%);font-size:11px;color:#98a698;pointer-events:none}
/* 次数 / 时长下拉（大便几次、睡了多久） */
.dr-count-sel{display:flex;align-items:center;gap:5px;font-size:11px;color:#7d8d77;white-space:nowrap}
.dr-count-sel select{width:auto;min-width:78px;font-size:13px;padding:6px 4px;margin:0;border:1px solid #d7e2d5;border-radius:7px;background:#fff;cursor:pointer}
/* 选项按钮里的灰色小字（社交类型、需安抚（拍 / 抱））：只作提示，不存进报表 */
.seg small{display:block;font-size:10px;font-weight:400;opacity:.72;margin-top:1px;white-space:nowrap}
.seg-wide{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;flex:1 1 100%}
.seg-wide .seg{white-space:normal;text-align:center;padding:9px 8px}
/* 睡眠：入睡 ~ 起床 */
.dr-tilde{flex:0 0 auto;color:#7d8d77;font-size:14px}
/* 今日早教 / 今日运动：一组可多选的方框，不记时间 */
.drow-checks{align-items:flex-start}
.dr-seg-checks{flex:1 1 auto;display:flex;flex-wrap:wrap;gap:7px}
/* 2026-10-26：多选分区下面可以自己填一项（今日课程）；自己填的项用描边样式，跟预设区分开 */
.drow-free{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;flex:1 1 100%}
.dr-free{flex:1 1 150px;min-width:0;font-size:13px;padding:8px 10px;border:1px dashed #c8d8c5;border-radius:9px;background:#fbfdf9}
.dr-free:focus{outline:none;border-color:#6fa383;border-style:solid;background:#fff}
.dr-free-add{flex:0 0 auto;font-size:12px;padding:8px 14px;border-radius:9px;border:1px solid #23765d;background:#23765d;color:#fff}
button.dr-free-add:hover{background:#1c614c;border-color:#1c614c;color:#fff}
.dr-free-add:active{background:#1c614c}
.seg-custom{background:#f4f9f2;border-style:dashed;border-color:#bcd3b8;color:#4a6b52}
.seg-custom.on{background:#3f8a6b;border-color:#3f8a6b;border-style:solid;color:#fff}
/* 班级大屏：大屏上「无已知」用灰色弱化处理，有过敏 / 待确认要一眼看到 */
/* 「无已知过敏」只是兜底文案，比正文字号小 2px，避免和大屏正文抢注意力 */
.board-table .ba-none{color:#93a08f;font-size:calc(1em - 2px)}
.board-table .ba-warn{display:inline-block;color:#8a5a00;background:#f4d88c;border:1px solid #e0bd63;border-radius:7px;padding:3px 9px;font-weight:600;line-height:1.4}
.board-table .ba-alert{display:inline-block;color:#7a2010;background:#ffb9a3;border:1px solid #f08a6c;border-radius:7px;padding:3px 9px;font-weight:700;line-height:1.4}
/* 大屏上没填的内容用 -- 占位，比写一整句「未填写」省地方 */
.board-table .bd-empty{color:#8fa087}
.quick:empty{display:none}.quick{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}
.quick button{font-size:12px;padding:5px 11px;border-radius:15px;border:1px dashed #cdddc9;background:#f6faf3;color:#41684f;white-space:nowrap}
.quick button:hover{background:#e7f2e2;border-style:solid}
.quick button.flash{background:#23765d;color:#fff;border-color:#23765d}
.dnote{font-size:10px;color:#93a08c;margin:6px 0 0;line-height:1.5}
.cdkick{display:none}
/* 喝水时间标尺：7:30–17:30 每 30 分钟一格，整点刻度在轴下方、半点刻度在轴上方 */
.ruler{padding:2px 2px 0;margin-bottom:8px}
.ruler-track{position:relative;height:58px;margin:4px 12px 0}
.ruler-track::before{content:'';position:absolute;left:0;right:0;top:28px;height:2px;background:#cfdccd;border-radius:2px}
.tick{position:absolute;top:0;width:24px;height:58px;transform:translateX(-50%);background:none;border:0;padding:0;cursor:pointer}
.tick-bar{position:absolute;left:50%;margin-left:-1px;width:2px;border-radius:2px;background:#cfdccd}
.tick.major .tick-bar{top:22px;height:12px;background:#9db3a2}
.tick.minor .tick-bar{top:25px;height:6px}
.tick-lab{position:absolute;left:50%;transform:translateX(-50%);font-size:9px;line-height:1;white-space:nowrap;color:#93a08c}
.tick.major .tick-lab{top:38px;font-size:10px;font-weight:600;color:#5b6d5f}
.tick.minor .tick-lab{top:13px}
.tick:hover .tick-bar{background:#5f9c76}
.tick:hover .tick-lab{color:#4a5f50}
.tick.on .tick-bar{background:#23765d;width:3px;margin-left:-1.5px}
.tick.on.major .tick-bar{top:18px;height:20px}
.tick.on.minor .tick-bar{top:22px;height:13px}
.tick.on .tick-lab{color:#23765d;font-weight:700}
.chipset{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 8px}
.mchip{font-size:13px;padding:6px 12px;border-radius:16px;border:1px solid #d7e2d5;background:#fff;color:#45604f}
.mchip.on{background:#23765d;border-color:#23765d;color:#fff}
.chip-extra{width:100%;font-size:12px;padding:7px 9px;border:1px solid #dbe3da;border-radius:8px;margin:0}
.daily-actions{position:sticky;bottom:0;background:#fff;padding-top:10px;z-index:2;flex-wrap:wrap}
.daily-actions button{flex:0 0 auto}
/* 2026-10-27 新增「下一个」：清空/导出这类不走主流程的操作靠左，两个「往下走」的按钮靠右成组，减少误触 */
.daily-actions #dExport{margin-right:auto}
.daily-actions #dSave{flex:0 0 auto;min-width:200px}
.daily-actions #dExport{min-width:150px}
.daily-actions #dNext{min-width:104px;background:#f4f9f1;border-color:#cfe0cb;color:#2f6b4c;font-weight:600;white-space:nowrap}
.daily-actions #dNext:hover:not(:disabled){background:#e4f1de;border-color:#9cc0a2}
.daily-actions #dNext:disabled{background:#fafcfa;border-color:#e4eae4;color:#a9b6ad;font-weight:400;cursor:not-allowed}
@media(max-width:1180px){.dgrid{grid-template-columns:repeat(2,minmax(0,1fr))}.dcard-other{grid-column:span 2}}
@media(max-width:760px){
  dialog:has(.daily-meta){width:calc(100vw - 12px);padding:16px 14px 14px;max-height:94dvh;overflow:auto}
  .dgrid{grid-template-columns:1fr}.dcard-other{grid-column:span 1}
  .daily-meta{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dgrid{grid-template-columns:1fr;max-height:none}
  .dcard-head h3{font-size:15px}
  .dr-note input{font-size:16px}
  .dr-time select{font-size:15px}
  .daily-actions{gap:8px}
  .daily-actions button{flex:1 1 44%;padding:11px 8px;font-size:13px}
  .daily-actions #dSave{flex:1 1 100%;order:5;min-width:0}
  .tick.major .tick-lab{font-size:9px}
  .tick.minor .tick-lab{font-size:8px}
  .ruler-track{margin:4px 8px 0}
}
/* ============================================================
   手机 / 微信内置浏览器适配（2026-10-18）
   解决四类问题：微信老内核打不开 <dialog> 弹窗、系统字体放大撑破布局、
   iPhone 底部小黑条挡住导航、输入框聚焦时 iOS 自动放大页面。
   另把班级大屏在窄屏改成卡片列表（原本是 1000px 宽表格，手机上要横向滑）。
   ============================================================ */

/* 1) 微信「关怀模式 / 字体大小」会整体放大字号撑破布局，这里锁死自动调整 */
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}

/* 2) <dialog> 兜底：微信 X5 等老内核不支持 showModal，退化成「遮罩层 + 定位」 */
#modalMask{display:none}
html.legacy-modal #modalMask{display:block;position:fixed;inset:0;z-index:900;background:rgba(20,40,32,.58)}
html.legacy-modal,html.legacy-modal body{overflow:hidden}
html.legacy-modal #modal{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:901;
  width:480px;max-width:calc(100vw - 24px);max-height:86vh;overflow:auto;overscroll-behavior:contain}
/* 老内核不认识 dialog 时可能当成普通元素显示出来，这里强制关掉 */
dialog:not([open]){display:none}

/* 3) 报表浮层：微信拦截 window.open 时的兜底容器（内部是 iframe，样式天然隔离） */
.report-layer{position:fixed;inset:0;z-index:950;background:#eef2ea;display:flex;flex-direction:column;
  padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}
.report-layer-bar{flex:0 0 auto;display:flex;justify-content:flex-end;padding:8px 12px;background:#fff;border-bottom:1px solid #dfe8dc}
.report-layer-bar button{min-height:38px;padding:8px 20px}
.report-frame{flex:1 1 auto;width:100%;border:0;background:#eef2ea}
body.report-open{overflow:hidden}

@media(max-width:680px){
  /* 4) iPhone 安全区：底部 Tab 栏与页面底部留白避开小黑条 */
  .sidebar{height:calc(64px + env(safe-area-inset-bottom));padding-top:2px;padding-bottom:calc(4px + env(safe-area-inset-bottom))}
  main{padding-bottom:calc(78px + env(safe-area-inset-bottom))}
  footer{padding-bottom:calc(15px + env(safe-area-inset-bottom))}
  /* 大屏视图原本把 main 的底部留白清成了 0，手机上底部有 Tab 栏，得加回来 */
  .board-mode main{padding-bottom:calc(80px + env(safe-area-inset-bottom))}

  /* 5) 表单控件字号 ≥16px：低于 16px 时 iOS 聚焦会自动放大整页且不会自动缩回 */
  input,select,textarea{font-size:16px!important}

  /* 6) 触摸目标加大，手指不容易误触 */
  nav button{min-height:46px;padding:7px 4px}
  .child-bottom button,.row-actions button,.daily-actions button,.form-actions button{min-height:46px}
  .toolbar .chip{min-height:40px;padding:9px 14px}
  .attend-check{min-height:44px;display:inline-flex;align-items:center;gap:6px}
  .board-table td.attend-cell .attend-check{min-height:44px}
}

/* 7) 宽表格在手机上横向滑动，滑动手感贴近原生 */
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
.table-scroll table{min-width:660px}

/* 8) 班级大屏：窄屏改成卡片列表，出勤勾选 + 一日流程按钮都做成大按钮 */
@media(max-width:680px){
  .board-mode .board-table-wrap{overflow:visible}
  .board-table{min-width:0;table-layout:auto}
  .board-table thead{display:none}
  .board-table,.board-table tbody{display:block;width:100%}
  .board-table tr{display:grid;grid-template-columns:62px 1fr;gap:7px 12px;align-items:center;
    background:#223e36;border:1px solid #3b5347;border-radius:14px;padding:13px 14px;margin:0 0 11px}
  .board-table tr:nth-child(even){background:#28453c}
  .board-table td{display:block;height:auto!important;min-height:0!important;
    background:transparent!important;border:0!important;padding:0!important;font-size:14px;line-height:1.5}
  .board-table td.attend-cell{grid-column:1;grid-row:1 / span 3;text-align:left}
  .board-table td:nth-child(2){grid-column:2;grid-row:1}
  .board-table td:nth-child(3){grid-column:2;grid-row:2}
  .board-table td:nth-child(4){grid-column:2;grid-row:3}
  .board-table td:nth-child(5){grid-column:1 / -1;grid-row:4}
  .board-table td:nth-child(6){grid-column:1 / -1;grid-row:5}
  .board-table td:nth-child(7){grid-column:1 / -1;grid-row:6}
  .board-table td.daily-cell{grid-column:1 / -1;grid-row:7}
  .board-table td:nth-child(3)::before{content:'过敏：'}
  .board-table td:nth-child(4)::before{content:'已排敏：'}
  .board-table td:nth-child(5)::before{content:'喝奶：'}
  .board-table td:nth-child(6)::before{content:'冲调：'}
  .board-table td:nth-child(7)::before{content:'备注：'}
  .board-table td:nth-child(3)::before,.board-table td:nth-child(4)::before,
  .board-table td:nth-child(5)::before,.board-table td:nth-child(6)::before,
  .board-table td:nth-child(7)::before{color:#93a891;font-size:12px;margin-right:3px}
  .board-table strong{font-size:17px}
  .board-table small{display:block;color:#b7c8b1;font-size:12px;margin:2px 0 0}
  .board-mode .board-table td{font-size:14px}
  .board-table td.daily-cell .daily-btn{width:100%;min-height:48px;justify-content:center;
    display:flex;flex-direction:column;align-items:center;gap:3px}
  .board-table td.daily-cell .daily-btn .daily-btn-main{font-size:15px}
}

/* 9) 软键盘弹出时（仅手机）隐藏底部 Tab 栏，避免挡住输入框和保存按钮 */
body.kb-open .sidebar{display:none}
@media(min-width:681px){body.kb-open .sidebar{display:block}}

/* 10) 一日流程弹窗底部按钮：手机上三个并排一行（历史记录只读时是四个，会自动折行） */
@media(max-width:760px){
  .daily-actions{gap:9px;flex-wrap:wrap;margin-top:14px}
  .daily-actions button{flex:1 1 96px;min-width:96px;padding:14px 6px;font-size:14px;min-height:50px;white-space:nowrap}
  .daily-actions #dSave{flex:1 1 96px;order:0}
}

/* 11) 一日流程：手机上把「可用面积」尽量还给填写区（仅 ≤760px 生效，桌面不变）
   思路：弹窗铺满整屏 + 四周留白压到最小 + 收紧卡片间距与行距，
   一屏能多看到好几行；控件高度仍保持 48px 左右，手指照样好点。 */
.dh-age{font-size:.78em;color:#7d8d77;font-weight:400;margin-left:5px}
@media(max-width:760px){
  /* 弹窗铺满整屏（含安全区），去掉圆角与外边距，横向纵向都用满 */
  dialog:has(.daily-meta){position:fixed;left:0;top:0;transform:none;margin:0;
    width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0;
    padding:calc(8px + env(safe-area-inset-top)) 8px calc(8px + env(safe-area-inset-bottom))}
  #modalBody:has(.daily-meta){max-height:none;height:100%;display:flex;flex-direction:column}
  #modalBody:has(.daily-meta) .dgrid{flex:1 1 auto;max-height:none;overflow:visible}
  /* 顶部标题与信息区压缩，别占用填写区的高度 */
  .modal-title{margin-bottom:0}
  .modal-title h2{font-size:18px}
  .daily-meta{margin:7px 0 6px;gap:6px}
  .dm-item{padding:7px 10px;border-radius:9px}
  .dm-item small{font-size:10px;margin-bottom:2px}
  .dm-item strong{font-size:14px}
  /* 输入框保持 16px：低于 16px 时 iOS 聚焦会自动放大整页，不能降 */
  .dm-item input,.dm-item select{font-size:16px;padding:8px 9px;min-height:42px}
  .dhint{margin:5px 0 7px;font-size:11px;line-height:1.5}
  /* 卡片：收窄内边距与间距，横向可用宽度更大、纵向一屏放更多行 */
  .dgrid{gap:9px;padding:2px 0 4px}
  .dcard{padding:11px 12px 12px;border-radius:12px}
  .dcard-head{margin-bottom:7px}
  .dcard-head h3{font-size:16px}
  .drow{gap:7px}
  .drow+.drow{margin-top:8px}
  .dr-no{width:21px;height:21px;font-size:10px}
  .dr-time{gap:5px;font-size:11px}
  .dr-meal{min-width:46px;font-size:12px;padding:8px 6px}
  .dr-seg-meal{gap:6px}
  .dr-tilde{font-size:13px}
  .dr-seg-checks{gap:8px}
  /* 下面三个是可输入控件，保持 16px：iOS 上低于 16px 聚焦会自动放大整页 */
  .dr-time select{font-size:16px;padding:10px 8px;min-width:104px;height:46px}
  .dr-note{min-width:126px}
  .dr-note input{font-size:16px;padding:11px 11px;min-height:46px}
  .dr-note .unit{right:10px;font-size:11px}
  .dr-count{gap:5px;font-size:11px}
  .dr-count input{font-size:16px;padding:11px 10px;width:92px;min-height:46px}
  .dr-now{font-size:13px;padding:8px 12px;min-height:40px;border-radius:17px}
  .dr-del{width:30px;height:30px;font-size:17px}
  .dadd{min-height:46px;font-size:14px}
  .seg{font-size:14px;padding:8px 13px;min-height:38px}
  .mchip{font-size:14px;padding:8px 13px;min-height:36px}
  .chipset{gap:7px;margin:4px 0 7px}
  .chip-extra{font-size:16px;padding:9px 11px;min-height:44px}
  .dcard textarea{font-size:16px;min-height:92px;padding:10px 11px;line-height:1.65}
  .dcard .dnote{font-size:10px;margin:5px 0 0}
  .daily-actions{margin-top:10px;gap:8px}
  .daily-actions button{min-height:46px;padding:11px 6px;font-size:13px}
  /* 手机：四个按钮排成 2×2，避免「3 + 1」最后一个孤零零掉到下一行 */
  .daily-actions #dClear{order:1;flex:1 1 46%}
  .daily-actions #dExport{order:2;flex:1 1 46%;min-width:0;margin-right:0}
  .daily-actions #dNext{order:3;flex:1 1 46%;min-width:0}
  .daily-actions #dSave{order:4;flex:1 1 46%;min-width:0}
}

/* 12) 班级大屏页头：手机上重新布局（仅 ≤680px 生效，桌面/电视不变）
   原问题：logo + 眉题 + 三行标题 + 班级下拉 + 时钟挤在一起，标题折成三四行很难看。
   新结构：第一行 = 小 logo + 时钟；第二行 = 标题一行不折行；第三行 = 班级下拉占满整行。
   眉题「森可托育 / SCENIC DAILY CARE」手机上隐藏——logo 本身就是品牌，省两行。 */
@media(max-width:680px){
  .board-mode .page-title{flex-direction:column;align-items:stretch;gap:10px;margin-bottom:8px}
  .board-mode .page-heading{gap:10px;align-items:center;min-width:0}
  .board-mode .board-logo{width:88px;height:34px;border-radius:8px;padding:2px;flex-shrink:0}
  .board-mode .eyebrow{display:none}
  .board-mode .page-heading h1{flex:1 1 auto;min-width:0;font-size:17px;line-height:1.3;margin:0;letter-spacing:.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .board-mode .actions{width:100%;display:flex;align-items:center;gap:8px}
  .board-mode .actions select{flex:1 1 auto;min-width:0;height:44px;font-size:16px;padding:8px 12px;border-radius:10px}
  .board-mode .clock{flex-shrink:0;font-size:19px;padding:8px 12px;border-radius:10px;letter-spacing:0}
  .board-mode .clock-sec{font-size:.62em}
  .board-mode .status-line{font-size:11px;margin-bottom:10px}
}

/* ============================================================
   主页：会员一日生活总览（2026-10-19）
   结构：四张总数卡 → 各班今日进度 → 今日需要关注 → 会员今日状态卡片
   ============================================================ */
.hstats{margin-bottom:20px}
.hstat em{display:block;margin-top:7px;font-style:normal;font-size:11px;color:#8b9a90;line-height:1.6;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hstat.good strong{color:#23765d}
.hstat.warn strong{color:#b8794a}

.hpanel{margin-bottom:18px}
.panel-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.panel-head h2{margin:0;font-size:16px}
.panel-head span{font-size:11px;color:#8b9a90}

/* 各班今日进度 */
.progress-table th,.progress-table td{padding:11px 13px;vertical-align:top}
.progress-table td.cl-name strong{font-size:14px}
.progress-table td.cl-name small{display:block;color:#93a08f;font-size:11px;margin-top:3px}
.progress-table .pnum{font-variant-numeric:tabular-nums;font-size:13px}
.progress-table .ptodo{font-size:11px;color:#a08a5e;margin-top:5px}
.progress-table .pbar{position:relative;height:6px;border-radius:6px;background:#eef2ea;margin-top:8px;max-width:160px;overflow:hidden}
.progress-table .pbar i{display:block;height:100%;border-radius:6px;background:#5ea87c}
.progress-table .pbar i.low{background:#d8a45c}

/* 今日需要关注 */
.attn-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(228px,1fr));gap:12px}
.attn{border:1px solid #e6ece3;border-radius:12px;padding:12px 14px;background:#fbfdfa}
.attn.danger{background:#fdf2ec;border-color:#f0d6c5}
.attn.warn{background:#fdf8ec;border-color:#efe2c2}
.attn-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:9px}
.attn-head strong{font-size:13px;font-weight:600}
.attn.danger .attn-head strong{color:#b35b43}
.attn.warn .attn-head strong{color:#9a7b3a}
.attn-head span{font-size:16px;font-weight:600;color:#8b9a90;font-variant-numeric:tabular-nums}
.attn-list{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.attn-chip{font-size:12px;padding:4px 11px;border-radius:14px;background:#fff;border:1px solid #dfe8dc;color:#41604f}
.attn-chip:hover{background:#eef6ec;border-color:#9cc0a2}
.attn-more{font-size:11px;color:#8b9a90}

/* 会员今日状态 */
.htoolbar{margin:22px 0 14px}
.htoolbar h2{display:flex;align-items:baseline;gap:8px}
.mgroup{margin-bottom:20px}
.mgroup-head{display:flex;align-items:baseline;gap:10px;margin:0 0 10px 2px}
.mgroup-head h3{margin:0;font-size:15px;color:#2d5a45}
.mgroup-head span{font-size:11px;color:#8b9a90}
.mgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:14px}
.mcard{border:1px solid #e4eae4;border-radius:14px;background:#fff;padding:15px 16px 13px;
  display:flex;flex-direction:column;gap:9px;min-width:0}
.mcard.off{background:#fbfbf9;border-style:dashed}
.mcard-head{display:flex;align-items:center;gap:10px;min-width:0}
.mcard-avatar{width:38px;height:38px;flex:0 0 auto;border-radius:12px;background:#eef2e2;color:#829768;
  display:grid;place-items:center;font-size:18px}
.mcard.off .mcard-avatar{background:#f0f0ea;color:#a3ab9c}
.mcard-id{flex:1;min-width:0}
.mcard-id h3{margin:0;font-size:16px;display:flex;align-items:baseline;gap:6px;min-width:0}
.mcard-id h3 em{font-style:normal;font-size:11px;color:#93a08f;font-weight:400;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mcard-sub{font-size:11px;color:#93a08f;margin-top:3px}
.presence{flex:0 0 auto;font-size:11px;padding:4px 9px;border-radius:12px;white-space:nowrap}
.presence.yes{background:#e8f3e6;color:#2f7d52}
.presence.no{background:#f2f2ee;color:#8d968a}
.mcard-bar{height:6px;border-radius:6px;background:#eef2ea;overflow:hidden}
.mcard-bar span{display:block;height:100%;border-radius:6px;background:#5ea87c}
.mcard-bar span.zero{background:#e6ebe3}
.mcard-line{display:flex;gap:8px;font-size:12px;line-height:1.55;min-width:0}
.mcard-k{flex:0 0 56px;color:#93a08f}
.mcard-v{flex:1;min-width:0;overflow-wrap:anywhere}
.mcard-v.muted{color:#a8b0a4}
.mcard-v em.muted{font-style:normal;color:#a8b0a4}
.mcard-v.clear{color:#80987d}
.mcard-v.unknown{color:#a58a43}
.mcard-v.bad{color:#b35b43}
.mcard-acts{display:flex;gap:8px;margin-top:2px}
.mcard-acts button{flex:1;font-size:12px;padding:8px 6px;border-radius:9px}
.mcard-acts button:disabled{cursor:not-allowed;opacity:.5}

/* 会员管理里的「今日一日流程」状态 */
.dw-ok{color:#2f7d52;font-size:12px}
.dw-todo{color:#b8794a;font-size:12px}

@media(max-width:1100px){
  .mgrid{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}
}
@media(max-width:680px){
  .hstat em{font-size:10px}
  .mgrid{grid-template-columns:1fr}
  .mcard{padding:14px 14px 12px}
  .attn-grid{grid-template-columns:1fr}
  .attn-chip{min-height:34px;padding:6px 12px}
  .mcard-acts button{min-height:44px;font-size:13px}
  .progress-table th,.progress-table td{padding:9px 10px}
}
/* 班级进度整行可点（手机上没有「查看名单」按钮时也能进班级） */
.progress-table tbody tr[data-home-class]{cursor:pointer}
.progress-table tbody tr[data-home-class]:hover td{background:#f7faf5}
@media(max-width:680px){.progress-table th:last-child,.progress-table td:last-child{display:none}}
@media(max-width:680px){
  /* 手机上班级进度表只留：班级 / 今日出勤 / 一日流程 / 喝奶要求，避免横向滑动 */
  .table-scroll .progress-table{min-width:0}
  .progress-table th:nth-child(2),.progress-table td:nth-child(2){display:none}
  .progress-table th,.progress-table td{padding:9px 7px;font-size:12px}
}

/* ========== 往日记录（一日流程保留 15 天） ========== */
.dhist-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.dhist-bar .dhint{flex:1 1 auto;min-width:200px}
.dhist-bar>button{flex:0 0 auto;white-space:nowrap}
.hlist{display:grid;gap:0;margin:12px 0 4px;max-height:52vh;overflow:auto}
.hrow{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 2px;border-bottom:1px solid #eef2ea}
.hrow strong{display:block;font-size:14px;font-variant-numeric:tabular-nums}
.hrow small{display:block;font-size:11px;color:#8b9a90;margin-top:3px}
.hrow .row-actions{flex:0 0 auto}
.hdetail{margin:12px 0 4px;padding:14px 16px;border-radius:10px;background:#f7faf5;border:1px solid #e6ece3;
  font-family:inherit;font-size:13px;line-height:1.85;white-space:pre-wrap;overflow-wrap:anywhere;
  max-height:52vh;overflow:auto;color:#2f4238}
@media(max-width:680px){
  .dhist-bar{gap:8px}
  .dhist-bar>button{min-height:38px;padding:8px 14px}
  .hdetail{font-size:14px;max-height:56vh}
}

/* ========== 班级一日流程模块勾选（2026-10-20） ========== */
.modblock{margin-top:18px}
.modblock-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:9px}
.modblock-head>span{font-size:12px;font-weight:600;color:#3d5445}
.modblock-head small{font-size:11px;color:#93a08f}
.modgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.modcheck{display:flex;align-items:flex-start;gap:8px;border:1px solid #e0e8dd;border-radius:9px;
  padding:9px 10px;background:#fbfdfa;cursor:pointer;min-width:0}
.modcheck:hover{border-color:#b9d3bb;background:#f4f9f1}
.modcheck input{margin:2px 0 0;width:17px;height:17px;flex:0 0 auto;accent-color:#23765d;cursor:pointer}
.modcheck span{min-width:0}
.modcheck b{display:block;font-size:13px;font-weight:600;line-height:1.3}
.modcheck small{display:block;font-size:10px;color:#93a08f;margin-top:2px;line-height:1.45}
.modcheck:has(input:checked){background:#eef6ec;border-color:#9cc0a2}
/* 2026-10-26：一日流程模块顺序可自定义 —— 每行一个模块，右侧 ↑↓ 调顺序、序号表示第几张卡片 */
.modlist{display:flex;flex-direction:column;gap:7px}
.modrow{display:flex;align-items:center;gap:8px}
.modrow .modcheck{flex:1;min-width:0}
.modrow:not(.on) .modcheck{background:#f7f9f5;border-style:dashed}
.modrow-acts{flex:0 0 auto;display:flex;align-items:center;gap:4px}
.modrow-no{font-size:10px;color:#93a08f;min-width:12px;text-align:right;font-variant-numeric:tabular-nums}
.modmove{width:30px;height:30px;padding:0;border-radius:8px;border:1px solid #dbe3da;background:#fff;color:#456b54;font-size:14px;line-height:1;display:grid;place-items:center}
.modmove:hover:not(:disabled){background:#eef6ea;border-color:#a9c9a7}
.modmove:disabled{opacity:.3;cursor:not-allowed}
@media(max-width:520px){.modrow-no{display:none}.modmove{width:34px;height:34px}}
.cl-mods{font-size:11px;color:#7d8d77;margin:6px 0 0;line-height:1.6}
dialog:has(.modblock){width:min(600px,calc(100vw - 24px))}
@media(max-width:520px){
  .modgrid{grid-template-columns:1fr}
  .modcheck{padding:11px 12px}
  .modcheck b{font-size:14px}
  .modcheck small{font-size:11px}
}

/* ========== 一日流程：分钟级时间（时 + 分两个下拉，2026-10-20） ==========
   一个下拉装 1440 个选项在手机上会卡，所以拆成时/分两个；下面这些宽度是按
   「两位数字 + 下拉箭头」算的最小可用值，再窄就点不准了。 */
.dr-time .dr-pair{display:inline-flex;align-items:center;gap:2px}
.dr-time .dr-colon{font-size:12px;line-height:1;color:#8a9a83}
.dr-time .dr-pair select{min-width:0;width:54px;padding:6px 2px;text-align:center;text-align-last:center}
@media(max-width:760px){
  /* 手机上保持 16px 防 iOS 聚焦放大；宽度收回 56px，两个下拉才和一行的其它控件塞得下 */
  .dr-time .dr-pair select{min-width:0;width:56px;padding:10px 2px}
  .dr-time .dr-colon{font-size:14px}
}
/* 大便那行（时间 + 三个方框 + 删除）在窄卡片里会把 × 挤到下一行左侧，孤零零很难看；
   给 × 加 margin-left:auto，换行时它会贴到那一行最右边，看起来是刻意排的 */
.drow-seg .dr-del{margin-left:auto}
.dr-time .dr-pair select{width:50px;padding:6px 1px}

/* ========== 喝奶要求：时间也是「时 + 分」两个下拉（2026-10-20） ========== */
.slot-pair{display:flex;align-items:center;gap:2px;min-width:0;flex:1 1 auto}
.slot-pair select{flex:1 1 0;width:auto;min-width:0;padding:8px 2px;text-align:center;text-align-last:center}
.slot-colon{flex:0 0 auto;font-size:11px;color:#84928b;line-height:1}
@media(max-width:680px){
  /* 手机上全局把控件字号顶到 16px，而 .slot-field select 的 height 还是 34px，
     16px 的字会被上下切掉（旧版单个时间下拉也有这个问题），这里一并给足高度 */
  .slot-field select{height:46px}
  .slot-pair select{height:46px;padding:8px 4px;line-height:1.15}
  .slot-colon{font-size:13px}
}

/* ========== 一日流程：大便改成「每天单选」，放在表单最下面（2026-10-20） ========== */
.dcard-single{grid-column:1/-1}
.drow-single{margin-top:2px}
.dr-seg-single{display:flex;flex-wrap:wrap;gap:8px}
.dr-seg-single .seg{font-size:14px;padding:9px 22px;border-radius:20px;min-width:78px;text-align:center}
@media(max-width:760px){
  /* 手机上选项排成一行等宽，手指好点；几个选项就分几列（--segs 由表单按分区给出） */
  .dr-seg-single{display:grid;grid-template-columns:repeat(var(--segs,4),minmax(0,1fr));gap:7px}
  .dr-seg-single .seg{min-width:0;padding:13px 2px;font-size:15px;border-radius:12px}
  /* 文字长的（社交表现的五种类型）两列一行，挤成五列会看不清 */
  .dr-seg-single.seg-wide{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dr-seg-single.seg-wide .seg{font-size:14px;padding:11px 4px}
}
/* 「现在」和「×」绑成一组：窄卡片里宁可整组换行，也不要 × 孤零零掉到下一行左侧 */
.dr-acts{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto}
/* 「更换尿不湿」卡片底部的大便形态行：左侧小标签 + 右侧四个方框 */
.drow-inline{margin-top:10px;padding-top:10px;border-top:1px dashed #e1e7dc;align-items:center;gap:10px}
.dr-sub{flex:0 0 auto;font-size:11px;color:#7d8d77;white-space:nowrap}
.dr-seg-single{flex:1 1 auto}

/* ========== 体温定时提醒（2026-10-21）==========
   两处界面：①班级编辑里的「体温提醒」配置行 ②到点的全屏弹窗。
   弹窗用 <dialog> 放进 top layer，所以老师正开着填写表单时也能盖到最上面。
   声音由 public/reminder.js 用 Web Audio 现场合成，不加载音频文件。 */
/* 顶栏的「开启声音」按钮：iOS 必须先有一次用户点击才允许播放 */
.header-right button.bell{font-size:14px;line-height:1;padding:0 8px;min-width:36px}
.header-right button.bell.ready{background:#e6f5ee;border-color:#9cc9b0;color:#1b6d4c}
/* 班级编辑：没勾「体温」模块时整块变灰（可编辑，只是提示不生效） */
.modblock.off{opacity:.5}
.remind-row{display:grid;grid-template-columns:20px 104px minmax(0,1fr) 24px;gap:8px;align-items:center;background:#f2f6ee;padding:8px;border-radius:8px;margin-bottom:8px}
.remind-no{font-size:11px;color:#8a9a86;text-align:center}
.remind-row .slot-pair select{height:34px;padding:6px 2px}
.remind-text{width:100%;min-width:0;height:34px;font-size:12px;padding:8px}
#addRemind{width:100%;border-style:dashed;color:#347855;font-size:12px;margin:2px 0 6px}
/* 一日流程的体温卡片上标一下这个班设了哪些提醒时间 */
.dremind{display:flex;align-items:center;gap:6px;flex-wrap:wrap;background:#fdf7e6;border:1px solid #f0dfb4;border-radius:8px;padding:6px 9px;margin:0 0 9px;font-size:11px;color:#8a6d2b;line-height:1.5}
.dremind-label{font-weight:600;white-space:nowrap}
.dremind b{background:#fff;border-radius:5px;padding:1px 6px;font-size:11px;font-variant-numeric:tabular-nums;color:#8a6d2b;font-weight:600}
.dremind small{margin-left:auto;color:#b09a68;font-size:10px;white-space:nowrap}
/* ---------- 到点弹窗 ---------- */
#tempRemindOverlay{border:0;padding:0;margin:0;background:transparent;width:100%;max-width:100vw;height:100%;max-height:100vh;overflow:auto;align-items:center;justify-content:center}
#tempRemindOverlay[open]{display:flex;position:fixed;inset:0}
#tempRemindOverlay:not([open]){display:none}
#tempRemindOverlay::backdrop{background:rgba(12,40,32,.74);backdrop-filter:blur(6px)}
/* 老内核没有 <dialog>，退回普通遮罩层 */
#tempRemindOverlay.legacy-on{display:flex;position:fixed;inset:0;z-index:9999;background:rgba(12,40,32,.74)}
.remind-card{width:100%;max-width:520px;margin:18px;background:#fff;border-radius:22px;text-align:center;box-shadow:0 30px 80px rgba(0,0,0,.4);padding:30px 26px calc(24px + env(safe-area-inset-bottom));animation:remindPop .26s cubic-bezier(.2,1.3,.5,1)}
@keyframes remindPop{from{transform:scale(.92) translateY(14px);opacity:0}to{transform:none;opacity:1}}
.remind-bell{width:96px;height:96px;margin:0 auto 16px;border-radius:50%;background:radial-gradient(circle at 50% 40%,#fff4d6,#ffe3a3);display:flex;align-items:center;justify-content:center;font-size:46px;animation:remindRing 1.6s ease-out infinite}
@keyframes remindRing{0%{box-shadow:0 0 0 0 rgba(240,180,42,.5);transform:rotate(0)}10%{transform:rotate(-9deg)}20%{transform:rotate(9deg)}30%{transform:rotate(-6deg)}40%{transform:rotate(4deg)}50%{transform:rotate(0);box-shadow:0 0 0 24px rgba(240,180,42,0)}100%{box-shadow:0 0 0 0 rgba(240,180,42,0)}}
.remind-time{font-size:15px;font-weight:700;color:#a08035;letter-spacing:1px;font-variant-numeric:tabular-nums}
.remind-card h3{margin:6px 0 6px;font-size:30px;line-height:1.28;font-weight:700;color:#12312a}
.remind-sub{margin:0;font-size:13px;color:#7b918a}
.remind-acts{display:flex;gap:11px;margin-top:24px}
.remind-acts button{flex:1;min-height:54px;border-radius:13px;border:0;font-size:16px;font-weight:600;cursor:pointer;font-family:inherit}
.remind-acts .snooze{background:#f0f5f2;color:#3c5a50}
.remind-acts .ok{background:#23765d;color:#fff}
.remind-acts .ok:active{background:#175343}
.remind-hint{display:none;margin:14px 0 0;font-size:12px;color:#c0392b;background:#fdf0ee;border-radius:9px;padding:9px;line-height:1.6}
.remind-hint.on{display:block}
.remind-rounds{margin:10px 0 0;font-size:11px;color:#a9bbb4;min-height:1em}
@media(max-width:420px){
  .remind-card{padding:24px 18px calc(18px + env(safe-area-inset-bottom))}
  .remind-bell{width:82px;height:82px;font-size:40px;margin-bottom:12px}
  .remind-card h3{font-size:26px}
  .remind-acts button{min-height:50px;font-size:15px}
  .remind-row{grid-template-columns:16px 84px minmax(0,1fr) 22px;gap:6px;padding:7px}
}

/* ========== 更换尿不湿：每行带大便形态（2026-10-21） ==========
   行里多了四个单选，1/3 栏放不下，所以这张卡片横跨整行；手机上本来就是单列，无影响。 */
.dcard-wide{grid-column:1/-1}
.dcard-diaperChange .drow-seg-opts{min-width:0}
/* 旧版「全天大便形态」的提示，只在当天还有旧数据时出现 */
.dlegacy{margin:8px 0 0;padding:7px 9px;border-radius:8px;background:#fdf7e6;border:1px solid #f0dfb4;color:#8a6d2b;font-size:11px;line-height:1.6}

/* ========== 喝水：08:00~19:00 每半小时的时段下拉（2026-10-21） ==========
   一行一次喝水，时间那格是一个下拉，选项就是 08:00~08:30 这类半小时时段。 */
.drow-slot .dr-time{flex:1 1 auto;min-width:0}
.dr-slot{flex:1 1 auto;min-width:0;width:100%;height:36px;font-size:12.5px;font-family:inherit;font-variant-numeric:tabular-nums;padding:6px 6px;border:1px solid #d7e2d5;border-radius:8px;background:#fff;color:#3c5448;cursor:pointer;appearance:none;-webkit-appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,#8aa39a 50%),linear-gradient(135deg,#8aa39a 50%,transparent 50%);
  background-position:calc(100% - 13px) 16px,calc(100% - 8px) 16px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:24px}
.dr-slot:focus{outline:2px solid #a9cfb6;outline-offset:1px}
@media(max-width:680px){
  .dr-slot{height:44px;font-size:15px;padding:8px 28px 8px 8px;background-position:calc(100% - 14px) 20px,calc(100% - 9px) 20px}
}

/* 大屏摘要里的「午睡异常」标记（2026-10-21）：正常时按普通标签显示，报过异常就红底顶到最前 */
.brief-tags i.bad{background:#c0452e;color:#fff}

/* 一日流程表单里的「午睡点检」只读块（2026-10-21）：记录靠碰 NFC 标签，表单只展示 */
.dcard-napcheck{background:#fbfaf4;border-color:#ece4c9}
.napcheck-line{margin:0 0 9px;font-size:12.5px;color:#6b6047;line-height:1.6}
.napcheck-line b{color:#3f3a28}
.napcheck-line b.ncbad{color:#c0452e}
.napcheck-list{display:flex;flex-wrap:wrap;gap:5px}
.napcheck-list span{font-size:11px;padding:2px 8px;border-radius:7px;background:#f2eee0;color:#7a6f52;font-variant-numeric:tabular-nums}
.napcheck-list span.bad{background:#fbe6e0;color:#b03a24;font-weight:600}

/* ========== 主页：喝奶要求降为次要信息（2026-10-21） ==========
   喝奶已经不是每天的主流程，卡片上只在真的配了要求时才显示一行淡色小字；
   编辑入口退成次要按钮，视觉上不跟「一日流程」抢位置。 */
.mcard-plan .mcard-k{color:#b3bdb0}
.mcard-plan .mcard-v{color:#8d9b89}
.mcard-acts button.ghost{flex:0 0 auto;padding:8px 10px;background:transparent;border-color:transparent;color:#a6b0a3}
.mcard-acts button.ghost:hover{background:#f2f6ef;border-color:#dde7d8;color:#5d7a63}

/* ========== 5S 点检（2026-10-23） ==========
   主页汇总块 + 「5S 点检」整页 + 区域/周期弹窗。
   记录与照片走 /api/5s/*，不进状态包；配色沿用主系统的绿灰，
   只有「待整改」用红、「逾期」用橙，跟过敏/关注的配色规则保持一致。 */
.fs-panel{margin-bottom:18px}
.stats.fs-stats{grid-template-columns:repeat(5,minmax(0,1fr))}
.fs-panel .empty{padding:28px;background:transparent}
.fs-now{font-size:11px;color:#93a08f;font-variant-numeric:tabular-nums;align-self:center}

/* —— 主页汇总 —— */
.fs-sum{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.fs-sum-i small{display:block;font-size:11px;color:#8b9a90;margin-bottom:4px}
.fs-sum-i b{font-size:26px;font-weight:500;color:#2c5343;letter-spacing:-.5px}
.fs-sum-i span{font-size:11px;color:#9aa79c;margin-left:5px}
.fs-sum-i.bad b{color:#b3553f}
.fs-sum-i.warn b{color:#b8794a}
.fs-sum-acts{margin-left:auto}
.fs-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:14px}
.fs-chip{font-size:11px;padding:5px 10px;border-radius:20px;background:#fdf0e8;color:#b0673f;border:1px solid #f2ddce}
.fs-mini-list{display:grid;gap:8px;margin-top:14px}
.fs-mini{display:flex;align-items:center;gap:10px;text-align:left;width:100%;padding:7px;border-radius:11px;border:1px solid #f0e2da;background:#fdf8f5}
.fs-mini:hover{background:#fbf1ea;border-color:#e8cfc0}
.fs-mini img{width:42px;height:42px;border-radius:8px;object-fit:cover;flex:none;background:#eee}
.fs-mini-no{width:42px;height:42px;border-radius:8px;background:#f7e2d8;color:#b0673f;display:grid;place-items:center;font-size:18px;flex:none}
.fs-mini-body{min-width:0;display:block}
.fs-mini-body b{display:block;font-size:13px;color:#33513f;font-weight:600}
.fs-mini-body small{display:block;font-size:11px;color:#94a08f;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fs-mini-day{margin-left:auto;font-size:11px;color:#b0673f;white-space:nowrap;padding-right:4px}

/* —— 待整改问题卡片 —— */
.fsi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}
.fs-issue{border:1px solid #f0ddd4;border-radius:13px;background:#fffdfc;padding:16px;display:flex;flex-direction:column;gap:9px}
.fsi-head{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.fsi-head strong{font-size:14px;color:#8f3f2a}
.fsi-head span{font-size:11px;color:#a99288}
.fsi-note{margin:0;font-size:13px;line-height:1.7;color:#4b5b4c;white-space:pre-wrap;overflow-wrap:anywhere}
.fsi-photos{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
.fsi-photos.done{border-top:1px dashed #dfe9d8;padding-top:9px}
.fsi-tag{font-size:10px;color:#4f7d5f;background:#eef5e8;border-radius:5px;padding:3px 7px}
.fs-thumb{width:64px;height:64px;padding:0;border:1px solid #e6e0d8;border-radius:9px;overflow:hidden;background:#f4f4f0;display:block;flex:none}
.fs-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.fs-thumb.sm{width:38px;height:38px;border-radius:6px}
.fs-thumbs{display:flex;gap:4px;flex-wrap:wrap}
.fsi-rounds{background:#fbf6f2;border-radius:8px;padding:8px 10px}
.fs-round{font-size:11px;color:#a07b66;line-height:1.7}
.fsi-acts{display:flex;gap:8px;margin-top:2px}
.fs-review{background:#fdf8f5;border:1px solid #f0e0d6;border-radius:11px;padding:13px;margin-bottom:6px;display:grid;gap:8px}
.fs-label{display:block;font-size:12px;margin:16px 0 7px;color:#3d5445}
.fs-label em{font-style:normal;color:#a68a72;font-size:11px;margin-left:6px}

/* —— 区域状态表 —— */
.fs-only-desktop{display:block}
.fs-cards{display:none}
.fs-table{font-size:12px}
.fs-table td{vertical-align:middle}
/* 操作列不要竖着堆三个按钮：按钮横排会让整行矮一半，表格本来就能横向滚动 */
.fs-table .row-actions{flex-wrap:nowrap;gap:5px}
.fs-table th{padding:11px 10px}
.fs-table td{padding:10px}
.fs-site-cell strong{display:block;font-size:13px;color:#2f4a3c}
.fs-site-cell small{display:block;font-size:10px;color:#9aa79c;margin-top:3px}
.fs-cyc{font-size:11px;color:#5c7358;white-space:nowrap}
.fs-cyc small{display:block;font-size:10px;color:#a6b2a3;margin-top:2px}
.fs-slots-cell{min-width:180px}
.fs-slot{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:3px 8px;border-radius:20px;margin:2px 3px 2px 0;background:#f2f5ee;color:#7b8d78;border:1px solid #e4eadf;font-variant-numeric:tabular-nums}
.fs-slot i{width:6px;height:6px;border-radius:50%;background:#c8d2c3;display:block}
.fs-slot.done{background:#e8f4e6;color:#2f7350;border-color:#cbe5c6}
.fs-slot.done i{background:#3f9a68}
.fs-slot.overdue{background:#fdeee6;color:#b3553f;border-color:#f4d8c9}
.fs-slot.overdue i{background:#d9664a}
.fs-slot.todo{background:#f4f6f0;color:#86977f}
.fs-slot.rest,.fs-slot.off{background:#f5f5f2;color:#a3ada0;border-color:#eaeae4}
.fs-zone{font-size:11px;padding:3px 8px;border-radius:5px;background:#eef3e7;color:#5c7c58}
.fs-badge{display:inline-block;font-size:11px;padding:3px 8px;border-radius:5px;background:#f2f4ef;color:#8a9985;white-space:nowrap}
.fs-badge.bad{background:#fdeae3;color:#b3553f;font-weight:600}
.fs-badge.ok{background:#eaf4e5;color:#377650}
.fs-last{font-size:11px;color:#66795f;white-space:nowrap}
.fs-last small{display:block;font-size:10px;color:#a3afa0;margin-top:2px}
.fs-rec-table td{font-size:11px}
.fs-rec-time{font-variant-numeric:tabular-nums;white-space:nowrap}
.fs-rec-time small{display:block;color:#a3afa0}

/* —— 标签管理 —— */
.fs-tag-acts{margin:6px 0 14px;flex-wrap:wrap}
.fs-tag-acts button{flex:0 0 auto}
.fs-tag-list{display:grid;gap:6px}
.fs-tag-row{display:flex;align-items:center;gap:10px;padding:9px 11px;border:1px solid var(--line);border-radius:9px;background:#fafbf8;flex-wrap:wrap}
.fs-tag-name{font-size:12px;font-weight:600;color:#33513f;min-width:96px}
.fs-tag-url{font-size:11px;color:#6f8a74;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;max-width:340px;white-space:nowrap}
.fs-tag-url.none{color:#b0b8ab}
.fs-tag-row button{margin-left:0}
.fs-tag-row button[data-fs-remake]{margin-left:auto}

/* —— 周期 / 区域表单 —— */
.fs-two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.fs-cycle{background:#f6f8f2;border-radius:10px;padding:12px;margin-top:8px}
.fs-cycle-type{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.fs-cycle-type>select{font-size:12px;padding:8px 10px}
.fs-wd{display:none;gap:6px;flex-wrap:wrap}
.fs-wd label{font-size:11px;background:#fff;border:1px solid var(--line);border-radius:6px;padding:5px 8px;display:inline-flex;align-items:center;gap:4px;cursor:pointer}
.fs-days{display:none;width:170px;font-size:12px}
.fs-time-row{display:flex;align-items:center;gap:5px;margin-bottom:7px;max-width:220px}
.fs-time-row select{flex:1 1 0;min-width:0;padding:8px 2px;text-align:center;text-align-last:center;font-size:12px}
.fs-check-row{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.fs-check-input{flex:1;min-width:0;font-size:12px;padding:9px 10px}
.fs-no{width:20px;height:20px;border-radius:50%;background:#eef3e9;color:#6d8464;font-size:10px;display:grid;place-items:center;flex:none}
.fs-radio{display:flex;align-items:center;gap:7px;font-size:12px;color:#3d5445;margin:9px 0;cursor:pointer}
.fs-radio input{width:16px;height:16px;accent-color:#23765d;margin:0}
#fsAddTime,#fsAddCheck{border-style:dashed;color:#347855;font-size:12px;width:100%;margin-top:4px}
#fsOwnBox{margin-top:6px}

/* —— 复查弹窗照片 —— */
.fs-shots{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:8px}
.fs-shot{width:76px;height:76px;border-radius:10px;overflow:hidden;position:relative;flex:none;border:1px solid #e4ddd4}
.fs-shot img{width:100%;height:100%;object-fit:cover;display:block}
.fs-shot button{position:absolute;right:0;top:0;width:22px;height:22px;padding:0;border:0;border-radius:0 0 0 8px;background:rgba(0,0,0,.6);color:#fff;font-size:13px;line-height:1}
.fs-bigphoto img{width:100%;border-radius:10px;display:block}
.fs-bigphoto{margin:12px 0}

@media(max-width:680px){
  .stats.fs-stats{grid-template-columns:repeat(2,1fr)}
  /* 手机上用卡片替代宽表（卡片由 five.js 另外渲染一份，这里只负责切换） */
  .fs-only-desktop{display:none}
  .fs-cards{display:grid}
  .fs-sum{gap:16px}
  .fs-sum-i b{font-size:23px}
  .fs-sum-acts{margin-left:0;width:100%}
  .fs-sum-acts button{width:100%}
  .fsi-grid{grid-template-columns:1fr}
  .fs-two{grid-template-columns:1fr;gap:0}
  .fs-tag-row{gap:7px}
  .fs-tag-url{max-width:100%;flex:1 1 100%;order:3}
  .fs-tag-row button[data-fs-remake]{margin-left:0}
  nav button{padding:5px 3px}
  nav button span{font-size:9px;white-space:nowrap}
}

/* 手机上的区域卡片（桌面用表格，≤680px 换成这份） */
.fsc{display:grid;gap:7px;padding:13px 0;border-bottom:1px solid var(--line)}
.fsc:last-child{border-bottom:0}
.fsc-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.fsc-head strong{font-size:15px;color:#2f4a3c;display:block}
.fsc-head small{display:block;font-size:11px;color:#9aa79c;margin-top:2px}
.fsc-slots{display:flex;flex-wrap:wrap;gap:0}
.fsc-meta{font-size:11px;color:#8ea08a}
.fsc-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.fsc-foot>span{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.fsc-foot .row-actions{gap:6px}
.fsc.overdue .fsc-head strong{color:#a2503a}

/* 手机上的区域卡片（桌面用表格，≤680px 换成这份） */
.fsc{display:grid;gap:7px;padding:13px 0;border-bottom:1px solid var(--line)}
.fsc:last-child{border-bottom:0}
.fsc-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.fsc-head strong{font-size:15px;color:#2f4a3c;display:block}
.fsc-head small{display:block;font-size:11px;color:#9aa79c;margin-top:2px}
.fsc-slots{display:flex;flex-wrap:wrap;gap:0}
.fsc-meta{font-size:11px;color:#8ea08a}
.fsc-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.fsc-foot>span{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.fsc-foot .row-actions{gap:6px}
.fsc.overdue .fsc-head strong{color:#a2503a}

/* ========== 客户声音 VOC（2026-10-23） ==========
   主页汇总块 + 「客户声音」整页 + 详情弹窗 + 二维码台卡。
   记录与照片走 /api/voc*，不进状态包；配色跟主系统一致，
   只有「待处理」用红、「处理中」用橙，表扬/建议用绿与灰蓝。 */

/* —— 主页汇总 —— */
.voc-panel{margin-bottom:18px}
.voc-sum{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.voc-sum-i small{display:block;font-size:11px;color:#8b9a90;margin-bottom:4px}
.voc-sum-i b{font-size:26px;font-weight:500;color:#2c5343;letter-spacing:-.5px}
.voc-sum-i span{font-size:11px;color:#9aa79c;margin-left:5px}
.voc-sum-i.bad b{color:#b3553f}
.voc-sum-acts{margin-left:auto}
.voc-mini-list{display:grid;gap:8px;margin-top:14px}
.voc-mini{display:flex;align-items:center;gap:10px;text-align:left;width:100%;padding:9px 11px;border-radius:11px;border:1px solid #eceee6;background:#fbfbf8}
.voc-mini:hover{background:#f7f8f3;border-color:#dfe5d8}
.voc-mini-body{min-width:0;display:block}
.voc-mini-body b{display:block;font-size:13px;color:#33513f;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.voc-mini-body small{display:block;font-size:11px;color:#9aa79c;margin-top:2px}

/* —— 类型 / 状态标签 —— */
.voc-type{display:inline-block;font-size:11px;padding:3px 9px;border-radius:6px;font-weight:600;white-space:nowrap}
.voc-type.good{background:#e9f4e6;color:#377650}
.voc-type.suggest{background:#eaf0f4;color:#4e6c80}
.voc-type.bad{background:#fdeae3;color:#b3553f}
.voc-type.ask{background:#f8f1e1;color:#9a7c3c}
.voc-badge{display:inline-block;font-size:11px;padding:3px 9px;border-radius:5px;white-space:nowrap}
.voc-badge.new{background:#fdeae3;color:#b3553f;font-weight:600}
.voc-badge.doing{background:#fdf3e2;color:#a1793d}
.voc-badge.done{background:#eaf4e5;color:#377650}
.voc-badge.spam{background:#f2f2ef;color:#98a094}

/* —— 整页 —— */
.stats.voc-stats{grid-template-columns:repeat(5,minmax(0,1fr))}
.voc-toolbar{margin-top:2px}
.voc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}
.voc-card{background:#fff;border:1px solid var(--line);border-radius:13px;padding:15px 16px;display:flex;flex-direction:column;gap:9px}
.voc-card.new{border-color:#f1d9cd;background:#fffdfc}
.voc-card-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.voc-about{font-size:11px;color:#6b7f72;background:#f2f5ee;border-radius:5px;padding:3px 7px}
.voc-when{font-size:11px;color:#9aa79c;margin-left:auto;font-variant-numeric:tabular-nums}
.voc-code{font-size:10px;color:#b3bcb0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.voc-text{margin:0;font-size:13px;line-height:1.75;color:#3e5245;white-space:pre-wrap;overflow-wrap:anywhere}
.voc-card-body{display:flex;gap:11px;align-items:flex-start}
.voc-card-body .voc-text{flex:1;min-width:0}
.voc-thumb{width:58px;height:58px;border-radius:9px;object-fit:cover;flex:none;background:#f1f1ec;border:1px solid #eae6dd}
.voc-card-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11px;color:#93a08f}
.voc-star{color:#c79a52;letter-spacing:1px;font-size:12px}
.voc-has-phone{color:#4f7d5f;background:#eef5e8;border-radius:4px;padding:2px 6px}
.voc-card-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:2px;padding-top:9px;border-top:1px dashed #eceee6}
.voc-card-foot button{margin-left:auto}

/* —— 二维码台卡 —— */
.voc-qr-panel{margin-top:20px}
.voc-qr-wrap{display:flex;gap:24px;align-items:center;flex-wrap:wrap}
.voc-qr{flex:none;width:162px;height:162px;display:grid;place-items:center;background:#fff;border:1px solid var(--line);border-radius:12px;padding:11px}
.voc-qr svg{display:block;width:138px;height:138px}
.voc-qr-body{flex:1;min-width:240px}
.voc-qr-body p{margin:0 0 10px}
.voc-url{display:block;font-size:11px;color:#5d7a66;background:#f5f8f2;border:1px solid #e7ece2;border-radius:7px;padding:9px 11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow-wrap:anywhere}
.voc-qr-acts{margin:11px 0 4px;flex-wrap:wrap}
.voc-qr-body .hint{margin:8px 0 0}

/* —— 详情弹窗 —— */
.voc-detail{border:1px solid #eceee6;border-radius:12px;padding:14px;background:#fbfbf8;margin-bottom:6px}
.voc-detail .voc-card-top{margin-bottom:9px}
.voc-detail-star{font-size:12px;color:#8b9a90;margin-bottom:8px}
.voc-detail-star b{color:#c79a52;letter-spacing:2px;font-size:14px;margin-left:5px}
.voc-detail-text{margin:0;font-size:14px;line-height:1.85;color:#33473a;white-space:pre-wrap;overflow-wrap:anywhere}
.voc-photos{display:flex;gap:8px;flex-wrap:wrap;margin-top:11px}
.voc-shot{width:72px;height:72px;padding:0;border:1px solid #e6e0d8;border-radius:9px;overflow:hidden;background:#f4f4f0;flex:none}
.voc-shot img{width:100%;height:100%;object-fit:cover;display:block}
.voc-contact{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:12px;color:#4b5f51;margin-top:12px;padding-top:11px;border-top:1px dashed #e4e7dd}
.voc-tel{color:#23765d;font-weight:600;font-variant-numeric:tabular-nums;text-decoration:none;border-bottom:1px dashed #a9c9b5}
.voc-replied{background:#eef5e8;border-radius:9px;padding:10px 12px;margin-top:11px}
.voc-replied b,.voc-notes>b{display:block;font-size:11px;color:#4f7d5f;margin-bottom:5px}
.voc-replied p{margin:0;font-size:12.5px;line-height:1.75;color:#3d5445;white-space:pre-wrap}
.voc-replied small{display:block;font-size:10px;color:#8ea48c;margin-top:6px}
.voc-notes{margin-top:11px}
.voc-note{font-size:11.5px;color:#7c8b78;line-height:1.7;padding:5px 0;border-bottom:1px dotted #e4e7dd}
.voc-note span{color:#a2aea0;margin-right:8px;font-variant-numeric:tabular-nums}
.voc-acts{flex-wrap:wrap}
.voc-acts button{flex:1 1 auto;min-width:96px}
.voc-bigphoto img{width:100%;border-radius:10px;display:block}

@media(max-width:680px){
  .stats.voc-stats{grid-template-columns:repeat(2,1fr)}
  .voc-sum{gap:16px}
  .voc-sum-i b{font-size:23px}
  .voc-sum-acts{margin-left:0;width:100%}
  .voc-sum-acts button{width:100%}
  .voc-grid{grid-template-columns:1fr}
  /* 手机上二维码和说明上下排：横排会把说明挤成一条窄缝 */
  .voc-qr-wrap{gap:14px;flex-direction:column;align-items:stretch}
  .voc-qr{width:200px;height:200px;margin:0 auto}
  .voc-qr svg{width:184px;height:184px}
  .voc-qr-body{min-width:0}
  /* 手机上详情弹窗很长，把处理按钮吸在底部，一排三个（竖排会挡住半屏内容） */
  .voc-acts{position:sticky;bottom:-22px;background:#fff;border-top:1px solid #eef0e9;padding:10px 0 4px;margin-top:14px;flex-wrap:nowrap;gap:6px;box-shadow:0 -8px 14px -10px rgba(0,0,0,.28)}
  .voc-acts button{flex:1 1 auto;min-width:0;font-size:12px;padding:10px 6px;white-space:nowrap}
}

/* ========== 员工之声 VOE（2026-10-23） ==========
   主页汇总块 + 「员工之声」整页 + 详情弹窗 + NFC 点位管理。
   记录与照片走 /api/voe*，不进状态包；点位配置在 app_state.voe。
   配色跟主系统一致，「待回应」用红、「跟进中」用橙、「已采纳」用深绿。 */

/* —— 主页汇总 —— */
.voe-panel{margin-bottom:18px}
.voe-sum{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.voe-sum-i small{display:block;font-size:11px;color:#8b9a90;margin-bottom:4px}
.voe-sum-i b{font-size:26px;font-weight:500;color:#2c5343;letter-spacing:-.5px}
.voe-sum-i span{font-size:11px;color:#9aa79c;margin-left:5px}
.voe-sum-i.bad b{color:#b3553f}
.voe-sum-acts{margin-left:auto}
.voe-mini-list{display:grid;gap:8px;margin-top:14px}
.voe-mini{display:flex;align-items:center;gap:10px;text-align:left;width:100%;padding:9px 11px;border-radius:11px;border:1px solid #eceee6;background:#fbfbf8}
.voe-mini:hover{background:#f7f8f3;border-color:#dfe5d8}
.voe-mini-body{min-width:0;display:block}
.voe-mini-body b{display:block;font-size:13px;color:#33513f;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.voe-mini-body small{display:block;font-size:11px;color:#9aa79c;margin-top:2px}

/* —— 类型 / 状态标签 —— */
.voe-kind{display:inline-block;font-size:11px;padding:3px 9px;border-radius:6px;font-weight:600;white-space:nowrap}
.voe-kind.issue{background:#fdeae3;color:#b3553f}
.voe-kind.idea{background:#e9f1f5;color:#3f6f86}
.voe-kind.need{background:#fbf1dc;color:#93762f}
.voe-kind.praise{background:#e9f4e6;color:#377650}
.voe-badge{display:inline-block;font-size:11px;padding:3px 9px;border-radius:5px;white-space:nowrap}
.voe-badge.new{background:#fdeae3;color:#b3553f;font-weight:600}
.voe-badge.doing{background:#fdf3e2;color:#a1793d}
.voe-badge.done{background:#eaf4e5;color:#377650}
.voe-badge.adopt{background:#dcefe1;color:#1d6b52;font-weight:600}
.voe-badge.spam{background:#f2f2ef;color:#98a094}

/* —— 整页 —— */
.stats.voe-stats{grid-template-columns:repeat(5,minmax(0,1fr))}
.voe-toolbar{margin-top:2px}
.voe-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}
.voe-card{background:#fff;border:1px solid var(--line);border-radius:13px;padding:15px 16px;display:flex;flex-direction:column;gap:9px}
.voe-card.new{border-color:#f1d9cd;background:#fffdfc}
.voe-card.adopt{border-color:#cfe3d4;background:#fcfefc}
.voe-card-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.voe-dept{font-size:11px;color:#6b7f72;background:#f2f5ee;border-radius:5px;padding:3px 7px}
.voe-when{font-size:11px;color:#9aa79c;margin-left:auto;font-variant-numeric:tabular-nums}
.voe-code{font-size:10px;color:#b3bcb0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.voe-text{margin:0;font-size:13px;line-height:1.75;color:#3e5245;white-space:pre-wrap;overflow-wrap:anywhere}
.voe-sug{margin:0;font-size:12px;line-height:1.7;color:#556b58;background:#f6f8f2;border-left:2px solid #cfdccb;border-radius:0 6px 6px 0;padding:7px 10px;overflow-wrap:anywhere}
.voe-sug b{display:inline-block;font-size:10px;color:#5d7f63;margin-right:6px}
.voe-card-body{display:flex;gap:11px;align-items:flex-start}
.voe-card-body .voe-text{flex:1;min-width:0}
.voe-thumb{width:58px;height:58px;border-radius:9px;object-fit:cover;flex:none;background:#f1f1ec;border:1px solid #eae6dd}
.voe-card-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11px;color:#93a08f}
.voe-has-contact{color:#4f7d5f;background:#eef5e8;border-radius:4px;padding:2px 6px}
.voe-pub{color:#377650;background:#e2f0e5;border-radius:4px;padding:2px 6px}
.voe-card-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:2px;padding-top:9px;border-top:1px dashed #eceee6}
.voe-card-foot button{margin-left:auto}

/* —— NFC 点位 —— */
.voe-point-panel{margin-top:20px}
.voe-point-acts-bar{flex-wrap:wrap;margin:6px 0 14px}
.voe-point-acts-bar button{flex:0 0 auto}
.voe-point-list{display:grid;gap:6px}
.voe-point-row{display:flex;align-items:center;gap:10px;padding:9px 11px;border:1px solid var(--line);border-radius:9px;background:#fafbf8;flex-wrap:wrap}
.voe-point-name{font-size:12px;font-weight:600;color:#33513f;min-width:96px}
.voe-point-name small{display:block;font-size:10px;color:#a6b2a3;font-weight:400;margin-top:2px}
.voe-tag-url{font-size:11px;color:#6f8a74;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden;text-overflow:ellipsis;max-width:340px;white-space:nowrap}
.voe-tag-url.none{color:#b0b8ab}
.voe-point-acts{display:flex;gap:5px;flex-wrap:wrap;margin-left:auto}

/* —— 二维码 —— */
.voe-qr-wrap{display:flex;gap:22px;align-items:center;flex-wrap:wrap;margin-bottom:6px}
.voe-qr{flex:none;width:162px;height:162px;display:grid;place-items:center;background:#fff;border:1px solid var(--line);border-radius:12px;padding:11px}
.voe-qr svg{display:block;width:138px;height:138px}
.voe-qr-body{flex:1;min-width:230px}
/* 弹窗比整页窄，二维码挤在左边会把说明压成一条窄缝，改成上下排 */
#modal .voe-qr-wrap{flex-direction:column;align-items:stretch;gap:14px}
#modal .voe-qr{width:190px;height:190px;margin:0 auto}
.voe-qr-body p{margin:0 0 10px}
.voe-url{display:block;font-size:11px;color:#5d7a66;background:#f5f8f2;border:1px solid #e7ece2;border-radius:7px;padding:9px 11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;overflow-wrap:anywhere}

/* —— 详情弹窗 —— */
.voe-detail{border:1px solid #eceee6;border-radius:12px;padding:14px;background:#fbfbf8;margin-bottom:6px}
.voe-detail .voe-card-top{margin-bottom:9px}
.voe-detail-text{margin:0;font-size:14px;line-height:1.85;color:#33473a;white-space:pre-wrap;overflow-wrap:anywhere}
.voe-detail-sug{background:#f2f6ef;border-radius:9px;padding:11px 13px;margin-top:12px}
.voe-detail-sug b{display:block;font-size:11px;color:#4f7d5f;margin-bottom:5px}
.voe-detail-sug p{margin:0;font-size:13px;line-height:1.8;color:#3d5445;white-space:pre-wrap;overflow-wrap:anywhere}
.voe-photos{display:flex;gap:8px;flex-wrap:wrap;margin-top:11px}
.voe-shot{width:72px;height:72px;padding:0;border:1px solid #e6e0d8;border-radius:9px;overflow:hidden;background:#f4f4f0;flex:none}
.voe-shot img{width:100%;height:100%;object-fit:cover;display:block}
.voe-contact{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:12px;color:#4b5f51;margin-top:12px;padding-top:11px;border-top:1px dashed #e4e7dd}
.voe-tel{color:#23765d;font-weight:600;font-variant-numeric:tabular-nums}
.voe-notes{margin-top:11px}
.voe-notes>b{display:block;font-size:11px;color:#4f7d5f;margin-bottom:5px}
.voe-note{font-size:11.5px;color:#7c8b78;line-height:1.7;padding:5px 0;border-bottom:1px dotted #e4e7dd}
.voe-note span{color:#a2aea0;margin-right:8px;font-variant-numeric:tabular-nums}
.voe-radio{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:#3d5445;margin:12px 0 4px;cursor:pointer;line-height:1.6}
.voe-radio input{width:16px;height:16px;accent-color:#23765d;margin:1px 0 0;flex:none}
.voe-acts{flex-wrap:wrap}
.voe-acts button{flex:1 1 auto;min-width:96px}
.voe-bigphoto img{width:100%;border-radius:10px;display:block}
.voe-bigphoto{margin:12px 0}

@media(max-width:680px){
  .stats.voe-stats{grid-template-columns:repeat(2,1fr)}
  .voe-sum{gap:16px}
  .voe-sum-i b{font-size:23px}
  .voe-sum-acts{margin-left:0;width:100%}
  .voe-sum-acts button{width:100%}
  .voe-grid{grid-template-columns:1fr}
  .voe-point-row{gap:7px}
  .voe-tag-url{max-width:100%;flex:1 1 100%;order:3}
  .voe-point-acts{margin-left:0}
  .voe-qr-wrap{gap:14px;flex-direction:column;align-items:stretch}
  .voe-qr{width:200px;height:200px;margin:0 auto}
  .voe-qr svg{width:184px;height:184px}
  .voe-qr-body{min-width:0}
  /* 弹窗很长，把处理按钮吸底；四个按钮排两行，别竖着堆半屏 */
  .voe-acts{position:sticky;bottom:-22px;background:#fff;border-top:1px solid #eef0e9;padding:10px 0 4px;margin-top:14px;gap:6px;box-shadow:0 -8px 14px -10px rgba(0,0,0,.28)}
  .voe-acts button{flex:1 1 calc(50% - 3px);min-width:0;font-size:12px;padding:10px 6px;white-space:nowrap}
}

/* ========== 入园交接表（2026-10-23） ==========
   主页汇总块 + 列表 + 填写表单（含签名画板）+ 只读交接单（可打印）+ 园区与主管配置。
   记录走 /api/handover*，不进状态包；配色沿用主系统的绿灰，
   状态只有「待主管接收」用橙、「已作废」变灰，其余保持中性。 */

.ho-panel{margin-bottom:18px}
.ho-sum{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.ho-sum-i small{display:block;font-size:11px;color:#8b9a90;margin-bottom:4px}
.ho-sum-i b{font-size:26px;font-weight:500;color:#2c5343;letter-spacing:-.5px}
.ho-sum-i span{font-size:11px;color:#9aa79c;margin-left:5px}
.ho-sum-i.warn b{color:#b8794a}
.ho-sum-acts{margin-left:auto}
.ho-mini-list{display:grid;gap:8px;margin-top:14px}
.ho-mini{display:flex;align-items:center;gap:10px;text-align:left;width:100%;padding:9px 11px;border-radius:11px;border:1px solid #eceee6;background:#fbfbf8}
.ho-mini:hover{background:#f7f8f3;border-color:#dfe5d8}
.ho-mini-body{min-width:0;display:block}
.ho-mini-body b{display:block;font-size:13px;color:#33513f;font-weight:600}
.ho-mini-body small{display:block;font-size:11px;color:#9aa79c;margin-top:2px}

/* —— 状态标签 —— */
.ho-st{display:inline-block;font-size:11px;padding:3px 9px;border-radius:5px;white-space:nowrap;background:#f2f4ef;color:#8a9985}
.ho-st.draft{background:#f1f3ee;color:#7d8b78}
.ho-st.signed{background:#fdf0e2;color:#a9762f;font-weight:600}
.ho-st.done{background:#e9f4e6;color:#377650;font-weight:600}
.ho-st.void{background:#f3f3f0;color:#a3ada0;text-decoration:line-through}
.ho-st.deleted{background:#f6efee;color:#a8817c;text-decoration:line-through}

/* —— 列表 —— */
.stats.ho-stats{grid-template-columns:repeat(5,minmax(0,1fr))}
.ho-filters{display:flex;gap:7px;flex-wrap:wrap;align-items:center;margin:4px 0 16px}
.ho-filter{font-size:12px;padding:7px 14px;border-radius:20px;background:#fff}
.ho-filter.on{background:#e3ede0;color:#316445;border-color:#cfdec8;font-weight:600}
.ho-reload{margin-left:auto}
.ho-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}
.ho-card{background:#fff;border:1px solid var(--line);border-radius:13px;padding:15px 16px;display:flex;flex-direction:column;gap:6px}
.ho-card.signed{border-color:#f0ddc4;background:#fffdf9}
.ho-card.void,.ho-card.deleted{opacity:.62}
.ho-card-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.ho-campus{font-size:11px;color:#6b7f72;background:#f2f5ee;border-radius:5px;padding:3px 8px}
/* 交接表模板：乳儿班 / 常规班（2026-10-23） */
.ho-tpl{display:inline-block;font-size:11px;padding:3px 9px;border-radius:5px;white-space:nowrap;background:#eaf2f6;color:#4f7d8f}
.ho-tpl.regular{background:#eceefa;color:#59679c}
.ho-tpl-pick{display:inline-flex;align-items:center;gap:7px;vertical-align:middle;font-size:12px;color:#3d5445}
.ho-tpl-pick select{font-size:12.5px;padding:5px 8px;max-width:300px}
.ho-pick-tpl{margin-top:12px}
.ho-code{font-size:10px;color:#b3bcb0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-left:auto}
.ho-card h3{margin:2px 0 0;font-size:16px;color:#2f4a3c}
.ho-card h3 small{font-size:12px;color:#93a08f;font-weight:400}
.ho-meta{margin:0;font-size:11.5px;color:#8b9a90;line-height:1.55;overflow-wrap:anywhere}
.ho-card-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:6px;padding-top:9px;border-top:1px dashed #eceee6}
.ho-signs{font-size:11px;color:#7f8f7b}
.ho-by{margin:0;font-size:10.5px;color:#aab4a6}
.ho-now{font-size:11px;color:#93a08f}

/* —— 园区与主管（2026-10-28 搬到「班级管理」页底部）——
   一行一个园区：名字（+已停用）｜主管｜几个班多少在读｜编辑/删除。
   窄屏把按钮整行放下来，别和数字挤在一行。 */
.cp-list{display:grid;gap:7px;margin:0 0 13px}
.cp-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:11px 13px;border:1px solid var(--line);border-radius:9px;background:#fafbf8}
.cp-row.off{opacity:.62}
.cp-name{display:flex;align-items:center;gap:7px;font-size:13.5px;font-weight:600;color:#33513f;min-width:96px}
.cp-off{font-size:10px;font-weight:400;color:#9a8455;background:#f6efdc;border-radius:5px;padding:2px 6px}
.cp-sup{font-size:12px;color:#6b7f72}
.cp-sup b{color:#2c5343;font-weight:600}
.cp-none{color:#b08a63}
.cp-num{font-size:11.5px;color:#93a08f}
.cp-acts{margin-left:auto;display:flex;gap:7px}
@media(max-width:680px){
  .cp-row{gap:7px;padding:10px 12px}
  .cp-name{min-width:0}
  .cp-num{flex:1 1 auto}
  .cp-acts{margin-left:0;width:100%}
  .cp-acts button{flex:1}
}
.ho-campus-pick{display:grid;gap:8px;margin-top:12px}
.ho-pick{display:block;text-align:left;padding:13px 15px;border-radius:11px;border:1px solid var(--line);background:#fafbf8;width:100%}
.ho-pick:hover{border-color:#79a38c;background:#f2f8f3}
.ho-pick b{display:block;font-size:14px;color:#2f4a3c}
.ho-pick small{display:block;font-size:11px;color:#93a08f;margin-top:3px}
/* 一键建档：选班级（2026-10-23） */
.ho-pick-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:14px 0 4px}
.ho-pick.on{border-color:#3f8f68;background:#eef7f1;box-shadow:inset 0 0 0 1px #3f8f68}
.ho-pick.off{opacity:.55;cursor:not-allowed}
.ho-pick.off:hover{border-color:var(--line);background:#fafbf8}
.ho-built{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;color:#3d7a55;background:#e9f4e6;border-radius:999px;padding:3px 9px;white-space:nowrap}
.ho-build-to{margin:11px 0 0}
.ho-build-to b{color:#2f4a3c}
@media(max-width:680px){.ho-pick-list{grid-template-columns:1fr}}

/* —— 填写表单 —— */
.ho-form-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:18px;flex-wrap:wrap}
.ho-form-head h1{font-size:24px;margin:8px 0 4px}
.ho-form-head .hint{margin:0}
.ho-form-panel{padding:20px 22px}
.ho-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 18px}
.ho-fields .field{margin:12px 0 6px}
.ho-fields .field.wide{grid-column:1/-1}
.ho-fields .field>span:first-child{display:block;font-size:12px;color:#3d5445;margin-bottom:7px}
.ho-fields .field>input{width:100%;min-width:0;margin-top:0}
/* 接送时间是下拉（2026-10-29）：跟输入框一样占满整格，点开才展开时间段 */
.ho-fields .field>select{width:100%;min-width:0;margin-top:0;font-size:13px;padding:10px 12px;cursor:pointer;background:#fff}
.ho-fields .field{min-width:0}
.ho-req{color:#c4694a;font-style:normal;margin-left:3px}
.ho-row2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.ho-pair{display:flex;gap:6px;min-width:0}
.ho-pair input{min-width:0}
.ho-pair input:first-child{flex:1 1 40%}
.ho-pair input:last-child{flex:1 1 60%}
.ho-seg{display:flex;gap:8px;flex-wrap:wrap}
.ho-seg-i{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;background:#fafbf8;border:1px solid var(--line);border-radius:8px;padding:9px 13px;cursor:pointer}
.ho-seg-i input{width:15px;height:15px;accent-color:#23765d;margin:0}
.ho-seg-block{display:grid;gap:7px;margin-bottom:8px}
.ho-fields textarea{width:100%;margin-top:0;font-size:13px}
/* 过敏 / 病史：选「有」才出现的说明框（2026-10-29） */
.ho-fields textarea[hidden]{display:none}
/* 时长单位「个月」（2026-10-29）：填数字就行，单位不让人误填。
   单位放在输入框里面（外框画在 .ho-unit 上，input 去边框），看起来就是一个框。 */
.ho-unit{display:flex;align-items:center;min-width:0;border:1px solid #dbe3da;border-radius:8px;background:#fff}
.ho-unit input{flex:1 1 auto;min-width:0;border:0;background:transparent;padding:10px 2px 10px 12px;margin:0;font-size:12.5px}
.ho-unit input:focus{outline:none}
.ho-unit:focus-within{border-color:#79a38c;box-shadow:0 0 0 3px #e7f1e6}
.ho-unit em{font-style:normal;flex:none;color:#8a9a90;font-size:12px;white-space:nowrap;padding-right:10px}
.ho-rel-pair>.ho-unit{flex:1 1 96px;min-width:0}
.ho-rel-pair>.ho-unit input{padding:9px 2px 9px 9px}
.ho-rel-pair>.ho-unit em{padding-right:8px;font-size:11.5px}
.ho-fhint{display:block;margin-top:5px;font-size:11px;color:#93a08f}
/* 开通监控「再加一个人」 */
.ho-addrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:9px}
.ho-addrow .hint{font-size:11.5px;color:#93a08f;margin:0}
.ho-addrow button[disabled]{opacity:.45;cursor:not-allowed}
/* 窄屏：关系占满一行，手机号和时长并排一行，不然手机号会被挤到只剩 8 位数字 */
@media(max-width:680px){
  #hoCamRows .ho-rel-pair{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px}
  #hoCamRows .ho-rel-pair>.ho-rel{grid-column:1/-1}
}
/* 睡觉时间：每段「时 : 分 — 时 : 分」四个下拉，可加多段（2026-10-29） */
.ho-sleep{display:grid;gap:7px}
.ho-sleep-row{display:flex;align-items:center;gap:8px;min-width:0}
.ho-sleep-row select{flex:1 1 0;min-width:0;font-size:13px;padding:10px 12px;cursor:pointer;background:#fff;margin:0}
/* 时 / 分下拉只放两位数字，别跟着等分把格子拉太宽 */
.ho-sleep-row .ho-h{flex:0 0 auto;width:70px}
.ho-sleep-row .ho-m{flex:0 0 auto;width:66px}
.ho-sleep-colon{flex:none;font-style:normal;color:#93a08f;font-size:13px;margin:0 -3px 2px}
.ho-sleep-sep{flex:none;font-style:normal;color:#93a08f;font-size:12px;margin:0 4px}
.ho-sleep-del{flex:none;width:34px;padding:9px 0;font-size:16px;line-height:1;color:#a66755;background:transparent;border:1px solid var(--line);border-radius:8px}
.ho-sleep-del:hover{border-color:#dcae9e;background:#fcf1ec}
.ho-sleep-del[hidden]{display:none}
#hoSleepRows + .ho-fhint{margin-top:7px}
#hoSleepRows~.ho-addrow button{border-style:dashed;color:#347855;font-size:12px;padding:8px 14px}
@media(max-width:680px){
  .ho-sleep-row{gap:6px}
  .ho-sleep-row select{padding:9px 6px;font-size:12.5px}
  .ho-sleep-row .ho-h{width:58px}
  .ho-sleep-row .ho-m{width:54px}
  .ho-sleep-colon{margin:0 -1px}
  .ho-sleep-sep{margin:0 2px}
}
/* 「可多选」这类小标签，跟在字段名后面 */
.ho-multi{font-style:normal;font-size:10.5px;color:#8b9a90;background:#f2f4ef;border-radius:5px;padding:1px 7px;margin-left:7px;font-weight:400}
.ho-loading{line-height:1.9}
.ho-loading .row-actions{margin-top:12px}
.ho-chips{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:8px}
.ho-chip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;background:#fafbf8;border:1px solid var(--line);border-radius:8px;padding:9px 12px;cursor:pointer}
.ho-chip input{width:15px;height:15px;accent-color:#23765d;margin:0}
/* 带养「其他」手填框：勾了「其他」才出现，宽度收窄一点（2026-10-29） */
.ho-fields .field>input.ho-other{width:min(260px,100%);font-size:12.5px;padding:8px 10px}
.ho-fields .field>input.ho-other[hidden]{display:none}
.ho-bigtext{width:100%;font-size:13px;line-height:1.75;min-height:100px}
.ho-form-actions{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin:4px 0 10px}
.ho-lock-hint{text-align:right;margin:0 0 26px}

/* —— 签名画板 —— */
.ho-pads{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.ho-pad-box{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fcfdfb}
.ho-pad-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:9px}
.ho-pad-head b{font-size:13px;color:#2f4a3c}
.ho-pad-head span{font-size:11px;color:#93a08f}
.ho-signed{margin-bottom:8px}
.ho-signed img{width:100%;max-height:92px;object-fit:contain;background:#fff;border:1px dashed #dfe5d8;border-radius:8px}
.ho-pad{display:block;width:100%;height:150px;background:#fff;border:1px dashed #c3d2c0;border-radius:10px;touch-action:none;cursor:crosshair}
.ho-pad-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:7px}
.ho-pad-foot .hint{margin:0}
.ho-empty{color:#b0b8ab;font-style:normal}

/* —— 只读交接单（可打印） —— */
.ho-print-page{background:#fff;border:1px solid var(--line);border-radius:14px;padding:30px 34px;max-width:900px;margin:0 auto 24px}
.ho-print-head{text-align:center;border-bottom:2px solid #e6ece3;padding-bottom:14px;margin-bottom:18px}
.ho-print-head h1{font-size:22px;margin:0 0 6px;letter-spacing:2px}
.ho-print-sub{margin:0;font-size:12px;color:#7f8f7b}
.ho-detail-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;max-width:900px;margin:0 auto 16px}
.ho-detail-bar .row-actions{margin-left:auto}
.ho-view-sec{margin:0 0 18px;padding-bottom:14px;border-bottom:1px dashed #e8ece3}
.ho-view-sec:last-child{border-bottom:0}
.ho-view-sec h2{font-size:13px;margin:0 0 10px;color:#4a6b57;letter-spacing:1px}
.ho-view-row{display:grid;grid-template-columns:120px 1fr;gap:10px;font-size:13px;padding:4px 0;line-height:1.7}
.ho-view-k{color:#8b9a90;font-size:12px}
.ho-view-v{color:#33473a;overflow-wrap:anywhere}
.ho-view-text{margin:0;font-size:13px;line-height:1.85;color:#33473a;white-space:pre-wrap;overflow-wrap:anywhere}
.ho-sign-view{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.ho-sign-view small{display:block;font-size:11px;color:#8b9a90;margin-bottom:6px}
.ho-sign-view img{width:100%;max-height:100px;object-fit:contain;background:#fff;border-bottom:1px solid #d8e0d5}
.ho-sign-view .hint{margin:4px 0 0;font-size:10px}
.ho-flow .ho-log{margin:0;padding:5px 0;font-size:11.5px;color:#6d7e6a;border-bottom:1px dotted #eceee6;line-height:1.7}
.ho-flow .ho-log span{color:#a2aea0;margin-right:8px;font-variant-numeric:tabular-nums}
.ho-flow .ho-log em{font-style:normal;color:#a9b5a5;margin-left:8px}

@media(max-width:900px){
  .stats.ho-stats{grid-template-columns:repeat(2,1fr)}
  .ho-fields{grid-template-columns:minmax(0,1fr)}
  .ho-pads{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:680px){
  .ho-sum{gap:16px}
  .ho-sum-i b{font-size:23px}
  .ho-sum-acts{margin-left:0;width:100%}
  .ho-sum-acts button{width:100%}
  .ho-grid{grid-template-columns:1fr}
  .ho-row2{grid-template-columns:minmax(0,1fr)}
  .ho-card-foot{align-items:flex-start;flex-direction:column}
  .ho-card-foot .row-actions{width:100%;flex-wrap:nowrap}
  .ho-card-foot .row-actions button{flex:1;white-space:nowrap}
  .ho-form-head h1{font-size:21px}
  .ho-form-actions{position:sticky;bottom:70px;background:#f5f7f4;padding:9px 0 4px;margin:0;box-shadow:0 -8px 14px -12px rgba(0,0,0,.3)}
  .ho-form-actions button{flex:1;white-space:nowrap;font-size:12.5px}
  .ho-print-page{padding:18px 16px;border-radius:10px}
  .ho-print-head h1{font-size:17px;letter-spacing:1px}
  .ho-view-row{grid-template-columns:96px 1fr;gap:8px}
  .ho-sign-view{grid-template-columns:1fr}
  .ho-pad{height:130px}
}

/* 打印：只留交接单本身，把侧边栏、顶栏、按钮全藏掉 */
@media print{
  body.ho-print .sidebar,body.ho-print header,body.ho-print footer{display:none!important}
  body.ho-print #toast,body.ho-print .ho-detail-bar,body.ho-print .ho-panel,body.ho-print .page-title{display:none!important}
  body.ho-print main{margin:0}
  body.ho-print #app{padding:0;max-width:none}
  body.ho-print .ho-print-page{border:0;border-radius:0;padding:0;max-width:none;margin:0}
  body.ho-print .ho-view-sec{break-inside:avoid;page-break-inside:avoid}
  body.ho-print .ho-sign-view img{max-height:88px}
  @page{size:A4;margin:14mm}
}

/* 顾问 / 主管只有「入园交接」一个入口：底部导航整条收起来，把高度还给内容 */
@media(max-width:680px){
  body.solo-nav nav{display:none}
  body.solo-nav main{padding-bottom:0}
  body.solo-nav .ho-form-actions{bottom:0}
}
@media print{
  body.ho-print .demo,body.ho-print .ho-flow{display:none!important}
}

/* 手机上把页头收紧：视图名可能很长（填写交接表 / 交接单），别把账号按钮挤成竖排 */
@media(max-width:680px){
  header{gap:8px}
  .header-title{min-width:0;flex:1 1 auto}
  .header-title>div{min-width:0}
  #viewName{display:block;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:5.5em}
  .header-right{flex:0 0 auto;flex-wrap:nowrap;gap:4px}
  .header-right button.small{padding:7px 7px;font-size:11px;white-space:nowrap}
  .header-right .bell{padding:6px}
}

/* ========== 园区：班级的上一层（2026-10-23）=========
   班级管理里按园区分组、顶部园区切换条；会员管理的园区筛选沿用同一套标签样式 */

.campus-bar{display:flex;gap:7px;flex-wrap:wrap;align-items:center;margin:2px 0 14px}
.campus-tab{padding:7px 13px;border-radius:999px;border:1px solid #e2e7dd;background:#fbfbf8;color:#5d7a63;font-size:13px;cursor:pointer}
.campus-tab:hover{background:#f4f7f0;border-color:#d6e0d0}
.campus-tab.on{background:#3d7a55;border-color:#3d7a55;color:#fff;font-weight:600}
.campus-bar .small.primary{margin-left:auto}
.campus-group{margin-bottom:24px}
.campus-group-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid #eceee6}
.campus-group-head h2{font-size:16px;font-weight:600;color:#2c5343;margin:0}
.campus-group-head .hint{margin:0;font-size:12px;color:#93a08f}
.campus-group-head .actions{margin-left:auto;gap:6px}
.campus-off{display:inline-block;margin-left:7px;font-size:11px;color:#a3ada0;background:#f3f3f0;border-radius:5px;padding:2px 7px}
/* 账号管理里的园区授权勾选：和班级勾选用一套外观，上面单独一行说明 */
.account-campus-checks{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;margin:10px 0}
.account-campus-checks .hint{grid-column:1/-1;margin:0}
/* 一键建档选班级时，园区名淡一点，别跟班级名抢位置 */
.ho-pick b em{font-style:normal;font-size:11px;color:#93a08f;margin-left:6px}
/* 手机上园区条横向滚动，别把标题挤成两行 */
@media(max-width:680px){
  .campus-bar{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}
  .campus-bar .small.primary{margin-left:0}
  .campus-tab{white-space:nowrap}
  .campus-group-head{gap:8px}
  .campus-group-head .actions{margin-left:0;width:100%}
}

/* ===== 入园交接表：称谓下拉 + 如实填写强调（2026-10-23）===== */
.ho-rel-pair{flex-wrap:wrap;align-items:center}
.ho-rel-pair>select,.ho-rel-pair>input{flex:1 1 92px;min-width:0;font-size:12.5px;padding:9px 8px;margin:0}
.ho-rel-pair>.ho-rel{flex:1 1 96px}
.ho-rel-pair>.ho-rel-other{flex:1 1 130px}
.ho-rel-pair>[hidden]{display:none}
/* 过敏 / 过往病史：请家长务必如实填写 */
.ho-must{margin:0 0 10px;padding:10px 13px;border:1px solid #e8c79a;border-left:4px solid #c98b3e;border-radius:8px;background:#fdf4e6;color:#8a5a1f;font-size:12px;line-height:1.8}
.ho-must b{color:#a5551f}
.ho-fields .field>span .ho-req{margin-left:8px;font-size:10px;padding:2px 8px;border:1px solid #e6cdc2;border-radius:20px;background:#fbeee9;color:#b35b43}

/* ===== 校区看板（2026-10-23）===== */
.cb-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-bottom:20px}
.cb-tile{display:flex;flex-direction:column;align-items:flex-start;gap:8px;text-align:left;padding:22px 20px;border:1px solid var(--line);border-radius:14px;background:#fff;min-width:0}
.cb-tile:hover{border-color:#79a38c;background:#f4f9f2;box-shadow:0 6px 20px #244e3810}
.cb-tile i{font-style:normal;font-size:28px;line-height:1}
.cb-tile b{font-size:16px;color:#2f4a3c}
.cb-tile small{font-size:12px;color:#93a08f;line-height:1.6}
.cb-panel{margin-top:20px}
.cb-mlist{display:grid;gap:8px}
.cb-mrow{display:flex;align-items:center;gap:12px;padding:11px 14px;border:1px solid var(--line);border-radius:10px;background:#fafbf8;flex-wrap:wrap}
.cb-mrow .row-actions{margin-left:auto}
.cb-mkind{font-size:11px;padding:3px 9px;border-radius:5px;background:#eef3e9;color:#4a7a58;white-space:nowrap}
.cb-mkind.activity{background:#fdf0e2;color:#a9762f}
.cb-mkind.course{background:#e8f0f4;color:#4f7d8f}
.cb-mtitle{font-size:13.5px;font-weight:600;color:#33513f;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cb-mdate{font-size:11px;color:#93a08f;white-space:nowrap}
.cb-mby{font-size:11px;color:#aab4a6}
/* 子看板（大屏只读） */
.cb-board-page{max-width:1100px;margin:auto}
.cb-board-head{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:22px;flex-wrap:wrap}
.cb-board-title{font-size:24px;font-weight:700;color:#2f4a3c;letter-spacing:1px}
.cb-list{display:grid;gap:14px}
.cb-item{background:#fff;border:1px solid var(--line);border-radius:14px;padding:20px 22px}
.cb-item-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cb-item-top b{font-size:17px;color:#2f4a3c}
.cb-k{font-size:11px;padding:3px 9px;border-radius:5px;background:#eef3e9;color:#4a7a58}
.cb-k.activity{background:#fdf0e2;color:#a9762f}
.cb-k.course{background:#e8f0f4;color:#4f7d8f}
.cb-when{margin-left:auto;font-size:13px;color:#6b7f72;font-weight:600}
.cb-time{font-size:12px;color:#93a08f}
.cb-content{margin-top:12px;font-size:14.5px;line-height:1.9;color:#4a5a50;white-space:pre-wrap}
.cb-cls{margin-top:12px;font-size:12px;color:#93a08f}
/* 过敏食物看板 */
.cb-stats-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin-bottom:20px}
.cb-stat{padding:18px 20px;border:1px solid var(--line);border-radius:12px;background:#fff}
.cb-stat.danger{border-color:#e8c7c0;background:#fdf6f4}
.cb-stat.warn{border-color:#e8d9b0;background:#fdf9ef}
.cb-stat small{display:block;color:#85928a;font-size:12px}
.cb-stat b{font-size:30px;font-weight:600;color:#2f4a3c}
.cb-stat span{font-size:12px;color:#98a298;margin-left:4px}
.cb-stat.danger b{color:#b35b43}
.cb-stat.warn b{color:#a9762f}
.cb-table-wrap{overflow-x:auto;background:#fff;border:1px solid var(--line);border-radius:12px}
.cb-table{width:100%;border-collapse:collapse;white-space:normal;font-size:14px}
.cb-table th{background:#f6f8f3;color:#5a6b5e;font-weight:600;text-align:left}
.cb-table th,.cb-table td{padding:13px 16px;border-bottom:1px solid var(--line)}
.cb-table td strong{color:#33513f;display:block}
.cb-table td small{color:#9aa79c;font-size:11px;display:block;margin-top:2px}
.cb-allergy .cb-bad{color:#b35b43;font-weight:600}
.cb-allergy .cb-warn{color:#a9762f}
.cb-allergy .cb-ok{color:#7d9b83}
.cb-foods .cb-none{color:#c0c8bd}
@media(max-width:680px){.cb-grid{grid-template-columns:1fr}.cb-stats-row{grid-template-columns:1fr}.cb-board-title{font-size:19px}.cb-content{font-size:13.5px}}

/* 校区看板：图片轮播 */
.cb-mthumb{width:44px;height:44px;object-fit:cover;border-radius:6px;border:1px solid var(--line);flex-shrink:0}
.cb-prev{max-width:100%;max-height:220px;margin-top:10px;border-radius:10px;border:1px solid var(--line);object-fit:contain}
.cb-slide{position:relative;background:#1e302b;border-radius:16px;overflow:hidden;min-height:320px;display:flex;align-items:center;justify-content:center}
.cb-slide-item{display:none;text-align:center;padding:20px}
.cb-slide-item.on{display:block}
.cb-slide-item img{max-width:100%;max-height:70vh;border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.4)}
.cb-slide-cap{margin-top:14px;color:#f2f5e9;font-size:18px;font-weight:600;letter-spacing:1px}
.cb-slide-dots{position:absolute;bottom:14px;left:0;right:0;display:flex;justify-content:center;gap:8px}
.cb-slide-dots span{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.35)}
.cb-slide-dots span.on{background:#f7ead0}
@media(max-width:680px){.cb-slide{min-height:220px}.cb-slide-cap{font-size:15px}}

/* ============ 会员状态标签（2026-10-24）============
   未入园 / 在读 / 停课（临时移出）/ 毕业。徽标颜色只做区分，文案以汉字为准。 */
.st-badge{display:inline-block;border-radius:999px;font-size:11px;line-height:1;padding:5px 9px;font-weight:600;white-space:nowrap;border:1px solid transparent}
.st-badge.pending{background:#eef1f5;color:#5b6b7b;border-color:#dde3ea}
.st-badge.active{background:#e6f3ea;color:#1f6b4a;border-color:#cfe6d9}
.st-badge.paused{background:#fdf1e0;color:#96601c;border-color:#f3ddba}
.st-badge.graduated{background:#f0ecf7;color:#5d4c86;border-color:#e2dbf0}
/* 会员管理的状态筛选条 */
.status-bar{display:flex;flex-wrap:wrap;gap:8px;margin:4px 0 14px}
.st-tab{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:#fff;border-radius:999px;padding:7px 13px;font-size:13px;color:#5c6d61}
.st-tab b{font-size:11px;font-weight:600;background:#f1f4f0;color:#7b8a80;border-radius:999px;padding:2px 7px;min-width:20px;text-align:center}
.st-tab.on{background:#e7f0e4;border-color:#b9d6c4;color:#1f5c45;font-weight:600}
.st-tab.on b{background:#fff;color:#23765d}
/* 改状态弹窗：四个选项竖排，带说明 */
.status-opts{display:grid;gap:8px;margin:6px 0 12px}
.status-opt{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:11px 13px;background:#fff;cursor:pointer}
.status-opt.on{border-color:#8ebba4;background:#f4faf5;box-shadow:inset 0 0 0 1px #cfe4d8}
.status-opt input{margin-top:3px;flex-shrink:0}
.status-opt b{display:block;font-size:14px;color:#2f4a3c}
.status-opt small{display:block;font-size:12px;color:#84928b;line-height:1.5;margin-top:2px}
.checkline{display:flex;gap:8px;align-items:center;font-size:13px;color:#5c6d61}
@media(max-width:680px){.st-tab{font-size:12px;padding:6px 10px}.status-bar{gap:6px}}
/* 会员管理表格的操作列：给固定宽度让按钮整齐换行（3 + 3），
   不要靠 nowrap——那会把表格撑得很宽，桌面上也要横向滚动才能点到「删除」 */
.member-table td:last-child{width:266px;min-width:266px}
.member-table .row-actions{flex-wrap:wrap;gap:6px}
.member-table .row-actions button{white-space:nowrap;padding:7px 10px}

/* ============ 班级看板按类型显示栏目（2026-10-25）============
   新增的体温 / 午睡点检 / 如厕格，沿用大屏的字号与配色。 */
.board-table .bd-strong{font-weight:600}
.board-table small.bd-bad{color:#ffb9a6;font-weight:600}
.board-table td .bd-empty{opacity:.75}
/* 入园情绪（2026-10-26）：表情 + 文字，哭闹标暖色让老师一眼扫到 */
.board-table .bd-mood{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;font-weight:600}
.board-table .bd-mood.good{color:#bfe6c6}
.board-table .bd-mood.bad{color:#ffb9a6;font-weight:700}
/* 看板设置里的栏目勾选：紧凑两列，手机上单列（11 项排一列会顶出弹窗） */
.board-hooks{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:6px 0 2px}
.board-hook{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:9px;padding:9px 10px;background:#fff;font-size:13px;cursor:pointer;color:#3b5445}
.board-hook input{flex-shrink:0;margin:0}
.board-hook span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.board-hook small{margin-left:auto;color:#84928b;font-size:11px;flex-shrink:0}
.board-hook.on{border-color:#8ebba4;background:#f4faf5;box-shadow:inset 0 0 0 1px #cfe4d8}
@media(max-width:520px){.board-hooks{grid-template-columns:1fr;max-height:44vh;overflow:auto;padding-right:2px;-webkit-overflow-scrolling:touch}}

/* ============ 客户声音 · 托育 / 早教两个区域（2026-10-25）============
   两个二维码、两份反馈（voc.area），园长可以分开看。这里只加：
   区域标签、区域切换条、两张台卡并排的栅格。原来的 VOC 样式一律不动。 */
.voc-area-tag{display:inline-block;font-size:10px;padding:3px 7px;border-radius:5px;font-weight:600;letter-spacing:.5px;white-space:nowrap}
.voc-area-tag.care{background:#eaf2e8;color:#37765d}
.voc-area-tag.early{background:#e2f4f3;color:#00808f}
/* 区域切换条：放在统计卡下面、状态筛选上面 */
.voc-area-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 16px}
.voc-area-bar-label{font-size:11px;color:#98a298;letter-spacing:1px}
.voc-area-chip{display:inline-flex;align-items:center;gap:6px}
.voc-area-chip.has-new{border-color:#e4c4b6}
.voc-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#c8664c;flex:none}
/* 主页汇总块里的一行区域数量 */
.voc-area-line{font-size:11.5px;color:#8b9a90;margin:10px 0 0}
/* 两张台卡并排（桌面上），手机上自动单列 */
.voc-qr-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:18px;margin-top:4px}
.voc-qr-area{border:1px solid #eceee6;border-radius:12px;padding:14px;background:#fbfbf8;min-width:0}
.voc-qr-area.early{background:#f8fdfd;border-color:#dfeeee}
.voc-qr-areahead{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:11px}
.voc-qr-areahead b{font-size:14px;color:#33513f}
.voc-qr-area.early .voc-qr-areahead b{color:#1f5c66}
.voc-qr-areahead .hint{margin:0 0 0 auto;font-size:11px}
.voc-qr-area .voc-qr-body p{font-size:12px}
@media(max-width:1100px){.voc-qr-grid{grid-template-columns:1fr}}
@media(max-width:680px){
  .voc-area-bar{gap:7px}
  .voc-qr-area{padding:12px}
  .voc-qr-areahead .hint{margin-left:0;flex-basis:100%}
}

/* ============ 员工培训 TR（2026-10-25）============
   园长端「员工培训」整页 + 建课弹窗 + 派课弹窗，以及主页上那条给老师的待学横幅。
   分类色块 .cat 和老师端（/train）里那套保持一致，两边看起来是同一个东西。 */
/* —— 分类色块 —— */
.cat{display:inline-block;font-size:10.5px;padding:3px 8px;border-radius:5px;background:#eaf2e8;color:#37765d;font-weight:600;white-space:nowrap}
.cat.safety{background:#fdeae3;color:#b3553f}
.cat.ethics{background:#f1eef7;color:#6a5d8c}
.cat.daily{background:#eaf0f4;color:#4e6c80}
.cat.early{background:#fdf3e2;color:#a1793d}
.cat.rules{background:#f2f2ef;color:#77827a}
/* —— 主页：老师待学横幅 —— */
.tr-banner{display:flex;align-items:center;gap:12px;width:100%;text-align:left;background:#fff;border:1px solid #d9e4d4;border-left:3px solid #3c8f6d;border-radius:14px;padding:13px 16px;margin-bottom:16px;box-shadow:0 2px 10px rgba(64,80,60,.05)}
.tr-banner:hover{background:#f7faf4;border-color:#a9cdb6}
.tr-banner-i{font-size:20px;flex:none}
.tr-banner-t{min-width:0;flex:1}
.tr-banner-t b{display:block;font-size:14px;color:#2b5340;font-weight:600}
.tr-banner-t small{display:block;font-size:11.5px;color:#8b9a90;margin-top:3px}
.tr-banner-a{flex:none;font-size:12.5px;color:#23765d;font-weight:600}
/* —— 主页：园长汇总块 —— */
.tr-home{margin-bottom:18px}
.tr-home-row{display:flex;align-items:center;gap:26px;flex-wrap:wrap}
.tr-home-i small{display:block;font-size:11px;color:#8b9a90;margin-bottom:4px}
.tr-home-i b{font-size:26px;font-weight:500;color:#2c5343;letter-spacing:-.5px}
.tr-home-i span{font-size:11px;color:#9aa79c;margin-left:5px}
.tr-home-i.bad b{color:#b3553f}
.tr-home-acts{margin-left:auto}
/* —— 统计 / 分页 —— */
.stats.tr-stats{grid-template-columns:repeat(3,minmax(0,1fr))}
.tr-tabs{display:flex;gap:8px;margin:0 0 18px;flex-wrap:wrap}
/* —— 课程卡 —— */
.tr-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
.tr-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px 17px;display:flex;flex-direction:column;gap:9px;min-width:0}
.tr-card-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.tr-badge{font-size:10.5px;padding:3px 8px;border-radius:5px;font-weight:600}
.tr-badge.published{background:#e9f4e6;color:#377650}
.tr-badge.draft{background:#f2f2ef;color:#8a948a}
.tr-badge.archived{background:#f7f1e8;color:#a08557}
.tr-min{font-size:11px;color:#9aa79c}
.tr-card h3{margin:0;font-size:15.5px;line-height:1.5;color:#2b3f33;font-weight:600;overflow-wrap:anywhere}
.tr-ex{margin:0;font-size:12px;line-height:1.75;color:#8b9a90;overflow-wrap:anywhere}
.tr-card-meta{font-size:11.5px;color:#93a08f;margin-top:auto}
.tr-card-foot{display:flex;gap:8px;padding-top:10px;border-top:1px dashed #eceee6;flex-wrap:wrap}
.tr-card-foot button[disabled]{opacity:.5;cursor:not-allowed}
/* —— 建课弹窗 —— */
.tr-row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.tr-body-tools{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:9px}
.tr-body-tools .hint{margin:0}
.tr-body-tools code{background:#f2f5ee;border-radius:4px;padding:1px 5px;font-size:11px}
.tr-preview{border:1px solid var(--line);border-radius:12px;padding:14px 15px;margin:10px 0 4px;background:#fbfbf8;font-size:14px;line-height:1.9;color:#33473a;max-height:300px;overflow:auto}
.tr-preview p{margin:0 0 11px}
.tr-preview p:last-child{margin:0}
.tr-preview h3{font-size:15px;margin:15px 0 8px;color:#26402f;border-left:3px solid #a9cdb6;padding-left:8px}
.tr-preview .tr-tip{background:#fdf6e7;border:1px solid #f0e4c9;border-radius:9px;padding:9px 11px;color:#8a7340;font-size:13px;margin:0 0 11px}
.tr-preview .tr-img{display:block;width:100%;border-radius:8px;margin:4px 0 11px}
.tr-quiz-head{display:flex;align-items:baseline;gap:9px;margin:20px 0 9px;font-size:12px;color:#4b6353}
.tr-quiz-head .hint{margin:0}
.tr-quiz-actions{margin:8px 0 2px}
.tr-q{border:1px solid var(--line);border-radius:12px;padding:12px 13px;margin-bottom:10px;background:#fbfbf8}
.tr-q-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;font-size:12px;color:#4b6353}
.tr-q-text{width:100%;font-size:13.5px}
.tr-q-opts{margin-top:8px;display:grid;gap:6px}
.tr-opt{display:flex;align-items:center;gap:8px}
.tr-opt input[type=radio]{flex:none;width:16px;height:16px;accent-color:#23765d}
.tr-opt-text{flex:1;min-width:0;font-size:13px;padding:7px 10px}
.tr-q-foot{display:flex;align-items:center;gap:9px;margin-top:8px}
.tr-q-foot .hint{margin:0}
.tr-more-acts{display:grid;gap:9px;margin:14px 0 4px}
/* —— 派课弹窗 —— */
.tr-assign-head{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:#fbfbf8;margin-bottom:6px}
.tr-assign-head b{display:block;font-size:14.5px;color:#2b3f33;margin-bottom:4px}
.tr-assign-head span{font-size:11.5px;color:#8b9a90}
.tr-pick-list{border:1px solid var(--line);border-radius:12px;padding:8px 12px;max-height:230px;overflow:auto;margin:8px 0 2px;display:grid;gap:2px}
.tr-pick-list label{display:flex;align-items:center;gap:9px;font-size:13px;padding:7px 0;border-bottom:1px dashed #f0f2ec;color:#3d5445}
.tr-pick-list label:last-child{border-bottom:0}
.tr-pick-list input{width:17px;height:17px;flex:none;accent-color:#23765d}
.tr-post{font-size:10.5px;color:#9aa79c;background:#f2f5ee;border-radius:4px;padding:1px 6px;margin-left:7px;font-weight:400}
/* —— 进度 —— */
.tr-prow{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px solid #f0f2ec;flex-wrap:wrap}
.tr-prow:last-of-type{border-bottom:0}
.tr-pinfo{flex:1;min-width:180px}
.tr-pinfo b{display:block;font-size:13.5px;color:#2f4438;font-weight:600;margin-bottom:7px}
.tr-pbar{display:block;height:6px;border-radius:3px;background:#eef1ea;overflow:hidden;max-width:260px}
.tr-pbar i{display:block;height:100%;background:#5da382;border-radius:3px}
.tr-pnum{font-size:12px;color:#7c8b78;font-variant-numeric:tabular-nums;flex:none;min-width:54px;text-align:right}
.tr-ok{font-size:11.5px;color:#377650;flex:none}
.tr-who-list{display:flex;flex-wrap:wrap;gap:7px;padding:0 0 12px 2px}
.tr-who{font-size:11.5px;color:#5c6d61;background:#f7f9f3;border:1px solid #e9eee3;border-radius:6px;padding:4px 8px}
.tr-who i{font-style:normal;color:#9aa79c;margin-left:5px}
.tr-who em{font-style:normal;color:#a1793d;margin-left:5px}
.tr-table{width:100%;border-collapse:collapse;font-size:12.5px;white-space:nowrap}
.tr-table th{text-align:left;color:#91a08e;font-weight:400;background:#f6f8f3;padding:11px 13px;border-bottom:1px solid var(--line)}
.tr-table td{padding:11px 13px;border-bottom:1px solid #f0f2ec;color:#3d5445}
.tr-num-bad{color:#b3553f;font-weight:600}
@media(max-width:680px){
  .stats.tr-stats{grid-template-columns:repeat(2,1fr)}
  .tr-cards{grid-template-columns:1fr}
  .tr-row2{grid-template-columns:1fr}
  .tr-home{gap:16px}
  .tr-home-acts{margin-left:0;width:100%}
  .tr-home-acts button{width:100%}
  .tr-prow{gap:8px}
  .tr-pinfo{flex-basis:100%}
  .tr-pnum{text-align:left;min-width:0}
}
/* 建课表单比普通弹窗长很多：表单自己滚，别把「保存」按钮顶出屏幕。
   宽屏时把弹窗放宽（:has 老浏览器不支持就退回 480px，不影响使用）。 */
#trForm{max-height:calc(88vh - 110px);overflow-y:auto;padding-right:4px}
#modal:has(#trForm){width:min(820px,calc(100% - 24px))}
#modal:has(#trAssignForm){max-height:92vh;overflow-y:auto}

/* ========== 班级看板顶部「今日关注」提醒条（2026-10-26） ========== */
.board-notice{display:flex;align-items:stretch;margin:0 0 10px;background:rgba(0,0,0,.26);border:1px solid rgba(247,234,208,.2);border-radius:12px;overflow:hidden;font-size:clamp(13px,1.15vw,19px)}
.board-notice.all-ok{border-color:rgba(150,200,150,.35)}
.bn-label{flex:0 0 auto;display:flex;align-items:center;padding:8px 14px;background:rgba(247,234,208,.12);color:#f4e4bc;font-weight:600;letter-spacing:2px;white-space:nowrap}
.bn-list{flex:1;display:flex;align-items:center;gap:8px;padding:6px 12px;overflow-x:auto;scrollbar-width:none}
.bn-list::-webkit-scrollbar{display:none}
.bn-item{display:inline-flex;align-items:center;gap:6px;padding:6px 13px;border-radius:20px;white-space:nowrap;background:rgba(255,255,255,.08);color:#dfe9dc;line-height:1.4}
.bn-item i{font-style:normal;width:16px;height:16px;border-radius:50%;display:grid;place-items:center;font-size:10px;font-weight:700;flex:0 0 auto;background:rgba(255,255,255,.2)}
.bn-item b{font-weight:600}
.bn-item em{font-style:normal;font-size:.86em;opacity:.85;max-width:34vw;overflow:hidden;text-overflow:ellipsis}
.bn-item.danger{background:rgba(226,120,90,.2);color:#ffd5c3}
.bn-item.danger i{background:#e0704d;color:#2b1a12;animation:bnPulse 2.2s ease-in-out infinite}
.bn-item.warn{background:rgba(244,216,140,.15);color:#f7e4b3}
.bn-item.warn i{background:#e0b25a;color:#2b2313}
.bn-item.info{background:rgba(160,200,160,.15);color:#d7e8cf}
.bn-item.info i{background:#8fb98a;color:#17281c}
.bn-item.ok{background:rgba(150,205,150,.18);color:#dcf2d2}
.bn-item.ok i{background:#7fc07a;color:#152b18}
@keyframes bnPulse{0%,100%{box-shadow:0 0 0 0 rgba(224,112,77,.55)}50%{box-shadow:0 0 0 7px rgba(224,112,77,0)}}
@media(max-width:1150px){.board-notice{font-size:clamp(12px,1.25vw,15px);margin-bottom:8px}.bn-label{padding:7px 11px;letter-spacing:1px}.bn-item{padding:5px 10px}.bn-item em{display:none}}

/* ========== 体格测量方法图示（2026-10-26） ========== */
#meGuide{width:min(900px,calc(100vw - 28px));max-height:92vh;max-height:92dvh;border:0;border-radius:18px;padding:0;background:#fff;color:#354b3d;box-shadow:0 25px 90px #1b2f2833;overflow:hidden}
#meGuide[open]{display:flex;flex-direction:column}
#meGuide::backdrop{background:rgba(20,37,31,.78);backdrop-filter:blur(3px)}
.meg-head{display:flex;align-items:center;gap:10px;padding:15px 20px;border-bottom:1px solid var(--line);flex:0 0 auto}
.meg-head b{font-size:16px;color:#1f4f3d}
.meg-sub{font-size:11px;color:#93a08f}
.meg-x{margin-left:auto;border:0;font-size:17px;padding:2px 8px;background:transparent;color:#7b8b7d}
.meg-tabs{display:flex;gap:8px;padding:12px 20px 0;flex-wrap:wrap;flex:0 0 auto}
.meg-tab{font-size:12.5px;padding:8px 15px;border-radius:20px;border:1px solid var(--line);background:#fff;color:#5c6d61}
.meg-tab.on{background:#e7f0e4;border-color:#a9c8ab;color:#22624a;font-weight:600}
.meg-body{flex:1 1 auto;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch;padding:14px 20px;background:#f7faf5;display:flex;align-items:center;justify-content:center}
.meg-img{display:block;flex:0 0 auto;width:100%;height:auto;max-height:max(220px,calc(88vh - 190px));max-height:max(220px,calc(88dvh - 190px));object-fit:contain;border-radius:10px;background:#fff;box-shadow:0 1px 3px #244e3810}
.meg-body.zoom{align-items:flex-start}
.meg-body.zoom .meg-img{width:260%;max-height:none}
.meg-foot{display:flex;align-items:center;gap:10px;padding:12px 20px;border-top:1px solid var(--line);font-size:12px;flex:0 0 auto}
.meg-tip{color:#6b807a;flex:1 1 auto;min-width:0}
.meg-zoom,.meg-print{font-size:12px;padding:8px 15px;border-radius:9px;border:1px solid #cfe0cb;background:#fff;color:#23765d;text-decoration:none;white-space:nowrap}
.meg-mask{display:none}
html.meg-open #meGuide[open]{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:960}
html.meg-open .meg-mask{display:block;position:fixed;inset:0;z-index:950;background:rgba(20,37,31,.78)}
.meg-mask{pointer-events:none}
/* 录入弹窗里的三个小按钮 */
.me-form-guide{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:11.5px;color:#7d8f85;margin:4px 0 2px}
.me-form-guide .small{padding:6px 11px;font-size:11.5px}
.me-form-guide .hint{flex:1 1 100%}
@media(max-width:680px){
  #meGuide{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0}
  .meg-head,.meg-tabs,.meg-foot{padding-left:13px;padding-right:13px}
  .meg-body{padding:10px 12px}
  .meg-body.zoom .meg-img{width:300%;max-height:none}
  .meg-foot{flex-wrap:wrap}
  .meg-tip{flex:1 1 100%;order:2}
  .meg-zoom,.meg-print{padding:7px 13px}
}

/* ========== 账号与岗位权限（2026-10-27）==========
   建账号时先选岗位套模板，再逐项微调；权限矩阵按 5 组平铺，手机上自动变一列。 */
.uform-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 14px}
.perm-block{border:1px solid var(--line);border-radius:12px;margin:16px 0 6px;background:#fbfdfa;padding:14px 14px 4px}
.perm-head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;flex-wrap:wrap;margin-bottom:6px}
.perm-head h3{margin:0 0 2px;font-size:15px;color:#2d5a45;letter-spacing:.5px}
.perm-head .hint{margin:0;max-width:46em}
.perm-tpl{margin:0;min-width:210px}
.perm-tpl select{width:100%;margin-top:4px}
.perm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:10px;margin:8px 0 12px}
.pg{border:1px solid #e3e9e0;border-radius:10px;background:#fff;padding:10px 12px 6px;min-width:0}
.pg-head{display:flex;align-items:center;justify-content:space-between;gap:8px;border-bottom:1px dashed #e1e7dc;padding-bottom:7px;margin-bottom:4px}
.pg-head h4{margin:0;font-size:12.5px;color:#5c6d61;letter-spacing:.06em}
.pg-acts{display:flex;gap:5px}
.pg-acts button{padding:3px 8px;font-size:11px;border-radius:6px;background:#f4f8f1;border-color:#dde8d8;color:#3f6b52}
.pg-acts button:hover{background:#e7f1e1}
.pitem{display:flex;gap:8px;align-items:flex-start;padding:7px 2px;border-bottom:1px solid #f0f4ee;cursor:pointer;font-size:12.5px;color:#33473c;line-height:1.5}
.pitem:last-child{border-bottom:0}
.pitem input{margin:2px 0 0;flex:0 0 auto;width:16px;height:16px;accent-color:#23765d;cursor:pointer}
.pitem span{min-width:0}
.pitem b{display:block;font-weight:600;color:#2f4b3d;font-size:12.5px}
.pitem small{display:block;color:#84928b;font-size:11px;line-height:1.45;margin-top:1px}
.pitem-lock{opacity:.72;cursor:default}
.pitem-lock input{cursor:not-allowed}
@media(max-width:680px){
  .uform-grid{grid-template-columns:1fr}
  .perm-head{flex-direction:column;gap:6px}
  .perm-tpl{width:100%}
  .perm-grid{grid-template-columns:1fr}
  .pitem{padding:10px 2px}
  .pitem input{width:18px;height:18px;margin-top:0}
}

/* ===== 岗位权限页 / 员工账号页分离（2026-10-27）===== */
.users-toolbar{display:flex;gap:8px;flex-wrap:wrap;margin:4px 0 10px}
.post-list{display:flex;flex-direction:column;gap:6px;margin-top:10px}
.post-row{display:flex;align-items:center;justify-content:space-between;gap:12px;
  border:1px solid #e3e9e0;border-radius:10px;background:#fbfdfa;padding:10px 12px;min-width:0}
.post-row>span{min-width:0;display:flex;flex-direction:column;gap:2px}
.post-row b{font-size:13.5px;color:#2f4b3d;font-weight:600;display:inline-flex;align-items:center;gap:6px}
.post-row small{font-size:11.5px;color:#84928b;line-height:1.5;overflow-wrap:break-word}
.post-tag{font-style:normal;font-size:10px;color:#5c7a67;background:#e9f2e5;border:1px solid #d6e5cf;
  border-radius:999px;padding:1px 7px;letter-spacing:.04em;font-weight:400}
.post-acts{display:flex;gap:6px;flex:0 0 auto}
.post-acts button{min-width:52px}
/* 岗位名 + 内置标签必须同一行（原来是 <b> 里套 <em>，被 flex 容器 blockify 后标签掉了行） */
.post-row .post-name{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;white-space:nowrap;min-width:0}
.post-row .post-name b{font-size:13.5px;color:#2f4b3d;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis}
/* 按钮列固定宽度右对齐：内置岗位只有「编辑」、自建岗位是「编辑/删除」，
   不锁宽度的话两个按钮会把「编辑」挤到左边，看着不齐 */
.post-acts{min-width:120px;justify-content:flex-end}
/* 员工账号页里「改这个岗位的权限」：放在权限标签下面靠右，不打断说明→标签的阅读顺序 */
.perm-more{display:flex;justify-content:flex-end;padding:0 0 12px}
/* 员工账号页里的「这个岗位能做什么」：只读，不能勾 */
.perm-readonly .perm-head{align-items:center}
.perm-readonly .perm-head h3{font-size:14px}
.perm-chips{display:flex;flex-wrap:wrap;gap:6px;padding:2px 0 10px}
.perm-chip{font-size:11.5px;color:#2f5a45;background:#eef5ea;border:1px solid #dbe8d4;
  border-radius:6px;padding:3px 9px;line-height:1.4}
@media(max-width:560px){
  .post-row{flex-direction:column;align-items:stretch;gap:8px}
  .post-acts{justify-content:flex-end}
  .post-acts button{flex:1;min-height:38px}
  .perm-chip{font-size:12px;padding:4px 10px}
}

/* ===== 员工账号：新建后要高亮，否则新行排在最后像"没存上"（2026-10-27）===== */
.account-list{margin-top:4px}
.account-row.is-new{background:#f0f7ec;border-radius:10px;padding-left:12px;padding-right:12px;
  border-bottom-color:transparent;box-shadow:inset 3px 0 0 #4e8566}
.new-tag{font-style:normal;margin-left:8px;font-size:10.5px;color:#2f6a4c;background:#dcefd3;
  border:1px solid #c7e2ba;border-radius:999px;padding:1px 7px;vertical-align:middle}
/* 底部「取消」按内容宽，主按钮占满剩余 */
.form-actions #cancelUser,.form-actions #cancelPost{flex:0 0 auto;min-width:96px}
@media(max-width:520px){
  .form-actions #cancelUser,.form-actions #cancelPost{flex:1 1 40%}
}

/* ===== 托大进食「未进餐」：选了之后食量组 + 附属选项卡整块灰掉（2026-10-27）=====
   ⚠️ 关键：pointer-events 必须加在**容器**上，不能只加在 .seg 上。
   否则 is-dim 的 .dr-seg-meal 容器仍占着 flex 空间，会盖在「未进餐」按钮上方、拦截点击 ——
   表现出来就是「点了未进餐之后，再点它取消不掉」 */
.dr-seg-meal.is-dim,.dr-seg.is-dim{pointer-events:none}
.dr-seg-meal.is-dim .seg,.dr-seg.is-dim .seg{opacity:.38;filter:grayscale(.4)}
.dr-seg-label.is-dim{opacity:.4}

/* ========== 员工账号表格（2026-10-27）==========
   列按截图固定：操作 / 用户名 / 真实姓名 / 所属部门 / 岗位 / 员工权限 / 状态。
   这一页从弹窗改成整页，7 列在 660px 的弹窗里放不下，所以整页 + 横向滚动，
   窄屏（≤680px）改成一账号一张卡片，字段名用 ::before 补出来。 */
.users-toolbar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:0 0 12px}
.users-toolbar input[type=search],.users-toolbar select{border:1px solid #dbe3da;border-radius:9px;background:#fff;color:#2f4b3d;padding:9px 12px;font-size:13.5px;line-height:1.3}
.users-toolbar input[type=search]{flex:1 1 220px;min-width:170px;max-width:340px}
.users-toolbar input[type=search]:focus,.users-toolbar select:focus{outline:2px solid #cfe2d5;border-color:#9dbfa9}
.users-toolbar select{flex:0 0 auto;min-width:126px}
.users-toolbar #userCount{margin-left:auto;white-space:nowrap}
.users-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:12px;background:#fff}
.users-table{width:100%;min-width:880px;border-collapse:collapse;table-layout:fixed}
.users-table th,.users-table td{padding:12px 14px;text-align:left;font-size:13.5px;border-bottom:1px solid var(--line);vertical-align:middle;overflow-wrap:anywhere;white-space:normal}
.users-table thead th{background:#f7faf6;color:#5d7069;font-weight:600;font-size:12.5px;letter-spacing:.02em;white-space:nowrap}
.users-table tbody tr:last-child td{border-bottom:0}
.users-table tbody tr:hover{background:#fafcf8}
.users-table tbody tr.is-self{background:#f6faf3}
.users-table .u-op{white-space:nowrap}
.users-table .u-name b{display:block;color:#2f4b3d;font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.users-table .u-op .linkbtn+.linkbtn{margin-left:14px}
.users-table td .hint{font-size:12px}
.linkbtn{border:0;background:none;padding:0;font-size:13px;line-height:1.5;color:var(--green)}
.linkbtn:hover{background:none;border:0;text-decoration:underline}
.linkbtn.danger{color:#b35b43}
.udept{color:#2f4b3d}
.uperm{color:#4a6157}
.uperm-all{display:inline-block;color:#8a6d2f;background:#fbf2dd;border:1px solid #eddcb4;border-radius:6px;padding:1px 7px;font-size:12px;white-space:nowrap}
.ustate{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;white-space:nowrap}
.ustate::before{content:'';width:6px;height:6px;border-radius:50%;background:#3f8f68}
.ustate.on{color:#2f6d4c}
.ustate.off{color:#9a6a5b}
.ustate.off::before{background:#c08a76}
.th-icon{border:0;background:none;padding:0 0 0 6px;font-size:13px;line-height:1;color:#84928b;vertical-align:middle}
.th-icon:hover{background:none;border:0;color:var(--green)}
.th-icon[aria-pressed=true]{color:var(--green)}
.users-empty{text-align:center;color:#84928b;padding:26px 0!important}
.users-foot{margin:10px 2px 0}
.pw-box{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:26px;letter-spacing:.14em;text-align:center;background:#f5f9f3;border:1px dashed #bcd3c3;border-radius:10px;padding:14px;margin:6px 0 10px;color:#235c46;user-select:all;-webkit-user-select:all}
@media(max-width:680px){
  .users-toolbar input[type=search]{max-width:none;flex:1 1 100%}
  .users-toolbar select{flex:1 1 46%}
  .users-toolbar #userCount{margin-left:0;flex:1 1 100%}
  .users-table-wrap{border:0;background:none;overflow:visible}
  .users-table{min-width:0;display:block;table-layout:auto}
  .users-table thead{display:none}
  .users-table tbody{display:block}
  .users-table tr{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:12px;background:#fff;margin-bottom:10px;padding:10px 13px}
  .users-table tbody tr:hover,.users-table tbody tr.is-self{background:#fff}
  .users-table td{border:0;padding:5px 0;display:flex;gap:10px;align-items:baseline;justify-content:space-between;flex-wrap:wrap;text-align:right;overflow-wrap:anywhere}
  .users-table td::before{content:attr(data-label);flex:0 0 68px;text-align:left;color:#84928b;font-size:12.5px}
  .users-table td.u-name{order:-1;justify-content:flex-start;padding:0 0 8px;margin-bottom:4px;border-bottom:1px dashed var(--line)}
  .users-table td.u-name::before{content:none}
  .users-table td.u-name b{font-size:15.5px}
  .users-table td.u-op{order:9;border-top:1px solid var(--line);margin-top:6px;padding-top:10px;justify-content:flex-start}
  .users-table td.u-op::before{content:none}
  .users-table td.u-op .linkbtn{font-size:13px}
}

/* 刚创建的那一行：淡绿底 + 左侧竖条 + 「刚创建」小标（沿用弹窗时代的高亮，换成表格后不能丢） */
.users-table tbody tr.is-new{background:#f0f7ec;box-shadow:inset 3px 0 0 #79a38c}
.users-table tbody tr.is-new:hover{background:#eaf4e5}
.new-tag{display:inline-block;margin-left:7px;font-style:normal;font-size:10.5px;line-height:1.5;color:#2f6d4c;background:#e2f0d9;border-radius:5px;padding:0 5px;vertical-align:1px}

/* ========== 一日流程「必填」（2026-10-27）==========
   班级设置里每个已勾选的模块多一个「必填」小勾；老师的一日记录卡片标题上挂红标，
   保存时缺项会被拦住并滚到那张卡片（.req-flash 闪一下边框）。 */
.modreq{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border:1px dashed #e0d3b4;border-radius:7px;
  background:#fdfaf1;color:#9a7b3d;font-size:11.5px;line-height:1.2;cursor:pointer;white-space:nowrap;user-select:none}
.modreq:hover{border-color:#d8c193;background:#fbf4e2}
.modreq input{width:13px;height:13px;margin:0;accent-color:#b8762a;cursor:pointer;flex:0 0 auto}
.modreq.on{background:#fbf1dc;border-style:solid;border-color:#e2c793;color:#8a5f1c;font-weight:600}
@media(max-width:520px){
  .modrow{flex-wrap:wrap}
  .modreq{padding:5px 9px;font-size:12px}
}

/* 卡片标题上的红标 */
.req-badge{display:inline-block;margin-left:7px;padding:1px 6px;border-radius:5px;background:#fbe4dc;color:#b03a24;
  font-style:normal;font-size:10.5px;font-weight:600;line-height:1.6;vertical-align:2px}
/* 保存被拦时闪一下，告诉老师「就是这张」 */
@keyframes reqFlash{0%,100%{box-shadow:0 0 0 0 rgba(192,69,46,0)}35%{box-shadow:0 0 0 3px rgba(192,69,46,.55)}}
.dcard.req-flash{animation:reqFlash 1.6s ease-in-out 1;border-color:#e0a08f}
/* 大屏：必填没填的孩子，按钮描一圈红边 + 摘要里的红底提示 */
.board-mode button.daily-btn.req-miss{border-color:rgba(224,132,108,.95);box-shadow:inset 0 0 0 1px rgba(224,132,108,.5)}
.brief-empty.brief-miss{color:#ffc4b3;font-weight:600}

/* 侧边栏底部账号区改成可点击的「改密码」入口（2026-10-27）*/
.sidebar-bottom>button.user{width:100%;background:transparent;border:0;border-top:1px solid var(--line);border-radius:0;padding:22px 8px 4px;margin-top:20px;text-align:left;cursor:pointer;color:inherit;font:inherit}
.sidebar-bottom>button.user:hover #sidebarIdentity{color:var(--green)}
.sidebar-bottom>button.user:focus-visible{outline:2px solid var(--green);outline-offset:-2px}

/* 「修改密码」只在窄屏（侧边栏塌成底部 tab、账号区隐藏）显示，桌面走侧边栏账号区 */
.only-narrow{display:none}
@media(max-width:680px){
.only-narrow{display:inline-flex}
}

/* ============================================================
   侧边栏视觉改版 V2（2026-10-27）
   ① 图标从 Unicode 字符（⌂ ♧ ▤ ◎ ▦ ✦ ❝ ✎ ▣ ◫）换成内联 SVG 线性图标：
      这些字符来自不同 Unicode 区，Windows / iOS 渲染的粗细与基线各不相同，
      整排看过去是「拼凑感」的最大来源。
   ② 分三组：日常工作 / 沟通与记录 / 团队成长（整组无权限时标题一起藏，
      见 app.js 里 applyPermNav 之后那几行）。
   ③ 选中态改成「柔光绿底 + 内描边 + 图标反白方块」；原来的 inset 3px 左边条
      硬切在圆角矩形边缘上，视觉上像被削掉一角。
   ④ 中部 nav 独立滚动：原来 1024×768 时底部账号区会掉到视口外（实测 bottom 799 > 768）。
   ⑤ ≤680px 底部 Tab 栏原来 10 项总宽 403px，390px 屏最后一个「入园交接」被切掉，
      改成横向可滑。
   ============================================================ */

/* 图标统一走 currentColor，随 hover / active 变色 */
.sidebar svg{display:block;width:100%;height:100%;fill:none;stroke:currentColor;
  stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.sidebar nav button i{display:grid;place-items:center;flex:0 0 auto}

@media(min-width:681px){
  .sidebar{padding:26px 14px 14px;
    background:linear-gradient(176deg,#ffffff 0%,#fcfdfb 48%,#f5f9f4 100%);
    border-right:1px solid #e2e9e1;
    box-shadow:10px 0 28px -26px rgba(24,74,54,.5)}
  .brand{gap:9px;font-size:19px;letter-spacing:.9px;color:#205848}
  .brand-logo{max-width:170px}
  .brand small{font-size:9px;letter-spacing:2.6px;color:#94a49b;margin-top:3px}

  /* 中部独立滚动，底部账号区永远贴在视口底部 */
  .nav-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;
    margin:0 -8px;padding:2px 8px 10px;overscroll-behavior:contain;
    scrollbar-width:thin;scrollbar-color:#d6e2d1 transparent}
  .nav-scroll::-webkit-scrollbar{width:4px}
  .nav-scroll::-webkit-scrollbar-thumb{background:#d6e2d1;border-radius:4px}
  .nav-scroll::-webkit-scrollbar-track{background:transparent}

  .nav-label{font-size:10.5px;letter-spacing:1.6px;color:#8d9e94;font-weight:600;
    margin:15px 0 6px;padding-left:11px}
  .nav-scroll>.nav-label:first-child{margin-top:10px}
  .nav-scroll nav+.nav-label{margin-top:16px}

  nav{gap:2px}
  nav button{position:relative;gap:10px;padding:6px 10px;min-height:34px;
    border-radius:10px;font-size:13.5px;color:#4e6055;
    transition:background .16s ease,color .16s ease}
  nav button i{width:25px;height:25px;border-radius:7px;color:#6d8478;
    transition:background .18s ease,color .18s ease,box-shadow .18s ease}
  nav button i svg{width:18px;height:18px}
  nav button:hover{background:#eef5eb;color:#22483a}
  nav button:hover i{color:#1f6b52}
  nav button.active{background:linear-gradient(96deg,#e3efdf,#edf5e9);
    color:#195741;font-weight:600;
    box-shadow:inset 0 0 0 1px #cde1c7,0 2px 8px -3px rgba(35,118,93,.35)}
  nav button.active i{background:linear-gradient(150deg,#2b8a68,#1d6b51);color:#fff;
    box-shadow:0 3px 9px -2px rgba(29,107,81,.55)}
  nav button.active i svg{stroke-width:1.95}

  /* 角标：原来绝对定位相对 .sidebar（右侧 8px），跟具体项无关；改成相对按钮 */
  nav button i.nav-badge{position:absolute;right:7px;top:50%;transform:translateY(-50%);
    width:auto;height:auto;min-width:18px;padding:2px 5px;border-radius:999px;
    background:#cf7b3d;color:#fff;font-style:normal;font-weight:700;font-size:10px;
    line-height:1.4;letter-spacing:0;box-shadow:0 0 0 2px #fff}
  nav button.active i.nav-badge{box-shadow:0 0 0 2px #e9f3e6}

  .sidebar-bottom{flex:0 0 auto;margin-top:6px;padding-top:8px;border-top:1px solid #edf1ea}
  .sidebar-bottom>button{font-size:13px;color:#66766c;padding:8px 10px;gap:10px;border-radius:10px}
  .sidebar-bottom>button i{width:24px;height:24px;display:grid;place-items:center;
    color:#93a49a;border-radius:7px;transition:background .18s,color .18s}
  .sidebar-bottom>button i svg{width:17px;height:17px}
  .sidebar-bottom>button:hover{background:#f1f7ef;color:#26493a}
  .sidebar-bottom>button:hover i{color:#23765d}
  /* 「权限与同步」被选中时原来没有任何反馈，补上 */
  .sidebar-bottom>button.active{background:linear-gradient(96deg,#e6f1e3,#eef6ea);
    color:#1c5a44;font-weight:600;box-shadow:inset 0 0 0 1px #d4e5cf}
  .sidebar-bottom>button.active i{background:#23765d;color:#fff}

  /* 账号区：.sidebar-bottom>button.user 权重是 0,1,2，必须照同样写法覆盖 */
  .sidebar-bottom>button.user{margin-top:4px;padding:12px 8px 2px;border-top:0;border-radius:10px}
  .sidebar-bottom>button.user:hover{background:#eef5eb}
  .sidebar .avatar{width:34px;height:34px;border-radius:11px;font-size:15px;font-weight:600;
    background:linear-gradient(145deg,#eaf2e5,#d9e8d3);color:#3a775c;
    box-shadow:inset 0 0 0 1px rgba(35,118,93,.13)}
  .sidebar #sidebarIdentity{font-size:13px;font-weight:600;color:#2f4a3c}
  .sidebar #sidebarIdentity small{font-weight:400;font-size:10px;color:#9aa89f;margin-top:3px}
}

/* ≤680px：底部 Tab 横向可滑，不再把最后一项切出屏幕 */
@media(max-width:680px){
  .nav-scroll{display:flex;align-items:center;flex:1 1 auto;min-width:0;
    overflow-x:auto;overflow-y:hidden;padding-right:4px;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
    -webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 16px),transparent 100%);
    mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 16px),transparent 100%)}
  .nav-scroll::-webkit-scrollbar{display:none;height:0}
  .nav-scroll nav{display:contents}
  .nav-scroll .nav-label{display:none}
  nav button{position:relative;flex:0 0 auto;min-width:40px;padding:5px 6px;gap:3px}
  nav button i{width:19px;height:19px;border-radius:6px}
  nav button i svg{width:19px;height:19px}
  nav button.active{background:#e7f1e4;box-shadow:none}
  nav button.active i{background:transparent;box-shadow:none}
  nav button span{font-size:9.5px;letter-spacing:-.2px}
  /* 这个选择器权重要和上面的 nav button i 对齐，位置才能盖住第 168 行的 static */
  nav button i.nav-badge{position:absolute;right:2px;top:2px;transform:none;
    width:auto;height:auto;min-width:14px;padding:1px 3px;font-size:8.5px;
    box-shadow:0 0 0 1.5px #fff}
}

/* ============================================================
   品牌文字块从侧栏搬到顶栏（2026-10-27）
   原来「森可托育 / SCENIC · 托育工作台」压在侧栏 logo 下面，跟 logo 图案里的
   品牌名重复了一遍；搬到顶栏后侧栏只剩 logo，品牌锚点在页头，
   正好落在「工作空间 / 当前页」左边，一眼能看到「我在哪个产品里、在哪个页面」。
   手机端 header 只有 60px 高、还要留位置给视图名，品牌块直接隐藏（用 mobile-logo 顶替）。
   ============================================================ */
@media(min-width:681px){
  .header-title{gap:0}
  .header-brand{display:flex;flex-direction:column;line-height:1.12;flex:0 0 auto;
    color:#1d5644;font-size:15px;font-weight:700;letter-spacing:.9px;padding-right:15px}
  .header-brand small{font-size:8px;font-weight:500;letter-spacing:1.75px;
    color:#8fa197;margin-top:4px;white-space:nowrap}
  .header-sep{width:1px;height:28px;background:#e2e9e1;flex:0 0 auto;margin-right:13px}
  .header-title .breadcrumb{font-size:11px;letter-spacing:.2px}
  header #viewName{font-size:13px;font-weight:600;color:#3a5748}
  /* 侧栏只剩 logo，把顶部留白收一点，别让 logo 悬在半空 */
  .sidebar .brand{padding-bottom:2px}
  .sidebar .brand-logo{max-width:168px}
}
@media(max-width:680px){
  .header-brand,.header-sep{display:none!important}
}

/* ============================================================
   修：主页统计卡把整页撑宽（2026-10-27 发现，同日修）
   `.stats` 原来写的是 repeat(4,1fr)，而 1fr 等价于 minmax(auto,1fr)，
   最小宽度取内容的 min-content —— 「班级数」那张卡里十几个班名连成一串，
   把一列顶到 559px，整页跟着横向溢出：
     · 桌面 1280：实际文档宽 1585，第 3、4 张统计卡被切在屏幕外
     · 手机 390：Chrome 把 layout viewport 撑成 innerWidth=863，于是 app.js 里
       「innerHeight - visualViewport.height > 140」误判成软键盘弹出 →
       body.kb-open → .sidebar{display:none}，老师手机上底部导航整条消失
   改成 minmax(0,1fr) 后实测：桌面 docW 1280、手机 iw 390 且底栏恢复，
   卡片高度一个像素都没变（145 / 125）。这就是项目里「grid 一律 minmax(0,1fr)」那条。
   注意：不要顺手加 white-space:nowrap + 省略号，那会把 span 变成块级、卡片被撑高 17px。
   ============================================================ */
.stats{grid-template-columns:repeat(4,minmax(0,1fr))}
@media(max-width:1100px){.stats{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:680px){.stats,.stats.mestats{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* 员工之声迷你卡列表同理：单列 grid 的 1fr 也会被长文案顶宽 */
.voe-mini-list{grid-template-columns:minmax(0,1fr)}
.voe-mini,.voe-mini-body{min-width:0}

/* ============================================================
   喝奶记录「今日未喝奶」（2026-10-28）
   孩子今天在园没喝奶（晚到、家长自带母乳没记、拒奶）也要能记一笔 ——
   点一颗按钮，就把这张卡的时间 / 奶量 / 快捷奶量 / 现在 / 删除全部灰掉，
   不用逐行留空，报表里也只出「今日未喝奶」一行。
   ⚠️ 灰化机关跟「未在园区大便」的 dimSegsOn 同源：pointer-events 加在**行容器**上，
   不能只加在输入框上 —— 否则容器仍占着位置、盖在按钮上方，点不到也取消不掉。
   ============================================================ */
.dflag-row{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin:-1px 0 9px}
.dflag{position:relative;display:inline-flex;align-items:center;gap:7px;
  font-size:12px;line-height:1;padding:6px 12px 6px 10px;border-radius:15px;
  border:1px solid #dde5da;background:#fff;color:#6b7d71;white-space:nowrap;
  transition:background .16s ease,border-color .16s ease,color .16s ease}
/* 按钮左侧那个小圆点：未点时空心，点了变实心暖橙（跟侧栏角标同一族的暖色） */
.dflag::before{content:'';width:7px;height:7px;border-radius:50%;
  border:1.5px solid #c3cfc0;background:transparent;transition:background .16s ease,border-color .16s ease}
.dflag:hover{border-color:#bcd2b8;color:#2f6b4c}
.dflag:hover::before{border-color:#8fb392}
.dflag.on{background:#fdf3ea;border-color:#eccfb6;color:#a9612f;font-weight:600}
.dflag.on::before{background:#d9813f;border-color:#d9813f}
.dflag-row small{font-size:10.5px;color:#98a69b;line-height:1.3}
.dflag.on+.dflag-row small,.dflag-row:has(.dflag.on) small{color:#b98559}

/* 记录行整块灰掉：行容器不接指针（按钮、下拉、输入框全都点不动），视觉压到 42% */
.drow.is-off{pointer-events:none;opacity:.42;filter:grayscale(.55)}
.drow.is-off .dr-no{opacity:.7}

/* ============================================================
   托大进食「加餐」后的「加了什么」下拉（2026-10-28）
   食量选「加餐」时，紧跟这个按钮后面出现一个下拉（饭 / 菜 / 汤）。
   跟「少量进食 → 余饭 / 余菜 / 余饭菜」是同一套联动，只是那个是按钮组、这个是下拉框
   （同一行有三个以上选项又要占位小，下拉比一排按钮省地方）。
   配色沿用那几个附属选项的暖色系（#fdf6ec / #ecd8b8 / #8a5a2e），一眼看出是附属信息。
   ============================================================ */
.dr-sel-sub{flex:0 0 auto;display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap}
.dr-sel-sub.hidden{display:none}
/* 自己填写的那个框（2026-10-28 第二轮：原来固定下拉只有饭/菜/汤，填不了「苹果泥」这种） */
.dr-extra{font-size:12px;line-height:1.2;padding:6px 9px;border-radius:15px;
  border:1px solid #ecd8b8;background:#fdf6ec;color:#8a5a2e;width:134px;font-family:inherit;
  transition:border-color .16s ease,box-shadow .16s ease,background .16s ease}
.dr-extra::placeholder{color:#c0a37f}
.dr-extra:hover{border-color:#ddbe92}
.dr-extra:focus{outline:none;border-color:#d9a45c;background:#fffaf3;box-shadow:0 0 0 2px rgba(217,164,92,.2)}
/* 旁边三颗快捷按钮：点一下填进框里，再点一次取消；也可以完全不理它自己打字 */
.dr-extra-chips{display:inline-flex;gap:4px}
.dr-extra-chip{font-size:11.5px;line-height:1;padding:5px 9px;border-radius:12px;cursor:pointer;
  border:1px solid #ecd8b8;background:#fff;color:#a9713a;
  transition:background .14s ease,border-color .14s ease,color .14s ease}
.dr-extra-chip:hover{background:#fdf6ec;border-color:#e0c49c}
.dr-extra-chip.on{background:#d9a45c;border-color:#d9a45c;color:#fff;font-weight:600}
/* ⚠️ 输入框宽度写死（134 / 手机 118），不能只给 max-width：
   否则老师打两个字和打八个字时框宽不同，同一行后面的「光盘 / 大部分吃完」会左右跳。
   选了「未进餐」时整组进食量灰掉，这个框跟着不接点击（pointer-events 由父组继承）。 */
@media(max-width:680px){
  .dr-extra{width:118px;padding:6px 8px}
  .dr-extra-chip{padding:5px 7px}
}

/* ============================================================
   生长发育参考值（2026-10-28）
   把《7 岁以下儿童生长标准》WS/T 423—2022 的百分位表接进体格测量：
     · 录入时每个数值旁边给一行「同月龄对照」：数值 + 刻度条位置 + 等级 + 参考区间
     · 历次记录每个数值下面挂一个小等级标（按那条记录当天的月龄算）
     · 顶栏「参考值」打开完整百分位表（男女 × 身长/身高·体重·头围）
     · 整页顶部有一块「生长偏离，建议关注」——只有 <P3 / >P97 才进来
   配色沿用模块现有那套：绿＝正常（#4d7a52/#eef5e9），
   暖橙＝要留意（#b05e33/#fdf3e4），黄褐＝中下/中上这种「不必紧张但记着」。
   注意 .me-ref-band 与 .me-ref-track b 的颜色都由祖先的 .t-alert / .t-note 决定 ——
   等级只在一处判定（growth.js 的 growthJudge），样式不重复判断一遍。
   ============================================================ */

/* ---------- 表单里的同月龄对照 ---------- */
.me-ref{margin:4px 0 14px;padding:11px 13px;border-radius:12px;
  background:#f8fbf5;border:1px solid #e4eddd}
.me-ref-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:9px}
.me-ref-head b{font-size:12.5px;font-weight:600;color:#2d5541}
.me-ref-head span{font-size:11.5px;color:#41714f;background:#e8f2e3;border-radius:9px;padding:2px 8px}
.me-ref-head small{font-size:10.5px;color:#9aa89f;letter-spacing:.3px}
.me-ref-all{margin-left:auto;flex:0 0 auto;font-size:11.5px;padding:4px 10px;border-radius:9px;
  border:1px solid #d5e2cd;background:#fff;color:#3f6f52}
.me-ref-all:hover{background:#eef5e9;border-color:#c3d8ba}

.me-ref-rows{display:grid;gap:6px}
.me-ref-row{display:grid;grid-template-columns:34px 62px minmax(64px,1fr) 40px minmax(0,auto);
  align-items:center;gap:9px}
.me-ref-k{font-size:12px;color:#66766c}
.me-ref-v{font-size:13px;font-weight:600;color:#2f4a3c;font-variant-numeric:tabular-nums}
.me-ref-v small{font-size:10px;font-weight:400;color:#93a49a;margin-left:1px}
/* 刻度条：7 个百分位锚点当刻度，圆点是这位孩子的位置 */
.me-ref-track{position:relative;height:6px;border-radius:4px;min-width:44px;
  background:linear-gradient(90deg,#f4f8f0 0%,#e6efdf 4%,#e6efdf 96%,#f4f8f0 100%)}
.me-ref-track i{position:absolute;top:-3px;width:1px;height:12px;background:#cfdcc7}
.me-ref-track b{position:absolute;top:50%;width:9px;height:9px;margin:-4.5px 0 0 -4.5px;
  border-radius:50%;background:#4f8a63;box-shadow:0 0 0 2px #f8fbf5}
.me-ref-row.t-alert .me-ref-track b{background:#c1673a}
.me-ref-row.t-note .me-ref-track b{background:#8a7a48}
.me-ref-band{font-style:normal;font-size:11px;font-weight:600;text-align:center;
  padding:2px 0;border-radius:7px;background:#eef5e9;color:#4d7a52;border:1px solid #dbe8d3}
.me-ref-row.t-alert .me-ref-band{background:#fdf3e4;color:#b05e33;border-color:#f0dcc4}
.me-ref-row.t-note .me-ref-band{background:#f7f7ee;color:#7d7a4a;border-color:#e7e7d4}
.me-ref-cmp{font-size:10.5px;color:#9aa89f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.me-ref-row.empty{opacity:.58}
.me-ref-row.empty .me-ref-band{background:#f4f6f3;color:#9aa89f;border-color:#e6ebe3}
.me-ref-note{margin:9px 0 0;font-size:10.5px;line-height:1.65;color:#98a69b}
.me-ref-note b{color:#6b7d71}

/* ---------- 历次记录里的小等级标 ---------- */
.me-grade{display:inline-block;margin-left:4px;font-style:normal;font-size:9.5px;line-height:1.6;
  padding:0 4px;border-radius:5px;background:#eef5e9;color:#4d7a52;vertical-align:1px;white-space:nowrap}
.me-grade.t-alert{background:#fdf3e4;color:#b05e33}
.me-grade.t-note{background:#f7f7ee;color:#7d7a4a}

/* ---------- 整页：生长偏离 ---------- */
.me-alert{border-color:#f0dcc4;background:#fffdf9}
.me-alert .panel-head h2{color:#8f5228}
.me-alert-list{display:grid;gap:6px;margin:2px 0 0}
.me-alert-row{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;
  align-items:center;gap:10px;text-align:left;padding:9px 11px;border-radius:10px;
  border:1px solid #f2e4d2;background:#fff;transition:background .14s ease,border-color .14s ease}
.me-alert-row:hover{background:#fffaf2;border-color:#e8d3ba}
.me-alert-row b{font-size:13px;color:#2f4a3c;font-weight:600;white-space:nowrap}
.me-alert-flags{display:flex;gap:5px;flex-wrap:wrap}
.me-alert-flags em{font-style:normal;font-size:10.5px;padding:2px 7px;border-radius:7px;
  background:#fdf3e4;color:#b05e33;border:1px solid #f0dcc4;white-space:nowrap}
.me-alert-vals{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:#4a5f52;font-variant-numeric:tabular-nums}
/* 每项数值和它的参考区间要上下两行 —— .me-alert-vals 是 flex，直接塞文本节点 + small 会并排挤成
   「80cm参考 81.4~92.7」，所以中间包一层 .me-alert-val 再让它自己纵向排 */
.me-alert-val{display:flex;flex-direction:column;line-height:1.35}
.me-alert-val small{font-size:9.5px;color:#9aa89f}
.me-alert-when{font-size:10.5px;color:#9aa89f;white-space:nowrap}
.me-alert-tip{margin:10px 0 0;font-size:11px;line-height:1.75;color:#98a69b}
.me-miss{margin:-6px 0 16px;padding-left:2px}

/* ---------- 参考值全表 ---------- */
#meRefDlg{width:min(760px,calc(100vw - 28px));max-height:92vh;max-height:92dvh;border:0;
  border-radius:18px;padding:0;background:#fff;color:#354b3d;
  box-shadow:0 25px 90px #1b2f2833;overflow:hidden}
#meRefDlg[open]{display:flex;flex-direction:column}
#meRefDlg::backdrop{background:rgba(20,37,31,.72);backdrop-filter:blur(3px)}
.merf-mask{display:none;pointer-events:none}
html.merf-open #meRefDlg[open]{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:962}
html.merf-open .merf-mask{display:block;position:fixed;inset:0;z-index:961;background:rgba(20,37,31,.72)}
.merf-head{display:flex;align-items:center;gap:10px;padding:13px 18px;border-bottom:1px solid #edf1ea;flex:0 0 auto}
.merf-head b{font-size:15px;color:#22483a}
.merf-src{font-size:10.5px;color:#8d9e94;letter-spacing:.3px}
.merf-x{margin-left:auto;border:0;background:transparent;font-size:15px;color:#93a49a;
  cursor:pointer;padding:3px 7px;border-radius:8px}
.merf-x:hover{background:#f2f6ee;color:#3f6f52}
.merf-tabs{display:flex;gap:6px;flex-wrap:wrap;padding:10px 18px 0;flex:0 0 auto}
.merf-tabs-key{padding-top:7px}
.merf-tabs button{font-size:12px;padding:5px 12px;border-radius:9px;cursor:pointer;
  border:1px solid #e2e9e1;background:#fff;color:#5d7260;transition:background .14s,border-color .14s,color .14s}
.merf-tabs button:hover{background:#f4f8f0}
.merf-tabs button.on{background:#e9f2e4;border-color:#c3d8ba;color:#2b6349;font-weight:600}
.merf-body{flex:1 1 auto;min-height:0;overflow:auto;padding:12px 18px 6px}
.merf-cap{margin:0 0 8px;font-size:11.5px;color:#8d9e94}
.merf-table{width:100%;border-collapse:collapse;font-size:12px;font-variant-numeric:tabular-nums}
.merf-table th,.merf-table td{padding:5px 8px;text-align:right;border-bottom:1px solid #f1f5ee;white-space:nowrap}
.merf-table th:first-child,.merf-table td:first-child{text-align:left;color:#5d7260}
.merf-table thead th{position:sticky;top:0;z-index:1;background:#fafcf8;color:#7e8f84;font-weight:600;font-size:11px}
.merf-table .p50{background:#f6faf2;font-weight:600;color:#2b6349}
.merf-table tr.on td{background:#fdf6e9}
.merf-table tr.on td:first-child{color:#a9713a;font-weight:600}
.merf-mark{margin:8px 0 0;font-size:11px;color:#a9713a}
.merf-foot{flex:0 0 auto;max-height:32vh;overflow:auto;padding:10px 18px 14px;
  border-top:1px solid #edf1ea;background:#fbfdf9;font-size:11px;line-height:1.75;color:#7b8a80}
.merf-foot p{margin:0 0 5px}
.merf-foot b{color:#5d7260}
.merf-src2{font-size:10.5px;color:#9aa89f}

@media(max-width:680px){
  /* 手机：刻度条挤不下参考区间，把它折到第二行；等级和数值留在第一行 */
  .me-ref-row{grid-template-columns:32px 56px minmax(44px,1fr) 36px;row-gap:3px}
  .me-ref-cmp{grid-column:1/-1}
  .me-ref-head small{display:none}
  .me-alert-row{grid-template-columns:minmax(0,1fr) auto;row-gap:6px}
  .me-alert-when{grid-column:2;grid-row:1;justify-self:end}
  .me-alert-flags{grid-column:1/-1}
  .me-alert-vals{grid-column:1/-1;gap:10px}
  #meRefDlg{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0}
  .merf-foot{max-height:20vh;font-size:10.5px}
  .merf-body{padding:10px 12px 6px}
  .merf-head,.merf-tabs,.merf-foot{padding-left:12px;padding-right:12px}
}

/* ===== 入园交接 7 步流程（2026-10-28）=====
   1) 列表页顶部的「流程」条：7 个阶段各显示份数，点一下只看那一段（等于筛选）；
   2) 详情页的流程条：做过打勾、当前高亮、往后灰着；
   3) 四个动作弹窗里的小控件（方式/结论按钮、同时建档勾选、老师列表）。
   桌面横排、手机竖排：窄屏上 7 个圆点横着排会把「分配班级老师」挤成两行，竖着反而清楚。 */
.stats.ho-stats{grid-template-columns:repeat(4,minmax(0,1fr))}
.ho-sum-i.ho-sum-sm b{font-size:19px}
.ho-sum-i.ho-sum-sm small{font-size:10.5px}

/* 流程图（2026-10-28 放在「入园交接」标题右边，page-aside 里）
   一行 7 个节点，格宽均分（grid repeat(7,minmax(0,1fr))），箭头用伪元素画在格子间隙里 ——
   这样窗口再窄也不会溢出，只会让节点文字换行。颜色按角色分（--rc/--rbg）。
   节点三层：① 步号 + 份数 ② 这一步叫什么 ③ 归谁做。点节点＝只看这一段。 */
.page-aside{flex:1 1 520px;min-width:0;display:flex;justify-content:flex-end}
.ho-flowchart{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));width:100%;max-width:900px}
.ho-fc{position:relative;min-width:0;margin-right:13px;display:flex;flex-direction:column;gap:3px;padding:7px 9px 8px;border:1px solid #e4ebe0;border-radius:10px;background:#fff;text-align:left;transition:border-color .15s,box-shadow .15s,background .15s}
.ho-fc:last-child{margin-right:0}
.ho-fc:not(:last-child)::after{content:'';position:absolute;right:-11px;top:50%;width:8px;height:8px;border-top:1.4px solid #b7c5b5;border-right:1.4px solid #b7c5b5;transform:translateY(-50%) rotate(45deg)}
.ho-fc-top{display:flex;align-items:center;justify-content:space-between;gap:5px;min-height:16px}
/* 序号：不带底色的小字，别跟右上角的份数长成一个样（2026-10-29 园长反馈） */
.ho-fc-no{flex:0 0 auto;font-size:10.5px;font-weight:700;color:#c3cec2;letter-spacing:.4px;font-variant-numeric:tabular-nums}
/* 份数：实心胶囊 + 「份」字；这一步没有单时整个不渲染（见 hoChart） */
.ho-fc-cnt{min-width:0;height:16px;padding:0 5px;border-radius:8px;display:inline-flex;align-items:center;gap:1px;font-size:10.5px;font-weight:700;background:var(--rc);color:#fff;font-variant-numeric:tabular-nums;line-height:1}
.ho-fc-cnt i{font-style:normal;font-size:9px;font-weight:500;opacity:.9;transform:translateY(.5px)}
.ho-fc-name{font-size:12.5px;font-weight:600;color:#41604f;line-height:1.3;letter-spacing:.3px;white-space:nowrap}
.ho-fc-who{font-size:10.5px;color:var(--rc,#909c8d);opacity:.85;line-height:1.3;white-space:nowrap}
.ho-fc.r-sales{--rc:#2f7a56;--rbg:#eef7f1}
.ho-fc.r-sup{--rc:#2f6a8c;--rbg:#ecf3f8}
.ho-fc.r-boss{--rc:#a2742a;--rbg:#fbf4e5}
.ho-fc.r-teacher{--rc:#6b5ca8;--rbg:#f3f0fb}
.ho-fc.r-campus{--rc:#5b6b62;--rbg:#f1f4f1}
.ho-fc.has .ho-fc-name{color:#2c5343}
.ho-fc.on{border-color:var(--rc);background:var(--rbg);box-shadow:inset 0 0 0 1px var(--rc)}
.ho-fc.on .ho-fc-no{color:var(--rc)}
.ho-fc.on .ho-fc-who{color:var(--rc)}
.ho-fc:hover{border-color:var(--rc);background:var(--rbg)}
#hoNew{white-space:nowrap}
.ho-filters-hint{margin-left:auto;font-size:11px;color:#a8b2a5}
.ho-filters-now{margin-left:auto;font-size:11px;color:#5d7a66;background:#eef7f1;border:1px solid #d7e8dc;border-radius:20px;padding:5px 11px}

.ho-st.progress{background:#eaf3ef;color:#37765a;font-weight:600}
.ho-step-line{color:#5d7260}
.ho-step-line b{color:#2c5343}
.ho-flow-line{color:#4a6b57}
.ho-flow-line b{color:#2c5343}
.ho-when{color:#9aa79f;font-size:11px;margin-left:6px}

.ho-steps{list-style:none;margin:8px 0 0;padding:0;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:0}
.ho-step{position:relative;display:flex;flex-direction:column;align-items:center;gap:7px;padding:0 4px;text-align:center;min-width:0}
.ho-step:before{content:'';position:absolute;top:13px;left:-50%;width:100%;height:2px;background:#e6ece3;z-index:0}
.ho-step:first-child:before{display:none}
.ho-step.done:before,.ho-step.now:before{background:#a9ceb8}
.ho-step-dot{position:relative;z-index:1;width:27px;height:27px;flex:0 0 auto;border-radius:50%;display:grid;place-items:center;font-size:12px;background:#f4f6f1;color:#a3ada0;border:1px solid #e6ece3}
.ho-step.done .ho-step-dot{background:#eaf4e7;color:#377650;border-color:#c4decb}
.ho-step.now .ho-step-dot{background:#23765d;color:#fff;border-color:#23765d;box-shadow:0 0 0 3px #dcefe3}
.ho-step-txt{min-width:0}
.ho-step-txt b{display:block;font-size:12px;font-weight:600;color:#3c5647;line-height:1.35;overflow-wrap:anywhere}
.ho-step-txt small{display:block;font-size:10.5px;color:#9aa79c;margin-top:2px;line-height:1.35;overflow-wrap:anywhere}
.ho-step.todo .ho-step-txt b{color:#9aa79c;font-weight:500}
.ho-steps.is-dead .ho-step-dot{background:#f6f6f3;color:#bcc4ba;border-color:#eceeeb}
.ho-steps.is-dead .ho-step-txt b{color:#adb6ab;text-decoration:line-through}
.ho-step-hint{margin:14px 0 0;font-size:12.5px;color:#54695a;background:#f6faf3;border:1px solid #e6eee2;border-radius:9px;padding:9px 12px;line-height:1.7}

.ho-seg-btn{font-size:12.5px;padding:9px 14px;border-radius:8px;border:1px solid var(--line);background:#fafbf8;color:#4a6b57}
.ho-seg-btn.on{border-color:#3f8f68;background:#eef7f1;color:#23765d;font-weight:600;box-shadow:inset 0 0 0 1px #3f8f68}
.ho-check{display:flex;align-items:flex-start;gap:9px;margin:16px 0 2px;font-size:12.5px;color:#4a6b57;line-height:1.65}
.ho-check input{width:17px;height:17px;margin:1px 0 0;flex:0 0 auto;accent-color:#23765d}
.ho-pick-list.ho-teach-list{grid-template-columns:repeat(3,minmax(0,1fr))}

/* 1120 以下标题行放不下「标题 + 7 个节点 + 新建按钮」：
   流程图整体换到第二行、占满整宽（节点反而更宽），按钮回到标题右侧一行显示。 */
@media(max-width:1120px){
  .page-title{flex-wrap:wrap}
  .page-aside{order:3;flex:1 1 100%;justify-content:flex-start}
  .ho-flowchart{max-width:none}
}

@media(max-width:680px){
  .stats.ho-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ho-sum-i.ho-sum-sm{display:none}
  /* 流程条横着放会挤成一团：手机上改成竖向时间线 */
  .ho-steps{grid-template-columns:1fr;gap:1px;margin-top:4px}
  .ho-step{flex-direction:row;align-items:center;gap:11px;text-align:left;padding:7px 2px}
  .ho-step:before{display:none}
  .ho-step-txt b{font-size:12.5px}
  .ho-step-txt small{display:inline;margin-left:7px}
  /* 手机上 7 个节点横排只剩 45px 宽，字会竖着掉下来：改 4 列网格，
     箭头不画（换行处的箭头会指错方向），靠步号 1~7 看先后 */
  .page-aside{flex:1 1 100%;justify-content:stretch}
  .ho-flowchart{grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
  .ho-fc{margin-right:0;padding:6px 8px;gap:2px}
  .ho-fc:not(:last-child)::after{display:none}
  .ho-fc-name{font-size:11px}
  .ho-fc-who{display:none}
  .ho-pick-list.ho-teach-list{grid-template-columns:repeat(2,minmax(0,1fr))}
}

@media print{
  /* 打印只出登记表本身：流程条和「接手与沟通记录」属于内部过程，不占纸 */
  body.ho-print .ho-steps-sec,body.ho-print .ho-flow-sec{display:none!important}
}

/* ========== 用药委托 MED（2026-10-29）==========
   员工端：待接收 → 核对 → 到点打卡。视觉沿用 VOC 那套卡片语言，
   只有三处刻意用颜色说话：待接收（琥珀）、超时未喂（砖红）、已喂（墨绿）。 */
.med-stats{grid-template-columns:repeat(4,minmax(0,1fr))}
.med-toolbar .med-filter-row{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}
.med-toolbar .chips{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.med-date-pick,.med-class-pick{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:#7d8d77}
.med-date-pick input{padding:7px 10px;font-size:12px;border-radius:9px}
.med-class-pick select{padding:7px 10px;font-size:12px;border-radius:9px}
.med-block .panel-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.med-block .panel-head h2{margin:0;font-size:17px;display:flex;align-items:center;gap:8px}
.med-block .panel-head>span{font-size:11.5px;color:#93a08f}
.med-count{font-size:11px;font-weight:600;color:#3d7a58;background:#e9f2e5;border-radius:99px;padding:2px 9px}
.med-block .empty{padding:34px;background:transparent;font-size:12.5px}

/* —— 委托卡片 —— */
.med-card{display:flex;align-items:flex-start;gap:16px;padding:14px 16px;border:1px solid var(--line);border-radius:13px;background:#fff;margin-bottom:10px;transition:box-shadow .15s,border-color .15s}
.med-card:hover{box-shadow:0 4px 16px #244e3810;border-color:#d6e3d2}
.med-card.pending{border-color:#f0dcb8;background:#fffdf7}
.med-card.done{background:#fbfdfa}
.med-card-main{flex:1;min-width:0}
.med-card-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.med-kid{font-size:15.5px;color:#2c4638}
.med-class{font-size:11.5px;color:#84928b;background:#f3f6f0;border-radius:5px;padding:2px 8px}
.med-when{font-size:11px;color:#a3ada6;margin-left:auto;font-variant-numeric:tabular-nums}
.med-badge{display:inline-block;font-size:11px;padding:3px 9px;border-radius:5px;white-space:nowrap;line-height:1.5}
.med-badge.pending{background:#fdf2df;color:#a5803c;font-weight:600}
.med-badge.accepted{background:#eaf4e5;color:#377650}
.med-badge.rejected{background:#fdeae3;color:#b3553f}
.med-badge.void{background:#f2f2ef;color:#98a094}
.med-badge.rx{background:#eef3fb;color:#4d6d99}
.med-drug{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-top:7px}
.med-drug b{font-size:15px;color:#2c4638;font-weight:600}
.med-drug span{font-size:13px;color:#3d7a58;background:#eff7ec;border-radius:5px;padding:2px 8px;font-variant-numeric:tabular-nums}
.med-drug em{font-style:normal;font-size:11.5px;color:#93a08f}
.med-drug.big{margin:12px 0 6px}
.med-drug.big b{font-size:20px}
.med-drug.big span{font-size:15px}
.med-meta{display:flex;gap:10px;flex-wrap:wrap;margin-top:7px;font-size:11.5px;color:#8b9a90}
.med-meta .med-reason{color:#a5803c;background:#fdf5e8;border-radius:5px;padding:1px 7px}
.med-meta .med-note{color:#5f7d91;background:#f1f6f8;border-radius:5px;padding:1px 7px}
.med-card-acts{display:flex;flex-direction:column;gap:7px;flex:0 0 auto}

/* —— 时间点（打卡按钮）—— */
.med-doses{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.med-dose{display:flex;flex-direction:column;align-items:flex-start;gap:1px;min-width:88px;padding:8px 12px;border-radius:11px;border:1.5px solid var(--line);background:#fff;text-align:left;line-height:1.35}
.med-dose b{font-size:14px;font-variant-numeric:tabular-nums;color:#33493c}
.med-dose small{font-size:10.5px;color:#93a08f}
.med-dose:hover{border-color:#9cc0a2;background:#f8fcf6}
.med-dose.done{border-color:#cfe3c6;background:#f0f8ec}
.med-dose.done b{color:#2f7048}
.med-dose.done small{color:#4f8560}
.med-dose.overdue{border-color:#e9bfae;background:#fdf0ea}
.med-dose.overdue b{color:#b3553f}
.med-dose.overdue small{color:#b3553f;font-weight:600}
.med-dose.missed{border-color:#e6e6de;background:#f7f7f3}
.med-dose.missed b{color:#98a094;text-decoration:line-through}
.med-dose.missed small{color:#a8b1a6}

/* —— 已退回 / 已作废 —— */
.med-recent-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 12px;border-bottom:1px dashed #eef1ea;font-size:12.5px;cursor:pointer}
.med-recent-row:last-child{border-bottom:0}
.med-recent-row:hover{background:#fafcf8}
.med-recent-row b{color:#33493c}
.med-recent-row em{font-style:normal;color:#b3553f;font-size:11.5px}
.med-recent-row small{margin-left:auto;color:#a3ada6;font-size:11px}

/* —— 扫码台卡 —— */
.med-qr-wrap{display:flex;gap:22px;align-items:center;flex-wrap:wrap}
.med-qr{width:186px;height:186px;flex:0 0 auto;background:#fff;border:1px solid var(--line);border-radius:12px;padding:10px;display:grid;place-items:center}
.med-qr svg{width:100%;height:100%;display:block}
.med-qr-body{flex:1;min-width:240px}
.med-qr-body p{font-size:12.5px;color:#748574;margin:0 0 10px}
.med-url{display:block;font-size:11.5px;color:#4e8566;background:#f5f8f2;border:1px solid #e7eee2;border-radius:8px;padding:8px 10px;word-break:break-all;font-family:ui-monospace,Menlo,monospace}

/* —— 详情弹窗 —— */
.med-detail{max-height:56vh;overflow:auto;padding-right:4px}
.med-dl{margin:14px 0 0;display:grid;gap:9px}
.med-dl>div{display:grid;grid-template-columns:74px minmax(0,1fr);gap:10px;font-size:12.5px;line-height:1.7}
.med-dl dt{color:#93a08f}
.med-dl dd{margin:0;color:#354b3d;overflow-wrap:anywhere}
.med-tel{color:#2f7048;margin-left:6px}
.med-plan{margin-top:14px;white-space:normal}
.med-plan th,.med-plan td{padding:8px 10px;font-size:12px}
.med-dot{display:inline-block;font-size:11.5px;border-radius:5px;padding:1px 7px;margin:1px 2px;font-variant-numeric:tabular-nums}
.med-dot.done{background:#eaf4e5;color:#377650}
.med-dot.todo{background:#f2f4ef;color:#8b9a90}
.med-dot.overdue,.med-dot.missed{background:#fdeae3;color:#b3553f}
.med-done-list{margin-top:14px;font-size:12.5px;color:#354b3d}
.med-done-list ul{margin:6px 0 0;padding-left:18px}
.med-done-list li{line-height:1.9;font-size:12.5px;color:#5f7065}
.med-done-list em{font-style:normal;color:#a3ada6}
.med-sign{margin-top:16px}
.med-sign b,.med-photos+.med-sign b{display:block;font-size:12px;color:#93a08f;margin-bottom:6px}
.med-sign img{max-height:86px;border-bottom:1px solid #cfd8cc;padding-bottom:2px}
.med-photos{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap}
.med-photos img{width:104px;height:104px;object-fit:cover;border-radius:10px;border:1px solid var(--line);display:block}
.med-detail-acts{margin-top:16px;flex-wrap:wrap}
.med-detail-acts button{flex:0 1 auto}
.med-accept-sum{background:#f7faf4;border:1px solid #e7eee2;border-radius:12px;padding:13px 15px;margin-bottom:14px}
.med-accept-sum>div:first-child{display:flex;align-items:center;gap:9px}
.med-agree{margin:4px 0 14px;font-size:12.5px;color:#4f6354}
.med-agree strong{color:#b3553f}

/* —— 主页汇总块 —— */
.med-panel .med-mini-list{display:grid;gap:8px;margin:6px 0 12px}
.med-mini{display:flex;align-items:center;gap:10px;width:100%;text-align:left;padding:9px 11px;border:1px solid var(--line);border-radius:10px;background:#fff}
.med-mini:hover{background:#f8fcf6;border-color:#cfe0c8}
.med-mini-name{font-size:13px;font-weight:600;color:#2c4638;white-space:nowrap}
.med-mini-body{display:flex;flex-direction:column;gap:1px;min-width:0}
.med-mini-body b{font-size:12.5px;color:#3d5a48;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.med-mini-body small{font-size:11px;color:#93a08f}
.med-mini-alarm{color:#b3553f;font-weight:600}

@media(max-width:900px){
  .med-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
  .med-card{flex-direction:column;gap:10px}
  .med-card-acts{flex-direction:row;flex-wrap:wrap}
  .med-when{margin-left:0;width:100%}
}
@media(max-width:600px){
  .med-qr-wrap{gap:14px}
  .med-qr{width:150px;height:150px;margin:0 auto}
  .med-detail{max-height:52vh}
}

/* 交接表「已恢复本机草稿」提示条（2026-10-29） */
.ho-draft-tip{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 14px;padding:11px 14px;border-radius:11px;border:1px solid #e6dcbc;background:#fdf8ea;font-size:12.5px;color:#7a6a3c;line-height:1.7}
.ho-draft-tip b{color:#8a6a25}
.ho-draft-tip button{margin-left:auto;flex:none;background:#fff;border-color:#e6dcbc;color:#8a6a25}
.ho-draft-tip button:hover{background:#fdf3dd;border-color:#d8c79a}
@media(max-width:680px){
  .ho-draft-tip{font-size:12px;padding:10px 12px}
  .ho-draft-tip button{margin-left:0;width:100%}
}

/* —— 「生成发家长的图」弹窗（2026-10-29）—— */
.med-share{margin:12px 0 4px;padding:10px;border:1px solid var(--line);border-radius:12px;background:#f5f7f4;display:flex;justify-content:center}
/* 整张图要能一眼看全（重点是让园长确认内容），所以按高度收，不按宽度撑满；
   长按保存拿到的仍是原图 1360×2040，不是这里显示的大小 */
.med-share img{max-height:56vh;max-width:100%;width:auto;height:auto;display:block;border-radius:8px;box-shadow:0 2px 10px #244e3814}
@media(max-width:600px){
  .med-share{padding:8px}
  .med-share img{max-height:50vh}
}

/* 用药委托 · 在园用药规范（2026-10-29 第二批）
   首次服用标记、接收核对清单、退回原因快捷键、照片分类标签。
   颜色沿用这套：「首次服用」用告警红（要老师多看一眼），「首次开启」用中性蓝。 */
.med-badge.first{background:#fdeae3;color:#b3553f;font-weight:600}
.med-badge.open{background:#eef3fb;color:#4d6d99}
.med-first-alert{margin:9px 0 0;padding:9px 12px;border-radius:9px;border:1px solid #f3d8cd;background:#fdf1ec;font-size:12px;color:#a4503a;line-height:1.7}
.med-first-alert b{color:#b3553f}
.med-flag{color:#b3553f;font-weight:600}
.med-accept-rules{margin:0 0 12px;padding:0 0 0 18px;font-size:12px;color:#5d7062;line-height:1.8}
.med-accept-rules li{margin-bottom:3px}
.med-accept-rules b{color:#2c4638}
.med-preset-lbl{margin:12px 0 7px;font-size:12px;color:#93a08f}
.med-presets{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:14px}
.med-preset{font-size:12px;padding:7px 11px;border-radius:99px;border:1px solid var(--line);background:#fbfaf6;color:#54705f;text-align:left}
.med-preset:hover{background:#eff7ec;border-color:#cfe0c8;color:#3d7a58}
.med-photos a{display:block;text-align:center;text-decoration:none}
.med-photos small{display:block;margin-top:5px;font-size:11px;color:#93a08f}

/* 备案号（2026-10-29 ICP 通过后加；法定要求：网站底部展示并链到工信部） */
footer .icp{margin-left:auto;font-size:10px;color:#a2aca0;text-decoration:none;letter-spacing:.5px;white-space:nowrap}
footer .icp:hover{color:#6f8177;text-decoration:underline}
.icp-bar a:hover{color:#6f8177;text-decoration:underline}
@media print{footer .icp,.icp-bar{display:none}}
