app.css 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  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: center;
  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: 8rem; 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. /* Goal 2 QoL: the key text inherits --ink (#1f2328, near-black) —
  153. unreadable on the #111827 panel. A light tone keeps the dark
  154. aesthetic while clearing WCAG-ish contrast (the page already
  155. uses #d1d5db for muted text on dark surfaces). */
  156. color: #d1d5db;
  157. border: 1px solid #374151;
  158. border-radius: 4px;
  159. font-size: 0.75rem;
  160. margin: 0.5em 0;
  161. max-height: 7em;
  162. overflow: auto;
  163. padding: 0.5em 0.75em;
  164. white-space: pre-wrap;
  165. word-break: break-all;
  166. }
  167. /* Health badges on the saddles page */
  168. .badge-health-healthy {
  169. background: #14532d;
  170. color: #bbf7d0;
  171. }
  172. .badge-health-stale {
  173. background: #713f12;
  174. color: #fde68a;
  175. }
  176. .badge-health-fenced {
  177. background: #7c2d12;
  178. color: #fed7aa;
  179. }
  180. .badge-health-offline {
  181. background: #7f1d1d;
  182. color: #fecaca;
  183. }
  184. .badge-health-unknown {
  185. background: #374151;
  186. color: #d1d5db;
  187. }
  188. /* The × inside a capability chip (badge) */
  189. .chip-remove {
  190. background: none;
  191. border: none;
  192. color: inherit;
  193. cursor: pointer;
  194. font-size: 0.85rem;
  195. line-height: 1;
  196. margin-left: 0.25rem;
  197. padding: 0;
  198. }
  199. .badge-draft { background: var(--line-soft); color: var(--ink-muted); }
  200. .badge-queued { background: #88843333; color: #4d4d33; }
  201. .badge-assigned { background: #ddf4ff; color: #0969da; }
  202. .badge-working { background: #fff8c5; color: var(--warning); }
  203. .badge-blocked { background: #fff8c5; color: var(--warning); }
  204. .badge-review_requested { background: #fff1e0; color: #9a4700; }
  205. .badge-done { background: #dafbe1; color: var(--success); }
  206. .badge-failed { background: #ffebe9; color: var(--danger); }
  207. .badge-idle { background: #dafbe1; color: var(--success); }
  208. .badge-busy { background: #fff8c5; color: var(--warning); }
  209. .badge-offline { background: var(--line-soft); color: var(--ink-muted); }
  210. .badge-co-developed { background: #ddf4ff; color: #0969da; }
  211. .badge-reference { background: var(--line-soft); color: var(--ink-muted); }
  212. .badge-command { background: var(--line-soft); color: var(--ink-muted); }
  213. .badge-comment { background: #f0f0f0; color: #6e7781; }
  214. .badge-block { background: #fff8c5; color: var(--warning); }
  215. .badge-user-comment { background: #ddf4ff; color: #0969da; }
  216. .badge-progress { background: #dafbe1; color: var(--success); }
  217. .badge-review { background: #fff1e0; color: #9a4700; }
  218. .badge-plan { background: #f3e8ff; color: var(--plan); }
  219. .badge-question { background: #ddf4ff; color: #0969da; }
  220. .badge-rfc { background: #f3e8ff; color: var(--plan); }
  221. /* Plan 12 goals: lifecycle badges (task-like palette), mode badges
  222. and the narrative/strip chrome. */
  223. .badge-planning { background: #ddf4ff; color: #0969da; }
  224. .badge-plan_review { background: #f3e8ff; color: var(--plan); }
  225. .badge-active { background: #dafbe1; color: var(--success); }
  226. .badge-paused { background: var(--line-soft); color: var(--ink-muted); }
  227. .badge-completion_review { background: #fff1e0; color: #9a4700; }
  228. .badge-complete { background: #dafbe1; color: var(--success); }
  229. .badge-cancelled { background: var(--line-soft); color: var(--ink-muted); }
  230. .badge-mode-implement { background: var(--line-soft); color: var(--ink-muted); }
  231. .badge-mode-investigate { background: #ddf4ff; color: #0969da; }
  232. .badge-mode-review { background: #fff1e0; color: #9a4700; }
  233. .badge-mode-test { background: #dafbe1; color: var(--success); }
  234. .badge-mode-orchestrate { background: #f3e8ff; color: var(--plan); }
  235. .badge-goal-plan-submitted { background: #f3e8ff; color: var(--plan); }
  236. .badge-goal-plan-approved { background: #dafbe1; color: var(--success); }
  237. .badge-goal-plan-rejected { background: #ffebe9; color: var(--danger); }
  238. .badge-goal-completion-submitted { background: #fff1e0; color: #9a4700; }
  239. .badge-goal-goal-approved { background: #dafbe1; color: var(--success); }
  240. .badge-goal-completion-rejected { background: #ffebe9; color: var(--danger); }
  241. .badge-goal-goal-failed { background: #ffebe9; color: var(--danger); }
  242. .badge-goal-started { background: #ddf4ff; color: #0969da; }
  243. .badge-goal-paused { background: var(--line-soft); color: var(--ink-muted); }
  244. .badge-goal-resumed { background: #ddf4ff; color: #0969da; }
  245. .badge-goal-cancelled { background: var(--line-soft); color: var(--ink-muted); }
  246. .badge-goal-task-created { background: #ddf4ff; color: #0969da; }
  247. .badge-goal-task-enqueued { background: #88843333; color: #4d4d33; }
  248. .badge-goal-task-deleted { background: var(--line-soft); color: var(--ink-muted); }
  249. .badge-goal-task-done { background: #dafbe1; color: var(--success); }
  250. .badge-goal-task-failed { background: #ffebe9; color: var(--danger); }
  251. .badge-goal-block-raised { background: #fff8c5; color: var(--warning); }
  252. .badge-goal-comment { background: #f0f0f0; color: #6e7781; }
  253. .badge-goal-created { background: var(--line-soft); color: var(--ink-muted); }
  254. .badge-block-plan { background: #f3e8ff; color: var(--plan); }
  255. .badge-block-completion { background: #fff1e0; color: #9a4700; }
  256. .goal-strip { display: flex; gap: var(--grid-1); flex-wrap: wrap; align-items: center; }
  257. .badge-kind-task { background: #ddf4ff; color: #0969da; }
  258. .badge-kind-goal { background: #f3e8ff; color: var(--goal); }
  259. /* ---- Goal identity (a goal never reads as a task at a glance) ---- */
  260. /* The goal page's status card: the goal accent replaces the task
  261. blue of .status-head. */
  262. .goal-head { border-left: 4px solid var(--goal); }
  263. /* Dashboard pile cards for goal items: goal accent + tinted
  264. surface, next to the plain white task cards. */
  265. .card.goal-card {
  266. background: var(--goal-surface);
  267. border-left: 4px solid var(--goal);
  268. }
  269. /* The 🎯 marker rides the nav entry, the goals pages and the goal
  270. pile cards. */
  271. .goal-icon {
  272. font-style: normal;
  273. margin-right: 0.15rem;
  274. }
  275. nav .nav-goal { font-weight: 600; }
  276. /* The supervision narrative's markdown bodies flow inside the flex
  277. event row. */
  278. .goal-event-text { flex: 1 1 16rem; min-width: 0; }
  279. .goal-event-text > :first-child { margin-top: 0; }
  280. .goal-event-text > :last-child { margin-bottom: 0; }
  281. /* The current-activity card on the goal page. */
  282. .goal-activity code { word-break: break-all; }
  283. .goal-filter {
  284. background: var(--line-soft);
  285. border: 1px solid var(--line);
  286. border-radius: 999px;
  287. color: var(--ink-muted);
  288. cursor: pointer;
  289. font-size: 0.8rem;
  290. padding: 0.15rem 0.7rem;
  291. }
  292. .goal-filter.active {
  293. background: #ddf4ff;
  294. border-color: #0969da;
  295. color: #0969da;
  296. }
  297. .goal-event {
  298. border-left: 2px solid var(--line-soft);
  299. display: flex;
  300. gap: 0.5rem;
  301. flex-wrap: wrap;
  302. margin: 0.35rem 0;
  303. padding-left: 0.6rem;
  304. }
  305. /* Plan 14 B6: comment events read as FOOTNOTES in the narrative —
  306. the whole row (badge included) mutes and shrinks against the
  307. full-weight state events around it, so the feed reads as
  308. events-with-occasional-footnotes rather than a doubled list. */
  309. .goal-event.footnote {
  310. border-left-color: transparent;
  311. font-size: 0.85rem;
  312. margin: 0.15rem 0;
  313. opacity: 0.75;
  314. padding-left: 0.6rem;
  315. }
  316. /* Plan 14 B5: the goal's Rules section rows and the task rows'
  317. required-capability badges. */
  318. .rule-card {
  319. border: 1px solid var(--line-soft);
  320. border-radius: 6px;
  321. margin: var(--grid-1) 0;
  322. padding: var(--grid-1) var(--grid-2);
  323. }
  324. .rule-card > h4 { margin: 0 0 var(--grid-1); }
  325. .badge-capability { background: #ddf4ff; color: #0969da; }
  326. .plan-revision { margin: 0.5rem 0; }
  327. /* Dashboard timeline event kinds (plan 10 phase 3) */
  328. .badge-created { background: var(--line-soft); color: var(--ink-muted); }
  329. .badge-started { background: #ddf4ff; color: #0969da; }
  330. .badge-suspended { background: #fff8c5; color: var(--warning); }
  331. .badge-completed { background: #dafbe1; color: var(--success); }
  332. .badge-failed { background: #ffebe9; color: var(--danger); }
  333. .badge-block-raised { background: #fff8c5; color: var(--warning); }
  334. .badge-block-answered { background: #dafbe1; color: var(--success); }
  335. .badge-progress { background: #dafbe1; color: var(--success); }
  336. .badge-dispatch { background: #ddf4ff; color: #0969da; }
  337. .badge-query { background: #ddf4ff; color: #0969da; }
  338. .badge-shell-reset { background: var(--line-soft); color: var(--ink-muted); }
  339. /* Agent celebrations (`saddle yeehaw`) — the earned 🤠 badge (task
  340. status-card corner, queue rows, dashboard task references and the
  341. timeline's own yeehaw kind) plus the task page's festive card. */
  342. .badge-yeehaw { background: #f8e8b8; color: #7d5b00; }
  343. .yeehaw-card {
  344. background: #fffaf0;
  345. border: 1px solid #d29922;
  346. border-left: 4px solid #d29922;
  347. box-shadow: 0 1px 4px #d2992222;
  348. margin: var(--grid-2) 0;
  349. }
  350. .yeehaw-card h3 { color: #7d5b00; margin: 0 0 var(--grid-1); }
  351. .yeehaw-list { list-style: none; margin: 0; padding: 0; }
  352. .yeehaw-list li {
  353. border-bottom: 1px dashed #eacf9a;
  354. margin: 0;
  355. padding: var(--grid-1) 0;
  356. }
  357. .yeehaw-list li:last-child { border-bottom: none; }
  358. .yeehaw-message { font-weight: 600; margin-right: var(--grid-1); }
  359. /* The status card's corner badge floats right of its heading. */
  360. .status-corner { float: right; font-size: 0.9rem; }
  361. .muted { color: var(--ink-muted); }
  362. .error { color: var(--danger); }
  363. /* Plan 13 B4: comments read as footnotes — muted and smaller — in the
  364. goal narrative's comment events, the dashboard timeline's comment
  365. rows and every comment card. The body is the content; the chrome
  366. around it stays quiet. */
  367. .footnote { color: var(--ink-muted); font-size: 0.85rem; }
  368. /* ---- Markdown content (stm-markdown) ---- */
  369. .md h1 { font-size: 1.35rem; margin: var(--grid-2) 0 var(--grid-1); }
  370. .md h2 { font-size: 1.2rem; margin: var(--grid-2) 0 var(--grid-1); }
  371. .md h3 { font-size: 1.05rem; margin: var(--grid-2) 0 var(--grid-1); }
  372. .md p, .md ul, .md ol { margin: var(--grid-1) 0; }
  373. .md code {
  374. font-family: ui-monospace, "Cascadia Mono", monospace;
  375. font-size: 0.85em;
  376. background: var(--surface-sunken);
  377. border: 1px solid var(--line-soft);
  378. border-radius: 4px;
  379. padding: 0.1em 0.35em;
  380. }
  381. .md pre {
  382. background: var(--surface-sunken);
  383. border: 1px solid var(--line-soft);
  384. border-radius: 6px;
  385. padding: var(--grid-1) var(--grid-2);
  386. overflow-x: auto;
  387. }
  388. .md pre code { border: none; padding: 0; background: none; }
  389. .md blockquote {
  390. border-left: 3px solid var(--line);
  391. color: var(--ink-muted);
  392. margin: var(--grid-1) 0;
  393. padding: 0 var(--grid-2);
  394. }
  395. .md hr { border: none; border-top: 1px solid var(--line); margin: var(--grid-2) 0; }
  396. /* ---- Comments ---- */
  397. /* Footnote treatment (plan 13 B4): the card itself goes muted and
  398. smaller — the body leads, the quote trails beneath it. */
  399. .comment {
  400. background: var(--surface);
  401. border: 1px solid var(--line);
  402. border-left: 3px solid var(--line);
  403. border-radius: var(--radius);
  404. color: var(--ink-muted);
  405. font-size: 0.88rem;
  406. margin: var(--grid-1) 0;
  407. padding: var(--grid-1) var(--grid-2);
  408. }
  409. .comment.agent { border-left-color: var(--accent); }
  410. /* Plan 15 C2: harness/system-authored rows (park/resume bookkeeping,
  411. abort/requeue/retry notices, session restorations) render as a
  412. distinct SYSTEM event — labelled, muted, no agent accent or icon;
  413. never an agent comment row. */
  414. .comment.system {
  415. background: var(--surface-sunken);
  416. border-left: 3px dashed var(--line);
  417. font-size: 0.82rem;
  418. }
  419. .comment.system .system-label {
  420. border: 1px solid var(--line);
  421. border-radius: 999px;
  422. color: var(--ink-muted);
  423. font-size: 0.7rem;
  424. font-weight: 600;
  425. letter-spacing: 0.04em;
  426. margin-right: 0.35rem;
  427. padding: 0.05rem 0.5rem;
  428. text-transform: uppercase;
  429. }
  430. .comment blockquote {
  431. border-left: 3px solid var(--line);
  432. color: var(--ink-muted);
  433. margin: var(--grid-1) 0;
  434. padding: 0 var(--grid-2);
  435. white-space: pre-wrap;
  436. }
  437. /* ---- Blocks (questions, RFCs, reviews) ---- */
  438. .block-card {
  439. background: var(--surface);
  440. border: 1px solid var(--line);
  441. border-left: 4px solid var(--accent);
  442. border-radius: var(--radius);
  443. margin: var(--grid-2) 0;
  444. padding: var(--grid-2);
  445. }
  446. .block-card.rfc { border-left-color: var(--plan); }
  447. .block-card.review { border-left-color: var(--review); }
  448. .block-card.answered { border-left-color: var(--line); opacity: 0.85; }
  449. .block-card .options { display: flex; flex-direction: column; gap: var(--grid-1); margin: var(--grid-1) 0; }
  450. .block-card .options label { display: flex; gap: var(--grid-1); align-items: baseline; font-weight: normal; }
  451. .block-card textarea { min-height: 4rem; }
  452. /* Clickable option cards: the whole label selects its radio, and a
  453. checked card highlights (evergreen :has). */
  454. .options .option-card {
  455. align-items: center;
  456. display: block;
  457. margin-bottom: 8px;
  458. border: 1px solid var(--line);
  459. border-radius: var(--radius);
  460. cursor: pointer;
  461. padding: var(--grid-1) var(--grid-2);
  462. }
  463. .options .option-card:hover { border-color: var(--accent); }
  464. .options .option-card:has(input:checked) {
  465. background: #ddf4ff;
  466. border-color: #0969da;
  467. }
  468. /* ---- Design-task plan review ---- */
  469. .plan-review .actions { display: flex; gap: var(--grid-1); flex-wrap: wrap; margin: var(--grid-1) 0; }
  470. .plan-review .rfc-body {
  471. border: 1px solid var(--line);
  472. border-radius: var(--radius);
  473. margin: var(--grid-1) 0;
  474. padding: var(--grid-2);
  475. }
  476. .plan-comments { list-style: none; margin: var(--grid-1) 0; padding: 0; }
  477. .plan-comments li {
  478. border: 1px solid var(--line);
  479. border-left: 3px solid var(--accent);
  480. border-radius: var(--radius);
  481. margin: var(--grid-1) 0;
  482. padding: var(--grid-1) var(--grid-2);
  483. }
  484. .plan-comments blockquote { margin: 0 0 var(--grid-1); }
  485. .plan-popover {
  486. background: var(--surface);
  487. border: 1px solid var(--line);
  488. border-radius: var(--radius);
  489. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  490. padding: var(--grid-2);
  491. position: absolute;
  492. width: 22rem;
  493. z-index: 40;
  494. }
  495. .plan-popover .actions { display: flex; gap: var(--grid-1); margin-top: var(--grid-1); }
  496. /* ---- Review banner ---- */
  497. .review-banner {
  498. background: #fff8eb;
  499. border: 1px solid var(--review);
  500. border-radius: var(--radius);
  501. margin: var(--grid-2) 0;
  502. padding: var(--grid-2);
  503. }
  504. .review-banner h3 { color: #9a4700; margin: 0 0 var(--grid-1); }
  505. .review-banner .actions { display: flex; gap: var(--grid-1); flex-wrap: wrap; margin-top: var(--grid-1); }
  506. /* ---- Progress ---- */
  507. /* Plan 15 C4: the goal page's card rhythm restored (the goalui
  508. restyle regression) — every section is a card and the cards
  509. breathe between themselves. */
  510. .goal-page .card { margin-bottom: var(--grid-2); }
  511. .goal-page .card:last-child { margin-bottom: 0; }
  512. /* Timeless-comment footnote styling (plan 15 C4): the body leads,
  513. the author/time line reads as a muted footnote under it. */
  514. .comment .comment-meta { margin: var(--grid-1) 0 0; }
  515. .progress-latest {
  516. background: #dafbe1;
  517. border: 1px solid var(--success);
  518. border-radius: var(--radius);
  519. font-weight: 600;
  520. margin: var(--grid-1) 0;
  521. padding: var(--grid-1) var(--grid-2);
  522. }
  523. .progress-history li { margin: var(--grid-1) 0; }
  524. /* ---- Terminal ---- */
  525. .terminal {
  526. background: #0d1117;
  527. border-radius: var(--radius);
  528. color: #c9d1d9;
  529. font-family: ui-monospace, "Cascadia Mono", monospace;
  530. font-size: 0.85rem;
  531. max-height: 40rem;
  532. overflow-y: auto;
  533. padding: var(--grid-2);
  534. }
  535. .term-entry {
  536. background: #161b22;
  537. border: 1px solid #30363d;
  538. border-radius: 6px;
  539. margin: var(--grid-1) 0;
  540. padding: var(--grid-1) var(--grid-2);
  541. }
  542. .term-entry .term-head {
  543. display: flex;
  544. align-items: baseline;
  545. gap: var(--grid-1);
  546. flex-wrap: wrap;
  547. color: #8b949e;
  548. font-size: 0.8rem;
  549. }
  550. .term-entry .term-command {
  551. color: #79c0ff;
  552. font-weight: 600;
  553. white-space: pre-wrap;
  554. word-break: break-word;
  555. }
  556. .term-entry pre {
  557. border-radius: 6px;
  558. margin: var(--grid-1) 0 0;
  559. padding: var(--grid-1) var(--grid-2);
  560. white-space: pre-wrap;
  561. word-break: break-word;
  562. }
  563. .term-entry .term-output {
  564. background: #0d1117;
  565. color: #c9d1d9;
  566. cursor: pointer;
  567. }
  568. .term-entry .term-output.collapsed { max-height: 7.5rem; overflow: hidden; position: relative; }
  569. .term-entry .term-output.collapsed::after {
  570. content: "… click to expand";
  571. background: linear-gradient(transparent, #161b22 70%);
  572. color: #8b949e;
  573. display: block;
  574. padding: var(--grid-2) var(--grid-2) var(--grid-1);
  575. position: absolute;
  576. bottom: 0;
  577. left: 0;
  578. right: 0;
  579. }
  580. .term-entry .term-input {
  581. background: #161b22;
  582. border-left: 3px solid #30363d;
  583. color: #8b949e;
  584. }
  585. .term-entry .term-input.collapsed { max-height: 7.5rem; overflow: hidden; }
  586. .term-entry.type-query { border-color: #a371f7; }
  587. .term-entry.type-query .term-command { color: #bc8cff; }
  588. .term-entry.type-comment .term-output, .term-entry.type-comment .term-command { color: #8b949e; font-style: italic; }
  589. .term-entry.type-block { border-color: #d29922; }
  590. .term-entry.type-block .term-output { color: #e3b341; }
  591. .term-entry.type-user-comment { border-color: #58a6ff; }
  592. .term-entry.type-user-comment .term-output, .term-entry.type-user-comment .term-command { color: #79c0ff; }
  593. .term-entry.type-progress { border-color: #2ea043; }
  594. .term-entry.type-progress .term-output, .term-entry.type-progress .term-command { color: #56d364; }
  595. .term-entry.type-review { border-color: #e3b341; }
  596. .term-entry.type-review .term-output, .term-entry.type-review .term-command { color: #e3b341; }
  597. .term-entry.type-plan { border-color: #a371f7; }
  598. .term-entry.type-plan .term-output, .term-entry.type-plan .term-command { color: #bc8cff; }
  599. .term-entry.type-shell-reset { border-color: #30363d; opacity: 0.85; }
  600. .term-entry.type-shell-reset .term-head { color: #8b949e; }
  601. .term-entry.type-failed { border-color: var(--danger); }
  602. .term-entry.type-failed .term-output, .term-entry.type-failed .term-command { color: #ff7b72; }
  603. /* ---- Text-selection comment popover ---- */
  604. .quote-popover {
  605. background: var(--surface);
  606. border: 1px solid var(--line);
  607. border-radius: var(--radius);
  608. box-shadow: 0 4px 16px #0002;
  609. padding: var(--grid-2);
  610. position: absolute;
  611. width: min(26rem, calc(100vw - 3rem));
  612. z-index: 40;
  613. }
  614. .quote-popover blockquote {
  615. border-left: 3px solid var(--accent);
  616. color: var(--ink-muted);
  617. font-family: ui-monospace, monospace;
  618. font-size: 0.8rem;
  619. margin: 0 0 var(--grid-1);
  620. max-height: 6rem;
  621. overflow-y: auto;
  622. padding: 0 var(--grid-1);
  623. white-space: pre-wrap;
  624. }
  625. .quote-button {
  626. background: var(--accent);
  627. border: none;
  628. border-radius: 6px;
  629. color: #fff;
  630. font-size: 0.8rem;
  631. padding: 0.3rem 0.7rem;
  632. position: absolute;
  633. z-index: 41;
  634. }
  635. /* ---- Toasts ---- */
  636. .toast-stack {
  637. bottom: var(--grid-2);
  638. display: flex;
  639. flex-direction: column;
  640. gap: var(--grid-1);
  641. max-width: min(24rem, calc(100vw - 3rem));
  642. position: fixed;
  643. right: var(--grid-2);
  644. z-index: 100;
  645. }
  646. .toast {
  647. animation: toast-in 0.25s ease-out;
  648. background: var(--surface);
  649. border-left: 4px solid var(--accent);
  650. border-radius: 6px;
  651. box-shadow: 0 4px 16px #0003;
  652. font-size: 0.9rem;
  653. padding: var(--grid-1) var(--grid-2);
  654. }
  655. .toast.success { border-left-color: var(--success); }
  656. .toast.error { border-left-color: var(--danger); }
  657. .toast.leaving { animation: toast-out 0.25s ease-in forwards; }
  658. @keyframes toast-in {
  659. from { opacity: 0; transform: translateX(1rem); }
  660. to { opacity: 1; transform: translateX(0); }
  661. }
  662. @keyframes toast-out {
  663. from { opacity: 1; transform: translateX(0); }
  664. to { opacity: 0; transform: translateX(1rem); }
  665. }
  666. [hidden] { display: none !important; }
  667. /* Comment dialog */
  668. dialog#quote-comment-dialog {
  669. border: 1px solid var(--border);
  670. border-radius: 8px;
  671. box-shadow: 0 8px 32px #0006;
  672. max-width: 40rem;
  673. padding: var(--grid-3);
  674. width: 90%;
  675. }
  676. dialog#quote-comment-dialog::backdrop {
  677. background: #0008;
  678. }
  679. dialog#quote-comment-dialog blockquote {
  680. background: var(--bg-secondary);
  681. border-left: 3px solid var(--accent);
  682. font-family: "SF Mono", "Fira Code", Menlo, monospace;
  683. font-size: 0.85rem;
  684. margin: 0 0 var(--grid-2);
  685. max-height: 10rem;
  686. overflow-y: auto;
  687. padding: var(--grid-2);
  688. white-space: pre-wrap;
  689. }
  690. .term-comment-quote {
  691. color: #4ade80;
  692. font-style: italic;
  693. }
  694. @media (max-width: 40rem) {
  695. header { flex-direction: column; gap: var(--grid-1); }
  696. .cards { grid-template-columns: 1fr; }
  697. .grid-2 { grid-template-columns: 1fr; }
  698. th, td { padding: 0.4rem 0.5rem; font-size: 0.9rem; }
  699. }
  700. /* Admin role badge (users + profile pages): the plan-family violet the
  701. * app already reserves for privileged markings. */
  702. .badge-admin {
  703. background: #f3e8ff;
  704. color: var(--plan);
  705. }
  706. /* Plan 17: the event log page (task_log.html) — the unified ledger's
  707. human view. Turn cards group a run's turn-family events; tool
  708. results collapse behind head+tail summaries with byte counts. */
  709. .log-toolbar {
  710. display: flex;
  711. flex-wrap: wrap;
  712. gap: var(--grid-1, 0.5rem);
  713. align-items: center;
  714. margin-bottom: var(--grid-1, 0.5rem);
  715. }
  716. .log-toolbar input[type="search"] {
  717. flex: 1;
  718. min-width: 12rem;
  719. }
  720. .log-filter.active {
  721. border-color: var(--ink, currentColor);
  722. font-weight: 600;
  723. }
  724. .log-more {
  725. display: block;
  726. margin: 0 auto var(--grid-1, 0.5rem);
  727. }
  728. .log-feed {
  729. display: flex;
  730. flex-direction: column;
  731. gap: var(--grid-1, 0.5rem);
  732. max-height: 72vh;
  733. overflow-y: auto;
  734. border: 1px solid var(--line-soft, #eee);
  735. border-radius: 6px;
  736. padding: var(--grid-1, 0.5rem);
  737. }
  738. .turn-card {
  739. border: 1px solid var(--line-soft, #eee);
  740. border-left: 3px solid var(--line, #ccc);
  741. border-radius: 6px;
  742. padding: 0.4rem 0.6rem;
  743. }
  744. .turn-head {
  745. margin: 0 0 0.3rem;
  746. font-size: 0.85rem;
  747. }
  748. .event-row .event-head {
  749. margin: 0.2rem 0;
  750. }
  751. .event-pre {
  752. margin: 0.2rem 0;
  753. padding: 0.3rem 0.5rem;
  754. background: var(--line-soft, #f6f8fa);
  755. border-radius: 4px;
  756. overflow-x: auto;
  757. font-size: 0.85rem;
  758. white-space: pre-wrap;
  759. word-break: break-word;
  760. }
  761. .event-pre.event-stderr {
  762. color: var(--danger, #cf222e);
  763. }
  764. .event-pre.event-command {
  765. background: #ddf4ff;
  766. font-weight: 600;
  767. }
  768. .event-result-body {
  769. margin-top: 0.3rem;
  770. }
  771. .event-kind-turn_text { background: var(--line-soft, #f0f0f0); color: #6e7781; }
  772. .event-kind-tool_call { background: #ddf4ff; color: #0969da; }
  773. .event-kind-tool_result { background: var(--line-soft, #f0f0f0); color: #6e7781; }
  774. .event-kind-progress { background: #dafbe1; color: var(--success, #1a7f37); }
  775. .event-kind-comment { background: #f0f0f0; color: #6e7781; }
  776. .event-kind-answer { background: #ddf4ff; color: #0969da; }
  777. .event-kind-verdict { background: #fff1e0; color: #9a4700; }
  778. .event-kind-state_change { background: #fff8c5; color: var(--warning, #9a6700); }
  779. .event-kind-lifecycle { background: #f3e8ff; color: var(--plan, #8250df); }
  780. .event-kind-usage { background: var(--line-soft, #f0f0f0); color: #6e7781; }
  781. .event-kind-force_wake { background: #fff8c5; color: var(--warning, #9a6700); }
  782. .event-kind-cancel { background: #ffebe9; color: var(--danger, #cf222e); }