:root{--paper: #FCFCF9;--grid: #E4EAF1;--ink: #1E2A38;--ink-soft: #5A6B7D;--dim: #2C5F9E;--red: #C9403C;--amber: #DE9A2E;--green: #35915A;--hair: #C9D2DC}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Noto Sans TC,sans-serif;color:var(--ink);background:var(--paper);background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:28px 28px;line-height:1.65}.sheet{max-width:1080px;margin:20px auto;border:2px solid var(--ink);background:var(--paper)}@media(max-width:640px){.sheet{margin:8px 6px}}.titleblock{display:flex;flex-wrap:wrap;align-items:stretch;border-bottom:2px solid var(--ink);font-family:IBM Plex Mono,monospace;font-size:12px}.tb-cell{padding:8px 14px;border-left:1px solid var(--hair);min-width:0}.tb-cell:first-child{border-left:none;flex:1}.tb-label{display:block;font-size:10px;color:var(--ink-soft);letter-spacing:.12em}.tb-val{font-weight:500}nav.steps{display:flex;border-bottom:2px solid var(--ink);font-family:IBM Plex Mono,monospace;font-size:13px}nav.steps button{flex:1;border:none;background:transparent;padding:12px 8px;font-family:inherit;font-size:inherit;color:var(--ink-soft);cursor:pointer;border-left:1px solid var(--hair)}nav.steps button:first-child{border-left:none}nav.steps button.active{background:var(--ink);color:var(--paper);font-weight:700}.step-short{display:none}nav.steps button.nav-help{flex:0 0 40px;font-weight:700;color:var(--dim)}nav.steps button.nav-help.active{background:var(--ink);color:var(--paper)}.eyebrow-help{font-size:11px;letter-spacing:.18em;color:var(--dim);margin-bottom:8px}@media(max-width:560px){nav.steps button{font-size:11.5px;padding:10px 2px;white-space:nowrap}.step-long{display:none}.step-short{display:inline}}main{padding:28px}@media(max-width:640px){main{padding:14px}}h2{font-family:"Noto Serif TC",serif;font-size:20px;margin-bottom:4px}h3{font-size:15px;margin-bottom:8px}.hint{font-size:12.5px;color:var(--ink-soft);margin-bottom:16px}.mono{font-family:IBM Plex Mono,monospace}.card{border:2px solid var(--ink);background:#fff;margin-bottom:16px}.card-head{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 12px;border-bottom:1px solid var(--hair);background:#2c5f9e0d}.card-body{padding:12px}input,select{font-family:Noto Sans TC,sans-serif;font-size:14px;color:var(--ink);border:1px solid var(--hair);background:#fff;padding:6px 8px;border-radius:0}input:focus,select:focus{outline:2px solid var(--dim);outline-offset:1px}input.num{width:76px;font-family:IBM Plex Mono,monospace}input.name{flex:1 1 120px;width:auto;min-width:100px;max-width:220px}input.room{width:110px}label.inline{display:inline-flex;align-items:center;gap:5px;font-size:13px}.cab-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px}.cab-row .row-tools{display:flex;gap:8px;align-items:center;flex-wrap:nowrap;margin-left:auto}button.btn{font-family:Noto Sans TC,sans-serif;font-size:13.5px;font-weight:700;border:2px solid var(--ink);background:var(--ink);color:var(--paper);padding:7px 14px;cursor:pointer}button.btn.secondary{background:#fff;color:var(--ink)}button.btn.ghost{border-color:transparent;background:transparent;color:var(--ink-soft);font-weight:400}button.btn:hover{border-color:var(--dim)}button.btn.danger{color:var(--red)}table.grid{width:100%;border-collapse:collapse;font-size:13.5px}table.grid th{text-align:left;font-family:IBM Plex Mono,monospace;font-size:11px;color:var(--ink-soft);font-weight:400;padding:4px 6px;border-bottom:1px solid var(--hair)}table.grid td{padding:5px 6px;border-bottom:1px solid var(--grid);vertical-align:middle}.table-scroll{overflow-x:auto}.chip{display:inline-block;border:1.5px solid var(--ink);background:#fff;border-radius:99px;padding:1px 10px;font-size:12px;margin:0 5px 6px 0;white-space:nowrap}.chip.bad{border-color:var(--red);color:var(--red)}.chip .sub{color:var(--ink-soft);font-size:11px}.light{display:inline-block;width:11px;height:11px;border-radius:50%;vertical-align:baseline}.light.green{background:var(--green)}.light.yellow{background:var(--amber)}.light.red{background:var(--red)}.report-item{display:flex;gap:12px;align-items:flex-start;padding:12px 4px;border-top:1px solid var(--hair);font-size:14.5px}.report-item .m{font-family:IBM Plex Mono,monospace;font-size:12px;color:var(--ink-soft);margin-left:auto;flex:none}.report-item .light{margin-top:7px;flex:none}.solutions{font-size:12.5px;color:var(--ink-soft);margin-top:3px}.cab{display:flex;border:2.5px solid var(--ink);background:#fff}.cab .bay{flex:1;border-left:1.5px solid var(--ink);display:flex;flex-direction:column;min-width:0}.cab .bay:first-child{border-left:none}.zone{padding:8px 8px 4px;border-top:1.5px solid var(--ink);flex:1}.zone:first-child{border-top:none}.zone .zt{font-family:IBM Plex Mono,monospace;font-size:10.5px;display:inline-block;padding:1px 7px;color:#fff;margin-bottom:7px}.zone.green{background:#35915a0f}.zone.green .zt{background:var(--green)}.zone.yellow{background:#de9a2e14}.zone.yellow .zt{background:var(--amber)}.zone.red{background:#c9403c0f}.zone.red .zt{background:var(--red)}.zone.empty{background:repeating-linear-gradient(45deg,transparent,transparent 6px,var(--grid) 6px,var(--grid) 7px)}.zone.empty .zt{background:var(--ink-soft)}.dimline{font-family:IBM Plex Mono,monospace;font-size:11px;color:var(--dim);text-align:center;border-top:1px solid var(--dim);margin:6px 30px 14px;padding-top:2px}.cabname{font-family:IBM Plex Mono,monospace;font-size:11.5px;color:var(--ink-soft);margin:14px 0 8px;display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap}.orphan{border:2px dashed var(--red);padding:12px 14px 8px;margin-top:16px}.orphan .ot{font-family:IBM Plex Mono,monospace;font-size:11.5px;color:var(--red);margin-bottom:8px}.chip.icon-chip{display:inline-flex;align-items:center;gap:3px;padding:1px 7px;border-width:1.5px}.icon-chip .ic{font-size:14px;line-height:1.35}.icon-chip .qty{font-size:9.5px;color:var(--ink-soft)}.chip.drag{cursor:grab;user-select:none;-webkit-user-select:none}.chip.drag:active{cursor:grabbing}.tray{border:2px dashed var(--ink-soft);background:#5a6b7d0a;padding:12px 14px 8px;margin-bottom:16px;min-height:64px}.tray .ot{font-size:11.5px;color:var(--ink-soft);margin-bottom:8px}.tray.over{border-color:var(--dim);background:#2c5f9e12}.tray-group{margin-bottom:8px}.tray-label{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--ink-soft);margin-bottom:4px}.board{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}.roomzone{border:2px solid var(--ink);background:#fff;min-height:110px;padding:10px 12px 6px}.roomzone.over{outline:3px solid var(--dim);outline-offset:2px;background:#2c5f9e0d}.roomzone-head{display:flex;flex-direction:column;margin-bottom:8px;border-bottom:1px solid var(--hair);padding-bottom:6px}.roomzone-cabs{font-size:10.5px;color:var(--ink-soft)}.fp-wrap{position:relative;border:2px solid var(--ink);background:#fff;-webkit-user-select:none;user-select:none}.fp-wrap img{display:block;width:100%;height:auto;pointer-events:none}.fp-zone{position:absolute;border:2px solid var(--dim);background:#2c5f9e1a;overflow:hidden;min-width:0}.fp-zone.over{border-width:3px;background:#2c5f9e38}.fp-zone-label{display:inline-flex;align-items:center;gap:4px;background:var(--dim);color:#fff;font-size:10.5px;padding:0 6px}.fp-zone-del{border:none;background:transparent;color:#fff;cursor:pointer;font-size:10px;padding:0 2px;line-height:1.6}.fp-zone-chips{padding:3px}.fp-zone-chips .chip{margin:0 3px 3px 0;font-size:10.5px;padding:0 7px;border-width:1px}.fp-zone-num{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:#fff;color:var(--dim);font-size:9.5px;font-weight:700}.fp-bubble{position:absolute;top:4px;right:4px;width:22px;height:22px;border-radius:50%;background:var(--dim);color:#fff;font-family:IBM Plex Mono,monospace;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;box-shadow:0 0 0 2px #fff;cursor:pointer;z-index:2}.fp-bubble.active{box-shadow:0 0 0 2px #fff,0 0 0 4.5px var(--dim)}.fp-zone.active{outline:2.5px dashed var(--dim);outline-offset:-2.5px}.fp-zone-del-edit{position:absolute;top:4px;left:4px;width:18px;height:18px;border:none;border-radius:50%;background:var(--red);color:#fff;font-size:10px;cursor:pointer;line-height:1;z-index:2}.callout-row.droppable.over{outline:2px dashed var(--dim);outline-offset:-2px;background:#2c5f9e12}.fp-draft{position:absolute;border:2px dashed var(--red);background:#c9403c14;pointer-events:none}.fp-edit{position:absolute;pointer-events:none}.fp-move{position:absolute;inset:0;pointer-events:auto;cursor:move;outline:2px dashed var(--amber);outline-offset:-2px}.fp-handle{position:absolute;width:16px;height:16px;pointer-events:auto;background:var(--amber);border:2px solid #fff;box-shadow:0 0 0 1px var(--ink-soft);touch-action:none}.fp-handle-nw{left:-8px;top:-8px;cursor:nwse-resize}.fp-handle-ne{right:-8px;top:-8px;cursor:nesw-resize}.fp-handle-sw{left:-8px;bottom:-8px;cursor:nesw-resize}.fp-handle-se{right:-8px;bottom:-8px;cursor:nwse-resize}.callouts{margin-top:6px}.callout-row{display:flex;align-items:flex-start;gap:8px;padding:4px;border-top:1px solid var(--grid);font-size:13px;cursor:pointer}.callout-row:first-child{border-top:none}.callout-row.active{background:#2c5f9e14;outline:1.5px dashed var(--dim);outline-offset:-1.5px}.co-bubble{flex:none;width:20px;height:20px;border-radius:50%;color:#fff;font-family:IBM Plex Mono,monospace;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;margin-top:1px}.co-title{flex:none;font-size:12px;padding-top:3px;min-width:74px}.co-chips{display:flex;flex-wrap:wrap;gap:0;min-width:0}.co-chips .chip{margin:0 5px 4px 0;white-space:normal}.disclaimer{margin-top:24px;padding-top:10px;border-top:2px solid var(--ink);font-family:IBM Plex Mono,monospace;font-size:11.5px;color:var(--ink-soft)}.empty-note{border:1px dashed var(--hair);padding:20px;text-align:center;color:var(--ink-soft);font-size:13.5px;margin-bottom:16px}section.rpt{margin-bottom:30px}@media print{body{background:#fff}.sheet{border:none;margin:0;max-width:none}nav.steps,.no-print{display:none!important}main{padding:0}section.rpt{break-inside:avoid}}
