issue-flow 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/{agent-TB6W7PT7.js → agent-HMZTXCRT.js} +5 -5
  2. package/dist/{analyze-6M3KEOX7.js → analyze-Q4ONIWRZ.js} +10 -10
  3. package/dist/{apply-ADB3ZK7W.js → apply-EEFPY2W4.js} +5 -5
  4. package/dist/{bench-FM7I7EIV.js → bench-WWWXLTFH.js} +9 -9
  5. package/dist/{chunk-KZ5EY5XX.js → chunk-34OCSKOB.js} +7 -7
  6. package/dist/{chunk-UWDCIFTP.js → chunk-45WZ6GMI.js} +27 -43
  7. package/dist/chunk-45WZ6GMI.js.map +1 -0
  8. package/dist/{chunk-QMIQR7EE.js → chunk-62GVVZQO.js} +3 -3
  9. package/dist/{chunk-YII4U7ZD.js → chunk-6K2LCFG6.js} +2 -2
  10. package/dist/{chunk-A4H7P7T7.js → chunk-7UMMFOL2.js} +3 -3
  11. package/dist/chunk-7UMMFOL2.js.map +1 -0
  12. package/dist/{chunk-HJBF4WD2.js → chunk-CWSQVHVV.js} +59 -25
  13. package/dist/chunk-CWSQVHVV.js.map +1 -0
  14. package/dist/{chunk-SGTTR4XW.js → chunk-E4I6MMHD.js} +4 -4
  15. package/dist/{chunk-6YQT3SSM.js → chunk-ECU7YO7S.js} +2 -2
  16. package/dist/{chunk-MI5TREN3.js → chunk-EG2MGDP5.js} +6 -6
  17. package/dist/{chunk-RCZJQUTC.js → chunk-HOAHMERN.js} +43 -10
  18. package/dist/chunk-HOAHMERN.js.map +1 -0
  19. package/dist/{chunk-HLAPOUEM.js → chunk-KMCS76ZW.js} +3 -3
  20. package/dist/{chunk-KZXQWC7U.js → chunk-KRAGAUKD.js} +8 -8
  21. package/dist/{chunk-E6KXCV3T.js → chunk-LGHND47K.js} +2 -2
  22. package/dist/{chunk-DV7HUC4Z.js → chunk-LI35PIIS.js} +2 -2
  23. package/dist/{chunk-Z5O2XBWA.js → chunk-LTH6XYZ3.js} +5 -5
  24. package/dist/{chunk-2SUFAE6X.js → chunk-NEWNXZ65.js} +21 -12
  25. package/dist/{chunk-2SUFAE6X.js.map → chunk-NEWNXZ65.js.map} +1 -1
  26. package/dist/{chunk-LPWPFIIB.js → chunk-OODXFCQV.js} +7 -7
  27. package/dist/{chunk-ISZ54SVE.js → chunk-PMLE7KAQ.js} +17 -9
  28. package/dist/chunk-PMLE7KAQ.js.map +1 -0
  29. package/dist/{chunk-HY5HLFDU.js → chunk-QF7VEL3M.js} +115 -14
  30. package/dist/chunk-QF7VEL3M.js.map +1 -0
  31. package/dist/{chunk-B3TSS7BT.js → chunk-QJ44VG5G.js} +2 -2
  32. package/dist/{chunk-VE3IYNDN.js → chunk-SA6HXL4Y.js} +2 -2
  33. package/dist/{chunk-UK4E2FUA.js → chunk-TZYINKCC.js} +75 -53
  34. package/dist/chunk-TZYINKCC.js.map +1 -0
  35. package/dist/{chunk-32JSYXEK.js → chunk-V7QOIQYC.js} +2 -2
  36. package/dist/{chunk-ANI2NTR4.js → chunk-XUEMATVY.js} +6 -6
  37. package/dist/{chunk-D6ZBGJ3L.js → chunk-ZVZMWNCG.js} +129 -35
  38. package/dist/chunk-ZVZMWNCG.js.map +1 -0
  39. package/dist/cli.js +35 -35
  40. package/dist/cli.js.map +1 -1
  41. package/dist/{config-KGZUPAUP.js → config-LEBZZCJP.js} +4 -4
  42. package/dist/{conventions-RYN7OXJN.js → conventions-XOT6YW5L.js} +6 -6
  43. package/dist/{execute-QL3ZQIAP.js → execute-LELOSR5T.js} +14 -14
  44. package/dist/{generate-CX6KNHZS.js → generate-JGW5JSKB.js} +10 -10
  45. package/dist/{init-PDVQDRS6.js → init-TO6MUXO4.js} +7 -5
  46. package/dist/{operations-CAKIT2BO.js → operations-O4FORFIH.js} +4 -4
  47. package/dist/{plan-PRORGS3L.js → plan-OXAT344Q.js} +12 -12
  48. package/dist/{policy-WX6O2JID.js → policy-U5NBFAO5.js} +5 -5
  49. package/dist/{pr-27RMQI5F.js → pr-UZHNKKZC.js} +12 -12
  50. package/dist/{pr-review-VNESMAMT.js → pr-review-Q4ACAWDM.js} +9 -9
  51. package/dist/{prd-ZNC4T5BS.js → prd-6CYEMLDY.js} +12 -12
  52. package/dist/{recorder-N7U66HCO.js → recorder-2BAKPBRA.js} +2 -2
  53. package/dist/{resume-VLWIE264.js → resume-URCU6CIJ.js} +26 -26
  54. package/dist/{review-7CREJDKB.js → review-LVZT2TMW.js} +13 -13
  55. package/dist/{routing-VCDYHSXA.js → routing-EK6RBZM4.js} +6 -6
  56. package/dist/run-2RXJCJKT.js +56 -0
  57. package/dist/{usage-U7QNGCPK.js → usage-KTMYXAPF.js} +3 -3
  58. package/dist/{web-HUNDHCJ4.js → web-B5UPHHR5.js} +8 -8
  59. package/package.json +1 -1
  60. package/web/AGENTS.md +115 -7
  61. package/web/public/app.css +393 -245
  62. package/web/public/app.js +108 -38
  63. package/web/public/index.html +106 -78
  64. package/dist/chunk-A4H7P7T7.js.map +0 -1
  65. package/dist/chunk-D6ZBGJ3L.js.map +0 -1
  66. package/dist/chunk-HJBF4WD2.js.map +0 -1
  67. package/dist/chunk-HY5HLFDU.js.map +0 -1
  68. package/dist/chunk-ISZ54SVE.js.map +0 -1
  69. package/dist/chunk-RCZJQUTC.js.map +0 -1
  70. package/dist/chunk-UK4E2FUA.js.map +0 -1
  71. package/dist/chunk-UWDCIFTP.js.map +0 -1
  72. package/dist/run-3MPORLF5.js +0 -56
  73. /package/dist/{agent-TB6W7PT7.js.map → agent-HMZTXCRT.js.map} +0 -0
  74. /package/dist/{analyze-6M3KEOX7.js.map → analyze-Q4ONIWRZ.js.map} +0 -0
  75. /package/dist/{apply-ADB3ZK7W.js.map → apply-EEFPY2W4.js.map} +0 -0
  76. /package/dist/{bench-FM7I7EIV.js.map → bench-WWWXLTFH.js.map} +0 -0
  77. /package/dist/{chunk-KZ5EY5XX.js.map → chunk-34OCSKOB.js.map} +0 -0
  78. /package/dist/{chunk-QMIQR7EE.js.map → chunk-62GVVZQO.js.map} +0 -0
  79. /package/dist/{chunk-YII4U7ZD.js.map → chunk-6K2LCFG6.js.map} +0 -0
  80. /package/dist/{chunk-SGTTR4XW.js.map → chunk-E4I6MMHD.js.map} +0 -0
  81. /package/dist/{chunk-6YQT3SSM.js.map → chunk-ECU7YO7S.js.map} +0 -0
  82. /package/dist/{chunk-MI5TREN3.js.map → chunk-EG2MGDP5.js.map} +0 -0
  83. /package/dist/{chunk-HLAPOUEM.js.map → chunk-KMCS76ZW.js.map} +0 -0
  84. /package/dist/{chunk-KZXQWC7U.js.map → chunk-KRAGAUKD.js.map} +0 -0
  85. /package/dist/{chunk-E6KXCV3T.js.map → chunk-LGHND47K.js.map} +0 -0
  86. /package/dist/{chunk-DV7HUC4Z.js.map → chunk-LI35PIIS.js.map} +0 -0
  87. /package/dist/{chunk-Z5O2XBWA.js.map → chunk-LTH6XYZ3.js.map} +0 -0
  88. /package/dist/{chunk-LPWPFIIB.js.map → chunk-OODXFCQV.js.map} +0 -0
  89. /package/dist/{chunk-B3TSS7BT.js.map → chunk-QJ44VG5G.js.map} +0 -0
  90. /package/dist/{chunk-VE3IYNDN.js.map → chunk-SA6HXL4Y.js.map} +0 -0
  91. /package/dist/{chunk-32JSYXEK.js.map → chunk-V7QOIQYC.js.map} +0 -0
  92. /package/dist/{chunk-ANI2NTR4.js.map → chunk-XUEMATVY.js.map} +0 -0
  93. /package/dist/{config-KGZUPAUP.js.map → config-LEBZZCJP.js.map} +0 -0
  94. /package/dist/{conventions-RYN7OXJN.js.map → conventions-XOT6YW5L.js.map} +0 -0
  95. /package/dist/{execute-QL3ZQIAP.js.map → execute-LELOSR5T.js.map} +0 -0
  96. /package/dist/{generate-CX6KNHZS.js.map → generate-JGW5JSKB.js.map} +0 -0
  97. /package/dist/{init-PDVQDRS6.js.map → init-TO6MUXO4.js.map} +0 -0
  98. /package/dist/{operations-CAKIT2BO.js.map → operations-O4FORFIH.js.map} +0 -0
  99. /package/dist/{plan-PRORGS3L.js.map → plan-OXAT344Q.js.map} +0 -0
  100. /package/dist/{policy-WX6O2JID.js.map → policy-U5NBFAO5.js.map} +0 -0
  101. /package/dist/{pr-27RMQI5F.js.map → pr-UZHNKKZC.js.map} +0 -0
  102. /package/dist/{pr-review-VNESMAMT.js.map → pr-review-Q4ACAWDM.js.map} +0 -0
  103. /package/dist/{prd-ZNC4T5BS.js.map → prd-6CYEMLDY.js.map} +0 -0
  104. /package/dist/{recorder-N7U66HCO.js.map → recorder-2BAKPBRA.js.map} +0 -0
  105. /package/dist/{resume-VLWIE264.js.map → resume-URCU6CIJ.js.map} +0 -0
  106. /package/dist/{review-7CREJDKB.js.map → review-LVZT2TMW.js.map} +0 -0
  107. /package/dist/{routing-VCDYHSXA.js.map → routing-EK6RBZM4.js.map} +0 -0
  108. /package/dist/{run-3MPORLF5.js.map → run-2RXJCJKT.js.map} +0 -0
  109. /package/dist/{usage-U7QNGCPK.js.map → usage-KTMYXAPF.js.map} +0 -0
  110. /package/dist/{web-HUNDHCJ4.js.map → web-B5UPHHR5.js.map} +0 -0
