Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869/* UX pass: reduce ornamental copy and give the working surfaces a clearer hierarchy. These rules intentionally stay on top of the earlier visual language so the change is reversible without touching the domain model. */.app-sidebar .brand-copy small { display: none;}
.today-page > .page-title { align-items: center; padding-bottom: 22px;}
.today-page > .page-title h1 { margin-top: 0; font-size: 24px; letter-spacing: -.025em;}
.today-page .today-grid { grid-template-columns: minmax(0, 1fr) 260px;}
.today-page .knowledge-summary { min-height: 100%;}
.workspace-layout { grid-template-rows: 72px 52px minmax(0, 1fr); background: #e8ece7;}
.workspace-appbar { padding: 12px 20px; background: rgba(251, 252, 248, .96); border-bottom-color: #d8ded8;}
.workspace-app-title { min-width: 0; display: grid; grid-template-columns: auto auto minmax(0, 1fr); align-items: baseline; gap: 10px;}
.workspace-app-kicker { color: var(--green); font-size: 10px; font-weight: 800; letter-spacing: .14em;}
.workspace-app-title h1 { margin: 0; color: var(--ink); font-size: 18px; letter-spacing: -.02em;}
.workspace-active-title { min-width: 0; overflow: hidden; padding-left: 10px; color: var(--muted); border-left: 1px solid var(--line); font-size: 12px; text-overflow: ellipsis; white-space: nowrap;}
.workspace-save-state { min-height: 28px; display: inline-flex; align-items: center; padding: 0 9px; color: #52705f; background: #edf3ed; border: 1px solid #d5e1d7; border-radius: 999px; font-size: 11px; font-weight: 700;}
.workspace-tabs { gap: 6px; padding: 8px 16px 0; background: #e8ece7; border-bottom: 0;}
.workspace-tab { max-width: 280px; overflow: hidden; background: rgba(255, 255, 255, .42); border: 1px solid transparent; border-radius: 10px 10px 0 0;}
.workspace-tab.active { color: var(--ink); background: #fbfaf6; border-color: #d8ded8; border-bottom-color: #fbfaf6; box-shadow: 0 -1px 0 rgba(255,255,255,.72), inset 0 -2px var(--green);}
.workspace-panes { grid-template-columns: minmax(0, 1.12fr) minmax(360px, .88fr); gap: 14px; padding: 0 16px 16px; background: #e8ece7;}
.workspace-panes.with-agent { position: relative; grid-template-columns: minmax(0, 1.12fr) minmax(360px, .88fr);}
.workspace-panes.resource-empty { grid-template-columns: minmax(220px, .52fr) minmax(0, 1.48fr);}
.resource-empty-action { margin-top: 12px;}
.workspace-panes.with-agent > .agent-panel { position: absolute; z-index: 30; inset: 0 16px 16px auto; width: min(360px, 34%);}
.workspace-window { overflow: hidden; background: #fffdf8; border: 1px solid #d3dbd4; border-radius: 14px; box-shadow: 0 12px 28px rgba(34, 49, 40, .08);}
.resource-pane { background: #17201c; border-color: #27352d;}
.resource-pane > header { min-height: 52px; padding-inline: 16px; color: #d7e2da; background: #223028; border-bottom-color: #34463b;}
.resource-pane > header div span { color: #eef5ef;}
.resource-pane > header a { color: #a9c6b2;}
.workspace-note-pane > header { min-height: 52px; padding-inline: 16px; background: #fffdf8;}
.workspace-note-scroll > article { max-width: 760px; padding: 42px clamp(28px, 4vw, 52px) 96px;}
.workspace-note-scroll h2 { font-size: clamp(30px, 3vw, 44px); line-height: 1.02;}
.agent-panel { overflow: hidden; border: 1px solid #d8d4e7; border-radius: 14px; box-shadow: 0 12px 28px rgba(46, 40, 66, .1);}
.learning-page > .page-title { align-items: center; padding-bottom: 20px;}
.learning-page > .page-title h1 { margin-top: 0; font-size: 30px;}
.learning-workbench { margin-top: 0; border: 1px solid #d8ded8; border-radius: 16px; background: #fffdf8; box-shadow: 0 12px 28px rgba(34, 49, 40, .07);}
/* When there is only one learning space, a persistent switcher column adds no navigation value and makes the lesson editor feel artificially narrow. The selected space title remains visible in the workspace header; the rail returns automatically as soon as a second space exists. */.learning-workbench.single-space { grid-template-columns: minmax(0, 1fr);}
.learning-workbench.single-space > .learning-rail { display: none;}
.learning-rail { padding: 12px 10px; background: #f1f3ee; border-right-color: #d9ded9;}
.learning-rail > button { min-height: 66px; margin: 2px 0; border: 0; border-radius: 10px;}
.learning-rail > button:hover,.learning-rail > button.active { background: #e5efe6; box-shadow: inset 3px 0 var(--green);}
.course-workspace { background: #fffdf8;}
.course-workspace > header { min-height: 96px; align-items: center; padding: 22px 28px; background: #fffdf8;}
.course-workspace h2 { margin-top: 0; font-size: 30px; line-height: 1.06;}
.lesson-outline { padding: 8px; background: #f8f8f2; border-right-color: #d9ded9;}
.lesson-outline > button { min-height: 74px; margin: 2px 0; border: 0; border-radius: 10px;}
.lesson-outline > button:hover,.lesson-outline > button.active { background: #e5efe6; box-shadow: inset 3px 0 var(--green);}
.lesson-editor { background: #fffdf8;}
.lesson-editor > header { min-height: 72px; padding: 14px 22px; background: #fffdf8;}
.lesson-editor > header input { font-size: 17px;}
.lesson-editor > header span { padding: 5px 8px; color: var(--muted); background: #f0f4ed; border-radius: 999px; white-space: nowrap;}
.lesson-scroll { padding: 26px clamp(24px, 4vw, 52px);}
.lesson-editor > footer { min-height: 64px; padding: 12px 22px; background: #fffdf8;}
.image-url-disclosure { margin-top: 5px; border-top: 1px solid var(--line);}
.image-url-disclosure > summary { padding: 12px 0 2px; color: var(--muted); cursor: pointer; font-size: 12px; font-weight: 650; list-style: none;}
.image-url-disclosure > summary::-webkit-details-marker { display: none;}
.image-url-disclosure > summary::before { display: inline-block; margin-right: 7px; color: var(--green); content: "+"; font-size: 15px; font-weight: 500;}
.image-url-disclosure[open] > summary::before { content: "−";}
@media (min-width: 821px) and (max-width: 1100px) { .workspace-panes.with-agent { position: relative; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.workspace-panes.with-agent > .agent-panel { position: absolute; z-index: 30; inset: 0 16px 16px auto; width: min(420px, calc(100% - 24px)); border: 1px solid #d8d4e7; box-shadow: -18px 0 42px rgba(46, 40, 66, .18); }}
@media (max-width: 760px) { .workspace-layout { grid-template-rows: 62px 46px minmax(0, 1fr); }
.workspace-appbar { padding-inline: 12px; }
.workspace-app-title { grid-template-columns: auto minmax(0, 1fr); gap: 4px 8px; }
.workspace-app-kicker { display: none; }
.workspace-active-title { grid-column: 1 / -1; padding-left: 0; border-left: 0; font-size: 11px; }
.workspace-panes, .workspace-panes.with-agent { padding: 8px; gap: 8px; }
.workspace-panes.with-agent > .agent-panel { position: static; inset: auto; width: auto; min-height: 460px; }
.workspace-window { min-height: calc(100dvh - 176px); border-radius: 12px; }
.learning-page > .page-title { padding-bottom: 14px; }
.learning-page > .page-title h1 { font-size: 26px; }
.learning-workbench { height: auto; min-height: 0; border-radius: 12px; }
.course-workspace > header { min-height: 86px; padding: 18px 16px; }
.course-workspace h2 { font-size: 26px; }
.lesson-editor { min-height: calc(100dvh - 340px); }
.learning-page > .page-title > .page-actions { width: 100%; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }
.learning-page > .page-title > .page-actions > button { min-width: 0; justify-content: center; padding-inline: 8px; }
.lesson-editor > header { min-height: 0; flex-direction: column; align-items: stretch; gap: 8px; }
.lesson-editor > header input { width: 100%; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: 14px; }
.lesson-editor > header span { align-self: flex-start; }
.lesson-editor > footer { flex-direction: column; align-items: stretch; gap: 10px; }
.lesson-editor > footer .primary-button { justify-content: center; }}
@media (max-width: 480px) { .workspace-app-title { grid-template-columns: auto auto; min-width: 56px; }
.workspace-app-title h1 { min-width: 56px; white-space: nowrap; }
.workspace-active-title { display: none; }
.workspace-note-scroll > article { padding-inline: 22px; }}
/* Final responsive cleanup for the current Forge surfaces. Earlier visual passes intentionally remain above the base system, so these rules only remove the last conflicting chrome and overflow at the real viewport edge. */html,body,#root { min-width: 0;}
.workspace-layout { min-height: 0; grid-template-rows: 58px 40px minmax(0, 1fr);}
.workspace-appbar { gap: 12px; padding: 8px 14px;}
.workspace-actions { min-width: 0; gap: 5px;}
.workspace-note-picker > summary,.workspace-actions > .secondary-button { min-height: 34px; padding-inline: 10px; border-radius: 6px; font-size: 12px;}
.workspace-tabs { height: 40px; gap: 4px; padding: 4px 10px 0;}
.workspace-tab,.workspace-tabs .new-workspace-tab { height: 36px;}
.workspace-tab { font-size: 12px;}
.resource-content { background: #eef0eb;}
.resource-content.has-resource,.resource-content.has-resource .resource-frame-shell { background: #151916;}
.resource-content.is-empty .empty-state { min-height: 0; color: #6f7d75;}
.resource-content.is-empty .empty-icon { width: 38px; height: 38px; margin-bottom: 10px;}
.resource-content.is-empty .empty-state strong { color: #334239; font-size: 13px;}
.note-picker[open] > div { width: min(280px, calc(100vw - 24px)); max-height: min(320px, 60vh);}
.code-window-header { grid-template-columns: auto minmax(0, 1fr);}
.whiteboard-layout .board-save-state { min-width: 0; max-width: min(160px, 22vw); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.whiteboard-layout .board-actions { min-width: 0;}
.learning-page > .page-title h1 { font-size: 28px;}
.course-workspace > header { min-height: 88px; padding: 18px 24px;}
.course-workspace h2 { font-size: clamp(24px, 2.3vw, 30px);}
.lesson-outline > button { min-height: 66px;}
@media (max-width: 1100px) { .workspace-actions > .secondary-button { padding-inline: 8px; }
.whiteboard-layout .board-commandbar { gap: 10px; padding-inline: 12px; }}
@media (min-width: 761px) and (max-width: 1100px) { .whiteboard-layout .board-commandbar { gap: 8px; padding-inline: 10px; }
.whiteboard-layout .board-breadcrumb { flex: 1 1 auto; min-width: 0; }
.whiteboard-layout .board-breadcrumb input { width: 100%; max-width: 280px; min-width: 0; }
.whiteboard-layout .board-actions { flex: 0 0 auto; gap: 5px; }
.whiteboard-layout .board-actions > .secondary-button, .whiteboard-layout .board-insert-menu > summary { width: 36px; min-width: 36px; justify-content: center; gap: 0; padding-inline: 0; font-size: 0; }
.whiteboard-layout .board-actions > .secondary-button svg, .whiteboard-layout .board-insert-menu > summary svg { flex: none; }
.whiteboard-layout .save-state { max-width: 96px; overflow: hidden; text-overflow: ellipsis; }}
@media (min-width: 821px) and (max-width: 1100px) { .workspace-panes.resource-empty { grid-template-columns: minmax(200px, .42fr) minmax(0, 1.58fr); }}
@media (max-width: 760px) { .workspace-layout { grid-template-rows: 56px 42px minmax(0, 1fr); }
.workspace-appbar { padding-inline: 10px; }
.workspace-tabs { height: 42px; padding-inline: 8px; }
.whiteboard-layout .board-save-state { max-width: 120px; }
.workspace-panes.resource-empty { grid-template-columns: 1fr; }
.workspace-window-header { min-height: 48px; padding-right: 9px; }
.workspace-window-control { width: 30px; min-width: 30px; height: 30px; }
.workspace-window-control svg, .workspace-window-controls:hover .workspace-window-control svg, .workspace-window-control:focus-visible svg { width: 13px; height: 13px; }
.tool-button { width: 34px; min-width: 34px; height: 34px; }}
.lesson-outline .is-placeholder,.lesson-outline .is-placeholder strong { color: #6c7d72;}
/* Workspace Agent Companion is a mobile bottom sheet, not another document in the scroll flow. Keep it visible when opened instead of placing the dialog below both workspace windows. */@media (max-width: 760px) { .workspace-panes.with-agent > .agent-panel { position: fixed; z-index: 50; inset: auto 8px 8px; width: auto; height: min(460px, calc(100dvh - 96px)); min-height: 0; max-height: calc(100dvh - 96px); border: 1px solid #d7d2e8; border-radius: 14px; box-shadow: 0 18px 44px rgba(46, 40, 66, .24); }}
/* Empty resource windows should not consume the whole mobile viewport. The note is the active working context until a resource is explicitly opened. */@media (max-width: 760px) { .workspace-panes > .resource-pane.is-empty { min-height: 184px; }
.workspace-panes > .resource-pane.is-empty .resource-content { min-height: 112px; }
.workspace-panes > .resource-pane.is-empty .resource-content .empty-state { min-height: 112px; padding: 16px; }
.workspace-panes > .workspace-note-pane { min-height: 520px; }}
@media (max-width: 660px) { .graph-page { grid-template-rows: 88px minmax(0, 1fr); }
.graph-commandbar { display: block; padding: 4px 10px 8px 58px; }
.graph-command-title { width: 100%; height: 28px; display: flex; }
.graph-command-title strong { font-size: 14px; }
.graph-search { width: 100%; height: 40px; }
.graph-command-actions { display: none; }
.graph-bottom-dock { right: 8px; bottom: 58px; left: 8px; justify-content: space-between; gap: 6px; }
.graph-legend { max-width: calc(100% - 84px); display: flex; gap: 8px; overflow-x: auto; padding-inline: 8px; font-size: 10px; }
.graph-legend span:last-child { display: none; }
.graph-legend i { width: 18px; }}
/* UX hardening: keep Today genuinely single-column on narrow screens and give tablet Notes an honest command surface with a stable save state. */.save-state { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;}
.save-state svg { flex: none; width: 13px; height: 13px;}
.save-state-saved { color: var(--muted); }.save-state-saving { color: var(--green); }.save-state-unsaved { color: #8a6b27; }.save-state-failed { max-width: 240px; overflow: hidden; color: var(--danger); text-overflow: ellipsis;}.save-state-failed span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.tag-input.is-read-only { color: var(--muted);}
.document-preview-mode .document-title-input,.document-preview-mode .document-excerpt-input { cursor: default;}
.document-preview-mode .document-title-input:focus,.document-preview-mode .document-excerpt-input:focus { outline: none;}
.mobile-note-actions { display: none;}
.row-actions a span { display: none;}
@media (max-width: 760px) { .today-page .today-grid { grid-template-columns: minmax(0, 1fr); gap: 28px; }
.today-page .section-bar { min-height: 0; align-items: flex-start; gap: 12px; padding-bottom: 14px; }
.today-page .section-bar h2 { margin-top: 0; font-size: 28px; line-height: 1.08; }
.today-page .section-bar button { flex: 0 0 auto; margin-left: auto; }
.today-page .today-context { display: block; border-top: 1px solid var(--line); border-left: 0; }
.today-page .today-context > section, .today-page .today-context > section + section { padding: 20px 0 0; border: 0; }
.today-page .knowledge-summary { min-height: 0; }
.today-page .knowledge-summary > strong { margin-top: 8px; font-size: 42px; }
.today-page .knowledge-summary dl { margin-top: 14px; }}
@media (min-width: 821px) and (max-width: 1050px) { .notes-layout { grid-template-columns: minmax(270px, 30vw) minmax(0, 1fr); }
.notes-layout .document-commandbar { min-height: 58px; gap: 10px; padding-inline: 10px; }
.notes-layout .save-indicator { min-width: 0; flex: 1 1 auto; }
.notes-layout .save-state-failed { max-width: 150px; }
.notes-layout .commandbar-actions { flex: 0 0 auto; gap: 4px; }
.notes-layout .commandbar-actions > button:not(.editor-focus-toggle) { width: 34px; padding-inline: 0; justify-content: center; }
.notes-layout .commandbar-actions > button.primary-button { width: 34px; min-width: 34px; padding-inline: 0; justify-content: center; }
.notes-layout .commandbar-actions > button.primary-button span { display: none; }
.notes-layout .document-canvas { width: min(760px, calc(100% - 48px)); padding-top: 36px; }
.notes-layout .document-title-input { font-size: clamp(34px, 5vw, 46px); line-height: 1.02; }
.notes-layout .tag-input input { min-width: 80px; }}
@media (max-width: 480px) { .notes-layout .commandbar-actions > button:not(.primary-button) { display: none; }
.notes-layout .mobile-note-actions { display: block; margin-bottom: 4px; padding-bottom: 4px; border-bottom: 1px solid var(--line); }
.notes-layout .mobile-note-actions button { justify-content: flex-start; gap: 8px; }
.notes-layout .mobile-note-actions button svg, .notes-layout .more-menu[open] > div > button svg { width: 14px; }}
@media (max-width: 760px) { .shelf-page .folder-rail.has-scroll-hint, .learning-page .learning-rail.has-scroll-hint { position: relative; } .shelf-page .folder-rail.has-scroll-hint .collection-scroll-hint, .learning-page .learning-rail.has-scroll-hint .collection-scroll-hint { position: absolute; z-index: 2; top: 0; right: 0; bottom: 0; width: 32px; display: grid; place-items: center; padding: 0; font-weight: 400; letter-spacing: normal; color: #6e7e75; background: linear-gradient(90deg, rgba(245,243,237,0), rgba(245,243,237,.98) 68%); pointer-events: none; } .shelf-page .folder-rail.has-scroll-hint .collection-scroll-hint svg, .learning-page .learning-rail.has-scroll-hint .collection-scroll-hint svg { width: 15px; } .shelf-page .folder-rail { scroll-snap-type: x proximity; scroll-padding-inline: 14px; }
.shelf-page .folder-rail > button { min-width: 170px; scroll-snap-align: start; }
.shelf-page .folder-rail > button > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.shelf-page .resource-table article { grid-template-columns: 34px minmax(0, 1fr) auto; }
.shelf-page .row-actions { gap: 4px; }
.shelf-page .row-actions a { width: auto; min-width: 52px; display: inline-flex; align-items: center; justify-content: center; gap: 4px; padding-inline: 6px; font-size: 12px; }
.shelf-page .row-actions a span { display: inline; }
.shelf-page .row-actions button { width: 30px; min-width: 30px; }
.learning-page .lesson-editor > footer { position: sticky; bottom: 0; z-index: 4; box-shadow: 0 -8px 18px rgba(34, 49, 40, .08); }
.learning-page .lesson-scroll { padding-bottom: 32px; }
.problems-layout .problem-canvas .document-title-input { font-size: clamp(34px, 9vw, 42px); line-height: 1.02; }
.problems-layout .problem-section.solution-section { margin-top: 36px; }
.problems-layout .problem-detail.agent-open > .agent-panel { position: fixed; inset: auto 0 0; width: 100%; max-height: min(70dvh, 560px); border-top: 1px solid var(--line-strong); border-left: 0; border-radius: 16px 16px 0 0; box-shadow: 0 -14px 40px rgba(30, 40, 35, .18); }}
/* Focus corrective pass: keep the active tab readable without letting the long resource title compete with the command actions. The previous inline title treatment collapsed into an unexplained clipped sentence at medium widths. */.workspace-appbar { min-width: 0; gap: 12px;}
.workspace-app-title { min-width: 0; flex: 1 1 auto; display: flex; align-items: center; gap: 10px;}
.workspace-app-kicker { flex: none;}
.workspace-app-title h1 { flex: none;}
.workspace-active-title { min-width: 0; max-width: min(360px, 34vw); flex: 1 1 240px; overflow: hidden; padding: 5px 9px; color: var(--ink-soft); background: #f1f4ee; border: 1px solid #d9e1d8; border-radius: 7px; font-size: 12px; line-height: 1.2; text-overflow: ellipsis; white-space: nowrap;}
.workspace-actions { flex: 0 0 auto;}
@media (max-width: 1100px) { .workspace-appbar { padding-inline: 12px; }
.workspace-app-kicker { display: none; }
.workspace-active-title { max-width: min(260px, 30vw); }}
@media (max-width: 760px), (max-device-width: 760px) { .workspace-app-title { gap: 7px; }
.workspace-active-title { max-width: none; flex-basis: 0; padding: 4px 7px; font-size: 11px; }}
/* Medium and portrait devices need the same shell contract as mobile: the navigation is an overlay, never a permanently reserved 76px rail. The Knowledge Graph is intentionally excluded because its approved spatial composition owns its navigation chrome. */@media (max-width: 1100px) { .app-shell:not(.graph-focus), .app-shell.sidebar-collapsed:not(.graph-focus) { width: 100%; min-width: 0; padding-left: 0 !important; }
.app-shell:not(.graph-focus) .app-content { width: 100%; min-width: 0; }
.app-shell:not(.graph-focus) .app-sidebar { width: var(--sidebar-width); transform: translateX(-100%); visibility: hidden; pointer-events: none; }
.app-shell:not(.graph-focus) .app-sidebar.mobile-open { transform: translateX(0); visibility: visible; pointer-events: auto; }
/* The legacy 821–1050px rail rules hide labels unconditionally. Once the rail becomes an open overlay, restore the full navigation vocabulary. */ .app-shell:not(.graph-focus) .app-sidebar.mobile-open .brand-copy, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .command-search span, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .command-search kbd, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .nav-group-label, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .nav-group button span, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .sidebar-footer > button span { display: block; }
.app-shell:not(.graph-focus) .app-sidebar.mobile-open .command-search, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .nav-group button, .app-shell:not(.graph-focus) .app-sidebar.mobile-open .sidebar-footer > button { justify-content: flex-start; padding-inline: 11px; }
.app-shell:not(.graph-focus).sidebar-collapsed .brand-copy, .app-shell:not(.graph-focus).sidebar-collapsed .command-search span, .app-shell:not(.graph-focus).sidebar-collapsed .command-search kbd, .app-shell:not(.graph-focus).sidebar-collapsed .nav-group-label, .app-shell:not(.graph-focus).sidebar-collapsed .nav-group button span, .app-shell:not(.graph-focus).sidebar-collapsed .sidebar-footer > button span { display: block; }
.app-shell:not(.graph-focus).sidebar-collapsed .command-search, .app-shell:not(.graph-focus).sidebar-collapsed .nav-group button, .app-shell:not(.graph-focus).sidebar-collapsed .sidebar-footer > button { justify-content: flex-start; padding-inline: 11px; }
.app-shell:not(.graph-focus) .mobile-navigation-button { display: grid; }
.app-shell:not(.graph-focus) .standard-page { padding-top: 68px; }
.app-shell:not(.graph-focus) .notes-layout, .app-shell:not(.graph-focus) .problems-layout, .app-shell:not(.graph-focus) .whiteboard-layout { width: 100%; min-width: 0; padding-top: 0; }
.app-shell:not(.graph-focus) .workspace-layout { width: 100%; min-width: 0; padding-top: 0; grid-template-rows: 62px 42px minmax(0, 1fr); }}
@media (max-width: 760px), (max-device-width: 760px) { .app-shell:not(.graph-focus) .notes-layout, .app-shell:not(.graph-focus) .problems-layout, .app-shell:not(.graph-focus) .whiteboard-layout { padding-top: 48px; }
.app-shell:not(.graph-focus) .workspace-layout { padding-top: 48px; }}
/* Whiteboards: keep the drawing surface usable on a narrow device. Excalidraw ships a full-width mobile bottom bar by default; inside Forge that creates a large empty slab and makes the actual board feel squeezed. The Forge shell keeps the same tools, but lets both control islands size to their content and scrolls the tool row instead of shrinking every affordance. */@media (max-width: 760px), (max-device-width: 760px) { .whiteboard-layout .board-commandbar { box-shadow: 0 1px 0 rgba(39, 54, 46, .03); }
.forge-excalidraw-canvas .excalidraw .App-top-bar { left: 12px; right: 12px; width: auto; overflow: visible; }
.forge-excalidraw-canvas .excalidraw .App-toolbar.App-toolbar--mobile { width: max-content; min-width: 0; max-width: calc(100vw - 24px); justify-content: flex-start; overflow-x: auto; scrollbar-width: none; }
.forge-excalidraw-canvas .excalidraw .App-toolbar.App-toolbar--mobile::-webkit-scrollbar { display: none; }
.forge-excalidraw-canvas .excalidraw .App-toolbar.App-toolbar--mobile > .Stack { width: max-content; min-width: max-content; /* Ten shape tools + divider + extra-tools trigger overflow the bar by ~9px at 390px, clipping the trigger behind the scroll edge. Tighten icon spacing so the row fits without scrolling. */ gap: 2px; }
.forge-excalidraw-canvas .excalidraw .App-toolbar.App-toolbar--mobile .ToolIcon__keybinding { display: none; }
/* Excalidraw positions the auxiliary tool island slightly beyond the canvas edge on narrow screens. Keep the whole control surface tappable inside Forge's clipped canvas. */ .forge-excalidraw-canvas .excalidraw .mobile-misc-tools-container { transform: translateX(-8px); }
.forge-excalidraw-canvas .excalidraw .App-bottom-bar { right: 12px; bottom: 12px; left: 12px; width: auto; height: auto; margin: 0; padding: 0; pointer-events: none; }
.forge-excalidraw-canvas .excalidraw .App-bottom-bar > .Island { width: max-content; min-width: 0; max-width: 100%; pointer-events: auto; }
.forge-excalidraw-canvas .excalidraw .App-bottom-bar .App-toolbar-content { width: max-content; min-width: 0; justify-content: flex-start; gap: 4px; }}
/* Status text is useful while work is in flight or needs attention. A permanent "Saved" label is not a destination or an action, so empty indicators collapse instead of reserving space in command bars. */.save-indicator:empty,.workspace-save-state:empty,.board-save-state:empty { display: none;}
.lesson-save-status { flex: 1 1 auto;}
.lesson-save-status:empty { min-height: 1px;}
/* Focus keeps the document title in the window chrome. The reading surface should spend its first viewport on the actual note, not repeat that title in a second, oversized heading. */.workspace-window-header > div:first-child { min-width: 0; flex: 1 1 auto; overflow: hidden;}
.workspace-window-header > div:first-child > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.workspace-window-header-actions > a { width: 28px; min-width: 28px; height: 28px; justify-content: center; padding: 0;}
.workspace-window-context { display: none;}
.workspace-note-scroll > article { padding-top: 25px;}
.workspace-note-scroll > article > .tag-row:first-child { margin-top: 0; margin-bottom: 22px;}
.workspace-save-state.error { max-width: min(280px, 30vw);}
@media (min-width: 761px) and (max-width: 1100px) { /* Focus editor is a mode switch, not a decorative icon. Keep its short label visible on tablet widths; the rest of the command bar may stay icon-only when space is tight. */ .notes-layout .commandbar-actions .editor-focus-toggle span { display: inline !important; }}
/* The shell's navigation rail is part of the viewport width. At 1280px the actual workspace is still too narrow for three honest columns, so the agent must be a complete drawer rather than a sliver laid over the note. */@media (min-width: 761px) and (max-width: 1399px) { .workspace-panes.with-agent { position: relative; }
.workspace-panes.with-agent > .agent-panel { position: absolute; z-index: 40; inset: 0 16px 16px auto; width: min(520px, 48vw); border: 1px solid #d8d4e7; box-shadow: -20px 0 48px rgba(46, 40, 66, .2); }}
@media (min-width: 1400px) { .workspace-panes.with-agent { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(300px, 360px); }
.workspace-panes.with-agent > .agent-panel { position: static; width: auto; }}
/* Last-word responsive corrections. Keep these after the historical style layers above so the current visual contract is deterministic. */html,body,#root { min-width: 0;}
.workspace-layout { min-height: 0; grid-template-rows: 58px 40px minmax(0, 1fr); container-name: workspace; container-type: inline-size;}
.workspace-appbar { gap: 12px; padding: 8px 14px;}
.workspace-actions { min-width: 0; gap: 5px;}
.workspace-note-picker > summary,.workspace-actions > .secondary-button { min-height: 34px; padding-inline: 10px; border-radius: 6px; font-size: 12px;}
.workspace-tabs { height: 40px; gap: 4px; padding: 4px 10px 0;}
.workspace-tab,.workspace-tabs .new-workspace-tab { height: 36px;}
.workspace-tab { font-size: 12px;}
.resource-content { background: #eef0eb;}
.resource-content.has-resource,.resource-content.has-resource .resource-frame-shell { background: #151916;}
.resource-content.is-empty .empty-state { min-height: 0; color: #6f7d75;}
.resource-content.is-empty .empty-icon { width: 38px; height: 38px; margin-bottom: 10px;}
.resource-content.is-empty .empty-state strong { color: #334239; font-size: 13px;}
.note-picker[open] > div { width: min(280px, calc(100vw - 24px)); max-height: min(320px, 60vh);}
.whiteboard-layout .board-save-state { min-width: 0; max-width: min(160px, 22vw); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.whiteboard-layout .board-actions { min-width: 0;}
.learning-page > .page-title h1 { font-size: 28px;}
.course-workspace > header { min-height: 88px; padding: 18px 24px;}
.course-workspace h2 { font-size: clamp(24px, 2.3vw, 30px);}
.lesson-outline > button { min-height: 66px;}
@media (max-width: 1100px) { .workspace-actions > .secondary-button { padding-inline: 8px; }
.whiteboard-layout .board-commandbar { gap: 10px; padding-inline: 12px; }}
@media (max-width: 760px) { .workspace-layout { grid-template-rows: 56px 42px minmax(0, 1fr); }
.workspace-appbar { padding-inline: 10px; }
.workspace-tabs { height: 42px; padding-inline: 8px; }
.whiteboard-layout .board-save-state { max-width: 120px; }}
/* The navigation trigger is also needed at tablet widths. The historical 821–1100px rules only changed its display mode, leaving it in normal flow at the top of Notes and making the button look clipped and too small. */@media (max-width: 1100px) { .app-shell .mobile-navigation-button { position: fixed; top: 12px; left: 12px; z-index: 44; width: 36px; height: 36px; display: grid; place-items: center; color: var(--ink); background: rgba(251, 250, 246, .95); border: 1px solid var(--line-strong); border-radius: 6px; }}
@media (max-width: 760px) { /* A clipped lesson outline is horizontally scrollable. Keep a quiet edge cue so the next lesson is discoverable without adding permanent copy. */ .lesson-outline { box-shadow: inset -28px 0 20px -22px rgba(31, 42, 36, .24); }}
/* Application shell responsive contract. Desktop keeps the persistent rail. Tablet opens navigation as a push panel so it never covers the working surface. Phone turns navigation into a full viewport destination. The menu trigger lives in normal layout flow instead of floating over screen-specific headers. */.app-main-frame { width: 100%; min-width: 0; min-height: 100vh; transition: width 180ms ease, margin-left 180ms ease;}
.mobile-shell-bar { display: none;}
@media (max-width: 1100px) { .app-shell, .app-shell.sidebar-collapsed { width: 100%; min-width: 0; padding-left: 0 !important; }
.app-main-frame { width: 100%; min-height: 100dvh; margin-left: 0; }
.mobile-shell-bar { position: sticky; top: 0; z-index: 44; height: 56px; min-width: 0; display: flex; align-items: center; gap: 10px; padding: 8px 12px; color: var(--ink); background: rgba(251, 250, 246, .96); border-bottom: 1px solid var(--line); backdrop-filter: blur(16px); }
.mobile-shell-bar > strong { min-width: 0; overflow: hidden; font-size: 14px; text-overflow: ellipsis; white-space: nowrap; }
.app-shell .mobile-navigation-button { position: static; inset: auto; z-index: auto; width: 40px; min-width: 40px; height: 40px; display: grid; place-items: center; padding: 0; color: var(--ink); background: var(--paper-pure); border: 1px solid var(--line-strong); border-radius: 10px; box-shadow: none; }
.app-content { width: 100%; min-width: 0; min-height: calc(100dvh - 56px); }
.app-shell .app-sidebar, .app-shell.sidebar-collapsed .app-sidebar { width: 300px; max-width: 100vw; transform: translateX(-100%); visibility: hidden; pointer-events: none; }
.app-shell .app-sidebar.mobile-open, .app-shell.sidebar-collapsed .app-sidebar.mobile-open { width: 300px; transform: translateX(0); visibility: visible; pointer-events: auto; box-shadow: none; }
.app-shell .app-sidebar.mobile-open .brand-copy, .app-shell .app-sidebar.mobile-open .command-search span, .app-shell .app-sidebar.mobile-open .command-search kbd, .app-shell .app-sidebar.mobile-open .nav-group-label, .app-shell .app-sidebar.mobile-open .nav-group button span, .app-shell .app-sidebar.mobile-open .sidebar-footer > button span { display: block; }
.app-shell .app-sidebar.mobile-open .command-search, .app-shell .app-sidebar.mobile-open .nav-group button, .app-shell .app-sidebar.mobile-open .sidebar-footer > button { justify-content: flex-start; padding-inline: 11px; }
.sidebar-collapse { display: none; }
.sidebar-close-mobile { width: 40px; min-width: 40px; height: 40px; display: grid; place-items: center; margin-left: auto; padding: 0; color: #eef4f0; background: rgba(255, 255, 255, .06); border: 1px solid rgba(255, 255, 255, .12); border-radius: 10px; }
.app-shell.navigation-open .app-main-frame { width: calc(100% - 300px); margin-left: 300px; }
.app-shell .standard-page { padding-top: clamp(28px, 4vw, 48px); }
.app-shell .notes-layout, .app-shell .problems-layout, .app-shell .whiteboard-layout, .app-shell .workspace-layout, .app-shell .graph-page { width: 100%; min-width: 0; height: calc(100dvh - 56px); min-height: 0; padding-top: 0; }
.app-shell .library-pane, .app-shell .board-list-pane, .app-shell .document-pane, .app-shell .problem-detail, .app-shell .board-main { height: calc(100dvh - 56px); }}
@media (max-width: 640px) { .app-shell .app-sidebar.mobile-open, .app-shell.sidebar-collapsed .app-sidebar.mobile-open { width: 100vw; }
.app-shell.navigation-open .app-main-frame { width: 100%; margin-left: 0; visibility: hidden; pointer-events: none; }
.app-shell.navigation-open .app-sidebar { visibility: visible; }}
/* Workspace responds to the width it actually receives. This also covers a tablet with the push navigation open, where the viewport is still wide but the workspace container is not. */.workspace-window-control { width: 24px; min-width: 24px; height: 24px; color: #526158; background: #f3f3ef; border: 1px solid #d6d9d3; border-radius: 7px; box-shadow: none;}
.workspace-window-control svg,.workspace-window-controls:hover .workspace-window-control svg,.workspace-window-control:focus-visible svg { width: 12px; height: 12px; opacity: 1;}
.workspace-window-control.close { color: #9b4c45; background: #fff7f5; border-color: #e6c7c3;}
.workspace-window-control.minimize { color: #8a681e; background: #fffaf0; border-color: #e6d7ae;}
.workspace-window-control.maximize { color: #356d55; background: #f3faf5; border-color: #c4d9ca;}
@container workspace (max-width: 680px) { .workspace-appbar { justify-content: flex-end; gap: 6px; padding-inline: 10px; }
.workspace-app-title { display: none; }
.workspace-actions { width: 100%; justify-content: flex-end; }
.workspace-note-picker > summary, .workspace-actions > .secondary-button { width: 38px; min-width: 38px; padding-inline: 0; }
.workspace-actions .secondary-button span, .workspace-actions .secondary-button > svg:last-child { display: none; }
.workspace-tabs { gap: 3px; padding-inline: 8px; }
.workspace-tab { min-width: min(230px, 68cqw); }
.workspace-panes, .workspace-panes.with-agent { display: block; overflow-x: hidden; overflow-y: auto; }
.resource-pane, .workspace-note-pane { min-height: min(560px, calc(100dvh - 154px)); border-right: 0; border-bottom: 1px solid var(--line); }
.workspace-panes.resource-empty .resource-pane { min-height: 230px; }
.workspace-panes > .agent-panel { position: static; width: auto; min-height: min(560px, calc(100dvh - 154px)); box-shadow: none; }}