oficina-opencode 3.1.0 → 3.1.1

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 (69) hide show
  1. package/README.md +1 -1
  2. package/commands/oficina.md +7 -6
  3. package/dashboard/.dom-check.html +1257 -0
  4. package/dashboard/README-DASHBOARD.md +64 -0
  5. package/dashboard/assets/factory.css +1543 -0
  6. package/dashboard/assets/tokens.css +208 -0
  7. package/dashboard/build-kanban-data.mjs +279 -0
  8. package/dashboard/dashboard.css +753 -0
  9. package/dashboard/dashboard.html +121 -0
  10. package/dashboard/dashboard.js +610 -0
  11. package/dashboard/data/snapshot.json +883 -0
  12. package/dashboard/debate.html +134 -0
  13. package/dashboard/factory/build-snapshot.mjs +89 -0
  14. package/dashboard/factory/factory-app.js +1185 -0
  15. package/dashboard/factory/factory-core.js +541 -0
  16. package/dashboard/factory/snapshot.js +850 -0
  17. package/dashboard/factory.html +350 -0
  18. package/dashboard/kanban-data.json +671 -0
  19. package/dashboard/kanban-source.js +643 -0
  20. package/dashboard/kanban.check.mjs +454 -0
  21. package/dashboard/kanban.html +1257 -0
  22. package/dashboard/leadership.html +1008 -0
  23. package/dashboard/lib/debate-app.js +1149 -0
  24. package/dashboard/lib/debate-core.js +698 -0
  25. package/dashboard/lib/debate-data.js +163 -0
  26. package/dashboard/lib/debate-demo.js +110 -0
  27. package/dashboard/lib/debate.css +1155 -0
  28. package/dashboard/lib/leadership-model.js +946 -0
  29. package/dashboard/probe.mjs +35 -0
  30. package/dashboard/scripts/serve.mjs +122 -0
  31. package/dashboard/scripts/snapshot-data.mjs +93 -0
  32. package/dashboard/scripts/snapshot.mjs +28 -0
  33. package/dashboard/server.mjs +242 -0
  34. package/dashboard/shot.mjs +54 -0
  35. package/dashboard/shots/desktop-gates.png +0 -0
  36. package/dashboard/shots/desktop-light.png +0 -0
  37. package/dashboard/shots/desktop-real.png +0 -0
  38. package/dashboard/shots/mobile.png +0 -0
  39. package/dashboard/test/factory-core.test.mjs +244 -0
  40. package/dashboard/tests/debate-core.test.mjs +336 -0
  41. package/dashboard/tests/leadership-model.test.mjs +404 -0
  42. package/dist/cli.js +24 -0
  43. package/dist/cli.js.map +1 -1
  44. package/dist/core/dashboard.d.ts +33 -0
  45. package/dist/core/dashboard.d.ts.map +1 -0
  46. package/dist/core/dashboard.js +115 -0
  47. package/dist/core/dashboard.js.map +1 -0
  48. package/dist/core/dispatch.d.ts.map +1 -1
  49. package/dist/core/dispatch.js +11 -0
  50. package/dist/core/dispatch.js.map +1 -1
  51. package/dist/core/environment.d.ts +28 -0
  52. package/dist/core/environment.d.ts.map +1 -0
  53. package/dist/core/environment.js +80 -0
  54. package/dist/core/environment.js.map +1 -0
  55. package/dist/core/systemPrompt.d.ts.map +1 -1
  56. package/dist/core/systemPrompt.js +3 -0
  57. package/dist/core/systemPrompt.js.map +1 -1
  58. package/dist/tools/index.d.ts +9 -1
  59. package/dist/tools/index.d.ts.map +1 -1
  60. package/dist/tools/index.js +26 -22
  61. package/dist/tools/index.js.bak +972 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/v2.d.ts +5 -0
  64. package/dist/v2.d.ts.map +1 -1
  65. package/dist/v2.js +57 -5
  66. package/dist/v2.js.bak +517 -0
  67. package/dist/v2.js.map +1 -1
  68. package/docs/QUE-ES.md +1 -1
  69. package/package.json +4 -1
