@ikenga/pkg-tasks 0.2.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.
package/dist/tasks.css ADDED
@@ -0,0 +1,1046 @@
1
+ /* Tasks screen — Ikenga Rung 3 / Batch 3 (08-tasks.html)
2
+ * Reuses tokens from src/lib/ikenga/tokens.css. No new tokens.
3
+ */
4
+
5
+ /* === Frame ================================================== */
6
+ .tk-frame {
7
+ border: 1px solid var(--border);
8
+ border-radius: var(--radius-lg);
9
+ background: var(--bg-surface);
10
+ overflow: hidden;
11
+ box-shadow: var(--shadow-2);
12
+ display: flex;
13
+ flex-direction: column;
14
+ min-height: 0;
15
+ }
16
+ .tk-frame-head {
17
+ display: flex;
18
+ align-items: flex-start;
19
+ justify-content: space-between;
20
+ gap: var(--space-4);
21
+ padding: var(--space-4) var(--space-5);
22
+ border-bottom: 1px solid var(--border-soft);
23
+ background: linear-gradient(180deg, var(--tint-bg-active, var(--bg-surface)) 0%, var(--bg-surface) 100%);
24
+ }
25
+ .tk-frame-title-wrap { display: flex; align-items: center; gap: var(--space-2); }
26
+ .tk-frame-title-mark { width: 18px; height: 18px; color: var(--tint-fg-active, var(--primary)); }
27
+ .tk-frame-title {
28
+ font-family: var(--font-display);
29
+ font-weight: 500;
30
+ font-size: var(--text-h3);
31
+ margin: 0;
32
+ color: var(--fg);
33
+ }
34
+ .tk-frame-sub {
35
+ margin-top: 2px;
36
+ font-size: var(--text-caption);
37
+ color: var(--fg-muted);
38
+ }
39
+ .tk-frame-count {
40
+ font-family: var(--font-mono);
41
+ font-size: 12px;
42
+ color: var(--fg-muted);
43
+ font-weight: 400;
44
+ margin-left: 6px;
45
+ }
46
+
47
+ /* === Filter bar ============================================= */
48
+ .tk-filterbar {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ align-items: center;
52
+ gap: var(--space-2);
53
+ padding: var(--space-3) var(--space-5);
54
+ border-bottom: 1px solid var(--border-soft);
55
+ background: var(--bg-sunken);
56
+ }
57
+ .tk-filterbar .input-search-wrap { position: relative; display: inline-flex; }
58
+ .tk-filterbar .input-search-wrap svg {
59
+ position: absolute;
60
+ left: 8px;
61
+ top: 50%;
62
+ transform: translateY(-50%);
63
+ width: 13px;
64
+ height: 13px;
65
+ color: var(--fg-faint);
66
+ }
67
+ .tk-filterbar input[type='text'] {
68
+ width: 280px;
69
+ height: 28px;
70
+ padding: 0 8px 0 28px;
71
+ background: var(--bg-base);
72
+ border: 1px solid var(--border-soft);
73
+ border-radius: var(--radius-sm);
74
+ color: var(--fg);
75
+ font-family: inherit;
76
+ font-size: 11.5px;
77
+ }
78
+ .tk-filterbar select {
79
+ height: 28px;
80
+ font-size: 11.5px;
81
+ padding: 0 var(--space-2);
82
+ background: var(--bg-base);
83
+ border: 1px solid var(--border-soft);
84
+ border-radius: var(--radius-sm);
85
+ color: var(--fg);
86
+ font-family: inherit;
87
+ }
88
+ .tk-filterbar .label {
89
+ font-family: var(--font-mono);
90
+ font-size: 10.5px;
91
+ color: var(--fg-faint);
92
+ letter-spacing: 0.06em;
93
+ text-transform: uppercase;
94
+ }
95
+ .tk-filterbar .spacer { flex: 1; }
96
+ .tk-toggle {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 6px;
100
+ height: 28px;
101
+ padding: 0 10px;
102
+ background: var(--bg-base);
103
+ border: 1px solid var(--border-soft);
104
+ border-radius: var(--radius-sm);
105
+ color: var(--fg-muted);
106
+ font-family: inherit;
107
+ font-size: 11px;
108
+ cursor: pointer;
109
+ }
110
+ .tk-toggle:hover { color: var(--fg); border-color: var(--fg-faint); }
111
+ .tk-toggle.is-on {
112
+ color: var(--live);
113
+ background: var(--live-soft);
114
+ border-color: color-mix(in srgb, var(--live) 30%, var(--border));
115
+ }
116
+ .tk-toggle .checkbox {
117
+ width: 11px;
118
+ height: 11px;
119
+ border: 1px solid currentColor;
120
+ border-radius: 2px;
121
+ display: inline-grid;
122
+ place-items: center;
123
+ flex-shrink: 0;
124
+ }
125
+ .tk-toggle.is-on .checkbox::after {
126
+ content: '✓';
127
+ font-size: 9px;
128
+ line-height: 1;
129
+ color: currentColor;
130
+ }
131
+
132
+ /* === Master/detail split ==================================== */
133
+ .tk-split {
134
+ --list-w: 360px;
135
+ display: grid;
136
+ grid-template-columns: minmax(280px, var(--list-w)) 4px minmax(420px, 1fr);
137
+ /* Bind the single row to the split's own height. Without this the implicit
138
+ * row is `auto` (content-sized), so a tall list/detail grows the row past the
139
+ * split and gets clipped by overflow:hidden — neither pane scrolls. */
140
+ grid-template-rows: minmax(0, 1fr);
141
+ flex: 1;
142
+ min-height: 0;
143
+ overflow: hidden;
144
+ }
145
+ .tk-list {
146
+ overflow-y: auto;
147
+ /* Grid items default to min-height:auto (won't shrink below content), which
148
+ * defeats overflow:auto. Allow shrink so the list scrolls within its track. */
149
+ min-height: 0;
150
+ background: var(--bg-surface);
151
+ }
152
+ .tk-divider {
153
+ background: var(--border-soft);
154
+ cursor: col-resize;
155
+ }
156
+ .tk-divider:hover { background: var(--tint-fg-active, var(--primary)); }
157
+ .tk-detail {
158
+ background: var(--bg-base);
159
+ overflow-y: auto;
160
+ min-height: 0;
161
+ display: flex;
162
+ flex-direction: column;
163
+ }
164
+
165
+ /* === Group dividers ========================================= */
166
+ .tk-group-head {
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: space-between;
170
+ padding: 6px var(--space-4) 6px var(--space-3);
171
+ background: var(--bg-sunken);
172
+ border-bottom: 1px solid var(--border-soft);
173
+ border-top: 1px solid var(--border-soft);
174
+ font-family: var(--font-mono);
175
+ font-size: 9.5px;
176
+ color: var(--fg-faint);
177
+ letter-spacing: 0.1em;
178
+ text-transform: uppercase;
179
+ position: sticky;
180
+ top: 0;
181
+ z-index: 4;
182
+ cursor: pointer;
183
+ user-select: none;
184
+ }
185
+ .tk-group-head:first-child { border-top: 0; }
186
+ .tk-group-head .ct {
187
+ color: var(--fg-muted);
188
+ font-variant-numeric: tabular-nums;
189
+ }
190
+ .tk-group-head.is-overdue { color: var(--danger); }
191
+ .tk-group-head.is-overdue .ct { color: var(--danger); }
192
+ .tk-group-head.is-autoclosed { color: var(--live); }
193
+ .tk-group-head.is-autoclosed .ct { color: var(--live); }
194
+ .tk-group-head.is-collapsed { background: var(--bg-base); }
195
+ .tk-group-head .chev {
196
+ width: 10px;
197
+ height: 10px;
198
+ color: var(--fg-faint);
199
+ transition: transform var(--motion-fast) var(--ease-calm);
200
+ }
201
+ .tk-group-head.is-collapsed .chev { transform: rotate(-90deg); }
202
+ .tk-group-label {
203
+ display: inline-flex;
204
+ align-items: center;
205
+ gap: 6px;
206
+ }
207
+
208
+ /* === Task row =============================================== */
209
+ .tk-row {
210
+ display: grid;
211
+ grid-template-columns: 14px 1fr auto;
212
+ gap: var(--space-3);
213
+ padding: var(--space-3) var(--space-3) var(--space-3) var(--space-4);
214
+ border-bottom: 1px solid var(--border-soft);
215
+ cursor: pointer;
216
+ position: relative;
217
+ background: transparent;
218
+ text-align: left;
219
+ width: 100%;
220
+ border-left: 0;
221
+ border-right: 0;
222
+ border-top: 0;
223
+ font: inherit;
224
+ color: inherit;
225
+ transition: background var(--motion-fast) var(--ease-calm);
226
+ }
227
+ .tk-row:hover { background: var(--bg-raised); }
228
+ .tk-row.is-on { background: var(--bg-raised); }
229
+ .tk-row.is-on::before {
230
+ content: '';
231
+ position: absolute;
232
+ left: 0;
233
+ top: 8px;
234
+ bottom: 8px;
235
+ width: 2px;
236
+ border-radius: 2px;
237
+ background: var(--tint-fg-active, var(--primary));
238
+ }
239
+ .tk-row .pri-dot {
240
+ width: 8px;
241
+ height: 8px;
242
+ border-radius: 50%;
243
+ margin-top: 5px;
244
+ background: var(--fg-faint);
245
+ flex-shrink: 0;
246
+ }
247
+ .tk-row .pri-dot.is-critical {
248
+ background: var(--danger);
249
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--danger) 20%, transparent);
250
+ }
251
+ .tk-row .pri-dot.is-high { background: var(--achievement); }
252
+ .tk-row .pri-dot.is-medium { background: var(--systemic); }
253
+ .tk-row .pri-dot.is-low { background: var(--fg-faint); }
254
+ .tk-row .body {
255
+ min-width: 0;
256
+ display: flex;
257
+ flex-direction: column;
258
+ gap: 4px;
259
+ }
260
+ .tk-row .title {
261
+ font-size: var(--text-body-sm);
262
+ color: var(--fg);
263
+ font-weight: 500;
264
+ line-height: 1.35;
265
+ overflow: hidden;
266
+ text-overflow: ellipsis;
267
+ display: -webkit-box;
268
+ -webkit-line-clamp: 2;
269
+ -webkit-box-orient: vertical;
270
+ }
271
+ .tk-row.is-completed .title {
272
+ color: var(--fg-muted);
273
+ text-decoration: line-through;
274
+ text-decoration-thickness: 1px;
275
+ }
276
+ .tk-row .meta {
277
+ display: flex;
278
+ flex-wrap: wrap;
279
+ align-items: center;
280
+ gap: 6px;
281
+ font-family: var(--font-mono);
282
+ font-size: 9.5px;
283
+ color: var(--fg-faint);
284
+ letter-spacing: 0.04em;
285
+ }
286
+ .tk-row .meta .cat {
287
+ background: var(--bg-base);
288
+ border: 1px solid var(--border-soft);
289
+ color: var(--fg-muted);
290
+ padding: 1px 5px;
291
+ border-radius: var(--radius-xs);
292
+ text-transform: lowercase;
293
+ }
294
+ .tk-row .right {
295
+ display: flex;
296
+ flex-direction: column;
297
+ align-items: flex-end;
298
+ gap: 4px;
299
+ flex-shrink: 0;
300
+ }
301
+ .tk-row .due {
302
+ font-family: var(--font-mono);
303
+ font-size: 10px;
304
+ color: var(--fg-muted);
305
+ letter-spacing: 0.04em;
306
+ white-space: nowrap;
307
+ }
308
+ .tk-row .due.is-overdue { color: var(--danger); font-weight: 500; }
309
+ .tk-row .due.is-today { color: var(--achievement); }
310
+
311
+ /* === Status badge =========================================== */
312
+ .tk-badge {
313
+ display: inline-flex;
314
+ align-items: center;
315
+ gap: 4px;
316
+ font-family: var(--font-mono);
317
+ font-size: 9.5px;
318
+ letter-spacing: 0.08em;
319
+ text-transform: uppercase;
320
+ padding: 2px 6px;
321
+ border-radius: var(--radius-xs);
322
+ border: 1px solid var(--border-soft);
323
+ color: var(--fg-muted);
324
+ background: var(--bg-base);
325
+ white-space: nowrap;
326
+ }
327
+ .tk-badge.is-pending { color: var(--fg-muted); }
328
+ .tk-badge.is-in_progress {
329
+ color: var(--live);
330
+ background: var(--live-soft);
331
+ border-color: color-mix(in srgb, var(--live) 30%, var(--border-soft));
332
+ }
333
+ .tk-badge.is-blocked {
334
+ color: var(--danger);
335
+ background: color-mix(in srgb, var(--danger) 12%, transparent);
336
+ border-color: color-mix(in srgb, var(--danger) 30%, var(--border-soft));
337
+ }
338
+ .tk-badge.is-completed {
339
+ color: var(--live);
340
+ background: var(--live-soft);
341
+ border-color: color-mix(in srgb, var(--live) 30%, var(--border-soft));
342
+ }
343
+ .tk-badge.is-cancelled { color: var(--fg-faint); }
344
+ .tk-badge .dot {
345
+ width: 5px;
346
+ height: 5px;
347
+ border-radius: 50%;
348
+ background: currentColor;
349
+ }
350
+
351
+ /* === Auto-close badge ======================================= */
352
+ .tk-autoclose {
353
+ display: inline-flex;
354
+ align-items: center;
355
+ gap: 4px;
356
+ font-family: var(--font-mono);
357
+ font-size: 9px;
358
+ letter-spacing: 0.06em;
359
+ color: var(--live);
360
+ background: var(--live-soft);
361
+ border: 1px solid color-mix(in srgb, var(--live) 25%, var(--border-soft));
362
+ padding: 1px 5px;
363
+ border-radius: var(--radius-xs);
364
+ white-space: nowrap;
365
+ }
366
+ .tk-autoclose svg { width: 9px; height: 9px; }
367
+
368
+ /* === Assignee chips ========================================= */
369
+ .tk-assignee {
370
+ display: inline-flex;
371
+ align-items: center;
372
+ gap: 4px;
373
+ font-family: var(--font-mono);
374
+ font-size: 9.5px;
375
+ letter-spacing: 0.04em;
376
+ padding: 1px 5px;
377
+ border-radius: var(--radius-xs);
378
+ border: 1px solid var(--border-soft);
379
+ background: var(--bg-base);
380
+ color: var(--fg-muted);
381
+ white-space: nowrap;
382
+ }
383
+ .tk-assignee.is-agent {
384
+ color: var(--agent);
385
+ background: var(--agent-soft);
386
+ border-color: color-mix(in srgb, var(--agent) 30%, var(--border-soft));
387
+ }
388
+ .tk-assignee .avatar {
389
+ width: 11px;
390
+ height: 11px;
391
+ border-radius: 50%;
392
+ background: var(--bg-raised);
393
+ color: var(--fg);
394
+ display: inline-grid;
395
+ place-items: center;
396
+ font-size: 7.5px;
397
+ font-weight: 600;
398
+ text-transform: uppercase;
399
+ }
400
+ .tk-assignee.is-agent .avatar {
401
+ background: color-mix(in srgb, var(--agent) 24%, transparent);
402
+ color: var(--agent);
403
+ }
404
+ .tk-assignee .dot {
405
+ width: 5px;
406
+ height: 5px;
407
+ border-radius: 50%;
408
+ background: var(--agent);
409
+ }
410
+
411
+ /* === Exec mode pill ========================================= */
412
+ .tk-execmode {
413
+ font-family: var(--font-mono);
414
+ font-size: 9px;
415
+ letter-spacing: 0.06em;
416
+ text-transform: uppercase;
417
+ color: var(--fg-faint);
418
+ border: 1px dashed var(--border-soft);
419
+ padding: 1px 5px;
420
+ border-radius: var(--radius-xs);
421
+ background: transparent;
422
+ }
423
+ .tk-execmode.is-autonomous {
424
+ color: var(--agent);
425
+ border-color: color-mix(in srgb, var(--agent) 30%, var(--border-soft));
426
+ }
427
+ .tk-execmode.is-approval_required {
428
+ color: var(--achievement);
429
+ border-color: color-mix(in srgb, var(--achievement) 35%, var(--border-soft));
430
+ }
431
+ .tk-execmode.is-report {
432
+ color: var(--systemic);
433
+ border-color: color-mix(in srgb, var(--systemic) 30%, var(--border-soft));
434
+ }
435
+
436
+ /* === Detail panel =========================================== */
437
+ .tk-det-head {
438
+ padding: var(--space-4) var(--space-5);
439
+ border-bottom: 1px solid var(--border-soft);
440
+ background: linear-gradient(180deg, var(--tint-bg-active, var(--bg-surface)) 0%, var(--bg-base) 100%);
441
+ }
442
+ .tk-det-topline {
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: space-between;
446
+ gap: var(--space-3);
447
+ margin-bottom: 8px;
448
+ font-family: var(--font-mono);
449
+ font-size: 10.5px;
450
+ color: var(--fg-faint);
451
+ letter-spacing: 0.04em;
452
+ }
453
+ .tk-det-topline .id {
454
+ background: var(--bg-base);
455
+ border: 1px solid var(--border-soft);
456
+ padding: 2px 6px;
457
+ border-radius: var(--radius-xs);
458
+ color: var(--fg);
459
+ }
460
+ .tk-det-actions { display: flex; gap: 4px; align-items: center; }
461
+ .tk-det-title {
462
+ font-family: var(--font-display);
463
+ font-weight: 500;
464
+ font-size: var(--text-h3);
465
+ margin: 0;
466
+ color: var(--fg);
467
+ line-height: 1.25;
468
+ }
469
+ .tk-det-meta-row {
470
+ display: flex;
471
+ flex-wrap: wrap;
472
+ align-items: center;
473
+ gap: var(--space-2);
474
+ margin-top: var(--space-3);
475
+ font-family: var(--font-mono);
476
+ font-size: 10.5px;
477
+ color: var(--fg-faint);
478
+ letter-spacing: 0.04em;
479
+ }
480
+ .tk-det-meta-row .sep { color: var(--fg-faint); }
481
+ .tk-det-meta-row .pri-label { color: var(--achievement); display: inline-flex; align-items: center; gap: 4px; }
482
+ .tk-det-meta-row .pri-label.is-critical { color: var(--danger); }
483
+ .tk-det-meta-row .pri-label.is-high { color: var(--achievement); }
484
+ .tk-det-meta-row .pri-label.is-medium { color: var(--systemic); }
485
+ .tk-det-meta-row .pri-label.is-low { color: var(--fg-muted); }
486
+ .tk-det-meta-row .pri-label .dot {
487
+ width: 6px;
488
+ height: 6px;
489
+ border-radius: 50%;
490
+ background: currentColor;
491
+ }
492
+ .tk-det-meta-row .due-text { color: var(--fg-muted); }
493
+ .tk-det-meta-row .due-text.is-overdue { color: var(--danger); }
494
+ .tk-det-body {
495
+ padding: var(--space-5);
496
+ display: flex;
497
+ flex-direction: column;
498
+ gap: var(--space-5);
499
+ flex: 1;
500
+ }
501
+ .tk-det-grid {
502
+ display: grid;
503
+ grid-template-columns: 110px 1fr;
504
+ gap: 10px var(--space-4);
505
+ font-size: var(--text-body-sm);
506
+ }
507
+ .tk-det-grid dt {
508
+ font-family: var(--font-mono);
509
+ font-size: 10px;
510
+ color: var(--fg-faint);
511
+ letter-spacing: 0.1em;
512
+ text-transform: uppercase;
513
+ align-self: center;
514
+ }
515
+ .tk-det-grid dd {
516
+ margin: 0;
517
+ color: var(--fg);
518
+ display: flex;
519
+ flex-wrap: wrap;
520
+ align-items: center;
521
+ gap: var(--space-2);
522
+ font-size: var(--text-body-sm);
523
+ }
524
+ .tk-det-grid dd code {
525
+ font-family: var(--font-mono);
526
+ font-size: 11.5px;
527
+ background: var(--bg-sunken);
528
+ border: 1px solid var(--border-soft);
529
+ padding: 1px 5px;
530
+ border-radius: var(--radius-xs);
531
+ color: var(--fg);
532
+ }
533
+ .tk-section-label {
534
+ font-family: var(--font-mono);
535
+ font-size: 10px;
536
+ letter-spacing: 0.12em;
537
+ text-transform: uppercase;
538
+ color: var(--fg-faint);
539
+ display: flex;
540
+ align-items: baseline;
541
+ justify-content: space-between;
542
+ margin-bottom: 6px;
543
+ }
544
+ .tk-section-label .ct {
545
+ font-family: var(--font-mono);
546
+ font-size: 9.5px;
547
+ color: var(--fg-muted);
548
+ font-variant-numeric: tabular-nums;
549
+ letter-spacing: 0.04em;
550
+ text-transform: none;
551
+ }
552
+ .tk-deferred-pill {
553
+ font-family: var(--font-mono);
554
+ font-size: 9px;
555
+ letter-spacing: 0.06em;
556
+ text-transform: uppercase;
557
+ color: var(--fg-faint);
558
+ border: 1px dashed var(--border);
559
+ padding: 1px 5px;
560
+ border-radius: var(--radius-xs);
561
+ background: transparent;
562
+ }
563
+
564
+ .tk-desc {
565
+ font-size: var(--text-body-sm);
566
+ color: var(--fg-muted);
567
+ line-height: 1.6;
568
+ background: var(--bg-surface);
569
+ border: 1px solid var(--border-soft);
570
+ border-radius: var(--radius-md);
571
+ padding: var(--space-3) var(--space-4);
572
+ white-space: pre-wrap;
573
+ }
574
+
575
+ /* === Progress bar =========================================== */
576
+ .tk-progress {
577
+ flex: 1;
578
+ height: 6px;
579
+ background: var(--bg-sunken);
580
+ border-radius: 3px;
581
+ overflow: hidden;
582
+ border: 1px solid var(--border-soft);
583
+ min-width: 120px;
584
+ }
585
+ .tk-progress > span {
586
+ display: block;
587
+ height: 100%;
588
+ background: var(--live);
589
+ border-radius: 3px;
590
+ transition: width var(--motion-fast) var(--ease-calm);
591
+ }
592
+
593
+ /* === Evidence card ========================================== */
594
+ .tk-evidence {
595
+ border: 1px solid color-mix(in srgb, var(--live) 30%, var(--border-soft));
596
+ background: var(--live-soft);
597
+ border-radius: var(--radius-md);
598
+ padding: var(--space-3) var(--space-4);
599
+ display: flex;
600
+ flex-direction: column;
601
+ gap: 6px;
602
+ }
603
+ .tk-evidence-head {
604
+ display: flex;
605
+ align-items: center;
606
+ justify-content: space-between;
607
+ gap: var(--space-3);
608
+ }
609
+ .tk-evidence .rule-chip {
610
+ display: inline-flex;
611
+ align-items: center;
612
+ gap: 4px;
613
+ font-family: var(--font-mono);
614
+ font-size: 9.5px;
615
+ letter-spacing: 0.04em;
616
+ color: var(--live);
617
+ background: var(--bg-surface);
618
+ border: 1px solid color-mix(in srgb, var(--live) 30%, var(--border-soft));
619
+ padding: 2px 6px;
620
+ border-radius: var(--radius-xs);
621
+ }
622
+ .tk-evidence .rule-chip svg { width: 10px; height: 10px; }
623
+ .tk-evidence .rule-chip.is-flag {
624
+ color: var(--achievement);
625
+ border-color: color-mix(in srgb, var(--achievement) 30%, var(--border-soft));
626
+ background: var(--bg-surface);
627
+ }
628
+ .tk-evidence .timestamp {
629
+ font-family: var(--font-mono);
630
+ font-size: 10px;
631
+ color: var(--fg-muted);
632
+ letter-spacing: 0.04em;
633
+ }
634
+ .tk-evidence .body {
635
+ font-size: var(--text-body-sm);
636
+ color: var(--fg);
637
+ line-height: 1.55;
638
+ }
639
+
640
+ /* === Source-ref chips ======================================= */
641
+ .tk-source-row {
642
+ display: flex;
643
+ flex-wrap: wrap;
644
+ gap: 6px;
645
+ }
646
+ .tk-src {
647
+ display: inline-flex;
648
+ align-items: center;
649
+ gap: 5px;
650
+ font-family: var(--font-mono);
651
+ font-size: 10.5px;
652
+ color: var(--fg-muted);
653
+ background: var(--bg-sunken);
654
+ border: 1px solid var(--border-soft);
655
+ padding: 3px 7px;
656
+ border-radius: var(--radius-sm);
657
+ text-decoration: none;
658
+ letter-spacing: 0.02em;
659
+ cursor: pointer;
660
+ }
661
+ .tk-src:hover { color: var(--fg); border-color: var(--fg-faint); }
662
+ .tk-src svg { width: 11px; height: 11px; flex-shrink: 0; color: var(--fg-faint); }
663
+ .tk-src.is-email svg { color: var(--mail-fg, var(--achievement)); }
664
+ .tk-src.is-session svg { color: var(--agent); }
665
+ .tk-src.is-git svg { color: var(--systemic); }
666
+
667
+ /* === Subtasks =============================================== */
668
+ .tk-subtasks { display: flex; flex-direction: column; gap: 4px; }
669
+ .tk-sub-row {
670
+ display: grid;
671
+ grid-template-columns: auto 1fr auto;
672
+ align-items: center;
673
+ gap: var(--space-2);
674
+ padding: 6px var(--space-3);
675
+ background: var(--bg-surface);
676
+ border: 1px solid var(--border-soft);
677
+ border-radius: var(--radius-sm);
678
+ font-size: var(--text-body-sm);
679
+ cursor: pointer;
680
+ text-align: left;
681
+ width: 100%;
682
+ font: inherit;
683
+ color: inherit;
684
+ transition: background var(--motion-fast) var(--ease-calm);
685
+ }
686
+ .tk-sub-row:hover { background: var(--bg-raised); }
687
+ .tk-sub-row .name {
688
+ color: var(--fg);
689
+ overflow: hidden;
690
+ text-overflow: ellipsis;
691
+ white-space: nowrap;
692
+ }
693
+ .tk-sub-row.is-completed .name {
694
+ color: var(--fg-muted);
695
+ text-decoration: line-through;
696
+ }
697
+ .tk-sub-row .due {
698
+ font-family: var(--font-mono);
699
+ font-size: 10px;
700
+ color: var(--fg-faint);
701
+ }
702
+
703
+ /* === Activity timeline ====================================== */
704
+ .tk-timeline {
705
+ display: flex;
706
+ flex-direction: column;
707
+ gap: 0;
708
+ border-left: 1px dashed var(--border);
709
+ margin-left: 6px;
710
+ padding-left: var(--space-4);
711
+ position: relative;
712
+ }
713
+ .tk-tl-item {
714
+ position: relative;
715
+ padding: 6px 0;
716
+ font-size: var(--text-body-sm);
717
+ color: var(--fg-muted);
718
+ }
719
+ .tk-tl-item::before {
720
+ content: '';
721
+ position: absolute;
722
+ left: calc(-1 * var(--space-4) - 4px);
723
+ top: 12px;
724
+ width: 7px;
725
+ height: 7px;
726
+ border-radius: 50%;
727
+ background: var(--bg-sunken);
728
+ border: 1px solid var(--border);
729
+ }
730
+ .tk-tl-item.is-mark::before {
731
+ background: var(--tint-fg-active, var(--primary));
732
+ border-color: var(--tint-fg-active, var(--primary));
733
+ }
734
+ .tk-tl-item.is-ok::before {
735
+ background: var(--live);
736
+ border-color: var(--live);
737
+ }
738
+ .tk-tl-item .when {
739
+ font-family: var(--font-mono);
740
+ font-size: 10px;
741
+ color: var(--fg-faint);
742
+ letter-spacing: 0.04em;
743
+ margin-right: 6px;
744
+ }
745
+ .tk-tl-item .actor {
746
+ font-family: var(--font-mono);
747
+ font-size: 10px;
748
+ color: var(--fg);
749
+ background: var(--bg-sunken);
750
+ padding: 1px 5px;
751
+ border-radius: var(--radius-xs);
752
+ border: 1px solid var(--border-soft);
753
+ margin-right: 6px;
754
+ }
755
+ .tk-tl-item .actor.is-agent { color: var(--agent); }
756
+
757
+ /* === Action footer ========================================== */
758
+ .tk-action-bar {
759
+ border-top: 1px solid var(--border-soft);
760
+ background: var(--bg-sunken);
761
+ padding: var(--space-3) var(--space-5);
762
+ display: flex;
763
+ align-items: center;
764
+ gap: var(--space-2);
765
+ margin-top: auto;
766
+ }
767
+ .tk-action-bar .spacer { flex: 1; }
768
+
769
+ /* === Empty state in detail =================================== */
770
+ .tk-empty {
771
+ flex: 1;
772
+ display: grid;
773
+ place-items: center;
774
+ color: var(--fg-faint);
775
+ font-family: var(--font-mono);
776
+ font-size: 11px;
777
+ letter-spacing: 0.04em;
778
+ text-transform: uppercase;
779
+ }
780
+
781
+ /* === Density variants for $taskId standalone (Section B) ===== */
782
+ .tk-detail-pane.is-compact .tk-det-head { padding: var(--space-3) var(--space-4); }
783
+ .tk-detail-pane.is-compact .tk-det-title { font-size: var(--text-h4); }
784
+ .tk-detail-pane.is-compact .tk-det-body { padding: var(--space-4); gap: var(--space-4); }
785
+ .tk-detail-pane.is-compact .tk-det-grid { grid-template-columns: 90px 1fr; }
786
+ .tk-detail-pane.is-side .tk-det-head { padding: var(--space-3); }
787
+ .tk-detail-pane.is-side .tk-det-title { font-size: 13.5px; line-height: 1.35; }
788
+ .tk-detail-pane.is-side .tk-det-body { padding: var(--space-3); gap: var(--space-3); }
789
+ .tk-detail-pane.is-side .tk-det-grid { display: none; }
790
+ .tk-detail-pane.is-side .tk-section-label { margin-bottom: 4px; }
791
+
792
+ /* === In-body view switcher (D-2 / D-3) ====================== */
793
+ .ip-tabs {
794
+ display: flex;
795
+ align-items: center;
796
+ gap: 0;
797
+ padding: 0 var(--space-3);
798
+ height: var(--tab-h, 38px);
799
+ border-bottom: 1px solid var(--border-soft);
800
+ background: var(--bg-sunken);
801
+ }
802
+ .ip-tab {
803
+ height: var(--tab-h, 38px);
804
+ padding: 0 var(--space-3);
805
+ display: inline-flex;
806
+ align-items: center;
807
+ gap: 6px;
808
+ font-family: var(--font-body);
809
+ font-size: var(--text-body-sm);
810
+ color: var(--fg-faint);
811
+ border: 0;
812
+ background: transparent;
813
+ cursor: pointer;
814
+ border-bottom: 2px solid transparent;
815
+ margin-bottom: -1px;
816
+ }
817
+ .ip-tab svg { width: 13px; height: 13px; opacity: 0.8; }
818
+ .ip-tab:hover { color: var(--fg-muted); }
819
+ .ip-tab.is-on { color: var(--fg); border-bottom-color: var(--tint-fg-active, var(--primary)); }
820
+ .ip-tab.is-on svg { opacity: 1; color: var(--tint-fg-active, var(--primary)); }
821
+ .ip-tab:focus-visible,
822
+ .tk-toggle:focus-visible,
823
+ .tk-group-head:focus-visible,
824
+ .tk-row:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
825
+ .ip-tab-badge {
826
+ font-family: var(--font-mono);
827
+ font-size: 9.5px;
828
+ line-height: 1;
829
+ color: var(--achievement);
830
+ background: var(--achievement-soft);
831
+ border: 1px solid color-mix(in srgb, var(--achievement) 30%, var(--border-soft));
832
+ border-radius: var(--radius-pill, 999px);
833
+ padding: 2px 5px;
834
+ }
835
+
836
+ /* === Agenda / Today (D-2) =================================== */
837
+ /* AgendaView root — rendered directly inside .tk-frame (which is overflow:hidden),
838
+ * so it must be the scroll region itself: grow to fill the leftover height, allow
839
+ * shrink (min-height:0), scroll its own overflow. Mirrors the Browse page's
840
+ * `1fr` + overflow-y:auto leaf (shell .ccfg-list/.ccfg-detail). Without this the
841
+ * agenda is clipped by the frame and can't scroll. */
842
+ .ag-wrap { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-5); max-width: 920px; }
843
+ .ag-head {
844
+ display: flex;
845
+ align-items: baseline;
846
+ justify-content: space-between;
847
+ gap: var(--space-3);
848
+ margin-bottom: var(--space-5);
849
+ }
850
+ .ag-date { font-family: var(--font-display); font-weight: 500; font-size: var(--text-h3); color: var(--fg); }
851
+ .ag-summary { font-family: var(--font-mono); font-size: 10.5px; color: var(--fg-faint); letter-spacing: 0.04em; }
852
+ .ag-summary b { color: var(--fg-muted); font-weight: 500; }
853
+ .ag-filter-note { color: var(--achievement); font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.04em; }
854
+ .ag-grid { display: grid; grid-template-columns: 54px 1fr; column-gap: var(--space-3); }
855
+ .ag-time { font-family: var(--font-mono); font-size: 10px; color: var(--fg-faint); text-align: right; padding-top: 8px; letter-spacing: 0.04em; }
856
+ .ag-lane { min-width: 0; padding-bottom: var(--space-3); }
857
+ .ag-block {
858
+ padding: 8px var(--space-3);
859
+ border-radius: var(--radius-sm);
860
+ border: 1px solid var(--border-soft);
861
+ background: var(--bg-surface);
862
+ border-left: 3px solid var(--fg-faint);
863
+ margin-bottom: 6px;
864
+ }
865
+ .ag-block:last-child { margin-bottom: 0; }
866
+ .ag-block.is-me { border-left-color: var(--primary); }
867
+ .ag-block.is-agent { border-left-color: var(--agent); background: var(--agent-soft); }
868
+ .ag-block.is-silent { border-left-color: var(--systemic); border-style: dashed; background: transparent; }
869
+ .ag-block.is-deadline { border-left-color: var(--danger); background: color-mix(in srgb, var(--danger) 8%, transparent); }
870
+ .ag-block.is-done { opacity: 0.6; }
871
+ .ag-block .t { font-size: var(--text-body-sm); color: var(--fg); font-weight: 500; line-height: 1.4; }
872
+ .ag-block.is-done .t { text-decoration: line-through; text-decoration-thickness: 1px; color: var(--fg-muted); }
873
+ .ag-block .m { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 5px; }
874
+ .ag-now { grid-column: 1 / -1; position: relative; height: 0; border-top: 2px solid var(--live); margin: 4px 0 10px; }
875
+ .ag-now::after {
876
+ content: 'now';
877
+ position: absolute;
878
+ right: 0;
879
+ top: -8px;
880
+ font-family: var(--font-mono);
881
+ font-size: 8.5px;
882
+ letter-spacing: 0.06em;
883
+ color: var(--live);
884
+ background: var(--bg-base);
885
+ padding: 0 5px;
886
+ }
887
+ .ag-now::before { content: ''; position: absolute; left: -5px; top: -3px; width: 6px; height: 6px; border-radius: 50%; background: var(--live); }
888
+
889
+ /* === Triage / Health (D-3) ================================== */
890
+ /* TriageView root — same as .ag-wrap: own scroll region inside the overflow-hidden
891
+ * frame (grow to fill, min-height:0, scroll). */
892
+ .tr-wrap { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-5); max-width: 980px; }
893
+ .tr-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-3); margin-bottom: var(--space-5); }
894
+ .tr-stat { padding: var(--space-3) var(--space-4); border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); }
895
+ /* Numbers stay --fg (12:1+ in every theme/mode) — the colored border carries
896
+ the semantic. --achievement big-number measured 2.57:1 on a light surface. */
897
+ .tr-stat .n { font-family: var(--font-display); font-weight: 500; font-size: 28px; line-height: 1; color: var(--fg); font-variant-numeric: tabular-nums; }
898
+ .tr-stat .k { font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fg-faint); margin-top: 8px; }
899
+ .tr-stat .sub { font-family: var(--font-mono); font-size: 9px; color: var(--fg-faint); letter-spacing: 0.02em; margin-top: 3px; }
900
+ .tr-stat.is-danger { border-color: color-mix(in srgb, var(--danger) 35%, var(--border-soft)); }
901
+ .tr-stat.is-warn { border-color: color-mix(in srgb, var(--achievement) 35%, var(--border-soft)); }
902
+ .tr-stat.is-sys { border-color: color-mix(in srgb, var(--systemic) 35%, var(--border-soft)); }
903
+ .tr-bucket { margin-bottom: var(--space-5); }
904
+ .tr-bucket-head {
905
+ display: flex;
906
+ align-items: center;
907
+ gap: var(--space-2);
908
+ font-family: var(--font-mono);
909
+ font-size: 10px;
910
+ letter-spacing: 0.1em;
911
+ text-transform: uppercase;
912
+ color: var(--fg-faint);
913
+ margin-bottom: var(--space-2);
914
+ }
915
+ .tr-bucket-head .ct { color: var(--fg-muted); font-variant-numeric: tabular-nums; }
916
+ .tr-bucket-head::after { content: ''; flex: 1; height: 1px; background: var(--border-soft); }
917
+ .tr-mini {
918
+ display: grid;
919
+ grid-template-columns: auto 1fr auto auto;
920
+ align-items: center;
921
+ gap: var(--space-3);
922
+ padding: 8px var(--space-3);
923
+ border-bottom: 1px solid var(--border-soft);
924
+ }
925
+ .tr-mini:last-child { border-bottom: 0; }
926
+ .tr-mini .title { font-size: var(--text-body-sm); color: var(--fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
927
+ .tr-mini .age { font-family: var(--font-mono); font-size: 10px; color: var(--fg-muted); letter-spacing: 0.04em; white-space: nowrap; }
928
+ .tr-mini .age.is-bad { color: var(--danger); }
929
+ .tr-more { font-family: var(--font-mono); font-size: 10px; color: var(--fg-faint); letter-spacing: 0.04em; padding: 6px var(--space-3); }
930
+ .tr-health {
931
+ display: flex;
932
+ align-items: center;
933
+ gap: var(--space-4);
934
+ padding: var(--space-3) var(--space-4);
935
+ border: 1px dashed var(--border);
936
+ border-radius: var(--radius-md);
937
+ background: var(--bg-sunken);
938
+ font-size: var(--text-body-sm);
939
+ color: var(--fg-muted);
940
+ line-height: 1.55;
941
+ }
942
+ .tr-health .score { font-family: var(--font-display); font-weight: 500; font-size: var(--text-h2); color: var(--achievement); line-height: 1; flex-shrink: 0; }
943
+
944
+ /* === De-Tailwinded utilities ================================== */
945
+ /* The source app leaned on a handful of Tailwind utility classes for layout
946
+ * chrome around the locked .tk-* / .ag-* / .tr-* visuals. With no Tailwind in
947
+ * the no-build pkg, those are reproduced here as a tiny, scoped utility set
948
+ * (named after their Tailwind origin so the htm transcription reads 1:1).
949
+ * Everything load-bearing is still a .tk-*/.ag-*/.tr-* rule above. */
950
+
951
+ /* Root layout shell (was: `flex h-full flex-col p-5`) */
952
+ .tk-screen {
953
+ display: flex;
954
+ height: 100%;
955
+ flex-direction: column;
956
+ padding: var(--space-5);
957
+ }
958
+
959
+ /* Loading / error / empty inline states (was Tailwind utility soup) */
960
+ .tk-loading {
961
+ display: flex;
962
+ align-items: center;
963
+ gap: var(--space-2);
964
+ padding: var(--space-4);
965
+ font-size: var(--text-body-sm);
966
+ color: var(--fg-muted);
967
+ }
968
+ .tk-error {
969
+ margin: var(--space-4);
970
+ display: flex;
971
+ align-items: flex-start;
972
+ gap: var(--space-2);
973
+ border-radius: var(--radius-md);
974
+ border: 1px solid color-mix(in srgb, var(--danger) 50%, transparent);
975
+ background: color-mix(in srgb, var(--danger) 10%, transparent);
976
+ padding: var(--space-3);
977
+ font-size: var(--text-body-sm);
978
+ color: var(--danger);
979
+ }
980
+ .tk-error svg { flex-shrink: 0; margin-top: 2px; }
981
+ .tk-error .t { font-weight: 500; }
982
+ .tk-error .d { font-size: var(--text-caption); opacity: 0.8; margin-top: 2px; }
983
+ .tk-empty-box {
984
+ margin: var(--space-4);
985
+ display: flex;
986
+ height: 128px;
987
+ align-items: center;
988
+ justify-content: center;
989
+ border-radius: var(--radius-md);
990
+ border: 1px dashed var(--border);
991
+ font-size: var(--text-body-sm);
992
+ color: var(--fg-muted);
993
+ }
994
+
995
+ /* Spinner (was: `animate-spin`) */
996
+ .tk-spin { animation: tk-spin 1s linear infinite; }
997
+ @keyframes tk-spin { to { transform: rotate(360deg); } }
998
+
999
+ /* Detail-pane status select inline-styled in source; kept inline in the htm. */
1000
+
1001
+ /* === Button (was: src/components/Button.tsx, Tailwind utilities) ============ */
1002
+ .tk-btn {
1003
+ display: inline-flex;
1004
+ align-items: center;
1005
+ justify-content: center;
1006
+ gap: 6px;
1007
+ font-family: inherit;
1008
+ font-weight: 500;
1009
+ white-space: nowrap;
1010
+ cursor: pointer;
1011
+ transition: background var(--motion-fast, 120ms) var(--ease-calm, ease),
1012
+ color var(--motion-fast, 120ms) var(--ease-calm, ease),
1013
+ opacity var(--motion-fast, 120ms) var(--ease-calm, ease);
1014
+ }
1015
+ .tk-btn svg { flex-shrink: 0; }
1016
+ .tk-btn:disabled { opacity: 0.5; pointer-events: none; }
1017
+ /* sizes */
1018
+ .tk-btn.sz-md { height: 32px; padding: 0 12px; font-size: var(--text-body-sm); border-radius: var(--radius-md); }
1019
+ .tk-btn.sz-sm { height: 28px; padding: 0 10px; font-size: var(--text-caption); border-radius: var(--radius-md); gap: 4px; }
1020
+ /* variants */
1021
+ .tk-btn.v-default {
1022
+ background: var(--primary);
1023
+ color: var(--primary-fg);
1024
+ border: 1px solid transparent;
1025
+ }
1026
+ .tk-btn.v-default:hover:not(:disabled) { opacity: 0.9; }
1027
+ .tk-btn.v-outline {
1028
+ background: transparent;
1029
+ color: var(--fg);
1030
+ border: 1px solid var(--border);
1031
+ }
1032
+ .tk-btn.v-outline:hover:not(:disabled) { background: var(--bg-raised); }
1033
+ .tk-btn.v-ghost {
1034
+ background: transparent;
1035
+ color: var(--fg);
1036
+ border: 1px solid transparent;
1037
+ }
1038
+ .tk-btn.v-ghost:hover:not(:disabled) { background: var(--bg-raised); }
1039
+ .tk-btn:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
1040
+
1041
+ /* Mutation error line in the detail pane footer. */
1042
+ .tk-mut-error {
1043
+ padding: 0 var(--space-5) var(--space-3);
1044
+ font-size: 11px;
1045
+ color: var(--danger);
1046
+ }