claude-code-kanban 4.24.0 → 4.26.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/public/index.html CHANGED
@@ -22,6 +22,7 @@
22
22
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/styles/github.min.css" id="hljs-theme-light" disabled>
23
23
  <script defer src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11/build/highlight.min.js"></script>
24
24
  <script defer src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
25
+ <script>window.__STORAGE_NS__ = null;</script>
25
26
  <script defer src="/app.js"></script>
26
27
  </head>
27
28
  <body>
@@ -59,6 +60,20 @@
59
60
  <span class="section-header-label">Sessions</span>
60
61
  <span id="filter-summary" class="filter-summary" title=""></span>
61
62
  <span class="section-header-actions">
63
+ <button
64
+ id="zen-mode-btn"
65
+ class="icon-btn section-btn"
66
+ onclick="event.stopPropagation(); toggleZenMode()"
67
+ title="Zen mode: current session only (Shift+Z)"
68
+ aria-label="Zen mode: current session only"
69
+ aria-pressed="false"
70
+ >
71
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
72
+ <circle cx="12" cy="12" r="7"/>
73
+ <circle cx="12" cy="12" r="2"/>
74
+ <path d="M12 1v3M12 20v3M1 12h3M20 12h3"/>
75
+ </svg>
76
+ </button>
62
77
  <button
63
78
  id="filter-menu-btn"
64
79
  class="icon-btn section-btn"
@@ -355,7 +370,7 @@
355
370
  </svg>
356
371
  </button>
357
372
  </div>
358
- <div class="modal-body modal-zoomable">
373
+ <div class="modal-body">
359
374
  <dl class="shortcuts" id="help-shortcuts"></dl>
360
375
  </div>
361
376
  </div>
@@ -611,8 +626,11 @@
611
626
  <div id="session-picker-modal" class="modal-overlay top-aligned" onclick="closeSessionPicker()">
612
627
  <div class="modal session-picker" onclick="event.stopPropagation()">
613
628
  <input type="text" id="session-picker-input" class="form-input sp-input" placeholder="Jump to session..." autocomplete="off" spellcheck="false">
614
- <div id="session-picker-list" class="sp-list"></div>
615
- <div class="sp-hint"><kbd>&uarr;</kbd><kbd>&darr;</kbd> move &middot; <kbd>Enter</kbd> open &middot; <kbd>Esc</kbd> close</div>
629
+ <div class="sp-body">
630
+ <div id="session-picker-list" class="sp-list"></div>
631
+ <div id="session-picker-peek" class="sp-peek"></div>
632
+ </div>
633
+ <div class="sp-hint"><kbd>&uarr;</kbd><kbd>&darr;</kbd> move &middot; <kbd>Enter</kbd> open &middot; <kbd>Ctrl</kbd><kbd>Space</kbd> peek &middot; <kbd>Esc</kbd> close</div>
616
634
  </div>
617
635
  </div>
618
636
 
package/public/style.css CHANGED
@@ -9,6 +9,9 @@
9
9
  --bg-surface: #16181c;
10
10
  --bg-elevated: #1e2025;
11
11
  --bg-hover: #282a30;
12
+ /* Selection reads as a recess against the darker surface here, but light theme's deep tone
13
+ sits within a shade of the sidebar, so there it has to rise instead. */
14
+ --session-active-bg: var(--bg-deep);
12
15
  --border: #363840;
13
16
  --text-primary: #f0f1f3;
14
17
  --text-secondary: #c2c4c9;
@@ -440,7 +443,8 @@ body::before {
440
443
  }
441
444
 
442
445
  /* Ember only while something is actually filtered — at rest the funnel is just chrome. */
