:root{--bg:#edf1f3;--panel:#fff;--ink:#1a2430;--muted:#697583;--line:#dce2e7;--brand:#18745f;--brand-dark:#105544;--brand-soft:#e8f4f0;--cut:#e04438;--crease:#2563d9;--warn:#fff4d8;--shadow:0 8px 28px rgba(31,45,57,.08)}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:Inter,"Be Vietnam Pro",system-ui,-apple-system,sans-serif;color:var(--ink);background:var(--bg)}button,input,select{font:inherit}button{color:inherit}.hidden{display:none!important}.app-shell{min-height:100vh}.topbar{height:64px;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:16px;padding:0 18px;background:#10231f;color:#fff;border-bottom:1px solid rgba(255,255,255,.08)}.topbar>a{font-size:12px;color:#a9bbb5;white-space:nowrap;margin-left:2px}.topbar>a:hover{color:#fff}
.brand-block{display:flex;align-items:center;gap:11px;border:0;background:none;color:#fff;text-align:left;cursor:pointer}.brand-block strong,.brand-block small{display:block}.brand-block strong{font-size:14px}.brand-block small{margin-top:2px;color:#a9bbb5;font-size:9px}.brand-mark{position:relative;width:31px;height:31px;display:grid;place-items:center;border:1px solid #557169;border-radius:8px}.brand-mark i{position:absolute;width:14px;height:9px;border:1.5px solid #7fd1b9;transform:skewY(-25deg)}.brand-mark i:nth-child(1){transform:translateY(-5px) skewY(-25deg)}.brand-mark i:nth-child(2){transform:translate(-5px,4px) skewY(-25deg)}.brand-mark i:nth-child(3){transform:translate(5px,4px) skewY(-25deg)}
.menu-bar{height:100%;min-width:0;display:flex;align-items:center;justify-content:flex-end;gap:2px}.menu{position:relative}.menu>button{height:36px;padding:0 11px;border:0;border-radius:6px;background:transparent;color:#d5e1dd;font-size:10px;cursor:pointer}.menu>button:hover,.menu.open>button{background:rgba(255,255,255,.09);color:#fff}.menu-popover{display:none;position:absolute;top:40px;left:0;z-index:30;min-width:190px;padding:6px;border:1px solid #d6dee2;border-radius:9px;background:#fff;box-shadow:var(--shadow)}.menu.open .menu-popover{display:grid}.menu-popover button{padding:9px 10px;border:0;border-radius:6px;background:#fff;text-align:left;font-size:10px;cursor:pointer}.menu-popover button:hover{background:#edf5f2}.top-actions{display:flex;flex:none;align-items:center;gap:12px;white-space:nowrap}.engine-state{display:flex;align-items:center;gap:6px;color:#acc0ba;font-size:9px}.engine-state i{width:7px;height:7px;border-radius:50%;background:#58d4a7;box-shadow:0 0 0 4px rgba(88,212,167,.12)}
.button{border:0;border-radius:8px;padding:10px 14px;font-weight:700;font-size:10px;cursor:pointer}.button-primary,.button-generate{background:var(--brand);color:#fff}.button-primary:hover,.button-generate:hover{background:var(--brand-dark)}.button-secondary{width:100%;border:1px solid #bdd5ce;background:#eef8f5;color:var(--brand-dark)}.button-generate{width:100%;display:flex;align-items:center;justify-content:center;gap:8px;padding:12px;margin-top:5px}.button:disabled{opacity:.55;cursor:wait}
.workspace{display:grid;grid-template-columns:300px minmax(520px,1fr) 300px;gap:10px;padding:10px;min-height:calc(100vh - 64px)}.panel{border:1px solid var(--line);border-radius:10px;background:var(--panel);box-shadow:0 1px 2px rgba(20,33,44,.02)}.inspector,.audit{max-height:calc(100vh - 84px);overflow:auto;padding:17px}.panel-heading,.section-title-row,.audit-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.eyebrow{margin:0 0 4px;color:#83909d;font-size:8px;font-weight:800;letter-spacing:.13em;text-transform:uppercase}.panel-heading h1,.audit-header h2{margin:0;font-size:17px}.version-chip,.unit-pill,.auto-chip{padding:3px 7px;border-radius:999px;background:#edf1f4;color:#667381;font-size:8px;font-weight:750}.auto-chip{background:var(--brand-soft);color:var(--brand-dark)}
.template-card{width:100%;display:grid;grid-template-columns:42px 1fr auto;align-items:center;gap:11px;margin:16px 0;padding:11px;border:1px solid #d9e1e5;border-radius:9px;background:#f9fbfb;text-align:left;cursor:pointer}.template-card:hover{border-color:#9fc6ba;background:#f3faf8}.template-card strong,.template-card small{display:block}.template-card strong{font-size:11px}.template-card small{margin-top:4px;color:var(--muted);font-size:8.5px;line-height:1.4}.template-card b{color:var(--brand);font-size:8px}.template-icon{display:grid;place-items:center;width:42px;height:42px;border-radius:8px;background:#e8f1ee;color:var(--brand);font-size:21px}
.control-section{padding:14px 0;border-top:1px solid #e6eaed}.compact-section{padding-bottom:10px}.control-section h2{margin:0;font-size:11px}.section-help{margin:5px 0 11px;color:var(--muted);font-size:8.5px}.dimension-grid,.two-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:7px}.two-grid{grid-template-columns:1fr 1fr;margin-top:8px}.field span,.check-field span{display:block;margin-bottom:5px;color:#596674;font-size:8.5px;font-weight:700}.field input,.field select{width:100%;height:36px;border:1px solid #d6dde2;border-radius:7px;background:#fff;padding:0 9px;font-size:11px;outline:none}.field input:focus,.field select:focus{border-color:#58a893;box-shadow:0 0 0 3px rgba(24,116,95,.09)}.field.full{display:block}.check-field{display:flex;align-items:center;gap:7px;padding-top:18px}.check-field span{margin:0}.check-field input{accent-color:var(--brand)}.auto-material-card{display:grid;grid-template-columns:35px 1fr;gap:10px;margin-top:10px;padding:10px;border:1px solid #d4e6e0;border-radius:8px;background:#f4faf8}.auto-material-icon{display:grid;place-items:center;width:34px;height:34px;border-radius:8px;background:#dcefe9;color:var(--brand-dark);font-size:9px;font-weight:900}.auto-material-card small,.auto-material-card strong,.auto-material-card em{display:block}.auto-material-card small{color:#6d7c79;font-size:8px}.auto-material-card strong{margin:2px 0;font-size:10px}.auto-material-card em{color:#75817e;font-size:8px;font-style:normal;line-height:1.35}.auto-material-facts{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:8px 0 0}.auto-material-facts div{padding:7px;border-radius:7px;background:#f5f7f8}.auto-material-facts dt{color:#7a8691;font-size:7.5px}.auto-material-facts dd{margin:3px 0 0;font-size:9px;font-weight:750}.form-error{margin-top:9px;padding:9px;border-radius:7px;background:#fee8e5;color:#a43129;font-size:9px;line-height:1.4}
.canvas-column{min-width:0;display:grid;grid-template-rows:48px minmax(520px,1fr) 70px;gap:10px;max-height:calc(100vh - 84px)}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;padding:6px 9px}.view-tabs{display:flex;gap:3px}.view-tab{height:34px;padding:0 13px;border:0;border-radius:7px;background:transparent;color:#65717e;font-size:9px;font-weight:750;cursor:pointer}.view-tab.active{background:#e8f3ef;color:var(--brand-dark)}.canvas-actions{display:flex;align-items:center;gap:4px}.icon-button{width:32px;height:32px;border:1px solid #d8dfe4;border-radius:7px;background:#fff;cursor:pointer}.icon-button:hover{background:#f3f6f7}.zoom-label{min-width:42px;text-align:center;color:#66727f;font-size:9px}.canvas-stage{position:relative;overflow:hidden;min-height:520px}.canvas-grid{position:absolute;inset:0;background-color:#f8fafb;background-image:linear-gradient(#e9edef 1px,transparent 1px),linear-gradient(90deg,#e9edef 1px,transparent 1px);background-size:20px 20px}.view-pane{position:absolute;inset:0}.drawing-viewport{display:grid;place-items:center;overflow:auto;padding:34px}.svg-mount{width:min(96%,1050px);transform-origin:center;transition:transform .15s}.svg-mount svg{display:block;width:100%;height:auto;max-height:calc(100vh - 250px);filter:drop-shadow(0 7px 10px rgba(40,55,66,.07))}.svg-mount svg #CUT line,.svg-mount svg #CUT path{stroke-width:1.35px;vector-effect:non-scaling-stroke}.svg-mount svg #CREASE line,.svg-mount svg #CREASE path{stroke-width:1.1px;stroke-dasharray:7 5;vector-effect:non-scaling-stroke}.svg-mount svg #STOCK_ENVELOPE{opacity:.45}.canvas-loader{position:absolute;inset:0;z-index:15;display:flex;align-items:center;justify-content:center;gap:9px;background:rgba(248,250,251,.85);color:#66727e;font-size:10px}.spinner{width:18px;height:18px;border:2px solid #cfd7dc;border-top-color:var(--brand);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.legend{position:absolute;left:16px;bottom:14px;display:flex;gap:13px;padding:7px 10px;border:1px solid #d5dde2;border-radius:7px;background:rgba(255,255,255,.9);font-size:8px;color:#687582}.legend span{display:flex;align-items:center;gap:5px}.legend-line{width:18px;border-top:2px solid}.legend-line.cut{border-color:var(--cut)}.legend-line.crease{border-color:var(--crease);border-top-style:dashed}.legend-line.stock{border-color:#838c96;border-top-style:dashed}
.metrics-strip{display:grid;grid-template-columns:repeat(4,1fr);overflow:hidden}.metrics-strip article{padding:14px;border-right:1px solid var(--line)}.metrics-strip article:last-child{border-right:0}.metrics-strip span,.metrics-strip strong{display:block}.metrics-strip span{color:#7a8691;font-size:8px}.metrics-strip strong{margin-top:6px;font-size:12px}
.fold-viewport{overflow:hidden;background:radial-gradient(circle at 50% 40%,#f3f4f5,#dfe4e8 60%,#c9d1d7);cursor:grab;touch-action:none}.fold-viewport.dragging{cursor:grabbing}.fold-viewport canvas{width:100%;height:100%}.floating-card{position:absolute;z-index:2;border:1px solid rgba(202,212,218,.92);border-radius:9px;background:rgba(255,255,255,.91);box-shadow:0 8px 24px rgba(35,50,61,.08);backdrop-filter:blur(8px)}.fold-view-info{left:15px;top:15px;max-width:270px;padding:9px 11px}.fold-view-info strong,.fold-view-info span{display:block}.fold-view-info strong{font-size:10px}.fold-view-info span{margin-top:4px;color:#71808d;font-size:8px;line-height:1.35}.fold-check-banner{left:15px;top:96px;max-width:290px;padding:8px 11px;border-left:3px solid #2e9e78}.fold-check-banner strong,.fold-check-banner span{display:block}.fold-check-banner strong{font-size:10px;color:#1f7a5c}.fold-check-banner span{margin-top:4px;color:#71808d;font-size:8px;line-height:1.35}.fold-check-banner.fold-check-fail{border-left-color:#d1734b;background:rgba(255,248,244,.95)}.fold-check-banner.fold-check-fail strong{color:#b4552c}.camera-presets{right:15px;top:15px;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px;max-width:315px;padding:6px}.camera-presets button,.fold-mode-tabs button,.fold-control-pane button{border:1px solid #d9e0e4;border-radius:6px;background:#fff;padding:6px 8px;font-size:8px;cursor:pointer}.camera-presets button:hover,.fold-control-pane button:hover{background:#edf5f2}.camera-presets button.active{background:#e3f1ec;color:var(--brand-dark)}.fold-controller{left:50%;bottom:14px;width:min(620px,calc(100% - 30px));transform:translateX(-50%);padding:9px}.fold-mode-tabs{display:flex;gap:4px;margin-bottom:8px}.fold-mode-tabs button{flex:1}.fold-mode-tabs button.active{border-color:#75ae9e;background:#e9f5f1;color:var(--brand-dark);font-weight:800}.fold-control-pane{display:flex;align-items:center;justify-content:center;gap:8px;min-height:34px}.fold-control-pane label{display:flex;align-items:center;gap:6px;color:#65727e;font-size:8px}.fold-control-pane select{height:28px;border:1px solid #d7dfe3;border-radius:6px;background:#fff;font-size:8px}.mini-primary{background:var(--brand)!important;color:#fff!important;border-color:var(--brand)!important}.timeline-label{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:9px;margin-top:8px;color:#65727e;font-size:8px}.timeline-label input{width:100%;accent-color:var(--brand)}.timeline-label output{font-family:ui-monospace,monospace;color:var(--brand-dark)}
.imposition-viewport{display:grid;place-items:center;overflow:hidden;padding:25px;background:#e9eef0;cursor:grab;touch-action:none}.imposition-viewport.dragging{cursor:grabbing}.imposition-viewport svg{display:block;max-width:100%;max-height:100%;filter:drop-shadow(0 8px 18px rgba(30,45,55,.13));transform-origin:center center;transition:transform .08s linear}.empty-state{color:#78848f;font-size:11px}
/* ĐANG TÍNH BÌNH KHUÔN (v0.9.281). Engine true-shape có mẫu chạy tới ~4 s;
   trước đây khung xem đứng im nên người dùng tưởng treo hoặc tưởng đã xong.
   Hiệu ứng là một TỜ GIẤY với các con lần lượt đáp xuống — đọc ra ngay là
   "đang xếp con lên tờ", khác hẳn một vòng xoay chung chung. */
.imp-busy{position:absolute;inset:0;z-index:20;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:11px;background:rgba(233,238,240,.93);color:#42515e;text-align:center;padding:20px}
.imp-busy.hidden{display:none}
.imp-busy strong{font-size:12px;font-weight:800;color:#183e33}
.imp-busy small{font-size:10px;color:#78848f;max-width:380px;line-height:1.5}
.imp-busy-sheet{display:grid;grid-template-columns:repeat(3,34px);grid-auto-rows:26px;gap:5px;padding:9px;border:1px solid #354555;border-radius:3px;background:#fff;box-shadow:0 6px 16px rgba(30,45,55,.12)}
.imp-busy-sheet i{display:block;border-radius:2px;background:#dfeee9;border:1px solid #18745f;opacity:0;animation:impDrop 1.8s ease-in-out infinite}
.imp-busy-sheet i:nth-child(2){animation-delay:.15s}
.imp-busy-sheet i:nth-child(3){animation-delay:.3s}
.imp-busy-sheet i:nth-child(4){animation-delay:.45s}
.imp-busy-sheet i:nth-child(5){animation-delay:.6s}
.imp-busy-sheet i:nth-child(6){animation-delay:.75s}
@keyframes impDrop{0%{opacity:0;transform:translateY(-7px) scale(.9)}18%,72%{opacity:1;transform:none}100%{opacity:0;transform:none}}
@media (prefers-reduced-motion:reduce){.imp-busy-sheet i{animation:none;opacity:1}}.sheet-outline{fill:#fff;stroke:#354555;stroke-width:1}.sheet-safe{fill:none;stroke:#8b98a3;stroke-width:.6;stroke-dasharray:5 3}.imposed-item{fill:#dfeee9;stroke:#18745f;stroke-width:.8}.imposed-label{fill:#245447;font-size:8px;font-weight:800}.sheet-label{fill:#42515e;font-size:10px;font-weight:800}
.audit-header{align-items:center;margin-bottom:13px}.status-card{display:grid;grid-template-columns:34px 1fr;gap:10px;padding:12px;border:1px solid #efd28c;border-radius:9px;background:var(--warn)}.status-icon{display:grid;place-items:center;width:32px;height:32px;border-radius:50%;background:#f1d282;color:#7a5700;font-weight:900}.status-card small,.status-card strong,.status-card em{display:block}.status-card small{color:#8a6a24;font-size:8px}.status-card strong{margin:3px 0;color:#644c16;font-size:10px}.status-card em{color:#8d712f;font-size:8px;font-style:normal}.audit-section{border-bottom:1px solid var(--line)}.accordion-heading{width:100%;display:flex;align-items:center;justify-content:space-between;padding:14px 1px 11px;border:0;background:transparent;font-size:10px;font-weight:800;cursor:pointer}.accordion-heading i{font-style:normal;color:#7b8792}.accordion-body{display:none;padding:0 1px 13px}.accordion-body.open{display:block}.formula-list{margin:0}.formula-list div{display:flex;justify-content:space-between;gap:10px;padding:7px 0;border-bottom:1px dashed #e2e7ea}.formula-list dt{color:#77838e;font-size:8px}.formula-list dd{margin:0;text-align:right;font-family:ui-monospace,monospace;font-size:8px}.audit-inline-note{margin:9px 0 0;padding:8px;border-radius:7px;background:#f3f6f7;color:#64717d;font-size:8px;line-height:1.45}.validation-badge{padding:3px 6px;border-radius:999px;background:#e7f3ef;color:#216b58;font-size:7px}.validation-list,.note-group ul{margin:0;padding:0;list-style:none}.validation-list li{position:relative;padding:6px 0 6px 19px;color:#65727e;font-size:8px;line-height:1.4}.validation-list li:before{position:absolute;left:0;top:6px;display:grid;place-items:center;width:12px;height:12px;border-radius:50%;content:"✓";background:#dff2ec;color:#216b58;font-size:7px}.validation-list li.warning:before{content:"!";background:#fff0c9;color:#8e6500}.validation-list li.error:before{content:"×";background:#fee3df;color:#ab352d}.note-group h3{margin:3px 0 6px;color:#87929c;font-size:8px;text-transform:uppercase}.note-group li{margin:5px 0;padding-left:9px;border-left:2px solid #dfe5e8;color:#67737e;font-size:8px;line-height:1.4}.warning-notes{margin-top:10px}.warning-notes li{border-color:#e8c978}.source-footer{padding-top:13px}.source-footer span,.source-footer strong,.source-footer small{display:block}.source-footer span{color:#88939d;font-size:7px;text-transform:uppercase;letter-spacing:.1em}.source-footer strong{margin:4px 0;font-size:9px}.source-footer small{color:#7b8792;font-size:7.5px}
.drawer-backdrop{position:fixed;inset:0;z-index:50;display:flex;justify-content:flex-start;background:rgba(11,25,22,.42);backdrop-filter:blur(2px)}.library-drawer{width:min(780px,92vw);height:100%;overflow:auto;padding:22px;background:#f7f9fa;box-shadow:18px 0 40px rgba(17,30,37,.2)}.library-drawer header{display:flex;align-items:center;justify-content:space-between}.library-drawer h2{margin:0;font-size:22px}.library-search{display:flex;align-items:center;gap:8px;margin:0 0 16px;padding:0 12px;border:1px solid #d5dde2;border-radius:9px;background:#fff}.library-search input{width:100%;height:42px;border:0;outline:0}.filter-chips{display:flex;gap:6px;margin:16px 0 14px;padding-bottom:2px;overflow-x:auto;scrollbar-width:none}.filter-chips::-webkit-scrollbar{display:none}.filter-chips button{flex:none;white-space:nowrap;padding:8px 13px;border:1px solid #d7dfe3;border-radius:999px;background:#fff;font-size:12.5px;font-weight:600;color:#33474f;cursor:pointer}.filter-chips button:hover{border-color:#7fb3a5}.filter-chips button.active{border-color:#7fb3a5;background:#e6f3ef;color:var(--brand-dark)}.library-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px}.library-card{display:flex;flex-direction:column;gap:10px;padding:13px;border:1px solid #d8e0e4;border-radius:10px;background:#fff;text-align:left;cursor:pointer}.library-card:hover,.library-card.selected{border-color:#70ae9c;box-shadow:0 6px 18px rgba(30,80,66,.08)}.library-card-visual{display:grid;place-items:center;min-height:76px;border-radius:8px;background:linear-gradient(145deg,#eef4f2,#dbe9e4);color:var(--brand);font-size:28px}.library-card strong,.library-card span,.library-card small{display:block}.library-card strong{font-size:11px;line-height:1.4}.library-card span{margin-top:4px;color:#64717d;font-size:8.5px;line-height:1.45}.library-card small{margin-top:9px;color:#87939d;font-size:7.5px}.toast{position:fixed;left:50%;bottom:22px;z-index:80;transform:translate(-50%,20px);opacity:0;padding:10px 14px;border-radius:8px;background:#13251f;color:#fff;font-size:9px;transition:.18s;pointer-events:none}.toast.visible{opacity:1;transform:translate(-50%,0)}
@media(max-width:1180px){.workspace{grid-template-columns:280px 1fr}.audit{grid-column:1/-1;max-height:none;display:grid;grid-template-columns:1fr 1fr;gap:0 20px}.audit-header,.status-card,.source-footer{grid-column:1/-1}.canvas-column,.inspector{max-height:none}.menu-bar{overflow:auto}}
@media(max-width:1040px){.topbar{grid-template-columns:1fr auto;gap:10px}.menu-bar{display:none}.top-actions{gap:7px}}
@media(max-width:820px){.topbar{height:auto;min-height:64px;grid-template-columns:1fr auto;padding:10px}.menu-bar,.engine-state{display:none}.workspace{grid-template-columns:1fr;padding:7px}.inspector,.audit,.canvas-column{max-height:none}.canvas-column{grid-template-rows:48px 560px auto}.audit{display:block}.camera-presets{max-width:210px}.library-grid{grid-template-columns:1fr}}
@media(max-width:520px){.dimension-grid{grid-template-columns:1fr}.metrics-strip{grid-template-columns:1fr 1fr}.fold-view-info{max-width:180px}.camera-presets{left:14px;right:auto;top:76px;max-width:190px}.fold-controller{bottom:8px}.fold-control-pane{flex-wrap:wrap}.top-actions .button{padding:9px}.brand-block small{display:none}
/* F2 (v0.9.93): 320px — toolbar canvas min-content ~340px làm tràn ngang cả cột.
   Cho toolbar xuống dòng + hàng grid tự cao, thu padding tab/zoom. */
.canvas-column{grid-template-rows:auto minmax(420px,1fr) auto}
.canvas-toolbar{flex-wrap:wrap;height:auto;min-height:48px;row-gap:4px;padding:6px 8px}
.view-tab{height:30px;padding:0 9px}
.canvas-actions .icon-button{width:28px;height:28px}.zoom-label{min-width:34px}}

.pick-hint{flex-basis:100%;text-align:center;color:#7a8691;font-size:7.5px}
.param-pending input,.param-pending select{opacity:.55;background:#f2f4f5}
/* Số DẪN XUẤT: hiện để đối chiếu, không sửa được. Nền xám + con trỏ mặc định
   để nhìn ra ngay là chỉ đọc, thay vì mời gõ rồi bị server từ chối. */
.param-readonly input,.param-readonly select{background:#f2f4f5;color:#55606a;cursor:default}
/* Ô sửa được đi kèm nút khôi phục công thức ở ngay bên phải.
   Phải viết `.field span.param-row` — `.field span{display:block}` ở dòng 8 có
   specificity cao hơn `.param-row` đơn lẻ nên nút sẽ rơi xuống dòng dưới. */
.field span.param-row{display:flex;align-items:center;gap:4px;margin-bottom:0;font-weight:400}
.param-row input{flex:1;min-width:0}
.param-restore{flex:none;width:22px;height:22px;padding:0;line-height:1;border:1px solid #cdd5db;border-radius:4px;background:#fff;color:#55606a;cursor:pointer;font-size:12px}
.param-restore:hover{background:#eef2f5;color:#1d2b36}
/* ---- Lưới THAM SỐ NÂNG CAO: mọi hàng thẳng nhau (owner 2026-08-19) ----
   Chỉ khoanh vào 4 lưới do JS dựng, KHÔNG sửa `.two-grid` chung — lớp đó còn
   dùng cho 6 khối tĩnh khác trong `app.html`, đổi nó là đổi cả những chỗ không
   ai yêu cầu.
   Gốc lệch hàng: nhãn dài xuống 2–3 dòng nên hai ô cùng hàng cao thấp khác
   nhau, đỉnh ô nhập lệch tới 22 px (đo trên 0427: 9/27 nhãn wrap). Ba chốt
   chặn: nhãn khoá đúng MỘT dòng cao cố định, ô nhập bị đẩy xuống đáy ô lưới,
   và lưới căn theo đáy. */
#mailerAdvancedGrid,#ecmaAdvancedGrid,#toteAdvancedGrid,#ardParamGrid{
  grid-template-columns:repeat(2,minmax(0,1fr));align-items:end}
#mailerAdvancedGrid .field,#ecmaAdvancedGrid .field,#toteAdvancedGrid .field,#ardParamGrid .field{
  display:flex;flex-direction:column;min-width:0}
/* `.field span{display:block}` ở dòng 8 nên phải đủ specificity mới đè được. */
#mailerAdvancedGrid .field span.param-name,#ecmaAdvancedGrid .field span.param-name,
#toteAdvancedGrid .field span.param-name,#ardParamGrid .field span.param-name{
  display:block;height:14px;line-height:14px;margin-bottom:5px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mailerAdvancedGrid .field span.param-row,#ecmaAdvancedGrid .field span.param-row,
#toteAdvancedGrid .field span.param-row,#ardParamGrid .field span.param-row{margin-top:auto}
/* Màn hẹp mới xuống 1 cột; desktop giữ 2 cột đều nhau. */
@media(max-width:640px){
  #mailerAdvancedGrid,#ecmaAdvancedGrid,#toteAdvancedGrid,#ardParamGrid{grid-template-columns:1fr}
}
.param-anchor-pulse{animation:anchorPulse 1.1s ease-out infinite}
@keyframes anchorPulse{0%{opacity:.95}60%{opacity:.15}100%{opacity:.95}}

/* Pacdora-compatible controls (v0.7.0) */
.size-mode-tabs{display:flex;gap:4px;margin-bottom:10px}
.size-mode-tabs button{flex:1;border:1px solid #d9e0e4;border-radius:6px;background:#fff;padding:8px 6px;font-size:9px;cursor:pointer}
.size-mode-tabs button.active{border-color:#75ae9e;background:#e9f5f1;color:var(--brand-dark);font-weight:800}
.legend-line.bleed{border-color:#3cb554}
.legend-line.trim{border-color:#2b3a9e}
.legend-line.crease-red{border-color:#e5484d;border-top-style:dashed}
.dimension-systems{margin-top:10px}
.dimension-systems dd{font-variant-numeric:tabular-nums}
.advanced-params{margin-top:10px;border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:#fafcfb}
.advanced-params summary{cursor:pointer;font-weight:700;font-size:10px;color:var(--brand-dark)}
.advanced-params .two-grid{margin-top:8px}
/* CUNG và BEZIER xuất ra `<path>`, đoạn thẳng xuất ra `<line>`. Bộ chọn cũ chỉ
   bắt `line` nên mọi góc bo rơi khỏi luật này: chúng giữ `stroke-width` 0,6 của
   thẻ `<g>` (đơn vị mm, CO LẠI theo viewBox) trong khi đoạn thẳng được ghim
   1,35 px không đổi ⇒ nét cung MẢNH HƠN hẳn (owner 2026-08-16). Phải liệt kê cả
   `path` ở MỌI lớp, nếu không thêm lớp cung mới lại tái diễn. */
.svg-mount svg #BLEED line,.svg-mount svg #BLEED path{stroke-width:1.35px;vector-effect:non-scaling-stroke}
.svg-mount svg #ANNOTATION line,.svg-mount svg #ANNOTATION path{stroke-width:1px;vector-effect:non-scaling-stroke}
/* v0.7.2: pan 2D + thumbnail thư viện */
.drawing-viewport{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none}
.drawing-viewport.dragging{cursor:grabbing}
/* v0.9.21: kéo chuột để pan hay vô tình quét chọn chữ trên canvas (SVG
   <text> vẫn selectable mặc định) — khoá select trên toàn bộ SVG để kéo là
   thuần pan, không dính bôi xanh văn bản. */
.svg-mount,.svg-mount *{user-select:none;-webkit-user-select:none;-moz-user-select:none}
.template-icon img{width:100%;height:100%;object-fit:contain;border-radius:6px}
/* Thẻ mẫu bố cục kiểu landing (owner 2026-08-28): khuôn 2D to + hộp 3D nhỏ góc phải. */
.library-card-visual.has-thumb{display:block;position:relative;background:#f7faf8 radial-gradient(#d9e5df 1px,transparent 1.5px);background-size:14px 14px;border-radius:8px;padding:8px;overflow:hidden;min-height:150px}
.library-card-visual.has-thumb .thumb-2d{display:block;width:100%;height:150px;object-fit:contain}
.library-card-visual.has-thumb .thumb-3d{position:absolute;right:8px;bottom:8px;width:56px;height:56px;object-fit:contain;filter:drop-shadow(0 3px 6px rgba(20,40,32,.28))}
/* Camera 3D: một hàng duy nhất, Tự xoay nằm cùng hàng */
.camera-presets{flex-wrap:nowrap;max-width:none;overflow-x:auto}
/* Menu popover: chữ tối trên nền trắng; nút xuất phụ trên topbar */
.menu-popover button{color:var(--ink)}
.button-ghost{background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.25)}
.button-ghost:hover{background:rgba(255,255,255,.24)}
/* Upload artwork + xuất video 3D */
.artwork-row{display:flex;gap:6px;align-items:center;margin-top:8px;flex-wrap:wrap}
.artwork-upload{display:inline-flex;align-items:center;gap:5px;border:1px dashed #b9c6c0;border-radius:6px;padding:5px 8px;font-size:8px;cursor:pointer;background:#fbfdfc}
.artwork-upload input{max-width:150px;font-size:8px}
.artwork-row button{border:1px solid #d9e0e4;border-radius:6px;background:#fff;padding:6px 8px;font-size:8px;cursor:pointer}
.artwork-row .mini-primary{background:var(--brand);color:#fff;border-color:var(--brand)}

/* Ô nhập góc gấp bằng SỐ (v0.9.57) — anh Nhân yêu cầu gõ số thay vì chỉ kéo. */
.angle-row{display:flex;align-items:center;gap:8px}
.angle-row input[type=range]{flex:1}
.angle-row input[type=number]{width:74px;padding:4px 6px;text-align:right;border:1px solid var(--line,#d6dde5);border-radius:6px;font:inherit}
.angle-row .deg{color:#6b7a88;margin-left:-4px}


/* Công tắc "chỉ đổi ô vừa sửa": nằm trong panel Tham số nâng cao, không dùng
   padding-top 18px của .check-field (vốn để căn với ô nhập cùng hàng). */
.check-field.lock-chain{padding:8px 0 2px;gap:6px}
.check-field.lock-chain span{margin:0;color:#3b4a57;font-size:8.5px;font-weight:700;white-space:normal}
.library-group{grid-column:1/-1;display:flex;align-items:baseline;gap:8px;margin:10px 0 2px;padding-bottom:6px;border-bottom:1px solid #dfe6ea}.library-group h3{margin:0;font-size:14px;font-weight:800;color:#1f2f3a}.library-group small{color:#71808d;font-size:11px}.filter-chips .cnt{margin-left:5px;font-size:10px;color:#71808d;font-weight:600}.filter-chips button.active .cnt{color:var(--brand-dark)}.library-count{margin-left:8px;font-size:12px;font-weight:600;color:#71808d}

/* Bấm thẳng vào kích thước trên bản vẽ để nhảy tới ô tham số của nó
   (owner 2026-09-03). Con trỏ bàn tay báo cho biết cụm nào bấm được. */
#svgMount svg [id^="dim-"] { cursor: pointer; }
/* Ô tham số ĐANG CHỌN — viền xanh, giữ nguyên cho tới khi chọn ô khác
   (owner 2026-09-03: "khi bấm vào ô thì bên tham số nâng cao sẽ tô viền xanh
   ô tương ứng"). Sáng ở CẢ HAI chiều: bấm trên bản vẽ, hoặc focus trong bảng. */
input.param-dang-chon, select.param-dang-chon {
  outline: 2px solid #1f7a5c;
  outline-offset: 1px;
  background: #eefaf5;
}
label.field.param-dang-chon > .param-name { color: #1f7a5c; font-weight: 800; }

/* Ô SỬA NHANH nổi ngay trên bản vẽ — đường sửa thứ hai, ghi thẳng vào chính ô
   của bảng tham số nâng cao nên hai đường luôn khớp nhau. */
.dim-inline-editor {
  position: absolute; z-index: 6; display: flex; align-items: center; gap: 6px;
  padding: 6px 8px; border: 1px solid #75ae9e; border-radius: 9px;
  background: rgba(255,255,255,.97); box-shadow: 0 10px 26px rgba(35,50,61,.16);
}
.dim-inline-editor .dim-inline-name {
  max-width: 128px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: #1f7a5c; font-size: 9px; font-weight: 800;
}
.dim-inline-editor .dim-inline-input {
  width: 78px; height: 26px; border: 1px solid #d7dfe3; border-radius: 6px;
  padding: 0 6px; font-size: 10px;
}
.dim-inline-editor button {
  width: 22px; height: 22px; border: 1px solid #d9e0e4; border-radius: 6px;
  background: #fff; color: #65727e; font-size: 10px; line-height: 1; cursor: pointer;
}
.dim-inline-editor button:hover { background: #edf5f2; }

/* ---- Nhúng trong panel Illustrator (v0.9.227): thanh lệnh đặt khuôn vào artboard ---- */
.nhung-cep body{padding-bottom:52px}
.thanh-cep{position:fixed;left:0;right:0;bottom:0;z-index:80;display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px 12px;background:#17322b;color:#e8f3ee;font:600 12px/1.3 system-ui,sans-serif;box-shadow:0 -6px 18px rgba(0,0,0,.18)}
.thanh-cep span{letter-spacing:.08em;text-transform:uppercase;font-size:11px;opacity:.8;margin-right:4px}
.thanh-cep button{border:1px solid #4f8f78;border-radius:7px;background:#234b40;color:#fff;padding:7px 12px;font:inherit;cursor:pointer}
.thanh-cep button.primary{background:#29a77a;border-color:#29a77a;color:#062218}
.thanh-cep button:hover{filter:brightness(1.1)}
/* Chọn nhiều nếp cấn (v0.9.235) — nút Chọn tất cả / Bỏ chọn + đếm nếp đang chọn. */
.hinge-pick{display:flex;align-items:center;gap:5px}
.hinge-pick output{color:var(--brand-dark,#1f7a5c);font-size:8px;font-weight:700;white-space:nowrap}
/* Mốc gấp do người dùng đặt (v0.9.235). */
.keyframes{display:flex;align-items:center;gap:5px}
.kf-list{display:flex;gap:3px}
.kf-chip{min-width:22px;padding:5px 6px!important;font-weight:700}
.kf-chip.active{border-color:#75ae9e!important;background:#e9f5f1!important;color:var(--brand-dark,#1f7a5c)}

/* Dự án / Workspace (v0.9.260, docs/14) */
.ds-project{display:flex;align-items:center;gap:8px;margin:6px 0 4px;font-size:11px;color:#31404a}.ds-project #dsProjectName{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.ds-project-state{padding:2px 7px;border-radius:999px;background:#e6f3ef;color:#18745f;font-size:9px;font-weight:700}.ds-project-state.dirty{background:#fdecec;color:#b3261e}
.project-drawer{width:min(1080px,94vw)}.project-tools{display:flex;align-items:center;gap:8px}.project-tools select{height:32px;border:1px solid #d5dde2;border-radius:8px;background:#fff;padding:0 8px;font-size:11px}
.project-actions{display:flex;gap:8px;margin:14px 0 16px}
.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:14px}
.project-card{position:relative;display:flex;flex-direction:column;border:1px solid #d9e1e5;border-radius:12px;background:#fff;overflow:hidden;cursor:pointer;transition:box-shadow .15s,transform .15s}.project-card:hover{box-shadow:0 8px 22px rgba(20,40,50,.12);transform:translateY(-1px)}.project-card.favorite{border-color:#e0b64a}
.project-card .pc-visual{position:relative;height:150px;background:#f7faf8 radial-gradient(#d9e5df 1px,transparent 1px);background-size:12px 12px;display:flex;align-items:center;justify-content:center}.project-card .pc-visual img.pc-2d{width:100%;height:150px;object-fit:contain}.project-card .pc-visual img.pc-3d{position:absolute;right:8px;bottom:8px;width:52px;height:52px;object-fit:contain}
.project-card .pc-body{padding:9px 10px 10px}.project-card .pc-name{font-weight:700;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.project-card .pc-meta{margin-top:3px;font-size:10px;color:#6a7883;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.project-card .pc-date{font-size:9.5px;color:#8a97a1;margin-top:2px}
.project-card .pc-fav,.project-card .pc-more{position:absolute;top:6px;width:26px;height:26px;border-radius:8px;border:1px solid #d9e1e5;background:#fff;cursor:pointer;font-size:13px;line-height:1;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s}.project-card:hover .pc-fav,.project-card:hover .pc-more,.project-card.favorite .pc-fav,.project-card.menu-open .pc-more{opacity:1}.project-card .pc-fav{left:6px}.project-card .pc-more{right:6px}.project-card.favorite .pc-fav{color:#d39a00}
.pc-menu{position:absolute;top:36px;right:6px;z-index:5;min-width:150px;padding:6px;border:1px solid #d9e1e5;border-radius:10px;background:#fff;box-shadow:0 10px 26px rgba(20,40,50,.16);display:none}.project-card.menu-open .pc-menu{display:block}.pc-menu button{display:block;width:100%;padding:7px 10px;border:0;background:none;text-align:left;font-size:11px;border-radius:7px;cursor:pointer}.pc-menu button:hover{background:#eef4f2}.pc-menu button.danger{color:#b3261e}
.name-dialog{border:0;border-radius:14px;padding:18px 20px;width:min(420px,92vw);box-shadow:0 24px 60px rgba(10,30,30,.3)}.name-dialog::backdrop{background:rgba(11,25,22,.42)}.name-dialog label{display:block;font-size:11px;font-weight:700;color:#31404a}.name-dialog input{display:block;width:100%;margin-top:6px;height:38px;border:1px solid #cfd8dd;border-radius:9px;padding:0 10px;font-size:13px}.name-dialog menu{display:flex;justify-content:flex-end;gap:8px;margin:14px 0 0;padding:0}