@@ -41,7 +41,8 @@
41
41
  /* Estado: a cor do texto/ícone e a superfície que a acompanha no badge.
42
42
  No tema claro as quatro cores ficam no nível 700 da escala — é o mais
43
43
  claro que atende 4,5:1 sobre a própria superfície do badge. O limiar é
44
- 4,5:1 e não 3:1 porque `.badge` é 0.78rem/600, abaixo de texto grande. */
44
+ 4,5:1 e não 3:1 porque `.badge` é `--font-size-sm`/600, abaixo de texto
45
+ grande. */
45
46
  --state-ok: #15803d;
46
47
  --state-ok-surface: #dcfce7;
47
48
  --state-run: #1d4ed8;
@@ -56,6 +57,25 @@
56
57
  componente gráfico, não texto. */
57
58
  --focus-ring: #4f46e5;
58
59
 
60
+ /* Escalas visuais fechadas. Componentes escolhem um degrau existente em vez
61
+ de criar valores locais; isso mantém a densidade previsível nos dois temas. */
62
+ --font-size-xs: 0.75rem;
63
+ --font-size-sm: 0.8125rem;
64
+ --font-size-md: 0.875rem;
65
+ --font-size-base: 0.9375rem;
66
+ --font-size-lg: 1rem;
67
+ --font-size-xl: 1.25rem;
68
+
69
+ --space-4: 4px;
70
+ --space-8: 8px;
71
+ --space-12: 12px;
72
+ --space-16: 16px;
73
+ --space-24: 24px;
74
+
75
+ --radius-small: 6px;
76
+ --radius-medium: 10px;
77
+ --radius-pill: 999px;
78
+
59
79
  --shadow: 0 1px 2px rgb(0 0 0 / 0.06);
60
80
  --overlay: rgb(0 0 0 / 0.45);
61
81
  }
@@ -144,15 +164,19 @@ body {
144
164
  margin: 0;
145
165
  background: var(--surface-page);
146
166
  color: var(--text);
147
- font: 15px/1.5 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
167
+ font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
168
+ font-size: var(--font-size-base);
169
+ line-height: 1.5;
148
170
  }
149
171
 
150
172
  main {
151
- max-width: 960px;
173
+ max-width: 1200px;
152
174
  margin: 0 auto;
153
- padding: 16px 16px 48px;
175
+ /* O rodape usa dois degraus de 24px para separar o fim do conteúdo sem
176
+ introduzir um sexto token de espaçamento. */
177
+ padding: var(--space-16) var(--space-16) calc(var(--space-24) * 2);
154
178
  display: grid;
155
- gap: 16px;
179
+ gap: var(--space-16);
156
180
  }
157
181
 
