:root{--paper:#F5F5F3;--panel:#E4E2DD;--inset:#E7E5E0;--soft:#EFEEEA;--ink:#1A1A1A;--line:#C6C4BE;--muted:#83807A;--secondary:#6A6862;--faint:#9A978F;--orange:#E8502A;--blue:#4A6FA5;--red:#9E524B;--sidebar:236px;--left:264px;--rail:74px;--shadow:0 2px 3px #1a1a1a06,0 5px 12px #1a1a1a08;--mono:'IBM Plex Mono',Consolas,'SFMono-Regular',monospace;--sans:'IBM Plex Sans',Arial,'PingFang SC','Microsoft YaHei',sans-serif;color-scheme:light}
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden}body{font:13px var(--sans);color:var(--ink);background-color:var(--paper);background-image:radial-gradient(circle,color-mix(in srgb,var(--line) 60%,transparent) .85px,transparent 1.1px);background-size:16px 16px}button,input,select,textarea{font:inherit;color:inherit}button,a{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible{outline:2px solid var(--blue);outline-offset:3px}input:focus,select:focus,textarea:focus{outline:0;border-bottom-color:var(--blue)!important;box-shadow:0 1.25px 0 var(--blue)}input,textarea{min-width:0}a{color:var(--blue);text-decoration:none}h1,h2,h3,h4,p{margin:0;font-weight:400}h1{font-size:28px;letter-spacing:-.6px}h2{font-size:22px;letter-spacing:-.3px}h3{font-size:16px}h4{font-size:14px}p{line-height:1.85}strong,b{font-weight:500}small{font-size:11px;color:var(--muted)}svg{flex-shrink:0;vertical-align:middle}input[type=checkbox],input[type=radio]{accent-color:var(--blue);width:13px;height:13px;margin:0;flex-shrink:0}textarea{resize:vertical;line-height:1.7}.mono{font-family:var(--mono);font-size:10px;letter-spacing:.05em}.muted{color:var(--muted)}.faint{color:var(--faint)}.secondary{color:var(--secondary)}.blue{color:var(--blue)}.red,.required{color:var(--red)}.flex{display:flex;align-items:center;gap:12px}.between{display:flex;align-items:center;justify-content:space-between;gap:12px}.grow{flex:1;min-width:0}.stack{display:flex;flex-direction:column;gap:20px}.cols2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px}.cols3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.cols4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}.mt{margin-top:24px}.mb{margin-bottom:24px}.hidden{display:none!important}.skip-link{position:fixed;top:-100px;left:20px;z-index:5000;padding:10px;background:var(--paper)}.skip-link:focus{top:8px}
.panel,.sheet{border:1px solid #1a1a1a21;border-radius:10px;box-shadow:var(--shadow)}.panel{background-color:var(--panel)}.sheet{background-color:var(--paper)}.sidebar{position:fixed;left:14px;top:14px;bottom:14px;width:var(--sidebar);display:flex;flex-direction:column;z-index:20;overflow:hidden}.brand{height:45px;display:flex;align-items:center;gap:9px;padding:0 16px;font-size:16px;flex-shrink:0}.brand .brand-mark{display:inline-block;width:11px;height:11px;background:var(--orange);border-radius:2px}.brand .mono{margin-left:auto;font-size:8px;color:var(--faint)}.sidebar-nav{padding:0 7px}.nav-item{height:30px;border:0;background:none;width:100%;display:flex;align-items:center;text-align:left;gap:9px;padding:0 9px;border-radius:7px;position:relative}.nav-item svg{color:var(--muted);width:13px;height:13px}.nav-item.active{background:var(--paper);box-shadow:inset 2.5px 0 var(--orange)}.nav-item:hover{background:#f5f5f378}.nav-item .count{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--muted)}.nav-item .notice-dot{height:5px;width:5px;background:var(--orange);border-radius:50%;margin-left:auto}.nav-item .notice-dot+.count{margin-left:0}.side-scroll{padding:0 16px;flex:1;overflow:auto;scrollbar-width:none}.side-section{border-top:.5px solid var(--line);margin-top:17px;padding-top:12px}.side-caption{font-family:var(--mono);letter-spacing:.16em;font-size:9px;color:var(--muted);margin-bottom:11px;display:flex;align-items:center;justify-content:space-between}.side-caption .icon-btn{width:20px;height:20px}.side-link{background:none;border:0;display:flex;align-items:center;gap:5px;width:100%;padding:4px 0;text-align:left;color:var(--secondary);font-size:12px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.side-link:hover{color:var(--ink)}.side-link.indent{padding-left:13px}.side-scroll .side-link.group,.side-scroll .side-link.sub{width:calc(100% + 16px);margin:0 -8px;padding:4px 8px;border-radius:6px}.side-scroll .side-link.sub{padding-left:20px;color:var(--secondary)}.side-scroll .side-link.group:active,.side-scroll .side-link.sub:active{background:var(--paper)}.side-link.flash{animation:side-flash 1.6s cubic-bezier(.3,0,.2,1) both}@keyframes side-flash{0%{background:var(--paper);box-shadow:0 1px 1px rgba(26,26,26,.05)}100%{background:rgba(245,245,243,0);box-shadow:0 1px 1px rgba(26,26,26,0)}}.side-link.sub:hover{color:var(--ink)}.side-link.group{color:var(--ink)}.side-link .badge{margin-left:4px}.side-project-nav{margin:14px -9px 0}.side-project-nav .nav-item{padding-left:14px;height:29px}.side-project-nav .nav-item.active:before{content:'';width:5px;height:5px;background:var(--ink);position:absolute;left:6px}.sidebar-bottom{margin-top:auto;flex-shrink:0}.storage-trigger{display:flex;align-items:center;justify-content:space-between;border:0;border-top:.5px solid var(--line);background:none;width:calc(100% - 32px);margin:0 16px;padding:15px 0;text-align:left;font-size:12px}.user-trigger{background:none;border:0;border-top:.5px solid var(--line);width:100%;height:49px;display:flex;align-items:center;gap:9px;padding:0 15px;text-align:left}.user-trigger.active{background:var(--paper);box-shadow:inset 2.5px 0 var(--orange)}.user-trigger .avatar{width:27px;height:27px;background:var(--ink);color:var(--paper);border:none;border-radius:5px;font-size:10px}.user-trigger small{display:block;font-family:var(--mono);font-size:9px;letter-spacing:.08em}.collapse-side{position:absolute;right:7px;top:51px;background:transparent;border:0;padding:4px;color:var(--muted);z-index:2}.sidebar.collapsed{width:46px;overflow:visible}.collapsed .brand{padding:0;justify-content:center;height:36px}.collapsed .brand-name,.collapsed .brand .mono,.collapsed .nav-item .nav-label,.collapsed .nav-item .count,.collapsed .nav-item .notice-dot,.collapsed .side-scroll,.collapsed .storage-trigger span,.collapsed .user-trigger>span:not(.avatar){display:none}.collapsed .nav-item{justify-content:center;padding:0;width:30px;height:31px;margin:0 auto 4px;border-radius:6px}.collapsed .nav-item svg{width:14px;height:14px}.collapsed .nav-item.active{box-shadow:0 1px 2px rgba(26,26,26,.06)}.collapsed .nav-item.active:after{content:'';position:absolute;left:4px;top:8.5px;width:3px;height:14px;border-radius:2px;background:var(--orange)}.collapsed .sidebar-nav{padding:0 5px}.collapsed .collapse-side{right:-7px;width:16px;height:16px;padding:0;display:grid;place-items:center;background:var(--soft);border:1px solid rgba(26,26,26,.13);border-radius:4px;color:var(--muted);z-index:3;transition:top .22s cubic-bezier(.2,.7,.2,1)}.collapsed .collapse-side svg{width:9px;height:9px;transform:rotate(180deg)}.collapsed .collapse-side:hover{background:var(--paper);color:var(--ink)}.storage-trigger i{display:inline-flex;font-style:normal}.storage-trigger .storage-icon{display:none}.collapsed .storage-trigger{width:100%;margin:0;padding:7px 0;justify-content:center}.collapsed .storage-trigger .storage-arrow{display:none}.collapsed .storage-trigger .storage-icon{display:grid;place-items:center;width:30px;height:31px;border-radius:6px;color:var(--muted)}.collapsed .storage-trigger:hover .storage-icon{background:#f5f5f378;color:var(--ink)}.collapsed .user-trigger{padding:9px;justify-content:center}.collapsed .avatar{width:25px;height:25px}.app-collapsed{--left:74px;--sidebar:46px}
.main-sheet{position:fixed;left:var(--left);right:14px;top:14px;bottom:14px;display:flex;flex-direction:column;overflow:hidden}.main-sheet.has-rail{right:74px}.main-sheet.with-panel{right:358px}.main-sheet.has-rail.with-panel{right:422px}
/* 左上角「返回上一步」：不管从哪条路径进来的（node / run / files / templates 之间随便跳），
   就是浏览器后退一步。node / run / run-new / template 这几个页面自己的面包屑已经带了
   固定去处的蓝色「← xxx」链接，会跟这个按钮在同一个角落重叠，所以这几个页面不重复显示这个按钮 —— 见 app.js render() */
.hist-back{position:fixed;left:calc(var(--left) + 10px);top:10px;z-index:25;width:30px;height:30px;padding:0;
  border-radius:50%;border:1px solid rgba(26,26,26,.13);background:var(--paper);color:var(--secondary);
  font-size:15px;line-height:1;box-shadow:0 1px 2px rgba(26,26,26,.06),0 4px 10px rgba(26,26,26,.06)}
.hist-back:hover{color:var(--ink);background:var(--inset)}.main-content{padding:22px;flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.page-heading{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid var(--ink);padding-bottom:15px;margin-bottom:18px;min-height:47px;gap:16px;flex-shrink:0}.page-heading>div:first-child{display:flex;align-items:baseline;gap:16px;min-width:0}.page-heading>div:first-child>span{font-size:12px;color:var(--muted)}.actions{display:flex;align-items:center;gap:8px}.btn{border:1px solid var(--line);border-radius:7px;background:var(--inset);min-height:34px;padding:7px 13px;display:inline-flex;gap:7px;align-items:center;justify-content:center;white-space:nowrap;line-height:1.25;font-size:12px;text-decoration:none;transition:background .12s,box-shadow .12s}.btn:hover{background:#dcdbd5}.btn.primary{background:var(--ink);color:var(--paper);border-color:var(--ink)}.btn.primary:hover{background:#34332f}.btn.link{background:none;border:0;color:var(--blue);padding:0;min-height:20px;font-size:12px;box-shadow:none}.btn.link:hover{text-decoration:underline}.btn.text-button{border:0;background:none;padding:5px;min-height:20px}.btn.icon-btn{width:28px;height:28px;min-height:0;padding:5px;background:var(--paper);border-radius:5px;color:var(--muted)}.btn.icon-btn:hover{color:var(--ink);background:var(--inset)}.btn.dashed{background:transparent;border:1px dashed var(--faint)}.btn.danger{color:var(--red)}.chip{display:inline-block;font:9px var(--mono);letter-spacing:.06em;line-height:1.3;padding:3px 7px;background:var(--inset);border-radius:5px;white-space:nowrap}.chip.dark,.badge.dark{background:var(--ink);color:var(--paper)}.badge{font:9px var(--mono);letter-spacing:.06em;background:var(--inset);padding:2px 6px;border-radius:3px;white-space:nowrap;height:17px;line-height:13px}.badge.outlined{border:.75px solid var(--ink);background:transparent;padding:1px 5px}.tags{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.badge.context{background:var(--blue);color:var(--paper)}.toolbar{display:flex;gap:10px;align-items:center;flex-shrink:0;margin-bottom:13px}.search{display:flex;align-items:center;gap:8px;height:34px;background:var(--inset);border-radius:5px 5px 0 0;border-bottom:.75px solid var(--ink);padding:0 10px;color:var(--muted);min-width:120px;flex:1}.search input{border:0;background:none;padding:0;width:100%;height:100%;font-size:12px}.search input:focus{box-shadow:none}.search:focus-within{border-bottom:2px solid var(--blue)}.search .icon-btn{border:0;background:none;width:20px;height:20px;padding:2px}.filters{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:18px;flex-shrink:0}.filter{border:0;background:var(--inset);border-radius:5px;padding:4px 8px;font-size:10px;display:flex;gap:6px;white-space:nowrap}.filter.active{background:var(--ink);color:var(--paper)}.filter-count{font-family:var(--mono);font-size:9px;opacity:.75}.pagination{height:48px;margin-top:auto;display:flex;align-items:center;justify-content:space-between;border-top:.5px solid var(--line);flex-shrink:0;padding-top:10px}.pagination>.mono{color:var(--faint);font-size:10px}.pagination>div{display:flex;gap:5px}.btn.page-btn{min-height:27px;height:27px;padding:3px 12px;background:transparent;color:var(--faint);font-family:var(--mono);font-size:10px;min-width:37px}.btn.page-btn.primary{background:var(--ink);color:var(--paper)}.list-body{flex:1;min-height:0;overflow:auto;scrollbar-width:thin;scrollbar-color:#bab7af #eae8e3}
.project-groups{display:flex;flex-direction:column;gap:36px;padding-top:32px;overflow:hidden;flex:1;min-height:0;padding-bottom:24px}.project-group{--chamfer:40px;--frame-w:1.5px;--frame-c:#83807A;position:relative;min-height:0;padding:16px 14px 17.5px;border:0;border-top:var(--frame-w) dashed var(--frame-c);border-left:var(--frame-w) dashed var(--frame-c);border-radius:0;flex-shrink:0;margin-top:0}.project-group>.frame-r{position:absolute;right:0;top:calc(0px - var(--frame-w));height:calc(100% + var(--frame-w) - var(--chamfer));border-right:var(--frame-w) dashed var(--frame-c);pointer-events:none}.project-group>.frame-b{position:absolute;bottom:0;left:calc(0px - var(--frame-w));width:calc(100% + var(--frame-w) - var(--chamfer));border-bottom:var(--frame-w) dashed var(--frame-c);pointer-events:none}.project-group>.frame-d{position:absolute;right:0;bottom:0;width:var(--chamfer);height:var(--chamfer);overflow:visible;pointer-events:none}.project-group>.frame-d line{stroke:var(--frame-c);stroke-width:var(--frame-sw,1.5px);stroke-dasharray:calc(var(--frame-sw,1.5px) * 3) calc(var(--frame-sw,1.5px) * 2)}.cx-scroll{scrollbar-width:none!important}.cx-scroll::-webkit-scrollbar{display:none}.cx-track{position:absolute;background:#EAE8E3;border-radius:3px;visibility:hidden;z-index:2}.cx-track.on{visibility:visible}.cx-track.x{height:5px}.cx-track.y{width:5px}.cx-thumb{position:absolute;background:#BAB7AF;border-radius:3px;cursor:grab}.cx-track.x .cx-thumb{top:0;bottom:0;left:0}.cx-track.y .cx-thumb{left:0;right:0;top:0}.cx-thumb:active{cursor:grabbing;background:#9A978F}.project-group .row-track{position:relative;margin:12px calc(var(--chamfer) + 1px) 0 0}.project-group.fade-left::after{content:'';position:absolute;top:var(--fade-top);left:var(--fade-left);width:60px;height:var(--fade-h);background:linear-gradient(to left,transparent,var(--paper));pointer-events:none;z-index:1}.group-tabs{position:absolute;top:-28.5px;left:calc(0px - var(--frame-w));display:flex;align-items:flex-end;z-index:3}.sub-tab{position:relative;margin-left:-7px;padding:5px 9px 5px 15px;border:1px solid var(--line);background:var(--paper);border-radius:3px;font:10px var(--mono);letter-spacing:.04em;color:var(--secondary);white-space:nowrap;transition:transform .15s ease}.sub-tab:hover,.sub-tab:focus-visible{transform:translateY(-3px);color:var(--ink);z-index:20!important}.sub-tab.more{color:var(--muted)}.group-label.parent{background:var(--ink);color:var(--paper);border-color:var(--ink)}.group-label.parent span{color:var(--line)}.subgroup{position:relative;isolation:isolate;flex-shrink:0;display:flex;margin:18px 3px 3px 0}.subgroup::before{content:'';position:absolute;inset:3px -3px -3px 3px;z-index:-1;background:var(--inset);border-radius:2px;pointer-events:none;transition:box-shadow .2s}.subgroup.flash::before{box-shadow:0 0 0 1px var(--blue)}.subgroup-row{display:flex;gap:10px}.subgroup-label{position:absolute;top:-18px;left:0;background:var(--paper);border:1px solid var(--line);border-radius:3px;padding:2px 6px;font:9px var(--mono);letter-spacing:.04em;color:var(--secondary);white-space:nowrap}.subgroup-label span{color:var(--faint)}.project-row{align-items:flex-end}.project-group .row-track:not(.on){display:none}.group-label{position:relative;z-index:10;border:1px solid var(--line);background:var(--paper);border-radius:3px;padding:5px 9px;font:10px var(--mono);letter-spacing:.04em}.group-label span{color:var(--faint);margin-left:8px}.project-row{display:flex;gap:14px;overflow-x:auto;overflow-y:hidden;padding-bottom:0;scrollbar-width:none}.project-group.fade-right::before{content:'';position:absolute;top:var(--fade-top);right:var(--fade-right);width:60px;height:var(--fade-h);background:linear-gradient(to right,transparent,var(--paper));pointer-events:none;z-index:1}.project-card{flex:0 0 326px;min-height:114px;display:flex;flex-direction:column;border:.5px solid var(--line);background:var(--paper);padding:12px 13px;text-align:left;cursor:pointer;position:relative;border-radius:2px}.project-card:hover{border-color:var(--ink)}.project-card .card-title{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:9px}.project-card h3{font-size:15px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.project-card p{font-size:12px;color:var(--muted);line-height:1.4;margin-bottom:11px}.project-card .tags{margin-bottom:10px}.card-meta{font:10px var(--mono);color:var(--faint);border-top:.5px solid var(--line);padding-top:9px;margin-top:auto}.group-add{position:absolute;right:calc(var(--chamfer) / 3 - 10px);bottom:calc(var(--chamfer) / 3 - 10px);width:20px;height:20px;padding:0;display:grid;place-items:center;border:0;background:transparent;color:var(--orange);z-index:2}.group-add:hover{color:#C23E1C}.subgroup-label:not(.locked),.group-tabs .group-label{cursor:grab}.subgroup-label:not(.locked):hover{color:var(--ink);border-color:var(--ink)}
.drag-ghost{position:fixed!important;z-index:500;pointer-events:none;margin:0!important;box-shadow:0 6px 16px rgba(26,26,26,.16);transform:translateX(6px);opacity:.97;background:var(--paper)}.drag-ghost.ghost-group{opacity:.9}
/* 原位置留空：卡片（连同它的 offset）整体跟着拖影走，原地什么都不留 */
.drag-origin{visibility:hidden!important}
/* 子组成员被拖起时，子组整块 offset 暂时交给影子层画（挖掉原位置那一格） */
.subgroup.tether-src::before,.subgroup.tether-src>.sub-offs{visibility:hidden}
/* 多行子组的 offset：按实际排布拼形状，最后一行不满时停在最后一张卡 */
.subgroup.shaped::before{visibility:hidden}.sub-offs{position:absolute;inset:0;z-index:-1;pointer-events:none}.sub-offs>i{position:absolute;background:var(--inset);border-radius:2px}.sub-offs>i.join{border-radius:0}
.modal.detail-modal{width:min(620px,calc(100vw - 96px))!important;max-width:none;will-change:transform}
.modal.detail-modal>header{height:46px;min-height:46px;border-bottom:0;padding:0 22px 0 30px}.modal.detail-modal>header h2{display:none}.modal.detail-modal>header .mono{font-size:10px;letter-spacing:.06em}
.detail-head{padding:2px 30px 18px}
.detail-title{font-size:26px;font-weight:400;letter-spacing:-.02em;line-height:1.25;color:var(--ink);word-break:break-word}
.detail-lines{margin-top:14px}.detail-lines p{font-size:12.5px;line-height:1.75;color:var(--secondary)}.detail-lines p.faint{color:var(--faint)}
.detail-editor{position:relative;height:220px;margin:0 30px 6px;background:var(--inset);border-bottom:.75px solid var(--ink);border-radius:5px 5px 0 0;display:flex}
.detail-editor:focus-within{border-bottom:2px solid var(--blue);margin-bottom:4.75px}
#detail-text{flex:1;resize:none;border:0;background:transparent;padding:16px 18px;font:13px/1.85 var(--sans);color:var(--ink);outline:none;scrollbar-width:thin;scrollbar-color:#BAB7AF transparent}
.detail-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;border:0;background:none;color:var(--muted);cursor:text}
.detail-empty span{font-size:15px;color:var(--secondary);letter-spacing:.04em}.detail-empty small{font-size:11px;color:var(--faint)}.detail-empty:hover span{color:var(--ink)}
.detail-editor.has-text .detail-empty,.detail-editor:focus-within .detail-empty{display:none}
.modal.detail-modal>footer{border-top:0;min-height:0;padding:8px 30px 22px}.modal.detail-modal>footer .detail-date{margin-left:auto;font:10px var(--mono);color:var(--faint);letter-spacing:.02em}
.detail-btn[hidden]{display:none!important}.detail-btn.pop{animation:pop-in .24s cubic-bezier(.2,.8,.2,1)}@keyframes pop-in{from{opacity:0;transform:translateY(6px) scale(.95)}to{opacity:1;transform:none}}
.drop-ph{flex-shrink:0;box-sizing:border-box;border:1px dashed var(--muted);border-radius:2px;display:grid;place-items:center;color:var(--muted);background:var(--paper);animation:ph-in .2s ease-out}.drop-ph svg{width:18px;height:18px}.drop-ph.ph-sub{margin:18px 3px 3px 0}@keyframes ph-in{from{opacity:0;transform:scale(.97)}to{opacity:1;transform:none}}
body.is-dragging,body.is-dragging *{cursor:grabbing!important;user-select:none!important}
.project-row:has(>.subgroup)>.project-card,.project-row:has(>.subgroup)>.drop-ph.ph-project{margin-bottom:3px}.btn.danger-text{color:var(--red)}.group-editor{height:calc(100dvh - 72px)}.scroll-frame{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}.scroll-frame>.cx-track.y{left:15px;top:16px;bottom:16px}.scroll-frame.has-scroll>.modal-content{padding-left:32px}.project-card{user-select:none}.project-card .card-flags{display:flex;align-items:center;gap:8px;flex-shrink:0}.project-card .project-lock{display:grid;place-items:center;color:var(--secondary);font-style:normal}.project-card.selected,.project-card.selected:hover{border-color:var(--blue);box-shadow:0 0 0 .6px var(--blue)}.project-card.cut{opacity:.45;border-style:dashed}.gallery-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px;align-content:start;flex:1;min-height:0;overflow:auto;padding-bottom:24px}.gallery-card{border:.5px solid var(--line);background:var(--paper);border-radius:2px;text-align:left;cursor:pointer;min-width:0;display:flex;flex-direction:column}.gallery-card:hover{border-color:var(--ink)}.cover-placeholder{height:190px;background:var(--inset);position:relative;display:flex;align-items:center;justify-content:center;color:var(--line)}.cover-placeholder:after{content:'COVER';position:absolute;bottom:9px;left:10px;font:8px var(--mono);letter-spacing:.1em;color:var(--faint)}.cover-placeholder img{width:100%;height:100%;object-fit:cover}.gallery-info{padding:13px}.gallery-info h3{margin-bottom:9px;font-size:15px}.gallery-info p{font-size:11px;color:var(--muted);margin-bottom:11px;line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gallery-info .person{border-top:.5px solid var(--line);margin-top:14px;padding-top:12px;gap:7px}.gallery-info .avatar{width:24px;height:24px;font-size:9px}.gallery-info .person strong{font-size:11px}.gallery-info .person small{font-size:8px}.gallery-info .person .counts{margin-left:auto;font:9px var(--mono);color:var(--faint)}
.person{display:flex;align-items:center;gap:12px;min-width:0}.avatar{width:38px;height:38px;border:.5px solid var(--line);background:var(--inset);border-radius:2px;display:inline-flex;align-items:center;justify-content:center;font:12px var(--mono);color:var(--secondary);flex-shrink:0;overflow:hidden}.avatar img{width:100%;height:100%;object-fit:cover}.person>span:nth-child(2){min-width:0}.person strong{font-size:14px;display:block;font-weight:400}.person small{display:block;margin-top:6px;font-size:9px;line-height:1.5}.person>.badge{margin-left:auto}.breadcrumb{height:44px;display:flex;align-items:center;gap:9px;border-bottom:.5px solid #1a1a1a15;padding:0 22px;flex-shrink:0;font-family:var(--mono);font-size:10px;color:var(--muted)}.breadcrumb strong{color:var(--ink);font-weight:400}.breadcrumb .btn{font-family:var(--sans)}.section-label{display:flex;align-items:center;gap:16px;color:var(--muted);font:9px var(--mono);letter-spacing:.13em;margin:24px 0 18px;white-space:nowrap;flex-shrink:0}.section-label i{height:.5px;background:var(--line);flex:1}.section-label span:last-child:not(:first-child){letter-spacing:.04em;color:var(--faint)}.field{display:block;min-width:0;margin-bottom:16px}.field>span{display:block;font-size:11px;color:var(--muted);margin-bottom:8px;line-height:1.4}.field-control{position:relative;display:flex}.field input,.field select,.field textarea{border:0;border-bottom:.75px solid var(--ink);background:var(--inset);border-radius:5px 5px 0 0;padding:9px 11px;min-height:34px;width:100%;font-size:13px}.field textarea{min-height:60px}.field select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='m1 1 4 4 4-4' stroke='%2383807A' fill='none'/%3E%3C/svg%3E");background-size:8px 5px;background-position:right 13px center;background-repeat:no-repeat;padding-right:32px;cursor:pointer}.field small{display:block;line-height:1.6;margin-top:7px;color:var(--faint)}.unit{position:absolute;right:10px;top:10px;font:10px var(--mono);color:var(--muted);pointer-events:none}.field-control:has(.unit) input{padding-right:57px}.field.k1,.field.k2,.field.k3{padding-left:12px;border-left:2.5px solid var(--blue)}.field.k2{border-left-color:var(--line)}.field.k3{border-left:2.5px dashed var(--line)}.field.error input,.field.error select,.field.error textarea{border-bottom:1.25px solid var(--red);box-shadow:none}.field.error:after{content:attr(data-error);display:block;font:10px var(--mono);color:var(--red);margin-top:6px}.setting-row{display:flex;justify-content:space-between;align-items:center;gap:18px;min-height:49px;border-bottom:.5px solid var(--line);padding:12px 0;line-height:1.5}.setting-row:last-child{border-bottom:0}.setting-row>span:last-child{display:flex;align-items:center;gap:9px;text-align:right}.setting-row small{margin-left:8px;font-size:9px;color:var(--faint)}.setting-row .minor{display:block;color:var(--muted);font:9px var(--mono);margin-top:5px;text-align:left}.toggle{display:inline-flex;width:34px;height:19px;padding:2px;border:1px solid var(--line);border-radius:5px;background:#deddd7;flex-shrink:0;align-items:center;transition:background .15s}.toggle span{width:13px;height:13px;background:var(--paper);border-radius:3px;box-shadow:0 .5px 1px #0001}.toggle.on{background:var(--ink);border-color:var(--ink);justify-content:flex-end}.segment{display:inline-flex;background:var(--inset);border-radius:5px;padding:2px;gap:2px}.segment button{border:0;background:none;border-radius:4px;font-size:11px;color:var(--muted);padding:6px 12px;white-space:nowrap}.segment button.selected{background:var(--paper);color:var(--ink);box-shadow:0 1px 2px #0001}.check{display:flex;align-items:center;gap:9px;font-size:12px;margin:12px 0}.choice{display:flex;align-items:center;gap:13px;min-height:60px;padding:12px 14px;position:relative;cursor:pointer;border-radius:2px}.choice.selected,.choice:has(input:checked){background:var(--soft);box-shadow:inset 2.5px 0 var(--blue)}.choice strong{display:block;font-size:14px;font-weight:400}.choice small{display:block;margin-top:8px;font-size:11px}.choice em{margin-left:auto;font:10px var(--mono);font-style:normal;color:var(--muted)}.choice:hover{background:var(--soft)}.note{padding:15px 14px;border-left:2.5px solid var(--blue);background:var(--soft);font-size:12px;line-height:1.8;color:var(--secondary);margin:18px 0}.setting-card{border:.5px solid #1a1a1a26;border-radius:7px;padding:20px;min-width:0}.setting-card>h3{font-size:16px;margin-bottom:8px}.setting-card>p{font-size:11px;color:var(--muted);margin-bottom:22px;line-height:1.7}.setting-card .section-label{margin-top:20px}.setting-card .field:last-child{margin-bottom:0}.account-tabs{height:45px;display:flex;align-items:stretch;gap:28px;padding:0 27px;border-bottom:.5px solid #1a1a1a15;flex-shrink:0}.account-tabs a{display:flex;align-items:center;color:var(--muted);font-size:12px;border-bottom:2px solid transparent;margin-top:2px}.account-tabs a.active{color:var(--ink);border-bottom-color:var(--ink)}.account-tabs>small{margin-left:auto;align-self:center;font:9px var(--mono)}.account-head{padding:23px 26px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.account-head .avatar{width:46px;height:46px;background:var(--ink);color:var(--paper);border-radius:8px;font-size:17px}.account-head h2{font-size:22px}.account-head small{font:10px var(--mono);margin-top:5px;display:block;letter-spacing:.04em}.account-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;padding:0 26px 24px}.account-column{display:flex;flex-direction:column;gap:18px;min-width:0}.account-scroll{flex:1;min-height:0;margin:0 0 12px}.account-scroll .setting-card .field>span{font-size:11px}.title-chips{min-height:41px;border-bottom:.75px solid var(--ink);background:var(--inset);display:flex;align-items:center;gap:12px;padding:7px 10px;margin-bottom:18px;border-radius:5px 5px 0 0}.title-chips .chip{padding:0;display:flex;gap:7px;font-size:10px}.title-chips .btn{height:22px;width:22px;min-height:22px;padding:3px}.metric-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:15px;margin:20px 0}.metric-grid strong{display:block;font:29px var(--mono);margin-top:5px}.metric-grid small{font-size:11px}.login-page{height:100dvh;display:grid;place-items:center}.login-card{width:490px;padding:32px 34px;background:var(--paper);border:1px solid #1a1a1a1a;border-radius:10px;box-shadow:0 8px 26px #1a1a1a12}.login-card .brand{padding:0;height:28px}.login-card>p{font-size:11px;color:var(--muted);margin:10px 0 18px}.login-card hr{border:0;border-top:1.5px solid var(--ink);margin-bottom:23px}.login-card .primary{width:100%;margin:13px 0}.login-card .sso{display:flex;flex-direction:column;gap:8px;margin-top:14px}.login-card .sso .btn{justify-content:flex-start;background:transparent;height:38px}.login-card .sso .mono{margin-left:auto;font-size:9px;color:var(--faint)}.login-card .login-footer{border-top:.5px solid var(--line);margin-top:18px;padding-top:14px;font-size:11px;display:flex;justify-content:space-between}.login-card .field:has(input[type=password]){position:relative}
.scroll-left{overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:#BAB7AF #EAE8E3;direction:rtl;position:relative}.scroll-left>*{direction:ltr}.scroll-left::-webkit-scrollbar{width:5px}.scroll-left::-webkit-scrollbar-track{background:#EAE8E3;border-radius:3px}.scroll-left::-webkit-scrollbar-thumb{background:#BAB7AF;border-radius:3px}.fade-scroll{mask-image:linear-gradient(to bottom,#000 calc(100% - 74px),transparent 100%)}.fade-scroll.scrolled{mask-image:linear-gradient(to bottom,transparent 0,#000 48px,#000 calc(100% - 70px),transparent 100%)}.fade-scroll.at-bottom{mask-image:linear-gradient(to bottom,transparent 0,#000 48px,#000 100%)}.fade-scroll:not(.can-scroll){mask-image:none}.empty-state{text-align:center;padding:80px 20px;color:var(--muted)}.empty-state h2{color:var(--ink);font-size:22px;margin-bottom:12px}.empty-state p{font-size:12px}
.right-rail{position:fixed;right:14px;top:14px;bottom:14px;width:46px;display:flex;flex-direction:column;align-items:center;padding:10px 5px;gap:6px;z-index:25}.rail-button{width:34px;height:34px;min-height:34px;background:none;border:0;border-radius:7px;color:var(--secondary);display:flex;align-items:center;justify-content:center;position:relative}.rail-button:hover{background:#f5f5f380}.rail-button.active{background:var(--paper);color:var(--ink)}.rail-button.active:before{content:'';position:absolute;left:2px;top:8px;bottom:8px;width:2.5px;background:var(--orange);border-radius:2px}.right-rail>.btn:last-child{margin-top:auto;width:30px;height:32px;min-height:32px;padding:0}.graph-topbar{position:fixed;left:var(--left);right:74px;top:14px;height:44px;display:flex;align-items:center;padding:0 16px;gap:12px;z-index:10}.graph-topbar.with-panel{right:422px}.graph-topbar .btn.primary{margin-left:auto;min-height:32px}/* 项目名永远一行：地方不够就用 … 截断,整名放在悬停提示里；编辑图标和右边的按钮不参与收缩（审核 I18） */
.graph-project-name{border:1px solid var(--line);padding:4px 8px;background:transparent;border-radius:5px;font:11px var(--mono);text-transform:uppercase;display:flex;gap:7px;align-items:center;letter-spacing:.07em;min-width:0;max-width:100%;flex:0 1 auto;white-space:nowrap}
.graph-project-name .name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.graph-project-name svg{flex-shrink:0}
.graph-topbar>.muted,.graph-topbar>.faint,.graph-topbar>.mono,.graph-topbar>.btn{flex-shrink:0}
.graph-topbar .fork-from{flex:0 3 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 窄屏才出现的「项目菜单」入口（左栏折成图标条、右栏工具隐藏时,项目页面与工具从这里进） */
.sidebar .mobile-project-menu{display:none}
.folder-chip[data-chip-group]{cursor:grab}
.drag-ghost.ghost-chip{opacity:.92}.graph-topbar .mono{font-size:9px}.graph-canvas{position:fixed;inset:0;overflow:hidden;z-index:1;touch-action:none}.graph-world{position:absolute;left:0;top:0;width:2000px;height:1500px;transform-origin:0 0}.graph-links{position:absolute;inset:0;overflow:visible;width:2000px;height:1500px}.graph-links path{fill:none;stroke:var(--ink);stroke-width:1.1;pointer-events:stroke;cursor:pointer}.graph-links path:hover{stroke:var(--blue);stroke-width:2.5}.link-stubs{position:absolute;left:0;top:0;overflow:visible;width:2000px;height:1500px;pointer-events:none;z-index:2}.link-stubs path{fill:none;stroke:var(--ink);stroke-width:1.1}.link-stubs path.hot{stroke:var(--blue);stroke-width:2.5}.graph-group{pointer-events:none}.graph-group>button,.graph-group.collapsed{pointer-events:auto}.graph-links path.selected,.link-stubs path.selected{stroke:var(--blue);stroke-width:2}.graph-group.selected{border-color:var(--blue)}.graph-group.selected>button{background:var(--blue)}.marquee{position:fixed;z-index:999;border:1px solid var(--blue);background:rgba(74,111,165,.08);border-radius:2px;pointer-events:none}.link-draft{position:fixed;left:0;top:0;width:100vw;height:100vh;overflow:visible;pointer-events:none;z-index:1000}.link-draft path{fill:none;stroke:var(--ink);stroke-linecap:round}.port.can-drop:after{box-shadow:0 0 0 2px var(--paper),0 0 0 3.5px var(--blue)}.graph-group.collapsed{width:170px;height:auto;min-height:44px;padding:10px;background:var(--paper);border-color:var(--ink);border-radius:2px;display:flex;flex-direction:column;align-items:stretch;gap:6px;cursor:grab;z-index:2;user-select:none}.fold-node{border:1.25px solid var(--ink);border-radius:2px;background:var(--paper);padding:6px 8px;margin:0 3px 3px 0;font-size:11.5px;color:var(--ink);box-shadow:3px 3px 0 -.5px var(--paper),3px 3px 0 .25px var(--ink)}body.no-shadows .fold-node{box-shadow:none}.fold-sub{align-self:flex-start;max-width:100%;padding:3px 7px;background:var(--ink);color:var(--paper);font:9px var(--mono);font-style:normal;letter-spacing:.09em;border-radius:2px}.fold-node>span,.fold-sub>span{display:block;white-space:nowrap;overflow:hidden}.fold-sub.long{align-self:stretch}.fold-node>span,.fold-sub.long>span{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent)}.graph-group>button{transition:background .28s cubic-bezier(.4,0,.2,1)}.graph-group.pressing>button,.graph-group.lifted>button{background:var(--blue)}.graph-group.lifted{border-color:var(--blue)}.fold-port{position:absolute;top:16.5px;width:9px;height:9px;border-radius:50%;background:var(--ink)}.fold-port.in{left:-5.5px}.fold-port.out{right:-5.5px}.graph-node{width:170px;background:var(--paper);border:1.25px solid var(--ink);border-radius:2px;position:absolute;cursor:grab;outline:0;z-index:2}.node-back{position:absolute;overflow:visible;pointer-events:none;z-index:2}.node-back path{fill:var(--paper);stroke:var(--ink);stroke-width:.75px;stroke-linejoin:round}.graph-node:focus-visible{outline:2px solid var(--blue);outline-offset:6px}.graph-node.selected{border-color:var(--blue);box-shadow:0 0 0 .6px var(--blue)}.graph-node.selected .node-type{color:var(--blue)}.graph-node.readonly{color:var(--faint);border-color:var(--faint);background:#EDECE8;box-shadow:none}.graph-node.readonly .node-body,.graph-node.readonly .node-footer{border-color:#d8d5ce}.graph-node.readonly .node-type{color:var(--faint)}.node-title{padding:9px 9px 8px}.node-type{font:9px var(--mono);letter-spacing:.13em;color:var(--muted);margin-bottom:5px;display:flex;align-items:center;justify-content:space-between}.node-type .changed{width:5px;height:5px;background:var(--orange)}.node-flags{display:flex;align-items:center;gap:6px}.disc-badge{display:inline-flex;align-items:center;gap:4px;margin-left:auto;flex-shrink:0;font:10px var(--mono);color:var(--ink);font-weight:400}.disc-badge svg,.nav-item .disc-badge svg{width:9px;height:9px;color:var(--ink);fill:currentColor}.side-link .disc-badge{margin-right:2px}.discussion-card>header .count{display:flex;align-items:center;gap:9px}.discussion-card.unread{cursor:pointer}.discussion-card.unread .thread-title{color:var(--ink);font-weight:600}.conversation.unread strong{font-weight:500}.change-mark{display:inline-block;width:5px;height:5px;background:var(--orange);flex-shrink:0;margin-left:auto}.nav-item .change-mark+.count{margin-left:8px}.side-link .change-mark{margin-right:2px}td>.change-mark{margin:0 8px 2px 0;vertical-align:middle}.node-block>.change-dot{position:absolute;left:-13px;top:7px;width:5px;height:5px;background:var(--orange);cursor:help}.node-block.context-active>.change-dot{left:-1px;top:5px}.rail-button .rail-change{position:absolute;top:6px;right:6px;width:5px;height:5px;background:var(--orange)}.rail-button{touch-action:none;user-select:none}.rail-button.rail-lifted{visibility:hidden}.rail-button.rail-lifted.rail-slot{visibility:visible;background:none;border:1px dashed var(--faint)}.rail-button.rail-slot>*{visibility:hidden}.rail-button.rail-slot:before{display:none}.rail-ghost{position:fixed;z-index:1000;margin:0;pointer-events:none;background:var(--paper);color:var(--ink);box-shadow:0 6px 16px #1a1a1a24,0 1px 3px #1a1a1a14;transform-origin:center}.change-list{margin-bottom:16px}.change-list .section-label{margin-top:0}.change-card{display:flex;gap:10px;width:100%;text-align:left;background:var(--paper);border:.5px solid var(--line);border-radius:2px;padding:9px 11px;margin-bottom:8px;align-items:flex-start;color:var(--ink)}.change-card:hover{background:var(--soft)}.change-card .change-dot{width:5px;height:5px;background:var(--orange);margin-top:6px;flex-shrink:0}.change-card .change-head{display:flex;gap:8px;align-items:baseline;font-size:12px}.change-card time{font:9px var(--mono);color:var(--faint)}.change-card small{display:block;font:9px var(--mono);letter-spacing:.04em;color:var(--muted);margin:4px 0 5px}.change-card .change-text{display:block;font-size:12px;color:var(--secondary);line-height:1.6}.node-flags .node-lock{display:grid;place-items:center;color:var(--secondary);font-style:normal}.graph-node{user-select:none}.graph-node.locked{cursor:default}.node-title h3{font-size:13px;line-height:1.35}.node-body{border-top:.75px solid var(--ink);padding:8px 9px;font:10px var(--mono);color:var(--muted);line-height:1.6}.node-body .thumb{height:28px;border:.5px solid var(--line);background:var(--inset);margin-top:5px}.node-footer{border-top:.5px solid var(--line);padding:7px 9px;font:9px var(--mono);display:flex;justify-content:space-between;color:var(--muted);letter-spacing:.01em}.graph-node.readme{border-style:dashed;box-shadow:none}.graph-node.outcome:before{content:'';height:5px;position:absolute;top:0;left:0;right:0;background:repeating-linear-gradient(45deg,var(--ink) 0 1px,transparent 1px 3px);border-bottom:1px solid var(--ink);border-radius:.75px .75px 0 0}.port{width:17px;height:17px;border:0;position:absolute;top:12px;background:none;padding:0;z-index:-1;cursor:crosshair}.port:after{content:'';position:absolute;left:4px;top:4px;width:9px;height:9px;border-radius:50%;background:var(--ink)}.port.in{left:-9px}.port.out{right:-9px}.graph-group{position:absolute;border:1px dashed var(--faint);width:478px;height:198px;left:332px;top:416px}.graph-group>button{position:absolute;top:-18px;left:-1px;padding:3px 7px;background:var(--ink);border:0;color:var(--paper);font:9px var(--mono);letter-spacing:.09em;border-radius:2px;cursor:grab}.graph-zoom{position:fixed;bottom:14px;right:74px;height:30px;display:flex;align-items:center;gap:10px;padding:5px 10px;border-radius:7px;z-index:10}.graph-zoom .btn{min-height:20px;height:20px;padding:1px 4px;border:0;background:none}.scale-bar{display:flex;width:96px;height:8px;border:1px solid var(--ink)}.scale-bar i{flex:1}.scale-bar i:nth-child(odd){background:var(--ink)}.graph-empty{position:absolute;left:calc(var(--left) + 22px);right:96px;top:29%;text-align:center}.module-types{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;max-width:690px;margin:28px auto 18px}.module-type{text-align:left;background:var(--paper);border:1px solid var(--ink);box-shadow:3px 3px 0 0 var(--paper),3px 3px 0 .75px var(--ink);border-radius:2px;padding:13px;min-height:88px}.module-type>span{display:block;font:9px var(--mono);letter-spacing:.12em;color:var(--muted);margin-bottom:9px}.module-type>small{display:block;margin-top:10px}.viewer-banner{position:fixed;top:69px;left:var(--left);right:74px;padding:12px 15px;border-left:2.5px solid var(--ink);display:flex;align-items:center;justify-content:space-between;gap:25px;z-index:10}.viewer-banner p{font-size:10px;color:var(--muted);margin-top:6px}.right-panel{position:fixed;right:74px;top:14px;bottom:14px;width:334px;display:flex;flex-direction:column;z-index:15;overflow:hidden;background:var(--paper)}.right-panel.account-panel{right:14px;width:332px}.panel-heading{height:44px;padding:0 16px;border-bottom:.5px solid #1a1a1a18;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;font:10px var(--mono);letter-spacing:.08em;color:var(--muted)}.panel-heading .icon-btn{border:0;background:none;width:21px;height:21px}.panel-body{padding:18px 16px;flex:1;min-height:0}.panel-frame{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}.panel-frame>.panel-body{overflow-y:auto;overflow-x:hidden}.panel-frame>.cx-track.y{left:16px;top:16px;bottom:16px}.panel-frame.has-scroll>.panel-body{padding-left:33px}
.disc-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:16px}.disc-toolbar .filters{margin-bottom:0}.disc-sort{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 9px;border:.5px solid var(--line);border-radius:5px;background:var(--paper);color:var(--secondary);font-size:10px;white-space:nowrap}.disc-sort:hover{color:var(--ink);border-color:#9A978F}
.discussion-card{cursor:pointer}.discussion-card:hover{border-color:#BAB7AF}.discussion-card.open{cursor:default;margin-bottom:0;flex:1;display:flex;flex-direction:column}.discussion-card.open .comments{flex:1}.discussion-card.resolved .thread-title{color:var(--muted)}
.panel-body.disc-open{display:flex;flex-direction:column}.panel-body.disc-open>div{flex:1;display:flex;flex-direction:column}.panel-body.disc-open .disc-lead,.panel-body.disc-open .discussion-card:not(.open),.panel-body.disc-open .disc-empty{display:none}
.discussion-card{position:relative}.thread-dot{position:absolute;top:-4px;right:-4px;width:8px;height:8px;border-radius:50%;background:var(--orange);box-shadow:0 0 0 2px var(--paper);z-index:2;pointer-events:none}
.disc-scopes{margin:-6px 0 16px;gap:5px}.disc-scopes .filter{position:relative}.scope-dot{position:absolute;top:-2px;right:-2px;width:5px;height:5px;border-radius:50%;background:var(--orange)}
.pulse-once{animation:soft-pulse .9s both}.disc-where{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.nav-label.pulse-once,.disc-badge.pulse-once{display:inline-flex;transform-origin:left center}.disc-badge.pulse-once{transform-origin:center}
@keyframes soft-pulse{0%{transform:scale(1);animation-timing-function:cubic-bezier(.3,0,.3,1)}35%{transform:scale(var(--pulse-to,1.2));animation-timing-function:cubic-bezier(.33,0,.2,1)}100%{transform:scale(1)}}
.more-replies{margin-top:9px;padding-top:8px;border-top:.5px dashed var(--line);font:9px var(--mono);color:var(--faint)}.thread-icon-btn{border:0;background:none;padding:3px;margin:-3px 0;display:inline-grid;place-items:center;color:var(--secondary);border-radius:3px;cursor:pointer}.thread-icon-btn:hover{background:var(--inset);color:var(--ink)}.thread-icon-btn.danger:hover{color:#9E524B}.resolve-mark{font-style:normal}.disc-empty{font-size:12px;padding:20px 0}.panel-body .field{margin-bottom:20px}.panel-body h3{font-size:14px}.panel-body .setting-row{font-size:12px}.panel-body .section-label{margin-top:23px;margin-bottom:11px;font-size:9px}.panel-footer{flex-shrink:0;padding:15px 16px;border-top:.5px solid var(--line);background:var(--soft)}.panel-footer textarea{width:100%;border:0;border-bottom:2px solid var(--blue);background:var(--inset);border-radius:5px 5px 0 0;padding:11px;font-size:12px;margin:8px 0 10px}.discussion-card{border:.5px solid var(--line);border-radius:2px;margin-bottom:13px;background:var(--paper)}.discussion-card.active{box-shadow:inset 2.5px 0 var(--blue)}.discussion-card>header{padding:8px 10px;border-bottom:.5px solid var(--line);font:9px var(--mono);display:flex;align-items:center;gap:7px;letter-spacing:.04em;background:var(--soft)}.discussion-card>header .count{margin-left:auto}.discussion-card .comments{padding:11px 12px}.comment{padding:7px 0}.comment:first-child{padding-top:0}.comment-head{font-size:11px;margin-bottom:4px}.comment-head .mono{color:var(--faint);font-size:8px;margin-left:6px}.comment p{font-size:12px;line-height:1.65}.comment.reply{border-left:1px solid var(--line);margin-left:0;padding-left:10px;color:var(--secondary)}.member-group{border-bottom:.5px solid var(--line);padding:10px 0}.member-group h4{display:flex;justify-content:space-between;font-size:11px;margin-bottom:12px}.member-row{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:12px}.member-row .circle{width:11px;height:11px;border:.75px solid var(--faint);border-radius:50%}.member-row .badge{margin-left:auto}.member-row small{display:block;font:8px var(--mono);margin-top:3px}.licence-choice{border:.5px solid var(--line);border-radius:5px;margin:8px 0}.licence-choice .choice{align-items:flex-start}.licence-choice .choice small{font-size:10px;line-height:1.7}
.split-sheet{display:flex;flex:1;min-height:0}.split-main{min-width:0;flex:1;display:flex;flex-direction:column}.split-side{width:370px;background:var(--soft);border-left:.5px solid #1a1a1a24;display:flex;flex-direction:column;flex-shrink:0}.split-side.wide{width:490px}.split-side.narrow{width:300px}.split-side .side-content{padding:25px 22px;flex:1;min-height:0}.split-side .side-content>p{font-size:13px;line-height:1.85;margin-bottom:23px}.split-side .side-content .mono-heading{font:9px var(--mono);color:var(--muted);letter-spacing:.12em;margin-bottom:18px}.run-form .cols3,.run-form .cols4{gap:17px}.run-form .field{margin-bottom:3px}.run-form .field input{font-family:var(--mono);font-size:16px}.run-form .field select{font-size:13px}.run-form .cols3 .field input{font-family:var(--sans);font-size:13px}.form-outcome{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.form-outcome .choice{background:var(--inset);border-bottom:.75px solid var(--ink);border-radius:5px 5px 0 0;min-height:40px;padding:10px 13px}.form-outcome .choice input{display:none}.form-outcome .choice strong{font-size:13px}.form-outcome .choice.selected{background:var(--paper);border:.75px solid #4a6fa54d;border-bottom:2px solid var(--blue);box-shadow:none}.form-outcome .choice.selected:after{content:'✓';color:var(--blue);margin-left:auto}.form-actions{margin-top:25px;border-top:.5px solid var(--line);padding-top:16px;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-shrink:0}.form-actions .mono{font-size:10px;color:var(--muted)}.integrity-list{list-style:none;padding:0;margin:15px 0}.integrity-list li{display:flex;gap:10px;font-size:11px;margin-bottom:9px}.integrity-list .ok{color:var(--ink)}.integrity-list .missing{color:var(--red)}.key-explanation{padding-left:12px;border-left:2.5px solid var(--blue);font-size:12px;line-height:1.7;margin-bottom:13px}.key-explanation.variable{border-color:var(--line)}.key-explanation.custom{border-left-style:dashed;border-left-color:var(--line)}.key-explanation .mono{font-size:9px;letter-spacing:.13em;color:var(--ink)}.key-explanation p{color:var(--muted);font-size:11px}.run-title .status{font:10px var(--mono);letter-spacing:.13em;color:var(--muted);margin-bottom:10px}.run-title h1{font-size:28px}.run-title .page-heading{margin-top:0}.run-numbers{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.run-number{border-left:2.5px solid var(--line);padding-left:12px}.run-number>small{display:block;font-size:10px;margin-bottom:8px}.run-number>strong{font:26px var(--mono);letter-spacing:-1px}.run-number .unit-inline{font:9px var(--mono);color:var(--muted);margin-left:5px}.run-number .range-note{display:block;font:9px var(--mono);color:var(--faint);margin-top:9px}.run-number.outside{border-color:var(--red)}.run-number.outside>strong,.run-number.outside .range-note{color:var(--red)}.ruler{margin:25px 0 23px;padding-top:9px}.ruler-axis{height:1px;background:var(--line);position:relative;margin:0 7px}.ruler-axis .range{position:absolute;top:-.75px;height:2.5px;background:var(--ink)}.ruler-axis .end{position:absolute;width:.75px;height:7px;top:-3px;background:var(--line)}.ruler-axis .end.left{left:0}.ruler-axis .end.right{right:0}.ruler-axis b{position:absolute;top:-9px;height:18px;width:.75px;background:var(--ink);font-weight:400}.ruler-axis b span{position:absolute;bottom:23px;left:50%;transform:translateX(-50%);font:10px var(--mono);white-space:nowrap}.ruler-label{display:flex;justify-content:space-between;font:9px var(--mono);color:var(--faint);margin-top:14px}.reference-count{font:42px var(--mono)}.reference-count small{font-size:12px;margin-left:4px}.reference-list .setting-row{padding:8px 0;min-height:36px;font-size:11px}.data-table{width:100%;border-collapse:collapse;table-layout:auto;font-size:12px}.data-table th{text-align:left;padding:10px 0;color:var(--muted);font:9px var(--mono);letter-spacing:.09em;border-bottom:1.25px solid var(--ink);white-space:nowrap;font-weight:400}.data-table td{border-bottom:.5px solid var(--line);padding:11px 9px 11px 0;line-height:1.4}.data-table td:last-child,.data-table th:last-child{text-align:right;padding-right:0}.data-table td .mono{font-size:10px;letter-spacing:.01em}.data-table tr.clickable{cursor:pointer}.data-table tr.clickable:hover{background:var(--soft)}.data-table td small{display:block;font:9px var(--mono);color:var(--faint);margin-top:4px}.data-table .btn.link{font-size:11px}.summary-strip{display:flex;gap:34px;align-items:center;margin:0 0 18px}.summary-strip>div{border-right:.5px solid var(--line);padding-right:34px}.summary-strip>div:last-child{border:0}.summary-strip strong{font:30px var(--mono);display:block;margin-bottom:5px}.summary-strip p{font:10px var(--mono);color:var(--muted)}.stepper{display:flex;align-items:center;gap:15px;margin-bottom:24px;flex-shrink:0;color:var(--faint)}.stepper>span{display:flex;align-items:center;gap:10px;font-size:13px}.stepper i{width:25px;height:.5px;background:var(--line)}.stepper b{width:24px;height:24px;border:.75px solid var(--line);border-radius:50%;display:grid;place-items:center;font:11px var(--mono)}.stepper .active{color:var(--ink)}.stepper .active b{background:var(--ink);border-color:var(--ink);color:var(--paper)}.fields-table td{padding:12px 9px}.fields-table tr{cursor:pointer}.fields-table tr:hover{background:var(--soft)}.fields-table .key-row{box-shadow:inset 2.5px 0 var(--blue)}.fields-table .highlight-row{box-shadow:inset 2.5px 0 var(--ink)}.field-selected{outline:1px solid #4a6fa555}.floating-add{position:absolute;bottom:87px;right:calc(var(--side-width,330px) + 28px);width:46px;height:46px;background:var(--ink);color:var(--paper);border:0;border-radius:10px;box-shadow:0 3px 8px #0002;font-size:24px}.template-actions{height:59px;border-top:.5px solid var(--line);padding:10px 22px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.template-actions .mono{color:var(--faint);font-size:9px}.field-advice{border:.75px solid var(--line);border-radius:7px;padding:14px 16px;display:flex;gap:20px;align-items:center;margin-bottom:16px}.field-advice>div{border-left:2.5px solid var(--blue);padding-left:14px;flex:1}.field-advice p{font-size:11px;color:var(--muted);margin-top:8px}.field-advice h4{font-size:12px}
.node-page-header{padding:24px 22px 0}.node-page-header .node-top{display:flex;align-items:center;gap:12px;margin-bottom:16px}.node-page-header h1{font-size:28px}.version-pill{font:10px var(--mono);padding:3px 9px;min-height:20px;border-radius:5px;gap:5px}.version-pill .orange-dot{width:5px;height:5px;border-radius:50%;background:var(--orange)}.node-page-header .tags{border-bottom:2px solid var(--ink);padding-bottom:15px;margin-bottom:0}.node-scroll{flex:1;min-height:0;margin:17px 16px 0 7px;padding:0 14px 0 15px}.node-block{position:relative;padding-right:50px;margin:15px 0 27px;line-height:1.8}.node-block>.block-discussion{position:absolute;right:1px;top:0;min-width:33px;height:26px;min-height:26px;padding:4px 8px;color:var(--secondary);background:transparent}.node-block>.block-discussion.primary{background:var(--ink);color:var(--paper)}.node-block.context-active{background:var(--soft);border-left:2.5px solid var(--blue);padding:9px 50px 9px 12px;margin-left:-12px;border-radius:2px}.node-block p{font-size:13px}.node-block .section-label{margin:0 0 16px}.image-pair{display:flex;gap:13px;margin-top:12px}.image-placeholder{background:var(--inset);border:.5px solid var(--line);border-radius:2px;width:245px;height:142px;position:relative}.image-placeholder img{width:100%;height:100%;object-fit:cover}.block-caption{font:9px var(--mono);color:var(--faint);margin-top:8px}.file-row{border:.5px solid var(--line);border-radius:2px;padding:9px 11px;display:flex;align-items:center;gap:12px;margin:8px 0;background:var(--paper)}.file-row .avatar{width:32px;height:32px;font-size:10px}.file-row strong{display:block;font-size:12px;font-weight:400}.file-row small{font:9px var(--mono);display:block;margin-top:6px;letter-spacing:.05em}.file-row>.btn,.file-row>.mono{margin-left:auto}.node-actions{padding:12px 22px 18px;margin-top:auto;flex-shrink:0}.add-block-bar{font:10px var(--mono);letter-spacing:.02em;display:inline-flex;align-items:center;gap:10px;padding:10px 13px;border:1px dashed var(--faint);border-radius:7px;background:transparent;color:var(--muted)}.add-block-bar:hover{color:var(--ink);border-color:var(--ink)}.readme-visibility{border-top:1.25px solid var(--ink);margin-top:14px;padding-top:12px}.readme-visibility p{font-size:10px;color:var(--muted);margin-top:7px}.node-mini-meta{font:9px var(--mono);color:var(--faint);margin-left:auto}.node-supplementary p{font-size:12px;line-height:1.8;color:var(--muted);margin:8px 0 24px}.node-supplementary h4{font-size:12px;margin-top:18px}
.messages-main{padding:22px 26px}.messages-layout{display:flex;gap:23px;flex:1;min-height:0;padding-top:18px}.conversation-column{width:356px;min-width:280px;display:flex;flex-direction:column;flex-shrink:0;border-right:.5px solid var(--line);padding-right:22px}.conversation-column .filters{gap:5px;margin-bottom:11px;flex-wrap:nowrap}.conversation-column .filters .filter{position:relative}.conversation-column .search{flex:0 0 33px;margin-bottom:17px}.conversation-list{flex:1;min-height:0;padding-bottom:20px}.conversation{display:flex;position:relative;border:0;background:none;width:100%;min-height:76px;text-align:left;gap:10px;padding:10px 11px;margin-bottom:4px;border-radius:2px}.conversation.active{background:var(--soft);box-shadow:inset 2.5px 0 var(--blue)}.conversation:hover{background:var(--soft)}.conversation .avatar{width:27px;height:27px;font-size:9px;margin-top:2px}.conversation>span:nth-child(2){min-width:0;flex:1}.conversation strong{font-size:12px;display:block;margin:1px 0 3px}.conversation small{font:8px var(--mono);letter-spacing:.08em;display:block;color:var(--faint)}.conversation .preview{font:11px var(--sans);color:var(--muted);margin-top:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;max-width:275px}.unread-badge{position:absolute;right:10px;bottom:15px;background:var(--ink);color:var(--paper);font:9px var(--mono);padding:3px 10px;border-radius:3px}.conversation .time{position:absolute;right:10px;top:11px;font:8px var(--mono);color:var(--faint)}.chat-column{flex:1;min-width:0;display:flex;flex-direction:column}.chat-heading{display:flex;align-items:center;gap:17px;padding:13px 0 15px;border-bottom:.5px solid var(--line);flex-shrink:0}.chat-heading .person{gap:10px}.chat-heading .person .avatar{width:29px;height:29px;font-size:10px}.chat-heading .person strong{font-size:13px}.chat-heading .person small{font-size:8px;margin-top:5px}.chat-heading .btn.icon-btn{margin-left:auto;border:0;background:none}.chat-context-link{border-left:.5px solid var(--line);padding-left:17px;font-size:9px;color:var(--muted)}.chat-context-link .btn.link{margin-left:10px;font-size:11px}.chat-scroll{min-height:0;flex:1;margin:0 -2px 0 -17px;padding:20px 3px 15px 17px}.chat-messages{display:flex;flex-direction:column;justify-content:flex-end;min-height:100%;gap:20px}.chat-date{display:flex;align-items:center;gap:12px;color:var(--faint);font:8px var(--mono);letter-spacing:.1em;margin:3px 0}.chat-date:before,.chat-date:after{content:'';height:.5px;background:var(--line);flex:1}.chat-message{display:flex;align-items:flex-start;gap:12px;max-width:90%}.chat-message .avatar{width:27px;height:27px;font-size:9px}.chat-message .message-meta{font:10px var(--sans);margin-bottom:7px}.message-meta time{font:8px var(--mono);color:var(--faint);margin-left:8px}.chat-message p{font-size:12px;line-height:1.8}.chat-message.self{margin-left:auto;display:block;max-width:85%;text-align:right}.chat-message.self p{border:.5px solid var(--line);border-radius:2px;padding:11px 14px;background:var(--soft);text-align:left}.chat-message.self time{font:8px var(--mono);letter-spacing:.05em;color:var(--faint);display:block;margin-top:7px}.chat-composer{border-top:.5px solid var(--line);padding-top:15px;flex-shrink:0;margin-top:10px}.composer-row{display:flex;align-items:center;gap:10px}.composer-row textarea{height:35px;min-height:35px;max-height:100px;flex:1;background:var(--inset);border:0;border-bottom:.75px solid var(--ink);border-radius:5px 5px 0 0;padding:9px 12px;resize:none;line-height:17px;font-size:12px}.composer-row>.btn{min-height:35px}.composer-note{font-size:9px;color:var(--faint);margin-top:7px;text-align:right}.sysline{display:flex;align-items:center;gap:12px;font:9px var(--mono);color:var(--muted);margin:16px 0}.sysline:before,.sysline:after{content:'';flex:1;height:.75px;background:var(--ink)}.quota{display:flex;align-items:center;justify-content:space-between;padding:10px 0;border-bottom:.5px solid var(--line);font-size:9px;color:var(--faint)}.quota-meter{display:flex;align-items:center;gap:4px;font:9px var(--mono)}.quota-meter i{display:block;width:5px;height:9px;background:var(--ink)}.quota-meter>span{margin-left:9px}.shared-project{width:300px;border:.5px solid var(--line);border-radius:2px;padding:12px;text-align:left;background:var(--paper);display:block;cursor:pointer}.shared-project .thumb{width:66px;height:49px;background:var(--inset);border:.5px solid var(--line);display:grid;place-items:center;color:var(--muted);flex-shrink:0}.shared-project h4{font-size:13px;margin-bottom:7px}.shared-project p{font-size:10px;color:var(--muted)}.shared-project footer{border-top:.5px solid var(--line);padding-top:8px;margin-top:9px;display:flex;align-items:center;justify-content:space-between;font-size:9px;color:var(--muted)}.chat-context-card{padding:13px 17px;border:.5px solid var(--line);border-radius:2px;background:var(--soft);margin:16px 0 4px}.chat-context-card .section-label{margin:0 0 12px}.contacts-group{padding:15px 0;border-bottom:.5px solid var(--line)}.contacts-group h4{font:9px var(--mono);color:var(--muted);letter-spacing:.1em;margin-bottom:12px;display:flex;align-items:center;justify-content:space-between}.contact-item{background:none;border:0;display:block;text-align:left;padding:7px;width:100%;cursor:grab}.contact-item:hover{background:var(--soft)}.contact-item .avatar{width:25px;height:25px;font-size:9px}.contact-item .person{gap:9px}.contact-item strong{font-size:11px}.contact-item small{font-size:8px;margin-top:4px}.contacts-group.drag-over{border:1px dashed var(--blue);background:var(--soft)}.invite-card{border:.5px solid var(--line);border-radius:2px;margin-left:39px;max-width:672px;background:var(--paper)}.invite-card>header{padding:17px 20px;background:var(--soft);display:flex;align-items:center;justify-content:space-between}.invite-card>header h2{font-size:20px;margin-top:7px}.invite-card .invite-body{padding:20px}.invite-card h3{font-size:16px;margin-bottom:8px}.invite-card .setting-row{font-size:12px;min-height:46px}.invite-card .quote{padding:14px 15px;background:var(--soft);font-size:12px;color:var(--secondary);line-height:1.8;margin:15px 0 25px}.invite-card .section-label{font:10px var(--sans);margin:23px 0 14px;letter-spacing:0}.invite-card>footer{border-top:.5px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:15px 20px}.invite-card>footer small{font-size:10px}.invite-card .choice{min-height:57px}
.modal-backdrop{position:fixed;inset:0;background:#1a1a1a4d;backdrop-filter:blur(3px);z-index:100;display:flex;align-items:center;justify-content:center;padding:24px}.modal-backdrop.secondary-layer{background:#1a1a1a33;z-index:120}.modal{background:var(--paper);border:1px solid #1a1a1a24;border-radius:10px;box-shadow:0 4px 4px #1a1a1a12,0 9px 20px #1a1a1a0d;width:620px;max-width:calc(100vw - 48px);max-height:calc(100dvh - 48px);display:flex;flex-direction:column;position:relative;overflow:visible}.modal>header{height:60px;min-height:60px;border-bottom:.5px solid var(--line);padding:0 23px;display:flex;align-items:center;gap:18px;flex-shrink:0}.modal>header h2{font-size:17px;letter-spacing:0}.modal>header .mono{font-size:9px;color:var(--muted);letter-spacing:.04em}.modal>header .btn{margin-left:auto;border:0;background:none;width:24px;height:24px;min-height:24px;padding:4px;color:var(--muted)}.modal-content{padding:24px;overflow:auto;flex:1;min-height:0;scrollbar-width:thin;scrollbar-color:#BAB7AF #EAE8E3}.modal-content>.field{margin-bottom:24px}.modal-content>p{font-size:13px;color:var(--secondary);margin-bottom:25px}.modal-content .section-label{font-size:10px;letter-spacing:0;margin:28px 0 22px}.modal-content .field>span{font-size:11px;margin-bottom:11px}.modal-content .field input,.modal-content .field select{min-height:39px}.modal-content .field textarea{min-height:60px}.modal>footer{min-height:69px;border-top:.5px solid var(--line);padding:16px 23px;display:flex;align-items:center;gap:10px;justify-content:flex-end;flex-shrink:0}.modal>footer small{margin-right:auto;font-size:10px;color:var(--faint)}.modal>footer .left-controls{margin-right:auto;display:flex;align-items:center;gap:8px}.modal .modal-split{display:flex;flex:1;min-height:0;overflow:hidden}.modal-split>section{padding:24px;flex:1;min-width:0;overflow:auto}.modal-split>.modal-aside{background:var(--soft);border-left:.5px solid var(--line);width:330px;flex:0 0 330px}.modal .modal-side-nav{width:210px;flex:0 0 210px;border-right:.5px solid var(--line);padding:20px 9px;overflow:auto}.modal-side-nav h4{font:9px var(--mono);color:var(--muted);padding:0 9px 18px}.modal-side-nav button{border:0;background:none;text-align:left;width:100%;padding:10px 13px;display:flex;align-items:center;gap:11px;border-radius:2px;font-size:12px;color:var(--secondary)}.modal-side-nav button small{font:9px var(--mono);margin-left:auto;letter-spacing:.1em;color:var(--faint)}.modal-side-nav button.active{background:var(--soft);box-shadow:inset 2.5px 0 var(--blue);color:var(--ink)}.modal-side-nav button:hover{background:var(--soft)}.modal-module .modal-side-nav{width:150px;flex-basis:150px}.modal-module .modal-side-nav button{font:10px var(--mono);padding:8px 13px}.picker-row{padding:16px 13px;border-bottom:.5px solid var(--line);cursor:pointer;display:flex;align-items:center;gap:14px}.picker-row.selected{background:var(--soft);box-shadow:inset 2.5px 0 var(--blue)}.picker-row:hover{background:var(--soft)}.picker-row h4{font-size:14px}.picker-row p{font:9px var(--mono);color:var(--faint);margin-top:7px;letter-spacing:.04em}.picker-row>.chip,.picker-row>.badge,.picker-row>.btn{margin-left:auto}.picker-row .thumbnail{width:55px;height:44px;border:.5px solid var(--line);background:var(--inset);display:grid;place-items:center;color:var(--muted)}.picker-disabled{color:var(--faint);cursor:default}.picker-disabled:hover{background:none}.upload-drop{border:1px dashed var(--faint);background:var(--soft);border-radius:7px;text-align:center;padding:18px 20px;cursor:pointer;margin-bottom:20px}.upload-drop>svg{margin-bottom:10px;color:var(--secondary)}.upload-drop p{font-size:13px}.upload-drop small{font:9px var(--mono);display:block;margin-top:8px;letter-spacing:.04em}.upload-drop.drag-over{border:1.5px dashed var(--blue);background:#4a6fa509}.upload-file{display:flex;gap:12px;border:.5px solid var(--line);border-radius:2px;padding:9px 10px;margin-bottom:9px;align-items:flex-start}.upload-file .thumbnail{width:47px;height:35px;background:var(--inset);border:.5px solid var(--line);display:grid;place-items:center}.upload-file strong{font-size:12px}.upload-file .field{margin:10px 0 0}.upload-file .field input{min-height:28px;font-size:11px;padding:5px 8px}.upload-file .field>span:empty{display:none}.upload-file .upload-state{font:9px var(--mono);margin-left:auto;white-space:nowrap}.upload-file .icon-btn{width:19px;height:19px;border:0;background:none}.popover{position:fixed;z-index:150;background:var(--paper);border:.75px solid var(--line);border-radius:8px;box-shadow:0 3px 3px #1a1a1a12,0 7px 13px #1a1a1a0a;padding:5px;min-width:195px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px);overflow:auto}.popover>header{padding:10px 10px 13px;border-bottom:.5px solid var(--line);margin-bottom:7px}.popover>header h4{font-size:13px;font-weight:400}.popover>header small{display:block;font-size:10px;margin-top:8px}.popover .menu-tools{display:flex;gap:7px;padding:1px 1px 6px;margin-bottom:3px;border-bottom:.5px solid var(--line)}.popover .menu-tool+.menu-tool:before{content:'';position:absolute;left:-4px;top:50%;width:1px;height:22px;margin-top:-11px;background:#DCDAD4;pointer-events:none}.popover .menu-tool{position:relative;flex:1 1 0;min-width:0;border:0;background:none;border-radius:5px;padding:8px 2px 6px;display:flex;flex-direction:column;align-items:center;gap:6px;color:var(--ink);font-size:11px;line-height:1;white-space:nowrap}.popover .menu-tool svg{color:var(--secondary)}.popover .menu-tool:hover,.popover .menu-tool:focus-visible{background:var(--inset);outline:0}.popover .menu-tool:hover svg{color:var(--ink)}.popover .menu-label{font:8px var(--mono);letter-spacing:.1em;color:var(--faint);padding:8px 8px 5px}.popover .menu-row{border:0;background:none;border-radius:4px;padding:8px 9px;display:flex;width:100%;text-align:left;align-items:center;gap:10px;font-size:12px}.popover .menu-row:hover{background:var(--inset)}.popover .menu-row.selected{background:var(--soft);box-shadow:inset 2.5px 0 var(--blue)}.popover .menu-row>small{margin-left:auto;font:9px var(--mono);color:var(--faint)}.popover .menu-row .menu-check{width:15px;flex-shrink:0}.popover.sort-menu .menu-row .menu-check{display:none}.reorder-modal{max-height:min(620px,calc(100dvh - 48px))}.reorder-modal .scroll-frame{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}.reorder-modal .reorder-list{padding:8px 24px 16px}.reorder-modal .scroll-frame.has-scroll .reorder-list{padding-left:33px}.reorder-modal .cx-track.y{left:15px;top:16px;bottom:16px}.reorder-modal .scroll-frame.has-scroll .reorder-list{padding-left:32px}.reorder-modal .reorder-list .setting-row:first-child{border-top:0}.popover .menu-row span>small{display:block;font-size:10px;color:var(--muted);margin-top:9px}.popover .menu-row>em{margin-left:auto;color:var(--blue);font-size:10px;font-style:normal}.popover hr{border:0;border-top:.5px solid var(--line);margin:6px 8px}.storage-backdrop{justify-content:flex-start;align-items:flex-end;backdrop-filter:blur(3px)}.storage-modal{position:fixed;left:calc(var(--left) + 1px);bottom:14px;width:560px;height:470px;border-radius:10px;z-index:101}.storage-modal>header{height:45px;min-height:45px;padding:0 16px}.storage-modal>header h2{font-size:14px}.storage-modal .modal-content{padding:13px 16px}/* 删除、回收站与归档（PRD v1.0）：只读材质 = #9A978F 边 + #EDECE8 底（UI 规范 §9.2），不用颜色表示状态 */.project-card.archived,.project-card.deleted{border-color:#9A978F;background:#EDECE8}.project-card.deleted{cursor:default}.project-card.deleted h3{color:var(--muted)}.card-state{font-size:11px!important;color:var(--muted);margin-top:auto!important;margin-bottom:0!important}.state-tag{font:9px var(--mono);letter-spacing:.08em;padding:2px 6px;border-radius:3px;box-shadow:inset 0 0 0 .75px var(--ink);white-space:nowrap;line-height:13px}.list-toggle{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--muted);white-space:nowrap;cursor:pointer}.archived-banner{display:inline-flex;align-items:center;gap:8px;font-size:11px;margin-left:6px}.archived-banner .btn.text-button{font-size:11px}.confirm-suggest{font-size:12px;line-height:1.75;margin:14px 0 0;padding-left:12px;box-shadow:inset 2.5px 0 var(--ink)}.archive-options{border:0;padding:0;margin:16px 0 10px;display:flex;align-items:center;gap:16px}.archive-options legend{font-size:11px;color:var(--muted);float:left;margin-right:4px}.archive-options .choice{display:inline-flex;align-items:center;gap:6px;font-size:12px}.archive-fork{font-size:12px}.confirm-list li .btn{flex-shrink:0}.disc-closed{font-size:12px;padding:6px 0}.lab-state{font-size:11px;color:var(--muted);margin-right:10px}.confirm-head{font-size:11px;color:var(--muted);margin:14px 0 4px;font-weight:500}/* 已归档的节点（6.3）：原位收成只剩标题的细条，只读材质，不画端口；连到它的线只降粗细和颜色（Q7） */.graph-node.archived{height:28px;overflow:hidden;border:.75px solid var(--faint);background:#EDECE8;box-shadow:none;cursor:default}.graph-node.archived>*:not(.node-title){display:none}.graph-node.archived .node-title{display:flex;align-items:center;gap:8px;height:100%;padding:0 9px}.graph-node.archived .node-type{margin:0;flex-shrink:0;font-size:0;letter-spacing:0;color:var(--faint)}.graph-node.archived .node-type .node-flags{display:none}.graph-node.archived .node-title h3{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.graph-links path.archived{stroke:var(--line);stroke-width:.5}.archived-hidden-note{position:fixed;z-index:7;left:calc(var(--left) + 14px);bottom:14px;display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted);padding:7px 12px;border-radius:7px}.archived-hidden-note .btn.link{font-size:11px}/* 回收站（5.6 我的存储 › 回收站、5.7 右栏回收站）：和其它页签同一套行；剩余天数不用颜色 */.trash-row .trash-row-end{display:flex;align-items:center;gap:10px;margin-left:auto;flex-shrink:0}.trash-row .btn:not(.icon-btn){min-height:26px;padding:3px 10px;font-size:11px}.days-left{font-size:11px;color:var(--muted);white-space:nowrap}.days-left b{font:12px var(--mono);font-weight:400;color:var(--ink);margin:0 1px}.trash-more{font-size:14px;line-height:1;width:26px;height:26px}.storage-modal .filters>.btn{min-height:24px;padding:3px 10px;font-size:11px}.storage-modal .filters>.grow{flex:1}.trash-kids{padding:2px 0 8px 46px}.trash-kid{display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:12px;padding:6px 0;border-top:.5px solid var(--line)}.trash-kid small{display:block;font-size:10.5px;margin-top:2px}.trash-kids>.btn.link{font-size:11px;margin-top:4px}.trash-hint{font-size:11px;color:var(--muted);margin:12px 0 0}.trash-hint .btn.link{font-size:11px}.trash-empty{padding:26px 0;font-size:12.5px}.trash-empty .faint{font-size:11px;margin-top:6px}.trash-lead{padding:0 18px 10px;font-size:11px;margin:0}.trash-item{padding:12px 0;border-top:.5px solid var(--line)}.trash-item:first-of-type{border-top:0}.trash-item-head{display:flex;align-items:center;gap:8px;min-width:0}.trash-name{background:none;border:0;padding:0;font-size:12.5px;text-align:left;cursor:pointer;min-width:0;overflow-wrap:anywhere}.trash-name:hover{text-decoration:underline}.trash-item-meta{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--muted);margin-top:6px;flex-wrap:wrap}.trash-item-meta .btn.text-button{font-size:11px;padding:2px 4px}.trash-note{font-size:11px;color:var(--muted);margin:6px 0 0}.trash-note .btn.link{font-size:11px}.trash-archived{font-size:12px;padding:0 0 12px;margin:0;display:flex;align-items:center;gap:8px}.relink-actions{display:flex;gap:6px;flex-shrink:0}.relink-actions small{font-size:11px;color:var(--muted)}.node-archived-banner{display:flex;align-items:center;gap:8px;font-size:11px;margin-bottom:10px}.node-source{font-size:11px;color:var(--muted);margin:0 0 8px}.data-table tr.archived td{color:var(--muted)}.lf-row.archived .lf-value,.lf-row.archived .lf-src{color:var(--muted)}.ref-miss.soft{color:var(--muted)}/* 删除成功时右栏回收站按钮轻跳一下：反馈贴在东西去的地方（UI 规范 §9.6） *//* 我的存储：收藏 / 我的模板（PRD 8）。关系标签是中文，用 11px 正文字体，不放进 9px mono */.rel-tag{font-size:11px;font-weight:400;color:var(--muted);margin-left:8px;padding:1px 6px;border-radius:4px;box-shadow:inset 0 0 0 .75px var(--line);white-space:nowrap}.filters .filter-sep{width:.75px;align-self:stretch;margin:2px 4px;background:var(--line)}.storage-row.readonly{background:#EDECE8;box-shadow:inset 0 0 0 .75px var(--faint)}.storage-row.readonly h4{color:var(--muted)}.storage-row>.trash-more{margin-left:8px}/* 共享与权限：复用（7.3）、实验室共享（9） */.share-section{margin-top:18px;padding-top:12px;border-top:.5px solid var(--line);font-size:12px}.share-section h4{font-size:11px;color:var(--muted);font-weight:500;margin-bottom:8px}.share-section .between{gap:12px}.share-section p{font-size:11px;line-height:1.7;margin-top:6px}.scope-line{font-size:11px;color:var(--muted);margin:14px 0 4px}.fork-note{font-size:12px;margin-top:14px;padding-left:12px;box-shadow:inset 2.5px 0 var(--ink)}.fork-state{font-size:11px;margin-left:6px}.rail-button.bounce{animation:rail-bounce .6s ease-out}@keyframes rail-bounce{0%,100%{transform:translateY(0)}30%{transform:translateY(-5px)}60%{transform:translateY(1px)}}.confirm-head:first-child{margin-top:0}.confirm-list li .check{display:inline-flex;align-items:center;gap:8px;flex:1}.sharing-archive{margin-top:18px;padding-top:10px;border-top:.5px solid var(--line)}/* 删除确认弹窗：列出这次会带走什么 */.confirm-list{list-style:none;padding:0;margin:0 0 14px}.confirm-list li{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:9px 0;border-bottom:.5px solid var(--line);font-size:13px}.confirm-list li:last-child{border-bottom:0}.confirm-list small{font:10px var(--mono);color:var(--muted);white-space:nowrap;flex-shrink:0}.confirm-note{font-size:11px;line-height:1.8;color:var(--muted);margin:0}.confirm-note+.confirm-note{margin-top:6px}.storage-modal .pagination{height:35px;gap:13px}.storage-modal .pagination>.mono{border-right:.5px solid var(--line);padding-right:13px}.storage-tabs{display:flex;gap:5px;margin-bottom:12px}.storage-tabs .btn{min-height:25px;padding:4px 8px;font-size:10px;border:0}.storage-tabs .btn.selected{background:var(--paper);box-shadow:0 1px 2px #0001}.storage-tabs .search{height:26px}.storage-row{display:flex;align-items:center;gap:11px;border-bottom:.5px solid var(--line);padding:10px 0;cursor:pointer}.storage-row>.chip{font-size:8px;min-width:58px;text-align:center}.storage-row h4{font-size:12px}.storage-row p{font:9px var(--mono);color:var(--faint);margin-top:5px}.storage-row>.mono{margin-left:auto;white-space:nowrap;font-size:9px;color:var(--faint)}.storage-row:hover{background:var(--soft)}.draft-progress{display:inline-flex;gap:2px;height:6px;margin-right:9px}.draft-progress i{width:15px;height:6px;background:var(--inset);border:.5px solid var(--line)}.draft-progress i.done{background:var(--ink);border-color:var(--ink)}.crop-zone{width:180px;height:180px;background-color:var(--inset);background-image:linear-gradient(90deg,var(--line) .5px,transparent .5px),linear-gradient(var(--line) .5px,transparent .5px);background-size:60px 60px;border:.5px solid var(--line);border-radius:2px;display:grid;place-items:center;overflow:hidden;flex-shrink:0}.crop-zone .avatar{width:100px;height:100px;background:var(--ink);color:var(--paper);border:0;border-radius:8px;font-size:38px}.crop-zone img{max-width:100%;max-height:100%;object-fit:cover;cursor:move}.avatar-controls{padding:6px 0 0 16px;flex:1}.avatar-controls p{margin:15px 0 47px;color:var(--secondary);font-size:13px}.avatar-controls small{display:block;font:9px var(--mono);margin-top:12px}.range-input{width:100%;accent-color:var(--ink)}.recovery-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px 40px;padding:22px 24px;border:.5px solid var(--line);background:var(--soft);font:14px var(--mono)}.profile-projects{display:grid;grid-template-columns:repeat(2,1fr);gap:17px}.profile-projects .cover-placeholder{height:84px}.profile-projects .cover-placeholder:after{display:none}.profile-projects .gallery-info{padding:16px}.profile-projects .gallery-info h3{font-size:15px}.profile-projects .gallery-info .tags{justify-content:space-between}.schematic{width:100%;height:100%;display:block}.toast{position:fixed;left:26px;bottom:111px;z-index:200;max-width:340px;background:var(--paper);border:.75px solid var(--line);border-radius:5px;box-shadow:0 3px 10px #0001;padding:13px 14px;display:flex;align-items:center;gap:9px;font-size:11px;animation:toast-in .16s ease-out}.toast .btn.link{font-size:10px;margin-left:9px}.toast.error{color:var(--red)}.status-line{margin-top:10px;font-size:11px;color:var(--secondary);min-height:16px}.status-line.error{color:var(--red)}.stats-chart{display:flex;height:200px;gap:20px;align-items:flex-end;border-bottom:1.25px solid var(--ink);padding:0 20px;margin:20px 0 40px}.stats-bar{flex:1;max-width:100px;background:var(--inset);border:.75px solid var(--line);position:relative;min-height:5px}.stats-bar span{position:absolute;top:-23px;width:100%;text-align:center;font:12px var(--mono)}.stats-bar small{position:absolute;bottom:-26px;width:100%;text-align:center;font-size:10px}.error-page{padding:80px;text-align:center}.search-result{border-bottom:.5px solid var(--line);padding:12px;cursor:pointer}.search-result:hover{background:var(--soft)}
body.dark{--paper:#252421;--panel:#2A2824;--inset:#34322d;--soft:#2d2b27;--ink:#e7e5de;--line:#55524a;--muted:#a6a298;--secondary:#bcb7ab;--faint:#8f8b81;color-scheme:dark}body.dark .panel,body.dark .sheet,body.dark .modal{border-color:#ffffff1c}body.dark .btn.primary{color:var(--paper)}body.compact{font-size:12px}body.compact .setting-row{min-height:41px;padding:9px 0}body.compact .data-table td{padding-top:8px;padding-bottom:8px}body.high-contrast{--line:#78756d;--faint:#69665e;--muted:#57544e}body.underlined .btn.link,body.underlined a{text-decoration:underline}body.reduce-motion *,body.reduce-motion *:before,body.reduce-motion *:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}body.no-grid{background-image:none}body.no-shadows .node-back{display:none}body.thick-cursor *{caret-color:var(--ink)}
@keyframes toast-in{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
@media(min-width:1550px){.account-columns{gap:20px}.setting-card{padding:20px}.messages-main.with-panel .conversation-column{width:356px}}
@media(max-width:1400px){:root{--sidebar:216px;--left:244px}.gallery-grid{gap:16px}.cover-placeholder{height:160px}.project-card{flex-basis:300px}.split-side.wide{width:390px}.split-side{width:315px}.messages-layout{gap:32px}.conversation-column{width:310px;min-width:260px}.main-sheet.with-panel .conversation-column{width:270px;min-width:240px}.chat-context-link{display:none}.account-columns{padding-left:22px;padding-right:22px;gap:16px}.setting-card{padding:17px}.account-head{padding-left:22px;padding-right:22px}.account-head h2{font-size:21px}.setting-row small{margin-left:5px}.segment button{padding:6px 8px}.invite-card{margin-left:0}.side-caption{font-size:8px}}
@media(max-width:1100px){:root{--sidebar:190px;--left:218px}.page-heading h1{font-size:24px}.page-heading>div:first-child>span{font-size:10px}.gallery-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.main-sheet.with-panel,.main-sheet.has-rail.with-panel{right:74px}.right-panel{box-shadow:-8px 0 35px #0002}.right-panel.account-panel{right:14px}.account-columns{grid-template-columns:1fr}.messages-layout{gap:22px}.conversation-column{width:245px;min-width:230px}.split-side{width:265px}.split-side.wide{width:290px}.node-mini-meta{display:none}.modal .modal-side-nav{width:155px;flex-basis:155px}.modal-side-nav button small{font-size:7px}.modal-split>.modal-aside{width:270px;flex-basis:270px}.graph-topbar.with-panel{right:74px}.main-content{padding:18px}.sidebar .brand .mono{display:none}.account-tabs{gap:22px}.fields-table td{font-size:11px}.template-actions{padding:10px 16px}.template-actions .mono{max-width:120px;font-size:8px}.template-actions .btn{font-size:11px;padding:7px 9px}}
@media(max-width:760px){:root{--sidebar:46px;--left:72px}.sidebar{width:46px}.sidebar .mobile-project-menu{display:flex}.sidebar .brand{padding:0;justify-content:center}.sidebar .brand-name,.sidebar .brand .mono,.sidebar .nav-label,.sidebar .count,.sidebar .notice-dot,.sidebar .side-scroll,.sidebar .storage-trigger span,.sidebar .user-trigger>span:not(.avatar){display:none}.sidebar .nav-item{justify-content:center;padding:0}.sidebar .sidebar-nav{padding:0 5px}.sidebar .collapse-side{display:none}.sidebar .storage-trigger{width:100%;margin:0;padding:7px 0;justify-content:center}.sidebar .storage-trigger .storage-arrow{display:none}.sidebar .storage-trigger .storage-icon{display:grid;place-items:center;width:30px;height:31px;border-radius:6px;color:var(--muted)}.sidebar .user-trigger{padding:9px;justify-content:center}.main-sheet.has-rail{right:14px}.right-rail{display:none}.main-sheet.with-panel,.main-sheet.has-rail.with-panel{right:14px}.graph-topbar,.graph-topbar.with-panel{right:14px}.graph-topbar>.mono{display:none}.graph-zoom{right:14px}.page-heading>div:first-child{display:block}.page-heading>div:first-child>span{display:block;margin-top:8px}.page-heading .btn{font-size:11px;padding:7px 9px}.toolbar{flex-wrap:wrap}.toolbar .search{flex-basis:100%}.project-card{flex-basis:265px}.gallery-grid{grid-template-columns:1fr}.cover-placeholder{height:200px}.account-tabs{gap:15px;padding:0 16px}.account-tabs a{font-size:10px}.account-head{display:block;padding:20px 17px}.account-head>.actions{margin-top:15px}.account-columns{padding:0 14px 20px}.account-columns .cols2{grid-template-columns:1fr}.setting-card{padding:16px}.setting-row{font-size:12px;gap:8px}.setting-row small{display:none}.split-side{display:none}.node-page-header .node-top{flex-wrap:wrap}.node-page-header h1{font-size:25px}.image-pair{flex-wrap:wrap}.image-placeholder{width:100%;height:140px}/* 讨论按钮并进工具组（移动 / 编辑 / 更多 / 讨论）在最右端：块内容不再留右侧沟槽,和顶栏左右对齐 */
.node-block{padding-right:0}
.block-tools{right:0!important;opacity:1!important;padding-left:14px}
.block-tools>.block-tool{opacity:0;transition:opacity .15s}
.node-block:hover>.block-tools>.block-tool,.node-block:focus-within>.block-tools>.block-tool,
.node-block.block-slot>.block-tools>.block-tool,.node-block.editing>.block-tools>.block-tool,
.block-ghost>.block-tools>.block-tool{opacity:1}
@media(hover:none){.block-tools>.block-tool{opacity:1}}
.block-tools>.block-discussion{position:static!important;right:auto!important;top:auto!important;flex:0 0 auto}.node-scroll{padding-left:9px;margin-left:6px}.add-block-bar{font-size:8px;gap:5px;padding:10px 8px}.messages-main{padding:16px}.messages-layout{position:relative;display:block;padding-top:0}.conversation-column{display:none}.chat-column{height:100%;display:flex}.chat-heading{padding-top:4px}.chat-heading .person strong{font-size:12px}.chat-heading .person small{font-size:7px}.chat-composer .btn.primary{padding:7px 9px}.chat-heading .mobile-conversations{display:inline-flex!important}.right-panel,.right-panel.account-panel{right:14px;left:72px;width:auto;z-index:35}.modal-backdrop{padding:12px}.modal{max-width:calc(100vw - 24px);max-height:calc(100dvh - 24px)}.modal>header{padding:0 17px;min-height:53px;height:53px}.modal>header h2{font-size:16px}.modal-content{padding:20px 17px}.modal>footer{padding:14px 17px;flex-wrap:wrap}.modal>footer small{max-width:45%;font-size:9px}.modal .modal-side-nav{width:115px;flex-basis:115px;padding:15px 4px}.modal-side-nav button{font-size:10px;padding:10px 7px;gap:6px}.modal-side-nav button small{display:none}.modal .modal-split{display:flex}.modal-split>section{padding:17px;overflow:auto}.modal-split>.modal-aside{display:none}.modal .cols2,.modal .cols3{grid-template-columns:1fr}.modal .cols4{grid-template-columns:repeat(2,1fr)}.modal-side-nav h4{font-size:8px}.storage-modal{left:72px;width:calc(100vw - 86px);max-width:calc(100vw - 86px)}.storage-row>.mono{display:none}.storage-tabs{flex-wrap:wrap}.storage-tabs .search{flex-basis:100%}.login-card{width:calc(100vw - 40px);max-width:490px;padding:27px}.login-page{padding:20px}.crop-zone{width:120px;height:120px}.crop-zone .avatar{width:80px;height:80px}.avatar-controls{padding-left:0}.avatar-controls p{margin:10px 0 20px;font-size:12px}.profile-projects{grid-template-columns:1fr}.recovery-grid{padding:17px;gap:15px;font-size:10px}.run-form .cols3,.run-form .cols4{grid-template-columns:1fr 1fr}.run-form .section-label span:last-child{display:none}.form-outcome .choice{padding:9px 7px}.form-outcome .choice strong{font-size:11px}.run-numbers{grid-template-columns:1fr 1fr;gap:22px}.template-actions{gap:10px;flex-wrap:wrap;height:auto;min-height:65px}.template-actions>.mono{display:none}.floating-add{right:25px}.invite-card .section-label{white-space:normal;font-size:10px}.invite-card .section-label i{display:none}.invite-card>footer{display:block}.invite-card>footer .actions{margin-top:10px;justify-content:flex-end}.invite-card .quote{font-size:11px}.data-table{min-width:650px}.field-advice{font-size:10px;padding:11px}.field-advice .btn{font-size:10px}.module-types{grid-template-columns:repeat(2,1fr)}.graph-empty{right:36px;top:20%}.graph-empty h2{font-size:18px}.viewer-banner{right:14px}.viewer-banner p{display:none}.viewer-banner{font-size:11px}.metric-grid strong{font-size:22px}.stats-chart{gap:9px;padding:0 8px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}
.graph-empty,.viewer-banner{z-index:4}.nav-item{color:var(--ink)}.project-card{height:114px;min-height:114px;padding:11px 13px}.project-card .card-title{margin-bottom:7px}.project-card p{margin-bottom:8px;font-size:11px}.project-card .tags{margin-bottom:8px}.project-card .card-meta{padding-top:7px}.project-groups{gap:36px}.project-group .project-row::-webkit-scrollbar{display:none}.project-group .project-row::-webkit-scrollbar-thumb{background:var(--line)}
.form-outcome .choice{position:relative}.form-outcome .choice input{display:block;position:absolute;left:10px;top:12px;width:1px;height:1px;opacity:0}.form-outcome .choice:focus-within{outline:2px solid var(--blue);outline-offset:2px}
.publish-modal .modal-split>.modal-aside{flex-basis:44%;width:44%;padding:22px}.publish-modal .publish-cover{height:176px;margin-top:8px;margin-bottom:18px}.publish-modal .field{margin-bottom:15px}.publish-modal .cover-placeholder{height:150px}.publish-modal .gallery-info{padding:15px}.publish-modal .person{font-size:11px}.publish-modal .person .person{border:0;padding:0}.publish-modal .person small{font-size:9px}.fork-requests{position:fixed;z-index:8;left:var(--left);bottom:14px;width:394px;overflow:hidden}.fork-requests>header{height:45px;display:flex;align-items:center;gap:9px;padding:0 16px;border-bottom:.5px solid var(--line)}.fork-requests h3{font-size:14px;flex:1}.fork-requests article{margin:0 16px;padding:16px 0 12px;border-bottom:.5px solid var(--line)}.fork-requests article>p{font-size:11px;color:var(--secondary);margin:12px 0 12px 40px}.fork-requests article>.actions{margin-left:40px}.fork-requests .btn{min-height:28px;padding:5px 11px}.fork-requests>footer{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 16px}.fork-requests footer small{font-size:9px}.fork-requests footer .btn{font-size:10px;padding:0}.fork-requests .person small{font-size:9px}.fork-requests .avatar{width:27px;height:27px}@media(max-width:760px){.fork-requests{left:72px;right:14px;width:auto}.fork-requests footer small{display:none}.publish-modal .modal-split>.modal-aside{display:none}.publish-modal .publish-cover{height:135px}}
.publish-modal .field{margin-bottom:10px}.publish-modal .publish-cover{margin-bottom:13px;height:166px}.publish-modal .field>span{margin-bottom:6px}.image-block-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:16px}.image-block-grid figure{margin:0}.image-block-grid img{width:100%;max-height:320px;object-fit:contain;background:var(--inset);border:.5px solid var(--line)}.image-block-grid figcaption{font-size:10px;color:var(--muted);margin-top:8px}.node-block>[data-block]{width:100%}
.setting-card{position:relative}.setting-card>p{margin-bottom:15px}.setting-row{min-height:43px;padding:11px 0}.setting-card .setting-row:last-child{border-bottom:.5px solid var(--line)}.account-scroll .setting-row:has(.minor){min-height:56px}.setting-card>h3{font-size:15px}.setting-card .setting-row>span:last-child{flex-shrink:0}.no-bottom-margin{margin-bottom:0!important}.code-button{height:39px;margin-bottom:0}.crop-zone #crop-image{width:100%;height:100%;max-width:none;max-height:none;object-fit:cover}.publish-cover{height:145px;border:.75px dashed var(--line);background:var(--inset);display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:24px;gap:10px;cursor:pointer}.publish-cover img{max-width:100%;height:100%;object-fit:cover}.chat-message.self .shared-project p{border:0;background:none;padding:0;max-width:none;box-shadow:none}.chat-message.self .shared-project{width:330px}.shared-project .thumb{width:65px;flex-shrink:0}.shared-project .thumb+.grow{min-width:0}.chat-message .shared-project .tags{justify-content:flex-start}.popover .menu-row.danger{color:var(--red)}.modal:focus{outline:none}.modal .popover:focus{outline:none}.fields-table .field-selected:not(.key-row){box-shadow:inset 2px 0 var(--ink)}body.no-focus-ring :focus-visible{outline:none}body.thick-cursor input,body.thick-cursor textarea{caret-shape:block}body.minimal-nodes .graph-node .node-body,body.minimal-nodes .graph-node .node-footer,body.minimal-nodes .graph-node h3,body.minimal-nodes .graph-node small{display:none}.mobile-show{display:block!important;position:absolute!important;inset:0;z-index:10;background:var(--paper)}
@media(max-width:760px){.setting-card .setting-row{flex-wrap:wrap}.setting-card .setting-row>span:last-child{flex-shrink:1}.account-tabs{overflow-x:auto;gap:16px}.account-tabs a{white-space:nowrap}.chat-message.self .shared-project{width:100%}.profile-projects .gallery-card:nth-child(2){margin-top:8px}.page-heading{align-items:flex-start}.page-heading .actions{flex-shrink:0}.setting-row .segment{max-width:100%}.segment button{font-size:10px;padding:6px}.form-outcome{flex-wrap:wrap}.form-actions{flex-wrap:wrap;gap:12px}.form-actions .actions{margin-left:auto}.modal-split>section{min-width:0}.modal>footer .left-controls{flex:1 0 100%;margin-bottom:6px}.modal>footer .left-controls .btn{font-size:10px}.recovery-grid{font-size:10px;gap:14px 8px}}

/* ── 左栏跳转回应：分组框 / 子组放大一下再回弹 ── */
@keyframes frame-pulse{0%{transform:scale(1);animation-timing-function:cubic-bezier(.3,0,.3,1)}28%{transform:scale(var(--pulse,1.02));animation-timing-function:cubic-bezier(.33,0,.2,1)}100%{transform:scale(1)}}
.project-group.pulse{animation:frame-pulse .48s both;z-index:3}
.subgroup.pulse,.project-card.pulse,.folder-card.pulse{--pulse:1.045;animation:frame-pulse .48s both;z-index:3}
/* 行是横向滚动容器，上下各留 5px 让回弹不被裁掉（负外边距抵消，版面不动） */
.project-row{padding-block:5px;margin-block:-5px}
/* ── 展开分组：虚线框在分组位置与展开页之间过渡 ── */
.frame-ghost{position:fixed;z-index:103;border:1.5px dashed #83807A;pointer-events:none;box-sizing:border-box}
.frame-shade{position:fixed;inset:0;z-index:101;pointer-events:none;background:#1a1a1a4d;backdrop-filter:blur(3px);transition:opacity .36s ease-in}
/* ── 展开页：只展示。上层每个子组一行，下层是没进子组的项目一行；放不下横向滑动 ── */
.group-editor .editor-toolbar{padding:16px 24px 2px;margin:0}
.group-editor .editor-toolbar .search{height:34px;flex:1;margin:0}









/* 新建子组：勾选项目 */
.pick-modal .pick-note{margin:-4px 0 8px}
.pick-frame{flex:none}
.pick-frame>.cx-track.y{left:0;top:4px;bottom:4px}
.pick-list{max-height:264px;overflow:auto;scrollbar-width:none;padding:2px 0}
.pick-frame.has-scroll>.pick-list{padding-left:18px}
.pick-list .check{margin:0;padding:8px 8px;border-radius:4px;cursor:pointer}
.pick-list .check:hover{background:var(--inset)}
.pick-list .check small{margin-left:auto;font:10px var(--mono);color:var(--muted)}
/* 子组成员拖动：offset 以 metaball 连回子组 */
.project-groups,.group-editor .editor-scroll{isolation:isolate}
.sub-tether{position:fixed;left:0;top:0;width:100vw;height:100vh;z-index:-1;pointer-events:none;overflow:visible}
/* 拖影不带 offset，放下后才恢复 */
.sub-tether .t-fill{fill:var(--inset)}
.editor-layers{display:flex;flex-direction:column;min-height:100%}
.editor-layer{padding:2px 0 8px}
.editor-layer+.editor-layer{border-top:.5px solid var(--line);padding-top:18px}
.layer-title{display:flex;align-items:baseline;gap:8px;margin:0 0 10px;font:500 9.5px var(--mono);letter-spacing:.08em;color:var(--muted)}
.layer-title span{color:var(--faint,var(--muted));font-weight:400}
.layer-empty{margin:10px 0 18px;font-size:12px}
.editor-line{position:relative;display:flex;flex-direction:column;margin-bottom:22px}
.editor-line>.project-row{flex-wrap:nowrap}
.editor-line>.project-row>.project-card{margin-top:6px}
.editor-line>.row-track{position:relative;display:block;width:100%;margin:12px 0 0}.editor-line>.row-track:not(.on){display:none}
.editor-line.fade-right::after,.editor-line.fade-left::before{content:'';position:absolute;top:-5px;height:var(--row-h);width:60px;pointer-events:none;z-index:2}
.editor-line.fade-right::after{right:0;background:linear-gradient(to right,transparent,var(--paper))}
.editor-line.fade-left::before{left:0;background:linear-gradient(to left,transparent,var(--paper))}
.editor-line .subgroup-label{transform:translateX(var(--sx,0px));z-index:3}
/* ── 收起的分组（双击组名）：卡片缩成只有项目名的长方形，分组框内边距和卡片间距一起变小 ── */
.group-tabs .group-label{user-select:none}
.project-group.collapsed{padding:10px 12px 12px}
.project-group.collapsed .project-row{gap:10px}
.project-group.collapsed .subgroup-row{gap:8px}
.project-group.collapsed .project-card{flex:0 0 190px;box-sizing:border-box;width:190px;min-width:0;max-width:190px;height:34px;min-height:0;padding:0 10px 0 8px;justify-content:center;overflow:hidden}
.project-group.collapsed .project-card>:not(.card-title){display:none}
.project-group.collapsed .card-title{margin:0;gap:9px;justify-content:flex-start}
.project-group.collapsed .card-title h3{font-size:12px;flex:1;min-width:0;text-overflow:clip}
.project-group.collapsed .card-flags .badge{display:none}
.project-card.sizing{overflow:hidden}
/* 项目卡上的 ADMIN 用项目橙 */
.project-card .badge.dark{background:var(--orange);color:#fff}
/* 收起后的名称条：统一 190px 宽；左侧身份方块（ADMIN 橙 A / VIEWER 浅灰 V / STUDENT 描边 S）+ 项目名；名字过长时右端渐消 */
.card-tile{display:none}
.project-group.collapsed .card-tile{display:grid;place-items:center;flex:0 0 18px;height:18px;border-radius:3px;background:var(--inset);color:var(--secondary);font:500 9.5px/1 var(--mono);font-style:normal;letter-spacing:0}
.project-group.collapsed .card-tile.admin{background:var(--orange);color:#fff}.project-group.collapsed .card-tile.student{background:transparent;box-shadow:inset 0 0 0 .75px var(--ink);color:var(--ink)}.project-group.collapsed .card-tile.lead{background:var(--ink);color:var(--paper)}
.project-group.collapsed .card-title h3>span{display:inline-block;white-space:nowrap;will-change:transform}
.project-group.collapsed .card-title h3.overflowing{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 22px),transparent)}

/* 展开页里就地改名：点名字或笔进入编辑，回车 / 点别处保存，Esc 取消 */
.group-editor>header h2{display:flex;align-items:center;gap:4px}
.inline-name{cursor:text;border-radius:2px;padding:0 2px;margin:0 -2px;transition:background .15s}
.inline-name:hover{background:var(--inset)}
.inline-pen{border:0;background:none;padding:2px;margin-left:3px;color:var(--muted);display:inline-grid;place-items:center;vertical-align:middle;cursor:pointer}
.inline-pen:hover{color:var(--ink)}
.subgroup-label .inline-pen{padding:0 1px;margin-left:2px;vertical-align:-1px}
.renaming .inline-pen{display:none}
.inline-input{font:inherit;letter-spacing:inherit;color:var(--ink);background:var(--inset);border:0;border-bottom:1px solid var(--ink);border-radius:2px 2px 0 0;padding:0 4px;outline:0;min-width:0;box-sizing:border-box}
.subgroup-label .inline-input{height:13px;font-size:9px;padding:0 3px}
.inline-probe{position:absolute;visibility:hidden;white-space:pre;font:inherit;letter-spacing:inherit;pointer-events:none}
/* 悬停展开：收起的卡片在原位置浮出成完整卡片，盖在最上层，移开或双击收回 */
.project-card.card-peek{position:fixed;z-index:95;margin:0;min-height:0;max-width:none;flex:none;overflow:hidden;border-color:var(--ink);box-shadow:0 10px 26px rgba(26,26,26,.16),0 2px 6px rgba(26,26,26,.08)}
.menu-hint{font-size:10.5px;line-height:1.5;color:var(--faint);padding:6px 10px 4px;border-top:.5px solid var(--line);margin-top:4px}
/* ── 下拉选择框（全站统一）：默认 / 悬停 / 展开 / 禁用 / 错误；选项列表放不下时上下渐消 + 统一滑块 ── */
.cx-select{position:relative;width:100%}
.cx-native{position:absolute;inset:0;width:100%!important;height:100%;min-height:0!important;opacity:0;pointer-events:none;padding:0!important}
.cx-select-box{position:relative;display:flex;align-items:center;width:100%;min-height:36px;padding:0 34px 0 12px;background:var(--paper);border:1px solid #9A978F;border-radius:4px;text-align:left;font-size:13px;color:var(--ink);cursor:pointer;transition:border-color .12s,box-shadow .12s}
.modal-content .cx-select-box{min-height:39px}
.cx-select-value{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cx-select-value.is-placeholder{color:var(--muted)}
.cx-caret{position:absolute;right:13px;top:50%;width:0;height:0;margin-top:-2px;border-left:4.5px solid transparent;border-right:4.5px solid transparent;border-top:5.5px solid var(--ink);transition:transform .15s}
.cx-select-box:hover{border-color:var(--blue)}
.cx-select.is-open .cx-select-box,.cx-select-box:focus-visible{outline:0;border-color:var(--blue);box-shadow:0 0 0 .75px var(--blue)}
.cx-select.is-open .cx-caret{transform:rotate(180deg)}
.cx-select.is-disabled .cx-select-box{background:var(--inset);border-color:var(--line);color:var(--muted);cursor:not-allowed;box-shadow:none}
.cx-select.is-disabled .cx-caret{border-top-color:var(--faint)}
.field.error .cx-select-box{border-color:var(--red);box-shadow:none}
.field.error:after{padding-left:17px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Ccircle cx='6' cy='6' r='6' fill='%239E524B'/%3E%3Cpath d='M6 3v3.6' stroke='%23fff' stroke-width='1.4' stroke-linecap='round'/%3E%3Ccircle cx='6' cy='8.7' r='.8' fill='%23fff'/%3E%3C/svg%3E") left center/12px 12px no-repeat;font:11px var(--sans)}
.cx-select-menu{position:fixed;z-index:500;background:var(--paper);border:.75px solid var(--line);border-radius:4px;box-shadow:0 8px 20px rgba(26,26,26,.12),0 1px 3px rgba(26,26,26,.06);padding:4px 0}
.cx-select-list{max-height:232px;overflow:auto;scrollbar-width:none}
.cx-select-list::-webkit-scrollbar{display:none}
.cx-select-menu.has-scroll .cx-select-list{padding-right:14px}
.cx-select-menu>.cx-track.y{right:6px;left:auto;top:8px;bottom:8px}
.cx-option{display:block;width:100%;text-align:left;border:0;background:none;padding:8px 12px;font-size:12.5px;line-height:1.35;color:var(--ink);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:0}
.cx-option.is-active{background:var(--soft)}
.cx-option.is-selected{box-shadow:inset 2.5px 0 var(--blue)}.cx-option[data-depth="1"]{color:var(--secondary)}.cx-option[data-depth="2"]{color:var(--muted)}.cx-option[data-depth="3"]{color:var(--faint)}.cx-sub-arrow{display:inline-block;width:10px;height:10px;margin-right:6px;vertical-align:-1px;fill:none;stroke:currentColor;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;opacity:.8}
.cx-select-list.fade-scroll{-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 26px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 26px),transparent)}
.cx-select-list.fade-scroll.scrolled{-webkit-mask-image:linear-gradient(to bottom,transparent,#000 22px,#000 calc(100% - 26px),transparent);mask-image:linear-gradient(to bottom,transparent,#000 22px,#000 calc(100% - 26px),transparent)}
.cx-select-list.fade-scroll.at-bottom{-webkit-mask-image:linear-gradient(to bottom,transparent,#000 22px,#000);mask-image:linear-gradient(to bottom,transparent,#000 22px,#000)}
.cx-select-list.fade-scroll:not(.can-scroll){-webkit-mask-image:none;mask-image:none}
/* ── 左栏分组 / 文件夹列表：约 10 行后框内滚动（上下渐消 + 统一滑块）；Shift 多选；长按拖动排序 ── */
.side-list-frame{position:relative}
.side-list{max-height:262px;overflow:auto;scrollbar-width:none;padding:1px 8px;margin:0 -8px}
.side-list::-webkit-scrollbar{display:none}
.side-list-frame>.cx-track.y{left:auto;right:-12px;top:4px;bottom:4px}
.side-list .side-link.group,.side-list .side-link.sub{border-radius:7px}
.side-list.fade-scroll{-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 30px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 30px),transparent)}
.side-list.fade-scroll.scrolled{-webkit-mask-image:linear-gradient(to bottom,transparent,#000 26px,#000 calc(100% - 30px),transparent);mask-image:linear-gradient(to bottom,transparent,#000 26px,#000 calc(100% - 30px),transparent)}
.side-list.fade-scroll.at-bottom{-webkit-mask-image:linear-gradient(to bottom,transparent,#000 26px,#000);mask-image:linear-gradient(to bottom,transparent,#000 26px,#000)}
.side-list.fade-scroll:not(.can-scroll){-webkit-mask-image:none;mask-image:none}
.side-list .side-link.group.selected{background:var(--soft);box-shadow:inset 2px 0 var(--blue)}
.ref-frame{position:fixed;z-index:18;border:2px solid var(--orange);border-radius:12px;pointer-events:none}.ref-badge{position:fixed;z-index:19;transform:translateX(-50%);background:var(--orange);color:#fff;font:10px var(--mono);letter-spacing:.08em;padding:4px 12px;border-radius:0 0 6px 6px;pointer-events:none}.mention{color:var(--blue);background:#4A6FA514;border-radius:3px;padding:0 2px}.chat-message.self .mention{color:inherit;background:#ffffff26}
.mention-pop{position:fixed;z-index:600;width:220px;padding:4px 0}.mention-pop .menu-row{display:flex;align-items:center;gap:8px}.mention-pop .menu-row.active{background:var(--soft)}.mention-avatar{width:20px;height:20px;font-size:8px;flex-shrink:0}
.ref-note{font-size:11px;color:var(--secondary);margin-top:4px;line-height:1.6;white-space:nowrap;overflow:hidden;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 18px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 18px),transparent)}.ref-note-full{font-size:13px;line-height:1.7;margin-bottom:10px}
.ref-photos{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.ref-photo{position:relative;width:88px;height:66px;margin:0;border:.5px solid var(--line);border-radius:4px;overflow:hidden;background:var(--inset)}.ref-photo img{width:100%;height:100%;object-fit:cover;display:block}.ref-photo .thread-icon-btn{position:absolute;top:3px;right:3px;margin:0;background:var(--paper)}.ref-photo-add{width:88px;height:66px;border:1px dashed var(--faint);border-radius:4px;display:grid;place-items:center;align-content:center;gap:4px;font-size:10px;color:var(--muted);cursor:pointer}.ref-photo-add:hover{color:var(--ink);border-color:var(--secondary)}
.ref-note-input{width:100%;border:0;border-bottom:1.5px solid var(--line);background:var(--inset);border-radius:5px 5px 0 0;padding:9px 10px;font:inherit;font-size:12px;resize:vertical}
.ref-float{position:fixed;z-index:19;display:flex;align-items:center;gap:8px}.ref-exit-float{background:var(--paper)}.rail-button.ref-on{color:var(--orange)}.rail-button.ref-on svg{color:var(--orange)}
.ref-place-row{display:flex;align-items:center;gap:10px}.ref-place-row .ref-card-row{flex:1;min-width:0}.ref-miss{color:#9E524B}.ref-item.gone .ref-item-label{color:var(--faint);text-decoration:line-through}
body.ref-mode .graph-node,body.ref-mode .node-block,body.ref-mode tr[data-action]{cursor:pointer}
.graph-node.ref-picked{box-shadow:0 0 0 2px var(--orange)!important;border-color:var(--orange)}.graph-group.ref-picked{border-color:var(--orange);border-style:solid}.graph-group.ref-picked>button{background:var(--orange)}
.node-block.ref-picked{outline:2px solid var(--orange);outline-offset:4px;border-radius:4px}tr.ref-picked td{background:#D8743A14}tr.ref-picked td:first-child{box-shadow:inset 2.5px 0 var(--orange)}
.ref-options{display:grid;gap:10px}.ref-option{text-align:left;border:.5px solid var(--line);border-radius:6px;background:var(--paper);padding:12px 14px;display:grid;gap:5px;cursor:pointer;font:inherit;color:var(--ink)}.ref-option strong{font-size:13px;font-weight:500}.ref-option span{font-size:11px;color:var(--muted);line-height:1.6}.ref-option:hover{border-color:#9A978F}
.ref-item{display:flex;align-items:center;gap:8px;padding:7px 0;border-bottom:.5px solid var(--line);font-size:12px}.ref-item-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 18px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 18px),transparent)}
.ref-card-row{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-bottom:.5px solid var(--line);cursor:pointer;color:var(--secondary)}.ref-card-row:hover{color:var(--ink)}.ref-card-row svg{flex-shrink:0;margin-top:2px}.ref-card-row h4{font-size:12px;font-weight:500;color:var(--ink)}.ref-card-row p{font-size:9px;color:var(--muted);margin-top:3px}
.ref-link{font-size:10px;padding:8px 10px;background:var(--inset);border-radius:4px;white-space:nowrap;overflow:hidden;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 24px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 24px),transparent)}
.leave-list{margin:10px 0 0 18px;font-size:12px;line-height:1.9;color:var(--secondary)}
.nav-item.nav-toggle{font:inherit;cursor:pointer}.nav-item.nav-toggle.toggled{color:var(--ink)}.nav-item.nav-toggle.toggled svg{color:var(--orange)}
.project-tabs{position:fixed;left:calc(14px + var(--sidebar));top:60px;z-index:19;width:40px;padding-right:12px;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;overscroll-behavior:contain;transform:translateX(-22px);transition:transform .26s cubic-bezier(.4,0,.2,1)}.project-tabs::-webkit-scrollbar{display:none}
.project-tabs.open,.project-tabs:focus-within{transform:none}.project-tabs.scrollable{-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 26px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 26px),transparent)}
.ptab-stack{display:flex;flex-direction:column;align-items:flex-start;padding:2px 0 8px}
.ptab{position:relative;width:28px;height:84px;flex:0 0 auto;margin-top:-7px;padding:9px 0;border:.75px solid #1a1a1a2e;border-left:0;border-radius:0 6px 6px 0;background:var(--soft);color:var(--secondary);box-shadow:1px 1px 3px #1a1a1a14;cursor:pointer;display:flex;justify-content:center;font-size:11px}
.ptab:first-child{margin-top:0}.ptab>span{writing-mode:vertical-rl;white-space:nowrap;overflow:hidden;max-height:100%;-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 14px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 14px),transparent)}
.ptab:hover{color:var(--ink);background:var(--paper)}.ptab.active{background:var(--orange);border-color:var(--orange);color:#fff}.ptab.add{height:34px;align-items:center;color:var(--muted)}
.side-link.group.tree-group{position:relative;display:flex;align-items:center;gap:6px;margin-top:7px;overflow:visible}.tree-group>span{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.side-link.tree-node{background:none;border:0;cursor:pointer;border-radius:5px;font:inherit;font-size:12px;transition:background-color .12s ease-out,color .12s ease-out}.side-link.tree-node.selected{color:var(--ink);background:var(--paper)}.side-link.group.tree-group:before{content:'';position:absolute;top:-4px;left:var(--rule,8px);right:8px;height:.5px;background:var(--line)}.tree-caret{display:inline-grid;place-items:center;width:10px;height:10px;flex-shrink:0;color:var(--secondary);transition:transform .15s cubic-bezier(.4,0,.2,1)}.tree-caret svg{display:block;width:9px;height:9px}.tree-group.folded .tree-caret{transform:rotate(-90deg)}.filter-unread{font-weight:400;font-family:var(--mono);font-size:9px;color:var(--orange)}.filter.active .filter-unread{color:var(--paper)}
.side-list.is-sorting .side-link.sub{display:none}
.drag-carry{display:none!important}
.drop-ph.ph-side{border-radius:6px;background:transparent;margin:1px 0}
.drag-ghost.ghost-side{background:var(--paper);border:.75px solid var(--ink);border-radius:7px;box-shadow:0 4px 12px rgba(26,26,26,.14);overflow:visible}
.drag-ghost.ghost-side.multi::after{content:attr(data-count);position:absolute;right:-7px;top:-7px;min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--ink);color:var(--paper);font:9px/16px var(--mono);text-align:center}
.side-link.folder-row svg{flex-shrink:0;color:var(--muted)}
.side-link.folder-row .side-name{min-width:0;overflow:hidden;text-overflow:ellipsis}
.side-link.folder-row.loose{color:var(--secondary)}
.side-folder-head{gap:8px}
.side-folder-name{display:flex;align-items:center;gap:5px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);letter-spacing:.08em}
.side-folder-name svg{flex-shrink:0}


/* 我的项目下面的位置：全部文件夹 / 文件夹名 */
.crumbs{display:flex;align-items:center;gap:7px;margin:-6px 0 14px;font:10px var(--mono);letter-spacing:.05em;color:var(--muted)}
.crumbs button{border:0;background:none;padding:0;font:inherit;letter-spacing:inherit;color:var(--secondary);cursor:pointer;text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:3px}
.crumbs button:hover{color:var(--ink);text-decoration-color:var(--ink)}
.crumbs i{font-style:normal;color:var(--faint)}
.crumbs span{color:var(--ink)}
/* ── 文件夹页：作品库式网格，卡片外框是带左上页签的文件夹形状 ── */
.folder-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:40px 22px;align-content:start;flex:1;min-height:0;overflow:hidden;padding:22px 4px 12px}
.folder-card{position:relative;display:flex;flex-direction:column;min-width:0;background:transparent;border:0;text-align:left;cursor:pointer;transition:transform .2s}
.folder-card>*:not(.folder-frame){position:relative;z-index:1}
.folder-frame{position:absolute;left:0;top:-16px;z-index:0;overflow:visible;pointer-events:none;transition:filter .2s}
.folder-frame path{fill:var(--paper);stroke:var(--line);stroke-width:var(--sw,1px);transition:stroke .15s}


.folder-card:hover{transform:translateY(-2px)}
.folder-card:hover .folder-frame{filter:drop-shadow(0 6px 10px rgba(26,26,26,.07))}
.folder-card:hover .folder-frame path{stroke:var(--ink)}

.folder-card.loose .folder-frame path{stroke-dasharray:3 2}
.folder-cover{height:150px;background:var(--inset);margin:10px 10px 0;border-radius:3px;padding:12px;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:8px;position:relative}
.folder-chip{display:flex;flex-direction:column;justify-content:space-between;min-width:0;background:var(--paper);border:.5px solid var(--line);border-radius:2px;padding:8px 9px}
.folder-chip b{font-weight:400;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.folder-chip small{font:9px var(--mono);color:var(--faint)}
.folder-empty{grid-column:1/-1;grid-row:1/-1;display:grid;place-items:center;font-size:11px;color:var(--faint);text-align:center}

.folder-info{padding:13px}
.folder-info h3{display:flex;align-items:center;gap:6px;font-size:15px;font-weight:400;margin-bottom:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.folder-info p{font-size:11px;color:var(--muted);margin-bottom:11px;line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.folder-meta{display:flex;align-items:center;gap:8px;border-top:.5px solid var(--line);padding-top:10px;font:9.5px var(--mono);color:var(--faint)}
.folder-meta .counts{margin-left:auto;color:var(--secondary)}
.drop-ph.ph-folder{border-radius:0 5px 5px 5px}
.drag-ghost.ghost-folder{background:transparent!important;box-shadow:none!important;border:0!important}
.drag-ghost.ghost-folder .folder-frame path{stroke:var(--ink)}
.drag-ghost.ghost-folder .folder-frame{filter:drop-shadow(0 8px 14px rgba(26,26,26,.14))}
.folder-ghost{position:fixed;z-index:90;background:var(--paper);border:.75px solid var(--ink);border-radius:6px;pointer-events:none;box-shadow:0 10px 28px rgba(26,26,26,.12)}
@media (max-width:1100px){.folder-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:640px){.folder-grid{grid-template-columns:1fr}}
/* 左栏拖动：拖影里的名字向右、数字向左各让出一点，和外框留出间隔 */
.side-link .side-name{min-width:0;overflow:hidden;text-overflow:ellipsis;display:inline-block}
@keyframes side-name-in{to{transform:translateX(7px)}}
@keyframes side-count-in{to{transform:translateX(-7px)}}
.drag-ghost.ghost-side .side-name,.stack-row .side-name{animation:side-name-in .2s cubic-bezier(.3,.7,.2,1) forwards}
.drag-ghost.ghost-side small,.stack-row small{display:inline-block;animation:side-count-in .2s cubic-bezier(.3,.7,.2,1) forwards}
.drop-ph.ph-side{border-radius:7px}
/* 多选拖动：按下的那行在最上面，其余行以它的左侧为轴依次多转 10° 往下展开；左上角橙色圆点写数量 */
.drag-ghost.ghost-side.stack{background:transparent;border:0;box-shadow:none}
.stack-row{position:absolute;inset:0;display:flex;align-items:center;gap:5px;margin:0!important;width:100%!important;padding:4px 8px;background:var(--paper);border:.75px solid var(--line);border-radius:7px;font-size:12px;color:var(--ink);white-space:nowrap;overflow:hidden;box-shadow:0 2px 6px rgba(26,26,26,.08);transform-origin:0 50%}
.stack-row.is-top{border-color:var(--ink);box-shadow:0 4px 12px rgba(26,26,26,.14)}
.stack-row.is-fanned{color:var(--secondary);animation:stack-fan .26s cubic-bezier(.3,.7,.2,1) forwards}
@keyframes stack-fan{from{transform:rotate(0)}to{transform:rotate(var(--turn))}}
.stack-row .grow{flex:1}
.stack-count{position:absolute;left:-8px;top:-8px;z-index:12;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--orange);color:#fff;font:600 10px/18px var(--mono);font-style:normal;text-align:center;box-shadow:0 1px 3px rgba(26,26,26,.2)}
/* 文件夹里的子文件夹：分组上方一排小文件夹卡 */
.subfolder-strip{display:flex;gap:16px;overflow-x:auto;scrollbar-width:none;padding:22px 2px 6px;margin-bottom:6px;flex-shrink:0}
.folder-card.mini{flex:0 0 230px;padding:12px 13px 10px}
.folder-card.mini h3{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:400;margin-bottom:10px;min-width:0}
.folder-card.mini h3 span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.folder-card.mini h3 svg{flex-shrink:0;color:var(--muted)}
.folder-card.mini .folder-meta{padding-top:8px}
.folder-chip.is-folder b{display:flex;align-items:center;gap:4px}
.folder-chip.is-folder b svg{flex-shrink:0;color:var(--muted)}
/* 文件夹拖动时的落点框也带页签形状的圆角 */
.drop-ph.ph-folder{border-radius:0 5px 5px 5px;align-self:stretch}
/* 分组拖到文件夹上：目标描蓝边 */
.folder-card.drop-into .folder-frame path,.folder-card.drop-into:hover .folder-frame path{stroke:var(--blue);stroke-width:calc(var(--sw,1px) * 2)}

.side-list .side-link.drop-into{background:var(--soft);box-shadow:inset 0 0 0 1px var(--blue);color:var(--ink)}

/* 主页面分组名多选：蓝色描边 + 选择顺序 */
.group-tabs .group-label.selected{box-shadow:0 0 0 1.5px var(--blue)}

/* 主页面多选拖动：第一选在上，其余依次压在下面、往下错开露出底边 */
.drag-ghost.gstack{background:transparent!important;border:0!important;box-shadow:none!important;padding:0!important;opacity:1!important;overflow:visible}
.gstack-row{position:absolute!important;left:0;top:0;width:100%;height:100%;margin:0!important;background:var(--paper);overflow:hidden;pointer-events:none;box-shadow:0 6px 18px rgba(26,26,26,.12)}
.gstack-row.is-under{transform:translateY(var(--drop));filter:saturate(.8);animation:gstack-drop .22s cubic-bezier(.3,.7,.2,1) both}
@keyframes gstack-drop{from{transform:translateY(0)}to{transform:translateY(var(--drop))}}
.drag-ghost.gstack>.stack-count{left:-9px;top:-9px;z-index:40}
.folder-card[hidden],.project-group[hidden]{display:none!important}
/* 拖动分组时的浮起卡片：底色只铺到右下角切角虚线为止（不再是方块），投影跟着切角形状走 */
.drag-ghost.ghost-group:not(.gstack),.gstack-row{background:linear-gradient(315deg,transparent calc(var(--chamfer,40px) * .7071 + 1px),var(--paper) 0)!important;box-shadow:none!important;filter:drop-shadow(0 6px 14px rgba(26,26,26,.14))}
.gstack-row.is-under{filter:saturate(.8) drop-shadow(0 6px 14px rgba(26,26,26,.14))}

/* 主页面多选子组拖动：和多选分组一样叠成一摞——第一选在上，其余依次往下错开露出底边；橙色数量放在子组名左上角 */
.subgroup-label.selected{box-shadow:0 0 0 1.5px var(--blue);color:var(--ink)}
.drag-ghost.sstack{background:transparent!important;border:0!important;box-shadow:none!important;padding:0!important;opacity:1!important;overflow:visible}
.sstack-row{position:absolute!important;left:0;top:0;margin:0!important;pointer-events:none;filter:drop-shadow(0 6px 12px rgba(26,26,26,.12))}
.sstack-row.is-under{transform:translateY(var(--drop));filter:saturate(.8) drop-shadow(0 6px 12px rgba(26,26,26,.12));animation:gstack-drop .22s cubic-bezier(.3,.7,.2,1) both}
.drag-ghost.sstack>.stack-count{left:-9px;top:-27px;z-index:40}
/* 收起分组里拖出来的拖影：套一层 collapsed 外壳只借收起样式，外壳本身不画分组框 */
.drag-ghost.ghost-shell{border:0!important;padding:0!important;background:transparent!important;box-shadow:none!important}
.ghost-shell>.project-card,.ghost-shell>.subgroup{margin:0!important;width:100%;height:100%;box-sizing:border-box;box-shadow:0 6px 16px rgba(26,26,26,.16)}
.ghost-shell>.subgroup{box-shadow:none;filter:drop-shadow(0 6px 12px rgba(26,26,26,.14))}
.sstack-row.project-group{border:0!important;padding:0!important}
.sstack-row>.subgroup{margin:0!important;width:100%;height:100%}

/* 文件夹层级书签：贴在主页面右边框上，外层在上、当前层在下（橙色）；名字竖排，太长向下渐消 */
body.has-marks #main .main-content>*:not(.pagination){padding-right:30px}
body.has-marks #main .main-content>.page-heading{padding-right:0;margin-right:30px}
#main .main-content>.page-heading{margin-right:6px}
.main-sheet.notched{border-color:transparent;box-shadow:none}
.sheet-shade{position:fixed;z-index:0;overflow:visible;pointer-events:none}
.sheet-shade path{fill:var(--paper);filter:drop-shadow(0 2px 3px #1a1a1a06) drop-shadow(0 5px 12px #1a1a1a08)}
.sheet-shade[hidden]{display:none}
.sheet-frame{position:fixed;z-index:17;overflow:visible;pointer-events:none}
.sheet-frame path{fill:none;stroke:#1a1a1a21;stroke-width:var(--sw,1px)}
.sheet-frame[hidden]{display:none}
.folder-marks{position:fixed;right:14px;top:74px;width:30px;z-index:19;display:flex;flex-direction:column;align-items:flex-start;overflow-y:auto;overflow-x:visible;scrollbar-width:none;overscroll-behavior:contain;pointer-events:auto}
.folder-marks::-webkit-scrollbar{display:none}
.folder-marks.scrollable{-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 26px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 26px),transparent)}
.folder-mark{position:relative;flex:0 0 auto;min-height:36px;max-height:132px;width:30px;padding:16px 0 8px;margin-top:-7px;border:0;background:transparent;cursor:pointer;color:var(--secondary);pointer-events:auto;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;transition:color .15s,transform .15s}
.folder-mark:first-child{margin-top:0}
.folder-mark:hover{color:var(--ink)}
.folder-mark .mark-frame{filter:drop-shadow(0 1.5px 1.5px #1a1a1a14)}
.mark-frame{position:absolute;left:0;top:0;overflow:visible;pointer-events:none}
.mark-frame path{fill:var(--paper);stroke:var(--line);stroke-width:var(--sw,1px);transition:fill .15s,stroke .15s}
.folder-mark:hover .mark-frame path{stroke:var(--ink)}
.folder-mark.active{color:#fff}
.folder-mark.active .mark-frame path{fill:var(--orange);stroke:var(--orange)}
.folder-mark.drop-into .mark-frame path{stroke:var(--blue);stroke-width:calc(var(--sw,1px) * 2)}
.mark-name{position:relative;z-index:1;writing-mode:vertical-rl;text-orientation:mixed;font:10.5px var(--mono);letter-spacing:.06em;white-space:nowrap;overflow:hidden;max-height:100%}
.mark-name.faded{-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 14px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 14px),transparent)}
/* 书签只有 30px 宽，窗口很窄（< 720px）时才整条收起 */
@media (max-width:720px){.folder-marks{display:none}body.has-marks #main .main-content>*:not(.pagination){padding-right:0}body.has-marks #main .main-content>.page-heading{margin-right:0}}

/* 项目名超出统一卡片宽度时：右侧渐消（不用省略号） */
.project-card .card-title h3.overflowing{text-overflow:clip;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 20px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 20px),transparent)}

/* 书签上的项目数量；空文件夹的下一步按钮 */




/* 拖到底部页码上：高亮那个页码，松手就挪到那一页 */
.page-btn.drop-into{border-color:var(--blue);color:var(--blue);box-shadow:0 0 0 1.5px var(--blue)}
/* 参考 · phase 3：参考视图用青色（--ref），和挑选时的橙色、选中的蓝色都分开 */
:root{--ref:#2E8573}body.dark{--ref:#5BB39D}
.ref-frame.view{border-color:var(--ref)}.ref-badge.view{background:var(--ref)}
.rail-button.ref-on.view,.rail-button.ref-on.view svg{color:var(--ref)}
.ptab.ref{background:color-mix(in srgb,var(--ref) 12%,var(--soft));color:var(--ref);border-color:color-mix(in srgb,var(--ref) 45%,transparent)}
.ptab.ref.first{margin-top:6px}.ptab.ref:first-child{margin-top:0}
.ptab.ref:hover{background:color-mix(in srgb,var(--ref) 20%,var(--paper));color:var(--ref)}
.ptab.ref.active{background:var(--ref);border-color:var(--ref);color:#fff}
.graph-node.ref-lit{box-shadow:0 0 0 1.5px color-mix(in srgb,var(--ref) 70%,transparent)!important;border-color:var(--ref)}
.graph-node.ref-lit.ref-current{box-shadow:0 0 0 2.5px var(--ref)!important}
.graph-group.ref-lit{border-color:var(--ref);border-style:solid}.graph-group.ref-lit>button{background:var(--ref);color:#fff}
.node-block.ref-lit{outline:1.5px solid color-mix(in srgb,var(--ref) 60%,transparent);outline-offset:4px;border-radius:4px}
.node-block.ref-lit.ref-current{outline:2px solid var(--ref)}
tr.ref-lit td{background:color-mix(in srgb,var(--ref) 7%,transparent)}tr.ref-lit.ref-current td{background:color-mix(in srgb,var(--ref) 13%,transparent)}
tr.ref-lit td:first-child{box-shadow:inset 2.5px 0 var(--ref)}
.node-block.ref-flash{animation:ref-block-flash .9s cubic-bezier(.2,.7,.2,1)}
@keyframes ref-block-flash{0%,30%{outline-offset:10px;outline-color:var(--ref)}100%{outline-offset:4px}}
tr.ref-flash td{animation:ref-row-flash .9s ease-out}
@keyframes ref-row-flash{0%,30%{background:color-mix(in srgb,var(--ref) 32%,transparent)}100%{background:color-mix(in srgb,var(--ref) 13%,transparent)}}
body.reduce-motion .ref-flash,body.reduce-motion .ref-flash td{animation:none}
.ref-view-head{padding-bottom:4px}.ref-view-head h3{font-size:14px;line-height:1.45;margin:10px 0 6px}.ref-view-head>p.mono{font-size:9px;color:var(--faint);line-height:1.7}
.ref-view-tag{display:inline-block;background:var(--ref);color:#fff;font:9px var(--mono);letter-spacing:.08em;padding:3px 8px;border-radius:4px}
.ref-jump{width:100%;text-align:left;background:none;border:0;border-bottom:.5px solid var(--line);color:var(--secondary);font:inherit;font-size:12px;cursor:pointer;transition:box-shadow .15s,padding .15s,color .15s}
.ref-jump:hover{color:var(--ink)}.ref-jump.current{color:var(--ink);box-shadow:inset 2.5px 0 var(--ref);padding-left:10px}
.ref-jump.gone{cursor:default}
.ref-stepper,.ref-float-step{display:flex;align-items:center;gap:4px}.ref-stepper .mono,.ref-float-step .mono{font-size:10px;color:var(--secondary);min-width:38px;text-align:center}
.ref-float-step{background:var(--paper);border:.75px solid var(--line);border-radius:8px;padding:2px 4px;box-shadow:var(--shadow)}
/* 参考页底部固定的「我最近的参考卡」 */
.panel-footer:has(.ref-recent){padding-top:10px;padding-bottom:6px}
.ref-recent-head{margin-bottom:2px}.ref-recent-head .mono{font-size:9px;letter-spacing:.06em}
.ref-recent .ref-card-row:last-child{border-bottom:0}
/* 参考 · phase 4：引用原话 */
mark.ref-quote-mark{background:color-mix(in srgb,var(--ref) 20%,transparent);color:inherit;border-radius:2px;box-shadow:0 1.5px 0 color-mix(in srgb,var(--ref) 70%,transparent)}
mark.ref-quote-mark.ref-current{background:color-mix(in srgb,var(--ref) 34%,transparent);box-shadow:0 1.5px 0 var(--ref)}
mark.ref-quote-mark.picked{background:color-mix(in srgb,var(--orange) 18%,transparent);box-shadow:0 1.5px 0 var(--orange)}
mark.ref-quote-mark.ref-flash{animation:ref-mark-flash .9s ease-out}
@keyframes ref-mark-flash{0%,35%{background:color-mix(in srgb,var(--ref) 62%,transparent)}}
body.reduce-motion mark.ref-quote-mark.ref-flash{animation:none}
.node-block.ref-lit.ref-quote-host{outline-style:dashed;outline-width:1px}
.ref-changed{color:#B0742A}body.dark .ref-changed{color:#D9A45E}
.ref-changed-tag{display:inline-block;font:9px var(--mono);letter-spacing:.04em;color:#fff;background:#B0742A;padding:2px 8px;border-radius:3px;margin-bottom:8px}
.ref-quote-snap{margin:0;padding:7px 10px 7px 12px;border-bottom:.5px solid var(--line);border-left:2px solid color-mix(in srgb,var(--ref) 60%,transparent);background:var(--inset);font-size:11.5px;line-height:1.65;color:var(--secondary);white-space:pre-wrap;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.ref-jump.current+.ref-quote-snap{-webkit-line-clamp:40;border-left-color:var(--ref);color:var(--ink)}
.ref-item.gone+.ref-quote-snap{opacity:.6}
.ref-quote-pop{position:fixed;z-index:130;transform:translate(-50%,-100%);white-space:nowrap;box-shadow:0 4px 14px #1a1a1a26}
.ref-quote-pop.hint{background:var(--ink);color:var(--paper);font-size:11px;padding:5px 10px;border-radius:5px;pointer-events:none}
/* 日历（右栏工具 + 完整日历弹窗） */
.panel-tools{display:flex;align-items:center;gap:4px}
.cal-head{display:flex;align-items:baseline;gap:9px;min-width:0}.cal-head-date{font:500 13px var(--sans);color:var(--ink);letter-spacing:0}.cal-head-wd{font:12px var(--sans);color:var(--secondary);letter-spacing:0}
.cal-bar{flex-shrink:0;height:34px;background:var(--ink);color:var(--paper);display:flex;align-items:center;gap:2px;padding:0 8px;font:10px var(--mono);letter-spacing:.04em}
.cal-bar-label{flex:1;text-align:center;white-space:nowrap;overflow:hidden}
.cal-bar-btn{border:0;background:none;color:inherit;opacity:.72;height:24px;min-width:24px;padding:0 4px;border-radius:4px;display:grid;place-items:center;cursor:pointer;font:inherit}.cal-bar-btn:hover{opacity:1;background:color-mix(in srgb,var(--paper) 14%,transparent)}.cal-bar-btn.text{padding:0 7px}
.cal-day{position:relative;display:grid;grid-template-columns:38px minmax(0,1fr);gap:10px;padding:10px 28px 10px 0;border-bottom:.5px solid var(--line);min-height:56px}
.cal-day:last-child{border-bottom:0}
.cal-day-head{display:flex;flex-direction:column;align-items:flex-start;gap:2px}
.cal-wd{font:9px var(--mono);color:var(--muted);letter-spacing:.06em}.cal-dn{font-size:19px;line-height:1.05;color:var(--ink);font-variant-numeric:tabular-nums}
.cal-day.past .cal-dn{color:var(--faint)}
.cal-day.today .cal-dn,.cal-day.today .cal-wd{color:var(--orange)}
.cal-day.today::before{content:'';position:absolute;left:-9px;top:12px;height:30px;width:2.5px;border-radius:2px;background:var(--orange)}
.cal-day-list{display:flex;flex-direction:column;gap:2px;min-width:0;padding-top:1px}
.cal-empty{font-size:11px;color:var(--faint);padding-top:4px}
.cal-add{position:absolute;right:0;top:10px;width:20px;height:20px;padding:0;border:.5px solid var(--line);border-radius:5px;background:var(--paper);color:var(--muted);display:grid;place-items:center;cursor:pointer;transition:color .15s,border-color .15s,opacity .15s}
.cal-add:hover{color:var(--ink);border-color:var(--faint)}
.cal-ev{--k:var(--muted);display:flex;align-items:center;gap:6px;width:100%;min-width:0;border:0;background:none;padding:2px 4px 2px 2px;border-radius:4px;font:inherit;font-size:11.5px;line-height:1.45;color:var(--secondary);text-align:left;cursor:pointer}
.cal-ev:hover{background:var(--inset);color:var(--ink)}
.cal-dot{flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--k)}
.cal-ev-text{flex:1;min-width:0;white-space:nowrap;overflow:hidden;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 16px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 16px),transparent)}
.cal-time{flex:0 0 auto;font-size:9.5px;color:var(--muted);font-variant-numeric:tabular-nums}
.k-node{--k:var(--ink)}.k-edit{--k:var(--blue)}.k-discussion{--k:#7B6A9C}.k-file{--k:#5E7F4F}.k-run{--k:#4F8A5B}.k-run.s-failed{--k:var(--red)}.k-run.s-partial{--k:#B0742A}.k-template{--k:#8A6D3B}.k-publish{--k:var(--orange)}.k-fork{--k:#3F7F93}.k-reminder{--k:var(--orange)}
body.dark .k-discussion{--k:#A898C8}body.dark .k-file{--k:#8DB07C}body.dark .k-run{--k:#7DBB89}body.dark .k-template{--k:#C19C62}body.dark .k-fork{--k:#6FB1C6}
.cal-ev.k-reminder .cal-dot,.cal-legend .k-reminder .cal-dot{background:none;box-shadow:inset 0 0 0 1.5px var(--k)}
.cal-ev.k-reminder.mine{background:color-mix(in srgb,var(--orange) 10%,transparent);color:var(--ink)}.cal-ev.k-reminder.mine .cal-dot{background:var(--k)}
.cal-ev .mention{padding:0 1px}
.cal-more{border:0;background:none;padding:2px 2px;font-size:10.5px;color:var(--blue);text-align:left;cursor:pointer}
.cal-count{font-size:9.5px}
/* 完整日历 */
.modal.cal-modal{max-height:calc(100dvh - 48px)}.modal.cal-modal>footer{min-height:52px;padding:10px 23px}.modal.cal-modal>footer small{margin-right:0;white-space:nowrap}
.cal-full{flex:1;min-height:0;display:flex;flex-direction:column;padding:14px 23px 14px}
.cal-toolbar{display:flex;align-items:center;gap:14px;padding-bottom:12px;flex-wrap:wrap}
.cal-nav{display:flex;align-items:center;gap:4px}.cal-nav .btn:not(.icon-btn){min-height:28px;height:28px;padding:0 12px;font-size:11px}
.cal-range{flex:1;min-width:140px;font-size:16px;font-weight:500;white-space:nowrap}
.cal-full-body{flex:1;min-height:0;display:flex;flex-direction:column}
.cal-legend{display:flex;flex-wrap:wrap;gap:4px 12px;margin-right:auto;font-size:10.5px;color:var(--secondary)}.cal-legend span{display:inline-flex;align-items:center;gap:5px}
.cal-month,.cal-timeline{flex:1;min-height:0;display:flex;flex-direction:column;border:.5px solid var(--line);border-radius:6px;overflow:hidden}
.cal-month-head{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));background:var(--soft);border-bottom:.5px solid var(--line)}.cal-month-head span{padding:7px 10px;font:9.5px var(--mono);color:var(--muted);letter-spacing:.06em}
.cal-month-grid{flex:1;min-height:0;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-template-rows:repeat(6,minmax(0,1fr))}
.cal-cell{min-width:0;min-height:0;overflow:hidden;border-right:.5px solid var(--line);border-bottom:.5px solid var(--line);padding:4px 5px;display:flex;flex-direction:column;gap:1px}
.cal-cell:nth-child(7n){border-right:0}.cal-cell:nth-last-child(-n+7){border-bottom:0}
.cal-cell.out{background:color-mix(in srgb,var(--soft) 70%,transparent)}.cal-cell.out .cal-cell-dn{color:var(--faint)}
.cal-cell-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:1px;min-height:20px}
.cal-cell-dn{border:0;background:none;padding:1px 6px;border-radius:10px;font:inherit;font-size:12px;color:var(--ink);cursor:pointer;font-variant-numeric:tabular-nums}.cal-cell-dn:hover{background:var(--inset)}
.cal-cell.today .cal-cell-dn{background:var(--orange);color:#fff}
.cal-cell .cal-add,.cal-allday-col .cal-add{position:static;width:18px;height:18px;opacity:0}
.cal-cell:hover .cal-add,.cal-allday-col:hover .cal-add,.cal-add:focus-visible{opacity:1}
.cal-cell .cal-ev,.cal-allday .cal-ev{font-size:10.5px;padding:1px 3px 1px 2px;gap:5px}
.cal-week-head,.cal-allday{display:grid;border-bottom:.5px solid var(--line);flex-shrink:0}
.cal-week-head{background:var(--soft)}
.cal-col-head{border:0;border-left:.5px solid var(--line);background:none;padding:6px 8px;display:flex;align-items:baseline;gap:6px;cursor:pointer;color:var(--secondary);font:inherit;min-width:0}
.cal-col-head span{font:9.5px var(--mono);letter-spacing:.04em}.cal-col-head strong{font-size:15px;font-weight:500;color:var(--ink)}.cal-col-head:hover{background:var(--inset)}.cal-col-head.today strong,.cal-col-head.today span{color:var(--orange)}
.cal-allday>.mono{font-size:9px;color:var(--muted);padding:6px 8px;align-self:start}
.cal-allday-col{border-left:.5px solid var(--line);padding:3px 4px;display:flex;flex-direction:column;gap:1px;min-width:0;max-height:96px;overflow:hidden}
.cal-grid-frame{position:relative;flex:1;min-height:0;display:flex}.cal-grid-frame>.cx-track.y{right:3px;top:6px;bottom:6px}
.cal-grid{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}
.cal-grid-inner{display:grid;position:relative}
.cal-hours{position:relative}.cal-hours span{position:absolute;right:8px;transform:translateY(-50%);font:9px var(--mono);color:var(--faint)}
.cal-col{position:relative;min-width:0;border-left:.5px solid var(--line);background-image:repeating-linear-gradient(to bottom,color-mix(in srgb,var(--line) 65%,transparent) 0 1px,transparent 1px 44px)}
.cal-col.today{background-color:color-mix(in srgb,var(--orange) 3%,transparent)}
.cal-block{position:absolute;height:29px;z-index:1;min-width:0}
.cal-ev.block{height:100%;flex-direction:column;align-items:stretch;gap:1px;padding:2px 5px;border-radius:3px;border-left:2.5px solid var(--k);background:color-mix(in srgb,var(--k) 11%,var(--paper));overflow:hidden}
.cal-ev.block:hover{background:color-mix(in srgb,var(--k) 20%,var(--paper))}
.cal-ev.block .cal-dot{display:none}.cal-ev.block .cal-time{line-height:1.1;font-size:9px}.cal-ev.block .cal-ev-text{flex:none;line-height:1.25;font-size:10.5px}
.cal-ev.block.k-reminder{border-left-style:dashed}.cal-ev.block.k-reminder.mine{border-left-style:solid;background:color-mix(in srgb,var(--orange) 16%,var(--paper))}
.cal-now{position:absolute;left:0;right:0;height:0;border-top:1.5px solid var(--orange);z-index:2;pointer-events:none}.cal-now::before{content:'';position:absolute;left:-4px;top:-4.5px;width:7px;height:7px;border-radius:50%;background:var(--orange)}
.view-day .cal-block{height:34px}
/* 提醒弹窗 */
.cal-rem-when{display:grid;grid-template-columns:1fr 1fr;gap:12px}.cal-rem-meta{font-size:9.5px;color:var(--muted);margin-top:8px;line-height:1.7}.cal-rem-hint{font-size:11px;margin-top:8px;line-height:1.6}
.cal-reminder-modal textarea{width:100%;resize:vertical}
/* 从日历跳过去时目标闪一下 */
tr.cal-flash td{animation:cal-row-flash 1.2s ease-out}@keyframes cal-row-flash{0%,35%{background:color-mix(in srgb,var(--orange) 18%,transparent)}}
.node-block.cal-flash{animation:cal-block-flash 1.2s ease-out}@keyframes cal-block-flash{0%,35%{box-shadow:0 0 0 2px var(--orange)}}
body.reduce-motion .cal-flash,body.reduce-motion .cal-flash td{animation:none}
@media(max-width:760px){.cal-toolbar{gap:8px}.cal-range{font-size:14px}.cal-legend{display:none}.cal-full{padding:10px 12px}}
/* 日历 · 手机宽度：月视图每格只放日期和彩色点（点仍可点开），星期只写一个字；触屏没有悬停，+ 常显 */
.cal-long{font-style:normal}
@media(max-width:700px){
.cal-long{display:none}
.modal.cal-modal>footer small{white-space:normal;font-size:9px;text-align:right}
.cal-month-head span{padding:6px 0;text-align:center}
.cal-cell{flex-direction:row;flex-wrap:wrap;align-content:flex-start;gap:2px;padding:3px 2px}
.cal-cell-head{width:100%;justify-content:center}.cal-cell-dn{padding:1px 4px;font-size:11px}
.cal-cell .cal-add{display:none}
.cal-cell .cal-ev{width:auto;padding:3px;gap:0}.cal-cell .cal-time,.cal-cell .cal-ev-text{display:none}
.cal-cell .cal-more{width:100%;font-size:9px;text-align:center;padding:0}
.cal-col-head{flex-direction:column;align-items:center;gap:0;padding:4px 0}.cal-col-head strong{font-size:13px}
.cal-week-head,.cal-allday,.cal-grid-inner{grid-template-columns:36px repeat(var(--cal-cols,7),minmax(0,1fr))!important}
.view-day .cal-week-head,.view-day .cal-allday,.view-day .cal-grid-inner{--cal-cols:1}
.cal-hours span{right:4px;font-size:8px}
}
@media(hover:none){.cal-allday-col .cal-add,.cal-cell .cal-add{opacity:1}}
/* 账户日历（左栏）+ 两个日历共用的新功能：设置弹窗、搜索、周数、工作时间、过去变淡 */
.side-cal{position:fixed;left:264px;top:14px;bottom:14px;width:334px;display:flex;flex-direction:column;z-index:16;overflow:hidden;background:var(--paper);box-shadow:8px 0 35px #1a1a1a1f}
.cal-head-scope{font-size:9px;letter-spacing:.06em;color:var(--muted);border:.5px solid var(--line);border-radius:3px;padding:1px 5px;align-self:center}
.cal-proj{flex:0 1 auto;max-width:74px;font:9px var(--mono);color:var(--muted);background:var(--inset);border-radius:3px;padding:0 4px;white-space:nowrap;overflow:hidden;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 8px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 8px),transparent)}
.cal-ev.block .cal-proj{max-width:100%;align-self:flex-start}
.dim-past .cal-ev.past:not(.hit):not(.hit-focus){opacity:.55}
.cal-month-head,.cal-month-grid{grid-template-columns:repeat(var(--cols,7),minmax(0,1fr))}
.cal-month-grid[style*="--cols:5"] .cal-cell:nth-child(7n){border-right:.5px solid var(--line)}.cal-month-grid[style*="--cols:5"] .cal-cell:nth-child(5n){border-right:0}
.cal-month-grid[style*="--cols:5"] .cal-cell:nth-last-child(-n+7){border-bottom:.5px solid var(--line)}.cal-month-grid[style*="--cols:5"] .cal-cell:nth-last-child(-n+5){border-bottom:0}
.cal-wk{font-size:8.5px;color:var(--faint);margin-right:auto;padding-left:1px}
.cal-week-no{font-size:9px;color:var(--faint);padding:8px 6px;align-self:center}
.cal-off{position:absolute;left:0;right:0;background:color-mix(in srgb,var(--inset) 55%,transparent);pointer-events:none}
/* 搜索 */
.cal-search{display:flex;align-items:center;gap:6px;height:30px;padding:0 6px 0 9px;border:.5px solid var(--line);border-radius:6px;background:var(--paper);color:var(--muted);min-width:160px;max-width:300px;cursor:text}
.cal-search:focus-within{border-color:var(--faint);color:var(--ink)}
.cal-search input{flex:1;min-width:0;border:0;background:none;outline:0;font:inherit;font-size:12px;color:var(--ink);padding:0}
.cal-search input::-webkit-search-cancel-button{display:none}
.cal-hits{font-size:9.5px;color:var(--blue);white-space:nowrap}
.cal-hit-btn{border:0;background:none;width:20px;height:20px;border-radius:4px;display:grid;place-items:center;color:var(--secondary);cursor:pointer;padding:0}.cal-hit-btn:hover{background:var(--inset);color:var(--ink)}
.cal-full.searching .cal-ev.dim{opacity:.3}
.cal-ev.hit{box-shadow:inset 0 0 0 1.5px var(--blue);color:var(--ink);background:color-mix(in srgb,var(--blue) 8%,var(--paper))}
.cal-ev.block.hit{box-shadow:inset 0 0 0 1.5px var(--blue),inset 2.5px 0 var(--k)}
.cal-ev.hit-focus{box-shadow:inset 0 0 0 2px var(--blue);animation:cal-hit-pulse .9s cubic-bezier(.2,.7,.2,1)}
@keyframes cal-hit-pulse{0%{transform:scale(1)}35%{transform:scale(1.06)}100%{transform:scale(1)}}
body.reduce-motion .cal-ev.hit-focus{animation:none}
.cal-cell.has-hit .cal-cell-dn{box-shadow:inset 0 0 0 1.5px var(--blue)}.cal-cell.today.has-hit .cal-cell-dn{box-shadow:0 0 0 1.5px var(--blue)}
/* 设置弹窗 */
.cal-settings-body{overflow-y:auto}
.cal-set-chips{display:flex;flex-wrap:wrap;gap:6px}
.cal-chip{--k:var(--muted);border:.5px solid var(--line);border-radius:14px;padding:4px 10px 4px 8px;background:var(--paper);display:inline-flex;align-items:center;gap:6px;font:inherit;font-size:11.5px;color:var(--faint);cursor:pointer}
.cal-chip.on{color:var(--ink);border-color:var(--faint)}.cal-chip:not(.on) .cal-dot{background:none;box-shadow:inset 0 0 0 1px var(--faint)}
.cal-set-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:.5px solid var(--line);font-size:12.5px}
.cal-set-row:last-child{border-bottom:0}.cal-set-row small{display:block;color:var(--muted);font-size:10.5px;margin-top:2px}
.cal-set-row .segment button{padding:5px 12px}
@media(max-width:700px){.cal-search{min-width:0;flex:1 1 100%;max-width:none;order:5}.side-cal{left:60px!important;right:12px;width:auto}}
/* 工具栏一行放下：标题可收缩（放不下右侧渐消），搜索框随宽度伸缩 */
@media(min-width:701px){
.cal-toolbar{flex-wrap:nowrap;gap:10px}
.cal-range{flex:1 1 auto;min-width:60px;overflow:hidden;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 14px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 14px),transparent)}
.cal-search{flex:0 1 240px;min-width:110px}
}
.cal-more-block{width:100%;height:100%;border:.5px dashed var(--faint);border-radius:3px;background:var(--paper);color:var(--secondary);font:10px var(--mono);cursor:pointer;padding:0}
.cal-more-block:hover{color:var(--ink);border-color:var(--secondary)}
/* 时间块里：第一行 时间 + 项目名，第二行 内容 */
.cal-ev.block{flex-direction:row;flex-wrap:wrap;align-content:flex-start;align-items:center;column-gap:5px;row-gap:1px}
.cal-ev.block .cal-ev-text{flex:1 0 100%}
.cal-ev.block .cal-proj{flex:0 1 auto;min-width:0;max-width:none;background:none;padding:0;line-height:1.1;font-size:8.5px}
/* 节点页：内容块工具（悬停出现）、拖动排序、照片、标签删除、编辑历史 / 版本 */
/* 工具组本身一直在:讨论按钮要一直看得见(未读气泡是 §9.4 的前提),
   移动 / 编辑 / 更多 这三个才是悬浮才出现的。藏住的是动作,不是入口。 */
.block-tools{position:absolute;right:36px;top:0;height:26px;display:flex;align-items:center;gap:1px;padding-left:10px;background:none;transition:background .15s;z-index:2}
.block-tools>.block-tool{opacity:0;pointer-events:none;transition:opacity .15s}
.node-block:hover>.block-tools,.node-block:focus-within>.block-tools,.node-block.block-slot>.block-tools{background:linear-gradient(to right,transparent,var(--paper) 10px)}
.node-block:hover>.block-tools>.block-tool,.node-block:focus-within>.block-tools>.block-tool,.node-block.block-slot>.block-tools>.block-tool{opacity:1;pointer-events:auto}
.block-tool{border:0;background:none;width:24px;height:24px;border-radius:5px;display:grid;place-items:center;color:var(--muted);cursor:pointer;padding:0}
.block-tool:hover{background:var(--inset);color:var(--ink)}.block-grip{cursor:grab;touch-action:none}
body.dragging-block,body.dragging-block *{cursor:grabbing!important;user-select:none}
.node-block.block-slot{outline:1px dashed var(--faint);outline-offset:6px;border-radius:4px}.node-block.block-slot>*{visibility:hidden}
.block-ghost{position:fixed;z-index:300;margin:0!important;pointer-events:none;background:var(--paper);border-radius:6px;padding:8px 50px 8px 12px;box-shadow:0 12px 32px #1a1a1a2e;opacity:.97}
.block-ghost>.block-tools>.block-tool{opacity:1;pointer-events:auto}
@media(hover:none){.block-tools>.block-tool{opacity:1;pointer-events:auto}}
.photo-set{display:flex;flex-wrap:wrap;gap:12px;margin-top:12px}
.photo-tile{position:relative;margin:0;width:245px;height:142px;border:.5px solid var(--line);border-radius:3px;overflow:hidden;background:var(--inset)}
.photo-tile img{width:100%;height:100%;object-fit:cover;display:block}
.photo-remove{position:absolute;top:6px;right:6px;width:20px;height:20px;border:0;border-radius:50%;background:#1a1a1ab3;color:#fff;display:grid;place-items:center;padding:0;cursor:pointer;opacity:0;transition:opacity .15s}
.photo-tile:hover .photo-remove,.photo-remove:focus-visible{opacity:1}@media(hover:none){.photo-remove{opacity:1}}
.photo-import{width:245px;height:142px;border:1px dashed var(--faint);border-radius:3px;background:var(--soft);color:var(--muted);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;font:inherit;font-size:12px;cursor:pointer;transition:color .15s,border-color .15s}
.photo-import:hover{color:var(--ink);border-color:var(--ink)}
.photo-tile~.photo-import{width:120px}
.photo-empty{font-size:11px;color:var(--faint)}
.tag-chip{display:inline-flex;align-items:center;gap:3px}
.tag-remove{display:none;border:0;background:none;padding:0;width:12px;height:12px;place-items:center;color:var(--muted);cursor:pointer}
.tag-chip:hover .tag-remove,.tag-remove:focus-visible{display:grid}.tag-remove:hover{color:var(--ink)}@media(hover:none){.tag-remove{display:grid}}
.node-history-link{display:inline-flex;align-items:center;gap:6px}
.version-banner{margin:14px 22px 0;padding:8px 12px;border:.5px solid var(--line);border-left:2.5px solid var(--blue);border-radius:4px;background:var(--soft);display:flex;align-items:center;gap:14px;font-size:12px;color:var(--secondary)}
.version-banner b{color:var(--ink);font-weight:500}.version-banner small{margin-left:10px;font:9px var(--mono);color:var(--faint)}.version-banner .btn:not(.link){min-height:26px;height:26px;padding:0 10px;font-size:11px}
.cx-history .ver-row{display:flex;align-items:center;gap:10px;padding:8px 6px;border-bottom:.5px solid var(--line);font-size:12.5px;color:var(--secondary)}
.cx-history .ver-row.current{background:var(--soft)}.cx-history .ver-row small{display:block;font-size:11px;color:var(--muted);margin-top:2px}.cx-history .ver-row b{color:var(--ink);font-weight:500}
.ver-v{min-width:38px;color:var(--ink);font-size:11px}
.ver-mile{border:0;background:none;padding:0 2px;color:var(--line);cursor:pointer;font-size:11px}.ver-mile.on{color:var(--orange)}.ver-mile:disabled{cursor:default}
.hist-list{margin-top:4px}.hist-row{display:grid;grid-template-columns:8px minmax(0,1fr) auto;align-items:baseline;gap:10px;padding:8px 2px;border-bottom:.5px solid var(--line);font-size:12.5px;color:var(--secondary)}
.hist-row b{color:var(--ink);font-weight:500}.hist-row time{font-size:9.5px;color:var(--faint);white-space:nowrap}.hist-row.new{background:color-mix(in srgb,var(--orange) 6%,transparent)}
.hist-dot{width:5px;height:5px;border-radius:50%;background:var(--line);align-self:center}.hist-row .orange-dot{align-self:center}
.version-choice{display:grid;gap:8px;margin-bottom:12px}.version-milestone{display:flex;align-items:baseline;gap:8px;font-size:12.5px;margin-top:10px;flex-wrap:wrap}.version-milestone small{flex-basis:100%;padding-left:22px;font-size:10.5px;color:var(--muted)}
/* 节点页上下游条：上游 → 本节点 → 下游 */
.node-flow{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:start;gap:14px;padding:12px 0 14px;border-bottom:.5px solid var(--line)}
.flow-side{min-width:0;display:flex;flex-direction:column;gap:6px}.flow-down{align-items:flex-end;text-align:right}
.flow-label{font-size:9px;letter-spacing:.06em;color:var(--muted)}
.flow-list{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.flow-down .flow-list{justify-content:flex-end}
.flow-chip{position:relative;display:inline-flex;align-items:center;gap:7px;max-width:240px;min-width:0;height:28px;padding:0 9px 0 8px;border:.5px solid var(--line);border-radius:6px;background:var(--paper);color:var(--ink);font:inherit;font-size:12px;cursor:default;box-shadow:2px 2px 0 -.5px var(--line)}
.flow-chip:hover{border-color:var(--faint)}.flow-chip.selected{box-shadow:0 0 0 1.5px var(--blue);border-color:var(--blue)}
.flow-chip .orange-dot{position:absolute;top:-2px;right:-2px;width:6px;height:6px}
.flow-type{font-size:8.5px;color:var(--muted);letter-spacing:.04em}
.flow-name{min-width:0;max-width:170px;white-space:nowrap;overflow:hidden}.flow-name.long{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent)}
.flow-ver{font-size:9px;color:var(--faint)}
.flow-empty{font-size:11px;color:var(--faint);line-height:28px}
.flow-add{width:26px;height:26px;border:1px dashed var(--faint);border-radius:6px;background:none;color:var(--muted);display:grid;place-items:center;cursor:pointer;padding:0}.flow-add:hover{color:var(--ink);border-color:var(--ink)}
.flow-self{display:flex;align-items:center;gap:6px;padding-top:22px;color:var(--secondary)}.flow-self .mono{font-size:9px;letter-spacing:.06em;white-space:nowrap}
.flow-line{display:block;width:18px;height:0;border-top:1px solid var(--ink);position:relative}.flow-line:last-child::after{content:'';position:absolute;right:-1px;top:-4px;border:3.5px solid transparent;border-left:5px solid var(--ink);border-right:0}
@media(max-width:760px){.node-flow{grid-template-columns:1fr}.flow-self{display:none}.flow-down{align-items:flex-start;text-align:left}.flow-down .flow-list{justify-content:flex-start}}
/* 记录固定的节点版本 */
.pin-list{margin:4px 0 22px;border-top:.5px solid var(--line)}
.pin-row{display:grid;grid-template-columns:72px minmax(0,1fr) 52px minmax(0,auto) auto;align-items:center;gap:12px;padding:9px 0;border-bottom:.5px solid var(--line);font-size:12.5px}
.pin-type{font-size:9px;color:var(--muted);letter-spacing:.04em}.pin-name{min-width:0;white-space:nowrap;overflow:hidden;color:var(--ink)}
.pin-v{font-size:11px;color:var(--ink)}.pin-row.behind .pin-v{color:var(--secondary)}
.pin-state{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--secondary);white-space:nowrap}.pin-state .faint{color:var(--faint)}
.pin-row.gone .pin-name,.pin-row.gone .pin-v{color:var(--faint);text-decoration:line-through}
.pin-note{font-size:10.5px;color:var(--faint);margin:-14px 0 20px}
.ver-runs{display:block;margin-top:2px;font-size:11px;color:var(--muted)}.ver-runs .btn.link{font-size:11px;padding:0;min-height:0;height:auto}
@media(max-width:760px){.pin-row{grid-template-columns:56px minmax(0,1fr) 44px;row-gap:4px}.pin-state,.pin-row>.btn,.pin-row>.faint:last-child{grid-column:2/-1}}
/* 节点版本行：两行排布，窄栏也放得下（第一行 类型 · 名字 · 版本；第二行 状态 · 查看） */
.pin-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"type name v" ". state link";gap:3px 10px}
.pin-type{grid-area:type}.pin-name{grid-area:name;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent)}
.pin-v{grid-area:v;justify-self:end}.pin-state{grid-area:state;min-width:0;white-space:normal}.pin-row>.btn,.pin-row>.faint:last-child{grid-area:link;justify-self:end;font-size:11px}
@media(max-width:760px){.pin-row{grid-template-columns:auto minmax(0,1fr) auto}.pin-state,.pin-row>.btn,.pin-row>.faint:last-child{grid-column:auto}}
.pin-name{white-space:normal;-webkit-mask-image:none;mask-image:none;overflow:visible;word-break:break-word}.pin-state .orange-dot{display:inline-block;flex:0 0 auto}
/* LAB / TOOLING 规格 + 实验记录 context key 来源 */
.spec-list{margin-top:8px;border-top:.5px solid var(--line)}
.spec-row{display:grid;grid-template-columns:120px minmax(0,1fr) auto;align-items:baseline;gap:12px;padding:8px 0;border-bottom:.5px solid var(--line);font-size:13px}
.spec-label{font-size:12px;color:var(--secondary)}.spec-value{color:var(--ink);word-break:break-word}.spec-value.empty{color:var(--faint)}
.spec-ctx{font-size:9px;letter-spacing:.04em;color:var(--blue);white-space:nowrap}
.ctx-hints{list-style:none;margin:8px 0 4px;padding:0;display:flex;flex-wrap:wrap;gap:4px 16px;font-size:11px;color:var(--muted)}
.ctx-hints li{display:inline-flex;align-items:center;gap:6px}.ctx-hints li.ok::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--line)}.ctx-hints li.warn{color:var(--ink)}.ctx-hints .orange-dot{display:inline-block}.ctx-hints li.none{color:var(--faint)}
.ctx-src{display:flex;align-items:center;gap:5px;margin-top:4px;font-size:10px;color:var(--muted);line-height:1.4}.ctx-src.warn{color:var(--ink)}.ctx-src .orange-dot{display:inline-block;flex:0 0 auto}
@media(max-width:760px){.spec-row{grid-template-columns:90px minmax(0,1fr)}.spec-ctx{grid-column:2}}
/* OUTCOME 验收 + 实验记录的产出与照片 */
.oc-head .btn.link{font-size:11px;padding:0;min-height:0;height:auto;margin-left:10px}
.oc-empty{font-size:12px;color:var(--faint);margin:6px 0 14px}
.crit-list{border-top:.5px solid var(--line);margin:6px 0 18px}
.crit-row{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:.5px solid var(--line);font-size:13px}
.crit-label{color:var(--ink)}.crit-target{font-size:11px;color:var(--secondary);white-space:nowrap}
.oc-scroll{overflow-x:auto}.oc-table{margin-top:4px;font-size:12px}.oc-table th{white-space:nowrap}
.oc-val.ok{color:var(--ink)}.oc-val.bad{color:var(--red)}
.oc-run{font-size:9.5px;color:var(--muted)}
.oc-state{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:1px 7px;border-radius:10px;border:.5px solid var(--line);white-space:nowrap;color:var(--secondary)}
.oc-state.pass{border-color:#4F8A5B;color:#3F7A4B}.oc-state.fail{border-color:var(--red);color:var(--red)}.oc-state.pending{border-style:dashed}
body.dark .oc-state.pass{color:#7DBB89;border-color:#7DBB89}
.oc-actions{white-space:nowrap}.oc-actions .btn.link{font-size:11px;padding:0 0 0 10px;min-height:0;height:auto}
.oc-run-list{margin:4px 0 20px;border-top:.5px solid var(--line)}
.oc-run-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 0;border-bottom:.5px solid var(--line);font-size:12.5px}
.oc-run-row .btn.link{padding:0;min-height:0;height:auto;font-size:12.5px}.oc-count{font-size:11px}
.oc-run-list>.btn.link{margin-top:8px;font-size:11px;padding:0;min-height:0;height:auto}
.photo-set.small .photo-tile{width:120px;height:80px}.photo-set.small .photo-import{width:120px;height:80px;font-size:11px;gap:4px}
.crit-form{display:grid;gap:14px;margin-bottom:10px}.crit-edit{border:.5px solid var(--line);border-radius:6px;padding:10px 12px 4px;background:var(--soft)}
.crit-edit-row{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) auto;gap:10px;align-items:end}.crit-edit-row.small{grid-template-columns:repeat(3,minmax(0,1fr))}
.crit-edit-row>.icon-btn{margin-bottom:14px}
/* 表格块编辑器（像常用表格一样一格一格写 / 导入） */
.tg-editor{margin:2px 0 16px}
.tg-top{display:flex;align-items:center;gap:12px;margin-bottom:10px}.tg-size{font-size:10px;color:var(--muted);margin-left:auto}
.tg-bar{display:flex;align-items:center;gap:6px;margin-bottom:6px}
.tg-head{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--secondary);cursor:pointer}
.btn.tg-btn{min-height:26px;height:26px;padding:0 10px;font-size:11px}
.tg-wrap{position:relative;overflow:auto;max-height:min(46vh,380px);border:.5px solid var(--line);border-radius:6px;background:var(--paper)}
.tg{border-collapse:separate;border-spacing:0;font-size:12.5px;table-layout:auto;min-width:100%}
.tg th{position:sticky;top:0;z-index:2;background:var(--soft);font-weight:normal;padding:0;border-bottom:.5px solid var(--line);border-right:.5px solid var(--line)}
.tg tbody th{top:auto;left:0;z-index:1}.tg thead .tg-corner{left:0;z-index:3;min-width:46px}
.tg-colh,.tg-rowh{display:block;width:100%;border:0;background:none;font:10px var(--mono);letter-spacing:.04em;color:var(--muted);padding:5px 8px;cursor:pointer;white-space:nowrap}
.tg-rowh{min-width:46px;height:100%}.tg-colh:hover,.tg-rowh:hover{background:var(--inset);color:var(--ink)}
.tg td{padding:0;min-width:140px;vertical-align:top;border-bottom:.5px solid var(--line);border-right:.5px solid var(--line)}
.tg-cell{display:block;width:100%;min-width:140px;min-height:32px;max-height:160px;border:0;border-radius:0;background:transparent;padding:7px 9px;font:inherit;line-height:1.45;color:var(--ink);resize:none;field-sizing:content;outline:0;box-shadow:none}
.tg-cell:focus{box-shadow:inset 0 0 0 2px var(--blue);background:var(--paper);position:relative;z-index:1}
.tg-headrow td{background:var(--soft)}.tg-headrow .tg-cell{font-weight:500}.tg-headrow th .tg-rowh{color:var(--secondary)}
.tg-drop{border:1px dashed var(--faint);background:var(--soft);border-radius:7px;text-align:center;padding:26px 20px;cursor:pointer;color:var(--secondary)}
.tg-drop>svg{margin-bottom:8px}.tg-drop p{font-size:13px;color:var(--ink)}.tg-drop small{display:block;margin-top:6px;font-size:10.5px;color:var(--muted)}
.tg-drop:hover,.tg-drop.over{border-color:var(--blue);background:color-mix(in srgb,var(--blue) 6%,var(--soft))}
.tg-tip{font-size:10.5px;color:var(--faint);margin-top:6px;line-height:1.6}
.tg-note{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12px;padding:6px 10px;border-radius:5px;background:var(--soft);border:.5px solid var(--line);margin-bottom:8px;color:var(--secondary)}
.tg-note .btn.link{padding:0;min-height:0;height:auto;font-size:11.5px}
.tg-sheet{display:inline-flex;align-items:center;gap:6px}.tg-sheet small{font-size:11px;color:var(--muted)}.tg-sheet .cx-select{min-width:140px}
.grid-scroll{overflow-x:auto}
/* 节点页就地编辑内容块 */
.node-block.editing{outline:1.5px solid var(--blue);outline-offset:10px;border-radius:4px}
.node-block.editing>.block-tools>.block-tool{opacity:1;pointer-events:auto}
.ib-head{display:flex;align-items:center;gap:10px}
.ib-title{flex:1;min-width:0;border:0;border-bottom:1px dashed var(--line);background:transparent;font:inherit;font-size:15px;color:var(--ink);padding:4px 0;outline:0}
.ib-title:focus{border-bottom-color:var(--blue)}
.ib-text,.ib-input{width:100%;margin-top:10px;border:.5px solid var(--line);border-radius:5px;background:var(--paper);padding:8px 10px;font:inherit;font-size:13px;line-height:1.7;color:var(--ink);outline:0}
.ib-text{resize:vertical;field-sizing:content;min-height:44px}.ib-text:focus,.ib-input:focus{border-color:var(--blue);box-shadow:0 0 0 2px color-mix(in srgb,var(--blue) 15%,transparent)}
.ib-param{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);gap:8px}
.ib-run{margin-top:10px;max-width:420px}
.ib-files{margin-top:10px;display:grid;gap:8px}.ib-file{display:flex;align-items:center;gap:6px}.ib-file>.file-row{flex:1;min-width:0;margin:0}
.ib-drop{display:flex;align-items:center;justify-content:center;gap:8px;padding:16px;border:1px dashed var(--faint);border-radius:6px;background:var(--soft);font-size:12.5px;color:var(--secondary);cursor:pointer}
.ib-drop:hover,.ib-drop.over{border-color:var(--blue);background:color-mix(in srgb,var(--blue) 6%,var(--soft))}
.ib-foot{display:flex;align-items:center;justify-content:flex-end;gap:12px;margin-top:12px}
.ib-hint{font-size:10.5px;color:var(--faint);margin-right:auto}
.btn.ib-done{min-height:28px;height:28px;padding:0 14px;font-size:12px}
.node-block.editing .tg-editor{margin:12px 0 0}
.ib-empty{margin-top:10px;padding:18px;border:1px dashed var(--line);border-radius:6px;color:var(--faint);font-size:12px;text-align:center;cursor:default;user-select:none}
.ib-empty:not(.readonly):hover{border-color:var(--faint);color:var(--secondary)}
.add-type-row .menu-check{color:var(--secondary)}

/* ── LAB / TOOLING 规格表:点一行就地编辑 · 底部加行(§18.4 / §18.5)────────────── */
/* context key 用 §5.3 的蓝竖条。所有行都留同样的左缩进,有没有竖条都不推歪列对齐 */
.spec-row{border-left:2.5px solid transparent;padding-left:11px}
.spec-row.ctx-key{border-left-color:var(--blue)}
.spec-row.spec-clickable{margin-right:-8px;padding-right:8px;border-radius:0 4px 4px 0;cursor:text}
.spec-row.spec-clickable:hover{background:var(--inset)}
.spec-row.spec-clickable:focus-visible{outline:1.5px solid var(--blue);outline-offset:1px}
.spec-row.editing{gap:10px;align-items:center}
/* 刻线域:内凹底 + 0.75px 墨底线 = 这里可以写 */
.spec-input{min-width:0;width:100%;border:0;border-bottom:.75px solid var(--ink);border-radius:5px 5px 0 0;
  background:var(--inset);font:inherit;font-size:13px;color:var(--ink);padding:6px 8px;outline:0}
.spec-input::placeholder{color:var(--faint)}
.spec-input:focus{border-bottom:2px solid var(--blue);padding-bottom:5px}
.spec-in-label{font-size:12px}
.spec-ctx-note{font-size:11px;color:var(--secondary);white-space:nowrap}
.spec-edit-tools{display:flex;align-items:center;gap:8px;white-space:nowrap}
.spec-edit-tools .select-control{min-width:150px}
.btn.spec-done{min-height:26px;height:26px;padding:0 12px;font-size:11px}
.spec-add{margin:10px 0 0 13px;display:inline-flex;align-items:center;gap:8px;padding:8px 12px;
  border:1px dashed var(--faint);border-radius:7px;background:transparent;color:var(--muted);
  font:10px var(--mono);letter-spacing:.02em;cursor:pointer}
.spec-add span{font:inherit}
.spec-add:hover{color:var(--ink);border-color:var(--ink)}
@media(max-width:760px){
  .spec-row.editing{grid-template-columns:minmax(0,1fr);gap:6px}
  .spec-edit-tools{justify-content:flex-end}
  .spec-edit-tools .select-control{min-width:0;flex:1}
}
.spec-foot{display:flex;align-items:center;gap:12px;margin-top:12px;flex-wrap:wrap}
.spec-foot .spec-add{margin:0}
.spec-hint{margin-left:auto;font-size:11px;color:var(--faint)}
@media(max-width:560px){.spec-hint{display:none}}

/* 块内容和顶栏对齐：讨论按钮已并进工具组，不再需要右侧沟槽 */
.node-block{padding-right:0}

/* 工具组四个按钮统一成一种形态:裸图标 24×24,悬停才有内凹底。
   讨论按钮不再自带方框 —— 它和另外三个的区别是「一直在」,不是「长得不一样」;
   真正要突出的时候有未读气泡(§9.4),不靠底色。 */
.block-tools>.block-discussion{
  position:static!important;right:auto!important;top:auto!important;
  min-width:24px;width:auto;height:24px;min-height:24px;padding:0 4px;
  border:0!important;border-radius:5px;background:transparent!important;
  color:var(--muted)!important;display:grid;place-items:center;gap:4px;
  grid-auto-flow:column;box-shadow:none!important}
.block-tools>.block-discussion:hover{background:var(--inset)!important;color:var(--ink)!important}
.block-tools>.block-discussion.primary{background:var(--ink)!important;color:var(--paper)!important}


/* 版本名的快捷填充:两个档位降级成按钮,真正的名字由用户自己写 */
.ver-quick{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:9px 0 18px}
.ver-quick>.mono{font-size:9px;letter-spacing:.14em;color:var(--faint)}
.btn.ver-quick-btn{min-height:24px;height:24px;padding:0 10px;font-size:11px}

/* 项目导航行右端只剩未读讨论,让它自己贴右 */
.nav-item .disc-badge{margin-left:auto;margin-right:0}

/* 节点卡上的说明最多三行:卡片宽度固定,说明是自由文本 ——
   不夹住的话,一段长说明会把这张卡撑高一截,整张图的疏密就乱了。完整内容在节点页里 */
.card-desc{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}

/* 画布拖动期间不要让浏览器去选文字 */
body.graph-drag,body.graph-drag *{user-select:none!important;-webkit-user-select:none!important}

/* ── 字段链接（上游规格行 → 下游记录字段）──────────────────────────────── */
/* 连接态横条：浮在画布顶端,说明正在接什么;取消随手可点 */
/* 横条压在顶条下面一档,和 sheet 左右对齐 —— 原来用 absolute 定在整个画布容器上,
   结果盖住了品牌、面包屑和「添加模块」。 */
.link-bar{position:fixed;left:var(--left);right:74px;top:70px;z-index:30;display:flex;align-items:center;gap:12px;
  background:var(--chassis);border:1px solid rgba(26,26,26,.13);border-radius:10px;padding:9px 12px;
  box-shadow:0 1px 2px rgba(26,26,26,.06),0 6px 18px rgba(26,26,26,.08);font-size:12.5px}
.link-bar .link-dot{width:8px;height:8px;border-radius:50%;background:var(--blue);flex:0 0 auto}
.link-bar b{font-weight:500}
.link-bar .mono{font-size:9px;letter-spacing:.06em;color:var(--t3,var(--secondary))}
.link-bar .grow{flex:1}
.link-bar .link-hint{font-size:11px;color:var(--secondary)}
/* 可接收的端口转蓝并轻微放大;源端口实心蓝;其余降级 —— 一眼看出往哪儿接 */
.port.link-target:after{background:var(--blue);box-shadow:0 0 0 2px var(--paper),0 0 0 4px color-mix(in srgb,var(--blue) 45%,transparent)}
.port.link-source:after{background:var(--blue)}
.port.link-dim:after{background:var(--faint)}
.port.link-target{z-index:6}
/* LOG 页上「来自上游」的记录字段：一行一个,不是表格 */
.lf-list{margin-top:8px;border-top:.5px solid var(--line)}
.lf-row{display:grid;grid-template-columns:130px minmax(0,1fr) auto 24px;align-items:baseline;gap:12px;
  padding:9px 0;border-bottom:.5px solid var(--line);font-size:13px;border-left:2.5px solid var(--blue);padding-left:11px}
.lf-label{font-size:12px;color:var(--secondary)}
.lf-value{color:var(--ink);word-break:break-word}
.lf-value.empty{color:var(--faint)}
.lf-src{display:inline-flex;align-items:center;gap:5px;font-size:9px;letter-spacing:.04em;color:var(--blue);white-space:nowrap}
.lf-row.broken{border-left-color:var(--red)}
.lf-row.broken .lf-value,.lf-row.broken .lf-src{color:var(--red)}
.lf-cut{border:0;background:none;padding:0;width:20px;height:20px;border-radius:5px;display:grid;place-items:center;
  color:var(--muted);cursor:pointer;opacity:0;transition:opacity .15s}
.lf-row:hover .lf-cut{opacity:1}
.lf-cut:hover{background:var(--inset);color:var(--ink)}
.lf-note{margin-top:10px;font-size:11px;color:var(--secondary);line-height:1.7}
@media(max-width:760px){.lf-row{grid-template-columns:minmax(0,1fr) auto;gap:4px}.lf-src{grid-column:1/-1}}
.lf-note.mono{font-size:9px;letter-spacing:.1em;color:var(--faint);margin-top:9px}
.lf-list.in-form .lf-row{grid-template-columns:130px minmax(0,280px) auto 0;align-items:center;padding:10px 0}
.lf-fld{background:var(--inset);border-bottom:.75px solid var(--ink);border-radius:5px 5px 0 0;padding:7px 10px;display:flex;align-items:center;min-height:32px}
.lf-fld .fv{font-size:13px;color:var(--ink)}

/* ── 记录组分析条 ──────────────────────────────────────────────────────── */
.analysis-band{margin:14px 0 6px;border-top:1.25px solid var(--ink);padding-top:2px}
.ab-row{display:flex;align-items:flex-start;gap:14px;padding:10px 0 10px 11px;border-bottom:.5px solid var(--line)}
.ab-row.held{border-left:2.5px solid var(--line)}      /* k2 灰 = 从属:被按住不动的 */
.ab-row.vary{border-left:2.5px solid var(--ink)}       /* k0 墨 = 重点研究方向 */
.ab-k{flex:0 0 66px;font-size:9px;letter-spacing:.14em;color:var(--secondary);padding-top:4px}
.ab-body{flex:1;display:flex;flex-wrap:wrap;gap:7px;min-width:0}
.ab-chip{display:inline-flex;align-items:baseline;gap:6px;background:var(--inset);border-radius:5px;padding:3px 9px;font-size:11.5px;color:var(--ink)}
.ab-chip b{font-weight:400;font-size:9px;letter-spacing:.08em;color:var(--secondary);text-transform:uppercase}
.ab-var{display:inline-flex;align-items:baseline;gap:8px;background:transparent;border:1px solid rgba(26,26,26,.16);
  border-radius:5px;padding:3px 10px;font-size:11.5px;color:var(--ink);cursor:pointer}
.ab-var b{font-weight:400}
.ab-var .mono{font-size:9px;color:var(--secondary)}
.ab-var:hover{border-color:var(--ink)}
.ab-var.axis{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.ab-var.axis .mono{color:var(--paper);opacity:.72}
.ab-warn{display:flex;align-items:center;gap:8px;padding:10px 0 10px 11px;font-size:12px;color:var(--ink)}
.ab-warn .orange-dot{width:6px;height:6px;border-radius:50%;background:var(--orange);flex:0 0 auto}
.ab-groups{padding:12px 0 4px 11px;border-top:.5px solid var(--line)}
.ab-note{margin:7px 0 10px;font-size:11.5px;color:var(--secondary);line-height:1.7}
.ab-group{display:flex;align-items:baseline;gap:12px;padding:7px 0;border-top:.5px solid var(--line);font-size:12px}
.ab-group>.mono:first-child{flex:0 0 42px;font-size:10px;color:var(--ink)}
.ab-group.thin{opacity:.55}
.ab-sig{flex:1;min-width:0;color:var(--secondary)}
.ab-runs{font-size:10px;color:var(--faint);white-space:nowrap}
@media(max-width:760px){.ab-row{flex-direction:column;gap:6px}.ab-k{flex:none}}

/* ── 相对上一条改了什么 ───────────────────────────────────────────────── */
.diff-band{display:flex;align-items:flex-start;gap:14px;padding:12px 0 14px 11px;margin-bottom:6px;
  border-left:2.5px solid var(--ink);border-bottom:.5px solid var(--line)}
.diff-band.first{border-left-color:var(--line)}
.db-k{flex:0 0 76px;font-size:9px;letter-spacing:.14em;color:var(--secondary);padding-top:3px}
.db-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.db-line{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:12.5px}
.db-tag{font-size:9px;letter-spacing:.1em;color:var(--secondary)}
.db-line.base .db-tag{color:var(--ink)}
.db-line.base .orange-dot{width:6px;height:6px;border-radius:50%;background:var(--orange);flex:0 0 auto}
.db-item{display:inline-flex;align-items:baseline;gap:7px;background:var(--inset);border-radius:5px;padding:3px 9px}
.db-item b{font-weight:400;font-size:9px;letter-spacing:.06em;color:var(--secondary);text-transform:uppercase}
.db-item .mono{font-size:11px;color:var(--ink)}
.db-item.held{background:transparent;box-shadow:inset 0 0 0 1px rgba(26,26,26,.18)}
.db-why{display:flex;align-items:baseline;gap:14px;padding-top:4px;border-top:.5px solid var(--line);margin-top:2px}
.db-why p{margin:0;font-size:12.5px;color:var(--ink);flex:1}
.db-why.missing p{color:var(--faint)}
/* 列表里的转折点 */
.turn-tag{display:inline-flex;align-items:center;gap:5px;margin-left:8px;font-size:9px;letter-spacing:.06em;
  color:var(--secondary);background:var(--inset);border-radius:4px;padding:2px 7px;white-space:nowrap}
.turn-tag .orange-dot{width:5px;height:5px;border-radius:50%;background:var(--orange)}
.turn-tag.better{color:var(--ink)}
.why-ask{margin:18px 0 4px;padding:13px 15px;border:1px solid rgba(26,26,26,.16);border-radius:7px;background:var(--inset)}
.why-head{display:flex;align-items:flex-start;gap:9px;font-size:12.5px;line-height:1.7;margin-bottom:10px}
.why-head .orange-dot{width:6px;height:6px;border-radius:50%;background:var(--orange);flex:0 0 auto;margin-top:7px}
.why-head b{font-weight:500}



/* ── 承载字段链接的连线:虚线 ───────────────────────────────────────────────
   虚线 = 这根线在传导上下文,不只是「这两个节点有关系」。
   以后所有带上下文传导的连线都用这一种画法。 */
.graph-links path.carries{stroke-dasharray:5 4}
/* 右键线条：高亮（醒目色）、主线（加粗；配一条同色背景的细线盖在正中间，压出「双线」的空心效果）*/
.graph-links path.highlight{stroke:var(--orange);stroke-width:2.2}
.graph-links path.primary{stroke-width:4.5}
.graph-links path.primary-cut{stroke:var(--paper);stroke-width:1.6;pointer-events:none}
/* 线上的控制点：一小段扁的圆角长方形,横着贴在线上（高度永远和最近的端口齐平,所以它就是线进出端口的那段直线）。
   只管理两件事 —— 左右拖它整理线条的弯折,或者拖到别的节点上从这条线再接一条新连接 */
.wire-point{position:absolute;width:22px;height:8px;margin:-4px 0 0 -11px;border-radius:4px;
  background:var(--secondary);border:1.5px solid var(--paper);cursor:grab;z-index:3;
  box-shadow:0 1px 3px rgba(26,26,26,.3)}
.wire-point:hover{background:var(--blue);transform:scale(1.15)}
/* 连接态的端口:墨色 + 光环,不用蓝 —— 蓝是内容层的选中/context key,别处已经占了 */
.port.link-target:after{background:var(--ink);box-shadow:0 0 0 2px var(--paper),0 0 0 4px rgba(26,26,26,.28)}
.port.link-source:after{background:var(--ink);box-shadow:0 0 0 2px var(--paper),0 0 0 3px var(--ink)}
.link-bar .link-dot{background:var(--ink)}

/* ── 上下游:叠成一摞 → 悬浮展开 ───────────────────────────────────────── */
/* 收起时的高度锁在 flow-side 上 —— 展开时这一摞浮在内容上面,不把下面的东西顶下去。
   悬浮引起的整页位移比重叠更打扰。 */
.flow-side{--fh:calc(30px + var(--peek));height:calc(22px + var(--fh) + (var(--n) - 1) * var(--peek))}
.flow-stack{position:relative;flex:0 0 auto;
  width:var(--fw,178px);height:calc(var(--fh) + (var(--n) - 1) * var(--peek));
  transition:height .26s cubic-bezier(.22,.61,.36,1)}
.flow-stack .flow-chip{position:absolute;left:0;top:0;width:100%;height:var(--fh);
  align-items:flex-start;padding-top:7px;padding-bottom:var(--peek);
  transform:translateY(calc(var(--i) * var(--peek)));
  z-index:calc(var(--n) - var(--i));background:var(--paper);
  transition:transform .26s cubic-bezier(.22,.61,.36,1),box-shadow .2s}
.flow-stack:hover{height:calc(var(--n) * (var(--fh) + 5px));z-index:20}
.flow-side{overflow:visible}
.node-flow{align-items:flex-start}
.flow-stack:hover .flow-chip{transform:translateY(calc(var(--i) * (var(--fh) + 5px)));
  box-shadow:0 1px 2px rgba(26,26,26,.06)}
.flow-stack:not(:hover) .flow-chip:not(:first-child)>*{opacity:0}
.flow-stack .flow-chip>*{transition:opacity .18s}
.node-flow{position:relative;z-index:5}
.flow-side:hover{z-index:20}
@media(prefers-reduced-motion:reduce){.flow-stack,.flow-stack .flow-chip{transition:none}}

/* ── 还没有下游时的占位 LOG 节点 ───────────────────────────────────────────
   半透明 + 虚线边:它还不存在,只是告诉你接了之后会长在哪儿。 */
/* 占位节点:跟着鼠标从别的卡片身上划过去,所以
   ① 它必须一直浮在最上面 —— 钻到卡片底下看着就像坏了;
   ② 渐消的是「里面的内容」,卡片本身不透明。整块半透明的话,压到别的卡片上
      两层字叠在一起,谁都读不出来 —— 那就不是「还没落下」,是花屏。 */
.graph-node.ghost-node{opacity:1;border-style:dashed!important;border-color:var(--faint)!important;
  cursor:copy;pointer-events:none;z-index:60;background:var(--paper);
  box-shadow:0 10px 26px #1a1a1a1a!important;animation:ghost-in .22s ease-out}
.graph-node.ghost-node>*{opacity:.62}
.graph-node.ghost-node>.port{opacity:1}
.graph-node.ghost-node .port.in:after{background:var(--ink)}
.ghost-body{padding:7px 9px;border-top:.5px dashed var(--line)}
.ghost-body .mono{font-size:9px;letter-spacing:.06em;color:var(--secondary)}
.ghost-hint{padding:6px 9px;border-top:.5px dashed var(--line);font-size:8.5px;
  letter-spacing:.06em;color:var(--faint);line-height:1.5}
.ghost-link{position:absolute;inset:0;overflow:visible;pointer-events:none;z-index:59}
.ghost-link path{fill:none;stroke:var(--faint);stroke-width:1.4}
@keyframes ghost-in{from{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.graph-node.ghost-node{animation:none}}
/* 节点名旁边的改名笔：一直在,不靠悬浮才出现 ——
   要 hover 才看得见的功能,对第一次用的人等于不存在。安静就够了,不必藏。 */
.node-page-header .node-top .icon-btn{color:var(--faint)}
.node-page-header .node-top .icon-btn:hover{color:var(--ink);background:var(--inset)}

.cmp-slot{display:contents}
.cmp-note{display:inline-flex;align-items:center;gap:7px;font-size:9px;letter-spacing:.06em;color:var(--faint);margin-right:14px}
.cmp-note.warn{color:var(--ink)}
.cmp-note .orange-dot{width:5px;height:5px;border-radius:50%;background:var(--orange)}

/* ── 添加 LOG 时的「沿用上游」 ──────────────────────────────────────────── */
/* 适应模块：建的时候只勾「跟着上游走」这一件事,不在这里挑字段 */
.adapt-opt{display:flex;align-items:flex-start;gap:11px;width:100%;margin-top:20px;padding:13px 14px;text-align:left;
  border:.5px solid var(--line);border-radius:6px;background:var(--inset);cursor:pointer;color:inherit;font:inherit}
.adapt-opt:hover{border-color:var(--secondary)}
.adapt-opt:focus-visible{outline:1.5px solid var(--blue);outline-offset:2px}
.adapt-opt.on{border-color:var(--ink);background:var(--paper)}
.adapt-tick{flex:0 0 auto;width:15px;height:15px;margin-top:1px;border:1px solid var(--secondary);border-radius:4px;
  display:grid;place-items:center;color:var(--paper)}
.adapt-opt.on .adapt-tick{background:var(--ink);border-color:var(--ink)}
.adapt-text b{font-size:12px;font-weight:500}
.adapt-text small{display:block;margin-top:5px;font-size:11px;line-height:1.75;color:var(--muted)}

/* 节点页最顶的那一格空位：虚线 = 这条线上要传上下文,只是还没定传哪一项（附录 B） */
.node-block.adapt-slot{margin-top:4px}
.adapt-add{width:100%;display:flex;align-items:center;gap:10px;padding:17px 15px;text-align:left;
  border:1px dashed var(--faint);border-radius:7px;background:transparent;color:var(--muted);
  font-size:12px;cursor:pointer;transition:border-color .15s,color .15s}
.adapt-add:hover{border-color:var(--ink);color:var(--ink)}
.adapt-add:focus-visible{outline:1.5px solid var(--blue);outline-offset:2px}
.adapt-hint{font-size:11px;line-height:1.75;color:var(--faint);margin-top:9px}

/* 取数态：上游节点页顶部只说一句话,行上给一个「可以选我」的暗示 */
/* .link-bar 那套 fixed 定位是给画布场景量的（浮在节点图上方）；节点页是另一种布局，
   sheet 本来就会滚动、页头也不是画布那种空画面 —— 照搬 fixed 会怼上标题和面包屑。
   这里让它退回正常文档流，垫在页头上面，跟页头/面包屑一样横向留 22px。 */
.pick-bar{position:static;margin:14px 22px 0;left:auto;right:auto;top:auto;z-index:auto}
.pick-bar .link-dot{background:var(--blue)}
.split-sheet.picking .spec-row.spec-clickable{cursor:copy}
.split-sheet.picking .spec-row.spec-clickable:hover{background:var(--soft,var(--inset));border-left-color:var(--blue)}
/* 归档去向：一行收成小片飞进「已归档」按钮，按钮接住时弹一下（和回收站按钮同一种弹法） */
.fly-ghost{position:fixed;z-index:1000;pointer-events:none;background:var(--paper);border:.5px solid var(--line);box-shadow:0 6px 16px #1a1a1a1f,0 1px 3px #1a1a1a14;display:flex;align-items:center;padding:0 10px;overflow:hidden;white-space:nowrap;font-size:12px;color:var(--ink)}.fly-ghost>span{overflow:hidden;text-overflow:ellipsis}.filter.catch{animation:rail-bounce .6s ease-out}
/* 「我的项目」下的「归档」子级：进我的项目 / 归档页时从「我的项目」下面展开，去别的功能页时收回 */
.nav-item.nav-sub{--sub-h:28px;height:var(--sub-h);padding-left:25px;font-size:12px;color:var(--secondary);overflow:hidden}.nav-item.nav-sub svg{width:12px;height:12px}.nav-item.nav-sub.active{color:var(--ink)}.collapsed .nav-item.nav-sub{--sub-h:31px;padding:0}.collapsed .nav-item.nav-sub svg{width:13px;height:13px}.nav-item.nav-sub.enter{animation:nav-sub-in .24s cubic-bezier(.2,.7,.2,1) both}.nav-item.nav-sub.leave{animation:nav-sub-out .2s cubic-bezier(.4,0,1,1) forwards;pointer-events:none}@keyframes nav-sub-in{from{height:0;opacity:0;transform:translateY(-6px)}to{height:var(--sub-h);opacity:1;transform:none}}@keyframes nav-sub-out{from{height:var(--sub-h);opacity:1}to{height:0;opacity:0;margin-bottom:0}}.nav-item.nav-sub.catch{animation:rail-bounce .6s ease-out}.reduce-motion .nav-item.nav-sub.enter,.reduce-motion .nav-item.nav-sub.catch{animation:none}.reduce-motion .nav-item.nav-sub.leave{display:none}@media (prefers-reduced-motion:reduce){.nav-item.nav-sub.enter,.nav-item.nav-sub.catch{animation:none}.nav-item.nav-sub.leave{display:none}}
/* 归档确认框：放到「归档」的哪里 */
.archive-place{margin-top:16px;padding-top:14px;border-top:.5px solid var(--line)}.archive-place .archive-place-note{font-size:11px;color:var(--muted);line-height:1.6;margin-top:7px}.sidebar-nav .nav-item.catch{animation:rail-bounce .6s ease-out}.reduce-motion .sidebar-nav .nav-item.catch{animation:none}
/* 我的存储：归档了的行淡一些（和文件页的已归档行一样）；「已归档」按钮上的数；我的文件的配额一行；复用没开放时的说明；表格行尾的「⋯」 */
.storage-row.stash-archived h4,.storage-row.stash-archived p,.storage-row.stash-archived .mono,.ref-card-row.stash-archived h4,.ref-card-row.stash-archived p{color:var(--muted)}.filter .count{font:9px var(--mono);color:inherit;opacity:.7}.storage-quota{font-size:11px;color:var(--muted);margin-top:10px}.reuse-closed{font-size:11px;color:var(--muted);align-self:center;margin-right:auto}.data-table td.row-more{width:28px;padding-right:0;text-align:right}.data-table td.row-more .trash-more{opacity:.55}.data-table tr:hover td.row-more .trash-more{opacity:1}.ref-card-row{position:relative}.ref-card-row>.trash-more{margin-left:auto;align-self:center;flex-shrink:0}
/* 改动清单 · 基线合并后：上传被拦下的原位说明（不是 toast）、LINK 地址不合规的提示、外部链接、实验室 Viewer、记录删除 */
.upload-refusal{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:8px 0;padding:8px 10px;border-left:2px solid var(--ink);background:var(--inset);font-size:12px;line-height:1.6;color:var(--secondary)}.upload-refusal .btn.link{font-size:12px}
.field-error{font-size:11px;color:var(--red);margin-top:6px;line-height:1.5}
.link-out{color:var(--blue);text-decoration:underline;text-underline-offset:2px;font-size:13px}.link-full{font-size:10px;margin-left:6px;overflow-wrap:anywhere}
.readonly-tag{font:10px var(--mono);letter-spacing:.06em;padding:2px 6px;border-radius:3px;background:var(--inset);color:var(--muted)}
.lab-shelf-note{margin-top:18px;font-size:12px;line-height:1.7}
.lab-viewer-banner{font-size:12px}.lab-viewer-banner .flex{gap:8px;flex-shrink:0}
.oc-gone td{color:var(--muted)}
.actions .run-delete{margin-right:auto}
.attachment-field input{margin-top:6px}.attachment-field small{display:block;margin-top:6px;font-size:11px;line-height:1.6}
/* 我的存储长按拖进节点图：弹窗淡出露出画布，提起的一行跟着鼠标 */
body.stash-lifting #overlays .storage-backdrop{opacity:0;pointer-events:none;backdrop-filter:none;transition:opacity .16s}.storage-modal [data-drag-insert]{user-select:none;-webkit-user-drag:none}.stash-ghost{display:flex;align-items:center;gap:8px;padding:7px 11px;border:1px solid var(--ink);border-radius:2px;font-size:12px;color:var(--ink);max-width:280px;white-space:nowrap;overflow:hidden;transform:none}
/* 消息：单点「消息」（所有未读）时还没选会话，右边只有一句说明 */
.chat-column.chat-none{display:grid;place-items:center;font-size:12px}
/* 连线的悬停 / 右键判定放宽：每根线上面一条透明粗线（屏幕上 14px，缩放不变）；碰到它，这根线和端口处的短线一起变蓝 */
.graph-links path.wire-hit,.graph-links path.wire-hit:hover{stroke:transparent;stroke-width:14px;vector-effect:non-scaling-stroke;fill:none;pointer-events:stroke;cursor:pointer}.graph-links path.hot{stroke:var(--blue);stroke-width:2.5}
