*{box-sizing:border-box} :root{font-family:Inter,"Segoe UI","Microsoft YaHei",sans-serif;color:#263d37;background:#f6f7f4;font-size:14px}body{margin:0;display:grid;grid-template-columns:248px minmax(360px,1fr) 440px;position:fixed;inset:0;height:100%;grid-template-rows:minmax(0,1fr);overflow:hidden}button,input{font:inherit}button{cursor:pointer;border:1px solid #dce3dc;border-radius:7px;background:#fff;color:#53665e;padding:7px 10px;transition:.15s}button:hover{background:#ecf3e9;border-color:#aac3af}button:focus-visible,a:focus-visible,input:focus-visible{outline:2px solid #669e78;outline-offset:3px}.shelf{border-right:1px solid #dfe5dc;padding:30px 20px;display:flex;flex-direction:column;background:#f1f4ee}.brand{text-decoration:none;color:#244638;font-size:25px;font-weight:700;display:flex;align-items:center;gap:8px;white-space:nowrap}.brand-icon{color:#638d69;font-size:35px}.brand small{font-size:9px;letter-spacing:1.5px;font-weight:500;margin-top:9px}.tagline{font-size:12px;color:#8a978b;margin:9px 0 30px}.search{display:flex;align-items:center;background:#fff;border:1px solid #dde4d8;border-radius:8px;padding:9px 10px;gap:7px;color:#829280}.search input{width:100%;border:0;outline:0;background:transparent;font-size:12px}.shelf-label{display:flex;align-items:center;font-size:11px;letter-spacing:1px;color:#85917f;margin:26px 4px 13px;gap:10px}.shelf-label button{margin-left:auto;border:0;background:none;padding:2px;font-size:18px}#books{overflow:auto}.book{width:100%;display:flex;text-align:left;gap:10px;padding:16px 11px;border:1px solid transparent;background:transparent;margin-bottom:9px;color:#627064;line-height:1.6}.book.active{background:#e0eada;border-color:#cbdcc3;color:#2e553b}.book-icon{font-size:21px;background:#e5e9df;border:1px solid #d4dfcd;min-width:31px;height:39px;text-align:center;padding-top:2px;border-radius:3px;color:#7b9471}.book.active .book-icon{background:#728f61;color:white}.book strong{display:block;font-weight:550;font-size:13px}.book small{display:block;font-size:10px;color:#899180;margin-top:4px}.shelf-foot{margin-top:auto;font-size:11px;color:#83907e;padding-top:28px;line-height:2}.shelf-foot small{font-size:10px;color:#9ba594}.dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:#7d9a69;margin-right:6px}main{min-width:0;display:flex;flex-direction:column}header{height:108px;padding:25px 30px;display:flex;align-items:center;gap:15px;background:#fbfcf9;border-bottom:1px solid #e2e7de}header>div{min-width:0}.eyebrow{letter-spacing:2px;font-size:9px;color:#87967e;font-weight:600}h1{font-size:20px;margin:12px 0 0;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pill{font-size:11px;color:#708262;border:1px solid #d9e3cf;border-radius:20px;padding:7px 11px;white-space:nowrap;margin-left:auto}.map-toolbar{min-height:65px;display:flex;align-items:center;justify-content:space-between;padding:12px 25px;gap:10px;border-bottom:1px solid #e4e9df;background:#fbfcf9}.map-toolbar strong{font-size:12px;font-weight:550}.map-toolbar #stats{font-size:10px;margin-left:10px;color:#96a08f}.actions{display:flex;gap:5px}.actions button{font-size:10px;padding:6px 8px;background:transparent}#canvas{position:relative;flex:1;overflow:hidden;background-color:#f8faf6;background-image:radial-gradient(#dce3d6 .8px,transparent .8px);background-size:20px 20px;touch-action:none;cursor:grab}#canvas:active{cursor:grabbing}.canvas-label{position:absolute;top:25px;left:27px;font-size:9px;letter-spacing:2px;color:#b3bda9;pointer-events:none}#world{position:absolute;transform-origin:0 0}#edges{position:absolute;overflow:visible;pointer-events:none;top:0;left:0}.node{position:absolute;display:flex;align-items:center;width:204px;min-height:54px;padding:0;border-radius:10px;border:1px solid #dce5d4;background:#fff;box-shadow:0 4px 12px #314c2610;cursor:default;transition:background .15s}.node.selected{border-color:#779b64;box-shadow:0 0 0 3px #88a97720;background:#f0f6e9}.node.root{background:#395f48;border-color:#395f48;color:white;width:220px}.node .node-title{border:0;background:none;color:inherit;text-align:left;line-height:1.45;flex:1;min-width:0;padding:11px 13px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:12px;border-radius:10px}.node .fold{padding:0;width:20px;height:20px;border-radius:50%;font-size:12px;margin-right:9px;flex-shrink:0;color:#799268;background:#f3f7ee;border:1px solid #dbe5d2}.node.root .fold{color:#496d40}.node.leaf{border-left:3px solid var(--branch)}.node small{font-size:9px;color:#9aa88e;margin-right:10px}.map-hint{position:absolute;bottom:23px;left:25px;color:#9ca893;font-size:10px;pointer-events:none}.zoom{position:absolute;bottom:17px;right:22px;display:flex;align-items:center;border:1px solid #dfe7d7;border-radius:8px;background:#fff;box-shadow:0 3px 8px #35432a08}.zoom button{border:0;background:none}.zoom span{font-size:10px;color:#78886d;min-width:40px;text-align:center}footer{display:flex;justify-content:space-between;padding:12px 25px;background:#fbfcf9;border-top:1px solid #e1e7da;font-size:10px;color:#96a18c}.reader{border-left:1px solid #e0e5dc;display:flex;flex-direction:column;background:white;min-width:0}.reader-top{height:61px;display:flex;align-items:center;justify-content:space-between;padding:0 25px;border-bottom:1px solid #edf0e8;color:#7b8b72;font-size:12px}.reader-top button{border:0;color:#a8b09e;background:none}#breadcrumbs{padding:17px 28px;font-size:10px;line-height:1.7;color:#95a18c;border-bottom:1px solid #edf0e8;max-height:82px;overflow:auto}.reader-scroll{padding:30px 30px 50px;overflow:auto;flex:1}.reader h2{font-size:24px;line-height:1.55;font-weight:600;color:#2b4835;margin:14px 0 24px}article{font-family:"Segoe UI","Microsoft YaHei",sans-serif;line-height:1.95;color:#53604f;font-size:14px;overflow-wrap:anywhere}article p{margin:0 0 20px}article img{max-width:100%;height:auto;display:block;border-radius:6px;margin:20px auto;cursor:zoom-in}article h1,article h2,article h3{font-size:19px;white-space:normal}article blockquote{border-left:3px solid #8da776;margin-left:0;padding:2px 16px;background:#f6f8f2}article a{color:#557b49}article pre{overflow:auto;background:#f2f4ed;padding:15px;border-radius:8px;line-height:1.5}article code{background:#f0f3ec;padding:2px 4px;border-radius:3px;font-size:12px}article table{border-collapse:collapse;display:block;overflow:auto;width:100%;font-size:12px;margin:20px 0}article th,article td{border:1px solid #dce4d4;padding:7px 10px}article th{background:#f3f6ee}.katex-display{overflow-x:auto;overflow-y:hidden;padding:10px 1px}.katex{font-size:1.05em}eq,eqn{overflow-x:auto;max-width:100%}#child-links{margin-top:30px;border-top:1px solid #e7ecdf;padding-top:20px}#child-links p{font-size:10px;color:#93a082;letter-spacing:1px}#child-links button{display:block;width:100%;text-align:left;border:0;border-bottom:1px solid #edf0e8;padding:12px 4px;font-size:12px;color:#668256;background:none}.reader-foot{border-top:1px solid #e9ede2;padding:14px 25px;color:#98a28f;font-size:10px;display:flex;justify-content:space-between}body.reader-hidden{grid-template-columns:248px minmax(360px,1fr)}body.reader-hidden .reader{display:none}dialog{border:0;border-radius:10px;padding:15px;max-width:92vw;max-height:92vh}dialog::backdrop{background:#19271ee0}dialog img{display:block;max-width:85vw;max-height:82vh;object-fit:contain}dialog button{position:absolute;right:6px;top:6px}#map-empty{padding:70px;color:#7d8e72}.empty{color:#94a189;font-size:12px;line-height:1.8}@media(min-width:1600px){body{grid-template-columns:260px minmax(360px,1fr) 510px}.reader-scroll{padding:35px 40px}}@media(max-width:1150px){body{grid-template-columns:210px minmax(320px,1fr) 350px}.shelf{padding:25px 14px}.brand small{display:none}.map-toolbar{flex-wrap:wrap}.reader-scroll{padding:24px}.pill{display:none}header{padding:22px}body.reader-hidden{grid-template-columns:210px 1fr}}@media(max-width:850px){body{grid-template-columns:180px 1fr}.shelf{padding:20px 10px}.reader{position:fixed;right:0;top:0;bottom:0;width:min(440px,85vw);z-index:5;box-shadow:-10px 0 40px #263e351a}body.reader-hidden{grid-template-columns:180px 1fr}.map-hint{max-width:200px;line-height:1.6}h1{font-size:17px}}

/* Keep all three columns stretched to the full browser viewport. */
html{width:100%;height:100%;overflow:hidden}
body>.shelf,body>main,body>.reader{min-height:0;height:100%;overflow:hidden}
#canvas{min-height:0}
.reader-scroll{min-height:0}
.reader [hidden]{display:none!important}
#read-panel,#chat-panel{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden}
.reader-top{padding:0 18px}
.reader-tabs{height:100%;display:flex;gap:22px;align-items:stretch}
.reader-tabs button{border:0;border-radius:0;border-bottom:2px solid transparent;background:transparent;color:#8a9782;padding:0 2px;font-size:13px}
.reader-tabs button.active{color:#395f48;border-bottom-color:#638d69}
.rag-heading{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid #e7ecdf;gap:10px;flex-shrink:0}
.rag-heading strong{font-size:13px;font-weight:550;color:#395f48}
.rag-heading small{display:block;margin-top:7px;color:#899780;font-size:11px;overflow-wrap:anywhere}
.rag-heading button{font-size:11px;flex-shrink:0}
#rag-notice{color:#966332;font-size:12px;padding:0 20px;line-height:1.7;flex-shrink:0;max-height:100px;overflow:auto}
#rag-notice:not(:empty){padding-block:10px;background:#faf6ed}
#chat-log{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:22px;scrollbar-gutter:stable}
.chat-empty{white-space:pre-line;color:#8b9982;line-height:2;padding:30px 4px;font-size:13px}
.chat-turn{margin-bottom:30px;display:flow-root}
.chat-user{margin-left:36px;width:fit-content;max-width:calc(100% - 36px);float:right;clear:both;background:#395f48;color:white;border-radius:13px 13px 3px 13px;padding:11px 14px;font-size:13px;line-height:1.8;white-space:pre-wrap;overflow-wrap:anywhere;margin-bottom:18px}
.chat-answer{clear:both;font-size:13px;line-height:1.9;overflow-wrap:anywhere}
.chat-answer p{margin-bottom:12px}.chat-answer h1,.chat-answer h2,.chat-answer h3{font-size:16px;margin:12px 0;white-space:normal}.chat-answer ul,.chat-answer ol{padding-left:22px}
.chat-turn-status{font-size:11px;color:#8b977f;margin:8px 0}
.chat-turn-status:empty{display:none}
.citation{display:inline;border:0;padding:1px 4px;background:#e8f0e1;color:#496b40;border-radius:4px;font-size:11px}
.chat-sources{border-top:1px solid #e5ebde;margin-top:13px;padding-top:10px}
.chat-sources summary{cursor:pointer;color:#6d835f;font-size:11px;padding:5px 0}
.source-entry{display:block;width:100%;text-align:left;margin-top:8px;border:0;border-left:2px solid #8da776;border-radius:0 6px 6px 0;background:#f4f7ef;padding:10px 12px;line-height:1.7;overflow-wrap:anywhere}
.source-entry strong{display:block;font-size:11px;color:#59754d;font-weight:550}.source-entry span{display:block;font-size:12px;white-space:pre-wrap;margin-top:5px;color:#77836d}
#rag-form{padding:14px 20px 12px;border-top:1px solid #e5ebdf;background:#fbfcf9;flex-shrink:0}
#rag-form label{display:block;font-size:11px;color:#7d8f72;margin-bottom:8px}
#rag-input{resize:vertical;max-height:180px;min-height:66px;width:100%;border:1px solid #d7e1cf;background:white;border-radius:9px;padding:10px 12px;color:#395344;font:inherit;font-size:13px;line-height:1.6}
#rag-input:focus-visible{outline:2px solid #8ca87a;outline-offset:2px}
.rag-form-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}.rag-form-actions span{margin-right:auto;font-size:10px;color:#8d9b81}
#rag-send{background:#395f48;color:white;border-color:#395f48}
#rag-storage{font-size:10px;color:#94a08a;margin-top:9px;text-align:center}
#rag-latest{align-self:center;margin:0 0 8px;border-radius:20px;font-size:11px}
.citation-highlight{background:#edf4d8!important;box-shadow:0 0 0 4px #edf4d8;border-radius:4px}
button:disabled{opacity:.5;cursor:not-allowed}
@media(max-width:850px){.reader{width:min(440px,95vw)}#rag-input{font-size:16px}.reader-tabs button{min-height:44px}}
#canvas,#canvas *{user-select:none;-webkit-user-select:none;-webkit-user-drag:none}
header,.map-toolbar,main>footer,.reader-top,#breadcrumbs,.reader-foot{flex-shrink:0}

/* The hit area straddles the existing border without consuming a grid column. */
.panel-resizer{position:absolute;top:0;bottom:0;width:12px;transform:translateX(-50%);z-index:10;cursor:col-resize;touch-action:none;user-select:none;outline-offset:-3px}
.panel-resizer[hidden]{display:none}
.panel-resizer::after{content:"";position:absolute;top:0;bottom:0;left:5px;width:2px;background:#719c72;opacity:0;transition:opacity .15s}
.panel-resizer::before{content:"";position:absolute;top:calc(50% - 17px);left:4px;width:4px;height:34px;border-radius:4px;background:#a8bba0;opacity:.6}
.panel-resizer:hover::after,.panel-resizer:focus-visible::after,.panels-resizing .panel-resizer::after{opacity:.7}
.panel-resizer:focus-visible{outline:2px solid #669e78}
.panels-resizing,.panels-resizing *{cursor:col-resize!important;user-select:none!important}
.shelf{min-width:0}.book>span:last-child{min-width:0;overflow-wrap:anywhere}
.actions{flex-wrap:wrap}.map-toolbar{flex-wrap:wrap}
@media(min-width:851px){
  body{grid-template-columns:var(--shelf-width,248px) minmax(320px,1fr) var(--reader-width,440px)}
  body.reader-hidden{grid-template-columns:var(--shelf-width,248px) minmax(320px,1fr)}
  .shelf .brand{flex-wrap:wrap}.shelf .brand small{margin-top:0}
}
@media(max-width:850px){.panel-resizer{display:none}}

/* ---------- Phone (≤700px): full-screen vertical mind map, slide-out shelf, bottom sheet ---------- */
.phone-only{display:none}
#scrim[hidden]{display:none}
#world.animating{transition:transform .3s ease}
@media(max-width:700px){
  .phone-only{display:inline-flex}
  body,body.reader-hidden{grid-template-columns:minmax(0,1fr)}
  .panel-resizer{display:none!important}
  header{height:auto;min-height:54px;padding:6px 10px;padding-top:calc(6px + env(safe-area-inset-top));gap:8px}
  header>div{flex:1}
  header .eyebrow{display:none}
  h1{font-size:15px;margin:0}
  #open-shelf{width:40px;height:40px;align-items:center;justify-content:center;font-size:18px;padding:0;flex-shrink:0}
  #open-chat{height:36px;align-items:center;padding:0 13px;font-size:12px;background:#395f48;color:#fff;border-color:#395f48;border-radius:18px;white-space:nowrap;flex-shrink:0}
  .map-toolbar{min-height:0;padding:6px 10px;flex-wrap:nowrap;gap:8px}
  .map-toolbar strong{display:none}
  .map-toolbar #stats{margin-left:0;white-space:nowrap}
  .actions{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
  .actions button{padding:7px 9px;font-size:11px;white-space:nowrap}
  #reader-toggle,main>footer,.canvas-label{display:none}
  .map-hint{bottom:calc(16px + env(safe-area-inset-bottom));left:12px;max-width:none}
  .zoom{bottom:calc(10px + env(safe-area-inset-bottom));right:10px}
  .zoom button{min-width:40px;min-height:40px}

  /* Vertical tree nodes: compact, two-line titles, finger-sized fold target. */
  .map-vertical .node,.map-vertical .node.root{width:148px;height:52px;min-height:0}
  .map-vertical .node .node-title{font-size:11.5px;line-height:1.4;padding:7px 4px 7px 10px}
  .map-vertical .node .fold{width:24px;height:24px;margin-right:6px;position:relative}
  .map-vertical .node .fold::after{content:"";position:absolute;inset:-10px}
  .map-vertical .node small{margin-right:8px}
  .map-vertical .node.leaf{border-left-width:1px;border-top:3px solid var(--branch)}

  /* Shelf becomes a left drawer. */
  body>.shelf{position:fixed;top:0;left:0;bottom:0;height:auto;width:min(300px,84vw);z-index:30;transform:translateX(-102%);transition:transform .25s ease;padding:calc(18px + env(safe-area-inset-top)) 14px calc(14px + env(safe-area-inset-bottom))}
  body.shelf-open>.shelf{transform:none;box-shadow:10px 0 40px #263e3524}
  #scrim{position:fixed;inset:0;background:#1a2a2147;z-index:25}

  /* Reading / chat panel becomes a bottom sheet: half (default) or full height. Keep 44% in sync with mobile.mjs. */
  body>.reader{position:fixed;left:0;right:0;width:auto;bottom:auto;top:44vh;top:44dvh;height:56vh;height:56dvh;z-index:20;border:0;border-radius:16px 16px 0 0;box-shadow:0 -10px 40px #263e3528;display:flex;transition:top .28s ease,height .28s ease}
  body.sheet-full>.reader{top:calc(var(--vv-top,0px) + 6px);height:calc(var(--vvh,100dvh) - 6px)}
  body.reader-hidden>.reader{display:flex;top:100vh;top:100dvh;visibility:hidden;transition:top .28s ease,height .28s ease,visibility 0s .28s}
  body.sheet-dragging>.reader{transition:none;height:100dvh}
  #sheet-handle{display:flex;justify-content:center;padding:9px 0 3px;cursor:grab;touch-action:none;flex-shrink:0}
  #sheet-handle span{width:40px;height:5px;border-radius:3px;background:#cfd8c8}
  .reader-top{height:46px;touch-action:none}
  #breadcrumbs{padding:9px 18px;max-height:56px}
  .reader-scroll{padding:16px 18px calc(28px + env(safe-area-inset-bottom))}
  .reader h2{font-size:19px;margin:8px 0 16px}
  .reader-foot{display:none}
  .rag-heading{padding:12px 18px}
  #chat-log{padding:16px}
  #rag-form{padding:10px 14px calc(10px + env(safe-area-inset-bottom))}
  #rag-input{min-height:52px}
  #rag-storage{display:none}
}

/* 账号区与登录弹窗 */
.account{display:flex;align-items:center;gap:9px;margin-top:14px;padding:11px 10px;border:1px solid #dde4d8;border-radius:9px;background:#fbfcf9}
.account-avatar{flex-shrink:0;width:30px;height:30px;border-radius:50%;background:#728f61;color:#fff;font-size:11px;display:grid;place-items:center;font-weight:600}
.account-info{flex:1;min-width:0;line-height:1.4}.account-info strong{display:block;font-size:12px;font-weight:550;color:#2e553b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.account-info small{display:block;font-size:10px;color:#8a978b}
.account-action{flex-shrink:0;font-size:11px;padding:5px 9px}.account-action.primary{background:#395f48;border-color:#395f48;color:#fff}.account-action.primary:hover{background:#2e4f3b}
.account+.shelf-foot{padding-top:16px}
#login-dialog{width:min(380px,92vw);padding:32px 30px 26px;color:#263d37}
#login-dialog button{position:static}
#login-form{display:flex;flex-direction:column}
#login-dialog h2{font-size:22px;font-weight:600;color:#2b4835;margin:10px 0 18px}
#login-dialog label{font-size:12px;color:#6b7b67;margin:12px 0 6px}
#login-dialog input{border:1px solid #dde4d8;border-radius:8px;padding:11px 12px;font-size:15px;outline:0;background:#fff}
#login-dialog input:focus{border-color:#88a977;box-shadow:0 0 0 3px #88a97722}
#login-dialog .login-close{position:absolute;right:12px;top:12px;border:0;background:none;color:#a8b09e;font-size:15px}
.login-reason{margin:-6px 0 6px;padding:9px 11px;border-radius:7px;background:#f3f6ee;color:#5f7552;font-size:12px}
.login-hint{margin:7px 0 0;font-size:11px;color:#9aa58f}
.login-error{min-height:18px;margin:10px 0 4px;font-size:12px;color:#b5523b}
#login-dialog .login-submit{padding:11px;font-size:14px;background:#395f48;border-color:#395f48;color:#fff}
#login-dialog .login-submit:hover{background:#2e4f3b}#login-dialog .login-submit:disabled{opacity:.6;cursor:wait}
.login-note{margin:12px 0 0;text-align:center;font-size:11px;color:#9aa58f}
@media(max-width:700px){#login-dialog input{font-size:16px}}

/* 书架筛选与收藏 */
.shelf-filter{display:flex;gap:4px;margin:-4px 0 12px;padding:3px;background:#e7ece2;border-radius:8px}
.shelf-filter button{flex:1;border:0;background:transparent;font-size:11px;padding:6px 4px;color:#73826d;border-radius:6px}
.shelf-filter button.active{background:#fff;color:#2e553b;box-shadow:0 1px 3px #2c432d14;font-weight:550}
#fav-count{font-size:10px;color:#9aa58f;margin-left:2px}
.book-row{position:relative}.book-row .book{padding-right:34px}
.fav{position:absolute;top:12px;right:6px;width:26px;height:26px;padding:0;border:0;background:none;color:#b3bea9;font-size:15px;line-height:26px;border-radius:50%}
.fav:hover{background:#e3ebdc;color:#7d9a69}.fav.on{color:#d39b2a}.fav.on:hover{color:#b98318}
@media(max-width:700px){.fav{width:36px;height:36px;line-height:36px;top:10px;right:2px}}

/* Clickable breadcrumbs in reader panel */
#breadcrumbs{font-size:13px;font-weight:600;line-height:1.8;color:#6f8466;padding:14px 28px;max-height:96px}
#breadcrumbs .crumb{border:0;background:none;padding:2px 5px;margin:0 -1px;border-radius:5px;font:inherit;color:#5f7d55;cursor:pointer;transition:.15s}
#breadcrumbs button.crumb:hover{background:#ecf3e9;color:#2e553b;text-decoration:underline;text-underline-offset:3px}
#breadcrumbs .crumb.current{color:#2b4835;font-weight:700;cursor:default;padding:2px 5px}
#breadcrumbs .crumb-sep{color:#b3bda9;margin:0 3px;font-weight:400}
@media(max-width:850px){#breadcrumbs{font-size:12px;padding:9px 16px;max-height:64px}}
