@ai-setting/roy-plugin-task-show 0.6.11 → 0.8.4
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/README.md +121 -1
- package/dist/cli-tasks-adapter.d.ts +142 -0
- package/dist/cli-tasks-adapter.d.ts.map +1 -0
- package/dist/cli-tasks-adapter.js +379 -0
- package/dist/cli-tasks-adapter.js.map +1 -0
- package/dist/cli-tasks-tree-adapter.d.ts +143 -0
- package/dist/cli-tasks-tree-adapter.d.ts.map +1 -0
- package/dist/cli-tasks-tree-adapter.js +400 -0
- package/dist/cli-tasks-tree-adapter.js.map +1 -0
- package/dist/operations-cache.d.ts +44 -0
- package/dist/operations-cache.d.ts.map +1 -0
- package/dist/operations-cache.js +103 -0
- package/dist/operations-cache.js.map +1 -0
- package/dist/plugin.d.ts +14 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +82 -0
- package/dist/plugin.js.map +1 -1
- package/dist/server.d.ts +30 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +289 -89
- package/dist/server.js.map +1 -1
- package/dist/task-detail-mermaid.d.ts +171 -0
- package/dist/task-detail-mermaid.d.ts.map +1 -0
- package/dist/task-detail-mermaid.js +697 -0
- package/dist/task-detail-mermaid.js.map +1 -0
- package/dist/task-operations-html.d.ts +50 -0
- package/dist/task-operations-html.d.ts.map +1 -0
- package/dist/task-operations-html.js +187 -0
- package/dist/task-operations-html.js.map +1 -0
- package/dist/tasks-tree-cache.d.ts +44 -0
- package/dist/tasks-tree-cache.d.ts.map +1 -0
- package/dist/tasks-tree-cache.js +111 -0
- package/dist/tasks-tree-cache.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -1
- package/plugin.json +2 -2
- package/public/app.js +534 -34
- package/public/index.html +54 -21
- package/public/style.css +697 -1
- package/public/task-operations.js +290 -0
- package/public/tasks-tree.js +449 -0
package/public/style.css
CHANGED
|
@@ -221,6 +221,28 @@ table.toolcalls .result {
|
|
|
221
221
|
word-break: break-all;
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
+
/* v0.8.0+ tool-row collapsed / expanded / highlight states. The row
|
|
225
|
+
starts in `.collapsed` (input/output <details> closed) and gets
|
|
226
|
+
toggled to `.expanded` on click. The `.highlight` class is added
|
|
227
|
+
for 2s by the Mermaid `__toolClick` callback so the user sees a
|
|
228
|
+
yellow flash pointing at the target row. */
|
|
229
|
+
table.toolcalls tr.tool-row {
|
|
230
|
+
transition: background 0.3s ease-out;
|
|
231
|
+
}
|
|
232
|
+
table.toolcalls tr.tool-row.collapsed .tool-detail summary {
|
|
233
|
+
color: var(--muted);
|
|
234
|
+
}
|
|
235
|
+
table.toolcalls tr.tool-row.expanded .tool-detail summary {
|
|
236
|
+
color: var(--link);
|
|
237
|
+
}
|
|
238
|
+
table.toolcalls tr.tool-row.highlight {
|
|
239
|
+
background: rgba(255, 200, 0, 0.30) !important;
|
|
240
|
+
transition: background 0.3s ease-out;
|
|
241
|
+
}
|
|
242
|
+
table.toolcalls tr.tool-row.highlight:hover {
|
|
243
|
+
background: rgba(255, 200, 0, 0.36) !important;
|
|
244
|
+
}
|
|
245
|
+
|
|
224
246
|
.status {
|
|
225
247
|
font-size: 11px;
|
|
226
248
|
font-weight: 600;
|
|
@@ -330,4 +352,678 @@ details summary {
|
|
|
330
352
|
padding: 14px 14px;
|
|
331
353
|
margin: 14px 10px;
|
|
332
354
|
}
|
|
333
|
-
}
|
|
355
|
+
}
|
|
356
|
+
/* ------------------------------------------------------------------------- */
|
|
357
|
+
/* Task lifecycle pipeline (v0.7.0+) */
|
|
358
|
+
/* ------------------------------------------------------------------------- */
|
|
359
|
+
|
|
360
|
+
.panel-pipeline {
|
|
361
|
+
/* keeps the existing panel rhythm */
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.panel-lifecycle {
|
|
365
|
+
/* The "Task lifecycle + tools" Mermaid section in the detail page. */
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.lifecycle-hint {
|
|
369
|
+
margin-left: 8px;
|
|
370
|
+
font-size: 11.5px;
|
|
371
|
+
color: var(--muted);
|
|
372
|
+
font-weight: normal;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.op-timeline {
|
|
376
|
+
list-style: none;
|
|
377
|
+
margin: 0;
|
|
378
|
+
padding: 0;
|
|
379
|
+
position: relative;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.op-timeline::before {
|
|
383
|
+
content: "";
|
|
384
|
+
position: absolute;
|
|
385
|
+
left: 11px;
|
|
386
|
+
top: 6px;
|
|
387
|
+
bottom: 6px;
|
|
388
|
+
width: 2px;
|
|
389
|
+
background: var(--border);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.op-node {
|
|
393
|
+
position: relative;
|
|
394
|
+
padding: 6px 0 14px 36px;
|
|
395
|
+
list-style: none;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
.op-bullet {
|
|
399
|
+
position: absolute;
|
|
400
|
+
left: 4px;
|
|
401
|
+
top: 12px;
|
|
402
|
+
width: 16px;
|
|
403
|
+
height: 16px;
|
|
404
|
+
border-radius: 50%;
|
|
405
|
+
background: var(--panel-2);
|
|
406
|
+
border: 2px solid var(--border);
|
|
407
|
+
box-shadow: 0 0 0 3px var(--bg);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.op-body {
|
|
411
|
+
display: flex;
|
|
412
|
+
flex-direction: column;
|
|
413
|
+
gap: 6px;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.op-row1 {
|
|
417
|
+
display: flex;
|
|
418
|
+
align-items: center;
|
|
419
|
+
gap: 10px;
|
|
420
|
+
flex-wrap: wrap;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.op-seq {
|
|
424
|
+
color: var(--muted);
|
|
425
|
+
font-variant-numeric: tabular-nums;
|
|
426
|
+
min-width: 2.5em;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.op-time {
|
|
430
|
+
margin-left: auto;
|
|
431
|
+
color: var(--muted);
|
|
432
|
+
font-size: 12px;
|
|
433
|
+
font-variant-numeric: tabular-nums;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.op-title {
|
|
437
|
+
font-weight: 600;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.op-badge {
|
|
441
|
+
display: inline-block;
|
|
442
|
+
font-size: 11px;
|
|
443
|
+
padding: 2px 8px;
|
|
444
|
+
border-radius: 10px;
|
|
445
|
+
border: 1px solid var(--border);
|
|
446
|
+
background: var(--panel-2);
|
|
447
|
+
color: var(--text);
|
|
448
|
+
text-transform: uppercase;
|
|
449
|
+
letter-spacing: 0.04em;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.op-details {
|
|
453
|
+
background: var(--panel-2);
|
|
454
|
+
border: 1px solid var(--border);
|
|
455
|
+
border-radius: 6px;
|
|
456
|
+
padding: 8px 10px;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.op-details summary {
|
|
460
|
+
cursor: pointer;
|
|
461
|
+
color: var(--muted);
|
|
462
|
+
font-size: 12px;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
.op-desc {
|
|
466
|
+
white-space: pre-wrap;
|
|
467
|
+
word-break: break-word;
|
|
468
|
+
font-size: 13px;
|
|
469
|
+
line-height: 1.5;
|
|
470
|
+
margin-top: 6px;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
.op-proc {
|
|
474
|
+
margin-top: 6px;
|
|
475
|
+
font-size: 12px;
|
|
476
|
+
color: var(--muted);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.op-proc-label {
|
|
480
|
+
display: inline-block;
|
|
481
|
+
background: var(--panel);
|
|
482
|
+
border: 1px solid var(--border);
|
|
483
|
+
padding: 0 6px;
|
|
484
|
+
border-radius: 4px;
|
|
485
|
+
margin-right: 4px;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* v0.8.0+ always-visible description / process blocks (no <details>
|
|
489
|
+
collapse unless the description is > 600 chars, in which case the
|
|
490
|
+
legacy details fallback kicks in). The two blocks share a panel
|
|
491
|
+
rhythm and use a left-border accent so the eye can separate them
|
|
492
|
+
at a glance. */
|
|
493
|
+
.op-desc-block,
|
|
494
|
+
.op-proc-block {
|
|
495
|
+
background: var(--panel-2);
|
|
496
|
+
border: 1px solid var(--border);
|
|
497
|
+
border-left: 3px solid var(--border);
|
|
498
|
+
border-radius: 6px;
|
|
499
|
+
padding: 6px 10px 8px;
|
|
500
|
+
margin-top: 6px;
|
|
501
|
+
font-size: 13px;
|
|
502
|
+
line-height: 1.5;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
.op-desc-block {
|
|
506
|
+
border-left-color: var(--accent);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.op-proc-block {
|
|
510
|
+
border-left-color: var(--muted);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.op-block-label {
|
|
514
|
+
display: inline-block;
|
|
515
|
+
font-size: 11px;
|
|
516
|
+
font-weight: 600;
|
|
517
|
+
letter-spacing: 0.04em;
|
|
518
|
+
color: var(--muted);
|
|
519
|
+
text-transform: uppercase;
|
|
520
|
+
margin-bottom: 4px;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.op-desc-block .op-desc {
|
|
524
|
+
margin: 0;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
.op-proc-block .op-proc-body {
|
|
528
|
+
font-size: 12.5px;
|
|
529
|
+
color: var(--text);
|
|
530
|
+
white-space: pre-wrap;
|
|
531
|
+
word-break: break-word;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
.op-desc-empty,
|
|
535
|
+
.op-proc-empty {
|
|
536
|
+
color: var(--muted);
|
|
537
|
+
font-style: italic;
|
|
538
|
+
font-size: 12px;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/* Status colors per canonical milestone type */
|
|
542
|
+
.op-status-create .op-bullet { background: #1e40af; border-color: #3b82f6; }
|
|
543
|
+
.op-status-create .op-badge { background: #1e3a8a; color: #dbeafe; border-color: #3b82f6; }
|
|
544
|
+
|
|
545
|
+
.op-status-progress .op-bullet { background: #0e7490; border-color: #06b6d4; }
|
|
546
|
+
.op-status-progress .op-badge { background: #164e63; color: #cffafe; border-color: #06b6d4; }
|
|
547
|
+
|
|
548
|
+
.op-status-milestone .op-bullet { background: #15803d; border-color: #22c55e; }
|
|
549
|
+
.op-status-milestone .op-badge { background: #14532d; color: #dcfce7; border-color: #22c55e; }
|
|
550
|
+
|
|
551
|
+
.op-status-problem .op-bullet { background: #b91c1c; border-color: #ef4444; }
|
|
552
|
+
.op-status-problem .op-badge { background: #7f1d1d; color: #fee2e2; border-color: #ef4444; }
|
|
553
|
+
|
|
554
|
+
.op-status-solution .op-bullet { background: #a16207; border-color: #f59e0b; }
|
|
555
|
+
.op-status-solution .op-badge { background: #78350f; color: #fef3c7; border-color: #f59e0b; }
|
|
556
|
+
|
|
557
|
+
.op-status-decision .op-bullet { background: #6d28d9; border-color: #8b5cf6; }
|
|
558
|
+
.op-status-decision .op-badge { background: #4c1d95; color: #ede9fe; border-color: #8b5cf6; }
|
|
559
|
+
|
|
560
|
+
.op-status-review .op-bullet { background: #0f766e; border-color: #14b8a6; }
|
|
561
|
+
.op-status-review .op-badge { background: #134e4a; color: #ccfbf1; border-color: #14b8a6; }
|
|
562
|
+
|
|
563
|
+
.op-status-completed .op-bullet { background: #166534; border-color: #22c55e; }
|
|
564
|
+
.op-status-completed .op-badge { background: #14532d; color: #dcfce7; border-color: #22c55e; }
|
|
565
|
+
|
|
566
|
+
.op-status-unknown .op-bullet { background: #475569; border-color: #94a3b8; }
|
|
567
|
+
.op-status-unknown .op-badge { background: #334155; color: #e2e8f0; border-color: #94a3b8; }
|
|
568
|
+
|
|
569
|
+
.pipeline-stale {
|
|
570
|
+
display: inline-block;
|
|
571
|
+
background: var(--warn);
|
|
572
|
+
color: #1f2937;
|
|
573
|
+
padding: 1px 8px;
|
|
574
|
+
border-radius: 8px;
|
|
575
|
+
font-size: 11px;
|
|
576
|
+
margin-left: 8px;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
.pipeline-error {
|
|
580
|
+
background: rgba(239, 68, 68, 0.08);
|
|
581
|
+
border: 1px solid var(--bad);
|
|
582
|
+
border-radius: 6px;
|
|
583
|
+
padding: 10px 12px;
|
|
584
|
+
display: flex;
|
|
585
|
+
align-items: center;
|
|
586
|
+
gap: 12px;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.btn {
|
|
590
|
+
background: var(--panel-2);
|
|
591
|
+
color: var(--text);
|
|
592
|
+
border: 1px solid var(--border);
|
|
593
|
+
border-radius: 6px;
|
|
594
|
+
padding: 6px 12px;
|
|
595
|
+
cursor: pointer;
|
|
596
|
+
font-size: 13px;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
.btn-retry:hover {
|
|
600
|
+
border-color: var(--accent);
|
|
601
|
+
color: var(--accent);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
@media (max-width: 800px) {
|
|
605
|
+
.op-row1 {
|
|
606
|
+
flex-direction: column;
|
|
607
|
+
align-items: flex-start;
|
|
608
|
+
gap: 4px;
|
|
609
|
+
}
|
|
610
|
+
.op-time {
|
|
611
|
+
margin-left: 0;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/* ------------------------------------------------------------------------- */
|
|
616
|
+
/* Tasks tree (v0.8.0+) */
|
|
617
|
+
/* ------------------------------------------------------------------------- */
|
|
618
|
+
|
|
619
|
+
.tree-controls {
|
|
620
|
+
border-left: 3px solid var(--accent);
|
|
621
|
+
}
|
|
622
|
+
.tree-controls-row {
|
|
623
|
+
display: flex;
|
|
624
|
+
flex-wrap: wrap;
|
|
625
|
+
align-items: center;
|
|
626
|
+
gap: 12px;
|
|
627
|
+
margin-bottom: 8px;
|
|
628
|
+
}
|
|
629
|
+
.tree-search {
|
|
630
|
+
display: inline-flex;
|
|
631
|
+
align-items: center;
|
|
632
|
+
gap: 6px;
|
|
633
|
+
background: var(--code-bg);
|
|
634
|
+
border: 1px solid var(--border);
|
|
635
|
+
border-radius: 6px;
|
|
636
|
+
padding: 4px 10px;
|
|
637
|
+
flex: 1 1 240px;
|
|
638
|
+
min-width: 220px;
|
|
639
|
+
max-width: 380px;
|
|
640
|
+
}
|
|
641
|
+
.tree-search input {
|
|
642
|
+
background: transparent;
|
|
643
|
+
border: none;
|
|
644
|
+
color: var(--text);
|
|
645
|
+
font-size: 13px;
|
|
646
|
+
outline: none;
|
|
647
|
+
flex: 1;
|
|
648
|
+
min-width: 0;
|
|
649
|
+
}
|
|
650
|
+
.tree-search input::placeholder {
|
|
651
|
+
color: var(--muted);
|
|
652
|
+
opacity: 0.7;
|
|
653
|
+
}
|
|
654
|
+
.tree-filter-group {
|
|
655
|
+
display: inline-flex;
|
|
656
|
+
flex-wrap: wrap;
|
|
657
|
+
gap: 4px;
|
|
658
|
+
background: var(--code-bg);
|
|
659
|
+
border: 1px solid var(--border);
|
|
660
|
+
border-radius: 6px;
|
|
661
|
+
padding: 3px;
|
|
662
|
+
}
|
|
663
|
+
.tree-filter-btn {
|
|
664
|
+
background: transparent;
|
|
665
|
+
color: var(--muted);
|
|
666
|
+
border: 1px solid transparent;
|
|
667
|
+
border-radius: 4px;
|
|
668
|
+
padding: 4px 10px;
|
|
669
|
+
cursor: pointer;
|
|
670
|
+
font-size: 12px;
|
|
671
|
+
line-height: 1.4;
|
|
672
|
+
transition: all 120ms ease;
|
|
673
|
+
}
|
|
674
|
+
.tree-filter-btn:hover {
|
|
675
|
+
color: var(--text);
|
|
676
|
+
border-color: var(--border);
|
|
677
|
+
}
|
|
678
|
+
.tree-filter-btn.is-active {
|
|
679
|
+
background: var(--accent);
|
|
680
|
+
color: #0b1220;
|
|
681
|
+
font-weight: 600;
|
|
682
|
+
border-color: var(--accent);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
.tree-summary {
|
|
686
|
+
margin-top: 8px;
|
|
687
|
+
font-size: 12.5px;
|
|
688
|
+
}
|
|
689
|
+
.tree-summary .stale-pill {
|
|
690
|
+
display: inline-block;
|
|
691
|
+
background: var(--warn);
|
|
692
|
+
color: #1a1300;
|
|
693
|
+
font-weight: 700;
|
|
694
|
+
padding: 1px 7px;
|
|
695
|
+
border-radius: 999px;
|
|
696
|
+
font-size: 10.5px;
|
|
697
|
+
margin-left: 4px;
|
|
698
|
+
letter-spacing: 0.02em;
|
|
699
|
+
text-transform: uppercase;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.tree-panel {
|
|
703
|
+
border-left: 3px solid var(--good);
|
|
704
|
+
}
|
|
705
|
+
.tasks-tree {
|
|
706
|
+
min-height: 80px;
|
|
707
|
+
font-size: 13px;
|
|
708
|
+
}
|
|
709
|
+
.tree-list,
|
|
710
|
+
.tree-children {
|
|
711
|
+
list-style: none;
|
|
712
|
+
margin: 0;
|
|
713
|
+
padding: 0;
|
|
714
|
+
}
|
|
715
|
+
.tree-children {
|
|
716
|
+
margin-left: 0;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
.tree-item {
|
|
720
|
+
position: relative;
|
|
721
|
+
margin: 2px 0;
|
|
722
|
+
}
|
|
723
|
+
.tree-item.tree-item-hidden {
|
|
724
|
+
display: none;
|
|
725
|
+
}
|
|
726
|
+
.tree-row {
|
|
727
|
+
display: flex;
|
|
728
|
+
align-items: center;
|
|
729
|
+
gap: 8px;
|
|
730
|
+
padding: 6px 8px 6px 8px;
|
|
731
|
+
border-radius: 6px;
|
|
732
|
+
background: rgba(255, 255, 255, 0.015);
|
|
733
|
+
border: 1px solid transparent;
|
|
734
|
+
transition: background 120ms ease, border-color 120ms ease;
|
|
735
|
+
}
|
|
736
|
+
.tree-row:hover {
|
|
737
|
+
background: rgba(96, 165, 250, 0.06);
|
|
738
|
+
border-color: rgba(96, 165, 250, 0.25);
|
|
739
|
+
}
|
|
740
|
+
.tree-row-meta {
|
|
741
|
+
margin-top: 4px;
|
|
742
|
+
font-size: 11.5px;
|
|
743
|
+
color: var(--muted);
|
|
744
|
+
font-style: italic;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
.tree-toggler {
|
|
748
|
+
display: inline-flex;
|
|
749
|
+
align-items: center;
|
|
750
|
+
justify-content: center;
|
|
751
|
+
width: 22px;
|
|
752
|
+
height: 22px;
|
|
753
|
+
background: transparent;
|
|
754
|
+
color: var(--accent);
|
|
755
|
+
border: 1px solid var(--border);
|
|
756
|
+
border-radius: 4px;
|
|
757
|
+
cursor: pointer;
|
|
758
|
+
font-size: 11px;
|
|
759
|
+
padding: 0;
|
|
760
|
+
flex-shrink: 0;
|
|
761
|
+
transition: background 120ms ease;
|
|
762
|
+
}
|
|
763
|
+
.tree-toggler:hover {
|
|
764
|
+
background: rgba(96, 165, 250, 0.12);
|
|
765
|
+
}
|
|
766
|
+
.tree-toggler-leaf {
|
|
767
|
+
border-color: transparent;
|
|
768
|
+
color: var(--muted);
|
|
769
|
+
cursor: default;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
.tree-id {
|
|
773
|
+
font-family: "JetBrains Mono", Menlo, Monaco, monospace;
|
|
774
|
+
font-size: 12.5px;
|
|
775
|
+
font-weight: 600;
|
|
776
|
+
color: var(--accent);
|
|
777
|
+
flex-shrink: 0;
|
|
778
|
+
min-width: 52px;
|
|
779
|
+
}
|
|
780
|
+
.tree-id:hover {
|
|
781
|
+
text-decoration: underline;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
.tree-type-badge {
|
|
785
|
+
display: inline-block;
|
|
786
|
+
font-size: 10.5px;
|
|
787
|
+
font-family: "JetBrains Mono", Menlo, Monaco, monospace;
|
|
788
|
+
text-transform: uppercase;
|
|
789
|
+
color: var(--muted);
|
|
790
|
+
border: 1px solid var(--border);
|
|
791
|
+
border-radius: 4px;
|
|
792
|
+
padding: 1px 5px;
|
|
793
|
+
flex-shrink: 0;
|
|
794
|
+
letter-spacing: 0.04em;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
.tree-title {
|
|
798
|
+
color: var(--text);
|
|
799
|
+
flex: 1 1 auto;
|
|
800
|
+
min-width: 0;
|
|
801
|
+
overflow: hidden;
|
|
802
|
+
text-overflow: ellipsis;
|
|
803
|
+
white-space: nowrap;
|
|
804
|
+
}
|
|
805
|
+
.tree-title:hover {
|
|
806
|
+
text-decoration: underline;
|
|
807
|
+
color: var(--accent);
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
.tree-tags {
|
|
811
|
+
display: inline-flex;
|
|
812
|
+
flex-wrap: wrap;
|
|
813
|
+
gap: 3px;
|
|
814
|
+
flex-shrink: 0;
|
|
815
|
+
}
|
|
816
|
+
.tree-tag {
|
|
817
|
+
display: inline-block;
|
|
818
|
+
font-size: 10.5px;
|
|
819
|
+
background: rgba(96, 165, 250, 0.12);
|
|
820
|
+
color: #bfdbfe;
|
|
821
|
+
border: 1px solid rgba(96, 165, 250, 0.3);
|
|
822
|
+
border-radius: 999px;
|
|
823
|
+
padding: 1px 7px;
|
|
824
|
+
white-space: nowrap;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
.tree-progress {
|
|
828
|
+
display: inline-flex;
|
|
829
|
+
align-items: center;
|
|
830
|
+
gap: 6px;
|
|
831
|
+
flex-shrink: 0;
|
|
832
|
+
background: var(--code-bg);
|
|
833
|
+
border: 1px solid var(--border);
|
|
834
|
+
border-radius: 999px;
|
|
835
|
+
padding: 2px 8px;
|
|
836
|
+
font-size: 10.5px;
|
|
837
|
+
color: var(--muted);
|
|
838
|
+
min-width: 80px;
|
|
839
|
+
position: relative;
|
|
840
|
+
overflow: hidden;
|
|
841
|
+
}
|
|
842
|
+
.tree-progress-bar {
|
|
843
|
+
position: absolute;
|
|
844
|
+
left: 0;
|
|
845
|
+
top: 0;
|
|
846
|
+
bottom: 0;
|
|
847
|
+
background: rgba(34, 197, 94, 0.22);
|
|
848
|
+
border-right: 1px solid rgba(34, 197, 94, 0.45);
|
|
849
|
+
}
|
|
850
|
+
.tree-progress-label {
|
|
851
|
+
position: relative;
|
|
852
|
+
z-index: 1;
|
|
853
|
+
font-family: "JetBrains Mono", Menlo, Monaco, monospace;
|
|
854
|
+
font-weight: 600;
|
|
855
|
+
color: var(--text);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
.tree-updated {
|
|
859
|
+
font-size: 10.5px;
|
|
860
|
+
color: var(--muted);
|
|
861
|
+
font-family: "JetBrains Mono", Menlo, Monaco, monospace;
|
|
862
|
+
flex-shrink: 0;
|
|
863
|
+
white-space: nowrap;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
/* Branch lines — drawn as left borders on each child item so the tree
|
|
867
|
+
stays legible even with deep nesting. Each level offsets the lines by
|
|
868
|
+
the same 22px we use for indentation. v0.8.3: bumped the line weight
|
|
869
|
+
and contrast so the hierarchy is visible without squinting. */
|
|
870
|
+
.tree-children .tree-item {
|
|
871
|
+
border-left: 2px solid rgba(148, 163, 184, 0.45);
|
|
872
|
+
margin-left: 11px;
|
|
873
|
+
padding-left: 0;
|
|
874
|
+
}
|
|
875
|
+
.tree-children .tree-item .tree-row {
|
|
876
|
+
border-left: 2px solid transparent;
|
|
877
|
+
margin-left: -2px;
|
|
878
|
+
padding-left: 2px;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
/* v0.8.3: render-time indent is computed as `depth * 22` in JS, but we
|
|
882
|
+
also bump the depth-0 row padding so it lines up with the toggler
|
|
883
|
+
size — without this the leaf dots look detached from their row. */
|
|
884
|
+
.tree-row {
|
|
885
|
+
display: flex;
|
|
886
|
+
align-items: center;
|
|
887
|
+
gap: 8px;
|
|
888
|
+
padding: 6px 8px 6px 8px;
|
|
889
|
+
border-radius: 6px;
|
|
890
|
+
background: rgba(255, 255, 255, 0.015);
|
|
891
|
+
border: 1px solid transparent;
|
|
892
|
+
transition: background 120ms ease, border-color 120ms ease;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
/* v0.8.3: parent rows get a subtle accent so the user can immediately
|
|
896
|
+
tell which rows have children — even before they click the chevron. */
|
|
897
|
+
.tree-item-branch > .tree-row {
|
|
898
|
+
background: rgba(96, 165, 250, 0.04);
|
|
899
|
+
border-color: rgba(96, 165, 250, 0.18);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/* v0.8.3: depth-based indentation for visual scanning. We tag each
|
|
903
|
+
tree-row with its depth so the CSS can add a coloured left rail —
|
|
904
|
+
darker for roots, fading toward the leaves. */
|
|
905
|
+
.tree-row[data-depth="0"] {
|
|
906
|
+
box-shadow: inset 3px 0 0 rgba(96, 165, 250, 0.55);
|
|
907
|
+
}
|
|
908
|
+
.tree-row[data-depth="1"] {
|
|
909
|
+
box-shadow: inset 3px 0 0 rgba(96, 165, 250, 0.30);
|
|
910
|
+
}
|
|
911
|
+
.tree-row[data-depth="2"] {
|
|
912
|
+
box-shadow: inset 3px 0 0 rgba(96, 165, 250, 0.18);
|
|
913
|
+
}
|
|
914
|
+
.tree-row[data-depth="3"] {
|
|
915
|
+
box-shadow: inset 3px 0 0 rgba(148, 163, 184, 0.30);
|
|
916
|
+
}
|
|
917
|
+
.tree-row[data-depth="4"],
|
|
918
|
+
.tree-row[data-depth="5"],
|
|
919
|
+
.tree-row[data-depth="6"] {
|
|
920
|
+
box-shadow: inset 3px 0 0 rgba(148, 163, 184, 0.20);
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/* v0.8.3: per-depth depth pill in the summary line. */
|
|
924
|
+
.tree-depth-breakdown {
|
|
925
|
+
display: inline-flex;
|
|
926
|
+
flex-wrap: wrap;
|
|
927
|
+
gap: 4px;
|
|
928
|
+
margin-left: 4px;
|
|
929
|
+
}
|
|
930
|
+
.tree-depth-pill {
|
|
931
|
+
display: inline-block;
|
|
932
|
+
padding: 1px 7px;
|
|
933
|
+
border-radius: 999px;
|
|
934
|
+
font-size: 11px;
|
|
935
|
+
border: 1px solid rgba(148, 163, 184, 0.35);
|
|
936
|
+
background: rgba(96, 165, 250, 0.08);
|
|
937
|
+
color: #cbd5e1;
|
|
938
|
+
}
|
|
939
|
+
.tree-depth-pill[data-depth="0"] {
|
|
940
|
+
background: rgba(96, 165, 250, 0.18);
|
|
941
|
+
color: #bfdbfe;
|
|
942
|
+
border-color: rgba(96, 165, 250, 0.55);
|
|
943
|
+
}
|
|
944
|
+
.tree-depth-pill[data-depth="1"] {
|
|
945
|
+
background: rgba(96, 165, 250, 0.10);
|
|
946
|
+
color: #cbd5e1;
|
|
947
|
+
border-color: rgba(96, 165, 250, 0.30);
|
|
948
|
+
}
|
|
949
|
+
.tree-depth-pill[data-depth="2"] {
|
|
950
|
+
background: rgba(96, 165, 250, 0.06);
|
|
951
|
+
color: #cbd5e1;
|
|
952
|
+
border-color: rgba(96, 165, 250, 0.22);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/* v0.8.3: legacy sections stay hidden. The id="legacy-sessions" hook
|
|
956
|
+
lets a future debug toggle restore them without code changes. */
|
|
957
|
+
.tree-legacy-hidden,
|
|
958
|
+
.tree-legacy-hidden[hidden] {
|
|
959
|
+
display: none !important;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/* v0.8.3: condensed legend so it doesn't dominate the page above the
|
|
963
|
+
fold. Keeps the same content, tighter padding. */
|
|
964
|
+
.tree-legend {
|
|
965
|
+
padding-top: 8px;
|
|
966
|
+
padding-bottom: 8px;
|
|
967
|
+
font-size: 12.5px;
|
|
968
|
+
}
|
|
969
|
+
.tree-legend h2 {
|
|
970
|
+
font-size: 13px;
|
|
971
|
+
margin-bottom: 4px;
|
|
972
|
+
color: var(--muted);
|
|
973
|
+
text-transform: uppercase;
|
|
974
|
+
letter-spacing: 0.04em;
|
|
975
|
+
}
|
|
976
|
+
.tree-legend ul {
|
|
977
|
+
margin: 0;
|
|
978
|
+
padding-left: 18px;
|
|
979
|
+
display: grid;
|
|
980
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
981
|
+
gap: 2px 16px;
|
|
982
|
+
}
|
|
983
|
+
.tree-legend li {
|
|
984
|
+
margin: 0;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
/* Status badge color tweaks — keep the existing palette, just make the
|
|
988
|
+
ones we use most in the tree (active / completed / todo) more vivid. */
|
|
989
|
+
.badge.badge-active {
|
|
990
|
+
background: rgba(59, 130, 246, 0.18);
|
|
991
|
+
color: #93c5fd;
|
|
992
|
+
border: 1px solid rgba(59, 130, 246, 0.5);
|
|
993
|
+
}
|
|
994
|
+
.badge.badge-completed {
|
|
995
|
+
background: rgba(34, 197, 94, 0.18);
|
|
996
|
+
color: #86efac;
|
|
997
|
+
border: 1px solid rgba(34, 197, 94, 0.5);
|
|
998
|
+
}
|
|
999
|
+
.badge.badge-todo {
|
|
1000
|
+
background: rgba(148, 163, 184, 0.18);
|
|
1001
|
+
color: #cbd5e1;
|
|
1002
|
+
border: 1px solid rgba(148, 163, 184, 0.4);
|
|
1003
|
+
}
|
|
1004
|
+
.badge.badge-paused {
|
|
1005
|
+
background: rgba(245, 158, 11, 0.18);
|
|
1006
|
+
color: #fcd34d;
|
|
1007
|
+
border: 1px solid rgba(245, 158, 11, 0.45);
|
|
1008
|
+
}
|
|
1009
|
+
.badge.badge-cancelled {
|
|
1010
|
+
background: rgba(239, 68, 68, 0.18);
|
|
1011
|
+
color: #fca5a5;
|
|
1012
|
+
border: 1px solid rgba(239, 68, 68, 0.45);
|
|
1013
|
+
}
|
|
1014
|
+
.badge.badge-priority-high {
|
|
1015
|
+
background: rgba(239, 68, 68, 0.18);
|
|
1016
|
+
color: #fca5a5;
|
|
1017
|
+
border: 1px solid rgba(239, 68, 68, 0.45);
|
|
1018
|
+
}
|
|
1019
|
+
.badge.badge-priority-medium {
|
|
1020
|
+
background: rgba(245, 158, 11, 0.18);
|
|
1021
|
+
color: #fcd34d;
|
|
1022
|
+
border: 1px solid rgba(245, 158, 11, 0.45);
|
|
1023
|
+
}
|
|
1024
|
+
.badge.badge-priority-low {
|
|
1025
|
+
background: rgba(148, 163, 184, 0.18);
|
|
1026
|
+
color: #cbd5e1;
|
|
1027
|
+
border: 1px solid rgba(148, 163, 184, 0.4);
|
|
1028
|
+
}
|
|
1029
|
+
|