:root{--bg: #f4f5f7;--panel: #ffffff;--ink: #1c2128;--muted: #6b7280;--line: #e3e6ea;--accent: #2f6feb;--accent-soft: #e8f0fe;--ok: #1a7f37;--warn: #b7791f;--err: #cf222e;--radius: 10px;--shadow: 0 1px 3px rgba(0, 0, 0, .08), 0 1px 2px rgba(0, 0, 0, .04)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font:14px/1.45 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--ink);background:var(--bg)}.app{display:flex;flex-direction:column;height:100%}.topbar{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;padding:7px 12px;background:var(--panel);border-bottom:1px solid var(--line);z-index:5;overflow-x:auto}.topbar::-webkit-scrollbar{height:0}.topbar>*{flex:none}.topbar .brand{font-weight:700;letter-spacing:-.01em;font-size:13px;width:26px;height:26px;display:grid;place-items:center;background:var(--accent-soft);color:var(--accent);border-radius:7px}.pname{border:1px solid transparent;background:transparent;font:inherit;font-weight:600;padding:4px 8px;border-radius:6px;width:160px;flex:0 1 160px;min-width:90px}.pname:hover{border-color:var(--line)}.pname:focus{border-color:var(--accent);outline:none;background:#fff}.tabs{display:flex;gap:3px;margin-left:auto}.tabs button{border:1px solid var(--line);background:var(--panel);padding:6px 11px;border-radius:8px;cursor:pointer;font:inherit;font-size:13px;color:var(--muted);white-space:nowrap}.tabs button.active{background:var(--accent);border-color:var(--accent);color:#fff}.save{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}.dot{width:9px;height:9px;border-radius:50%;background:var(--muted);cursor:pointer}@media (max-width: 1180px){.topbar-hideable{display:none!important}}@media (max-width: 1040px){.tabs button{padding:6px 8px;font-size:12px}.pname{flex-basis:120px}}.save.saved .dot{background:var(--ok)}.save.saving .dot,.save.dirty .dot{background:var(--warn)}.save.error .dot{background:var(--err)}.main{flex:1;display:flex;min-height:0}.viewport{flex:1;position:relative;background:linear-gradient(#eef1f5,#dfe3e9);min-width:0}.viewport .hud{position:absolute;left:12px;bottom:12px;display:flex;gap:10px;align-items:center;background:#ffffffe6;border:1px solid var(--line);border-radius:8px;padding:8px 10px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.viewport .legend{position:absolute;right:12px;top:12px;background:#ffffffeb;border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:12px;color:var(--muted)}.sidebar{width:380px;background:var(--panel);border-left:1px solid var(--line);overflow-y:auto;padding:14px}.sidebar.wide{width:620px}.panelwrap{flex:1;overflow-y:auto;background:var(--bg);padding:18px}.group{border:1px solid var(--line);border-radius:var(--radius);margin-bottom:12px;background:#fff;overflow:hidden}.group>h3{margin:0;padding:10px 12px;font-size:13px;background:#fafbfc;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px}.group>.body{padding:12px;display:flex;flex-direction:column;gap:10px}.row{display:flex;gap:8px;align-items:center}.row.wrap{flex-wrap:wrap}.field{display:flex;flex-direction:column;gap:4px;flex:1}.field>label{font-size:12px;color:var(--muted)}.hint{font-size:11px;color:var(--muted)}.num{display:flex;align-items:center;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff}.num button{border:none;background:#f4f5f7;width:30px;height:34px;cursor:pointer;font-size:16px;color:var(--muted)}.num button:hover{background:#e9ebef;color:var(--ink)}.num input{border:none;width:100%;flex:1 1 auto;min-width:0;padding:8px;font:inherit;text-align:center;-moz-appearance:textfield}.num input::-webkit-outer-spin-button,.num input::-webkit-inner-spin-button{-webkit-appearance:none}.num .unit{padding:0 8px;color:var(--muted);font-size:12px}.num--dense button{width:22px;height:32px;font-size:15px}.num--dense input{padding:6px 2px;font-size:12px}.num--dense .unit{padding:0 3px;font-size:10px}.num--plain input{text-align:center;padding:7px 4px}.num--plain .unit{padding:0 5px 0 2px}select,input[type=text]{border:1px solid var(--line);border-radius:8px;padding:8px;font:inherit;background:#fff;width:100%}select:focus,input:focus{outline:none;border-color:var(--accent)}.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}.seg button{border:none;background:#fff;padding:7px 12px;cursor:pointer;font:inherit;color:var(--muted);border-left:1px solid var(--line)}.seg button:first-child{border-left:none}.seg button.active{background:var(--accent-soft);color:var(--accent);font-weight:600}.btn{border:1px solid var(--line);background:#fff;padding:8px 12px;border-radius:8px;cursor:pointer;font:inherit}.btn:hover{background:#f4f5f7}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{filter:brightness(1.05)}.btn.ghost{border-color:transparent;color:var(--accent)}.btn.sm{padding:4px 8px;font-size:12px}.btn.danger{color:var(--err)}.presets{display:flex;flex-wrap:wrap;gap:6px}.presets button{flex:1;min-width:80px}.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border-radius:999px;background:#f0f2f5;font-size:12px}.chip.warn{background:#fff3bf;color:#664d03}.ctxmenu{background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 6px 24px #00000024;padding:4px}.ceil-align{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:8px}.ceil-align__sep{width:1px;align-self:stretch;background:var(--line);margin:2px}table.data tfoot td{border-top:2px solid var(--line);background:#fafbfc}.swatch{width:14px;height:14px;border-radius:3px;border:1px solid rgba(0,0,0,.15);flex:none}.cols{display:flex;gap:6px;align-items:stretch}.col-card{flex:1;border:1px solid var(--line);border-radius:8px;padding:8px;background:#fbfcfd;display:flex;flex-direction:column;gap:6px;min-width:0}.col-card.sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.col-card.wide{width:100%}.col-card h4{margin:0;font-size:12px;display:flex;justify-content:space-between;align-items:center}.sectabs{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:10px}.sectab{display:flex;align-items:center;gap:4px;border:1px solid var(--line);background:#fff;border-radius:8px;padding:6px 10px;cursor:pointer;font:inherit;color:var(--muted);min-width:42px;justify-content:center}.sectab.active{background:var(--accent);border-color:var(--accent);color:#fff}.sectab .mini{font-size:13px}.rolerow{display:flex;flex-direction:column;gap:3px;padding:6px 0;border-bottom:1px dashed var(--line)}.rolerow:last-of-type{border-bottom:none}.rolerow__label{font-size:12px;font-weight:600}.mini{font-size:11px;color:var(--muted)}table.data{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}table.data th,table.data td{padding:7px 10px;text-align:left;border-bottom:1px solid var(--line);font-size:13px}table.data th{background:#fafbfc;font-weight:600;color:var(--muted);position:sticky;top:0}table.data tr:hover td{background:#f7f9fc}table.data tr.sel td{background:var(--accent-soft)}table.data td.num-c,table.data th.num-c{text-align:right;font-variant-numeric:tabular-nums}.totals{margin-top:14px;background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:14px;max-width:420px}.totals .line{display:flex;justify-content:space-between;padding:4px 0}.totals .grand{border-top:2px solid var(--ink);margin-top:6px;padding-top:8px;font-weight:700;font-size:16px}.section-title{margin:4px 0 10px;font-size:15px}.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}.pcard{border:1px solid var(--line);border-radius:10px;background:#fff;padding:10px}.pcard.sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.pcard svg{width:100%;height:130px;display:block}.pcard .cap{display:flex;justify-content:space-between;font-size:12px;margin-top:6px}.banner{background:#fff8e6;border:1px solid #f2d98c;color:#7a5b0b;padding:8px 12px;border-radius:8px;font-size:13px;margin-bottom:12px}.loading{display:grid;place-items:center;height:100%;color:var(--muted)}.matbtn{display:flex;align-items:center;gap:8px;width:100%;text-align:left}.matbtn__th{flex:none;font-size:11px;font-weight:600;color:var(--accent);background:var(--accent-soft);border-radius:5px;padding:1px 6px;white-space:nowrap}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000059;display:grid;place-items:center;z-index:50}.modal{background:#fff;border-radius:12px;width:min(760px,92vw);max-height:82vh;display:flex;flex-direction:column;overflow:hidden}.modal header{padding:12px 16px;border-bottom:1px solid var(--line);display:flex;gap:10px;align-items:center}.modal .list{overflow-y:auto;padding:8px}.modal .mrow{display:flex;align-items:center;gap:10px;padding:8px;border-radius:8px;cursor:pointer}.modal .mrow:hover{background:#f4f5f7}.modal .mrow.active{background:var(--accent-soft)}.recentbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--line);background:#fafbfc}.recentchip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--line);border-radius:999px;background:#fff;cursor:pointer;font:inherit;max-width:200px}.recentchip:hover{background:var(--accent-soft)}.recentchip.active{border-color:var(--accent)}.recentchip__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.help{color:var(--muted);font-size:12px;margin:2px 0 0}kbd{background:#f0f2f5;border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;padding:0 5px;font-size:11px}.authwrap{height:100%;display:grid;place-items:center;background:linear-gradient(160deg,#eef1f6,#dde3ec)}.authcard{width:360px;background:#fff;border:1px solid var(--line);border-radius:14px;padding:24px;display:flex;flex-direction:column;gap:14px;box-shadow:0 10px 40px #0000001f}.authbrand{font-size:18px;font-weight:700;text-align:center}.authbrand span{display:block;font-size:12px;font-weight:400;color:var(--muted)}.authcard .field>span{font-size:12px;color:var(--muted)}.authcard input{width:100%}.userchip{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}.ctxmenu{position:fixed;z-index:60;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow);padding:4px;min-width:190px}.ctxmenu button{display:flex;width:100%;gap:8px;align-items:center;border:none;background:transparent;padding:7px 10px;border-radius:6px;cursor:pointer;font:inherit;text-align:left}.ctxmenu button:hover{background:var(--accent-soft)}.ctxmenu hr{border:none;border-top:1px solid var(--line);margin:4px 0}.ctxmenu .danger{color:var(--err)}.plist{display:flex;flex-direction:column;gap:4px}.pitem{display:flex;align-items:center;gap:8px;padding:7px 8px;border:1px solid var(--line);border-radius:8px;cursor:pointer;background:#fff}.pitem.sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.pitem .grow{flex:1;min-width:0;overflow:hidden}.pitem .grow div:first-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.emptybox{text-align:center;color:var(--muted);padding:24px 12px;border:1px dashed var(--line);border-radius:10px}.tag3d{background:#fffffff0;border:1px solid #cfd6df;border-radius:6px;padding:2px 7px;font-size:12px;font-weight:600;color:#1c2128;white-space:nowrap}.selpanel{position:absolute;left:50%;transform:translate(-50%);bottom:12px;background:#fffffff7;border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:10px 12px;width:min(460px,70vw);display:flex;flex-direction:column;gap:6px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.selpanel .drag-handle{align-self:stretch;margin:-10px -12px 2px;padding:3px 0;text-align:center;color:var(--muted);cursor:grab;border-radius:10px 10px 0 0;background:#eef1f5;letter-spacing:3px;-webkit-user-select:none;user-select:none;touch-action:none;font-size:12px}.selpanel .drag-handle:active{cursor:grabbing}.selpanel__row{display:flex;align-items:center;gap:6px;font-size:13px;flex-wrap:wrap}.nudge{display:grid;grid-template-columns:repeat(3,30px);grid-auto-rows:26px;gap:3px}.nudge button{border:1px solid var(--line);background:#fff;border-radius:6px;cursor:pointer;font-size:13px}.nudge button:hover{background:var(--accent-soft)}.grphead{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:8px;background:#eef2f8;border:1px solid var(--line);cursor:pointer;margin-top:6px}.grphead.sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.grptag{font-size:11px;background:var(--accent);color:#fff;border-radius:999px;padding:1px 7px}.grpbody{padding-left:10px;border-left:2px solid var(--line);margin-left:6px;display:flex;flex-direction:column;gap:4px}.selmark{width:18px;height:18px;border:1px solid var(--line);border-radius:4px;flex:none;display:grid;place-items:center;font-size:11px;background:#fff}.selmark.on{background:var(--accent);border-color:var(--accent);color:#fff}.main.report .viewport{flex:0 0 300px}.main.report .panelwrap{flex:1 1 auto}.drillgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:14px;align-items:start}.drillcard{border:1px solid var(--line);border-radius:10px;background:#fff;padding:12px;break-inside:avoid;page-break-inside:avoid;cursor:pointer;align-self:start}.drillcard.sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}.drillcard svg{width:100%;height:auto;display:block}.drillcard table.data{font-size:11px}.drillcard table.data td{padding:2px 5px}@media print{@page{margin:12mm}.topbar,.viewport,.sidebar,.warnstrip,.hud,.selpanel{display:none!important}.app,.main,.main.report{display:block!important;height:auto!important}.panelwrap,.main.report .panelwrap{flex:none!important;overflow:visible!important;padding:0!important;background:#fff!important}.drillgrid{grid-template-columns:1fr 1fr;gap:8px}.cards{grid-template-columns:1fr 1fr 1fr}.drillcard,.pcard,tr,table{break-inside:avoid;page-break-inside:avoid}.btn,button,.seg,.no-print{display:none!important}.section-title{break-after:avoid}a[href]:after{content:none!important}}.reportmeta{font-size:12px;color:var(--muted);margin:6px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--line)}.shotgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.shotgrid figure{margin:0;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#eef1f5;break-inside:avoid}.shotgrid img{width:100%;display:block}.shotgrid figcaption{font-size:11px;padding:4px 8px;color:var(--muted);background:#fff;border-top:1px solid var(--line)}.reportsection{margin-top:20px}@media print{.reportsection{page-break-before:always}.shotgrid{grid-template-columns:1fr 1fr}.reportmeta{break-inside:avoid}}.dwggrid{display:flex;flex-wrap:wrap;gap:14px;align-items:flex-start}.dwgfig{margin:0;border:1px solid var(--line);border-radius:8px;background:#fff;padding:10px;break-inside:avoid}.dwgfig svg{display:block;max-width:100%;height:auto}.dwgfig figcaption{font-size:11px;color:var(--muted);margin-top:4px}@media print{.dwggrid{gap:8px}}.nestblock{margin-bottom:18px;break-inside:avoid}.nestblock h4{margin:8px 0 2px;font-size:13px}.nestmeta{font-size:12px;color:var(--muted);margin-bottom:8px}.nestsheets{display:flex;flex-wrap:wrap;gap:12px}.nestfig{margin:0;border:1px solid var(--line);border-radius:8px;background:#fff;padding:8px;break-inside:avoid}.nestfig svg{display:block;max-width:100%;height:auto}.nestfig figcaption{font-size:11px;color:var(--muted);margin-top:4px}@media print{.nestfig{page-break-inside:avoid}}.ceilwrap{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}.ceilcol{flex:1 1 340px;min-width:300px;max-width:400px}.ceilcol--wide{flex:2 1 480px;max-width:none}.ceilfig{margin:10px 0 4px;border:1px solid var(--line);border-radius:8px;background:#fff;padding:10px}.ceilfig svg{display:block}.ceilfig figcaption{font-size:11px;color:var(--muted);margin-top:4px}.ceilfig figcaption a,table.data a{color:var(--accent)}@media print{.app,.main{display:block!important;height:auto!important}.topbar,.ceilcol:first-child,.btn,button{display:none!important}.panelwrap{overflow:visible!important;padding:0!important}.ceilwrap{display:block}.ceilcol--wide{max-width:none;flex-basis:100%}.ceilfig,table.data,.totals,tr{break-inside:avoid;page-break-inside:avoid}table.data a{color:#000;text-decoration:none}table.data a:after{content:" (" attr(href) ")";font-size:9px;color:#666;word-break:break-all}}