@@ -0,0 +1,1155 @@
1
+ /*
2
+ * debate.css — panel de debate (T-05).
3
+ * Tokens OKLCH, tema oscuro por defecto, contraste AA, sin dependencias.
4
+ */
5
+
6
+ :root {
7
+ --bg: oklch(0.19 0.02 265);
8
+ --bg-elev: oklch(0.235 0.02 265);
9
+ --bg-elev-2: oklch(0.28 0.022 265);
10
+ --bg-inset: oklch(0.165 0.018 265);
11
+ --text: oklch(0.955 0.008 265);
12
+ --text-soft: oklch(0.82 0.014 265);
13
+ --muted: oklch(0.7 0.02 265);
14
+ --line: oklch(0.36 0.024 265);
15
+ --line-soft: oklch(0.3 0.02 265);
16
+ --accent: oklch(0.78 0.12 195);
17
+ --accent-ink: oklch(0.2 0.03 195);
18
+ --focus: oklch(0.86 0.14 90);
19
+
20
+ --pending: oklch(0.82 0.14 82);
21
+ --accepted: oklch(0.8 0.16 152);
22
+ --partial: oklch(0.78 0.12 250);
23
+ --declined: oklch(0.74 0.18 28);
24
+ --completed: oklch(0.76 0.06 265);
25
+ --critical: oklch(0.72 0.2 25);
26
+
27
+ --radius: 14px;
28
+ --radius-sm: 10px;
29
+ --shadow: 0 1px 0 oklch(1 0 0 / 0.04), 0 12px 30px oklch(0.05 0.02 265 / 0.45);
30
+ --space: 12px;
31
+ --font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
32
+ --mono: ui-monospace, SFMono-Regular, "Cascadia Code", Consolas, "Liberation Mono", monospace;
33
+ }
34
+
35
+ [data-theme="light"] {
36
+ --bg: oklch(0.975 0.006 265);
37
+ --bg-elev: oklch(1 0 0);
38
+ --bg-elev-2: oklch(0.965 0.008 265);
39
+ --bg-inset: oklch(0.945 0.01 265);
40
+ --text: oklch(0.24 0.02 265);
41
+ --text-soft: oklch(0.38 0.02 265);
42
+ --muted: oklch(0.5 0.02 265);
43
+ --line: oklch(0.86 0.012 265);
44
+ --line-soft: oklch(0.9 0.01 265);
45
+ --accent: oklch(0.55 0.12 215);
46
+ --accent-ink: oklch(0.99 0 0);
47
+ --focus: oklch(0.6 0.16 70);
48
+
49
+ --pending: oklch(0.62 0.14 70);
50
+ --accepted: oklch(0.55 0.15 152);
51
+ --partial: oklch(0.55 0.14 255);
52
+ --declined: oklch(0.55 0.18 27);
53
+ --completed: oklch(0.5 0.02 265);
54
+ --critical: oklch(0.55 0.2 25);
55
+
56
+ --shadow: 0 1px 2px oklch(0.4 0.02 265 / 0.08), 0 8px 24px oklch(0.4 0.02 265 / 0.08);
57
+ }
58
+
59
+ * {
60
+ box-sizing: border-box;
61
+ }
62
+
63
+ [hidden] {
64
+ display: none !important;
65
+ }
66
+
67
+ html,
68
+ body {
69
+ margin: 0;
70
+ padding: 0;
71
+ }
72
+
73
+ body {
74
+ min-height: 100vh;
75
+ background: var(--bg);
76
+ color: var(--text);
77
+ font-family: var(--font);
78
+ font-size: 15px;
79
+ line-height: 1.5;
80
+ -webkit-font-smoothing: antialiased;
81
+ padding: 0 clamp(12px, 3vw, 40px) 48px;
82
+ max-width: 1180px;
83
+ margin-inline: auto;
84
+ }
85
+
86
+ h1,
87
+ h2,
88
+ h3,
89
+ h4 {
90
+ margin: 0;
91
+ line-height: 1.25;
92
+ font-weight: 650;
93
+ }
94
+
95
+ p {
96
+ margin: 0;
97
+ }
98
+
99
+ button,
100
+ input,
101
+ select {
102
+ font: inherit;
103
+ color: inherit;
104
+ }
105
+
106
+ button {
107
+ cursor: pointer;
108
+ border-radius: var(--radius-sm);
109
+ border: 1px solid var(--line);
110
+ background: var(--bg-elev-2);
111
+ padding: 6px 11px;
112
+ transition: background 120ms ease, border-color 120ms ease, transform 120ms ease;
113
+ }
114
+
115
+ button:hover {
116
+ background: var(--bg-elev);
117
+ border-color: var(--muted);
118
+ }
119
+
120
+ button:active {
121
+ transform: translateY(1px);
122
+ }
123
+
124
+ button:disabled {
125
+ opacity: 0.5;
126
+ cursor: not-allowed;
127
+ }
128
+
129
+ :focus-visible {
130
+ outline: 2px solid var(--focus);
131
+ outline-offset: 2px;
132
+ border-radius: 6px;
133
+ }
134
+
135
+ .ghost {
136
+ background: transparent;
137
+ }
138
+
139
+ .ghost:hover {
140
+ background: var(--bg-elev-2);
141
+ }
142
+
143
+ .icon {
144
+ min-width: 34px;
145
+ padding: 6px 8px;
146
+ font-size: 15px;
147
+ line-height: 1;
148
+ }
149
+
150
+ .muted {
151
+ color: var(--muted);
152
+ font-size: 12.5px;
153
+ }
154
+
155
+ .sr-only {
156
+ position: absolute;
157
+ width: 1px;
158
+ height: 1px;
159
+ padding: 0;
160
+ margin: -1px;
161
+ overflow: hidden;
162
+ clip: rect(0 0 0 0);
163
+ clip-path: inset(50%);
164
+ white-space: nowrap;
165
+ border: 0;
166
+ }
167
+
168
+ .skip-link {
169
+ position: absolute;
170
+ left: 12px;
171
+ top: -60px;
172
+ z-index: 10;
173
+ background: var(--accent);
174
+ color: var(--accent-ink);
175
+ padding: 8px 14px;
176
+ border-radius: 0 0 10px 10px;
177
+ text-decoration: none;
178
+ font-weight: 600;
179
+ transition: top 120ms ease;
180
+ }
181
+
182
+ .skip-link:focus {
183
+ top: 0;
184
+ }
185
+
186
+ /* ------------------------------------------------------------- topbar */
187
+
188
+ .topbar {
189
+ display: flex;
190
+ flex-wrap: wrap;
191
+ gap: var(--space);
192
+ align-items: center;
193
+ justify-content: space-between;
194
+ padding: 20px 0 14px;
195
+ border-bottom: 1px solid var(--line-soft);
196
+ }
197
+
198
+ .brand {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 12px;
202
+ }
203
+
204
+ .logo {
205
+ display: grid;
206
+ place-items: center;
207
+ width: 40px;
208
+ height: 40px;
209
+ border-radius: 12px;
210
+ background: var(--bg-elev-2);
211
+ border: 1px solid var(--line);
212
+ color: var(--accent);
213
+ font-size: 20px;
214
+ }
215
+
216
+ .brand-text h1 {
217
+ font-size: 20px;
218
+ letter-spacing: -0.01em;
219
+ }
220
+
221
+ .sub {
222
+ color: var(--muted);
223
+ font-size: 12.5px;
224
+ }
225
+
226
+ .topbar-tools {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: 8px;
230
+ flex-wrap: wrap;
231
+ }
232
+
233
+ .conn {
234
+ font-size: 12px;
235
+ font-weight: 600;
236
+ padding: 3px 9px;
237
+ border-radius: 999px;
238
+ border: 1px solid var(--line);
239
+ display: inline-flex;
240
+ align-items: center;
241
+ gap: 6px;
242
+ }
243
+
244
+ .conn::before {
245
+ content: "";
246
+ width: 7px;
247
+ height: 7px;
248
+ border-radius: 50%;
249
+ background: currentColor;
250
+ }
251
+
252
+ .conn-live {
253
+ color: var(--accepted);
254
+ background: color-mix(in oklab, var(--accepted) 12%, transparent);
255
+ }
256
+
257
+ .conn-demo {
258
+ color: var(--pending);
259
+ background: color-mix(in oklab, var(--pending) 12%, transparent);
260
+ }
261
+
262
+ .conn-files {
263
+ color: var(--partial);
264
+ background: color-mix(in oklab, var(--partial) 12%, transparent);
265
+ }
266
+
267
+ .conn-paused {
268
+ color: var(--muted);
269
+ }
270
+
271
+ .conn-error {
272
+ color: var(--declined);
273
+ background: color-mix(in oklab, var(--declined) 14%, transparent);
274
+ }
275
+
276
+ .conn.is-loading::before {
277
+ animation: pulse 1s ease-in-out infinite;
278
+ }
279
+
280
+ @keyframes pulse {
281
+ 50% {
282
+ opacity: 0.25;
283
+ }
284
+ }
285
+
286
+ /* ------------------------------------------------------------- banner */
287
+
288
+ .banner {
289
+ margin-top: 14px;
290
+ padding: 12px 14px;
291
+ border-radius: var(--radius-sm);
292
+ border: 1px solid var(--line);
293
+ background: var(--bg-elev);
294
+ display: flex;
295
+ flex-wrap: wrap;
296
+ gap: 10px;
297
+ align-items: center;
298
+ justify-content: space-between;
299
+ font-size: 13.5px;
300
+ }
301
+
302
+ .banner p {
303
+ flex: 1 1 320px;
304
+ }
305
+
306
+ .banner-info {
307
+ border-color: color-mix(in oklab, var(--partial) 45%, var(--line));
308
+ background: color-mix(in oklab, var(--partial) 8%, var(--bg-elev));
309
+ }
310
+
311
+ .banner-error {
312
+ border-color: color-mix(in oklab, var(--declined) 55%, var(--line));
313
+ background: color-mix(in oklab, var(--declined) 10%, var(--bg-elev));
314
+ }
315
+
316
+ .banner-actions {
317
+ display: flex;
318
+ gap: 8px;
319
+ flex-wrap: wrap;
320
+ }
321
+
322
+ /* -------------------------------------------------------------- stats */
323
+
324
+ .stats {
325
+ display: grid;
326
+ grid-template-columns: repeat(auto-fit, minmax(112px, 1fr));
327
+ gap: 10px;
328
+ margin-top: 16px;
329
+ }
330
+
331
+ .stat {
332
+ background: var(--bg-elev);
333
+ border: 1px solid var(--line-soft);
334
+ border-radius: var(--radius-sm);
335
+ padding: 10px 12px;
336
+ display: flex;
337
+ flex-direction: column;
338
+ gap: 2px;
339
+ }
340
+
341
+ .stat-label {
342
+ color: var(--muted);
343
+ font-size: 11.5px;
344
+ text-transform: uppercase;
345
+ letter-spacing: 0.06em;
346
+ }
347
+
348
+ .stat strong {
349
+ font-size: 22px;
350
+ font-variant-numeric: tabular-nums;
351
+ line-height: 1.1;
352
+ }
353
+
354
+ .stat-pending strong {
355
+ color: var(--pending);
356
+ }
357
+
358
+ .stat-progress strong {
359
+ color: var(--partial);
360
+ }
361
+
362
+ .stat-done strong {
363
+ color: var(--accepted);
364
+ }
365
+
366
+ .stat-declined strong {
367
+ color: var(--declined);
368
+ }
369
+
370
+ /* ------------------------------------------------------------ toolbar */
371
+
372
+ .toolbar {
373
+ display: flex;
374
+ flex-wrap: wrap;
375
+ gap: 8px;
376
+ align-items: center;
377
+ margin-top: 18px;
378
+ }
379
+
380
+ .search {
381
+ flex: 1 1 260px;
382
+ min-width: 180px;
383
+ }
384
+
385
+ .search input {
386
+ width: 100%;
387
+ padding: 8px 12px;
388
+ border-radius: var(--radius-sm);
389
+ border: 1px solid var(--line);
390
+ background: var(--bg-inset);
391
+ }
392
+
393
+ .search input::placeholder {
394
+ color: var(--muted);
395
+ }
396
+
397
+ select {
398
+ padding: 8px 10px;
399
+ border-radius: var(--radius-sm);
400
+ border: 1px solid var(--line);
401
+ background: var(--bg-inset);
402
+ max-width: 100%;
403
+ }
404
+
405
+ .spacer {
406
+ flex: 1 1 auto;
407
+ }
408
+
409
+ .count-label {
410
+ color: var(--muted);
411
+ font-size: 12.5px;
412
+ margin: 12px 0 8px;
413
+ }
414
+
415
+ /* -------------------------------------------------------------- hilos */
416
+
417
+ .threads {
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: 12px;
421
+ }
422
+
423
+ .thread {
424
+ background: var(--bg-elev);
425
+ border: 1px solid var(--line-soft);
426
+ border-left: 3px solid var(--line);
427
+ border-radius: var(--radius);
428
+ box-shadow: var(--shadow);
429
+ overflow: hidden;
430
+ }
431
+
432
+ .thread.status-pending {
433
+ border-left-color: var(--pending);
434
+ }
435
+
436
+ .thread.status-accepted {
437
+ border-left-color: var(--accepted);
438
+ }
439
+
440
+ .thread.status-partial {
441
+ border-left-color: var(--partial);
442
+ }
443
+
444
+ .thread.status-declined {
445
+ border-left-color: var(--declined);
446
+ }
447
+
448
+ .thread.status-completed {
449
+ border-left-color: var(--completed);
450
+ }
451
+
452
+ .thread-heading {
453
+ margin: 0;
454
+ font-size: inherit;
455
+ font-weight: inherit;
456
+ }
457
+
458
+ .thread-toggle {
459
+ width: 100%;
460
+ display: grid;
461
+ grid-template-columns: auto minmax(0, 1fr) auto;
462
+ gap: 12px;
463
+ align-items: center;
464
+ padding: 12px 14px;
465
+ background: transparent;
466
+ border: 0;
467
+ border-radius: 0;
468
+ text-align: left;
469
+ }
470
+
471
+ .thread-toggle:hover {
472
+ background: color-mix(in oklab, var(--bg-elev-2) 70%, transparent);
473
+ }
474
+
475
+ .thread-toggle:focus-visible {
476
+ outline-offset: -2px;
477
+ border-radius: var(--radius);
478
+ }
479
+
480
+ /* ------------------------------------------------------------ avatar */
481
+
482
+ .avatar {
483
+ --h: 210;
484
+ display: grid;
485
+ place-items: center;
486
+ width: 38px;
487
+ height: 38px;
488
+ flex: 0 0 auto;
489
+ border-radius: 12px;
490
+ font-size: 13px;
491
+ font-weight: 700;
492
+ letter-spacing: 0.02em;
493
+ background: hsl(var(--h) 55% 26%);
494
+ color: hsl(var(--h) 90% 90%);
495
+ border: 1px solid hsl(var(--h) 50% 40% / 0.6);
496
+ }
497
+
498
+ .avatar-sm {
499
+ width: 28px;
500
+ height: 28px;
501
+ border-radius: 9px;
502
+ font-size: 11px;
503
+ }
504
+
505
+ [data-theme="light"] .avatar {
506
+ background: hsl(var(--h) 70% 90%);
507
+ color: hsl(var(--h) 55% 25%);
508
+ border-color: hsl(var(--h) 45% 70%);
509
+ }
510
+
511
+ /* -------------------------------------------------------- thread head */
512
+
513
+ .thread-main {
514
+ display: flex;
515
+ flex-direction: column;
516
+ gap: 3px;
517
+ min-width: 0;
518
+ }
519
+
520
+ .thread-title {
521
+ display: flex;
522
+ flex-wrap: wrap;
523
+ align-items: center;
524
+ gap: 7px;
525
+ font-size: 14px;
526
+ }
527
+
528
+ .who {
529
+ font-weight: 650;
530
+ }
531
+
532
+ .sep {
533
+ color: var(--muted);
534
+ }
535
+
536
+ .subject {
537
+ font-family: var(--mono);
538
+ font-size: 12.5px;
539
+ color: var(--text-soft);
540
+ background: var(--bg-inset);
541
+ border: 1px solid var(--line-soft);
542
+ padding: 1px 6px;
543
+ border-radius: 6px;
544
+ }
545
+
546
+ .thread-need {
547
+ color: var(--text-soft);
548
+ font-size: 13.5px;
549
+ overflow: hidden;
550
+ display: -webkit-box;
551
+ -webkit-line-clamp: 1;
552
+ -webkit-box-orient: vertical;
553
+ }
554
+
555
+ .thread-card {
556
+ color: var(--muted);
557
+ font-size: 12px;
558
+ }
559
+
560
+ .thread-meta {
561
+ display: flex;
562
+ align-items: center;
563
+ gap: 10px;
564
+ flex-wrap: wrap;
565
+ justify-content: flex-end;
566
+ }
567
+
568
+ .reply-count {
569
+ font-size: 12.5px;
570
+ color: var(--text-soft);
571
+ font-variant-numeric: tabular-nums;
572
+ white-space: nowrap;
573
+ }
574
+
575
+ .chev {
576
+ width: 9px;
577
+ height: 9px;
578
+ border-right: 2px solid var(--muted);
579
+ border-bottom: 2px solid var(--muted);
580
+ transform: rotate(45deg);
581
+ transition: transform 160ms ease;
582
+ margin-left: 2px;
583
+ }
584
+
585
+ .thread-toggle[aria-expanded="true"] .chev {
586
+ transform: rotate(-135deg);
587
+ }
588
+
589
+ /* ------------------------------------------------------------- pills */
590
+
591
+ .pill {
592
+ font-size: 11.5px;
593
+ font-weight: 650;
594
+ padding: 2px 9px;
595
+ border-radius: 999px;
596
+ border: 1px solid currentColor;
597
+ white-space: nowrap;
598
+ }
599
+
600
+ .pill-pending {
601
+ color: var(--pending);
602
+ background: color-mix(in oklab, var(--pending) 12%, transparent);
603
+ }
604
+
605
+ .pill-accepted {
606
+ color: var(--accepted);
607
+ background: color-mix(in oklab, var(--accepted) 12%, transparent);
608
+ }
609
+
610
+ .pill-partial {
611
+ color: var(--partial);
612
+ background: color-mix(in oklab, var(--partial) 12%, transparent);
613
+ }
614
+
615
+ .pill-declined {
616
+ color: var(--declined);
617
+ background: color-mix(in oklab, var(--declined) 12%, transparent);
618
+ }
619
+
620
+ .pill-completed {
621
+ color: var(--completed);
622
+ background: color-mix(in oklab, var(--completed) 14%, transparent);
623
+ }
624
+
625
+ .tag {
626
+ font-size: 10.5px;
627
+ text-transform: uppercase;
628
+ letter-spacing: 0.05em;
629
+ padding: 1px 6px;
630
+ border-radius: 5px;
631
+ border: 1px solid var(--line);
632
+ color: var(--muted);
633
+ white-space: nowrap;
634
+ }
635
+
636
+ .tag-broadcast {
637
+ color: var(--accent);
638
+ border-color: color-mix(in oklab, var(--accent) 45%, var(--line));
639
+ }
640
+
641
+ .tag-critical {
642
+ color: var(--critical);
643
+ border-color: color-mix(in oklab, var(--critical) 55%, var(--line));
644
+ }
645
+
646
+ .tag-high {
647
+ color: var(--pending);
648
+ border-color: color-mix(in oklab, var(--pending) 50%, var(--line));
649
+ }
650
+
651
+ .tag-expired {
652
+ color: var(--declined);
653
+ border-color: color-mix(in oklab, var(--declined) 45%, var(--line));
654
+ }
655
+
656
+ .tag-reattached {
657
+ color: var(--partial);
658
+ border-color: color-mix(in oklab, var(--partial) 45%, var(--line));
659
+ }
660
+
661
+ /* -------------------------------------------------------------- steps */
662
+
663
+ .thread-body {
664
+ padding: 4px 14px 16px;
665
+ border-top: 1px solid var(--line-soft);
666
+ }
667
+
668
+ .steps {
669
+ list-style: none;
670
+ display: flex;
671
+ gap: 18px;
672
+ margin: 12px 0 14px;
673
+ padding: 0;
674
+ flex-wrap: wrap;
675
+ }
676
+
677
+ .step {
678
+ display: inline-flex;
679
+ align-items: center;
680
+ gap: 7px;
681
+ font-size: 12px;
682
+ color: var(--muted);
683
+ }
684
+
685
+ .step .dot {
686
+ width: 9px;
687
+ height: 9px;
688
+ border-radius: 50%;
689
+ border: 1.5px solid currentColor;
690
+ }
691
+
692
+ .step.is-done {
693
+ color: var(--accepted);
694
+ }
695
+
696
+ .step.is-done .dot {
697
+ background: currentColor;
698
+ }
699
+
700
+ .step.is-active {
701
+ color: var(--text);
702
+ }
703
+
704
+ .step.is-active .dot {
705
+ background: currentColor;
706
+ box-shadow: 0 0 0 4px color-mix(in oklab, currentColor 22%, transparent);
707
+ }
708
+
709
+ /* ------------------------------------------------------------ request */
710
+
711
+ .request {
712
+ background: var(--bg-inset);
713
+ border: 1px solid var(--line-soft);
714
+ border-radius: var(--radius-sm);
715
+ padding: 12px;
716
+ display: flex;
717
+ flex-direction: column;
718
+ gap: 8px;
719
+ }
720
+
721
+ .request-head {
722
+ display: flex;
723
+ align-items: center;
724
+ gap: 8px;
725
+ flex-wrap: wrap;
726
+ }
727
+
728
+ .bname {
729
+ font-weight: 600;
730
+ font-size: 13px;
731
+ }
732
+
733
+ .badge {
734
+ font-size: 10.5px;
735
+ text-transform: uppercase;
736
+ letter-spacing: 0.05em;
737
+ padding: 1px 6px;
738
+ border-radius: 5px;
739
+ border: 1px solid var(--line);
740
+ color: var(--text-soft);
741
+ }
742
+
743
+ .badge-request {
744
+ color: var(--accent);
745
+ border-color: color-mix(in oklab, var(--accent) 50%, var(--line));
746
+ }
747
+
748
+ .badge-help-accept {
749
+ color: var(--accepted);
750
+ border-color: color-mix(in oklab, var(--accepted) 50%, var(--line));
751
+ }
752
+
753
+ .badge-help-decline {
754
+ color: var(--declined);
755
+ border-color: color-mix(in oklab, var(--declined) 50%, var(--line));
756
+ }
757
+
758
+ .badge-help-partial {
759
+ color: var(--partial);
760
+ border-color: color-mix(in oklab, var(--partial) 50%, var(--line));
761
+ }
762
+
763
+ .badge-help-question,
764
+ .badge-question {
765
+ color: var(--pending);
766
+ border-color: color-mix(in oklab, var(--pending) 50%, var(--line));
767
+ }
768
+
769
+ .badge-status,
770
+ .badge-answer,
771
+ .badge-notice {
772
+ color: var(--completed);
773
+ border-color: var(--line);
774
+ }
775
+
776
+ .request-foot,
777
+ .bubble-foot {
778
+ display: flex;
779
+ flex-wrap: wrap;
780
+ gap: 10px;
781
+ align-items: center;
782
+ }
783
+
784
+ /* ------------------------------------------------------------- parts */
785
+
786
+ .part {
787
+ display: grid;
788
+ gap: 2px;
789
+ }
790
+
791
+ .part-label {
792
+ font-size: 10.5px;
793
+ text-transform: uppercase;
794
+ letter-spacing: 0.06em;
795
+ color: var(--muted);
796
+ }
797
+
798
+ .part-value {
799
+ white-space: pre-wrap;
800
+ overflow-wrap: anywhere;
801
+ font-size: 13.5px;
802
+ color: var(--text);
803
+ }
804
+
805
+ .part-value.is-long:not(.is-expanded) {
806
+ display: -webkit-box;
807
+ -webkit-line-clamp: 4;
808
+ -webkit-box-orient: vertical;
809
+ overflow: hidden;
810
+ }
811
+
812
+ .more {
813
+ align-self: start;
814
+ justify-self: start;
815
+ font-size: 11.5px;
816
+ padding: 2px 8px;
817
+ border-radius: 6px;
818
+ color: var(--accent);
819
+ border-color: color-mix(in oklab, var(--accent) 40%, var(--line));
820
+ background: transparent;
821
+ }
822
+
823
+ .json summary {
824
+ cursor: pointer;
825
+ font-size: 11.5px;
826
+ color: var(--muted);
827
+ }
828
+
829
+ .json pre {
830
+ margin: 6px 0 0;
831
+ padding: 10px;
832
+ background: var(--bg);
833
+ border: 1px solid var(--line-soft);
834
+ border-radius: 8px;
835
+ font-family: var(--mono);
836
+ font-size: 11.5px;
837
+ max-height: 260px;
838
+ overflow: auto;
839
+ white-space: pre-wrap;
840
+ overflow-wrap: anywhere;
841
+ }
842
+
843
+ /* ----------------------------------------------------------- burbujas */
844
+
845
+ .replies {
846
+ margin-top: 14px;
847
+ }
848
+
849
+ .replies-title {
850
+ font-size: 11.5px;
851
+ text-transform: uppercase;
852
+ letter-spacing: 0.06em;
853
+ color: var(--muted);
854
+ margin-bottom: 8px;
855
+ }
856
+
857
+ .bubbles {
858
+ list-style: none;
859
+ margin: 0;
860
+ padding: 0;
861
+ display: flex;
862
+ flex-direction: column;
863
+ gap: 10px;
864
+ }
865
+
866
+ .bubble {
867
+ display: grid;
868
+ grid-template-columns: auto minmax(0, 1fr);
869
+ gap: 10px;
870
+ padding: 10px 12px;
871
+ border-radius: var(--radius-sm);
872
+ background: var(--bg-elev-2);
873
+ border: 1px solid var(--line-soft);
874
+ border-left: 3px solid var(--line);
875
+ }
876
+
877
+ .bubble.kind-help-accept {
878
+ border-left-color: var(--accepted);
879
+ }
880
+
881
+ .bubble.kind-help-decline {
882
+ border-left-color: var(--declined);
883
+ }
884
+
885
+ .bubble.kind-help-partial {
886
+ border-left-color: var(--partial);
887
+ }
888
+
889
+ .bubble.kind-help-question,
890
+ .bubble.kind-question {
891
+ border-left-color: var(--pending);
892
+ }
893
+
894
+ .bubble.kind-status,
895
+ .bubble.kind-answer,
896
+ .bubble.kind-notice {
897
+ border-left-color: var(--completed);
898
+ }
899
+
900
+ .bubble-content {
901
+ display: flex;
902
+ flex-direction: column;
903
+ gap: 7px;
904
+ min-width: 0;
905
+ }
906
+
907
+ .bubble-head {
908
+ display: flex;
909
+ align-items: center;
910
+ gap: 8px;
911
+ flex-wrap: wrap;
912
+ }
913
+
914
+ .time {
915
+ font-variant-numeric: tabular-nums;
916
+ color: var(--muted);
917
+ font-size: 12px;
918
+ }
919
+
920
+ .empty-replies {
921
+ padding: 10px 0 2px;
922
+ }
923
+
924
+ /* ------------------------------------------------------------ vacío */
925
+
926
+ .empty-card {
927
+ border: 1px dashed var(--line);
928
+ border-radius: var(--radius);
929
+ padding: 26px 22px;
930
+ background: var(--bg-elev);
931
+ display: flex;
932
+ flex-direction: column;
933
+ gap: 10px;
934
+ }
935
+
936
+ .empty-card h2 {
937
+ font-size: 17px;
938
+ }
939
+
940
+ .empty-card p {
941
+ color: var(--text-soft);
942
+ font-size: 13.5px;
943
+ max-width: 70ch;
944
+ }
945
+
946
+ .empty-actions {
947
+ display: flex;
948
+ gap: 8px;
949
+ flex-wrap: wrap;
950
+ }
951
+
952
+ .empty-cmd {
953
+ margin: 4px 0 0;
954
+ padding: 10px 12px;
955
+ border-radius: 8px;
956
+ background: var(--bg-inset);
957
+ border: 1px solid var(--line-soft);
958
+ font-family: var(--mono);
959
+ font-size: 12px;
960
+ color: var(--text-soft);
961
+ white-space: pre-wrap;
962
+ }
963
+
964
+ /* ----------------------------------------------------------- footer */
965
+
966
+ .footer {
967
+ margin-top: 26px;
968
+ padding-top: 12px;
969
+ border-top: 1px solid var(--line-soft);
970
+ color: var(--muted);
971
+ font-size: 12px;
972
+ display: flex;
973
+ flex-direction: column;
974
+ gap: 4px;
975
+ }
976
+
977
+ .warn-inline {
978
+ color: var(--pending);
979
+ }
980
+
981
+ /* ------------------------------------------------------------- help */
982
+
983
+ .help {
984
+ max-width: 620px;
985
+ border: 1px solid var(--line);
986
+ border-radius: var(--radius);
987
+ background: var(--bg-elev);
988
+ color: var(--text);
989
+ padding: 20px 22px;
990
+ box-shadow: var(--shadow);
991
+ }
992
+
993
+ .help::backdrop {
994
+ background: oklch(0.1 0.01 265 / 0.6);
995
+ }
996
+
997
+ .help h2 {
998
+ font-size: 18px;
999
+ margin-bottom: 10px;
1000
+ }
1001
+
1002
+ .help h3 {
1003
+ font-size: 13px;
1004
+ text-transform: uppercase;
1005
+ letter-spacing: 0.06em;
1006
+ color: var(--muted);
1007
+ margin: 16px 0 8px;
1008
+ }
1009
+
1010
+ .help-list {
1011
+ margin: 0;
1012
+ padding-left: 18px;
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ gap: 8px;
1016
+ font-size: 13.5px;
1017
+ }
1018
+
1019
+ .help-list code {
1020
+ font-family: var(--mono);
1021
+ font-size: 12px;
1022
+ background: var(--bg-inset);
1023
+ padding: 1px 4px;
1024
+ border-radius: 4px;
1025
+ }
1026
+
1027
+ .keys {
1028
+ display: grid;
1029
+ grid-template-columns: max-content 1fr;
1030
+ gap: 6px 14px;
1031
+ margin: 0;
1032
+ font-size: 13px;
1033
+ }
1034
+
1035
+ .keys dt {
1036
+ display: flex;
1037
+ gap: 4px;
1038
+ }
1039
+
1040
+ .keys dd {
1041
+ margin: 0;
1042
+ color: var(--text-soft);
1043
+ }
1044
+
1045
+ kbd {
1046
+ font-family: var(--mono);
1047
+ font-size: 11.5px;
1048
+ padding: 1px 6px;
1049
+ border-radius: 5px;
1050
+ border: 1px solid var(--line);
1051
+ border-bottom-width: 2px;
1052
+ background: var(--bg-inset);
1053
+ }
1054
+
1055
+ .help-actions {
1056
+ margin-top: 18px;
1057
+ display: flex;
1058
+ gap: 8px;
1059
+ justify-content: flex-end;
1060
+ flex-wrap: wrap;
1061
+ }
1062
+
1063
+ /* --------------------------------------------------------- dropzone */
1064
+
1065
+ .dropzone {
1066
+ position: fixed;
1067
+ inset: 12px;
1068
+ z-index: 20;
1069
+ display: grid;
1070
+ place-items: center;
1071
+ border: 2px dashed var(--accent);
1072
+ border-radius: 18px;
1073
+ background: color-mix(in oklab, var(--bg) 82%, var(--accent));
1074
+ color: var(--text);
1075
+ font-weight: 600;
1076
+ text-align: center;
1077
+ padding: 20px;
1078
+ pointer-events: none;
1079
+ }
1080
+
1081
+ /* ------------------------------------------------------- responsive */
1082
+
1083
+ @media (max-width: 720px) {
1084
+ body {
1085
+ font-size: 14.5px;
1086
+ }
1087
+
1088
+ .topbar {
1089
+ padding-top: 14px;
1090
+ }
1091
+
1092
+ .thread-toggle {
1093
+ grid-template-columns: auto minmax(0, 1fr);
1094
+ gap: 10px 10px;
1095
+ }
1096
+
1097
+ .thread-meta {
1098
+ grid-column: 1 / -1;
1099
+ justify-content: flex-start;
1100
+ gap: 8px;
1101
+ }
1102
+
1103
+ .thread-need {
1104
+ -webkit-line-clamp: 2;
1105
+ }
1106
+
1107
+ .stats {
1108
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1109
+ }
1110
+
1111
+ .toolbar .spacer {
1112
+ flex-basis: 100%;
1113
+ }
1114
+
1115
+ .request,
1116
+ .bubble {
1117
+ padding: 10px;
1118
+ }
1119
+
1120
+ .bubble {
1121
+ grid-template-columns: auto minmax(0, 1fr);
1122
+ }
1123
+ }
1124
+
1125
+ @media (max-width: 460px) {
1126
+ .stats {
1127
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1128
+ }
1129
+
1130
+ .thread-toggle {
1131
+ padding: 10px;
1132
+ }
1133
+
1134
+ .subject {
1135
+ font-size: 11.5px;
1136
+ }
1137
+ }
1138
+
1139
+ @media (prefers-reduced-motion: reduce) {
1140
+ *,
1141
+ *::before,
1142
+ *::after {
1143
+ animation-duration: 0.001ms !important;
1144
+ animation-iteration-count: 1 !important;
1145
+ transition-duration: 0.001ms !important;
1146
+ }
1147
+ }
1148
+
1149
+ @media (prefers-contrast: more) {
1150
+ :root {
1151
+ --line: oklch(0.55 0.02 265);
1152
+ --line-soft: oklch(0.5 0.02 265);
1153
+ --muted: oklch(0.82 0.01 265);
1154
+ }
1155
+ }