trackops 1.0.0 → 1.0.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.
@@ -0,0 +1,953 @@
1
+ /* ═══════════════════════════════════════════════════════
2
+ PANELS — Sidebar, Topbar, Modals, Flash, Kanban
3
+ ═══════════════════════════════════════════════════════ */
4
+
5
+ /* ───────────────────────────────────
6
+ SIDEBAR
7
+ ─────────────────────────────────── */
8
+ .sidebar {
9
+ display: flex;
10
+ flex-direction: column;
11
+ height: 100%;
12
+ background: var(--surface-1);
13
+ border-right: 1px solid var(--border);
14
+ padding: var(--space-5) 0;
15
+ gap: 0;
16
+ }
17
+
18
+ /* Logo */
19
+ .sidebar-logo {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: var(--space-3);
23
+ padding: 0 var(--space-5) var(--space-5);
24
+ border-bottom: 1px solid var(--border);
25
+ margin-bottom: var(--space-4);
26
+ text-decoration: none;
27
+ color: var(--text-primary);
28
+ }
29
+ .sidebar-logo:hover { color: var(--text-primary); }
30
+
31
+ .sidebar-logo-icon {
32
+ width: 36px;
33
+ height: 36px;
34
+ background: linear-gradient(135deg, var(--accent), #4F46E5);
35
+ border-radius: var(--radius-md);
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ flex-shrink: 0;
40
+ box-shadow: var(--shadow-accent);
41
+ }
42
+ .sidebar-logo-name {
43
+ font-family: var(--font-heading);
44
+ font-weight: 800;
45
+ font-size: var(--text-lg);
46
+ letter-spacing: -0.03em;
47
+ color: var(--text-primary);
48
+ }
49
+
50
+ /* Secciones */
51
+ .sidebar-section {
52
+ padding: 0 var(--space-3);
53
+ flex: 1;
54
+ overflow-y: auto;
55
+ }
56
+ .sidebar-section + .sidebar-section {
57
+ border-top: 1px solid var(--border);
58
+ padding-top: var(--space-4);
59
+ margin-top: var(--space-4);
60
+ }
61
+
62
+ .sidebar-section-label {
63
+ font-size: var(--text-xs);
64
+ font-weight: 700;
65
+ letter-spacing: 0.12em;
66
+ text-transform: uppercase;
67
+ color: var(--text-muted);
68
+ padding: 0 var(--space-3) var(--space-2);
69
+ }
70
+
71
+ /* Nav items */
72
+ .sidebar-nav { display: flex; flex-direction: column; gap: var(--space-1); }
73
+
74
+ .nav-item {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: var(--space-3);
78
+ padding: 0.55rem var(--space-3);
79
+ border-radius: var(--radius-md);
80
+ font-size: var(--text-sm);
81
+ font-weight: 500;
82
+ color: var(--text-secondary);
83
+ cursor: pointer;
84
+ border: 1px solid transparent;
85
+ text-decoration: none;
86
+ transition:
87
+ background var(--duration-fast) var(--ease-out),
88
+ color var(--duration-fast) var(--ease-out),
89
+ border-color var(--duration-fast) var(--ease-out);
90
+ position: relative;
91
+ user-select: none;
92
+ min-height: 40px;
93
+ }
94
+ .nav-item:hover {
95
+ background: var(--surface-3);
96
+ color: var(--text-primary);
97
+ }
98
+ .nav-item.is-active {
99
+ background: var(--accent-light);
100
+ color: var(--text-accent);
101
+ border-color: var(--border-accent);
102
+ font-weight: 700;
103
+ }
104
+ .nav-item-icon {
105
+ flex-shrink: 0;
106
+ width: 18px;
107
+ height: 18px;
108
+ opacity: 0.7;
109
+ }
110
+ .nav-item.is-active .nav-item-icon { opacity: 1; }
111
+
112
+ .nav-item-label { flex: 1; min-width: 0; }
113
+ .nav-item-badge {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ min-width: 20px;
118
+ height: 20px;
119
+ padding: 0 5px;
120
+ font-size: 0.65rem;
121
+ font-weight: 800;
122
+ border-radius: var(--radius-full);
123
+ background: var(--accent);
124
+ color: white;
125
+ }
126
+ .nav-item-badge.danger { background: var(--danger); }
127
+
128
+ /* Sidebar footer */
129
+ .sidebar-footer {
130
+ padding: var(--space-4) var(--space-3) 0;
131
+ border-top: 1px solid var(--border);
132
+ margin-top: auto;
133
+ flex-shrink: 0;
134
+ display: flex;
135
+ flex-direction: column;
136
+ gap: var(--space-1);
137
+ }
138
+
139
+ /* ───────────────────────────────────
140
+ TOPBAR
141
+ ─────────────────────────────────── */
142
+ .topbar {
143
+ height: var(--topbar-height);
144
+ background: rgba(10, 15, 30, 0.85);
145
+ backdrop-filter: blur(20px);
146
+ -webkit-backdrop-filter: blur(20px);
147
+ border-bottom: 1px solid var(--border);
148
+ display: flex;
149
+ align-items: center;
150
+ padding: 0 var(--content-pad);
151
+ gap: var(--space-4);
152
+ }
153
+
154
+ .topbar-search {
155
+ flex: 1;
156
+ max-width: 380px;
157
+ }
158
+
159
+ .topbar-right {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: var(--space-3);
163
+ margin-left: auto;
164
+ }
165
+
166
+ .topbar-project-selector {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: var(--space-2);
170
+ }
171
+
172
+ .project-select-wrapper {
173
+ position: relative;
174
+ }
175
+ .project-select-wrapper select {
176
+ min-width: 220px;
177
+ background-color: var(--surface-2);
178
+ font-size: var(--text-sm);
179
+ height: 36px;
180
+ padding: 0 2.5rem 0 0.85rem;
181
+ }
182
+
183
+ .repo-badge {
184
+ display: flex;
185
+ align-items: center;
186
+ gap: var(--space-2);
187
+ padding: 0.3rem 0.75rem;
188
+ border-radius: var(--radius-full);
189
+ font-size: var(--text-xs);
190
+ font-weight: 600;
191
+ border: 1px solid transparent;
192
+ white-space: nowrap;
193
+ }
194
+ .repo-badge.clean {
195
+ background: var(--success-light);
196
+ border-color: rgba(16,185,129,0.2);
197
+ color: var(--success);
198
+ }
199
+ .repo-badge.dirty {
200
+ background: var(--warning-light);
201
+ border-color: rgba(245,158,11,0.2);
202
+ color: var(--warning);
203
+ }
204
+ .repo-badge-dot {
205
+ width: 6px;
206
+ height: 6px;
207
+ border-radius: 50%;
208
+ flex-shrink: 0;
209
+ }
210
+ .clean .repo-badge-dot { background: var(--success); animation: pulse 2s infinite; }
211
+ .dirty .repo-badge-dot { background: var(--warning); }
212
+
213
+ /* Hamburger (mobile) */
214
+ .topbar-hamburger {
215
+ display: none;
216
+ flex-direction: column;
217
+ gap: 5px;
218
+ padding: var(--space-2);
219
+ border-radius: var(--radius-sm);
220
+ cursor: pointer;
221
+ border: 1px solid var(--border);
222
+ background: var(--surface-2);
223
+ }
224
+ .topbar-hamburger span {
225
+ display: block;
226
+ width: 18px;
227
+ height: 2px;
228
+ background: var(--text-primary);
229
+ border-radius: 2px;
230
+ transition: transform var(--duration-base) var(--ease-out), opacity var(--duration-base);
231
+ }
232
+
233
+ @media (max-width: 1024px) {
234
+ .topbar-hamburger { display: flex; }
235
+ }
236
+
237
+ /* ───────────────────────────────────
238
+ TIME TRACKER WIDGET (en topbar)
239
+ ─────────────────────────────────── */
240
+ .topbar-timer {
241
+ display: flex;
242
+ align-items: center;
243
+ gap: var(--space-2);
244
+ padding: 0.3rem 0.85rem;
245
+ background: var(--surface-2);
246
+ border: 1px solid var(--border);
247
+ border-radius: var(--radius-full);
248
+ font-family: var(--font-mono);
249
+ font-size: var(--text-sm);
250
+ font-weight: 700;
251
+ color: var(--text-primary);
252
+ letter-spacing: 0.04em;
253
+ }
254
+ .topbar-timer.is-running {
255
+ border-color: var(--border-accent);
256
+ background: var(--accent-light);
257
+ color: var(--text-accent);
258
+ }
259
+ .topbar-timer-dot {
260
+ width: 6px;
261
+ height: 6px;
262
+ border-radius: 50%;
263
+ background: var(--text-muted);
264
+ flex-shrink: 0;
265
+ }
266
+ .topbar-timer.is-running .topbar-timer-dot {
267
+ background: var(--accent);
268
+ animation: pulse 1s infinite;
269
+ }
270
+
271
+ /* ───────────────────────────────────
272
+ PANEL SECTION (contenedores de vistas)
273
+ ─────────────────────────────────── */
274
+ .panel {
275
+ background: var(--surface-2);
276
+ border: 1px solid var(--border);
277
+ border-radius: var(--radius-xl);
278
+ overflow: hidden;
279
+ }
280
+
281
+ .panel-header {
282
+ display: flex;
283
+ align-items: center;
284
+ justify-content: space-between;
285
+ padding: var(--space-5) var(--space-5) var(--space-4);
286
+ border-bottom: 1px solid var(--border);
287
+ gap: var(--space-4);
288
+ }
289
+ .panel-header-left { display: flex; flex-direction: column; gap: var(--space-1); }
290
+ .panel-header-right { display: flex; align-items: center; gap: var(--space-2); flex-shrink: 0; }
291
+ .panel-title { font-size: var(--text-md); font-weight: 700; margin: 0; }
292
+ .panel-subtitle { font-size: var(--text-xs); color: var(--text-muted); }
293
+
294
+ .panel-body { padding: var(--space-5); }
295
+ .panel-footer {
296
+ padding: var(--space-4) var(--space-5);
297
+ border-top: 1px solid var(--border);
298
+ background: var(--surface-4);
299
+ }
300
+
301
+ /* ───────────────────────────────────
302
+ KANBAN BOARD
303
+ ─────────────────────────────────── */
304
+ .board-grid {
305
+ display: grid;
306
+ grid-auto-flow: column;
307
+ grid-auto-columns: minmax(260px, 1fr);
308
+ gap: var(--space-3);
309
+ overflow-x: auto;
310
+ padding-bottom: var(--space-4);
311
+ min-height: 500px;
312
+ align-items: start;
313
+ }
314
+
315
+ .board-column {
316
+ background: var(--surface-1);
317
+ border: 1px solid var(--border);
318
+ border-radius: var(--radius-lg);
319
+ padding: var(--space-3);
320
+ min-height: 400px;
321
+ transition: border-color var(--duration-fast), background var(--duration-fast);
322
+ }
323
+ .board-column.is-drop-target {
324
+ border-color: var(--border-accent);
325
+ background: rgba(99,102,241,0.04);
326
+ }
327
+
328
+ .board-column-header {
329
+ display: flex;
330
+ align-items: center;
331
+ justify-content: space-between;
332
+ margin-bottom: var(--space-3);
333
+ padding: 0 var(--space-1);
334
+ }
335
+ .board-column-title {
336
+ font-size: var(--text-sm);
337
+ font-weight: 700;
338
+ margin: 0;
339
+ display: flex;
340
+ align-items: center;
341
+ gap: var(--space-2);
342
+ }
343
+ .board-column-dot {
344
+ width: 8px; height: 8px;
345
+ border-radius: 50%;
346
+ flex-shrink: 0;
347
+ }
348
+ .col-pending .board-column-dot { background: var(--warning); }
349
+ .col-in_progress .board-column-dot { background: var(--info); }
350
+ .col-in_review .board-column-dot { background: var(--accent); }
351
+ .col-blocked .board-column-dot { background: var(--danger); }
352
+ .col-completed .board-column-dot { background: var(--success); }
353
+ .col-cancelled .board-column-dot { background: var(--text-muted); }
354
+
355
+ .board-column-count {
356
+ min-width: 24px;
357
+ height: 24px;
358
+ border-radius: var(--radius-full);
359
+ background: var(--surface-3);
360
+ font-size: var(--text-xs);
361
+ font-weight: 700;
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ padding: 0 var(--space-2);
366
+ }
367
+
368
+ .board-column-body { display: flex; flex-direction: column; gap: var(--space-2); }
369
+
370
+ /* ───────────────────────────────────
371
+ TERMINAL SURFACE
372
+ ─────────────────────────────────── */
373
+ .terminal-surface {
374
+ background: #060a14;
375
+ border: 1px solid rgba(255,255,255,0.05);
376
+ border-radius: var(--radius-lg);
377
+ overflow: hidden;
378
+ }
379
+ .terminal-header {
380
+ display: flex;
381
+ align-items: center;
382
+ justify-content: space-between;
383
+ padding: var(--space-2) var(--space-4);
384
+ background: rgba(255,255,255,0.03);
385
+ border-bottom: 1px solid rgba(255,255,255,0.04);
386
+ gap: var(--space-3);
387
+ }
388
+ .terminal-dots { display: flex; gap: var(--space-2); align-items: center; }
389
+ .terminal-dots span {
390
+ width: 10px; height: 10px;
391
+ border-radius: 50%;
392
+ }
393
+ .terminal-dots span:nth-child(1) { background: #EF4444; }
394
+ .terminal-dots span:nth-child(2) { background: #F59E0B; }
395
+ .terminal-dots span:nth-child(3) { background: #10B981; }
396
+ .terminal-title {
397
+ font-family: var(--font-mono);
398
+ font-size: var(--text-xs);
399
+ color: var(--text-muted);
400
+ flex: 1;
401
+ text-align: center;
402
+ }
403
+ .terminal-output {
404
+ margin: 0;
405
+ padding: var(--space-5);
406
+ font-family: var(--font-mono);
407
+ font-size: var(--text-xs);
408
+ line-height: 1.7;
409
+ color: #94D4BC;
410
+ min-height: 280px;
411
+ max-height: 460px;
412
+ overflow-y: auto;
413
+ white-space: pre-wrap;
414
+ word-break: break-all;
415
+ }
416
+
417
+ /* ───────────────────────────────────
418
+ FLASH / TOAST
419
+ ─────────────────────────────────── */
420
+ #flash-container {
421
+ position: fixed;
422
+ right: var(--space-6);
423
+ bottom: var(--space-6);
424
+ z-index: var(--z-toast);
425
+ display: flex;
426
+ flex-direction: column;
427
+ gap: var(--space-2);
428
+ pointer-events: none;
429
+ max-width: 380px;
430
+ width: 100%;
431
+ }
432
+
433
+ .flash {
434
+ padding: var(--space-4) var(--space-5);
435
+ border-radius: var(--radius-lg);
436
+ background: var(--surface-2);
437
+ border: 1px solid var(--border-strong);
438
+ box-shadow: var(--shadow-lg);
439
+ color: var(--text-primary);
440
+ font-size: var(--text-sm);
441
+ font-weight: 500;
442
+ display: flex;
443
+ align-items: center;
444
+ gap: var(--space-3);
445
+ pointer-events: all;
446
+ animation: slideInRight var(--duration-slow) var(--ease-out) both;
447
+ backdrop-filter: blur(20px);
448
+ }
449
+ .flash.flash-success { border-color: rgba(16,185,129,0.3); }
450
+ .flash.flash-error { background: rgba(239,68,68,0.15); border-color: rgba(239,68,68,0.3); }
451
+ .flash.flash-warning { border-color: rgba(245,158,11,0.3); }
452
+ .flash.flash-exit { animation: slideInRight var(--duration-base) var(--ease-in) reverse; }
453
+
454
+ /* ───────────────────────────────────
455
+ MODAL
456
+ ─────────────────────────────────── */
457
+ .modal-overlay {
458
+ position: fixed;
459
+ inset: 0;
460
+ background: rgba(0,0,0,0.7);
461
+ backdrop-filter: blur(8px);
462
+ z-index: var(--z-modal);
463
+ display: flex;
464
+ align-items: center;
465
+ justify-content: center;
466
+ padding: var(--space-6);
467
+ animation: fadeIn var(--duration-base) var(--ease-out);
468
+ }
469
+ .modal-overlay.is-hidden { display: none; }
470
+
471
+ .modal {
472
+ background: var(--surface-2);
473
+ border: 1px solid var(--border-strong);
474
+ border-radius: var(--radius-xl);
475
+ width: 100%;
476
+ max-width: 540px;
477
+ max-height: 90dvh;
478
+ overflow-y: auto;
479
+ box-shadow: var(--shadow-xl);
480
+ animation: fadeInUp var(--duration-slow) var(--ease-out);
481
+ }
482
+ .modal-header {
483
+ display: flex;
484
+ align-items: center;
485
+ justify-content: space-between;
486
+ padding: var(--space-5) var(--space-6);
487
+ border-bottom: 1px solid var(--border);
488
+ }
489
+ .modal-title { font-size: var(--text-md); font-weight: 700; margin: 0; }
490
+ .modal-body { padding: var(--space-6); }
491
+ .modal-footer {
492
+ padding: var(--space-4) var(--space-6);
493
+ border-top: 1px solid var(--border);
494
+ display: flex;
495
+ justify-content: flex-end;
496
+ gap: var(--space-3);
497
+ }
498
+ .modal-close {
499
+ width: 32px; height: 32px;
500
+ border-radius: var(--radius-sm);
501
+ display: flex; align-items: center; justify-content: center;
502
+ color: var(--text-muted);
503
+ background: var(--surface-3);
504
+ border: 1px solid var(--border);
505
+ cursor: pointer;
506
+ transition: background var(--duration-fast);
507
+ }
508
+ .modal-close:hover { background: var(--surface-4); color: var(--text-primary); }
509
+
510
+ /* ───────────────────────────────────
511
+ CONSOLE LOGS PANEL
512
+ ─────────────────────────────────── */
513
+ .console-panel {
514
+ position: fixed;
515
+ bottom: 0;
516
+ left: var(--sidebar-width);
517
+ right: 0;
518
+ z-index: var(--z-panel);
519
+ background: #060a14;
520
+ border-top: 1px solid var(--border);
521
+ transition: transform var(--duration-slow) var(--ease-out);
522
+ transform: translateY(100%);
523
+ }
524
+ .console-panel.is-open {
525
+ transform: translateY(0);
526
+ }
527
+ .console-panel-header {
528
+ display: flex;
529
+ align-items: center;
530
+ justify-content: space-between;
531
+ padding: var(--space-2) var(--space-4);
532
+ border-bottom: 1px solid rgba(255,255,255,0.04);
533
+ background: rgba(255,255,255,0.02);
534
+ }
535
+ .console-panel-title {
536
+ font-family: var(--font-mono);
537
+ font-size: var(--text-xs);
538
+ color: var(--text-muted);
539
+ display: flex;
540
+ align-items: center;
541
+ gap: var(--space-2);
542
+ }
543
+ .console-panel-actions {
544
+ display: flex;
545
+ gap: var(--space-2);
546
+ }
547
+ .console-logs {
548
+ overflow-y: auto;
549
+ max-height: 220px;
550
+ padding: var(--space-2) 0;
551
+ }
552
+ .console-log-entry {
553
+ display: grid;
554
+ grid-template-columns: auto auto 1fr;
555
+ gap: var(--space-3);
556
+ align-items: start;
557
+ padding: var(--space-1) var(--space-4);
558
+ font-family: var(--font-mono);
559
+ font-size: var(--text-xs);
560
+ line-height: 1.6;
561
+ border-bottom: 1px solid rgba(255,255,255,0.02);
562
+ }
563
+ .console-log-entry:hover { background: rgba(255,255,255,0.02); }
564
+ .console-log-time { color: var(--text-muted); white-space: nowrap; }
565
+ .log-level { font-weight: 700; white-space: nowrap; }
566
+ .log-error { color: var(--danger); }
567
+ .log-warn { color: var(--warning); }
568
+ .log-info { color: var(--info); }
569
+ .log-debug { color: var(--text-muted); }
570
+ .console-log-msg { color: var(--text-secondary); word-break: break-all; }
571
+
572
+ /* ───────────────────────────────────
573
+ ONBOARDING SPOTLIGHT (Tour)
574
+ ─────────────────────────────────── */
575
+ .onboarding-spotlight {
576
+ /* Los estilos inline de position, inset, box-shadow se inyectan por JS */
577
+ background: transparent;
578
+ z-index: var(--z-onboard);
579
+ pointer-events: none;
580
+ }
581
+ .onboarding-spotlight.is-hidden { display: none; }
582
+
583
+ .onboarding-ring {
584
+ box-sizing: border-box;
585
+ }
586
+
587
+ @keyframes ob-ring-pulse {
588
+ 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(99,102,241,0.7); opacity: 1; }
589
+ 70% { transform: scale(1); box-shadow: 0 0 0 10px rgba(99,102,241,0); opacity: 0; }
590
+ 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(99,102,241,0); opacity: 0; }
591
+ }
592
+
593
+ .onboarding-tooltip {
594
+ /* Los estilos inline de position y transform se inyectan por JS */
595
+ background: var(--surface-2);
596
+ border: 1px solid var(--border-accent);
597
+ border-radius: var(--radius-xl);
598
+ padding: var(--space-6);
599
+ box-shadow: var(--shadow-xl);
600
+ opacity: 0;
601
+ transition: opacity var(--duration-base) var(--ease-out);
602
+ pointer-events: all;
603
+ color: var(--text-primary);
604
+ }
605
+ .onboarding-tooltip.is-hidden { display: none; pointer-events: none; }
606
+ .ob-enter {
607
+ animation: ob-enter-anim var(--duration-base) var(--ease-out) forwards;
608
+ }
609
+ @keyframes ob-enter-anim {
610
+ from { opacity: 0; transform: translateY(8px) scale(0.98); }
611
+ to { opacity: 1; transform: translateY(0) scale(1); }
612
+ }
613
+
614
+ /* ── Flechas (Bocadillo) ── */
615
+ .onboarding-tooltip::after {
616
+ content: '';
617
+ position: absolute;
618
+ width: 0;
619
+ height: 0;
620
+ border-style: solid;
621
+ }
622
+ /* Flecha apuntando hacia arriba (cuando el tooltip está bottom) */
623
+ .onboarding-tooltip[data-pos="bottom"]::after {
624
+ top: -10px;
625
+ left: 50%;
626
+ margin-left: -10px;
627
+ border-width: 0 10px 10px 10px;
628
+ border-color: transparent transparent var(--surface-2) transparent;
629
+ }
630
+ /* Flecha apuntando hacia abajo (cuando el tooltip está top) */
631
+ .onboarding-tooltip[data-pos="top"]::after {
632
+ bottom: -10px;
633
+ left: 50%;
634
+ margin-left: -10px;
635
+ border-width: 10px 10px 0 10px;
636
+ border-color: var(--surface-2) transparent transparent transparent;
637
+ }
638
+ /* Flecha apuntando hacia la izquierda (cuando el tooltip está right) */
639
+ .onboarding-tooltip[data-pos="right"]::after {
640
+ left: -10px;
641
+ top: 50%;
642
+ margin-top: -10px;
643
+ border-width: 10px 10px 10px 0;
644
+ border-color: transparent var(--surface-2) transparent transparent;
645
+ }
646
+ /* Flecha apuntando hacia la derecha (cuando el tooltip está left) */
647
+ .onboarding-tooltip[data-pos="left"]::after {
648
+ right: -10px;
649
+ top: 50%;
650
+ margin-top: -10px;
651
+ border-width: 10px 0 10px 10px;
652
+ border-color: transparent transparent transparent var(--surface-2);
653
+ }
654
+
655
+ .ob-step-label {
656
+ font-size: var(--text-xs);
657
+ font-weight: 700;
658
+ color: var(--accent);
659
+ letter-spacing: 0.08em;
660
+ text-transform: uppercase;
661
+ margin-bottom: var(--space-3);
662
+ }
663
+ .ob-title {
664
+ font-size: var(--text-lg);
665
+ font-weight: 800;
666
+ margin-bottom: var(--space-2);
667
+ }
668
+ .ob-desc {
669
+ font-size: var(--text-sm);
670
+ color: var(--text-secondary);
671
+ line-height: 1.6;
672
+ margin-bottom: var(--space-5);
673
+ }
674
+ .ob-nav {
675
+ display: flex;
676
+ align-items: center;
677
+ justify-content: space-between;
678
+ flex-wrap: wrap;
679
+ gap: var(--space-4);
680
+ }
681
+ .ob-dots {
682
+ display: flex;
683
+ gap: var(--space-2);
684
+ flex-wrap: wrap;
685
+ }
686
+ .ob-dot {
687
+ width: 6px; height: 6px;
688
+ border-radius: 50%;
689
+ background: var(--border-strong);
690
+ transition: background var(--duration-base);
691
+ }
692
+ .ob-dot.is-active {
693
+ background: var(--accent);
694
+ width: 18px;
695
+ border-radius: var(--radius-full);
696
+ }
697
+ .ob-actions {
698
+ display: flex;
699
+ gap: var(--space-2);
700
+ flex-wrap: wrap;
701
+ }
702
+
703
+
704
+ /* ───────────────────────────────────
705
+ TIME TRACKER (widget grande)
706
+ ─────────────────────────────────── */
707
+ .time-tracker-card {
708
+ background: linear-gradient(135deg, var(--navy-90) 0%, var(--surface-1) 100%);
709
+ border: 1px solid var(--border-accent);
710
+ border-radius: var(--radius-xl);
711
+ padding: var(--space-5);
712
+ position: relative;
713
+ overflow: hidden;
714
+ }
715
+ .time-tracker-card::before {
716
+ content: '';
717
+ position: absolute;
718
+ bottom: -40px; right: -40px;
719
+ width: 160px; height: 160px;
720
+ background: radial-gradient(circle, var(--accent-light) 0%, transparent 70%);
721
+ border-radius: 50%;
722
+ }
723
+
724
+ .timer-display {
725
+ font-family: var(--font-mono);
726
+ font-size: 2.8rem;
727
+ font-weight: 700;
728
+ letter-spacing: 0.04em;
729
+ color: var(--text-primary);
730
+ line-height: 1;
731
+ margin: var(--space-4) 0;
732
+ text-align: center;
733
+ }
734
+ .timer-display.is-running { color: var(--accent-hover); }
735
+
736
+ .timer-task-name {
737
+ font-size: var(--text-xs);
738
+ font-weight: 600;
739
+ color: var(--text-secondary);
740
+ text-align: center;
741
+ margin-bottom: var(--space-4);
742
+ overflow: hidden;
743
+ text-overflow: ellipsis;
744
+ white-space: nowrap;
745
+ }
746
+
747
+ .timer-controls {
748
+ display: flex;
749
+ align-items: center;
750
+ justify-content: center;
751
+ gap: var(--space-3);
752
+ }
753
+ .timer-btn {
754
+ width: 44px; height: 44px;
755
+ border-radius: 50%;
756
+ display: flex; align-items: center; justify-content: center;
757
+ border: 2px solid transparent;
758
+ cursor: pointer;
759
+ transition:
760
+ background var(--duration-base) var(--ease-out),
761
+ transform var(--duration-fast) var(--ease-out),
762
+ border-color var(--duration-base);
763
+ }
764
+ .timer-btn:active { transform: scale(0.9); }
765
+ .timer-btn-play {
766
+ background: var(--accent);
767
+ color: white;
768
+ box-shadow: var(--shadow-accent);
769
+ width: 54px; height: 54px;
770
+ }
771
+ .timer-btn-play:hover { background: var(--accent-hover); transform: scale(1.05); }
772
+ .timer-btn-pause {
773
+ background: var(--warning-light);
774
+ border-color: rgba(245,158,11,0.2);
775
+ color: var(--warning);
776
+ }
777
+ .timer-btn-stop {
778
+ background: var(--danger-light);
779
+ border-color: rgba(239,68,68,0.2);
780
+ color: var(--danger);
781
+ }
782
+
783
+ .timer-total {
784
+ text-align: center;
785
+ font-size: var(--text-xs);
786
+ color: var(--text-muted);
787
+ margin-top: var(--space-3);
788
+ }
789
+
790
+ /* ───────────────────────────────────
791
+ PROGRESS DONUT (SVG)
792
+ ─────────────────────────────────── */
793
+ .donut-wrapper {
794
+ display: flex;
795
+ flex-direction: column;
796
+ align-items: center;
797
+ gap: var(--space-3);
798
+ position: relative;
799
+ }
800
+ .donut-label {
801
+ position: absolute;
802
+ top: 50%;
803
+ left: 50%;
804
+ transform: translate(-50%, -50%);
805
+ text-align: center;
806
+ }
807
+ .donut-percent {
808
+ font-family: var(--font-heading);
809
+ font-size: var(--text-2xl);
810
+ font-weight: 800;
811
+ color: var(--text-primary);
812
+ display: block;
813
+ line-height: 1;
814
+ }
815
+ .donut-sub {
816
+ font-size: var(--text-xs);
817
+ color: var(--text-muted);
818
+ }
819
+ .donut-legend {
820
+ display: flex;
821
+ gap: var(--space-5);
822
+ flex-wrap: wrap;
823
+ justify-content: center;
824
+ }
825
+ .donut-legend-item {
826
+ display: flex;
827
+ align-items: center;
828
+ gap: var(--space-2);
829
+ font-size: var(--text-xs);
830
+ color: var(--text-secondary);
831
+ }
832
+ .donut-legend-dot {
833
+ width: 8px; height: 8px;
834
+ border-radius: 50%;
835
+ flex-shrink: 0;
836
+ }
837
+
838
+ /* ───────────────────────────────────
839
+ SESSION PILLS (consola)
840
+ ─────────────────────────────────── */
841
+ .session-pill {
842
+ display: flex;
843
+ align-items: center;
844
+ justify-content: space-between;
845
+ gap: var(--space-3);
846
+ padding: var(--space-2) var(--space-4);
847
+ background: var(--surface-3);
848
+ border: 1px solid var(--border);
849
+ border-radius: var(--radius-md);
850
+ font-size: var(--text-xs);
851
+ font-family: var(--font-mono);
852
+ cursor: pointer;
853
+ transition: border-color var(--duration-fast), background var(--duration-fast);
854
+ }
855
+ .session-pill:hover { border-color: var(--border-strong); }
856
+ .session-pill.is-selected {
857
+ border-color: var(--border-accent);
858
+ background: var(--accent-light);
859
+ }
860
+ .session-pill-cmd {
861
+ flex: 1;
862
+ min-width: 0;
863
+ overflow: hidden;
864
+ text-overflow: ellipsis;
865
+ white-space: nowrap;
866
+ color: var(--text-secondary);
867
+ }
868
+ .session-pill-status { flex-shrink: 0; }
869
+
870
+ /* ───────────────────────────────────
871
+ ACTIVITY TIMELINE
872
+ ─────────────────────────────────── */
873
+ .activity-item {
874
+ display: grid;
875
+ grid-template-columns: 36px 1fr;
876
+ gap: var(--space-3);
877
+ padding: var(--space-3) 0;
878
+ border-bottom: 1px solid var(--border);
879
+ align-items: start;
880
+ }
881
+ .activity-item:last-child { border-bottom: none; }
882
+ .activity-icon {
883
+ width: 36px; height: 36px;
884
+ border-radius: var(--radius-md);
885
+ display: flex; align-items: center; justify-content: center;
886
+ background: var(--surface-3);
887
+ border: 1px solid var(--border);
888
+ flex-shrink: 0;
889
+ }
890
+ .activity-content { min-width: 0; }
891
+ .activity-action { font-size: var(--text-sm); font-weight: 600; color: var(--text-primary); }
892
+ .activity-task { font-size: var(--text-xs); color: var(--text-secondary); margin-top: var(--space-1); }
893
+ .activity-time { font-size: var(--text-xs); color: var(--text-muted); font-family: var(--font-mono); }
894
+
895
+ /* ───────────────────────────────────
896
+ DECISION / FINDING ITEMS
897
+ ─────────────────────────────────── */
898
+ .finding-item {
899
+ padding: var(--space-4);
900
+ border-radius: var(--radius-md);
901
+ background: var(--surface-3);
902
+ border: 1px solid var(--border);
903
+ border-left: 3px solid var(--warning);
904
+ }
905
+ .finding-item.severity-critical { border-left-color: var(--danger); }
906
+ .finding-item.severity-low { border-left-color: var(--info); }
907
+
908
+ .decision-item {
909
+ padding: var(--space-4);
910
+ border-radius: var(--radius-md);
911
+ background: var(--surface-3);
912
+ border: 1px solid var(--border);
913
+ }
914
+
915
+ /* ───────────────────────────────────
916
+ PROJECT ROW (portfolio)
917
+ ─────────────────────────────────── */
918
+ .project-row {
919
+ display: flex;
920
+ align-items: center;
921
+ justify-content: space-between;
922
+ gap: var(--space-4);
923
+ padding: var(--space-3) var(--space-4);
924
+ border-radius: var(--radius-md);
925
+ background: var(--surface-3);
926
+ border: 1px solid var(--border);
927
+ transition: border-color var(--duration-fast), background var(--duration-fast);
928
+ }
929
+ .project-row:hover { border-color: var(--border-strong); }
930
+ .project-row.is-active {
931
+ border-color: var(--border-accent);
932
+ background: var(--accent-light);
933
+ }
934
+ .project-row-info { min-width: 0; flex: 1; }
935
+ .project-name { font-size: var(--text-sm); font-weight: 700; color: var(--text-primary); }
936
+ .project-path {
937
+ font-size: var(--text-xs);
938
+ font-family: var(--font-mono);
939
+ color: var(--text-muted);
940
+ overflow: hidden;
941
+ text-overflow: ellipsis;
942
+ white-space: nowrap;
943
+ }
944
+ .project-row-actions { display: flex; align-items: center; gap: var(--space-2); flex-shrink: 0; }
945
+
946
+ /* ───────────────────────────────────
947
+ COMMAND PRESET STRIP
948
+ ─────────────────────────────────── */
949
+ .preset-strip {
950
+ display: flex;
951
+ gap: var(--space-2);
952
+ flex-wrap: wrap;
953
+ }