app.css 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. /* ClankerSaddle application stylesheet. Served precompressed from
  2. /_statum/resource/app.css; spacing follows an 8px grid. */
  3. :root {
  4. --grid-1: 0.5rem;
  5. --grid-2: 1rem;
  6. --grid-3: 1.5rem;
  7. --grid-4: 2rem;
  8. --ink: #1f2328;
  9. --ink-muted: #59636e;
  10. --line: #d1d9e0;
  11. --line-soft: #e4eaef;
  12. --surface: #ffffff;
  13. --surface-sunken: #f6f8fa;
  14. --accent: #0969da;
  15. --success: #1a7f37;
  16. --warning: #9a6700;
  17. --danger: #cf222e;
  18. --review: #bf8700;
  19. --plan: #8250df;
  20. /* The goal accent (plan 12 identity): goals never read as tasks
  21. at a glance — their chrome carries this instead of the task
  22. blue. */
  23. --goal: #8250df;
  24. --goal-surface: #faf7ff;
  25. --radius: 8px;
  26. }
  27. * { box-sizing: border-box; }
  28. body {
  29. font-family: system-ui, -apple-system, sans-serif;
  30. color: var(--ink);
  31. background: var(--surface-sunken);
  32. margin: 0 auto;
  33. max-width: 64rem;
  34. padding: 0 var(--grid-2);
  35. }
  36. header {
  37. display: flex;
  38. justify-content: space-between;
  39. align-items: baseline;
  40. gap: var(--grid-2);
  41. border-bottom: 1px solid var(--line);
  42. padding: var(--grid-2) 0;
  43. }
  44. header h1 { font-size: 1.25rem; margin: 0; display: flex; align-items: center; gap: 0.5rem; }
  45. header h1 .brand-emblem { height: 1.6rem; width: auto; margin-block: -0.2rem; }
  46. header nav { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--grid-1); }
  47. main { padding: var(--grid-2) 0 var(--grid-4); }
  48. footer {
  49. border-top: 1px solid var(--line);
  50. color: var(--ink-muted);
  51. font-size: 0.85rem;
  52. padding: var(--grid-2) 0;
  53. }
  54. h2 { margin: var(--grid-1) 0 var(--grid-2); }
  55. h3 { margin: var(--grid-3) 0 var(--grid-1); }
  56. a { color: var(--accent); }
  57. /* ---- Forms ---- */
  58. input, button, select, textarea { font: inherit; color: inherit; }
  59. input[type="text"], input[type="password"], input[type="email"], input[type="date"],
  60. input[type="number"], input[type="url"], select, textarea {
  61. padding: 0.45rem 0.6rem;
  62. border: 1px solid var(--line);
  63. border-radius: 6px;
  64. background: var(--surface);
  65. max-width: 100%;
  66. }
  67. textarea {
  68. width: 100%;
  69. min-height: 6rem;
  70. resize: vertical;
  71. font-family: ui-monospace, "Cascadia Mono", monospace;
  72. font-size: 0.9rem;
  73. line-height: 1.45;
  74. }
  75. button {
  76. padding: 0.45rem 0.9rem;
  77. border: 1px solid var(--line);
  78. border-radius: 6px;
  79. background: var(--surface-sunken);
  80. cursor: pointer;
  81. }
  82. button:hover { background: var(--line-soft); }
  83. button.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
  84. button.approve { background: var(--success); border-color: var(--success); color: #fff; }
  85. button.reject { background: var(--danger); border-color: var(--danger); color: #fff; }
  86. .form-row {
  87. display: flex;
  88. flex-direction: column;
  89. gap: var(--grid-1);
  90. margin: var(--grid-1) 0;
  91. max-width: 34rem;
  92. }
  93. .form-row label { font-weight: 600; font-size: 0.9rem; }
  94. .form-row input, .form-row select, .form-row textarea { width: 100%; }
  95. form.inline { display: inline-flex; align-items: center; gap: var(--grid-1); margin: var(--grid-1) 0; flex-wrap: wrap; }
  96. form.inline textarea { min-height: 3rem; }
  97. /* ---- Cards & tables ---- */
  98. .cards {
  99. display: grid;
  100. grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  101. gap: var(--grid-2);
  102. margin: var(--grid-2) 0;
  103. }
  104. .card {
  105. background: var(--surface);
  106. border: 1px solid var(--line);
  107. border-radius: var(--radius);
  108. padding: var(--grid-2);
  109. }
  110. .card h3 { margin: 0 0 var(--grid-1); }
  111. /* The task page's status block — the left cell of the 50/50
  112. status/description grid (plan 11 task D), directly below the
  113. progress feed. */
  114. .status-head {
  115. border-left: 4px solid #0969da;
  116. }
  117. /* Status + description side by side, 50/50 (plan 11 task D); stacks
  118. status-then-description on small screens (source order carries the
  119. collapse — no order flips needed). */
  120. .grid-2 {
  121. display: grid;
  122. grid-template-columns: 1fr 1fr;
  123. gap: var(--grid-2);
  124. align-items: start;
  125. margin: var(--grid-2) 0;
  126. }
  127. /* Dashboard: the draft subtasks of a parked parent (plan 11 task D). */
  128. .waiting-drafts { margin: var(--grid-1) 0; padding-left: var(--grid-2); }
  129. .waiting-drafts li { margin: var(--grid-1) 0; }
  130. table { border-collapse: collapse; width: 100%; background: var(--surface); }
  131. th, td { border: 1px solid var(--line); padding: 0.5rem 0.75rem; text-align: left; vertical-align: top; }
  132. th { background: var(--surface-sunken); }
  133. details {
  134. background: var(--surface);
  135. border: 1px solid var(--line);
  136. border-radius: var(--radius);
  137. margin: var(--grid-1) 0;
  138. padding: var(--grid-1) var(--grid-2);
  139. }
  140. summary { cursor: pointer; font-weight: 600; }
  141. /* ---- Badges ---- */
  142. .badge {
  143. border-radius: 1em;
  144. display: inline-block;
  145. font-size: 0.75rem;
  146. padding: 0.15rem 0.65rem;
  147. vertical-align: middle;
  148. }
  149. /* The saddle's SSH public key display */
  150. .ssh-key {
  151. background: #111827;
  152. border: 1px solid #374151;
  153. border-radius: 4px;
  154. font-size: 0.75rem;
  155. margin: 0.5em 0;
  156. max-height: 7em;
  157. overflow: auto;
  158. padding: 0.5em 0.75em;
  159. white-space: pre-wrap;
  160. word-break: break-all;
  161. }
  162. /* Health badges on the saddles page */
  163. .badge-health-healthy {
  164. background: #14532d;
  165. color: #bbf7d0;
  166. }
  167. .badge-health-stale {
  168. background: #713f12;
  169. color: #fde68a;
  170. }
  171. .badge-health-fenced {
  172. background: #7c2d12;
  173. color: #fed7aa;
  174. }
  175. .badge-health-offline {
  176. background: #7f1d1d;
  177. color: #fecaca;
  178. }
  179. .badge-health-unknown {
  180. background: #374151;
  181. color: #d1d5db;
  182. }
  183. /* The × inside a capability chip (badge) */
  184. .chip-remove {
  185. background: none;
  186. border: none;
  187. color: inherit;
  188. cursor: pointer;
  189. font-size: 0.85rem;
  190. line-height: 1;
  191. margin-left: 0.25rem;
  192. padding: 0;
  193. }
  194. .badge-draft { background: var(--line-soft); color: var(--ink-muted); }
  195. .badge-queued { background: #88843333; color: #4d4d33; }
  196. .badge-assigned { background: #ddf4ff; color: #0969da; }
  197. .badge-working { background: #fff8c5; color: var(--warning); }
  198. .badge-blocked { background: #fff8c5; color: var(--warning); }
  199. .badge-review_requested { background: #fff1e0; color: #9a4700; }
  200. .badge-done { background: #dafbe1; color: var(--success); }
  201. .badge-failed { background: #ffebe9; color: var(--danger); }
  202. .badge-idle { background: #dafbe1; color: var(--success); }
  203. .badge-busy { background: #fff8c5; color: var(--warning); }
  204. .badge-offline { background: var(--line-soft); color: var(--ink-muted); }
  205. .badge-co-developed { background: #ddf4ff; color: #0969da; }
  206. .badge-reference { background: var(--line-soft); color: var(--ink-muted); }
  207. .badge-command { background: var(--line-soft); color: var(--ink-muted); }
  208. .badge-comment { background: #f0f0f0; color: #6e7781; }
  209. .badge-block { background: #fff8c5; color: var(--warning); }
  210. .badge-user-comment { background: #ddf4ff; color: #0969da; }
  211. .badge-progress { background: #dafbe1; color: var(--success); }
  212. .badge-review { background: #fff1e0; color: #9a4700; }
  213. .badge-plan { background: #f3e8ff; color: var(--plan); }
  214. .badge-question { background: #ddf4ff; color: #0969da; }
  215. .badge-rfc { background: #f3e8ff; color: var(--plan); }
  216. /* Plan 12 goals: lifecycle badges (task-like palette), mode badges
  217. and the narrative/strip chrome. */
  218. .badge-planning { background: #ddf4ff; color: #0969da; }
  219. .badge-plan_review { background: #f3e8ff; color: var(--plan); }
  220. .badge-active { background: #dafbe1; color: var(--success); }
  221. .badge-paused { background: var(--line-soft); color: var(--ink-muted); }
  222. .badge-completion_review { background: #fff1e0; color: #9a4700; }
  223. .badge-complete { background: #dafbe1; color: var(--success); }
  224. .badge-cancelled { background: var(--line-soft); color: var(--ink-muted); }
  225. .badge-mode-implement { background: var(--line-soft); color: var(--ink-muted); }
  226. .badge-mode-investigate { background: #ddf4ff; color: #0969da; }
  227. .badge-mode-review { background: #fff1e0; color: #9a4700; }
  228. .badge-mode-test { background: #dafbe1; color: var(--success); }
  229. .badge-mode-orchestrate { background: #f3e8ff; color: var(--plan); }
  230. .badge-goal-plan-submitted { background: #f3e8ff; color: var(--plan); }
  231. .badge-goal-plan-approved { background: #dafbe1; color: var(--success); }
  232. .badge-goal-plan-rejected { background: #ffebe9; color: var(--danger); }
  233. .badge-goal-completion-submitted { background: #fff1e0; color: #9a4700; }
  234. .badge-goal-goal-approved { background: #dafbe1; color: var(--success); }
  235. .badge-goal-completion-rejected { background: #ffebe9; color: var(--danger); }
  236. .badge-goal-goal-failed { background: #ffebe9; color: var(--danger); }
  237. .badge-goal-started { background: #ddf4ff; color: #0969da; }
  238. .badge-goal-paused { background: var(--line-soft); color: var(--ink-muted); }
  239. .badge-goal-resumed { background: #ddf4ff; color: #0969da; }
  240. .badge-goal-cancelled { background: var(--line-soft); color: var(--ink-muted); }
  241. .badge-goal-task-created { background: #ddf4ff; color: #0969da; }
  242. .badge-goal-task-enqueued { background: #88843333; color: #4d4d33; }
  243. .badge-goal-task-deleted { background: var(--line-soft); color: var(--ink-muted); }
  244. .badge-goal-task-done { background: #dafbe1; color: var(--success); }
  245. .badge-goal-task-failed { background: #ffebe9; color: var(--danger); }
  246. .badge-goal-block-raised { background: #fff8c5; color: var(--warning); }
  247. .badge-goal-comment { background: #f0f0f0; color: #6e7781; }
  248. .badge-goal-created { background: var(--line-soft); color: var(--ink-muted); }
  249. .badge-block-plan { background: #f3e8ff; color: var(--plan); }
  250. .badge-block-completion { background: #fff1e0; color: #9a4700; }
  251. .goal-strip { display: flex; gap: var(--grid-1); flex-wrap: wrap; align-items: center; }
  252. .badge-kind-task { background: #ddf4ff; color: #0969da; }
  253. .badge-kind-goal { background: #f3e8ff; color: var(--goal); }
  254. /* ---- Goal identity (a goal never reads as a task at a glance) ---- */
  255. /* The goal page's status card: the goal accent replaces the task
  256. blue of .status-head. */
  257. .goal-head { border-left: 4px solid var(--goal); }
  258. /* Dashboard pile cards for goal items: goal accent + tinted
  259. surface, next to the plain white task cards. */
  260. .card.goal-card {
  261. background: var(--goal-surface);
  262. border-left: 4px solid var(--goal);
  263. }
  264. /* The 🎯 marker rides the nav entry, the goals pages and the goal
  265. pile cards. */
  266. .goal-icon {
  267. font-style: normal;
  268. margin-right: 0.15rem;
  269. }
  270. nav .nav-goal { font-weight: 600; }
  271. /* The supervision narrative's markdown bodies flow inside the flex
  272. event row. */
  273. .goal-event-text { flex: 1 1 16rem; min-width: 0; }
  274. .goal-event-text > :first-child { margin-top: 0; }
  275. .goal-event-text > :last-child { margin-bottom: 0; }
  276. /* The current-activity card on the goal page. */
  277. .goal-activity code { word-break: break-all; }
  278. .goal-filter {
  279. background: var(--line-soft);
  280. border: 1px solid var(--line);
  281. border-radius: 999px;
  282. color: var(--ink-muted);
  283. cursor: pointer;
  284. font-size: 0.8rem;
  285. padding: 0.15rem 0.7rem;
  286. }
  287. .goal-filter.active {
  288. background: #ddf4ff;
  289. border-color: #0969da;
  290. color: #0969da;
  291. }
  292. .goal-event {
  293. border-left: 2px solid var(--line-soft);
  294. display: flex;
  295. gap: 0.5rem;
  296. flex-wrap: wrap;
  297. margin: 0.35rem 0;
  298. padding-left: 0.6rem;
  299. }
  300. /* Plan 14 B6: comment events read as FOOTNOTES in the narrative —
  301. the whole row (badge included) mutes and shrinks against the
  302. full-weight state events around it, so the feed reads as
  303. events-with-occasional-footnotes rather than a doubled list. */
  304. .goal-event.footnote {
  305. border-left-color: transparent;
  306. font-size: 0.85rem;
  307. margin: 0.15rem 0;
  308. opacity: 0.75;
  309. padding-left: 0.6rem;
  310. }
  311. /* Plan 14 B5: the goal's Rules section rows and the task rows'
  312. required-capability badges. */
  313. .rule-card {
  314. border: 1px solid var(--line-soft);
  315. border-radius: 6px;
  316. margin: var(--grid-1) 0;
  317. padding: var(--grid-1) var(--grid-2);
  318. }
  319. .rule-card > h4 { margin: 0 0 var(--grid-1); }
  320. .badge-capability { background: #ddf4ff; color: #0969da; }
  321. .plan-revision { margin: 0.5rem 0; }
  322. /* Dashboard timeline event kinds (plan 10 phase 3) */
  323. .badge-created { background: var(--line-soft); color: var(--ink-muted); }
  324. .badge-started { background: #ddf4ff; color: #0969da; }
  325. .badge-suspended { background: #fff8c5; color: var(--warning); }
  326. .badge-completed { background: #dafbe1; color: var(--success); }
  327. .badge-failed { background: #ffebe9; color: var(--danger); }
  328. .badge-block-raised { background: #fff8c5; color: var(--warning); }
  329. .badge-block-answered { background: #dafbe1; color: var(--success); }
  330. .badge-progress { background: #dafbe1; color: var(--success); }
  331. .badge-dispatch { background: #ddf4ff; color: #0969da; }
  332. .badge-query { background: #ddf4ff; color: #0969da; }
  333. .badge-shell-reset { background: var(--line-soft); color: var(--ink-muted); }
  334. /* Agent celebrations (`saddle yeehaw`) — the earned 🤠 badge (task
  335. status-card corner, queue rows, dashboard task references and the
  336. timeline's own yeehaw kind) plus the task page's festive card. */
  337. .badge-yeehaw { background: #f8e8b8; color: #7d5b00; }
  338. .yeehaw-card {
  339. background: #fffaf0;
  340. border: 1px solid #d29922;
  341. border-left: 4px solid #d29922;
  342. box-shadow: 0 1px 4px #d2992222;
  343. margin: var(--grid-2) 0;
  344. }
  345. .yeehaw-card h3 { color: #7d5b00; margin: 0 0 var(--grid-1); }
  346. .yeehaw-list { list-style: none; margin: 0; padding: 0; }
  347. .yeehaw-list li {
  348. border-bottom: 1px dashed #eacf9a;
  349. margin: 0;
  350. padding: var(--grid-1) 0;
  351. }
  352. .yeehaw-list li:last-child { border-bottom: none; }
  353. .yeehaw-message { font-weight: 600; margin-right: var(--grid-1); }
  354. /* The status card's corner badge floats right of its heading. */
  355. .status-corner { float: right; font-size: 0.9rem; }
  356. .muted { color: var(--ink-muted); }
  357. .error { color: var(--danger); }
  358. /* Plan 13 B4: comments read as footnotes — muted and smaller — in the
  359. goal narrative's comment events, the dashboard timeline's comment
  360. rows and every comment card. The body is the content; the chrome
  361. around it stays quiet. */
  362. .footnote { color: var(--ink-muted); font-size: 0.85rem; }
  363. /* ---- Markdown content (stm-markdown) ---- */
  364. .md h1 { font-size: 1.35rem; margin: var(--grid-2) 0 var(--grid-1); }
  365. .md h2 { font-size: 1.2rem; margin: var(--grid-2) 0 var(--grid-1); }
  366. .md h3 { font-size: 1.05rem; margin: var(--grid-2) 0 var(--grid-1); }
  367. .md p, .md ul, .md ol { margin: var(--grid-1) 0; }
  368. .md code {
  369. font-family: ui-monospace, "Cascadia Mono", monospace;
  370. font-size: 0.85em;
  371. background: var(--surface-sunken);
  372. border: 1px solid var(--line-soft);
  373. border-radius: 4px;
  374. padding: 0.1em 0.35em;
  375. }
  376. .md pre {
  377. background: var(--surface-sunken);
  378. border: 1px solid var(--line-soft);
  379. border-radius: 6px;
  380. padding: var(--grid-1) var(--grid-2);
  381. overflow-x: auto;
  382. }
  383. .md pre code { border: none; padding: 0; background: none; }
  384. .md blockquote {
  385. border-left: 3px solid var(--line);
  386. color: var(--ink-muted);
  387. margin: var(--grid-1) 0;
  388. padding: 0 var(--grid-2);
  389. }
  390. .md hr { border: none; border-top: 1px solid var(--line); margin: var(--grid-2) 0; }
  391. /* ---- Comments ---- */
  392. /* Footnote treatment (plan 13 B4): the card itself goes muted and
  393. smaller — the body leads, the quote trails beneath it. */
  394. .comment {
  395. background: var(--surface);
  396. border: 1px solid var(--line);
  397. border-left: 3px solid var(--line);
  398. border-radius: var(--radius);
  399. color: var(--ink-muted);
  400. font-size: 0.88rem;
  401. margin: var(--grid-1) 0;
  402. padding: var(--grid-1) var(--grid-2);
  403. }
  404. .comment.agent { border-left-color: var(--accent); }
  405. /* Plan 15 C2: harness/system-authored rows (park/resume bookkeeping,
  406. abort/requeue/retry notices, session restorations) render as a
  407. distinct SYSTEM event — labelled, muted, no agent accent or icon;
  408. never an agent comment row. */
  409. .comment.system {
  410. background: var(--surface-sunken);
  411. border-left: 3px dashed var(--line);
  412. font-size: 0.82rem;
  413. }
  414. .comment.system .system-label {
  415. border: 1px solid var(--line);
  416. border-radius: 999px;
  417. color: var(--ink-muted);
  418. font-size: 0.7rem;
  419. font-weight: 600;
  420. letter-spacing: 0.04em;
  421. margin-right: 0.35rem;
  422. padding: 0.05rem 0.5rem;
  423. text-transform: uppercase;
  424. }
  425. .comment blockquote {
  426. border-left: 3px solid var(--line);
  427. color: var(--ink-muted);
  428. margin: var(--grid-1) 0;
  429. padding: 0 var(--grid-2);
  430. white-space: pre-wrap;
  431. }
  432. /* ---- Blocks (questions, RFCs, reviews) ---- */
  433. .block-card {
  434. background: var(--surface);
  435. border: 1px solid var(--line);
  436. border-left: 4px solid var(--accent);
  437. border-radius: var(--radius);
  438. margin: var(--grid-2) 0;
  439. padding: var(--grid-2);
  440. }
  441. .block-card.rfc { border-left-color: var(--plan); }
  442. .block-card.review { border-left-color: var(--review); }
  443. .block-card.answered { border-left-color: var(--line); opacity: 0.85; }
  444. .block-card .options { display: flex; flex-direction: column; gap: var(--grid-1); margin: var(--grid-1) 0; }
  445. .block-card .options label { display: flex; gap: var(--grid-1); align-items: baseline; font-weight: normal; }
  446. .block-card textarea { min-height: 4rem; }
  447. /* Clickable option cards: the whole label selects its radio, and a
  448. checked card highlights (evergreen :has). */
  449. .options .option-card {
  450. align-items: center;
  451. border: 1px solid var(--line);
  452. border-radius: var(--radius);
  453. cursor: pointer;
  454. padding: var(--grid-1) var(--grid-2);
  455. }
  456. .options .option-card:hover { border-color: var(--accent); }
  457. .options .option-card:has(input:checked) {
  458. background: #ddf4ff;
  459. border-color: #0969da;
  460. }
  461. /* ---- Design-task plan review ---- */
  462. .plan-review .actions { display: flex; gap: var(--grid-1); flex-wrap: wrap; margin: var(--grid-1) 0; }
  463. .plan-review .rfc-body {
  464. border: 1px solid var(--line);
  465. border-radius: var(--radius);
  466. margin: var(--grid-1) 0;
  467. padding: var(--grid-2);
  468. }
  469. .plan-comments { list-style: none; margin: var(--grid-1) 0; padding: 0; }
  470. .plan-comments li {
  471. border: 1px solid var(--line);
  472. border-left: 3px solid var(--accent);
  473. border-radius: var(--radius);
  474. margin: var(--grid-1) 0;
  475. padding: var(--grid-1) var(--grid-2);
  476. }
  477. .plan-comments blockquote { margin: 0 0 var(--grid-1); }
  478. .plan-popover {
  479. background: var(--surface);
  480. border: 1px solid var(--line);
  481. border-radius: var(--radius);
  482. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  483. padding: var(--grid-2);
  484. position: absolute;
  485. width: 22rem;
  486. z-index: 40;
  487. }
  488. .plan-popover .actions { display: flex; gap: var(--grid-1); margin-top: var(--grid-1); }
  489. /* ---- Review banner ---- */
  490. .review-banner {
  491. background: #fff8eb;
  492. border: 1px solid var(--review);
  493. border-radius: var(--radius);
  494. margin: var(--grid-2) 0;
  495. padding: var(--grid-2);
  496. }
  497. .review-banner h3 { color: #9a4700; margin: 0 0 var(--grid-1); }
  498. .review-banner .actions { display: flex; gap: var(--grid-1); flex-wrap: wrap; margin-top: var(--grid-1); }
  499. /* ---- Progress ---- */
  500. /* Plan 15 C4: the goal page's card rhythm restored (the goalui
  501. restyle regression) — every section is a card and the cards
  502. breathe between themselves. */
  503. .goal-page .card { margin-bottom: var(--grid-2); }
  504. .goal-page .card:last-child { margin-bottom: 0; }
  505. /* Timeless-comment footnote styling (plan 15 C4): the body leads,
  506. the author/time line reads as a muted footnote under it. */
  507. .comment .comment-meta { margin: var(--grid-1) 0 0; }
  508. .progress-latest {
  509. background: #dafbe1;
  510. border: 1px solid var(--success);
  511. border-radius: var(--radius);
  512. font-weight: 600;
  513. margin: var(--grid-1) 0;
  514. padding: var(--grid-1) var(--grid-2);
  515. }
  516. .progress-history li { margin: var(--grid-1) 0; }
  517. /* ---- Terminal ---- */
  518. .terminal {
  519. background: #0d1117;
  520. border-radius: var(--radius);
  521. color: #c9d1d9;
  522. font-family: ui-monospace, "Cascadia Mono", monospace;
  523. font-size: 0.85rem;
  524. max-height: 40rem;
  525. overflow-y: auto;
  526. padding: var(--grid-2);
  527. }
  528. .term-entry {
  529. background: #161b22;
  530. border: 1px solid #30363d;
  531. border-radius: 6px;
  532. margin: var(--grid-1) 0;
  533. padding: var(--grid-1) var(--grid-2);
  534. }
  535. .term-entry .term-head {
  536. display: flex;
  537. align-items: baseline;
  538. gap: var(--grid-1);
  539. flex-wrap: wrap;
  540. color: #8b949e;
  541. font-size: 0.8rem;
  542. }
  543. .term-entry .term-command {
  544. color: #79c0ff;
  545. font-weight: 600;
  546. white-space: pre-wrap;
  547. word-break: break-word;
  548. }
  549. .term-entry pre {
  550. border-radius: 6px;
  551. margin: var(--grid-1) 0 0;
  552. padding: var(--grid-1) var(--grid-2);
  553. white-space: pre-wrap;
  554. word-break: break-word;
  555. }
  556. .term-entry .term-output {
  557. background: #0d1117;
  558. color: #c9d1d9;
  559. cursor: pointer;
  560. }
  561. .term-entry .term-output.collapsed { max-height: 7.5rem; overflow: hidden; position: relative; }
  562. .term-entry .term-output.collapsed::after {
  563. content: "… click to expand";
  564. background: linear-gradient(transparent, #161b22 70%);
  565. color: #8b949e;
  566. display: block;
  567. padding: var(--grid-2) var(--grid-2) var(--grid-1);
  568. position: absolute;
  569. bottom: 0;
  570. left: 0;
  571. right: 0;
  572. }
  573. .term-entry .term-input {
  574. background: #161b22;
  575. border-left: 3px solid #30363d;
  576. color: #8b949e;
  577. }
  578. .term-entry .term-input.collapsed { max-height: 7.5rem; overflow: hidden; }
  579. .term-entry.type-query { border-color: #a371f7; }
  580. .term-entry.type-query .term-command { color: #bc8cff; }
  581. .term-entry.type-comment .term-output, .term-entry.type-comment .term-command { color: #8b949e; font-style: italic; }
  582. .term-entry.type-block { border-color: #d29922; }
  583. .term-entry.type-block .term-output { color: #e3b341; }
  584. .term-entry.type-user-comment { border-color: #58a6ff; }
  585. .term-entry.type-user-comment .term-output, .term-entry.type-user-comment .term-command { color: #79c0ff; }
  586. .term-entry.type-progress { border-color: #2ea043; }
  587. .term-entry.type-progress .term-output, .term-entry.type-progress .term-command { color: #56d364; }
  588. .term-entry.type-review { border-color: #e3b341; }
  589. .term-entry.type-review .term-output, .term-entry.type-review .term-command { color: #e3b341; }
  590. .term-entry.type-plan { border-color: #a371f7; }
  591. .term-entry.type-plan .term-output, .term-entry.type-plan .term-command { color: #bc8cff; }
  592. .term-entry.type-shell-reset { border-color: #30363d; opacity: 0.85; }
  593. .term-entry.type-shell-reset .term-head { color: #8b949e; }
  594. .term-entry.type-failed { border-color: var(--danger); }
  595. .term-entry.type-failed .term-output, .term-entry.type-failed .term-command { color: #ff7b72; }
  596. /* ---- Text-selection comment popover ---- */
  597. .quote-popover {
  598. background: var(--surface);
  599. border: 1px solid var(--line);
  600. border-radius: var(--radius);
  601. box-shadow: 0 4px 16px #0002;
  602. padding: var(--grid-2);
  603. position: absolute;
  604. width: min(26rem, calc(100vw - 3rem));
  605. z-index: 40;
  606. }
  607. .quote-popover blockquote {
  608. border-left: 3px solid var(--accent);
  609. color: var(--ink-muted);
  610. font-family: ui-monospace, monospace;
  611. font-size: 0.8rem;
  612. margin: 0 0 var(--grid-1);
  613. max-height: 6rem;
  614. overflow-y: auto;
  615. padding: 0 var(--grid-1);
  616. white-space: pre-wrap;
  617. }
  618. .quote-button {
  619. background: var(--accent);
  620. border: none;
  621. border-radius: 6px;
  622. color: #fff;
  623. font-size: 0.8rem;
  624. padding: 0.3rem 0.7rem;
  625. position: absolute;
  626. z-index: 41;
  627. }
  628. /* ---- Toasts ---- */
  629. .toast-stack {
  630. bottom: var(--grid-2);
  631. display: flex;
  632. flex-direction: column;
  633. gap: var(--grid-1);
  634. max-width: min(24rem, calc(100vw - 3rem));
  635. position: fixed;
  636. right: var(--grid-2);
  637. z-index: 100;
  638. }
  639. .toast {
  640. animation: toast-in 0.25s ease-out;
  641. background: var(--surface);
  642. border-left: 4px solid var(--accent);
  643. border-radius: 6px;
  644. box-shadow: 0 4px 16px #0003;
  645. font-size: 0.9rem;
  646. padding: var(--grid-1) var(--grid-2);
  647. }
  648. .toast.success { border-left-color: var(--success); }
  649. .toast.error { border-left-color: var(--danger); }
  650. .toast.leaving { animation: toast-out 0.25s ease-in forwards; }
  651. @keyframes toast-in {
  652. from { opacity: 0; transform: translateX(1rem); }
  653. to { opacity: 1; transform: translateX(0); }
  654. }
  655. @keyframes toast-out {
  656. from { opacity: 1; transform: translateX(0); }
  657. to { opacity: 0; transform: translateX(1rem); }
  658. }
  659. [hidden] { display: none !important; }
  660. /* Plan 14 B4: the terminal page's resume-info panel — what the agent
  661. last received for the selected session (the opening brief for
  662. session 1, the stored resume notice for later ones), a 200px
  663. vertical-scroll strip above the terminal. */
  664. .resume-notice-panel {
  665. background: var(--goal-surface);
  666. border: 1px solid var(--line-soft);
  667. border-left: 4px solid var(--goal);
  668. border-radius: 6px;
  669. margin: 0.75rem 0;
  670. max-height: 200px;
  671. overflow-y: auto;
  672. padding: var(--grid-2);
  673. }
  674. /* Plain terminal — looking over a colleague's shoulder */
  675. .terminal-plain {
  676. background: #1a1a2e;
  677. border-radius: 6px;
  678. color: #d4d4d4;
  679. font-family: "SF Mono", "Fira Code", "Cascadia Code", Menlo, monospace;
  680. font-size: 0.875rem;
  681. line-height: 1.5;
  682. max-height: 75vh;
  683. overflow-y: auto;
  684. padding: var(--grid-2);
  685. white-space: pre-wrap;
  686. word-break: break-all;
  687. }
  688. /* Raw PTY log — the daemon's chunks, byte-exact and unstyled */
  689. .terminal-raw {
  690. margin: 0;
  691. white-space: pre;
  692. word-break: normal;
  693. }
  694. /* LLM thinking / bash comments — green */
  695. .term-think {
  696. color: #4ade80;
  697. }
  698. /* stdin — what the LLM typed (blue) */
  699. .term-stdin {
  700. color: #7dd3fc;
  701. }
  702. /* stdout — standard terminal white */
  703. .term-stdout {
  704. color: #d4d4d4;
  705. }
  706. /* stderr — red */
  707. .term-stderr {
  708. color: #f87171;
  709. }
  710. /* Recoverable rejections (bash -n / max_tokens) — amber, non-fatal */
  711. .term-rejected {
  712. color: #fbbf24;
  713. }
  714. /* Comment dialog */
  715. dialog#quote-comment-dialog {
  716. border: 1px solid var(--border);
  717. border-radius: 8px;
  718. box-shadow: 0 8px 32px #0006;
  719. max-width: 40rem;
  720. padding: var(--grid-3);
  721. width: 90%;
  722. }
  723. dialog#quote-comment-dialog::backdrop {
  724. background: #0008;
  725. }
  726. dialog#quote-comment-dialog blockquote {
  727. background: var(--bg-secondary);
  728. border-left: 3px solid var(--accent);
  729. font-family: "SF Mono", "Fira Code", Menlo, monospace;
  730. font-size: 0.85rem;
  731. margin: 0 0 var(--grid-2);
  732. max-height: 10rem;
  733. overflow-y: auto;
  734. padding: var(--grid-2);
  735. white-space: pre-wrap;
  736. }
  737. .term-comment-quote {
  738. color: #4ade80;
  739. font-style: italic;
  740. }
  741. @media (max-width: 40rem) {
  742. header { flex-direction: column; gap: var(--grid-1); }
  743. .cards { grid-template-columns: 1fr; }
  744. .grid-2 { grid-template-columns: 1fr; }
  745. th, td { padding: 0.4rem 0.5rem; font-size: 0.9rem; }
  746. }