/* Public content pages: subjects, courses, topics, route figures, search, about, legal, errors.
   Surfaces are tonal, lists are hairline rows, nothing is outlined. */
.page-head { padding-block: var(--sp-6) var(--sp-5); }
.page-head h1 { font-size: clamp(1.9rem, 1.3rem + 2.4vw, 3rem); max-width: 24ch; }
.prose p, .prose li { color: var(--text-2); }
.prose h2 { margin-top: var(--sp-7); font-size: 1.35rem; }
.prose-wide { max-width: 980px; }
.section-end { padding-bottom: var(--sp-7); }
.field-h { font-size: 1.05rem; margin: var(--sp-6) 0 var(--sp-2); color: var(--text-2); }
.course-list, .topic-list { list-style: none; padding: 0; margin: 0; }
.course-list li, .topic-list li { display: grid; grid-template-columns: 1fr auto; gap: 2px var(--sp-4); padding: var(--sp-3) 0; border-top: 1px solid var(--line); align-items: baseline; }
.course-list a, .topic-list a { text-decoration: none; color: var(--text); font-weight: 600; }
.course-list a:hover, .topic-list a:hover { color: var(--accent-text); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: .2em; }
.topic-list small { grid-column: 1; }
.topic-list .tag { grid-column: 2; grid-row: 1 / span 2; align-self: center; }

/* Search */
.search-form { margin-top: var(--sp-4); }
.search-form .input { max-width: 420px; flex: 1 1 260px; }
.search-results { margin-top: var(--sp-5); }

/* Topic page */
.topic-page { padding-block: var(--sp-5) var(--sp-8); }
.topic-page h1 { font-size: clamp(1.8rem, 1.3rem + 2.2vw, 2.8rem); max-width: 26ch; margin-top: var(--sp-3); }
.facts { margin-top: var(--sp-4); }
.topic-grid { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: var(--sp-7); margin-top: var(--sp-5); align-items: start; }
@media (max-width: 960px) { .topic-grid { grid-template-columns: minmax(0, 1fr); gap: var(--sp-5); } }
.side { display: grid; gap: var(--sp-4); }
.side__box { padding: var(--sp-4); }
.side__box h2 { font-size: .95rem; margin-bottom: var(--sp-2); }
.side__link { margin: var(--sp-2) 0 0; }
.side__cta { margin: var(--sp-4) 0 0; }
.res li { padding: var(--sp-2) 0; border-top: 1px solid var(--line); }

/* Route band on a topic page: full width under the two columns, so the chain is not cut off. */
.route-band { margin-top: var(--sp-7); }
.route-band h2 { font-size: 1.35rem; margin: 0; }

/* Route figure: the prerequisite chain of one goal, read left to right. The domain hue rings each node;
   the goal is the bone node. Labels appear on hover and focus, and always on touch screens. */
.route { margin: var(--sp-4) 0 0; background: var(--surface); border-radius: var(--r-lg); overflow: hidden; }
.route__bar { display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-5); padding: var(--sp-3) var(--sp-4); font: 500 .88rem/1.3 var(--font-ui); color: var(--text-3); }
.route__bar b { color: var(--text); font-weight: 600; }
.route__fig { padding: var(--sp-2) var(--sp-3) var(--sp-3); overflow-x: auto; }
.route svg { width: 100%; min-width: 760px; height: auto; }
.route .edge { fill: none; stroke: var(--text-3); stroke-width: 1.4; stroke-opacity: .6; }
.route .node circle { fill: var(--bg); stroke: var(--c, var(--text-3)); stroke-width: 2; transition: r .15s var(--ease); }
.route .node[data-dom="mth"] { --c: var(--dom-mth); }
.route .node[data-dom="phy"] { --c: var(--dom-phy); }
.route .node[data-dom="aiml"] { --c: var(--dom-aiml); }
.route .node.is-goal circle { fill: var(--accent); stroke: var(--accent-strong); }
.route .node a:hover circle, .route .node a:focus-visible circle { r: 8; fill: var(--c, var(--text-3)); }
.route .node text { font: 500 12px var(--font-ui); fill: var(--text-2); paint-order: stroke; stroke: var(--surface); stroke-width: 4px; opacity: 0; pointer-events: none; transition: opacity .12s; }
.route .node a:hover text, .route .node a:focus-visible text, .route .node.is-goal text { opacity: 1; }
@media (hover: none) { .route .node text { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .route .node circle, .route .node text { transition: none; } }
.route__cap { margin: 0; padding: 0 var(--sp-4) var(--sp-4); color: var(--text-2); font-size: .92rem; }

/* Error and offline pages */
.page-empty { padding-block: var(--sp-9) var(--sp-7); }
.page-empty .btn { margin-top: var(--sp-2); }
.error-detail { padding: var(--sp-4); overflow: auto; white-space: pre-wrap; font-size: .85rem; color: var(--text-2); margin-bottom: var(--sp-4); }

/* About: how the engine decides, as four tonal cards; Aporia Systems on a violet-tinted panel. */
.about-how { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }
.about-how li { padding: var(--sp-4); border-radius: var(--r-lg); background: var(--surface); color: var(--text); }
@media (max-width: 640px) { .about-how { grid-template-columns: minmax(0, 1fr); } }
.about-parent { margin-top: var(--sp-7); padding: var(--sp-5); }
.about-parent h2 { margin-top: 0; }
.prose .about-parent p { margin: 0; color: var(--text); }
