claude-code-kanban 4.26.0 → 4.27.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
@@ -5,6 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>CC Kanban</title>
7
7
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='6' fill='%231a1a1a'/%3E%3Crect x='4' y='6' width='7' height='20' rx='2' fill='%23e8927c'/%3E%3Crect x='13' y='6' width='7' height='14' rx='2' fill='%23e8927c'/%3E%3Crect x='22' y='6' width='7' height='8' rx='2' fill='%23e8927c'/%3E%3C/svg%3E">
8
+ <!-- Chrome uses the SVG only in the tab strip; app windows, shortcuts and the
9
+ history list need a raster icon or they fall back to /favicon.ico and then to
10
+ whatever icon localhost was last seen with, which is a sibling app's. -->
11
+ <link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192.png">
12
+ <link rel="icon" type="image/png" sizes="512x512" href="/icons/icon-512.png">
8
13
  <link rel="manifest" href="/manifest.json">
9
14
  <meta name="theme-color" content="#101114" media="(prefers-color-scheme: dark)">
10
15
  <meta name="theme-color" content="#e8e6e3" media="(prefers-color-scheme: light)">
package/public/style.css CHANGED
@@ -588,6 +588,9 @@ body::before {
588
588
 
589
589
  .session-item.kb-selected {
590
590
  border-color: var(--accent);
591
+ box-shadow:
592
+ inset 0 0 0 1px var(--accent),
593
+ 0 0 10px var(--accent-glow);
591
594
  }
592
595
 
593
596
  .session-item.stale {
@@ -645,7 +648,9 @@ body::before {
645
648
  padding-right: 22px;
646
649
  }
647
650
 
648
- .session-indicators .pulse {
651
+ .session-indicators .pulse,
652
+ .wf-live-name .pulse {
653
+ flex: none;
649
654
  width: 6px;
650
655
  height: 6px;
651
656
  background: var(--accent);
@@ -769,7 +774,10 @@ body::before {
769
774
  transition: width 0.5s ease-out;
770
775
  }
771
776
 
772
- .session-item:not(.active) .progress-fill {
777
+ /* The live-workflow bar takes the muted fill too: its card already carries a pulsing
778
+ accent dot, and a second accent bar under it shouts. */
779
+ .session-item:not(.active) .progress-fill,
780
+ .wf-live-bar .progress-fill {
773
781
  background: color-mix(in srgb, var(--text-tertiary) 55%, transparent);
774
782
  }
775
783
 
@@ -900,17 +908,6 @@ body::before {
900
908
  gap: 3px 10px;
901
909
  }
902
910
 
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
911
  .zen-scratchpad {
915
912
  display: flex;
916
913
  align-items: center;
@@ -3904,6 +3901,7 @@ body::before {
3904
3901
  }
3905
3902
 
3906
3903
  .linked-doc-list,
3904
+ .scratch-file-list,
3907
3905
  .artifact-list {
3908
3906
  list-style: none;
3909
3907
  padding: 0;
@@ -3914,6 +3912,7 @@ body::before {
3914
3912
  }
3915
3913
 
3916
3914
  .linked-doc-item,
3915
+ .scratch-file-item,
3917
3916
  .artifact-item {
3918
3917
  display: flex;
3919
3918
  align-items: baseline;
@@ -3922,11 +3921,16 @@ body::before {
3922
3921
  }
3923
3922
 
3924
3923
  .linked-doc-link,
3924
+ .scratch-file-link,
3925
3925
  .artifact-link {
3926
3926
  color: var(--accent-text);
3927
3927
  text-decoration: underline;
3928
3928
  text-decoration-style: dotted;
3929
3929
  text-underline-offset: 3px;
3930
+ }
3931
+
3932
+ .linked-doc-link,
3933
+ .artifact-link {
3930
3934
  flex-shrink: 0;
3931
3935
  }
3932
3936
 
@@ -3940,21 +3944,87 @@ body::before {
3940
3944
  min-width: 0;
3941
3945
  }
3942
3946
 
3947
+ .scratch-file-time {
3948
+ color: var(--text-muted);
3949
+ font-size: 11px;
3950
+ opacity: 0.7;
3951
+ white-space: nowrap;
3952
+ flex-shrink: 0;
3953
+ }
3954
+
3943
3955
  /* Rides on the shared .row-actions group; only the reveal trigger differs — per row
3944
3956
  here, per grid in the session info. margin-left:auto pins the group to the same
3945
3957
  right edge however long the names in between are. */
3946
3958
  .linked-doc-actions,
3959
+ .scratch-file-actions,
3947
3960
  .artifact-actions {
3948
3961
  margin-left: auto;
3949
3962
  align-self: center;
3950
3963
  flex-shrink: 0;
3964
+ /* Two .row-actions buttons wide (22px each, 4px gap), filled from the left, so a
3965
+ row with one action puts it in the same column as the rows that have two. */
3966
+ min-width: 48px;
3967
+ justify-content: flex-start;
3951
3968
  }
3952
3969
 
3953
3970
  .linked-doc-item:hover .linked-doc-actions,
3971
+ .scratch-file-item:hover .scratch-file-actions,
3954
3972
  .artifact-item:hover .artifact-actions {
3955
3973
  opacity: 1;
3956
3974
  }
3957
3975
 
3976
+ /* Hangs off the Scratchpad path row, so it carries no header of its own. */
3977
+ .scratch-files-section {
3978
+ margin-top: 6px;
3979
+ font-size: 11px;
3980
+ }
3981
+
3982
+ .scratch-file-link {
3983
+ background: none;
3984
+ border: none;
3985
+ padding: 0;
3986
+ font: inherit;
3987
+ cursor: pointer;
3988
+ text-align: left;
3989
+ /* A scratch name can be longer than the zen panel is wide; without this it pushes
3990
+ the action buttons out of their column. The full path is on the title. */
3991
+ min-width: 0;
3992
+ overflow: hidden;
3993
+ text-overflow: ellipsis;
3994
+ white-space: nowrap;
3995
+ }
3996
+
3997
+ .scratch-files-more {
3998
+ margin: 6px 0 0;
3999
+ font-size: 11px;
4000
+ }
4001
+
4002
+ /* A folder row wraps so its child list lands on its own full-width line under the
4003
+ name, indented one chevron in. */
4004
+ .scratch-folder-item {
4005
+ flex-wrap: wrap;
4006
+ }
4007
+
4008
+ .scratch-folder-item > .scratch-file-list,
4009
+ .scratch-folder-item > .scratch-folder-empty {
4010
+ flex-basis: 100%;
4011
+ margin-top: 4px;
4012
+ padding-left: 14px;
4013
+ }
4014
+
4015
+ .scratch-folder-empty {
4016
+ color: var(--text-muted);
4017
+ opacity: 0.7;
4018
+ }
4019
+
4020
+ .scratch-folder-toggle {
4021
+ display: inline-flex;
4022
+ align-items: center;
4023
+ gap: 4px;
4024
+ text-decoration: none;
4025
+ color: var(--text-secondary);
4026
+ }
4027
+
3958
4028
  /* The × is a glyph, not an svg, so .row-actions button svg does not size it. */
3959
4029
  .linked-doc-remove {
3960
4030
  font-family: var(--mono);
@@ -3978,15 +4048,107 @@ body::before {
3978
4048
  /* A section of the session panel: linked documents, artifacts. */
3979
4049
  .panel-section {
3980
4050
  margin-bottom: 16px;
3981
- font-size: 12px;
4051
+ padding-top: 10px;
4052
+ border-top: 1px solid var(--border);
4053
+ font-size: 11px;
4054
+ }
4055
+
4056
+ .linked-docs-section {
4057
+ margin-top: 12px;
3982
4058
  }
3983
4059
 
3984
4060
  /* Artifacts are read out of the transcript, so the section renders before the
3985
4061
  list arrives and stays in the DOM as the patch target when there is none. */
3986
- .artifacts-section:empty {
4062
+ .artifacts-section:empty,
4063
+ .scratch-files-section:empty,
4064
+ .workflow-live-section:empty {
3987
4065
  display: none;
3988
4066
  }
3989
4067
 
4068
+ /* Its own card below the zen panel — the run is live state, not session detail, so it
4069
+ comes and goes on its own while the panel above stays put. */
4070
+ .workflow-live-section {
4071
+ margin-top: 10px;
4072
+ padding: 10px;
4073
+ background: var(--bg-elevated);
4074
+ border: 1px solid var(--border);
4075
+ border-radius: 8px;
4076
+ font-size: 11px;
4077
+ }
4078
+
4079
+ .wf-live {
4080
+ cursor: pointer;
4081
+ }
4082
+
4083
+ .wf-live-name {
4084
+ display: flex;
4085
+ align-items: center;
4086
+ gap: 6px;
4087
+ font-size: 12px;
4088
+ font-weight: 500;
4089
+ color: var(--text-primary);
4090
+ overflow: hidden;
4091
+ text-overflow: ellipsis;
4092
+ white-space: nowrap;
4093
+ }
4094
+
4095
+ .wf-live-bar {
4096
+ margin: 6px 0;
4097
+ }
4098
+
4099
+ .wf-live-phases {
4100
+ display: flex;
4101
+ flex-wrap: wrap;
4102
+ gap: 4px;
4103
+ }
4104
+
4105
+ /* A phase reads as one chip, so the dot goes in ::before rather than costing a span. */
4106
+ .wf-live-phase {
4107
+ display: flex;
4108
+ align-items: center;
4109
+ gap: 4px;
4110
+ padding: 1px 6px;
4111
+ border: 1px solid var(--border);
4112
+ border-radius: 10px;
4113
+ font-size: 10px;
4114
+ color: var(--text-secondary);
4115
+ }
4116
+
4117
+ .wf-live-phase::before {
4118
+ content: '';
4119
+ width: 5px;
4120
+ height: 5px;
4121
+ border-radius: 50%;
4122
+ background: var(--text-muted);
4123
+ }
4124
+
4125
+ .wf-live-phase.running::before {
4126
+ background: var(--accent);
4127
+ animation: pulse 2s ease-in-out infinite;
4128
+ }
4129
+
4130
+ .wf-live-phase.done::before {
4131
+ background: var(--ok, #3fb950);
4132
+ }
4133
+
4134
+ .wf-live-phase.done {
4135
+ color: var(--text-muted);
4136
+ }
4137
+
4138
+ .wf-live-phase-count {
4139
+ font-family: var(--font-mono);
4140
+ }
4141
+
4142
+ .wf-live-running {
4143
+ margin-top: 6px;
4144
+ overflow: hidden;
4145
+ text-overflow: ellipsis;
4146
+ white-space: nowrap;
4147
+ font-family: var(--font-mono);
4148
+ font-size: 10px;
4149
+ color: var(--text-muted);
4150
+ }
4151
+
3990
4152
  .panel-section-header {
3991
4153
  display: flex;
3992
4154
  align-items: center;
@@ -4555,6 +4717,16 @@ body.light .msg-assistant .msg-text {
4555
4717
  padding-right: 8px;
4556
4718
  }
4557
4719
 
4720
+ #preview-modal-body .preview-image {
4721
+ display: block;
4722
+ max-width: 100%;
4723
+ max-height: 70vh;
4724
+ margin: 0 auto;
4725
+ border: 1px solid var(--border);
4726
+ border-radius: 4px;
4727
+ background: var(--bg-hover);
4728
+ }
4729
+
4558
4730
  #preview-modal-meta {
4559
4731
  margin-top: 12px;
4560
4732
  font-size: 11px;
@@ -4598,6 +4770,29 @@ body.light .msg-assistant .msg-text {
4598
4770
  padding-right: 0;
4599
4771
  }
4600
4772
 
4773
+ /* Source is read line by line, so it keeps its own line breaks and scrolls sideways
4774
+ instead of inheriting the body's `word-break: break-word`. */
4775
+ .preview-source {
4776
+ margin: 0;
4777
+ padding: 10px 12px;
4778
+ background: var(--bg-elevated);
4779
+ border: 1px solid var(--border);
4780
+ border-radius: 6px;
4781
+ overflow-x: auto;
4782
+ font-family: var(--mono);
4783
+ font-size: 12px;
4784
+ line-height: 1.55;
4785
+ white-space: pre;
4786
+ word-break: normal;
4787
+ tab-size: 4;
4788
+ }
4789
+
4790
+ .preview-source code {
4791
+ background: none;
4792
+ padding: 0;
4793
+ font: inherit;
4794
+ }
4795
+
4601
4796
  .preview-html-frame {
4602
4797
  width: 100%;
4603
4798
  height: 100%;
@@ -5753,7 +5948,8 @@ pre.mermaid svg {
5753
5948
 
5754
5949
  .project-group-header .group-chevron,
5755
5950
  .session-group-header .group-chevron,
5756
- .sg-section-toggle .group-chevron {
5951
+ .sg-section-toggle .group-chevron,
5952
+ .scratch-folder-toggle .group-chevron {
5757
5953
  transition: transform 0.15s ease;
5758
5954
  flex-shrink: 0;
5759
5955
  display: block;
@@ -5761,7 +5957,8 @@ pre.mermaid svg {
5761
5957
 
5762
5958
  .project-group-header.collapsed .group-chevron,
5763
5959
  .session-group-header.collapsed .group-chevron,
5764
- .sg-section-toggle.collapsed .group-chevron {
5960
+ .sg-section-toggle.collapsed .group-chevron,
5961
+ .scratch-folder-toggle.collapsed .group-chevron {
5765
5962
  transform: rotate(-90deg);
5766
5963
  }
5767
5964