@keyframes jm-halo{0%{opacity:.65;transform:scale(.94)}to{opacity:0;transform:scale(1.32)}}@keyframes jm-flow{to{stroke-dashoffset:-.2px}}@keyframes jm-edge-draw{0%{stroke-dashoffset:1px;opacity:.2}to{stroke-dashoffset:0;opacity:1}}@keyframes jm-unlock{0%{transform:scale(.88)}55%{transform:scale(1.07)}to{transform:scale(1)}}@keyframes jm-unlock-ring{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent)}to{box-shadow:0 0 0 22px #0000}}@keyframes jm-new-in{0%{opacity:0;translate:-50% 6px}to{opacity:1;translate:-50%}}.campus .jv-hero{align-items:end;gap:var(--sp-8);grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);min-height:240px;display:grid;position:relative}.campus .jv-art{z-index:-1;pointer-events:none;position:absolute;inset:0;overflow:hidden;-webkit-mask-image:linear-gradient(270deg,#000 20%,#0000 75%);mask-image:linear-gradient(270deg,#000 20%,#0000 75%)}.campus .jv-court{fill:none;width:52%;min-width:360px;stroke:var(--h-ink);stroke-width:1.4px;opacity:.16;position:absolute;top:-22%;right:-4%}.campus .jv-hero-main{gap:var(--sp-3);align-content:space-between;align-self:stretch;display:grid}.campus .jv-title{max-width:14ch;font-size:clamp(34px,4.4vw,52px);line-height:1.04;font-weight:var(--fw-d);margin-bottom:12px}.campus .jv-lead{max-width:44ch;margin:0;font-size:15.5px}.campus .jv-hero-side{gap:var(--sp-5);display:grid}.campus .jv-hero-prefs{position:absolute;top:16px;right:16px}.campus .jv-hero .ib{background:color-mix(in srgb, var(--h-ink) 10%, transparent);border-color:color-mix(in srgb, var(--h-ink) 22%, transparent);color:var(--h-ink)}.campus .ji{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.campus .ji-card{text-align:left;border-radius:var(--rm);border:1px solid var(--ln);background:var(--panel);color:var(--ink);transition:border-color var(--dur-2), background var(--dur-2), transform var(--dur-3) var(--ease);grid-template-columns:52px minmax(0,1fr);align-items:start;gap:14px;padding:16px;display:grid}.campus .ji-card:hover{border-color:color-mix(in srgb, var(--accent) 45%, var(--ln));transform:translateY(-1px)}.campus .ji-card.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, var(--panel));box-shadow:0 0 0 1px var(--accent), 0 10px 28px -14px color-mix(in srgb, var(--accent) 55%, transparent)}.campus .ji-ic{border:1px solid color-mix(in srgb, var(--accent) 45%, var(--ln));background:color-mix(in srgb, var(--accent) 8%, var(--panel-2));border-radius:50%;place-items:center;width:52px;height:52px;display:grid}.campus .ji-tx{gap:6px;min-width:0;display:grid}.campus .ji-top{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;display:flex}.campus .ji-top b{font-size:16px;font-family:var(--f-display);font-weight:var(--fw-d);letter-spacing:-.01em}.campus .ji-sum{color:var(--ink-2);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13.5px;display:-webkit-box;overflow:hidden}.campus .ji-bar{background:color-mix(in srgb, var(--ink) 13%, transparent);border-radius:2px;height:3px;margin-top:2px;overflow:hidden}.campus .ji-bar i{background:linear-gradient(90deg, var(--accent), var(--accent2));height:100%;display:block}.campus .ji-foot{color:var(--ink-2);font-size:12px}.campus .pill-ok{background:color-mix(in srgb, var(--ok) 18%, transparent)}.campus .jv-stage{gap:var(--sp-4);display:grid}.campus .jv-stage-head{justify-content:space-between;align-items:flex-start;gap:var(--sp-4);flex-wrap:wrap;display:flex}.campus .jv-it-title{margin-bottom:4px;font-size:22px}.campus .jm-wrap{gap:10px;display:grid}.campus .jm-bar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.campus .jm-help{color:var(--ink-2);max-width:64ch;font-size:12.5px}.campus .jm-ctrl{align-items:center;gap:6px;display:inline-flex}.campus .jm-zoom{text-align:center;min-width:52px;color:var(--ink-2);font-size:12px}.campus .jm-view{border-radius:var(--rm);border:1px solid var(--ln);touch-action:none;cursor:grab;-webkit-user-select:none;user-select:none;--ox:0px;--oy:0px;--zk:1;background-color:color-mix(in srgb, var(--panel-2) 55%, var(--c-bg));background-image:radial-gradient(circle, color-mix(in srgb, var(--ink) 20%, transparent) 1px, transparent 1.5px);background-size:calc(28px * var(--zk)) calc(28px * var(--zk));background-position:var(--ox) var(--oy);height:clamp(440px,64vh,640px);position:relative;overflow:hidden}.campus .jm-view.dragging{cursor:grabbing}.campus .jm-view:after{content:"";pointer-events:none;box-shadow:inset 0 0 70px 6px color-mix(in srgb, var(--c-bg) 62%, transparent);border-radius:inherit;position:absolute;inset:0}.campus .jm-loading{background-image:none;animation:1.4s ease-in-out infinite c-pulse}.campus .jm-world{transform-origin:0 0;will-change:transform;position:absolute;top:0;left:0}.campus .jm-world.smooth{transition:transform .34s var(--ease)}.campus .jm-edges{pointer-events:none;position:absolute;top:0;left:0;overflow:visible}.campus .jm-edge{fill:none;stroke-linecap:round;stroke-width:1.5px}.campus .jm-edge.k-done{stroke:var(--accent);opacity:.95}.campus .jm-edge.k-path{stroke:var(--accent);stroke-width:1.6px;stroke-dasharray:.02 .018;opacity:.85}.campus .jm-edge.k-open{stroke:color-mix(in srgb, var(--ink) 38%, transparent)}.campus .jm-edge.k-locked{stroke:color-mix(in srgb, var(--ink) 24%, transparent);stroke-dasharray:.012 .02}.campus .jm-view[data-fx=on] .jm-edge.k-path{animation:2.4s linear infinite jm-flow}.campus .jm-view[data-fx=on] .jm-edge.fresh{stroke-dasharray:1;animation:jm-edge-draw 1.4s var(--ease) both;stroke:var(--accent);opacity:1}.campus .jm-slot{flex-direction:column;align-items:center;gap:12px;display:flex;position:absolute}.campus .jm-node{color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:50%;flex:none;place-items:center;padding:0;display:grid;position:relative}.campus .jm-node:focus-visible{outline:2px solid var(--ring);outline-offset:6px;border-radius:50%}.campus .jm-ring{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.campus .jm-ring .body{fill:var(--panel);stroke:none}.campus .jm-ring .tr{fill:none;stroke:color-mix(in srgb, var(--ink) 30%, transparent);stroke-width:1.5px}.campus .jm-ring .pr{fill:none;stroke:var(--accent);stroke-width:2.6px;stroke-linecap:round;stroke-dasharray:100;stroke-dashoffset:calc(100 - var(--p,0));transform-origin:50%;transform:rotate(-90deg)}.campus .jm-ring polygon.body{fill:var(--panel);stroke:color-mix(in srgb, var(--ink) 34%, transparent);stroke-width:1.5px;stroke-linejoin:round}.campus .jm-ring polygon.inner{fill:none;stroke:color-mix(in srgb, var(--ink) 20%, transparent);stroke-width:1px;stroke-linejoin:round}.campus .jm-ic{transition:opacity var(--dur-2);place-items:center;display:grid;position:relative}.campus .jm-tag{border:2px solid var(--c-bg);border-radius:50%;place-items:center;width:22px;height:22px;display:grid;position:absolute;bottom:-4px;right:-4px}.campus .jm-tag .ic{stroke-width:2.6px;width:12px;height:12px}.campus .jm-tag.ok{background:var(--ok);color:var(--ok-ink)}.campus .jm-tag.lock{background:var(--panel-2);color:var(--ink-2);border-color:var(--c-bg)}.campus .jm-node[data-state=completed] .jm-ring .body{fill:color-mix(in srgb, var(--accent) 15%, var(--panel))}.campus .jm-node[data-state=completed] .jm-ring .tr{stroke:var(--accent)}.campus .jm-node[data-state=completed] .jm-ring polygon.body{fill:color-mix(in srgb, var(--accent) 22%, var(--panel));stroke:var(--accent)}.campus .jm-node[data-state=completed] .jm-ring polygon.inner{stroke:color-mix(in srgb, var(--accent) 60%, transparent)}.campus .jm-node[data-state=inprogress] .jm-ring .tr{stroke:color-mix(in srgb, var(--accent) 35%, transparent)}.campus .jm-node[data-state=inprogress] .jm-ring .pr{filter:drop-shadow(0 0 4px color-mix(in srgb, var(--accent) 55%, transparent))}.campus .jm-node[data-state=available] .jm-ring .tr{stroke:var(--accent);stroke-width:1.8px}.campus .jm-node[data-state=available] .jm-ring polygon.body{stroke:var(--accent)}.campus .jm-node[data-state=locked] .jm-ring .tr{stroke-dasharray:3 4.5;stroke:color-mix(in srgb, var(--ink) 34%, transparent)}.campus .jm-node[data-state=locked] .jm-ring polygon.body{stroke-dasharray:5 5}.campus .jm-node[data-state=locked] .jm-ic{opacity:.5}.campus .jm-node:hover .jm-ring .tr{stroke:var(--accent)}.campus .jm-node.sel{box-shadow:0 0 0 6px color-mix(in srgb, var(--accent) 22%, transparent)}.campus .jm-node.sel .jm-ring .tr,.campus .jm-node.sel .jm-ring polygon.body{stroke:var(--accent)}.campus .jm-node.next:before{content:"";border:1px solid var(--accent);opacity:.55;pointer-events:none;border-radius:50%;position:absolute;inset:-9px}.campus .jm-view[data-fx=on] .jm-node.next:before{animation:2.6s ease-out infinite jm-halo}.campus .jm-view[data-fx=on] .jm-node.fresh{animation:jm-unlock .8s var(--ease) both, jm-unlock-ring 1.4s ease-out .15s 2}.campus .jm-new{letter-spacing:.1em;text-transform:uppercase;background:var(--accent);color:var(--accent-ink);white-space:nowrap;animation:jm-new-in .4s var(--ease) .2s both;border-radius:99px;padding:2px 8px;font-size:10px;font-weight:700;position:absolute;top:-12px;left:50%;translate:-50%}.campus .jm-label{text-align:center;pointer-events:none;gap:2px;width:100%;padding:0 4px;display:grid}.campus .jm-kind{letter-spacing:.14em;text-transform:uppercase;color:var(--ink-2);font-size:10px;font-weight:600}.campus .jm-title{-webkit-line-clamp:2;text-wrap:balance;-webkit-box-orient:vertical;font-size:13.5px;font-weight:600;line-height:1.25;display:-webkit-box;overflow:hidden}.campus .jm-meta{color:var(--ink-2);font-size:11px}.campus .jm-slot[data-kind=capstone] .jm-title{font-family:var(--f-display);font-weight:var(--fw-d)}.campus .jm-legend{color:var(--ink-2);flex-wrap:wrap;gap:8px 20px;font-size:12.5px;display:flex}.campus .jm-legend li{align-items:center;gap:8px;display:inline-flex}.campus .jm-legend .lg{border:1.5px solid color-mix(in srgb, var(--ink) 34%, transparent);border-radius:50%;flex:none;width:14px;height:14px;display:inline-block}.campus .jm-legend .lg-completed{background:color-mix(in srgb, var(--accent) 30%, var(--panel));border-color:var(--accent)}.campus .jm-legend .lg-inprogress{border-color:color-mix(in srgb, var(--accent) 40%, transparent);background:conic-gradient(var(--accent) 0 60%, transparent 60%)}.campus .jm-legend .lg-available{border-color:var(--accent)}.campus .jm-legend .lg-locked{border-style:dashed}.campus .jm-legend .lg-hex{clip-path:polygon(25% 3%,75% 3%,100% 50%,75% 97%,25% 97%,0 50%);background:color-mix(in srgb, var(--ink) 30%, transparent);border:0;border-radius:3px}.campus .jv-side{top:calc(var(--header-h) + 12px);align-self:start;position:sticky}.campus .jp{gap:var(--sp-3);border-radius:var(--rb);background:var(--panel);border:1px solid var(--ln);padding:20px;display:grid}.campus .tile.jp{padding:20px}.campus .jp-head{align-items:flex-start;gap:14px;display:flex}.campus .jp-ic{border:1px solid color-mix(in srgb, var(--accent) 45%, var(--ln));background:color-mix(in srgb, var(--accent) 8%, var(--panel-2));border-radius:50%;flex:none;place-items:center;width:52px;height:52px;display:grid}.campus .jp-head-tx{flex:1;min-width:0}.campus .jp-kind{letter-spacing:.12em;text-transform:uppercase;color:var(--ink-2);flex-wrap:wrap;align-items:center;gap:8px;font-size:11px;font-weight:600;display:flex}.campus .jp-next{text-transform:none;letter-spacing:0;background:color-mix(in srgb, var(--accent) 20%, transparent);color:var(--ink);border-radius:99px;padding:2px 9px;font-size:11.5px;font-weight:600}.campus .jp-title{margin-top:3px;font-size:21px;line-height:1.15}.campus .jp-row{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.campus .jp-state{border:1px solid var(--ln);background:var(--panel-2);border-radius:99px;align-items:center;gap:7px;padding:3px 11px 3px 9px;font-size:12px;font-weight:600;display:inline-flex}.campus .jp-state i{border:1.5px solid var(--ink-2);border-radius:50%;width:8px;height:8px;display:inline-block}.campus .jp-state.s-completed{border-color:color-mix(in srgb, var(--ok) 55%, var(--ln))}.campus .jp-state.s-completed i{background:var(--ok);border-color:var(--ok)}.campus .jp-state.s-inprogress i{border-color:var(--accent);background:conic-gradient(var(--accent) 0 55%, transparent 55%)}.campus .jp-state.s-available{border-color:color-mix(in srgb, var(--accent) 55%, var(--ln))}.campus .jp-state.s-available i{border-color:var(--accent)}.campus .jp-state.s-locked i{border-style:dashed}.campus .jp-sum{color:var(--ink-2);max-width:52ch;font-size:14.5px}.campus .jp .bar2{height:4px;margin-top:0}.campus .jp-block{padding-top:var(--sp-3);border-top:1px solid color-mix(in srgb, var(--ln) 70%, transparent);gap:8px;display:grid}.campus .jp-req{gap:6px;display:grid}.campus .jp-req li{grid-template-columns:22px minmax(0,1fr) auto;align-items:center;gap:10px;font-size:14px;display:grid}.campus .jp-req-ic{border:1.5px solid color-mix(in srgb, var(--ink) 32%, transparent);border-radius:50%;place-items:center;width:20px;height:20px;display:grid}.campus .jp-req-ic .ic{stroke-width:2.6px;width:12px;height:12px}.campus .jp-req li.met .jp-req-ic{background:var(--ok);border-color:var(--ok);color:var(--ok-ink)}.campus .jp-req-st{color:var(--ink-2);font-size:12px}.campus .jp-crit{color:var(--ink-2);gap:4px;padding-left:1.1em;font-size:14px;list-style:outside;display:grid}.campus .jp-lessons{counter-reset:l;gap:2px;display:grid}.campus .jp-lessons li{grid-template-columns:24px minmax(0,1fr);align-items:center;gap:10px;padding:5px 0;font-size:14px;display:grid}.campus .jp-ldot{width:22px;height:22px;font-size:11px;font-family:var(--f-mono);color:var(--ink-2);border:1.5px solid color-mix(in srgb, var(--ink) 28%, transparent);border-radius:50%;place-items:center;display:grid}.campus .jp-ldot .ic{stroke-width:3px;width:12px;height:12px}.campus .jp-lessons li.d .jp-ldot{background:var(--ok);border-color:var(--ok);color:var(--ok-ink)}.campus .jp-lessons li.d{color:var(--ink-2)}.campus .jp-actions{padding-top:var(--sp-2);flex-wrap:wrap;align-items:center;gap:10px;display:flex}.campus .jp-lock-hint{flex-basis:100%}.campus .jp-empty{color:var(--ink-2)}.campus .jp-cap{gap:var(--sp-4);display:grid}.campus .jp-cap.done{color:var(--ink);border-radius:var(--rs);background:color-mix(in srgb, var(--ok) 14%, var(--panel-2));align-items:center;gap:10px;padding:10px 12px;font-weight:600;display:flex}.campus .jp-q{border:0;gap:8px;min-width:0;margin:0;padding:0;display:grid}.campus .jp-q legend{gap:2px;margin-bottom:4px;padding:0;font-size:14.5px;font-weight:600;display:grid}.campus .jp-opt{border:1px solid var(--ln);border-radius:var(--rs);background:var(--panel);cursor:pointer;min-height:var(--tap);align-items:center;gap:10px;padding:10px 12px;font-size:14px;display:flex}.campus .jp-opt:hover{border-color:color-mix(in srgb, var(--accent) 45%, var(--ln))}.campus .jp-opt:has(input:checked){border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.campus .jp-opt input{accent-color:var(--accent);flex:none;width:16px;height:16px}.campus .jp-opt.right{border-color:var(--ok);background:color-mix(in srgb, var(--ok) 12%, var(--panel))}.campus .jp-opt.wrong{border-color:var(--live);background:color-mix(in srgb, var(--live) 8%, var(--panel))}.campus .jp-fb{color:var(--ink-2);font-size:13.5px}.campus .jp-fb strong{color:var(--ink)}.campus .jp-cap-foot{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.campus .jp-result{font-size:14.5px;font-weight:600}.campus .jp-result.ok{color:var(--ink)}.campus .jl{gap:10px;display:grid}.campus .jl-item{border:1px solid var(--ln);border-radius:var(--rm);background:var(--panel);overflow:hidden}.campus .jl-item.next{border-color:color-mix(in srgb, var(--accent) 55%, var(--ln))}.campus .jl-main{grid-template-columns:auto auto minmax(0,1fr) auto;align-items:center;gap:14px;padding:14px 16px;display:grid}.campus .jl-n{color:var(--ink-2);font-size:12px}.campus .jl-ic{border:1px solid var(--ln);background:var(--panel-2);border-radius:50%;place-items:center;width:44px;height:44px;display:grid}.campus .jl-item.s-completed .jl-ic{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 14%, var(--panel-2))}.campus .jl-item.s-locked .jl-ic{opacity:.8;border-style:dashed}.campus .jl-kind{letter-spacing:.12em;text-transform:uppercase;color:var(--ink-2);flex-wrap:wrap;align-items:center;gap:8px;font-size:10.5px;font-weight:600;display:flex}.campus .jl-title{margin:2px 0 6px;font-size:17px}.campus .jl-meta{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.campus .jl-req{color:var(--ink-2);margin-top:6px;font-size:13px}.campus .jl-detail{padding:0 16px 16px}.campus .jl-detail .jp{background:var(--panel-2);border:0}@media (max-width:1100px){.campus .jv-hero{grid-template-columns:minmax(0,1fr)}.campus .jv-side{grid-column:span 12;grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;display:grid;position:static}}@media (max-width:760px){.campus .jv-side{grid-template-columns:minmax(0,1fr)}}@media (max-width:640px){.campus .jv-hero{gap:var(--sp-5);min-height:0}.campus .jv-title{padding-right:44px}.campus .jv-court{width:120%;right:-30%}.campus .ji{grid-template-columns:minmax(0,1fr)}.campus .jm-view{height:clamp(380px,62dvh,520px)}.campus .jl-main{grid-template-columns:auto minmax(0,1fr)}.campus .jl-n{display:none}.campus .jl-toggle{grid-column:1/-1;justify-self:start}.campus .jm-help{display:none}}@media (prefers-reduced-motion:reduce){.campus .jm-world.smooth{transition:none}.campus .jm-edge,.campus .jm-node,.campus .jm-node:before,.campus .jm-new,.campus .jm-loading{animation:none!important}}