158
182
  /* Itens de grid têm min-width automático: sem isto, um conteúdo largo
@@ -164,7 +188,7 @@ main > *,
164
188
 
165
189
  .mono {
166
190
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
167
- font-size: 0.86em;
191
+ font-size: var(--font-size-md);
168
192
  }
169
193
 
170
194
  .muted {
@@ -174,25 +198,25 @@ main > *,
174
198
  .card {
175
199
  background: var(--surface);
176
200
  border: 1px solid var(--border);
177
- border-radius: 10px;
178
- padding: 16px;
201
+ border-radius: var(--radius-medium);
202
+ padding: var(--space-16);
179
203
  box-shadow: var(--shadow);
204
+ overflow-wrap: anywhere;
205
+ min-width: 0;
180
206
  }
181
207
 
208
+ /* Fluxo inline, não flex: o número da issue e o título dela são uma frase só,
209
+ e o título quebra em várias linhas sem empurrar o número para cima. */
182
210
  h1 {
183
211
  margin: 0;
184
- font-size: 1.25rem;
185
- display: flex;
186
- align-items: baseline;
187
- gap: 8px;
212
+ font-size: var(--font-size-xl);
213
+ line-height: 1.35;
188
214
  }
189
215
 
190
216
  h2 {
191
- margin: 0 0 10px;
192
- font-size: 0.8rem;
193
- font-weight: 600;
194
- text-transform: uppercase;
195
- letter-spacing: 0.06em;
217
+ margin: 0 0 var(--space-8);
218
+ font-size: var(--font-size-lg);
219
+ font-weight: 700;
196
220
  color: var(--text-muted);
197
221
  }
198
222
 
