*,*:before,*:after{box-sizing:border-box}body{margin:0;min-height:100vh;font-family:var(--font-ui);font-size:16px;line-height:24px;color:var(--color-text);background:var(--color-canvas)}#root{min-height:100vh;display:flex;align-items:flex-start;justify-content:center;padding:48px 16px}#root:has(.app-shell){flex-direction:column;align-items:stretch;justify-content:flex-start;padding:0}.auth-page{width:100%;max-width:420px}.auth-card{background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:10px;padding:32px 24px}.auth-title{margin:0 0 8px;font-size:28px;line-height:36px;font-weight:600}.auth-form{margin-top:24px}.auth-field{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.auth-field label{font-size:14px;line-height:20px;font-weight:500}.auth-field input{min-height:var(--control-min-height);padding:10px 12px;border-radius:var(--radius-control);border:1px solid var(--color-border-control);background:var(--color-surface);font:inherit;color:var(--color-text)}.auth-field input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.auth-hint{font-size:13px;line-height:18px;color:var(--color-text-muted)}.auth-error{margin:0 0 16px;padding:12px;border-radius:var(--radius-control);background:var(--color-error-surface);color:var(--color-error-text);font-size:14px}.auth-submit{width:100%;min-height:var(--control-min-height);margin-top:8px;border:none;border-radius:var(--radius-control);background:var(--color-primary);color:var(--color-on-primary);font:inherit;font-size:16px;font-weight:500;cursor:pointer}.auth-submit:hover{background:var(--color-primary-hover)}.auth-submit:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.auth-switch{margin-top:16px;text-align:center;font-size:14px;color:var(--color-text-muted)}.auth-switch button{border:none;background:none;padding:0;font:inherit;color:var(--color-primary);text-decoration:underline;cursor:pointer;min-height:var(--control-min-height)}.session-card{display:flex;flex-direction:column;gap:16px}.session-email{margin:0;font-size:20px;line-height:28px;font-weight:600}.session-role{margin:0;color:var(--color-text-muted);font-size:14px}.app-shell{width:100%;max-width:none;margin:0;padding-bottom:48px}.app-shell>:not(.app-bar){width:min(100% - 64px,1200px);margin-left:auto;margin-right:auto}.app-bar{position:sticky;top:0;z-index:20;width:100%;margin:0 0 32px;padding:0 32px;background:var(--color-surface);border-bottom:1px solid var(--color-border-subtle)}.app-bar-inner{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;column-gap:24px;row-gap:0;width:min(100%,1200px);min-height:64px;margin-inline:auto;padding-block:8px}.app-bar-start{display:flex;flex-wrap:wrap;align-items:center;gap:4px 28px;min-width:0}.app-bar-brand{margin:0;font-family:var(--font-ui);font-size:16px;line-height:24px;font-weight:600;letter-spacing:.08em;color:var(--color-text)}.app-bar-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:4px 8px;margin-left:auto;min-width:0}.app-bar-identity{display:flex;align-items:baseline;gap:8px;min-width:0;margin:0;font-size:13px;line-height:18px;color:var(--color-text-muted)}.app-bar-identity-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.app-bar-email{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:28ch}.text-link{border:none;background:none;padding:0;font:inherit;color:var(--color-primary);text-decoration:underline;cursor:pointer;min-height:var(--control-min-height)}.app-banner{max-width:720px;margin:0 0 16px}.app-notice{margin:0 0 16px;padding:12px;border-radius:var(--radius-control);background:var(--color-success-surface);color:var(--color-success-text);font-size:14px}.workspace{display:flex;flex-direction:column;gap:24px;width:100%}.workspace-header{display:flex;flex-direction:column;gap:8px}.workspace-title{margin:0;font-size:28px;line-height:36px;font-weight:600}.workspace-subtitle{margin:0;font-size:20px;line-height:28px;color:var(--color-text-muted)}.panel{background:var(--color-surface);border:1px solid var(--color-border-subtle);border-radius:10px;padding:24px;max-width:720px}.panel-title{margin:0 0 16px;font-size:20px;line-height:28px;font-weight:600}.panel-hint{margin:0 0 16px;font-size:14px;color:var(--color-text-muted)}.inline-form,.stack-form{display:flex;flex-direction:column;gap:12px}.inline-form{flex-direction:row;flex-wrap:wrap;align-items:center}.inline-form input,.stack-form input,.stack-form textarea{flex:1;min-width:200px;min-height:var(--control-min-height);padding:10px 12px;border-radius:var(--radius-control);border:1px solid var(--color-border-control);background:var(--color-surface);font:inherit;color:var(--color-text)}.stack-form textarea{min-height:80px;resize:vertical}.block-picker{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.block-chip{min-height:var(--control-min-height);padding:8px 12px;border-radius:var(--radius-control);border:1px solid var(--color-border-control);background:transparent;font:inherit;font-size:14px;cursor:pointer}.block-chip--active{border-color:var(--color-primary);background:var(--color-success-surface);color:var(--color-success-text);font-weight:500}.program-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.program-open{width:100%;text-align:left;min-height:var(--control-min-height);padding:12px 16px;border-radius:var(--radius-control);border:1px solid var(--color-border-subtle);background:var(--color-surface);font:inherit;font-size:16px;cursor:pointer}.program-open:hover{border-color:var(--color-border-control)}.workspace--roadmap,.roadmap{max-width:640px}.roadmap-block{margin-bottom:32px}.roadmap-heading{display:flex;flex-wrap:wrap;align-items:center;gap:0 16px}.roadmap-block-title{margin:0;font-size:20px;line-height:28px;font-weight:600}.roadmap-heading .roadmap-block-title,.roadmap-heading .roadmap-node-title{display:flex;align-items:center;flex:0 1 auto;min-width:0;min-height:var(--control-min-height)}.roadmap-disclosure{display:inline-flex;align-items:center;gap:8px;max-width:100%;min-height:var(--control-min-height);margin:0;padding:0 4px 0 0;border:0;border-radius:var(--radius-control);background:transparent;color:inherit;font:inherit;font-weight:inherit;line-height:inherit;text-align:left;cursor:pointer}.roadmap-disclosure:hover{color:var(--color-primary)}.roadmap-disclosure:focus-visible,.roadmap-lesson-link:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.roadmap-chevron{flex:0 0 auto;color:var(--color-primary)}.roadmap-chevron--open{transform:rotate(90deg)}@media (prefers-reduced-motion: no-preference){.roadmap-chevron{transition:transform .18s ease}}.roadmap-lesson-link{flex:0 0 auto;width:auto;min-height:var(--control-min-height);padding:0 2px;background:transparent;white-space:nowrap}.roadmap-spine{border-left:2px solid var(--color-border-subtle);margin-left:8px;padding-left:24px;display:flex;flex-direction:column;gap:24px}.roadmap-node{position:relative}.roadmap-node-marker{position:absolute;left:-33px;top:16px;width:12px;height:12px;border-radius:50%;background:var(--color-primary);border:2px solid var(--color-surface);box-shadow:0 0 0 2px var(--color-border-subtle)}.roadmap-node-title{margin:0;font-size:16px;line-height:24px;font-weight:600}.roadmap-node-title--capstone{min-height:var(--control-min-height);display:flex;align-items:center}.roadmap-assignments{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.roadmap-node-body .roadmap-assignments{margin-top:4px}.roadmap-assignment-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px;margin:0}.roadmap-assignment-name{font-size:15px;line-height:24px}.status-pill{display:inline-flex;align-items:center;min-height:28px;padding:4px 10px;border-radius:999px;font-size:13px;line-height:18px;font-weight:500;border:1px solid transparent}.status-pill--locked{background:var(--color-warning-surface);color:var(--color-warning-text);border-color:var(--color-border-subtle)}.status-pill--available{background:var(--color-info-surface);color:var(--color-info-text);border-color:var(--color-border-subtle)}.status-pill--passed{background:var(--color-success-surface);color:var(--color-success-text);border-color:var(--color-border-subtle)}.status-pill--pending{background:var(--color-warning-surface);color:var(--color-warning-text);border-color:var(--color-border-subtle)}.status-pill--returned{background:var(--color-error-surface);color:var(--color-error-text);border-color:var(--color-border-subtle)}.assignment-sheet{max-width:720px}.assignment-description{margin:0 0 16px;white-space:pre-wrap;line-height:1.5}.collab-editor__meta{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.collab-status{color:var(--color-text-muted);font-size:14px}.collab-status--on{color:var(--color-success-text)}.presence-list{list-style:none;margin:0;padding:0;font-size:14px}.collab-editor__layout{display:block}.comment-rail{border:1px solid var(--color-border-subtle);border-radius:var(--radius-md, 8px);padding:12px;background:var(--color-surface)}.comment-compose{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}.comment-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.comment-item{font-size:14px}.comment-line{font-weight:600;display:block;margin-bottom:4px}.comment-quote{margin:0 0 6px;padding:6px 8px;background:var(--color-canvas);border-radius:4px;font-family:var(--font-family-code, ui-monospace, monospace);font-size:12px;white-space:pre-wrap}.play-output pre{margin:0 0 8px;padding:12px;border-radius:8px;background:#171d1a;color:#e8eee9;font-family:var(--font-family-code),ui-monospace,monospace;font-size:14px;line-height:22px;white-space:pre-wrap}.play-output__err{color:#f2a694}.code-textarea{width:100%;min-height:160px;font-family:var(--font-family-code, ui-monospace, monospace);font-size:14px;line-height:1.45;padding:12px;border:1px solid var(--color-border-subtle);border-radius:var(--radius-md, 8px);resize:vertical;box-sizing:border-box}.run-summary{margin:12px 0;font-weight:600}.run-summary--ok{color:var(--color-success-text)}.run-summary--fail{color:var(--color-warning-text)}.run-cases{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.run-case{border:1px solid var(--color-border-subtle);border-radius:var(--radius-md, 8px);padding:12px;font-size:14px}.run-case pre{margin:8px 0 0;padding:8px;background:var(--color-surface-muted, #f4f4f5);border-radius:4px;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.test-editor-row{display:flex;flex-direction:column;gap:8px;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--color-border-subtle)}.assignment-open-link{font:inherit;color:var(--color-primary);background:none;border:none;padding:0;cursor:pointer;text-align:left;text-decoration:underline}.app-nav{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.app-nav-link{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:relative;margin:0;padding:8px 12px;min-height:40px;border:0;border-radius:var(--radius-control);background:transparent;font-family:inherit;font-size:14px;line-height:20px;font-weight:500;color:var(--color-text-muted);text-decoration:none;cursor:pointer;transition:color .12s ease}.app-nav-link:hover{color:var(--color-text)}.app-nav-link:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.app-nav-link:disabled{cursor:not-allowed;opacity:.55}.app-nav button[aria-current=page]{color:var(--color-primary);font-weight:600}.app-nav button[aria-current=page]:after{content:"";position:absolute;right:12px;bottom:6px;left:12px;height:2px;background:var(--color-primary);transition:background-color .12s ease}.app-nav button[aria-current=page]:hover{color:var(--color-primary-hover)}.app-nav button[aria-current=page]:hover:after{background:var(--color-primary-hover)}.app-bar-logout{flex:0 0 auto;color:var(--color-text)}.app-bar-logout:hover{color:var(--color-primary)}@media (min-width: 1024px){.app-bar-inner{flex-wrap:nowrap}}@media (max-width: 1023px){.app-bar{padding-inline:24px}.app-shell>:not(.app-bar){width:min(100% - 48px,1200px)}}@media (max-width: 767px){.app-bar{padding-inline:16px}.app-nav-link{min-height:44px}.app-shell>:not(.app-bar){width:min(100% - 32px,1200px)}}@media (max-width: 640px){.app-bar-account{flex:1 1 100%;justify-content:space-between;margin-left:0}}@media (prefers-reduced-motion: reduce){.app-nav-link,.app-nav button[aria-current=page]:after{transition:none}}.lesson-sheet{width:100%;max-width:720px}.lesson-body h2,.lesson-body h3{margin:16px 0 8px}.lesson-body p,.lesson-body ul,.lesson-body ol{margin:0 0 12px}.lesson-body pre{background:#202823;color:#e8eee9;padding:12px 16px;border-radius:10px;overflow:auto}.lesson-body code{font-family:var(--font-family-code),ui-monospace,monospace}.lesson-body img{max-width:100%;height:auto}.lesson-video{position:relative;width:100%;max-width:720px;padding-top:56.25%;margin:12px 0;background:#171d1a}.lesson-video iframe{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;border:0}.lesson-video-file{display:block;width:100%;max-width:720px;margin:12px 0}.class-code{font-family:var(--font-family-code),ui-monospace,monospace;font-size:28px;letter-spacing:.14em;margin:8px 0}.review-source{margin:0;padding:12px;max-height:240px;overflow:auto;background:#202823;color:#e8eee9;border-radius:10px;white-space:pre-wrap}