443
- .icon-btn.section-btn.has-filters {
446
+ .icon-btn.section-btn.has-filters,
447
+ .icon-btn.section-btn.active {
444
448
  color: var(--accent-text);
445
449
  }
446
450
 
@@ -575,17 +579,15 @@ body::before {
575
579
  transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
576
580
  }
577
581
 
578
- /* `.active` is the open session, `.kb-selected` the keyboard cursor. The cursor
579
- must win when both land on one card, which is why it is ordered second. */
582
+ /* `.active` is the open session, `.kb-selected` the keyboard cursor. They own different
583
+ properties — fill and border — so the cursor landing on the open session adds to it
584
+ instead of replacing how it looks. */
580
585
  .session-item.active {
581
- background: var(--bg-deep);
582
- border-color: var(--accent);
586
+ background: var(--session-active-bg);
583
587
  }
584
588
 
585
589
  .session-item.kb-selected {
586
- background: var(--bg-elevated);
587
590
  border-color: var(--accent);
588
- box-shadow: 0 0 0 1px var(--accent-dim);
589
591
  }
590
592
 
591
593
  .session-item.stale {
@@ -633,7 +635,8 @@ body::before {
633
635
  }
634
636
 
635
637
  .session-name {
636
- font-size: 13px;
638
+ font-size: 14px;
639
+ font-weight: 500;
637
640
  color: var(--text-primary);
638
641
  white-space: nowrap;
639
642
  overflow: hidden;
@@ -671,6 +674,26 @@ body::before {
671
674
  overflow: hidden;
672
675
  }
673
676
 
677
+ /* inline-block, not inline-flex: a flex box ignores text-overflow, so a long worktree name
678
+ ran past the card edge instead of truncating. */
679
+ .wt-chip {
680
+ display: inline-block;
681
+ max-width: 60%;
682
+ margin-left: 5px;
683
+ padding: 0 5px;
684
+ border: 1px solid var(--accent-dim);
685
+ border-radius: 999px;
686
+ background: var(--accent-dim);
687
+ color: var(--accent-text);
688
+ font-family: var(--mono);
689
+ font-size: 9px;
690
+ line-height: 14px;
691
+ vertical-align: middle;
692
+ white-space: nowrap;
693
+ overflow: hidden;
694
+ text-overflow: ellipsis;
695
+ }
696
+
674
697
  .session-branch {
675
698
  font-size: 10px;
676
699
  color: var(--text-secondary);
@@ -858,6 +881,68 @@ body::before {
858
881
  color: var(--text-secondary);
859
882
  }
860
883
 
884
+ /* Zen view: the sidebar holds one card, so the usage detail that normally lives behind the
885
+ info modal gets rendered underneath it. */
886
+ .zen-panel {
887
+ margin-top: 10px;
888
+ /* No bottom padding: the linked-docs section that always closes the panel carries its own. */
889
+ padding: 10px 10px 0;
890
+ background: var(--bg-elevated);
891
+ border: 1px solid var(--border);
892
+ border-radius: 8px;
893
+ }
894
+
895
+ .zen-panel .detail-context {
896
+ margin-bottom: 0;
897
+ }
898
+
899
+ .zen-panel .detail-context-stats {
900
+ gap: 3px 10px;
901
+ }
902
+
903
+ .zen-panel .linked-docs-section {
904
+ margin-top: 12px;
905
+ padding-top: 10px;
906
+ border-top: 1px solid var(--border);
907
+ }
908
+
909
+ .zen-panel .artifacts-section {
910
+ padding-top: 10px;
911
+ border-top: 1px solid var(--border);
912
+ }
913
+
914
+ .zen-scratchpad {
915
+ display: flex;
916
+ align-items: center;
917
+ gap: 8px;
918
+ margin-top: 12px;
919
+ padding-top: 10px;
920
+ border-top: 1px solid var(--border);
921
+ font-size: 11px;
922
+ }
923
+
924
+ .zen-scratchpad-label {
925
+ font-weight: 500;
926
+ color: var(--text-muted);
927
+ text-transform: uppercase;
928
+ letter-spacing: 0.5px;
929
+ white-space: nowrap;
930
+ }
931
+
932
+ .zen-scratchpad-path {
933
+ flex: 1;
934
+ min-width: 0;
935
+ overflow: hidden;
936
+ text-overflow: ellipsis;
937
+ white-space: nowrap;
938
+ font-family: var(--font-mono);
939
+ color: var(--text-secondary);
940
+ }
941
+
942
+ .zen-panel:hover .row-actions {
943
+ opacity: 1;
944
+ }
945
+
861
946
  .session-time {
862
947
  font-size: 11px;
863
948
  font-weight: 450;
@@ -2264,7 +2349,8 @@ body::before {
2264
2349
  flex-direction: column;
2265
2350
  }
2266
2351
  #team-modal .modal-body,
2267
- #agent-modal .modal-body {
2352
+ #agent-modal .modal-body,
2353
+ .modal-help .modal-body {
2268
2354
  flex: 1 1 auto;
2269
2355
  overflow-y: auto;
2270
2356
  min-height: 0;
@@ -2349,7 +2435,6 @@ body::before {
2349
2435
  padding: 10px 14px;
2350
2436
  background: var(--bg-elevated);
2351
2437
  border: 1px solid var(--border);
2352
- border-left: 3px solid var(--warning);
2353
2438
  border-radius: 8px;
2354
2439
  }
2355
2440
  .info-goal-head {
@@ -3818,7 +3903,8 @@ body::before {
3818
3903
  color: var(--text-primary);
3819
3904
  }
3820
3905
 
3821
- .linked-doc-list {
3906
+ .linked-doc-list,
3907
+ .artifact-list {
3822
3908
  list-style: none;
3823
3909
  padding: 0;
3824
3910
  margin: 0;
@@ -3827,14 +3913,16 @@ body::before {
3827
3913
  gap: 4px;
3828
3914
  }
3829
3915
 
3830
- .linked-doc-item {
3916
+ .linked-doc-item,
3917
+ .artifact-item {
3831
3918
  display: flex;
3832
3919
  align-items: baseline;
3833
3920
  gap: 8px;
3834
3921
  min-width: 0;
3835
3922
  }
3836
3923
 
3837
- .linked-doc-link {
3924
+ .linked-doc-link,
3925
+ .artifact-link {
3838
3926
  color: var(--accent-text);
3839
3927
  text-decoration: underline;
3840
3928
  text-decoration-style: dotted;
@@ -3855,13 +3943,15 @@ body::before {
3855
3943
  /* Rides on the shared .row-actions group; only the reveal trigger differs — per row
3856
3944
  here, per grid in the session info. margin-left:auto pins the group to the same
3857
3945
  right edge however long the names in between are. */
3858
- .linked-doc-actions {
3946
+ .linked-doc-actions,
3947
+ .artifact-actions {
3859
3948
  margin-left: auto;
3860
3949
  align-self: center;
3861
3950
  flex-shrink: 0;
3862
3951
  }
3863
3952
 
3864
- .linked-doc-item:hover .linked-doc-actions {
3953
+ .linked-doc-item:hover .linked-doc-actions,
3954
+ .artifact-item:hover .artifact-actions {
3865
3955
  opacity: 1;
3866
3956
  }
3867
3957
 
@@ -3885,7 +3975,55 @@ body::before {
3885
3975
  text-decoration-style: dashed;
3886
3976
  }
3887
3977
 
3888
- .linked-docs-empty {
3978
+ /* A section of the session panel: linked documents, artifacts. */
3979
+ .panel-section {
3980
+ margin-bottom: 16px;
3981
+ font-size: 12px;
3982
+ }
3983
+
3984
+ /* Artifacts are read out of the transcript, so the section renders before the
3985
+ list arrives and stays in the DOM as the patch target when there is none. */
3986
+ .artifacts-section:empty {
3987
+ display: none;
3988
+ }
3989
+
3990
+ .panel-section-header {
3991
+ display: flex;
3992
+ align-items: center;
3993
+ gap: 6px;
3994
+ margin-bottom: 6px;
3995
+ font-size: 11px;
3996
+ font-weight: 500;
3997
+ color: var(--text-muted);
3998
+ text-transform: uppercase;
3999
+ letter-spacing: 0.5px;
4000
+ }
4001
+
4002
+ .panel-section-header svg {
4003
+ width: 12px;
4004
+ height: 12px;
4005
+ }
4006
+
4007
+ .panel-section-count {
4008
+ background: var(--bg-elevated);
4009
+ border: 1px solid var(--border);
4010
+ border-radius: 10px;
4011
+ padding: 0 6px;
4012
+ font-size: 10px;
4013
+ color: var(--text-secondary);
4014
+ }
4015
+
4016
+ /* The artifact title is a URL away from the reader, so it truncates where a file
4017
+ name, which the linked-doc row shows in full, does not. */
4018
+ .artifact-link {
4019
+ overflow: hidden;
4020
+ text-overflow: ellipsis;
4021
+ white-space: nowrap;
4022
+ min-width: 0;
4023
+ }
4024
+
4025
+ .linked-docs-empty,
4026
+ .zen-panel-empty {
3889
4027
  color: var(--text-muted);
3890
4028
  font-size: 11px;
3891
4029
  font-style: italic;
@@ -4122,6 +4260,7 @@ body.light {
4122
4260
  --bg-surface: #efede9;
4123
4261
  --bg-elevated: #fbfaf9;
4124
4262
  --bg-hover: #d2d0cc;
4263
+ --session-active-bg: var(--bg-elevated);
4125
4264
  --border: #cfcbc4;
4126
4265
  --text-primary: #0a0a0a;
4127
4266
  --text-secondary: #444444;
@@ -4519,8 +4658,21 @@ body.light .msg-assistant .msg-text {
4519
4658
  max-width: 440px;
4520
4659
  }
4521
4660
 
4661
+ /* Reference card, not reading material: it stays out of the modal zoom, uses the app's
4662
+ small type, and scrolls its body (rule shared with #team-modal) instead of growing past
4663
+ the viewport cap. */
4522
4664
  .modal-help {
4523
- max-width: 960px;
4665
+ max-width: 900px;
4666
+ padding: 16px 20px 20px;
4667
+ display: flex;
4668
+ flex-direction: column;
4669
+ font-size: 13px;
4670
+ }
4671
+ .modal-help .modal-header {
4672
+ margin-bottom: 8px;
4673
+ }
4674
+ .modal-help .modal-title {
4675
+ font-size: 14px;
4524
4676
  }
4525
4677
 
4526
4678
  /* One shared grid for both halves (key | label | spacer | key | label): each key
@@ -4844,13 +4996,59 @@ select.form-input option:checked {
4844
4996
  font-size: 13px;
4845
4997
  }
4846
4998
 
4999
+ .modal.session-picker.peeking {
5000
+ max-width: 1240px;
5001
+ }
5002
+
5003
+ .sp-body {
5004
+ display: flex;
5005
+ gap: 10px;
5006
+ min-height: 0;
5007
+ }
5008
+
5009
+ .sp-body > * {
5010
+ min-width: 0;
5011
+ }
5012
+
4847
5013
  .sp-list {
5014
+ flex: 1;
4848
5015
  overflow-y: auto;
4849
5016
  display: flex;
4850
5017
  flex-direction: column;
4851
5018
  gap: 2px;
4852
5019
  }
4853
5020
 
5021
+ .sp-peek {
5022
+ flex: 0 0 42%;
5023
+ overflow-y: auto;
5024
+ border-left: 1px solid var(--border);
5025
+ padding-left: 10px;
5026
+ }
5027
+
5028
+ .modal.session-picker:not(.peeking) .sp-peek {
5029
+ display: none;
5030
+ }
5031
+
5032
+ .sp-peek-title {
5033
+ display: flex;
5034
+ align-items: center;
5035
+ justify-content: space-between;
5036
+ gap: 8px;
5037
+ margin-bottom: 6px;
5038
+ font-family: var(--mono);
5039
+ font-size: 11px;
5040
+ color: var(--text-muted);
5041
+ white-space: nowrap;
5042
+ overflow: hidden;
5043
+ text-overflow: ellipsis;
5044
+ }
5045
+
5046
+ /* Row clicks open the live panel's detail modal by index, which means nothing
5047
+ for a peeked session. The renderer's readOnly mode already drops the buttons. */
5048
+ .sp-peek-items {
5049
+ pointer-events: none;
5050
+ }
5051
+
4854
5052
  .sp-row {
4855
5053
  display: flex;
4856
5054
  align-items: center;
@@ -5391,6 +5589,7 @@ select.form-input option:checked {
5391
5589
  --bg-surface: #efede9;
5392
5590
  --bg-elevated: #fbfaf9;
5393
5591
  --bg-hover: #d2d0cc;
5592
+ --session-active-bg: var(--bg-elevated);
5394
5593
  --border: #cfcbc4;
5395
5594
  --text-primary: #0a0a0a;
5396
5595
  --text-secondary: #444444;