@@ -209,7 +233,7 @@ a:hover {
209
233
 
210
234
  .tabs {
211
235
  display: flex;
212
- gap: 4px;
236
+ gap: var(--space-4);
213
237
  border-bottom: 1px solid var(--border);
214
238
  }
215
239
 
@@ -218,13 +242,14 @@ a:hover {
218
242
  background: none;
219
243
  border: none;
220
244
  border-bottom: 2px solid transparent;
245
+ /* Compensa a borda das abas; é alinhamento matemático, não espaçamento. */
221
246
  margin-bottom: -1px;
222
- padding: 8px 14px;
247
+ padding: var(--space-8) var(--space-12);
223
248
  font: inherit;
224
249
  font-weight: 600;
225
250
  color: var(--text-muted);
226
251
  cursor: pointer;
227
- border-radius: 6px 6px 0 0;
252
+ border-radius: var(--radius-small) var(--radius-small) 0 0;
228
253
  }
229
254
 
230
255
  .tab:hover {
@@ -237,11 +262,26 @@ a:hover {
237
262
  border-bottom-color: var(--accent);
238
263
  }
239
264
 
265
+ /* Anel de foco compartilhado: um só tratamento, contraste ≥ 3:1 via
266
+ `--focus-ring`, nunca igual ao hover (que só muda cor/borda/fundo). */
267
+ .tab:focus-visible,
268
+ .dashboard-card:focus-visible,
269
+ .kanban-card:focus-visible,
270
+ .back-link:focus-visible,
271
+ .drawer-close:focus-visible,
272
+ select:focus-visible,
273
+ .detail-row:focus-visible,
274
+ .config-phase-row:focus-visible,
275
+ .config-phase-open:focus-visible {
276
+ outline: 2px solid var(--focus-ring);
277
+ outline-offset: 2px;
278
+ }
279
+
240
280
  /* O painel repete o grid de main: as seções dentro dele são os cards que antes
241
281
  eram filhos diretos de main e dependem desse espaçamento. */
242
282
  .tab-panel {
243
283
  display: grid;
244
- gap: 16px;
284
+ gap: var(--space-16);
245
285
  }
246
286
 
247
287
  .tab-panel[hidden] {
@@ -252,6 +292,76 @@ a:hover {
252
292
  min-width: 0;
253
293
  }
254
294
 
295
+ /* ---- Blocos da aba Execução ----
296
+
297
+ Um bloco é um cartão que reúne várias sub-seções sob um único <h2>. As
298
+ sub-seções (`.block-part`, com <h3>) não têm borda nem fundo próprios: a
299
+ separação é o espaçamento do grid. Assunto novo na aba entra como
300
+ `.block-part` de um bloco existente, não como cartão novo — foi a
301
+ proliferação de cartões que a issue #98 desfez. */
302
+
303
+ .block {
304
+ display: grid;
305
+ gap: var(--space-16);
306
+ align-content: start;
307
+ }
308
+
309
+ .columns {
310
+ display: grid;
311
+ gap: var(--space-16);
312
+ }
313
+
314
+ /* O gap do grid já separa o título do conteúdo. */
315
+ .block > h2 {
316
+ margin-bottom: 0;
317
+ }
318
+
319
+ .block h3 {
320
+ margin: 0 0 var(--space-8);
321
+ font-size: var(--font-size-md);
322
+ font-weight: 600;
323
+ color: var(--text-muted);
324
+ }
325
+
326
+ /* Quando o <h3> divide a linha com um controle, quem espaça é o cabeçalho. */
327
+ .block-part > .section-head {
328
+ margin-bottom: var(--space-8);
329
+ }
330
+
331
+ .block-part > .section-head h3 {
332
+ margin-bottom: 0;
333
+ }
334
+
335
+ /* Complemento do <h3>: peso normal para não competir com o título. */
336
+ .block-hint {
337
+ font-weight: 400;
338
+ }
339
+
340
+ /* Contexto é referência, não estado: um degrau abaixo do resto da aba, e a
341
+ descrição da issue com menos altura para não empurrar o que vem depois. */
342
+ .block-context {
343
+ font-size: var(--font-size-md);
344
+ }
345
+
346
+ .block-context .issue-description {
347
+ max-height: 140px;
348
+ }
349
+
350
+ /* Próximos passos é uma linha, não um cartão: os passos entram separados por
351
+ `·` num único parágrafo (ver renderNextSteps no app.js). */
352
+ .next-steps-line {
353
+ margin: 0;
354
+ font-size: var(--font-size-md);
355
+ display: flex;
356
+ flex-wrap: wrap;
357
+ gap: var(--space-8);
358
+ }
359
+
360
+ .next-steps-label {
361
+ color: var(--text-muted);
362
+ font-weight: 600;
363
+ }
364
+
255
365
  /* ---- Cabeçalho ---- */
256
366
 
257
367
  .header {
@@ -259,74 +369,87 @@ a:hover {
259
369
  flex-wrap: wrap;
260
370
  justify-content: space-between;
261
371
  align-items: flex-start;
262
- gap: 12px;
372
+ gap: var(--space-12);
263
373
  }
264
374
 
265
- .brand {
266
- font-weight: 700;
375
+ /* O h1 é o título da issue e pode ter várias linhas: o lado esquerdo encolhe e
376
+ quebra em vez de empurrar status, tempo e controles para uma linha própria. */
377
+ .header-main {
378
+ flex: 1 1 320px;
379
+ min-width: 0;
267
380
  }
268
381
 
269
382
  /* Versão do processo que serve o painel. Par medido: --text-muted sobre
270
383
  --surface-sunken (6,10 claro / 5,33 escuro). */
271
384
  .app-version {
272
385
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
273
- font-size: 0.72rem;
386
+ font-size: var(--font-size-xs);
274
387
  font-weight: 500;
275
- padding: 1px 7px;
276
- border-radius: 999px;
388
+ padding: var(--space-4) var(--space-8);
389
+ border-radius: var(--radius-pill);
277
390
  background: var(--surface-sunken);
278
391
  color: var(--text-muted);
279
- vertical-align: middle;
280
392
  }
281
393
 
282
394
  .issue-link {
283
395
  font-weight: 600;
284
396
  }
285
397
 
286
- #branch-line {
287
- margin: 4px 0 0;
398
+ /* Linha secundária do header: branch (detalhe) ou resumo das execuções
399
+ (dashboard), com o chip de versão do monitor à direita do texto. */
400
+ .header-meta {
401
+ display: flex;
402
+ flex-wrap: wrap;
403
+ align-items: center;
404
+ gap: var(--space-8);
405
+ margin: var(--space-4) 0 0;
406
+ }
407
+
408
+ /* Sem branch informada o span some, senão o gap abriria um vão antes do chip. */
409
+ .header-meta > span:empty {
410
+ display: none;
288
411
  }
289
412
 
290
413
  .header-side {
291
414
  display: flex;
292
415
  flex-direction: column;
293
416
  align-items: flex-end;
294
- gap: 6px;
417
+ gap: var(--space-8);
295
418
  }
296
419
 
297
420
  .timers {
298
421
  display: flex;
299
- gap: 10px;
422
+ gap: var(--space-12);
300
423
  font-variant-numeric: tabular-nums;
301
424
  }
302
425
 
303
426
  .refresh-control,
304
427
  .theme-control,
305
428
  .log-filter-control {
306
- font-size: 0.82rem;
429
+ font-size: var(--font-size-sm);
307
430
  color: var(--text-muted);
308
431
  display: inline-flex;
309
432
  align-items: center;
310
- gap: 6px;
433
+ gap: var(--space-8);
311
434
  }
312
435
 
313
436
  select {
314
437
  background: var(--surface);
315
438
  color: var(--text);
316
439
  border: 1px solid var(--border);
317
- border-radius: 6px;
318
- padding: 3px 6px;
440
+ border-radius: var(--radius-small);
441
+ padding: var(--space-4) var(--space-8);
319
442
  font: inherit;
320
- font-size: 0.85rem;
443
+ font-size: var(--font-size-md);
321
444
  }
322
445
 
323
446
  /* ---- Badges de status ---- */
324
447
 
325
448
  .badge {
326
449
  display: inline-block;
327
- padding: 2px 10px;
328
- border-radius: 999px;
329
- font-size: 0.78rem;
450
+ padding: var(--space-4) var(--space-8);
451
+ border-radius: var(--radius-pill);
452
+ font-size: var(--font-size-sm);
330
453
  font-weight: 600;
331
454
  text-transform: uppercase;
332
455
  letter-spacing: 0.04em;
@@ -361,7 +484,7 @@ select {
361
484
  background: var(--state-error);
362
485
  color: var(--accent-text);
363
486
  text-align: center;
364
- padding: 8px 16px;
487
+ padding: var(--space-8) var(--space-16);
365
488
  font-weight: 600;
366
489
  }
367
490
 
@@ -373,9 +496,9 @@ select {
373
496
 
374
497
  .alert-entry {
375
498
  border-left: 3px solid var(--state-error);
376
- padding: 4px 10px;
377
- margin: 6px 0;
378
- border-radius: 0 6px 6px 0;
499
+ padding: var(--space-4) var(--space-12);
500
+ margin: var(--space-8) 0;
501
+ border-radius: 0 var(--radius-small) var(--radius-small) 0;
379
502
  background: var(--state-error-surface);
380
503
  }
381
504
 
@@ -385,31 +508,26 @@ select {
385
508
  }
386
509
 
387
510
  .alert-count {
388
- font-size: 0.82rem;
511
+ font-size: var(--font-size-sm);
389
512
  color: var(--text-muted);
390
- margin: 0 0 4px;
513
+ margin: 0 0 var(--space-4);
391
514
  }
392
515
 
393
516
  /* ---- Resumo da issue ---- */
394
517
 
395
- .issue-summary-title {
396
- margin: 0 0 8px;
397
- font-weight: 600;
398
- }
399
-
400
518
  .issue-summary-meta {
401
519
  display: flex;
402
520
  flex-wrap: wrap;
403
521
  align-items: center;
404
- gap: 10px;
405
- margin-bottom: 8px;
522
+ gap: var(--space-12);
523
+ margin-bottom: var(--space-8);
406
524
  }
407
525
 
408
526
  .badge-row {
409
527
  display: flex;
410
528
  flex-wrap: wrap;
411
- gap: 6px;
412
- margin-bottom: 8px;
529
+ gap: var(--space-8);
530
+ margin-bottom: var(--space-8);
413
531
  }
414
532
 
415
533
  .label-badge {
@@ -449,8 +567,8 @@ select {
449
567
  display: flex;
450
568
  flex-wrap: wrap;
451
569
  align-items: center;
452
- gap: 8px;
453
- margin-top: 4px;
570
+ gap: var(--space-8);
571
+ margin-top: var(--space-4);
454
572
  }
455
573
 
456
574
  .story-status-backlog {
@@ -474,7 +592,7 @@ select {
474
592
  }
475
593
 
476
594
  .story-deps {
477
- font-size: 0.84rem;
595
+ font-size: var(--font-size-md);
478
596
  }
479
597
 
480
598
  /* ---- Progresso ---- */
@@ -482,7 +600,7 @@ select {
482
600
  .progress-row {
483
601
  display: flex;
484
602
  align-items: center;
485
- gap: 12px;
603
+ gap: var(--space-12);
486
604
  }
487
605
 
488
606
  progress {
@@ -499,21 +617,22 @@ progress {
499
617
  }
500
618
 
501
619
  #progress-counters {
502
- margin: 8px 0 0;
503
- font-size: 0.86rem;
620
+ margin: var(--space-8) 0 0;
621
+ font-size: var(--font-size-md);
504
622
  }
505
623
 
506
624
  /* ---- Executando agora ---- */
507
625
 
508
626
  .now-grid {
509
627
  display: grid;
510
- grid-template-columns: max-content 1fr;
511
- gap: 4px 14px;
628
+ grid-template-columns: auto minmax(0, 1fr);
629
+ gap: var(--space-4) var(--space-12);
630
+ min-width: 0;
512
631
  }
513
632
 
514
633
  .now-grid dt {
515
634
  color: var(--text-muted);
516
- font-size: 0.86rem;
635
+ font-size: var(--font-size-md);
517
636
  }
518
637
 
519
638
  .now-grid dd {
@@ -523,24 +642,42 @@ progress {
523
642
  white-space: nowrap;
524
643
  }
525
644
 
526
- .pulse {
645
+ /* Indicador ao vivo: um componente, uma keyframe, nos dois lugares
646
+ (fase corrente e card do dashboard). Sem uppercase nem letter-spacing —
647
+ o ponto e o rótulo ao lado bastam. */
648
+ .live {
527
649
  display: inline-block;
528
650
  width: 8px;
529
651
  height: 8px;
530
- border-radius: 50%;
652
+ border-radius: var(--radius-pill);
531
653
  background: var(--state-run);
532
- margin-right: 6px;
533
- animation: pulse 1.4s ease-in-out infinite;
654
+ flex: none;
655
+ animation: live-pulse 1.4s ease-in-out infinite;
534
656
  }
535
657
 
536
- @keyframes pulse {
658
+ @keyframes live-pulse {
537
659
  50% {
538
660
  opacity: 0.3;
539
661
  }
540
662
  }
541
663
 
664
+ .live-label {
665
+ display: inline-flex;
666
+ align-items: center;
667
+ gap: var(--space-8);
668
+ font-size: var(--font-size-xs);
669
+ font-weight: 600;
670
+ color: var(--state-run);
671
+ }
672
+
673
+ .now-phase {
674
+ display: flex;
675
+ align-items: center;
676
+ gap: var(--space-8);
677
+ }
678
+
542
679
  @media (prefers-reduced-motion: reduce) {
543
- .pulse {
680
+ .live {
544
681
  animation: none;
545
682
  }
546
683
  }
@@ -556,8 +693,8 @@ progress {
556
693
  .plain-list li {
557
694
  display: flex;
558
695
  align-items: baseline;
559
- gap: 8px;
560
- padding: 5px 0;
696
+ gap: var(--space-8);
697
+ padding: var(--space-4) 0;
561
698
  border-bottom: 1px solid var(--border);
562
699
  }
563
700
 
@@ -575,19 +712,6 @@ progress {
575
712
  overflow-wrap: anywhere;
576
713
  }
577
714
 
578
- @media (max-width: 560px) {
579
- .plain-list .history-entry {
580
- flex-wrap: wrap;
581
- }
582
-
583
- .history-type {
584
- flex-basis: auto;
585
- }
586
-
587
- .history-message {
588
- flex-basis: 100%;
589
- }
590
- }
591
715
 
592
716
  .plain-list li:last-child {
593
717
  border-bottom: none;
@@ -605,9 +729,10 @@ progress {
605
729
  deslocar o conteúdo do item ao ganhar/perder a classe. */
606
730
  .story-executing {
607
731
  background: var(--state-run-surface);
608
- border-radius: 6px;
732
+ border-radius: var(--radius-small);
609
733
  box-shadow: inset 3px 0 0 0 var(--state-run);
610
- padding-left: 9px;
734
+ /* A sombra interna ocupa 3px; a subtração preserva o ritmo total de 12px. */
735
+ padding-left: calc(var(--space-12) - 3px);
611
736
  }
612
737
 
613
738
  .icon-completed {
@@ -639,7 +764,7 @@ progress {
639
764
 
640
765
  .item-error {
641
766
  color: var(--state-error);
642
- font-size: 0.85rem;
767
+ font-size: var(--font-size-md);
643
768
  white-space: pre-wrap;
644
769
  word-break: break-word;
645
770
  }
@@ -647,7 +772,7 @@ progress {
647
772
  .item-side {
648
773
  flex: none;
649
774
  color: var(--text-muted);
650
- font-size: 0.84rem;
775
+ font-size: var(--font-size-md);
651
776
  font-variant-numeric: tabular-nums;
652
777
  /* Com duração + tokens + custo o slot fica bem mais largo; alinhar à
653
778
  direita e limitar a largura mantém o título legível. Sem métricas o
@@ -658,22 +783,22 @@ progress {
658
783
 
659
784
  .story-id {
660
785
  font-weight: 600;
661
- margin-right: 6px;
786
+ margin-right: var(--space-8);
662
787
  }
663
788
 
664
789
  .commit-hash {
665
- margin-right: 8px;
790
+ margin-right: var(--space-8);
666
791
  }
667
792
 
668
793
  /* ---- Próximos passos ---- */
669
794
 
670
795
  #next-steps ol {
671
796
  margin: 0;
672
- padding-left: 20px;
797
+ padding-left: var(--space-24);
673
798
  }
674
799
 
675
800
  #next-steps li {
676
- padding: 2px 0;
801
+ padding: var(--space-4) 0;
677
802
  }
678
803
 
679
804
  /* ---- Logs ---- */
@@ -682,19 +807,19 @@ progress {
682
807
  display: flex;
683
808
  justify-content: space-between;
684
809
  align-items: baseline;
685
- gap: 12px;
810
+ gap: var(--space-12);
686
811
  }
687
812
 
688
813
  .logs {
689
814
  max-height: 320px;
690
815
  overflow-y: auto;
691
816
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
692
- font-size: 0.8rem;
817
+ font-size: var(--font-size-sm);
693
818
  }
694
819
 
695
820
  .logs li {
696
821
  border-bottom: none;
697
- padding: 2px 0;
822
+ padding: var(--space-4) 0;
698
823
  align-items: flex-start;
699
824
  }
700
825
 
@@ -733,17 +858,17 @@ progress {
733
858
  .kanban {
734
859
  display: grid;
735
860
  grid-template-columns: repeat(4, minmax(0, 1fr));
736
- gap: 12px;
861
+ gap: var(--space-12);
737
862
  align-items: start;
738
863
  }
739
864
 
740
865
  .kanban-column {
741
866
  background: var(--surface-page);
742
867
  border: 1px solid var(--border);
743
- border-radius: 8px;
744
- padding: 10px;
868
+ border-radius: var(--radius-medium);
869
+ padding: var(--space-12);
745
870
  display: grid;
746
- gap: 8px;
871
+ gap: var(--space-8);
747
872
  min-width: 0;
748
873
  }
749
874
 
@@ -751,12 +876,12 @@ progress {
751
876
  display: flex;
752
877
  align-items: center;
753
878
  justify-content: space-between;
754
- gap: 8px;
879
+ gap: var(--space-8);
755
880
  }
756
881
 
757
882
  .kanban-column-title {
758
883
  margin: 0;
759
- font-size: 0.72rem;
884
+ font-size: var(--font-size-xs);
760
885
  font-weight: 600;
761
886
  text-transform: uppercase;
762
887
  letter-spacing: 0.06em;
@@ -767,23 +892,23 @@ progress {
767
892
  flex: none;
768
893
  background: var(--surface-sunken);
769
894
  color: var(--text-muted);
770
- border-radius: 999px;
771
- padding: 0 7px;
772
- font-size: 0.74rem;
895
+ border-radius: var(--radius-pill);
896
+ padding: 0 var(--space-8);
897
+ font-size: var(--font-size-xs);
773
898
  font-variant-numeric: tabular-nums;
774
899
  }
775
900
 
776
901
  .kanban-card {
777
902
  appearance: none;
778
903
  display: grid;
779
- gap: 6px;
904
+ gap: var(--space-8);
780
905
  justify-items: start;
781
906
  width: 100%;
782
907
  text-align: left;
783
908
  background: var(--surface);
784
909
  border: 1px solid var(--border);
785
- border-radius: 8px;
786
- padding: 10px;
910
+ border-radius: var(--radius-medium);
911
+ padding: var(--space-12);
787
912
  font: inherit;
788
913
  color: inherit;
789
914
  cursor: pointer;
@@ -797,9 +922,9 @@ progress {
797
922
  .kanban-card-head {
798
923
  display: flex;
799
924
  align-items: center;
800
- gap: 2px;
925
+ gap: var(--space-4);
801
926
  color: var(--text-muted);
802
- font-size: 0.8rem;
927
+ font-size: var(--font-size-sm);
803
928
  }
804
929
 
805
930
  .kanban-card-title {
@@ -814,7 +939,7 @@ progress {
814
939
  .kanban-card-desc {
815
940
  margin: 0;
816
941
  color: var(--text-muted);
817
- font-size: 0.84rem;
942
+ font-size: var(--font-size-md);
818
943
  line-height: 1.4;
819
944
  overflow: hidden;
820
945
  display: -webkit-box;
@@ -825,14 +950,9 @@ progress {
825
950
  }
826
951
 
827
952
  .kanban-empty {
828
- font-size: 0.84rem;
953
+ font-size: var(--font-size-md);
829
954
  }
830
955
 
831
- @media (max-width: 719px) {
832
- .kanban {
833
- grid-template-columns: minmax(0, 1fr);
834
- }
835
- }
836
956
 
837
957
  /* ---- Drawer de detalhes ---- */
838
958
 
@@ -855,8 +975,8 @@ progress {
855
975
  flex-direction: column;
856
976
  background: var(--surface);
857
977
  border-left: 1px solid var(--border);
858
- padding: 16px;
859
- gap: 12px;
978
+ padding: var(--space-16);
979
+ gap: var(--space-12);
860
980
  }
861
981
 
862
982
  .drawer[hidden],
@@ -868,14 +988,14 @@ progress {
868
988
  display: flex;
869
989
  align-items: flex-start;
870
990
  justify-content: space-between;
871
- gap: 12px;
991
+ gap: var(--space-12);
872
992
  }
873
993
 
874
994
  .drawer-head h2 {
875
995
  margin: 0;
876
996
  /* O título carrega o id + o título da story: fora do padrão caixa-alta das
877
997
  demais seções, que são rótulos fixos e curtos. */
878
- font-size: 0.95rem;
998
+ font-size: var(--font-size-base);
879
999
  text-transform: none;
880
1000
  letter-spacing: normal;
881
1001
  color: var(--text);
@@ -887,11 +1007,11 @@ progress {
887
1007
  flex: none;
888
1008
  background: none;
889
1009
  border: none;
890
- padding: 2px 6px;
1010
+ padding: var(--space-4) var(--space-8);
891
1011
  font: inherit;
892
1012
  color: var(--text-muted);
893
1013
  cursor: pointer;
894
- border-radius: 6px;
1014
+ border-radius: var(--radius-small);
895
1015
  }
896
1016
 
897
1017
  .drawer-close:hover {
@@ -903,25 +1023,25 @@ progress {
903
1023
  .drawer-body {
904
1024
  overflow-y: auto;
905
1025
  display: grid;
906
- gap: 14px;
1026
+ gap: var(--space-12);
907
1027
  align-content: start;
908
1028
  justify-items: start;
909
1029
  }
910
1030
 
911
1031
  .drawer-timing {
912
1032
  margin: 0;
913
- font-size: 0.84rem;
1033
+ font-size: var(--font-size-md);
914
1034
  }
915
1035
 
916
1036
  .drawer-section {
917
1037
  width: 100%;
918
1038
  display: grid;
919
- gap: 6px;
1039
+ gap: var(--space-8);
920
1040
  }
921
1041
 
922
1042
  .drawer-section-title {
923
1043
  margin: 0;
924
- font-size: 0.72rem;
1044
+ font-size: var(--font-size-xs);
925
1045
  font-weight: 600;
926
1046
  text-transform: uppercase;
927
1047
  letter-spacing: 0.06em;
@@ -936,9 +1056,9 @@ progress {
936
1056
 
937
1057
  .drawer-list {
938
1058
  margin: 0;
939
- padding-left: 18px;
1059
+ padding-left: var(--space-16);
940
1060
  display: grid;
941
- gap: 4px;
1061
+ gap: var(--space-4);
942
1062
  }
943
1063
 
944
1064
  .drawer-list li {
@@ -947,7 +1067,7 @@ progress {
947
1067
 
948
1068
  .detail-row {
949
1069
  cursor: pointer;
950
- border-radius: 8px;
1070
+ border-radius: var(--radius-small);
951
1071
  transition: background 120ms ease, box-shadow 120ms ease;
952
1072
  }
953
1073
 
@@ -955,18 +1075,14 @@ progress {
955
1075
  background: var(--surface-sunken);
956
1076
  }
957
1077
 
958
- .detail-row:focus-visible,
959
- .config-phase-row:focus-visible {
960
- outline: 2px solid var(--focus-ring);
961
- outline-offset: 2px;
962
- }
963
-
964
1078
  .config-phase-grid {
965
1079
  display: grid;
1080
+ /* O fundo `--border` aparece pelo gap: é a linha divisória entre as células,
1081
+ não espaçamento — daí ficar fora da escala. */
966
1082
  gap: 1px;
967
- margin-top: 1rem;
1083
+ margin-top: var(--space-16);
968
1084
  border: 1px solid var(--border);
969
- border-radius: 10px;
1085
+ border-radius: var(--radius-medium);
970
1086
  overflow: hidden;
971
1087
  background: var(--border);
972
1088
  }
@@ -974,9 +1090,9 @@ progress {
974
1090
  .config-phase-row {
975
1091
  display: grid;
976
1092
  grid-template-columns: minmax(5rem, 0.7fr) minmax(6rem, 1fr) minmax(8rem, 1.4fr) minmax(10rem, 1.4fr);
977
- gap: 0.75rem;
1093
+ gap: var(--space-12);
978
1094
  align-items: center;
979
- padding: 0.65rem 0.8rem;
1095
+ padding: var(--space-12);
980
1096
  border: 0;
981
1097
  color: var(--text);
982
1098
  background: var(--surface);
@@ -998,11 +1114,6 @@ progress {
998
1114
  cursor: pointer;
999
1115
  }
1000
1116
 
1001
- .config-phase-open:focus-visible {
1002
- outline: 2px solid var(--focus-ring);
1003
- outline-offset: 3px;
1004
- }
1005
-
1006
1117
  .config-phase-row:hover {
1007
1118
  background: var(--surface-sunken);
1008
1119
  }
@@ -1010,10 +1121,10 @@ progress {
1010
1121
  .config-form {
1011
1122
  display: grid;
1012
1123
  grid-template-columns: minmax(8rem, 0.7fr) minmax(12rem, 1fr) auto minmax(10rem, 1fr);
1013
- gap: 0.65rem;
1124
+ gap: var(--space-12);
1014
1125
  align-items: center;
1015
- margin-top: 1rem;
1016
- padding-top: 1rem;
1126
+ margin-top: var(--space-16);
1127
+ padding-top: var(--space-16);
1017
1128
  border-top: 1px solid var(--border);
1018
1129
  }
1019
1130
 
@@ -1022,8 +1133,8 @@ progress {
1022
1133
  }
1023
1134
 
1024
1135
  .config-routing-summary {
1025
- margin-top: 1rem;
1026
- padding-top: 1rem;
1136
+ margin-top: var(--space-16);
1137
+ padding-top: var(--space-16);
1027
1138
  border-top: 1px solid var(--border);
1028
1139
  }
1029
1140
 
@@ -1037,8 +1148,8 @@ progress {
1037
1148
  .config-save {
1038
1149
  min-height: 2.25rem;
1039
1150
  border: 1px solid var(--border-strong);
1040
- border-radius: 7px;
1041
- padding: 0.4rem 0.65rem;
1151
+ border-radius: var(--radius-small);
1152
+ padding: var(--space-8) var(--space-12);
1042
1153
  color: var(--text);
1043
1154
  background: var(--surface);
1044
1155
  }
@@ -1056,29 +1167,29 @@ progress {
1056
1167
 
1057
1168
  .execution-timeline {
1058
1169
  display: grid;
1059
- gap: 0.75rem;
1170
+ gap: var(--space-12);
1060
1171
  margin: 0;
1061
1172
  padding: 0;
1062
1173
  list-style: none;
1063
1174
  }
1064
1175
 
1065
1176
  .execution-entry {
1066
- padding: 0.8rem;
1177
+ padding: var(--space-12);
1067
1178
  border: 1px solid var(--border);
1068
- border-radius: 9px;
1179
+ border-radius: var(--radius-medium);
1069
1180
  background: var(--surface-sunken);
1070
1181
  }
1071
1182
 
1072
1183
  .execution-entry-head {
1073
1184
  display: flex;
1074
- gap: 0.6rem;
1185
+ gap: var(--space-8);
1075
1186
  align-items: center;
1076
- margin-bottom: 0.65rem;
1187
+ margin-bottom: var(--space-12);
1077
1188
  }
1078
1189
 
1079
1190
  .execution-grid,
1080
1191
  .drawer-summary-grid {
1081
- margin-top: 0.75rem;
1192
+ margin-top: var(--space-12);
1082
1193
  }
1083
1194
 
1084
1195
  .process-output summary {
@@ -1089,36 +1200,23 @@ progress {
1089
1200
  .process-output-body {
1090
1201
  max-height: 22rem;
1091
1202
  overflow: auto;
1092
- padding: 0.8rem;
1093
- border-radius: 8px;
1203
+ padding: var(--space-12);
1204
+ border-radius: var(--radius-small);
1094
1205
  color: var(--text);
1095
1206
  background: var(--surface-sunken);
1096
1207
  white-space: pre-wrap;
1097
1208
  overflow-wrap: anywhere;
1098
- font-size: 0.75rem;
1209
+ font-size: var(--font-size-xs);
1099
1210
  line-height: 1.45;
1100
1211
  }
1101
1212
 
1102
1213
  .commit-meta {
1103
1214
  display: block;
1104
- margin-top: 0.2rem;
1105
- font-size: 0.76rem;
1215
+ margin-top: var(--space-4);
1216
+ font-size: var(--font-size-xs);
1106
1217
  font-weight: 400;
1107
1218
  }
1108
1219
 
1109
- @media (max-width: 720px) {
1110
- .config-phase-row {
1111
- grid-template-columns: 1fr 1fr;
1112
- }
1113
-
1114
- .config-phase-row.is-editable {
1115
- grid-template-columns: 1fr;
1116
- }
1117
-
1118
- .config-form {
1119
- grid-template-columns: 1fr;
1120
- }
1121
- }
1122
1220
 
1123
1221
  /* ---- Diversos ---- */
1124
1222
 
@@ -1130,43 +1228,20 @@ progress {
1130
1228
 
1131
1229
  .footer {
1132
1230
  text-align: center;
1133
- font-size: 0.78rem;
1231
+ font-size: var(--font-size-sm);
1134
1232
  }
1135
1233
 
1136
1234
  .noscript {
1137
- max-width: 960px;
1138
- margin: 16px auto;
1139
- padding: 0 16px;
1140
- }
1141
-
1142
- @media (min-width: 720px) {
1143
- .columns {
1144
- display: grid;
1145
- grid-template-columns: 1fr 1fr;
1146
- gap: 16px;
1147
- }
1148
- }
1149
-
1150
- @media (max-width: 719px) {
1151
- .columns {
1152
- display: grid;
1153
- gap: 16px;
1154
- }
1155
-
1156
- .header-side {
1157
- align-items: flex-start;
1158
- }
1159
-
1160
- .dashboard-grid {
1161
- grid-template-columns: 1fr;
1162
- }
1235
+ max-width: 1200px;
1236
+ margin: var(--space-16) auto;
1237
+ padding: 0 var(--space-16);
1163
1238
  }
1164
1239
 
1165
1240
  /* ---- Views: dashboard multi-sessão vs detalhe (#35) ---- */
1166
1241
 
1167
1242
  .view {
1168
1243
  display: grid;
1169
- gap: 16px;
1244
+ gap: var(--space-16);
1170
1245
  min-width: 0;
1171
1246
  }
1172
1247
 
@@ -1183,9 +1258,9 @@ progress {
1183
1258
  background: none;
1184
1259
  border: none;
1185
1260
  padding: 0;
1186
- margin: 0 0 6px;
1261
+ margin: 0 0 var(--space-8);
1187
1262
  font: inherit;
1188
- font-size: 0.85rem;
1263
+ font-size: var(--font-size-md);
1189
1264
  font-weight: 600;
1190
1265
  color: var(--accent);
1191
1266
  cursor: pointer;
@@ -1199,7 +1274,7 @@ progress {
1199
1274
  .dashboard-grid {
1200
1275
  display: grid;
1201
1276
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1202
- gap: 16px;
1277
+ gap: var(--space-16);
1203
1278
  }
1204
1279
 
1205
1280
  .dashboard-card {
@@ -1207,8 +1282,8 @@ progress {
1207
1282
  text-align: left;
1208
1283
  background: var(--surface);
1209
1284
  border: 1px solid var(--border);
1210
- border-radius: 10px;
1211
- padding: 16px;
1285
+ border-radius: var(--radius-medium);
1286
+ padding: var(--space-16);
1212
1287
  box-shadow: var(--shadow);
1213
1288
  color: inherit;
1214
1289
  font: inherit;
@@ -1220,7 +1295,7 @@ progress {
1220
1295
  uma 4ª linha cortada por baixo do reticente. Empacotar no topo manda a
1221
1296
  sobra para o fim do card, que é onde ela não engana ninguém. */
1222
1297
  align-content: start;
1223
- gap: 10px;
1298
+ gap: var(--space-12);
1224
1299
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
1225
1300
  }
1226
1301
 
@@ -1231,11 +1306,6 @@ progress {
1231
1306
  border-color: var(--accent);
1232
1307
  }
1233
1308
 
1234
- .dashboard-card:focus-visible {
1235
- outline: 2px solid var(--focus-ring);
1236
- outline-offset: 2px;
1237
- }
1238
-
1239
1309
  .dashboard-card.is-live {
1240
1310
  border-color: var(--state-run);
1241
1311
  }
@@ -1244,11 +1314,11 @@ progress {
1244
1314
  display: flex;
1245
1315
  justify-content: space-between;
1246
1316
  align-items: center;
1247
- gap: 8px;
1317
+ gap: var(--space-8);
1248
1318
  }
1249
1319
 
1250
1320
  .dashboard-project {
1251
- font-size: 0.82rem;
1321
+ font-size: var(--font-size-sm);
1252
1322
  font-weight: 600;
1253
1323
  color: var(--text-muted);
1254
1324
  overflow-wrap: anywhere;
@@ -1258,7 +1328,7 @@ progress {
1258
1328
  display: flex;
1259
1329
  flex-wrap: wrap;
1260
1330
  align-items: baseline;
1261
- gap: 8px;
1331
+ gap: var(--space-8);
1262
1332
  }
1263
1333
 
1264
1334
  .dashboard-issue {
@@ -1274,7 +1344,7 @@ progress {
1274
1344
 
1275
1345
  .dashboard-summary {
1276
1346
  margin: 0;
1277
- font-size: 0.9rem;
1347
+ font-size: var(--font-size-md);
1278
1348
  overflow: hidden;
1279
1349
  display: -webkit-box;
1280
1350
  -webkit-box-orient: vertical;
@@ -1286,8 +1356,8 @@ progress {
1286
1356
  .dashboard-meta-row {
1287
1357
  display: flex;
1288
1358
  flex-wrap: wrap;
1289
- gap: 10px;
1290
- font-size: 0.82rem;
1359
+ gap: var(--space-12);
1360
+ font-size: var(--font-size-sm);
1291
1361
  color: var(--text-muted);
1292
1362
  font-variant-numeric: tabular-nums;
1293
1363
  }
@@ -1296,7 +1366,7 @@ progress {
1296
1366
  display: block;
1297
1367
  height: 6px;
1298
1368
  background: var(--surface-sunken);
1299
- border-radius: 999px;
1369
+ border-radius: var(--radius-pill);
1300
1370
  overflow: hidden;
1301
1371
  }
1302
1372
 
@@ -1304,36 +1374,114 @@ progress {
1304
1374
  display: block;
1305
1375
  height: 100%;
1306
1376
  background: var(--state-run);
1307
- border-radius: 999px;
1377
+ border-radius: var(--radius-pill);
1308
1378
  transition: width 0.3s ease;
1309
1379
  }
1310
1380
 
1311
- .dashboard-live-dot {
1312
- font-size: 0.75rem;
1313
- font-weight: 600;
1314
- color: var(--state-run);
1315
- text-transform: uppercase;
1316
- letter-spacing: 0.04em;
1381
+ /* Dois breakpoints, no contêiner — não um por componente. 640px é o
1382
+ estreito (uma coluna); 960px é o largo (Contexto vira coluna lateral). */
1383
+ @media (max-width: 639px) {
1384
+ .plain-list .history-entry {
1385
+ flex-wrap: wrap;
1386
+ }
1387
+
1388
+ .history-type {
1389
+ flex-basis: auto;
1390
+ }
1391
+
1392
+ .history-message {
1393
+ flex-basis: 100%;
1394
+ }
1395
+
1396
+ .kanban {
1397
+ grid-template-columns: minmax(0, 1fr);
1398
+ }
1399
+
1400
+ .config-phase-row {
1401
+ grid-template-columns: 1fr 1fr;
1402
+ }
1403
+
1404
+ .config-phase-row.is-editable {
1405
+ grid-template-columns: 1fr;
1406
+ }
1407
+
1408
+ .config-form {
1409
+ grid-template-columns: 1fr;
1410
+ }
1411
+
1412
+ .header-side {
1413
+ align-items: flex-start;
1414
+ }
1415
+
1416
+ .dashboard-grid {
1417
+ grid-template-columns: 1fr;
1418
+ }
1419
+
1420
+ .plain-list li {
1421
+ flex-wrap: wrap;
1422
+ }
1423
+
1424
+ .item-title {
1425
+ white-space: normal;
1426
+ }
1427
+
1428
+ .item-side {
1429
+ flex-basis: 100%;
1430
+ max-width: none;
1431
+ text-align: left;
1432
+ }
1317
1433
  }
1318
1434
 
1319
- .dashboard-live-dot::before {
1320
- content: '';
1321
- display: inline-block;
1322
- width: 7px;
1323
- height: 7px;
1324
- margin-right: 6px;
1325
- border-radius: 50%;
1326
- background: var(--state-run);
1327
- vertical-align: middle;
1328
- animation: dashboard-pulse 1.4s ease-in-out infinite;
1435
+ @media (min-width: 640px) {
1436
+ .columns {
1437
+ grid-template-columns: 1fr 1fr;
1438
+ }
1329
1439
  }
1330
1440
 
1331
- @keyframes dashboard-pulse {
1332
- 0%,
1333
- 100% {
1334
- opacity: 1;
1441
+ @media (min-width: 960px) {
1442
+ #panel-execution {
1443
+ grid-template-columns: minmax(0, 1fr) minmax(0, 22rem);
1444
+ grid-template-areas:
1445
+ 'now context'
1446
+ 'progress context'
1447
+ 'output output';
1448
+ align-items: start;
1335
1449
  }
1336
- 50% {
1337
- opacity: 0.35;
1450
+
1451
+ #panel-execution > * {
1452
+ min-width: 0;
1453
+ }
1454
+
1455
+ #panel-execution .block-now {
1456
+ grid-area: now;
1457
+ }
1458
+
1459
+ #panel-execution .block-context {
1460
+ grid-area: context;
1461
+ overflow-x: auto;
1462
+ }
1463
+
1464
+ #panel-execution .block-context .columns {
1465
+ grid-template-columns: minmax(0, 1fr);
1466
+ }
1467
+
1468
+ #panel-execution .block-progress {
1469
+ grid-area: progress;
1470
+ }
1471
+
1472
+ #panel-execution .block-output {
1473
+ grid-area: output;
1474
+ }
1475
+ }
1476
+
1477
+ /* Qualquer animação ou transição do painel para quando o usuário pede menos
1478
+ movimento — inclusive as que um componente novo esquecer de guardar. */
1479
+ @media (prefers-reduced-motion: reduce) {
1480
+ *,
1481
+ *::before,
1482
+ *::after {
1483
+ animation: none !important;
1484
+ transition: none !important;
1338
1485
  }
1339
1486
  }
1487
+