@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.
Files changed (43) hide show
  1. package/README.md +121 -1
  2. package/dist/cli-tasks-adapter.d.ts +142 -0
  3. package/dist/cli-tasks-adapter.d.ts.map +1 -0
  4. package/dist/cli-tasks-adapter.js +379 -0
  5. package/dist/cli-tasks-adapter.js.map +1 -0
  6. package/dist/cli-tasks-tree-adapter.d.ts +143 -0
  7. package/dist/cli-tasks-tree-adapter.d.ts.map +1 -0
  8. package/dist/cli-tasks-tree-adapter.js +400 -0
  9. package/dist/cli-tasks-tree-adapter.js.map +1 -0
  10. package/dist/operations-cache.d.ts +44 -0
  11. package/dist/operations-cache.d.ts.map +1 -0
  12. package/dist/operations-cache.js +103 -0
  13. package/dist/operations-cache.js.map +1 -0
  14. package/dist/plugin.d.ts +14 -0
  15. package/dist/plugin.d.ts.map +1 -1
  16. package/dist/plugin.js +82 -0
  17. package/dist/plugin.js.map +1 -1
  18. package/dist/server.d.ts +30 -0
  19. package/dist/server.d.ts.map +1 -1
  20. package/dist/server.js +289 -89
  21. package/dist/server.js.map +1 -1
  22. package/dist/task-detail-mermaid.d.ts +171 -0
  23. package/dist/task-detail-mermaid.d.ts.map +1 -0
  24. package/dist/task-detail-mermaid.js +697 -0
  25. package/dist/task-detail-mermaid.js.map +1 -0
  26. package/dist/task-operations-html.d.ts +50 -0
  27. package/dist/task-operations-html.d.ts.map +1 -0
  28. package/dist/task-operations-html.js +187 -0
  29. package/dist/task-operations-html.js.map +1 -0
  30. package/dist/tasks-tree-cache.d.ts +44 -0
  31. package/dist/tasks-tree-cache.d.ts.map +1 -0
  32. package/dist/tasks-tree-cache.js +111 -0
  33. package/dist/tasks-tree-cache.js.map +1 -0
  34. package/dist/types.d.ts +16 -0
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/types.js.map +1 -1
  37. package/package.json +6 -1
  38. package/plugin.json +2 -2
  39. package/public/app.js +534 -34
  40. package/public/index.html +54 -21
  41. package/public/style.css +697 -1
  42. package/public/task-operations.js +290 -0
  43. 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
+