.starfield circle{fill:#ffffff;opacity:.7;}
@keyframes twinkle{0%,100%{opacity:.2}50%{opacity:1}}
#skyLayer{pointer-events:none;}
#blackHoleLayer,#ambientAtomsLayer,#deletionAnimLayer{pointer-events:none;} /* 3.1/3.2/3.4: nunca interceptan clic/drag, nunca seleccionables */
.astronaut-hit{cursor:pointer;}
.node-label{font-size:12px;fill:var(--text);pointer-events:none;font-weight:600;text-shadow:0 1px 3px #000;}
.node-sub{font-size:9px;fill:var(--dim);pointer-events:none;letter-spacing:.5px;}
.node-circle{cursor:pointer;}
.node-circle.selected{stroke:var(--accent);stroke-width:2px;}
.node-hit{fill:transparent;cursor:pointer;}
.toolbtn{cursor:pointer;}
.toolbtn circle{fill:var(--surface);stroke:var(--line);stroke-width:1;}
.toolbtn:hover circle{fill:var(--plum);stroke:var(--accent);}
.toolbtn text{fill:var(--text);font-size:11px;text-anchor:middle;dominant-baseline:central;pointer-events:none;font-weight:700;}
.linkpath{stroke:#4a5164;stroke-width:1.3;fill:none;opacity:.85;}
.linkpath.temp{stroke:var(--accent);stroke-dasharray:4 4;}
/* A4: foco contextual — atenúa capas completas (grupos persistentes, no por-nodo) y hace
   brillar el foco/vecinos mediante capas superpuestas que se muestran/ocultan con opacity.
   Los grupos base y de superposición son elementos SVG estables entre frames: solo su
   CONTENIDO se reconstruye cada frame, así que su propio opacity sí puede transicionar. */
#nodes, #links, #nebulosas, #labels{transition:opacity .22s ease;}
#linksFocus, #nodesFocus, #labelsFocus{opacity:0;transition:opacity .22s ease;pointer-events:none;}
#world.focus-active #nodes, #world.focus-active #links,
#world.focus-active #nebulosas, #world.focus-active #labels{opacity:.25;}
#world.focus-active #linksFocus, #world.focus-active #nodesFocus, #world.focus-active #labelsFocus{opacity:1;}
.glowfilter{filter:url(#soft-glow);}
