app.css 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  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. border: 1px solid var(--line);
  457. border-radius: var(--radius);
  458. cursor: pointer;
  459. padding: var(--grid-1) var(--grid-2);
  460. }
  461. .options .option-card:hover { border-color: var(--accent); }
  462. .options .option-card:has(input:checked) {
  463. background: #ddf4ff;
  464. border-color: #0969da;
  465. }
  466. /* ---- Design-task plan review ---- */
  467. .plan-review .actions { display: flex; gap: var(--grid-1); flex-wrap: wrap; margin: var(--grid-1) 0; }
  468. .plan-review .rfc-body {
  469. border: 1px solid var(--line);
  470. border-radius: var(--radius);
  471. margin: var(--grid-1) 0;
  472. padding: var(--grid-2);
  473. }
  474. .plan-comments { list-style: none; margin: var(--grid-1) 0; padding: 0; }
  475. .plan-comments li {
  476. border: 1px solid var(--line);
  477. border-left: 3px solid var(--accent);
  478. border-radius: var(--radius);
  479. margin: var(--grid-1) 0;
  480. padding: var(--grid-1) var(--grid-2);
  481. }
  482. .plan-comments blockquote { margin: 0 0 var(--grid-1); }
  483. .plan-popover {
  484. background: var(--surface);
  485. border: 1px solid var(--line);
  486. border-radius: var(--radius);
  487. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
  488. padding: var(--grid-2);
  489. position: absolute;
  490. width: 22rem;
  491. z-index: 40;
  492. }
  493. .plan-popover .actions { display: flex; gap: var(--grid-1); margin-top: var(--grid-1); }
  494. /* ---- Review banner ---- */
  495. .review-banner {
  496. background: #fff8eb;
  497. border: 1px solid var(--review);
  498. border-radius: var(--radius);
  499. margin: var(--grid-2) 0;
  500. padding: var(--grid-2);
  501. }
  502. .review-banner h3 { color: #9a4700; margin: 0 0 var(--grid-1); }
  503. .review-banner .actions { display: flex; gap: var(--grid-1); flex-wrap: wrap; margin-top: var(--grid-1); }
  504. /* ---- Progress ---- */
  505. /* Plan 15 C4: the goal page's card rhythm restored (the goalui
  506. restyle regression) — every section is a card and the cards
  507. breathe between themselves. */
  508. .goal-page .card { margin-bottom: var(--grid-2); }
  509. .goal-page .card:last-child { margin-bottom: 0; }
  510. /* Timeless-comment footnote styling (plan 15 C4): the body leads,
  511. the author/time line reads as a muted footnote under it. */
  512. .comment .comment-meta { margin: var(--grid-1) 0 0; }
  513. .progress-latest {
  514. background: #dafbe1;
  515. border: 1px solid var(--success);
  516. border-radius: var(--radius);
  517. font-weight: 600;
  518. margin: var(--grid-1) 0;
  519. padding: var(--grid-1) var(--grid-2);
  520. }
  521. .progress-history li { margin: var(--grid-1) 0; }
  522. /* ---- Terminal ---- */
  523. .terminal {
  524. background: #0d1117;
  525. border-radius: var(--radius);
  526. color: #c9d1d9;
  527. font-family: ui-monospace, "Cascadia Mono", monospace;
  528. font-size: 0.85rem;
  529. max-height: 40rem;
  530. overflow-y: auto;
  531. padding: var(--grid-2);
  532. }
  533. .term-entry {
  534. background: #161b22;
  535. border: 1px solid #30363d;
  536. border-radius: 6px;
  537. margin: var(--grid-1) 0;
  538. padding: var(--grid-1) var(--grid-2);
  539. }
  540. .term-entry .term-head {
  541. display: flex;
  542. align-items: baseline;
  543. gap: var(--grid-1);
  544. flex-wrap: wrap;
  545. color: #8b949e;
  546. font-size: 0.8rem;
  547. }
  548. .term-entry .term-command {
  549. color: #79c0ff;
  550. font-weight: 600;
  551. white-space: pre-wrap;
  552. word-break: break-word;
  553. }
  554. .term-entry pre {
  555. border-radius: 6px;
  556. margin: var(--grid-1) 0 0;
  557. padding: var(--grid-1) var(--grid-2);
  558. white-space: pre-wrap;
  559. word-break: break-word;
  560. }
  561. .term-entry .term-output {
  562. background: #0d1117;
  563. color: #c9d1d9;
  564. cursor: pointer;
  565. }
  566. .term-entry .term-output.collapsed { max-height: 7.5rem; overflow: hidden; position: relative; }
  567. .term-entry .term-output.collapsed::after {
  568. content: "… click to expand";
  569. background: linear-gradient(transparent, #161b22 70%);
  570. color: #8b949e;
  571. display: block;
  572. padding: var(--grid-2) var(--grid-2) var(--grid-1);
  573. position: absolute;
  574. bottom: 0;
  575. left: 0;
  576. right: 0;
  577. }
  578. .term-entry .term-input {
  579. background: #161b22;
  580. border-left: 3px solid #30363d;
  581. color: #8b949e;
  582. }
  583. .term-entry .term-input.collapsed { max-height: 7.5rem; overflow: hidden; }
  584. .term-entry.type-query { border-color: #a371f7; }
  585. .term-entry.type-query .term-command { color: #bc8cff; }
  586. .term-entry.type-comment .term-output, .term-entry.type-comment .term-command { color: #8b949e; font-style: italic; }
  587. .term-entry.type-block { border-color: #d29922; }
  588. .term-entry.type-block .term-output { color: #e3b341; }
  589. .term-entry.type-user-comment { border-color: #58a6ff; }
  590. .term-entry.type-user-comment .term-output, .term-entry.type-user-comment .term-command { color: #79c0ff; }
  591. .term-entry.type-progress { border-color: #2ea043; }
  592. .term-entry.type-progress .term-output, .term-entry.type-progress .term-command { color: #56d364; }
  593. .term-entry.type-review { border-color: #e3b341; }
  594. .term-entry.type-review .term-output, .term-entry.type-review .term-command { color: #e3b341; }
  595. .term-entry.type-plan { border-color: #a371f7; }
  596. .term-entry.type-plan .term-output, .term-entry.type-plan .term-command { color: #bc8cff; }
  597. .term-entry.type-shell-reset { border-color: #30363d; opacity: 0.85; }
  598. .term-entry.type-shell-reset .term-head { color: #8b949e; }
  599. .term-entry.type-failed { border-color: var(--danger); }
  600. .term-entry.type-failed .term-output, .term-entry.type-failed .term-command { color: #ff7b72; }
  601. /* ---- Text-selection comment popover ---- */
  602. .quote-popover {
  603. background: var(--surface);
  604. border: 1px solid var(--line);
  605. border-radius: var(--radius);
  606. box-shadow: 0 4px 16px #0002;
  607. padding: var(--grid-2);
  608. position: absolute;
  609. width: min(26rem, calc(100vw - 3rem));
  610. z-index: 40;
  611. }
  612. .quote-popover blockquote {
  613. border-left: 3px solid var(--accent);
  614. color: var(--ink-muted);
  615. font-family: ui-monospace, monospace;
  616. font-size: 0.8rem;
  617. margin: 0 0 var(--grid-1);
  618. max-height: 6rem;
  619. overflow-y: auto;
  620. padding: 0 var(--grid-1);
  621. white-space: pre-wrap;
  622. }
  623. .quote-button {
  624. background: var(--accent);
  625. border: none;
  626. border-radius: 6px;
  627. color: #fff;
  628. font-size: 0.8rem;
  629. padding: 0.3rem 0.7rem;
  630. position: absolute;
  631. z-index: 41;
  632. }
  633. /* ---- Toasts ---- */
  634. .toast-stack {
  635. bottom: var(--grid-2);
  636. display: flex;
  637. flex-direction: column;
  638. gap: var(--grid-1);
  639. max-width: min(24rem, calc(100vw - 3rem));
  640. position: fixed;
  641. right: var(--grid-2);
  642. z-index: 100;
  643. }
  644. .toast {
  645. animation: toast-in 0.25s ease-out;
  646. background: var(--surface);
  647. border-left: 4px solid var(--accent);
  648. border-radius: 6px;
  649. box-shadow: 0 4px 16px #0003;
  650. font-size: 0.9rem;
  651. padding: var(--grid-1) var(--grid-2);
  652. }
  653. .toast.success { border-left-color: var(--success); }
  654. .toast.error { border-left-color: var(--danger); }
  655. .toast.leaving { animation: toast-out 0.25s ease-in forwards; }
  656. @keyframes toast-in {
  657. from { opacity: 0; transform: translateX(1rem); }
  658. to { opacity: 1; transform: translateX(0); }
  659. }
  660. @keyframes toast-out {
  661. from { opacity: 1; transform: translateX(0); }
  662. to { opacity: 0; transform: translateX(1rem); }
  663. }
  664. [hidden] { display: none !important; }
  665. /* Comment dialog */
  666. dialog#quote-comment-dialog {
  667. border: 1px solid var(--border);
  668. border-radius: 8px;
  669. box-shadow: 0 8px 32px #0006;
  670. max-width: 40rem;
  671. padding: var(--grid-3);
  672. width: 90%;
  673. }
  674. dialog#quote-comment-dialog::backdrop {
  675. background: #0008;
  676. }
  677. dialog#quote-comment-dialog blockquote {
  678. background: var(--bg-secondary);
  679. border-left: 3px solid var(--accent);
  680. font-family: "SF Mono", "Fira Code", Menlo, monospace;
  681. font-size: 0.85rem;
  682. margin: 0 0 var(--grid-2);
  683. max-height: 10rem;
  684. overflow-y: auto;
  685. padding: var(--grid-2);
  686. white-space: pre-wrap;
  687. }
  688. .term-comment-quote {
  689. color: #4ade80;
  690. font-style: italic;
  691. }
  692. @media (max-width: 40rem) {
  693. header { flex-direction: column; gap: var(--grid-1); }
  694. .cards { grid-template-columns: 1fr; }
  695. .grid-2 { grid-template-columns: 1fr; }
  696. th, td { padding: 0.4rem 0.5rem; font-size: 0.9rem; }
  697. }
  698. /* Admin role badge (users + profile pages): the plan-family violet the
  699. * app already reserves for privileged markings. */
  700. .badge-admin {
  701. background: #f3e8ff;
  702. color: var(--plan);
  703. }
  704. /* Plan 17: the event log page (task_log.html) — the unified ledger's
  705. human view. Turn cards group a run's turn-family events; tool
  706. results collapse behind head+tail summaries with byte counts. */
  707. .log-toolbar {
  708. display: flex;
  709. flex-wrap: wrap;
  710. gap: var(--grid-1, 0.5rem);
  711. align-items: center;
  712. margin-bottom: var(--grid-1, 0.5rem);
  713. }
  714. .log-toolbar input[type="search"] {
  715. flex: 1;
  716. min-width: 12rem;
  717. }
  718. .log-filter.active {
  719. border-color: var(--ink, currentColor);
  720. font-weight: 600;
  721. }
  722. .log-more {
  723. display: block;
  724. margin: 0 auto var(--grid-1, 0.5rem);
  725. }
  726. .log-feed {
  727. display: flex;
  728. flex-direction: column;
  729. gap: var(--grid-1, 0.5rem);
  730. max-height: 72vh;
  731. overflow-y: auto;
  732. border: 1px solid var(--line-soft, #eee);
  733. border-radius: 6px;
  734. padding: var(--grid-1, 0.5rem);
  735. }
  736. .turn-card {
  737. border: 1px solid var(--line-soft, #eee);
  738. border-left: 3px solid var(--line, #ccc);
  739. border-radius: 6px;
  740. padding: 0.4rem 0.6rem;
  741. }
  742. .turn-head {
  743. margin: 0 0 0.3rem;
  744. font-size: 0.85rem;
  745. }
  746. .event-row .event-head {
  747. margin: 0.2rem 0;
  748. }
  749. .event-pre {
  750. margin: 0.2rem 0;
  751. padding: 0.3rem 0.5rem;
  752. background: var(--line-soft, #f6f8fa);
  753. border-radius: 4px;
  754. overflow-x: auto;
  755. font-size: 0.85rem;
  756. white-space: pre-wrap;
  757. word-break: break-word;
  758. }
  759. .event-pre.event-stderr {
  760. color: var(--danger, #cf222e);
  761. }
  762. .event-pre.event-command {
  763. background: #ddf4ff;
  764. font-weight: 600;
  765. }
  766. .event-result-body {
  767. margin-top: 0.3rem;
  768. }
  769. .event-kind-turn_text { background: var(--line-soft, #f0f0f0); color: #6e7781; }
  770. .event-kind-tool_call { background: #ddf4ff; color: #0969da; }
  771. .event-kind-tool_result { background: var(--line-soft, #f0f0f0); color: #6e7781; }
  772. .event-kind-progress { background: #dafbe1; color: var(--success, #1a7f37); }
  773. .event-kind-comment { background: #f0f0f0; color: #6e7781; }
  774. .event-kind-answer { background: #ddf4ff; color: #0969da; }
  775. .event-kind-verdict { background: #fff1e0; color: #9a4700; }
  776. .event-kind-state_change { background: #fff8c5; color: var(--warning, #9a6700); }
  777. .event-kind-lifecycle { background: #f3e8ff; color: var(--plan, #8250df); }
  778. .event-kind-usage { background: var(--line-soft, #f0f0f0); color: #6e7781; }
  779. .event-kind-force_wake { background: #fff8c5; color: var(--warning, #9a6700); }
  780. .event-kind-cancel { background: #ffebe9; color: var(--danger, #cf222e); }