/* All geometry is shared. Skins only change paint, never dimensions or typography. */
.graph-bar{display:flex;align-items:center;gap:18px;height:44px;min-height:44px;flex-shrink:0;margin-bottom:8px}.graph-switch{display:flex;flex-shrink:0}.graph-switch button{font-size:14px;padding:5px 12px;border:1px solid #ccc}.graph-switch button+button{border-left:0}.graph-switch button[aria-pressed=true]{color:#fff;background:#222;border-color:#222}.graph-context{font-size:13px;color:#555;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.graph-help{margin-left:auto;position:relative;flex-shrink:0;font-size:13px;color:#666}.graph-help summary{cursor:pointer;list-style:none;padding:6px}.graph-help[open]>div{position:absolute;right:0;top:36px;width:295px;padding:18px;background:#fff;border:1px solid #ccc;box-shadow:0 5px 22px #0001;z-index:25;line-height:1.9;color:#333}.map-desk{display:flex;flex:1;min-height:0;min-width:0;border:1px solid #ddd;overflow:hidden}.map-canvas{position:relative;flex:1;min-width:0;min-height:0;background:#fff}.map-reading .map-window{position:absolute;inset:0;height:100%;width:100%;overflow:clip;border:0;background:#fff;touch-action:none;user-select:none;cursor:grab;outline-offset:-3px}.map-window.is-dragging{cursor:grabbing}.map-window .map-stage{position:absolute;left:0;top:0;display:flex;align-items:flex-start;gap:104px;padding:32px 80px 120px;width:max-content;transform-origin:0 0;isolation:isolate;will-change:transform}.map-stage .map-column{position:relative;width:292px;pointer-events:none}.map-stage .map-column h3{font:500 20px/1.6 'Noto Serif TC',serif;min-height:32px;color:#222}.map-stage .map-school{position:relative;border:1px solid transparent;background:transparent;box-shadow:none;margin:22px 0 0;padding:12px 10px;pointer-events:none}.map-stage.group-layout .map-school{border-color:#c8c8c8;background:#fafafa}.map-stage .map-school-title{position:relative;pointer-events:auto;display:block;width:100%;min-height:32px;font-size:13px;line-height:1.5;font-weight:400;letter-spacing:0;text-align:left;color:#555;border:0;border-bottom:1px solid #ddd;padding:0 0 8px 24px;margin:0 0 10px;background:transparent}.map-stage .map-person,.map-stage .map-person.selected{position:relative;display:flex;align-items:center;pointer-events:auto;min-height:66px;width:100%;padding:10px 6px 10px 28px;margin:6px 0;border:1px solid transparent;background:transparent;color:#171717;line-height:1.5;text-align:left;border-radius:0;opacity:1}.map-stage .graph-label{display:block;position:relative;background:#fff;padding:2px 4px;min-width:0;color:#171717}.map-stage .map-person strong{display:block;font-size:15px;line-height:1.55;font-weight:500;letter-spacing:0;color:#171717;background:transparent;overflow-wrap:anywhere;box-shadow:none}.map-stage .map-person small{display:block;font:12px/1.5 'Noto Sans TC',sans-serif;color:#666;margin-top:3px;background:transparent;box-shadow:none}.map-stage .graph-dot{display:block;position:absolute;left:0;top:calc(50% - 5px);width:10px;height:10px;border:1.5px solid #555;border-radius:50%;background:#fff}.map-stage .map-person.graph-current .graph-dot{background:#171717;border-color:#171717;box-shadow:0 0 0 4px #fff,0 0 0 5px #171717}.map-stage .map-person.graph-current .graph-label{outline:1px solid #222;outline-offset:3px}.map-stage .graph-neighbor .graph-dot{border:2px solid #222;background:#fff}.map-stage .map-person:hover .graph-label{outline:1px solid #aaa;outline-offset:3px}.map-stage.group-layout .map-person{border-color:#e4e4e4;background:#fff}.map-stage .map-lines{position:absolute;inset:0;overflow:visible;pointer-events:none;z-index:0}.map-lines .graph-edge{pointer-events:none}.map-lines .edge-ink{fill:none;stroke:#8c8c8c;stroke-width:1.15;opacity:.5}.map-lines .edge-hit{fill:none;stroke:transparent;stroke-width:13;opacity:1;pointer-events:stroke;cursor:pointer}.map-lines .debate .edge-ink{stroke-dasharray:5 5}.map-lines marker path{fill:#555;stroke:none;opacity:1}.graph-focused .graph-edge:not(.graph-primary) .edge-ink{opacity:.12}.map-lines .graph-primary .edge-ink,.map-lines .graph-edge:hover .edge-ink,.map-lines .graph-edge:focus .edge-ink{stroke:#222;stroke-width:2.2;opacity:1}.map-stage .map-column{z-index:1}.map-zoom{position:absolute;right:14px;bottom:16px;display:flex;flex-direction:column;background:#fff;border:1px solid #ccc;box-shadow:0 2px 8px #0001;z-index:4}.map-zoom button{border:0;border-bottom:1px solid #ddd;padding:7px 4px;width:48px;min-height:36px;font-size:17px}.map-zoom button:last-child{border:0;font-size:13px}.map-zoom [data-camera=actual]{font-size:12px}.graph-minimap{position:absolute;bottom:16px;left:16px;width:176px;height:70px;padding:4px;border:1px solid #ccc;background:#ffffffed;box-shadow:0 2px 8px #0001;z-index:4;cursor:crosshair;touch-action:none}.graph-minimap .overview-column{fill:#eee;stroke:#aaa;stroke-width:4}.graph-minimap circle{fill:#777}.graph-minimap .overview-viewport{fill:#1111;stroke:#222;stroke-width:12}.canvas-hint{position:absolute;left:16px;bottom:91px;font-size:12px;color:#666;background:#fffe;padding:1px 4px;pointer-events:none}.graph-page .workspace-head{min-height:34px;height:34px}.graph-page .workspace-head .eyebrow{display:none}.graph-page .workspace h2{font-size:23px}.graph-page .workspace .selection-bar{height:42px;min-height:42px;max-height:42px;margin-bottom:8px}.graph-page .workspace .views{margin-top:6px;padding-bottom:6px}.graph-page .scope{height:24px;min-height:24px;max-height:24px;margin:5px 0}.graph-page .workspace{padding-top:10px}.graph-page .map-reading>footer{display:none}.graph-page .map-reading{padding-right:0;padding-bottom:10px}.map-desk #reader.map-reader{position:relative;inset:auto;margin:0;flex:0 0 370px;width:370px;max-width:43%;height:100%;max-height:100%;border:0;border-left:1px solid #ddd;box-shadow:none;overflow:auto;z-index:5}.map-reader .reader-tools{padding:10px 14px;gap:5px}.map-reader #reader-body{padding:20px 20px 40px}.map-reader #reader-body .profile-intro h2{font-size:25px}.map-reader #reader-body .profile-photo{width:80px;margin-left:12px}.map-reader #reader-body .profile-photo img{width:80px;height:104px}.map-reader .profile-tabs{top:54px}.map-reader .profile-tabs button{font-size:13px;padding:7px 9px}.relationship-pair{display:flex;gap:8px;align-items:center;margin:22px 0}.relationship-pair button{flex:1;padding:10px;font-size:14px}@media(max-width:850px){.graph-context{display:none}.map-desk #reader.map-reader{flex-basis:320px;max-width:48%}.graph-help{font-size:12px}}@media(max-width:600px){.graph-bar{gap:6px;height:38px;min-height:38px}.graph-switch button{font-size:13px;padding:5px 8px}.graph-page .workspace-head{height:30px;min-height:30px}.graph-page .workspace h2{font-size:20px}.graph-minimap{width:110px;height:48px;left:8px;bottom:8px}.canvas-hint{display:none}.map-zoom{right:8px;bottom:8px}.map-zoom button{width:38px;min-height:32px;padding:4px}.map-desk.has-reader{flex-direction:column}.map-desk #reader.map-reader{width:100%;max-width:100%;flex:0 0 52%;height:52%;border-left:0;border-top:1px solid #ccc}.graph-help[open]>div{width:260px}.graph-page .scope .draft{display:none}}
/* The outer document can scroll; the graph and reader retain independent gestures. */
html{height:auto;min-height:100%;overflow-y:auto;overflow-x:hidden}body{height:auto;min-height:100dvh;overflow:visible}.app{flex:none;height:calc(100dvh - 80px);min-height:650px}.graph-expand{margin-left:auto;flex-shrink:0;font-size:13px;padding:5px 9px;border:1px solid #ddd}.graph-help{margin-left:0}.graph-expanded{overflow:hidden}.graph-expanded .workspace{position:fixed;inset:0;z-index:30;height:100dvh;background:white;padding:12px 20px}.graph-expanded .workspace .selection-bar,.graph-expanded .workspace-head,.graph-expanded .scope{display:none}.graph-expanded .content-scroll{height:auto;min-height:0}.graph-expanded .views{margin-top:0}.graph-expanded .graph-bar{margin-bottom:8px}@media(max-width:850px){.app{min-height:700px}}@media(max-width:600px){.app{display:block;height:auto;min-height:0}.filters{height:auto;max-height:180px;overflow-y:auto}.workspace{height:auto;min-height:0;padding-bottom:16px}.workspace .content-scroll{flex:none;height:76svh;min-height:470px}.graph-page .content-scroll{height:80svh;min-height:500px}.graph-page .map-desk{min-height:0}.graph-expand{font-size:12px;padding:5px 6px}.graph-help summary{font-size:0;padding:5px}.graph-help summary:after{content:'?';font-size:14px}.graph-help[open]>div{right:0;font-size:13px}.graph-expanded .workspace{padding:8px}.graph-expanded .workspace .content-scroll{flex:1;height:auto;min-height:0}.graph-expanded .map-desk{min-height:0}}
.graph-minimap{left:auto;right:14px;top:14px;bottom:auto;width:150px;height:54px}.canvas-hint{bottom:12px;left:12px}.map-desk.has-reader .graph-minimap{width:110px;height:42px}@media(max-width:600px){.graph-minimap{right:8px;top:8px;width:96px;height:36px}}
/* Selection uses paint/transform only, preserving the shared layout and camera. */
.map-stage.group-layout .map-school{border-color:transparent;background:transparent}
.map-stage.group-layout .map-person{border-color:transparent;background:transparent}
.map-stage.group-layout .map-lines{display:none}
.map-stage.group-layout .graph-dot{visibility:hidden}
.map-stage .map-person.graph-current .graph-label,.map-stage .map-person:hover .graph-label{outline:none}
.map-stage .map-person.graph-current .graph-dot{background:#171717;border-color:#171717;box-shadow:none}
.map-stage .graph-neighbor .graph-dot{border-width:1.5px}
.map-stage.node-layout .map-person.graph-current strong{transform:scale(1.08);transform-origin:left center}
.map-stage.group-layout .map-person.graph-current .graph-label{background:#222;color:#fff}
.map-stage.group-layout .map-person.graph-current strong,.map-stage.group-layout .map-person.graph-current small{color:#fff}
.map-stage .graph-edge:focus,.map-stage .graph-edge:focus-visible{outline:none}
.map-stage .map-person:focus-visible{outline:none}
.map-stage .map-person:focus-visible strong{text-decoration:underline;text-underline-offset:4px}
/* Repaint text at its actual zoom resolution instead of scaling a composited bitmap. */
.map-window .map-stage{will-change:transform;transform-origin:0 0}
.map-stage .map-person strong{line-height:24px}
.map-stage.node-layout .map-person.graph-current strong{transform:none;font-size:16px}
.map-stage.group-layout .map-school{border-color:#c8c8c8;background:#fafafa}
.map-stage.group-layout .map-person{border-color:#e4e4e4;background:#fff}
.map-stage.group-layout .map-person.graph-current{background:#222;border-color:#222;color:#fff}
.map-stage.group-layout .map-person.graph-current .graph-label{background:transparent}
.map-stage.group-layout .map-person.graph-current strong{font-size:16px}
.map-lines .edge-ink{stroke:#626262;stroke-width:1.5;opacity:.8;vector-effect:non-scaling-stroke;shape-rendering:geometricPrecision}
.map-lines .debate .edge-ink{stroke-dasharray:none}
.map-lines .graph-incoming .edge-ink{stroke-dasharray:6 5}
.map-lines .graph-outgoing .edge-ink{stroke-dasharray:none}
.map-lines .graph-primary .edge-ink{stroke:#171717;stroke-width:2;opacity:1}
.map-lines marker path{fill:#222}
.map-desk #reader.map-reader{flex-basis:610px;width:min(610px,88vw);max-width:88vw}
.map-reader #reader-body{padding:28px 32px 60px}
.map-reader #reader-body .profile-intro h2{font-size:30px}
.map-reader #reader-body .profile-photo{width:116px;margin-left:24px}
.map-reader #reader-body .profile-photo img{width:116px;height:148px}
.map-reader .reader-tools{padding:16px 24px}
.map-reader .profile-tabs{top:68px}
.map-reader .profile-tabs button{font-size:14px;padding:8px 11px}
.profile-tabs button[aria-current=location]{background:#222;color:white}
#reader-body #profile-panel{padding-top:0}
#reader-body .profile-section{padding-top:28px;margin-top:30px;border-top:1px solid #ddd;scroll-margin-top:140px}
#reader-body .profile-section:first-child{margin-top:0}
#reader-body .profile-section>h3{font-size:19px;color:#222;font-family:'Noto Serif TC',serif}
#reader-body .profile-section:last-child{padding-bottom:180px}
@media(max-width:600px){.map-desk #reader.map-reader{flex-basis:60%;width:100%;max-width:100%;height:60%}.map-reader #reader-body{padding:26px 22px}.map-reader .reader-tools{padding:12px 16px}.map-reader .profile-tabs{top:60px}.map-reader #reader-body .profile-photo{width:88px;margin-left:15px}.map-reader #reader-body .profile-photo img{width:88px;height:116px}.map-reader #reader-body .profile-intro h2{font-size:25px}}
/* Node names alone are selectable; the row still supports dragging and keyboard access. */
.map-stage.node-layout .map-person{cursor:grab}
.map-stage.node-layout .map-person strong{width:fit-content;max-width:100%;cursor:pointer}
