:root{--series-1: #2a78d6;--series-2: #eb6834;--grid: #e6e9ef}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--series-1: #3987e5;--series-2: #d95926;--grid: #26303d}}.stocks-head{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px;margin-bottom:16px}.stocks-head h1{margin:0;font-size:1.5rem}.up{color:var(--good)}.down{color:var(--danger)}.market{display:block;padding:8px 12px;margin-bottom:14px;border-radius:10px;background:var(--surface-2);color:var(--muted);font-size:.92rem;font-weight:500}.market .small{margin-top:2px}.market-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--muted);margin-right:8px;vertical-align:1px}.market-open{background:var(--good-soft);color:var(--good)}.market-open .market-dot{background:var(--good)}.notices{list-style:none;padding:0;margin:0 0 14px;display:grid;gap:6px}.notices li{padding:8px 12px;border-radius:10px;font-size:.95rem}.notice-good{background:var(--good-soft)}.notice-warn{background:var(--warn-soft)}.notices li>span:first-child{font-weight:700;margin-right:4px}.stat-row{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));margin-bottom:14px}.stat{display:flex;flex-direction:column;gap:2px;padding:14px 16px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)}.stat-hero{grid-column:1 / -1}.stat-label{color:var(--muted);font-size:.8rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.stat-value{font-size:2.2rem;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.15}.stat-value.sm{font-size:1.4rem}.stat-sub{font-size:.9rem;color:var(--muted)}.stat-sub.up{color:var(--good)}.stat-sub.down{color:var(--danger)}.panel-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}.cash-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.cash-grid>div{display:flex;flex-direction:column}.cash-grid b{font-size:1.25rem;font-variant-numeric:tabular-nums}.table-wrap{overflow-x:auto;margin:0 -16px;padding:0 16px}table.data td{padding:10px 8px;border-bottom:1px solid var(--border);vertical-align:top}table.data tr:last-child td{border-bottom:0}.num{text-align:right!important;font-variant-numeric:tabular-nums;white-space:nowrap}.sym{font-weight:700;text-decoration:none;letter-spacing:.02em}.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}.standings tr.me td{background:var(--accent-soft)}.you{margin-left:6px;font-size:.72rem;font-weight:700;text-transform:uppercase;background:var(--accent);color:var(--accent-text);border-radius:999px;padding:1px 7px}.orders,.history{list-style:none;padding:0;margin:0}.orders li,.history li{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.orders li:last-child,.history li:last-child{border-bottom:0}.history b{white-space:nowrap;font-variant-numeric:tabular-nums}.search{width:100%;padding:.75em .9em;font:inherit;font-size:1.1rem;color:var(--text);background:var(--surface-2);border:1px solid var(--border);border-radius:10px;margin-bottom:10px}.hits{list-style:none;padding:0;margin:0;display:grid;gap:2px}.hits a{display:grid;grid-template-columns:70px 1fr auto;gap:10px;align-items:baseline;padding:10px 8px;border-radius:8px;color:var(--text);text-decoration:none}.hits a:hover,.hits a:focus-visible{background:var(--surface-2)}.ticket-grid{display:grid;gap:14px;grid-template-columns:minmax(0,1.6fr) minmax(280px,1fr);align-items:start}.ticket-grid>.panel{margin-bottom:0}@media(max-width:820px){.ticket-grid{grid-template-columns:1fr}}.quote-head{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px;margin-bottom:10px}.quote-sym{font-size:1.6rem!important;margin:0!important}.quote-price{text-align:right}.quote-price b{font-size:1.6rem;font-variant-numeric:tabular-nums}.seg{display:flex;background:var(--surface-2);border-radius:10px;padding:3px;margin-bottom:10px}.seg button{flex:1;white-space:nowrap;font:inherit;font-weight:600;padding:8px;border:0;border-radius:8px;background:transparent;color:var(--muted);cursor:pointer}.seg button.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow)}.seg-sm button{padding:5px 8px;font-size:.9rem}.ranges{max-width:320px}.quick{display:flex;flex-wrap:wrap;gap:6px;margin:-4px 0 12px}.btn-chip{padding:.35em .7em;font-size:.88rem;border-radius:999px}.check{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-weight:500}.check input{width:18px;height:18px}.estimate{font-weight:600;margin:0 0 4px;font-variant-numeric:tabular-nums}.note{background:var(--warn-soft);color:var(--text);border-radius:8px;padding:8px 10px}.why{color:var(--muted);text-align:center;margin:8px 0 0}.success{background:var(--good-soft);color:var(--good);border-radius:10px;padding:.6em .8em;margin:12px 0 6px;font-weight:600}.ticket .error{margin:12px 0 0}.btn-primary:disabled{opacity:.45;cursor:not-allowed}.chart{margin:0}.chart-box{position:relative;touch-action:pan-y}.chart-legend{display:flex;gap:16px;font-size:.85rem;color:var(--muted);margin-bottom:4px}.chart-legend i,.chart-tip i{display:inline-block;width:12px;height:3px;border-radius:2px;vertical-align:middle}.chart-grid{stroke:var(--grid);stroke-width:1}.chart-tick{fill:var(--muted);font-size:11px;font-variant-numeric:tabular-nums}.chart-label{fill:var(--text);font-size:12px;font-weight:600;paint-order:stroke;stroke:var(--surface);stroke-width:4px}.chart-dot{stroke:var(--surface);stroke-width:2}.chart-cross{stroke:var(--muted);stroke-width:1}.chart-tip{position:absolute;top:4px;transform:translate(-50%);pointer-events:none;background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:8px;padding:6px 10px;font-size:.85rem;white-space:nowrap}.chart-tip-date{color:var(--muted);font-size:.78rem}.chart-table summary{cursor:pointer;color:var(--muted);font-size:.85rem;margin-top:6px}.chart-table table{width:100%;font-size:.85rem;border-collapse:collapse;margin-top:6px}.chart-table td,.chart-table th{padding:3px 6px;text-align:right;border-bottom:1px solid var(--border)}.chart-table td:first-child,.chart-table th:first-child{text-align:left}.chart-loading{height:220px;border-radius:10px;background:var(--surface-2)}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}.history-right{display:flex;flex-direction:column;align-items:flex-end;gap:6px}.teacher-badge{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;background:var(--text);color:var(--bg);border-radius:999px;padding:2px 8px}.teacher-tabs{margin-left:8px}.tabs{display:flex;gap:4px;background:var(--surface-2);padding:4px;border-radius:12px}.tabs a{padding:6px 14px;border-radius:9px;color:var(--muted);text-decoration:none;font-weight:600;font-size:.95rem}.tabs a.active{background:var(--surface);color:var(--text);box-shadow:var(--shadow)}@media(max-width:640px){.teacher-tabs{order:5;width:100%;margin:0}.topbar{flex-wrap:wrap}}.page-head{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:14px}.page-head h1{margin:0}.page-head p{margin:4px 0 0}.head-actions{display:flex;gap:8px;flex-wrap:wrap}.panel{padding:16px;margin-bottom:14px}.panel h2{font-size:1.1rem;margin-bottom:10px}.panel-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px}.panel-head h2{margin:0}.stat-label{display:block;color:var(--muted);font-size:.78rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px}.class-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.class-card{display:flex;flex-direction:column;gap:14px;margin:0}.code{font-family:ui-monospace,SF Mono,Menlo,monospace;letter-spacing:.08em;font-size:1.05em}.class-code .code{font-size:1.5rem}.code-show,.code-edit{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.code-edit input{font:inherit;font-family:ui-monospace,Menlo,monospace;font-size:1.1rem;width:10ch;padding:.4em .6em;color:var(--text);background:var(--surface-2);border:1px solid var(--border);border-radius:8px}.module-row{display:flex;align-items:center;gap:8px;padding:4px 0}.module-row input{width:18px;height:18px}.module-row.not-built{color:var(--muted)}.card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto}.table-wrap{overflow-x:auto}table.data{width:100%;border-collapse:collapse;font-size:.95rem}table.data th{text-align:left;color:var(--muted);font-size:.78rem;text-transform:uppercase;letter-spacing:.04em;font-weight:600;padding:6px 8px;border-bottom:1px solid var(--border)}table.data td{padding:8px;border-bottom:1px solid var(--border);vertical-align:middle}.num{text-align:right!important;white-space:nowrap}.mono{font-family:ui-monospace,SF Mono,Menlo,monospace}.row-actions{display:flex;gap:6px;justify-content:flex-end}.btn-chip{padding:.3em .7em;font-size:.85rem;border-radius:999px}.note{background:var(--warn-soft);border-radius:10px;padding:.6em .8em}.success{background:var(--good-soft);color:var(--good);border-radius:10px;padding:.6em .8em;font-weight:600}.file-btn{position:relative;overflow:hidden}.file-btn input{position:absolute;inset:0;opacity:0;cursor:pointer}.file-name{margin-left:10px}.plan-classes{padding-left:1.2em}.plan-list{margin:8px 0}.plan-list summary{cursor:pointer}.plan-list ul{margin:6px 0;padding-left:1.2em;columns:2 260px}.add-form{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));align-items:end}.add-form .field{margin:0}.add-form .btn{height:2.9em}.teacher .topbar .brand span,.tabs a,.btn{white-space:nowrap}@media(max-width:900px){.teacher .topbar .who{display:none}}.module-row{min-height:40px;cursor:pointer}.module-row input{width:22px;height:22px}.teacher .btn{min-height:40px}.wall-controls{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin:4px 0 14px}.wall-controls .seg{margin:0}.wall{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(255px,1fr));margin-bottom:14px}.wall-compact{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}.bcard{display:flex;flex-direction:column;gap:6px;text-align:left;font:inherit;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px 14px 14px 18px;position:relative;min-width:0}button.bcard{cursor:pointer}button.bcard:hover{border-color:var(--accent)}.bcard:before{content:"";position:absolute;left:6px;top:14px;bottom:14px;width:4px;border-radius:2px;background:var(--border)}.edge-up:before{background:var(--good)}.edge-down:before{background:var(--danger)}.bcard-compact{gap:3px;padding:10px 10px 10px 16px}.bc-head{display:flex;align-items:center;gap:8px;min-width:0}.bc-rank{flex:none;min-width:26px;height:26px;border-radius:999px;display:grid;place-items:center;background:var(--surface-2);font-weight:800;font-size:.85rem}.bc-name{font-weight:700;font-size:1.1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bc-total{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.bc-total b{font-size:1.5rem;font-variant-numeric:tabular-nums}.bcard-compact .bc-total b{font-size:1.3rem}.bc-total span{font-weight:700;font-variant-numeric:tabular-nums}.bc-today{font-size:.85rem;color:var(--muted);display:flex;flex-wrap:wrap;gap:4px 10px}.bc-today span{font-weight:600}.bc-market{color:var(--muted)!important}.bc-holdings{border-top:1px solid var(--border);padding-top:8px;display:grid;gap:3px}.bc-pos{display:grid;grid-template-columns:58px 1fr auto;gap:6px;font-variant-numeric:tabular-nums;font-size:.95rem}.bc-cash{color:var(--muted);margin-top:4px}.bc-wait{color:var(--warn);font-weight:600;font-size:.85rem}.settings hr{border:0;border-top:1px solid var(--border);margin:16px 0}.inline-form{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}.inline-form .field{margin:0;max-width:220px}.btn-danger{color:var(--danger);border-color:var(--danger)}.projector{min-height:100vh;padding:20px 24px 32px;background:var(--bg)}.proj-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:18px}.proj-head h1{font-size:clamp(1.8rem,3vw,2.6rem);margin:0}.proj-head p{margin:4px 0 0;color:var(--muted);font-size:1.1rem}.proj-actions{display:flex;align-items:center;gap:8px}.proj-time{color:var(--muted);margin-right:6px}.proj-empty{font-size:1.4rem;color:var(--muted);text-align:center;margin-top:20vh}.proj-grid{grid-template-columns:repeat(var(--cols, 4),minmax(0,1fr));gap:.75em;font-size:calc(var(--fit, 1) * clamp(13px,1.2vw,20px))}.proj-grid .bcard{padding:.7em .7em .7em 1.15em;gap:.2em}.proj-grid .bcard:before{top:.8em;bottom:.8em;left:.4em}.proj-grid .bc-head{align-items:flex-start;gap:.45em}.proj-grid .bc-name{font-size:1.15em;white-space:normal;overflow-wrap:anywhere;line-height:1.15}.proj-grid .bc-rank{min-width:1.65em;height:1.65em;font-size:.8em}.proj-grid .bc-total{flex-wrap:wrap;column-gap:.5em;row-gap:0}.proj-grid .bc-total b{font-size:1.55em}.proj-grid .bc-total span{font-size:.95em;white-space:nowrap}.proj-grid .bc-today{font-size:.8em}@media(max-width:700px){.proj-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}:root{--bg: #f5f7fb;--surface: #ffffff;--surface-2: #eef2f8;--text: #16202e;--muted: #5b6778;--border: #d9e0ea;--accent: #1f6feb;--accent-text: #ffffff;--accent-soft: #e3edff;--good: #1a7f37;--good-soft: #dcf5e3;--warn: #9a6700;--warn-soft: #fff4d6;--danger: #c62828;--danger-soft: #fde8e8;--radius: 14px;--shadow: 0 1px 2px rgb(16 24 40 / 6%), 0 4px 16px rgb(16 24 40 / 6%);--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;color-scheme:light dark}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg: #0e131b;--surface: #161d28;--surface-2: #1e2734;--text: #e8edf4;--muted: #97a3b4;--border: #2a3444;--accent: #4c8dff;--accent-soft: #1a2a45;--good: #4ac26b;--good-soft: #15301f;--warn: #e3b341;--warn-soft: #332a12;--danger: #ff6b6b;--danger-soft: #3a1818;--shadow: 0 1px 2px rgb(0 0 0 / 30%), 0 4px 16px rgb(0 0 0 / 25%)}}*{box-sizing:border-box}html,body{margin:0}body{background:var(--bg);color:var(--text);font-family:var(--font);font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}h1,h2{line-height:1.2;margin:0 0 .35em}h1{font-size:1.75rem}a{color:var(--accent)}.muted{color:var(--muted)}.small{font-size:.875rem}.center{text-align:center}.splash{min-height:100vh}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.4em;padding:.65em 1.1em;border-radius:10px;border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;font-weight:600;text-decoration:none;cursor:pointer}.btn:hover{background:var(--surface-2)}.btn:focus-visible,input:focus-visible,.tile:focus-visible{outline:3px solid var(--accent);outline-offset:2px}.btn-primary{background:var(--accent);border-color:var(--accent);color:var(--accent-text)}.btn-primary:hover{background:var(--accent);filter:brightness(1.08)}.btn-primary:disabled{opacity:.7;cursor:progress}.btn-quiet{border-color:transparent;background:transparent;color:var(--muted)}.btn-block{width:100%;padding:.8em;font-size:1.05rem}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}.error{background:var(--danger-soft);color:var(--danger);border-radius:10px;padding:.6em .8em;margin:0 0 1em;font-weight:500}.signin{min-height:100vh;display:grid;place-items:center;padding:24px 16px}.signin-card{width:100%;max-width:380px;padding:28px 24px}.signin-head{text-align:center;margin-bottom:20px}.signin-head img{display:block;margin:0 auto 10px;border-radius:12px}.signin-head p{margin:0}.field{display:block;margin-bottom:14px}.field span{display:block;font-weight:600;font-size:.9rem;margin-bottom:4px}.field input{width:100%;padding:.7em .8em;font:inherit;font-size:1.15rem;letter-spacing:.04em;color:var(--text);background:var(--surface-2);border:1px solid var(--border);border-radius:10px}.topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:12px;padding:10px 16px;background:var(--surface);border-bottom:1px solid var(--border)}.brand{display:flex;align-items:center;gap:8px;font-weight:700;color:var(--text);text-decoration:none}.brand img{border-radius:7px}.who{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;min-width:0}.who-name{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.who-class{color:var(--muted);font-size:.8rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.content{max-width:1100px;margin:0 auto;padding:24px 16px 48px}.hello{margin-bottom:20px}.hello p{margin:0}.section-title{font-size:.85rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:24px 0 10px}.tiles{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}.tile{display:flex;flex-direction:column;gap:4px;padding:18px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);color:var(--text);text-decoration:none;transition:transform .12s ease,border-color .12s ease}a.tile:hover{transform:translateY(-2px);border-color:var(--accent)}.tile-icon{font-size:2rem;line-height:1;margin-bottom:6px}.tile-name{font-weight:700;font-size:1.1rem}.tile-tag{color:var(--muted);font-size:.92rem;flex:1}.tile-status{align-self:flex-start;margin-top:10px;padding:2px 10px;border-radius:999px;font-size:.8rem;font-weight:600}.status-live{background:var(--good-soft);color:var(--good)}.status-building{background:var(--warn-soft);color:var(--warn)}.status-planned,.status-off{background:var(--surface-2);color:var(--muted)}.tiles-later .tile{box-shadow:none;background:transparent}.tile-off .tile-icon{filter:grayscale(.6);opacity:.75}.empty{max-width:520px;margin:24px auto;padding:32px 24px;text-align:center}.empty-icon{font-size:3rem}@media(max-width:480px){.brand span{display:none}h1{font-size:1.5rem}}.site-footer{display:flex;justify-content:center;flex-wrap:wrap;gap:6px 16px;padding:18px 16px 24px;color:var(--muted);font-size:.85rem}.site-footer a{color:var(--muted)}.signin .site-footer{padding-bottom:0}.signin{grid-template-rows:1fr auto}.legal{max-width:760px;line-height:1.6}.legal h2{font-size:1.15rem;margin:1.6em 0 .4em}.legal ul{padding-left:1.2em}.legal li{margin:.35em 0}
