/* The terminal's 16 colours, as programs name them (ESC [ 30–37, 90–97 m), for this dark theme;
   --ansi-fg and --ansi-bg, its own, which inverse swaps. */
:root{--ansi-0:#2a3530;--ansi-1:#e8837a;--ansi-2:#9ae6b5;--ansi-3:#e0c27a;--ansi-4:#82aaff;--ansi-5:#c79ae6;--ansi-6:#8fd3d8;--ansi-7:#c8d3cb;--ansi-8:#6f8478;--ansi-9:#ffa69c;--ansi-10:#bff3cf;--ansi-11:#f2dca0;--ansi-12:#aac6ff;--ansi-13:#e0c2f2;--ansi-14:#b8eaee;--ansi-15:#eef5ef;--ansi-fg:#b4c6ba;--ansi-bg:#0b0f0e}
.transcript pre a{color:inherit}
:root{color-scheme:dark;--bg:#0b0f0e;--panel:#101614;--line:#29392f;--text:#d0dbd3;--muted:#85998d;--green:#9ae6b5;--warm:#d8c395;font:20px/1.6 ui-monospace,'Cascadia Code','SFMono-Regular',Consolas,'Noto Sans Mono',monospace;background:var(--bg);color:var(--text)}
*{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:#3d5345 transparent}body{margin:0}button,input,a{-webkit-tap-highlight-color:transparent}button,input,textarea,select{font:inherit}button,a{color:inherit}button{border:1px solid var(--line);background:transparent;padding:8px 12px;border-radius:5px;cursor:pointer}button:hover{background:#1d2b23;border-color:#577760}button:disabled{opacity:.5;cursor:default}:focus-visible{outline:2px solid var(--green);outline-offset:3px}a{text-underline-offset:4px}[hidden]{display:none!important}header{display:flex;justify-content:space-between;align-items:center;gap:16px;padding-bottom:12px;border-bottom:1px solid var(--line)}.wordmark{display:flex;align-items:center;gap:12px;font-size:20px;letter-spacing:1px}.signal{width:8px;height:8px;background:var(--green);border-radius:50%;box-shadow:0 0 14px #9ae6b544;flex-shrink:0}.subtitle{font-size:14px;color:var(--muted)}.lock{font-size:16px;color:var(--green);max-width:45%;overflow-wrap:anywhere}.intro{padding:18px 0 20px;display:grid;grid-template-columns:1fr auto;column-gap:20px;align-items:center}.eyebrow{font-size:12px;letter-spacing:2px;color:var(--muted)}.intro .eyebrow{grid-column:1/-1}h1{font:450 clamp(24px,2.6vw,34px)/1.4 system-ui,sans-serif;letter-spacing:2px;margin:6px 0}.intro p{font-size:16px;color:var(--muted);margin:0;max-width:50vw}
.file-panel,.terminal-panel{display:flex;flex-direction:column;min-width:0;min-height:0}.file-panel{border-bottom:var(--file-divider-bottom);border-right:var(--file-divider-right)}.terminal-panel{min-height:420px;container-type:inline-size}
.directory-bar{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 16px;background:#141e18;border-bottom:1px solid var(--line);font-size:17px}.directory-bar>span{min-width:0;overflow-wrap:anywhere;color:var(--green)}.directory-bar button{white-space:nowrap;font-size:15px;padding:6px 10px}.files{flex:1;min-height:85px;max-height:var(--files-max-height);overflow:auto;padding:8px}.file{width:100%;display:flex;align-items:center;gap:12px;padding:10px 8px;border:1px solid transparent;text-align:left;font-size:20px}.file-kind{width:24px;display:inline-flex;flex-shrink:0;color:var(--muted)}.file-icon{width:23px;height:23px;flex-shrink:0;vertical-align:middle}.file[data-kind="directory"] .file-kind,.file[data-kind="directory"] .filename{color:var(--green)}.filename{flex:1;min-width:0;overflow-wrap:anywhere}.file-size{font-size:13px;color:var(--muted);white-space:nowrap}.empty,.directory-error{font-size:16px;color:var(--muted);margin:14px 8px;line-height:1.8}.directory-error:empty{display:none}.file-notice{margin:8px 16px 0;font-size:15px;line-height:1.6;color:var(--warm);overflow-wrap:anywhere}.file-notice:empty{display:none}.file.denied{opacity:.45;cursor:not-allowed}.file.denied .file-kind,.file.denied .filename{color:var(--muted)!important}.entry-denied{opacity:.5}
.transcript{flex:1;min-height:0;max-height:var(--log-max-height);overflow:auto;padding:18px 22px 4px;display:flex;flex-direction:column;scrollbar-width:none}.transcript::-webkit-scrollbar{display:none}.transcript pre{flex-shrink:0;font:inherit;font-size:20px;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.7;margin:0 0 18px;color:#b4c6ba}.transcript .command-echo{margin-bottom:7px;color:var(--text)}.prompt-user{color:var(--green);font-weight:600}.prompt-path{color:#a7bcae}.prompt-separator,.prompt-symbol{color:var(--muted)}.prompt-command{color:#eef5ef}.command-line{flex-shrink:0;display:flex;align-items:center;gap:12px;margin:0;padding:15px 22px 20px}.command-line label{font-size:20px;max-width:55%;overflow-wrap:anywhere;flex-shrink:0}.command-line input{min-width:0;flex:1;border:0;background:transparent;color:#eef5ef;font-size:20px;caret-color:var(--green);outline:none;padding:5px 0}.command-line:focus-within{background:#15271a55}.busy{font-size:13px;color:var(--muted);white-space:nowrap}.transcript .listing-output{display:flex;flex-wrap:wrap;gap:10px 24px}.listing-entry{display:inline-flex;align-items:center;gap:9px;max-width:100%;min-width:0}.listing-entry .ls-name{overflow-wrap:anywhere}.entry-directory{color:var(--green)}.entry-file{color:var(--text)}.entry-executable{color:var(--warm)}.entry-link{color:#8fd3d8}.file.link .filename-text{font-style:italic}.listing-long{flex-direction:column;gap:8px!important}.listing-long .listing-entry{flex-wrap:wrap}.ls-meta{color:var(--muted);font-size:15px;white-space:pre-wrap;overflow-wrap:anywhere}.ls-meta:empty{display:none}
@container(max-width:600px){.command-line{flex-wrap:wrap;gap:4px 12px}.command-line label{max-width:100%;flex-basis:100%}.file-size{display:none}}
.completion-pager{flex-shrink:0;padding:12px 16px;border-top:1px solid var(--line);background:#142019}.completion-hint{font-size:13px;color:var(--muted);line-height:1.7;margin:0 0 8px}.completion-options{display:flex;flex-wrap:wrap;gap:6px;max-height:180px;overflow:auto}.completion-options button{display:flex;align-items:center;gap:12px;text-align:left;max-width:100%;min-width:0;padding:6px 10px;font-size:17px}.completion-options button>span{overflow-wrap:anywhere;min-width:0}.completion-options small{font-size:12px;color:var(--muted)}.completion-options [aria-selected="true"]{background:#294a35;border-color:#8aba96;color:#e5f6e9}.loading{padding:8vw}
dialog { color:var(--text); background:#101714; border:1px solid #3d5345; border-radius:8px; box-shadow:0 20px 120px #000b; padding:0; } dialog::backdrop { background:#020706d9; backdrop-filter:blur(5px); } #auth { width:420px; max-width:calc(100vw - 30px); padding:32px; } #auth h2 { font-weight:500; font-family:system-ui,sans-serif; } #auth p { font-size:12px; color:var(--muted); line-height:1.8; } #auth label { display:block; font-size:12px; margin:25px 0 10px; } #password { width:100%; border:1px solid #405448; background:#080d0a; border-radius:4px; padding:12px; } #auth #auth-error { color:#ffb6a9; min-height:22px; } .auth-actions { display:flex; justify-content:flex-end; gap:12px; } .primary { background:#95d6aa; border-color:#95d6aa; color:#0a2112; } #viewer { width:min(1200px,94vw); height:90dvh; max-width:100vw; max-height:100dvh; } #viewer-surface { height:100%; position:relative; background:#101714; } #viewer-surface:fullscreen { width:100vw; height:100dvh; } #fullscreen-error { position:absolute; bottom:16px; left:16px; right:16px; z-index:5; margin:0; padding:12px 16px; border:1px solid #705847; background:#261d16; color:#f1d2b5; font-size:12px; overflow-wrap:anywhere; } .viewer-bar { height:56px; display:flex; justify-content:space-between; align-items:center; padding:8px 20px; gap:15px; border-bottom:1px solid var(--line); font-size:12px; } #viewer-title { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .viewer-bar>div { display:flex; align-items:center; gap:12px; flex-shrink:0; } .viewer-bar button { padding:7px 10px; } #viewer-content { height:calc(100% - 56px); overflow:auto; } .media-frame { height:100%; display:flex; flex-direction:column; gap:20px; align-items:center; justify-content:center; padding:30px; } .media-frame img,.media-frame video { max-width:100%; max-height:100%; object-fit:contain; } .media-frame audio { width:min(600px,90%); } .markdown { max-width:800px; margin:0 auto; padding:35px 40px 80px; font-family:system-ui,sans-serif; line-height:1.95; font-size:16px; overflow-wrap:anywhere; } .markdown h1 { font-size:32px; letter-spacing:1px; } .markdown h2,.markdown h3 { margin-top:1.6em; font-weight:550; } .markdown a { color:var(--green); } .markdown img { max-width:100%; } .markdown pre,.markdown code { font-family:ui-monospace,monospace; background:#080d0a; border-radius:4px; } .markdown pre { padding:20px; overflow:auto; line-height:1.6; } .markdown :not(pre) > code { padding:2px 5px; } .markdown blockquote { border-left:2px solid #6f9b7e; padding-left:22px; margin-left:0; color:#9bb5a5; } .markdown table { border-collapse:collapse; width:100%; font-size:14px; } .markdown th,.markdown td { padding:8px 12px; border:1px solid var(--line); } .text-preview { padding:30px; white-space:pre-wrap; overflow-wrap:anywhere; font-size:14px; line-height:1.85; } .viewer-error { color:inherit; } .slides-view #viewer-content { overflow:hidden; } .game-view #viewer-content { overflow:hidden; } .game-view iframe { width:100%; height:100%; border:0; display:block; } #dropzone { position:fixed; inset:16px; z-index:90; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:20px; background:#0b2019f2; border:2px dashed var(--green); font-size:24px; pointer-events:none; border-radius:8px; } #dropzone span { color:var(--muted); font-size:13px; }
/* Shared modal typography; all login fields use the same theme. */
#auth{width:480px;padding:28px}#auth p{font-size:16px}#auth label{font-size:17px;margin:16px 0 7px}#auth input{width:100%;border:1px solid #405448;background:#080d0a;color:var(--text);border-radius:5px;padding:11px 12px;font-size:20px}#auth h2{font-size:26px;margin:14px 0}.auth-actions{margin-top:20px}.auth-actions button{font-size:17px}#viewer{width:min(1500px,96vw);height:93dvh}.viewer-bar{font-size:17px;height:64px}.viewer-bar button{font-size:16px}#download{display:inline-flex;align-items:center;gap:6px;padding:7px 10px;border:1px solid var(--line);border-radius:5px;font-size:16px;text-decoration:none;white-space:nowrap}#download:hover{background:#1d2b23;border-color:#577760}#download::before{content:"↓"}#viewer-content{height:calc(100% - 64px)}.markdown{font-size:20px;max-width:1060px;padding:32px 42px 70px}.markdown table{font-size:18px}.markdown h1{font-size:34px}.text-preview{font:20px/1.8 ui-monospace,monospace}.media-frame{padding:20px}#fullscreen-error{font-size:16px}.pdf-view{display:flex;flex-direction:column;height:100%}.pdf-toolbar{display:flex;align-items:center;justify-content:center;gap:14px;flex-shrink:0;padding:10px 12px;background:#101714;border-bottom:1px solid var(--line);font-size:16px}.pdf-toolbar button{display:inline-grid;place-items:center;height:40px;min-width:40px;padding:0 10px;font-size:16px}.pdf-toolbar [role=status]{min-width:8ch;text-align:center}.pdf-zoom{display:flex;gap:6px;margin-left:10px}.pdf-stage{flex:1;min-height:0;overflow:auto;position:relative;display:flex;flex-direction:column;align-items:safe center;gap:16px;padding:20px;outline:none}.pdf-frame{flex-shrink:0;position:relative;min-height:0;width:calc(min(100%,1000px)*var(--pdf-zoom,1));background:white;box-shadow:0 8px 40px #0007}.pdf-page{position:absolute;inset:0;display:block;width:100%;height:100%}
#editor{width:min(1500px,94vw);height:90dvh;max-width:100vw;max-height:100dvh;overflow:hidden}#editor[open]{display:flex;flex-direction:column}.editor-bar{border-bottom:1px solid var(--line)}.editor-bar>div{display:flex;align-items:center;flex-wrap:wrap;gap:12px;min-width:0}#editor-title{font-size:18px;overflow-wrap:anywhere;font-weight:500}#editor-dirty{color:var(--warm);font-size:14px}#editor-body{flex:1;min-height:0;overflow:hidden}#editor-status{flex:1;min-width:180px;overflow-wrap:anywhere}#editor button{font-size:16px}#editor .cm-textfield{background:#0b0f0e;color:var(--text);border:1px solid var(--line)}#editor .cm-button{background:#24372a;color:var(--text);border:1px solid var(--line)}
.text-preview code{font:inherit}.preview-bar{position:sticky;top:0;z-index:2;display:flex;justify-content:flex-end;padding:8px 16px;background:#101714;border-bottom:1px solid var(--line)}.preview-button{display:inline-grid;place-items:center;width:40px;height:40px;padding:0}.preview-icon{width:20px;height:20px}.no-preview{color:var(--muted);font-size:16px}.markdown math[display="block"]{margin:12px 0}.markdown .diagram{display:block;max-width:100%;margin:20px auto;padding:16px;border-radius:6px;background:#141e18}
.slides{height:100%;display:flex;flex-direction:column}.preview-bar+.slides{height:calc(100% - 57px)}.slides-body{flex:1;min-height:0;display:flex;position:relative;touch-action:pan-y pinch-zoom;outline:none}.slides-stage{position:relative;flex:1;min-width:0;min-height:0;overflow:hidden}.slide-frame{position:absolute;inset:0}.slide-frame[hidden]{display:none}.slide-frame>.enhanced{height:100%;display:grid;place-items:safe center;overflow:auto}.slide.markdown{width:100%;max-width:none;margin:0;padding:0 40px;zoom:var(--scale,1);font-size:32px;line-height:1.6;text-align:center}.slide.markdown h1{font-size:2em;letter-spacing:3px;margin:0 0 .5em}.slide.markdown h2{font-size:1.5em;margin:0 0 .6em}.slide ul,.slide ol{display:inline-block;text-align:left}.slide pre{text-align:left;padding:25px}.slide code{color:var(--green)}.slide blockquote{border-left:3px solid var(--green);padding:20px}.slide img{max-height:460px}.slides-bar{display:flex;align-items:center;justify-content:center;gap:10px;height:56px;flex-shrink:0;border-top:1px solid var(--line);font-size:16px;color:var(--muted)}
.table-preview,.archive,.cards{padding:24px}.table-preview table{border-collapse:collapse;font-size:16px}.table-preview th,.table-preview td{padding:6px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.table-preview th{position:sticky;top:0;background:#1b2b20;color:#eef5ef}.preview-note{margin:0 0 12px;color:var(--muted);font-size:14px}.archive ul{list-style:none;margin:0;padding:0;font-size:16px}.archive li{display:flex;justify-content:space-between;gap:16px;padding:6px 0;border-bottom:1px solid var(--line);overflow-wrap:anywhere}.archive li.directory{color:var(--green)}.archive li span:last-child{color:var(--muted);white-space:nowrap}.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;font-family:system-ui,sans-serif}.card{padding:16px 18px;border:1px solid var(--line);border-radius:6px;background:#141e18}.card h3{margin:0 0 10px;font-size:18px;color:#eef5ef}.card dl{display:grid;grid-template-columns:max-content 1fr;gap:4px 12px;margin:0;font-size:15px}.card dt{color:var(--muted)}.card dd{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.diff span{display:block;min-height:1lh}.diff-file{color:#eef5ef;font-weight:600}.diff-hunk{color:#82aaff}.diff-added{color:#c3e88d;background:#1c2e1a}.diff-removed{color:#f07178;background:#2e1a1c}
.hl-comment{color:#6f8a79;font-style:italic}.hl-keyword,.hl-label{color:#c9a2f0}.hl-string,.hl-literal{color:#c3e88d}.hl-number,.hl-constant{color:#f7a26c}.hl-function,.hl-constructor,.hl-macro{color:#82aaff}.hl-type,.hl-attribute,.hl-namespace{color:#ffcb6b}.hl-property{color:#89ddff}.hl-tag,.hl-error{color:#f07178}.hl-operator,.hl-punctuation{color:#a3b8ab}.hl-embedded{color:var(--text)}.hl-title{color:#eef5ef;font-weight:600}.hl-strong{font-weight:700}.hl-emphasis{font-style:italic}.hl-link{color:#82aaff;text-decoration:underline}.hl-strikethrough{text-decoration:line-through}.hl-diff-add{color:#c3e88d}.hl-diff-delete{color:#f07178}
@media(max-width:650px){.subtitle,.intro .eyebrow{display:none}.intro{display:block;padding:16px 0}.intro p{font-size:15px;max-width:none}.wordmark{font-size:17px;gap:8px}.lock{font-size:14px}.file-size{display:none}.file{gap:10px}.files{max-height:23dvh}.directory-bar{padding:10px 12px}.command-line{padding:12px 14px 17px}.transcript{padding:14px 14px 0}#viewer,#editor{width:100vw;height:100dvh;max-height:100dvh;border-radius:0}.viewer-bar{padding:8px 12px;gap:8px}.viewer-bar>div{gap:8px}#download{font-size:0;gap:0;padding:7px 12px}#download::before{font-size:16px}.markdown{padding:24px 20px 50px;font-size:20px}.markdown table{display:block;overflow:auto}.editor-bar .eyebrow{display:none}.pdf-toolbar{gap:8px;padding:8px}.pdf-zoom{margin-left:4px}.pdf-stage{padding:10px;gap:10px}.slide.markdown{padding:0 16px}.table-preview,.archive,.cards{padding:14px}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
/* Terminal tabs: one transcript and command line each; only the active one shows. */
.terminal-tabs{display:flex;flex-direction:column;min-width:0;min-height:0}
.terminal-tabs>.terminal-panel{flex:1}
.terminal-panel[hidden]{display:none!important}
.tab-bar{display:flex;align-items:stretch;gap:2px;padding:6px 10px 0;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:none;flex-shrink:0}
.tab-bar::-webkit-scrollbar{display:none}
.tab{display:flex;align-items:center;border:1px solid transparent;border-bottom:0;border-radius:5px 5px 0 0;color:var(--muted)}
.tab[aria-selected="true"]{border-color:var(--line);background:#101714;color:var(--text)}
.tab button{background:none;border:0;color:inherit;font-size:14px;padding:5px 9px;white-space:nowrap}
.tab .tab-close{padding:5px 8px 5px 2px;opacity:.6}
.tab .tab-close:hover{opacity:1}
.tab-new{background:none;border:0;color:var(--muted);font-size:16px;padding:4px 10px}
.tab-new:hover,.tab:hover{color:var(--text)}
/* Search in a preview: a panel over its top right, and the matches it highlights. */
#viewer-search[hidden],.preview-search[hidden]{display:none}
.preview-search{position:absolute;top:76px;right:72px;z-index:6;display:flex;align-items:center;gap:6px;padding:8px 10px;background:#16211b;border:1px solid #3d5345;border-radius:6px;box-shadow:0 8px 30px #0009;max-width:calc(100% - 32px)}
.preview-search input{width:min(320px,50vw);border:1px solid #405448;background:#080d0a;color:var(--text);border-radius:4px;padding:6px 8px;font:16px ui-monospace,monospace}
.preview-search input[aria-invalid="true"]{border-color:#c46a5a}
.preview-search button{padding:4px 8px;font-size:15px;min-width:32px}
.search-toggle[aria-pressed="true"]{background:#2b4434;border-color:var(--green);color:var(--text)}
.search-status{font-size:14px;color:var(--muted);min-width:7ch;max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.search-status.search-error{color:#ffb6a9}
::highlight(preview-search){background-color:#6b5a1f}
::highlight(preview-search-current){background-color:#e0b84a;color:#111}
@media(max-width:650px){.preview-search{left:16px;right:16px;top:70px;flex-wrap:wrap}.preview-search input{flex:1;width:auto}}
/* Full screen, the content has the whole screen: the bars float over it, hidden until the pointer moves (app.js adds .chrome). A game keeps its bar above it: its frame takes the pointer, so moving it there shows nothing. */
#viewer:not(.game-view) #viewer-surface:fullscreen #viewer-content{height:100%}#viewer:not(.game-view) #viewer-surface:fullscreen .viewer-bar{position:absolute;inset:0 0 auto;z-index:4;background:#101714f0}#viewer:not(.game-view) #viewer-surface:fullscreen .preview-bar{position:absolute;top:64px;right:0;z-index:3;border:0;background:none}#viewer:not(.game-view) #viewer-surface:fullscreen .preview-bar+.slides{height:100%}#viewer:not(.game-view) #viewer-surface:fullscreen .slides-bar{position:absolute;inset:auto 0 0;z-index:3;background:color-mix(in srgb,var(--slide-bg,#101714) 94%,transparent)}#viewer:not(.game-view) #viewer-surface:fullscreen .pdf-toolbar{position:absolute;inset:auto 0 0;z-index:3;border:0;background:#101714f0}#viewer:not(.game-view) #viewer-surface:fullscreen .slides-speaker{padding-bottom:64px}@media(min-width:651px){#viewer:not(.game-view) #viewer-surface:fullscreen .slides-speaker{padding-top:78px}}#viewer:not(.game-view) #viewer-surface:fullscreen :is(.viewer-bar,.preview-bar,.slides-bar,.pdf-toolbar){transition:opacity .2s}#viewer:not(.game-view) #viewer-surface:fullscreen:not(.chrome) :is(.viewer-bar,.preview-bar,.slides-bar,.pdf-toolbar){opacity:0;pointer-events:none}
/* Phones: the terminal is the app. It takes the visible screen, kept in --app-height by app.js as the on-screen keyboard opens and closes, with the command line at its foot; while the keyboard is open (.keyboard), the header and the files make room. Inputs keep 16px text, below which iOS zooms in. */
@media(max-width:650px){html,body{height:100%;overflow:hidden}header{padding-bottom:8px;gap:8px}.wordmark{min-width:0;white-space:nowrap}.lock{max-width:62%;display:inline-flex;min-width:0;padding:6px 10px;white-space:nowrap}.lock-name{min-width:0;overflow:hidden;text-overflow:ellipsis}.lock-action{flex-shrink:0;white-space:pre}.file-panel{flex:0 1 auto;max-height:38%}.files{max-height:none;min-height:0}.file{padding:8px 6px;font-size:17px}.terminal-tabs{flex:1;min-height:0}.terminal-panel{min-height:0}.transcript{max-height:none}.transcript pre{font-size:16px;margin-bottom:12px}.command-line label,.command-line input{font-size:16px}.listing-long{overflow-x:auto}.listing-long .listing-entry{flex-wrap:nowrap;white-space:nowrap}.listing-long .ls-name,.listing-long .ls-meta{overflow-wrap:normal;white-space:pre}}
/* The keys a phone's keyboard lacks, on touch screens. */
.touch-keys{display:none}@media(pointer:coarse){.touch-keys{display:flex;gap:6px;padding:0 10px 8px;flex-shrink:0}.touch-keys button{flex:1;min-width:44px;padding:8px 0;font-size:15px}}
/* Slide themes (viewer.rs SLIDE_THEMES), for slides alone: Light, the default, Dark, Sepia and Night. On the light ones, code takes colors that read on a light page. */
.slides{--slide-bg:#fbfbf8;--slide-text:#1f2622;--slide-muted:#5f6d64;--slide-accent:#16794a;--slide-code:#eef1ec;--slide-line:#d3dbd5;background:var(--slide-bg);color:var(--slide-text)}.slides[data-theme=dark]{--slide-bg:#101714;--slide-text:#d0dbd3;--slide-muted:#85998d;--slide-accent:#9ae6b5;--slide-code:#080d0a;--slide-line:#29392f}.slides[data-theme=sepia]{--slide-bg:#f5ecd9;--slide-text:#3a2f22;--slide-muted:#7a6a55;--slide-accent:#8a4b17;--slide-code:#ebdfc4;--slide-line:#d8c7a6}.slides[data-theme=night]{--slide-bg:#0e1a2b;--slide-text:#e2ebf6;--slide-muted:#8ea3bd;--slide-accent:#7cc4ff;--slide-code:#15253b;--slide-line:#2a3d57}
.slides .slide.markdown{color:var(--slide-text)}.slides .slide a{color:var(--slide-accent)}.slides .slide pre,.slides .slide code{background:var(--slide-code)}.slides .slide code{color:var(--slide-accent)}.slides .slide pre code{color:var(--slide-text)}.slides .slide blockquote{border-left-color:var(--slide-accent);color:var(--slide-muted)}.slides .slide th,.slides .slide td{border-color:var(--slide-line)}.slides .diagram{background:var(--slide-code)}.slides .slides-bar{position:relative;background:var(--slide-bg);border-top-color:var(--slide-line);color:var(--slide-muted)}.slides .slides-bar button{background:transparent;color:var(--slide-text);border-color:var(--slide-line)}.slides .slides-bar button:disabled{opacity:.35}.slides-theme{position:absolute;right:12px;top:50%;transform:translateY(-50%);background:var(--slide-bg);color:var(--slide-text);border:1px solid var(--slide-line);border-radius:4px;padding:5px 6px;font:inherit;font-size:14px}
.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-comment){color:#6b7a70}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-keyword,.hl-label){color:#7a3db8}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-string,.hl-literal,.hl-diff-add){color:#2f7d1f}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-number,.hl-constant){color:#b2540f}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-function,.hl-constructor,.hl-macro,.hl-link){color:#1f5fbf}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-type,.hl-attribute,.hl-namespace){color:#8a6100}.slides:is([data-theme=light],[data-theme=sepia]) .hl-property{color:#0b7285}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-tag,.hl-error,.hl-diff-delete){color:#c0392b}.slides:is([data-theme=light],[data-theme=sepia]) :is(.hl-operator,.hl-punctuation){color:#55625a}.slides:is([data-theme=light],[data-theme=sepia]) .hl-title{color:var(--slide-text)}
@media(max-width:650px){.slides-theme{position:static;transform:none;margin-left:4px}}
/* Back, before the title, after a link led to another file. */
.viewer-bar>.viewer-heading{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0}#viewer-title{direction:rtl;text-align:left}.viewer-heading #viewer-title{min-width:0}#viewer-back{padding:6px 10px;flex-shrink:0}#viewer-back[hidden]{display:none}
/* A file name keeps to one line. One too long for it slides to show the rest, back and forth: while pointed at or focused, or always on touch screens, which point at nothing (app.js measures --overflow). */
.filename{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;overflow-wrap:normal}@keyframes name-scroll{0%,15%{transform:translateX(0)}85%,100%{transform:translateX(var(--overflow))}}@media(hover:hover){.file:is(:hover,:focus-visible) .filename[data-overflow]{text-overflow:clip}.file:is(:hover,:focus-visible) .filename[data-overflow] .filename-text{display:inline-block;animation:name-scroll var(--duration,6s) ease-in-out infinite alternate}}@media(hover:none){.filename[data-overflow]{text-overflow:clip}.filename[data-overflow] .filename-text{display:inline-block;animation:name-scroll var(--duration,6s) ease-in-out infinite alternate}}@media(prefers-reduced-motion:reduce){.filename[data-overflow]{text-overflow:ellipsis!important}.filename .filename-text{display:inline!important}}
/* A rendered presentation page fills the viewer, without Markdown's image limit or zoom. */
.slides .enhanced:has(>.slide-image){grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);overflow:hidden;background:#000}
.slides .slide.markdown.slide-image{width:100%;height:100%;min-width:0;min-height:0;padding:0;zoom:1}
.slides .slide-image>p{margin:0;width:100%;height:100%}
.slides .slide-image img{display:block;width:100%;height:100%;max-width:100%;max-height:none;object-fit:contain}
/* The bar's tools (viewer.rs Slides): the overview and the speaker view on the left, the slide number, which a click asks for, between the arrows. */
.slides-tools{position:absolute;left:12px;top:50%;transform:translateY(-50%);display:flex;gap:6px}.slides .slides-bar .slides-counter{border:0;padding:4px 8px;min-width:8ch;color:var(--slide-muted)}.slides-jump{width:11ch;font-size:16px;padding:5px 8px;text-align:center;border:1px solid var(--slide-line);border-radius:4px;background:var(--slide-bg);color:var(--slide-text)}
/* The overview: every slide, small, in order; the one shown is marked. Thumbnails are 240px wide, so slides laid out at 1280px scale by 240/1280. */
.slides-overview{position:absolute;inset:0;z-index:2;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,240px);justify-content:center;align-content:start;gap:16px;padding:20px;background:var(--slide-bg)}.slides-thumb{--scale:.1875;position:relative;width:240px;height:135px;display:grid;place-items:center;overflow:hidden;padding:0;border:2px solid var(--slide-line);border-radius:6px;background:var(--slide-bg);color:var(--slide-text)}.slides-thumb:hover{background:var(--slide-bg);border-color:var(--slide-muted)}.slides-thumb:has(>.slide-image){background:#000}.slides-thumb.current{border-color:var(--slide-accent);box-shadow:0 0 0 2px var(--slide-accent)}.slides-thumb>.slide{pointer-events:none}.slides-number{position:absolute;right:6px;bottom:4px;padding:0 5px;border-radius:3px;font-size:12px;background:var(--slide-bg);color:var(--slide-muted)}
/* An image of a slide, enlarged by a click; another click or Escape closes it. */
.slides-current .slide:not(.slide-image) img{cursor:zoom-in}.slides-enlarged{position:absolute;inset:0;z-index:3;display:grid;place-items:center;padding:10px;background:#000e;cursor:zoom-out}.slides-enlarged img{max-width:100%;max-height:100%;object-fit:contain}
/* The speaker view: the slide shown, and beside it the clock, the next slide and the notes; on phones, the notes under the slide. */
.slides-speaker{flex:0 0 clamp(300px,38%,640px);min-width:0;display:flex;flex-direction:column;gap:12px;padding:14px;border-left:1px solid var(--slide-line);background:var(--slide-bg);color:var(--slide-text)}.slides-speaker button{background:transparent;color:var(--slide-text);border-color:var(--slide-line)}.slides-time{display:flex;align-items:center;justify-content:space-between;gap:10px;font-variant-numeric:tabular-nums}.slides .slides-elapsed{font-size:28px;padding:2px 12px}.slides-clock{font-size:22px;color:var(--slide-muted)}.slides-upcoming{position:relative;flex-shrink:0;aspect-ratio:16/9;overflow:hidden;border:1px solid var(--slide-line);border-radius:6px}.slides-upcoming>.slides-stage{position:absolute;inset:0}.slides-end{position:absolute;inset:0;display:grid;place-items:center;margin:0;font-size:16px;color:var(--slide-muted)}.slides-notes-bar{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--slide-muted)}.slides-notes-bar span{flex:1}.slides-notes-bar .preview-button{width:36px;height:32px;font-size:14px}.slides-notes{flex:1;min-height:0;overflow:auto;line-height:1.6}.slides-notes .markdown{max-width:none;padding:0 0 20px;font-size:inherit;color:var(--slide-text)}.slides-no-notes{margin:0;font-size:16px;color:var(--slide-muted)}
@media(max-width:650px){.slides .slides-bar{gap:4px;padding:0 4px}.slides .slides-bar .preview-button{width:34px;height:36px}.slides .slides-bar .slides-counter{min-width:0;padding:4px 2px}.slides-theme{max-width:66px}.slides-tools{position:static;transform:none;gap:4px;margin-right:2px}.slides-bar .slides-vertical{display:none}.slides.speaking .slides-body{flex-direction:column}.slides.speaking .slides-current{flex:0 0 36%}.slides-speaker{flex:1 1 auto;min-height:0;border-left:0;border-top:1px solid var(--slide-line)}.slides-upcoming{display:none}}
/* A PDF presented: one page at a time, filling the view (viewer.rs PdfView). */
.pdf-present{flex:1;min-height:0;position:relative;background:#000;touch-action:pan-y pinch-zoom}.pdf-slide{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:contain}.pdf-present[hidden],.pdf-stage[hidden]{display:none}
/* Its tools at the left, as the slides' are, and the zoom at the right: the pages' buttons stay centred, and nothing moves as the mode changes. */
.pdf-toolbar{position:relative;z-index:4}.pdf-tools{position:absolute;left:12px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:6px}.pdf-zoom{position:absolute;right:12px;top:50%;transform:translateY(-50%);display:flex;gap:4px}
@media(max-width:650px){.pdf-toolbar{justify-content:flex-start;gap:4px;padding:6px}.pdf-toolbar button{height:36px;min-width:34px;padding:0 6px}.pdf-toolbar [role=status]{min-width:0;padding:0 2px;white-space:nowrap}.pdf-tools{position:static;transform:none;gap:4px}.pdf-zoom{position:static;transform:none;margin-left:auto;gap:2px}.pdf-zoom [aria-label="Fit width"]{display:none}}
/* The bar's live controls (viewer.rs LiveControls): present to others, go live, listeners asking to speak and speaking; a listener's ask. */
.live-controls{position:relative;display:flex;align-items:center;gap:6px}.live-controls.signed-out{display:none}
.preview-button.on{color:var(--slide-accent,var(--green));border-color:currentColor}
.live-on{display:inline-grid;place-items:center;height:36px;padding:0 10px;font-size:14px;font-variant-numeric:tabular-nums;white-space:nowrap;color:#ff7a7a;border-color:#ff7a7a;background:transparent}
.pdf-toolbar .live-on{height:40px}
.live-ask.waiting{animation:live-pulse 1.2s ease-in-out infinite}.live-ask.on{color:#ff7a7a;border-color:#ff7a7a}
@keyframes live-pulse{50%{opacity:.45}}
.live-hands{position:relative}.live-hands.asked{color:#f5c84b;border-color:#f5c84b;animation:live-pulse 1.2s ease-in-out 3}
.live-count{position:absolute;top:-7px;right:-7px;display:grid;place-items:center;min-width:18px;height:18px;padding:0 4px;border-radius:9px;background:#f5c84b;color:#111;font-size:11px;line-height:1}
.live-menu,.live-note{position:absolute;left:0;bottom:calc(100% + 12px);z-index:6;border:1px solid var(--slide-line,#3d5345);border-radius:8px;background:var(--slide-bg,#101714);color:var(--slide-text,var(--text));box-shadow:0 8px 30px #0007}
.live-menu{display:flex;flex-direction:column;gap:4px;min-width:200px;padding:6px}
.live-menu button{text-align:left;white-space:nowrap;font-size:14px;padding:7px 10px;background:transparent;color:inherit;border-color:var(--slide-line,var(--line))}
.live-person{display:flex;align-items:center;gap:6px;font-size:14px;white-space:nowrap}.live-person>span{flex:1;padding:0 4px;overflow:hidden;text-overflow:ellipsis}.live-person.speaking>span::before{content:"● ";color:#ff7a7a}
.live-note{padding:6px 10px;font-size:13px;white-space:nowrap;max-width:min(80vw,560px);overflow:hidden;text-overflow:ellipsis;pointer-events:none}
.live-menu+.live-note,.live-note+.live-note{display:none}
.pdf-toolbar .live-menu,.pdf-toolbar .live-note{top:calc(100% + 12px);bottom:auto}
#viewer:not(.game-view) #viewer-surface:fullscreen .pdf-toolbar :is(.live-menu,.live-note){top:auto;bottom:calc(100% + 12px)}
/* A listener's presentation (viewer.rs Audience): following, or paused, which a click ends. */
.presentation-badge{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:16px;padding:4px 12px;font-size:14px}.slides .slides-bar .presentation-badge,.pdf-toolbar .presentation-badge{border-color:var(--slide-accent,var(--green));color:var(--slide-accent,var(--green));background:transparent}.slides .slides-bar .presentation-badge.paused,.pdf-toolbar .presentation-badge.paused{background:var(--slide-accent,var(--green));color:var(--slide-bg,#101714)}.presentation-badge:disabled{opacity:.6}
.slides-counter{white-space:nowrap}
@media(max-width:650px){.presentation-badge{max-width:140px;padding:4px 8px;font-size:13px}.slides-tools:has(.presentation-badge) [aria-label="Speaker view"]{display:none}}
/* Live sound heard (app.js hear): a small player at the bottom, over everything but dialogs' backdrops, which goes on playing whatever the viewer shows. */
#listening{position:fixed;left:50%;bottom:72px;transform:translateX(-50%);z-index:20;display:flex;align-items:center;gap:10px;max-width:calc(100vw - 32px);padding:8px 10px 8px 14px;border:1px solid #3d5345;border-radius:24px;background:#101714f2;color:var(--text);font-size:15px;box-shadow:0 8px 40px #0008}#listening[hidden]{display:none}#listening-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.listening-icon{color:var(--green)}#listening button{padding:4px 10px;font-size:14px;border-radius:14px}#listening .listening-state::before{color:var(--muted);font-size:13px}#listening[data-state=connecting] .listening-state::before{content:"connecting…"}#listening[data-state=live] .listening-state::before{content:"live";color:var(--green)}#listening:not([data-state=paused]) #listening-play{display:none}#viewer-surface #listening{position:absolute;bottom:72px}
/* The desktop (crates/frontend/src/desktop.rs): a bar, the area its windows are laid out in over
   the wallpaper, and a dock. The compositor sets each window's place, size and stacking. */
html,body{height:100%;overflow:hidden}
.desktop{position:fixed;inset:0 0 auto;height:var(--app-height,100dvh);transform:translateY(var(--app-top,0px));display:flex;flex-direction:column;background:radial-gradient(ellipse at 18% 0%,#15271c 0,transparent 55%),radial-gradient(ellipse at 100% 100%,#121d1a 0,transparent 45%),var(--bg)}
.topbar{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:7px 16px;border-bottom:1px solid var(--line);background:#0c1210e6;backdrop-filter:blur(8px);flex-shrink:0}
.desktop-area{position:relative;flex:1;min-height:0}
.wallpaper{position:absolute;left:0;right:0;bottom:0;padding:clamp(18px,4vw,64px);display:block;opacity:.6}
.wallpaper h1{font-size:clamp(30px,4vw,56px)}.wallpaper p{max-width:60ch}
/* Its words only where no window is; through the gaps between windows, nothing. */
.desktop-area:has(>.window:not(.window-hidden)) .wallpaper{visibility:hidden}
.window{position:absolute;display:flex;flex-direction:column;min-width:0;min-height:0;margin:0;padding:0;max-width:none;max-height:none;background:var(--panel);color:var(--text);border:1px solid #33463a;border-radius:9px;box-shadow:0 16px 56px #000a;overflow:clip}
dialog.window{inset:auto}dialog.window:not([open]){display:none}
.window-hidden{display:none!important}
.window-focused{border-color:#55765f;box-shadow:0 22px 80px #000c,0 0 0 1px #9ae6b520}
/* A window with the keyboard shows it by its frame, not by an outline. */
.window:focus-visible{outline:none}
.window-filled{border-radius:0;box-shadow:none;border-color:var(--line)}
.window-bar,.window .viewer-bar,.window .editor-bar{user-select:none;flex-shrink:0}
.window-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;height:40px;padding:0 6px 0 14px;border-bottom:1px solid var(--line);background:#111a15;font-size:15px}
.window:not(.window-focused) .window-bar,.window:not(.window-focused) .viewer-bar,.window:not(.window-focused) .editor-bar{background:#0e1512}
.window-title{display:flex;align-items:center;gap:9px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}
.window-focused .window-title{color:var(--text)}
.window-title .file-icon{width:18px;height:18px;flex-shrink:0;color:var(--green)}
.window-glyph{color:var(--green);font-weight:600}
.window-controls{display:flex;gap:2px;flex-shrink:0}
.window-controls button,.window-control{width:32px;height:28px;padding:0;font-size:15px;line-height:1;border-color:transparent;border-radius:6px}
.window-controls button:hover,.window-control:hover{background:#1d2b23;border-color:transparent}
.window-controls [data-window-action="close"]:hover{background:#5a2424}
[data-window-bar]{cursor:grab}body.window-dragging,body.window-dragging *{cursor:grabbing!important;user-select:none!important}
.window-resize{position:absolute;z-index:8}
/* Within the window's edges: outside them they would be clipped, and make it scrollable. */
.window-resize-n{top:0;left:10px;right:10px;height:5px;cursor:ns-resize}.window-resize-s{bottom:0;left:10px;right:10px;height:5px;cursor:ns-resize}
.window-resize-e{right:0;top:10px;bottom:10px;width:5px;cursor:ew-resize}.window-resize-w{left:0;top:10px;bottom:10px;width:5px;cursor:ew-resize}
.window-resize-ne{right:0;top:0;width:10px;height:10px;cursor:nesw-resize}.window-resize-sw{left:0;bottom:0;width:10px;height:10px;cursor:nesw-resize}
.window-resize-nw{left:0;top:0;width:10px;height:10px;cursor:nwse-resize}.window-resize-se{right:0;bottom:0;width:10px;height:10px;cursor:nwse-resize}
.window-filled .window-resize{display:none}
.window .file-panel{display:flex;flex:1;min-height:0;max-height:none;border:0}
.window .files{flex:1;max-height:none;min-height:0}
.window .terminal-tabs{flex:1;min-width:0;min-height:0}
.window .terminal-panel{min-height:0}
.window .transcript{max-height:none}
#viewer.window,#editor.window{width:auto;height:auto}
.window #viewer-surface{flex:1;min-height:0;height:auto}
.dock{position:relative;z-index:50;display:flex;justify-content:center;align-items:center;gap:4px;padding:6px 10px;border-top:1px solid var(--line);background:#0c1210e6;backdrop-filter:blur(8px);flex-shrink:0}
.dock-item{position:relative;display:inline-flex;align-items:center;gap:8px;padding:6px 14px;font-size:15px;border-color:transparent;border-radius:8px}
.dock-item:hover{background:#17221c;border-color:transparent}
.dock-icon{color:var(--green);font-weight:600;min-width:18px;text-align:center}
.dock-open::after{content:'';position:absolute;left:50%;bottom:0;width:6px;height:3px;margin-left:-3px;border-radius:2px;background:var(--muted)}
.dock-focused{background:#1b2a21;border-color:#33463a}.dock-focused::after{width:16px;margin-left:-8px;background:var(--green)}
.launcher{position:absolute;bottom:calc(100% + 8px);left:10px;display:flex;flex-direction:column;gap:2px;min-width:230px;padding:6px;background:#101714f5;border:1px solid #3d5345;border-radius:10px;box-shadow:0 18px 60px #000b;backdrop-filter:blur(10px);z-index:1000}
.launcher button{display:flex;gap:12px;align-items:center;text-align:left;border-color:transparent;font-size:16px;padding:9px 12px}
.launcher button:hover{background:#1d2b23;border-color:transparent}
.launcher button span{width:22px;text-align:center;color:var(--green)}
@media(max-width:650px){.topbar{padding:6px 10px;gap:8px}.wordmark{min-width:0;white-space:nowrap}.lock{max-width:62%;display:inline-flex;min-width:0;padding:6px 10px;white-space:nowrap}.lock-name{min-width:0;overflow:hidden;text-overflow:ellipsis}.lock-action{flex-shrink:0;white-space:pre}.wallpaper,.intro{display:none}.window{border:0;border-radius:0;box-shadow:none}.window-bar{height:36px}.dock{padding:4px 6px}.dock-item{padding:6px 10px}.dock-label{display:none}.keyboard .topbar,.keyboard .dock{display:none}[data-window-action=maximize]{display:none}.window .file{padding:8px 6px;font-size:17px}.transcript pre{font-size:16px;margin-bottom:12px}.command-line label,.command-line input{font-size:16px}.listing-long{overflow-x:auto}.listing-long .listing-entry{flex-wrap:nowrap;white-space:nowrap}.listing-long .ls-name,.listing-long .ls-meta{overflow-wrap:normal;white-space:pre}}
/* The Files' location, a path to type (crates/frontend/src/files.rs), as the directory bar showed
   it; and what an upload into it says. */
.directory-bar .location{flex:1;min-width:0;padding:4px 6px;margin-left:-6px;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--green);font-size:17px}
.directory-bar .location:hover{border-color:var(--line)}.directory-bar .location:focus{border-color:#577760;background:#0b110e;outline:none}
.file-progress{display:flex;align-items:flex-start;gap:10px;margin:8px 16px 0}.file-progress pre{flex:1;min-width:0;margin:0;font-size:14px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere}.file-progress button{padding:2px 10px;font-size:14px}
@media(max-width:650px){.directory-bar .location{font-size:16px}}
/* The editor's bar and footer. */
.editor-bar,.editor-footer{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:12px 18px;flex-shrink:0}
.editor-footer{border-top:1px solid var(--line);font-size:15px;flex-wrap:wrap}
.editor-footer>div{display:flex;gap:10px;flex-shrink:0;flex-wrap:wrap}
@media(max-width:650px){.editor-footer>div{width:100%;justify-content:flex-end}}
