claude-code-kanban 4.20.0 → 4.22.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/style.css CHANGED
@@ -29,6 +29,22 @@
29
29
  --team-dim: rgba(96, 165, 250, 0.18);
30
30
  --plan: #86a886;
31
31
  --plan-dim: rgba(134, 168, 134, 0.18);
32
+ --ansi-black: var(--text-muted);
33
+ --ansi-red: #e06c66;
34
+ --ansi-green: #3ecf8e;
35
+ --ansi-yellow: #e0b04a;
36
+ --ansi-blue: #60a5fa;
37
+ --ansi-magenta: #c98ce0;
38
+ --ansi-cyan: #4dc9c9;
39
+ --ansi-white: var(--text-secondary);
40
+ --ansi-bright-black: var(--text-tertiary);
41
+ --ansi-bright-red: #ff8a84;
42
+ --ansi-bright-green: #5ee3a8;
43
+ --ansi-bright-yellow: #f0c56a;
44
+ --ansi-bright-blue: #8bbdfb;
45
+ --ansi-bright-magenta: #e0a8f0;
46
+ --ansi-bright-cyan: #7ddede;
47
+ --ansi-bright-white: var(--text-primary);
32
48
  --mono: 'IBM Plex Mono', monospace;
33
49
  --serif: 'Playfair Display', serif;
34
50
  --card-gap: 7px;
@@ -623,7 +639,12 @@ body::before {
623
639
  text-overflow: ellipsis;
624
640
  }
625
641
 
642
+ /* inline-flex so only the text takes the click — a full-width row would swallow clicks
643
+ meant for the card itself */
626
644
  .session-goal {
645
+ display: inline-flex;
646
+ align-items: baseline;
647
+ max-width: 100%;
627
648
  font-size: 10px;
628
649
  margin-top: var(--card-gap-tight);
629
650
  white-space: nowrap;
@@ -635,8 +656,13 @@ body::before {
635
656
  .session-goal .session-goal-icon {
636
657
  margin-right: 3px;
637
658
  font-weight: 700;
659
+ flex-shrink: 0;
660
+ }
661
+ .session-goal .session-goal-text {
662
+ overflow: hidden;
663
+ text-overflow: ellipsis;
638
664
  }
639
- .session-goal:hover {
665
+ .session-goal:hover .session-goal-text {
640
666
  text-decoration: underline;
641
667
  text-underline-offset: 2px;
642
668
  }
@@ -2299,16 +2325,18 @@ body::before {
2299
2325
  align-items: center;
2300
2326
  margin-bottom: 16px;
2301
2327
  }
2302
- .info-row-actions {
2328
+ /* Shared hover-reveal icon-button group, also used by the linked-doc rows. Each host
2329
+ supplies its own reveal trigger — the base only sets the resting opacity. */
2330
+ .row-actions {
2303
2331
  display: flex;
2304
2332
  gap: 4px;
2305
2333
  opacity: 0.3;
2306
2334
  transition: opacity 0.15s ease;
2307
2335
  }
2308
- .info-grid:hover .info-row-actions {
2336
+ .info-grid:hover .row-actions {
2309
2337
  opacity: 1;
2310
2338
  }
2311
- .info-row-actions button {
2339
+ .row-actions button {
2312
2340
  display: inline-flex;
2313
2341
  align-items: center;
2314
2342
  justify-content: center;
@@ -2325,18 +2353,18 @@ body::before {
2325
2353
  border-color 0.1s ease,
2326
2354
  color 0.1s ease;
2327
2355
  }
2328
- .info-row-actions button:hover {
2356
+ .row-actions button:hover {
2329
2357
  background: var(--bg-hover);
2330
2358
  border-color: var(--accent);
2331
2359
  color: var(--accent-text);
2332
2360
  }
2333
- .info-row-actions button svg {
2361
+ .row-actions button svg {
2334
2362
  width: 12px;
2335
2363
  height: 12px;
2336
2364
  display: block;
2337
2365
  }
2338
2366
  @media (hover: none) {
2339
- .info-row-actions {
2367
+ .row-actions {
2340
2368
  opacity: 1;
2341
2369
  }
2342
2370
  }
@@ -3041,6 +3069,249 @@ body::before {
3041
3069
  background: color-mix(in srgb, var(--warning, #f5a623) 16%, transparent);
3042
3070
  }
3043
3071
  }
3072
+ .msg-waiting-footer {
3073
+ display: flex;
3074
+ align-items: center;
3075
+ justify-content: space-between;
3076
+ gap: 8px;
3077
+ margin-top: 4px;
3078
+ }
3079
+ .msg-waiting-footer .msg-time {
3080
+ margin-top: 0;
3081
+ }
3082
+ .msg-waiting-actions {
3083
+ flex-shrink: 0;
3084
+ display: flex;
3085
+ gap: 6px;
3086
+ }
3087
+ .msg-waiting-actions button {
3088
+ border: 1px solid transparent;
3089
+ border-radius: 4px;
3090
+ padding: 2px 8px;
3091
+ font-family: var(--mono);
3092
+ font-size: 11px;
3093
+ font-weight: 600;
3094
+ cursor: pointer;
3095
+ background: none;
3096
+ }
3097
+ #msg-detail-waiting-footer {
3098
+ display: flex;
3099
+ gap: 8px;
3100
+ justify-content: flex-end;
3101
+ padding: 10px 20px;
3102
+ border-top: 1px solid var(--border);
3103
+ flex-shrink: 0;
3104
+ }
3105
+ #msg-detail-waiting-footer:empty {
3106
+ display: none;
3107
+ }
3108
+ #msg-detail-waiting-footer .waiting-option-input,
3109
+ #plan-approval-footer .waiting-option-input {
3110
+ flex: 1;
3111
+ margin: 0;
3112
+ }
3113
+ #plan-approval-footer {
3114
+ display: flex;
3115
+ gap: 8px;
3116
+ align-items: center;
3117
+ flex: 1;
3118
+ }
3119
+ .waiting-actions {
3120
+ display: flex;
3121
+ flex-direction: column;
3122
+ align-items: stretch;
3123
+ gap: 12px;
3124
+ margin-top: 14px;
3125
+ }
3126
+ .waiting-btn-allow,
3127
+ .waiting-btn-deny {
3128
+ border: 1px solid var(--border);
3129
+ border-radius: 4px;
3130
+ padding: 6px 16px;
3131
+ font-family: var(--mono);
3132
+ font-size: 12px;
3133
+ font-weight: 500;
3134
+ background: none;
3135
+ cursor: pointer;
3136
+ transition: all 0.15s ease;
3137
+ }
3138
+ /* One quiet color treatment for both button families — the card's compact
3139
+ buttons need the descendant selector to out-rank `.msg-waiting-actions button` */
3140
+ .waiting-btn-allow,
3141
+ .msg-waiting-actions .msg-waiting-allow {
3142
+ color: var(--success, #2ea043);
3143
+ border-color: color-mix(in srgb, var(--success, #2ea043) 35%, transparent);
3144
+ }
3145
+ .waiting-btn-allow:hover:not(:disabled),
3146
+ .msg-waiting-actions .msg-waiting-allow:hover {
3147
+ background: color-mix(in srgb, var(--success, #2ea043) 10%, transparent);
3148
+ }
3149
+ .waiting-btn-deny,
3150
+ .msg-waiting-actions .msg-waiting-deny {
3151
+ color: var(--danger, #f85149);
3152
+ border-color: color-mix(in srgb, var(--danger, #f85149) 35%, transparent);
3153
+ }
3154
+ .waiting-btn-deny:hover,
3155
+ .msg-waiting-actions .msg-waiting-deny:hover {
3156
+ background: color-mix(in srgb, var(--danger, #f85149) 10%, transparent);
3157
+ }
3158
+ .waiting-btn-allow:disabled {
3159
+ opacity: 0.4;
3160
+ cursor: default;
3161
+ }
3162
+ .waiting-raw-input {
3163
+ margin-bottom: 12px;
3164
+ }
3165
+ .waiting-raw-input summary {
3166
+ font-size: 11px;
3167
+ color: var(--text-secondary);
3168
+ cursor: pointer;
3169
+ user-select: none;
3170
+ }
3171
+ .waiting-question {
3172
+ border: 1px solid var(--border);
3173
+ border-radius: 6px;
3174
+ padding: 12px 14px;
3175
+ background: color-mix(in srgb, var(--bg-deep) 40%, transparent);
3176
+ }
3177
+ .waiting-question-header {
3178
+ display: inline-block;
3179
+ font-size: 10px;
3180
+ font-weight: 600;
3181
+ text-transform: uppercase;
3182
+ letter-spacing: 0.5px;
3183
+ color: var(--accent);
3184
+ margin-bottom: 4px;
3185
+ }
3186
+ .waiting-question-text {
3187
+ font-weight: 600;
3188
+ font-size: 13px;
3189
+ line-height: 1.5;
3190
+ margin-bottom: 10px;
3191
+ }
3192
+ /* Question text and option descriptions render as markdown (like the TUI),
3193
+ so fenced diagrams, tables, and mermaid keep their shape. */
3194
+ .waiting-question-text p,
3195
+ .waiting-option-desc p,
3196
+ .waiting-option-preview p {
3197
+ margin: 0 0 6px;
3198
+ }
3199
+ .waiting-question-text p:last-child,
3200
+ .waiting-option-desc p:last-child,
3201
+ .waiting-option-preview p:last-child {
3202
+ margin-bottom: 0;
3203
+ }
3204
+ .waiting-question-text pre,
3205
+ .waiting-option-desc pre {
3206
+ font-weight: 400;
3207
+ overflow-x: auto;
3208
+ padding: 8px 10px;
3209
+ border: 1px solid var(--border);
3210
+ border-radius: 4px;
3211
+ background: var(--bg-primary);
3212
+ }
3213
+ .waiting-question-text pre.mermaid,
3214
+ .waiting-option-desc pre.mermaid {
3215
+ background: none;
3216
+ border: none;
3217
+ text-align: center;
3218
+ }
3219
+ .waiting-question-text table,
3220
+ .waiting-option-desc table {
3221
+ border-collapse: collapse;
3222
+ font-weight: 400;
3223
+ }
3224
+ .waiting-question-text th,
3225
+ .waiting-question-text td,
3226
+ .waiting-option-desc th,
3227
+ .waiting-option-desc td {
3228
+ border: 1px solid var(--border);
3229
+ padding: 3px 8px;
3230
+ }
3231
+ .waiting-options {
3232
+ display: flex;
3233
+ flex-direction: column;
3234
+ gap: 6px;
3235
+ }
3236
+ .waiting-option {
3237
+ display: flex;
3238
+ flex-direction: column;
3239
+ gap: 2px;
3240
+ width: 100%;
3241
+ text-align: left;
3242
+ border: 1px solid var(--border);
3243
+ border-radius: 4px;
3244
+ padding: 8px 12px;
3245
+ font-family: var(--mono);
3246
+ font-size: 12px;
3247
+ background: none;
3248
+ color: var(--text-primary);
3249
+ cursor: pointer;
3250
+ transition:
3251
+ border-color 0.15s ease,
3252
+ background 0.15s ease;
3253
+ }
3254
+ .waiting-option:hover {
3255
+ border-color: var(--accent);
3256
+ }
3257
+ .waiting-option.selected {
3258
+ border-color: var(--accent);
3259
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
3260
+ }
3261
+ .waiting-option-label {
3262
+ font-weight: 600;
3263
+ }
3264
+ .waiting-option-desc {
3265
+ display: block;
3266
+ font-size: 11px;
3267
+ line-height: 1.45;
3268
+ color: var(--text-secondary);
3269
+ }
3270
+ .waiting-option-preview {
3271
+ display: block;
3272
+ margin-top: 6px;
3273
+ padding: 8px 10px;
3274
+ border: 1px solid var(--border);
3275
+ border-radius: 4px;
3276
+ background: var(--bg-primary);
3277
+ font-size: 11px;
3278
+ font-weight: 400;
3279
+ overflow-x: auto;
3280
+ }
3281
+ .waiting-option-preview pre {
3282
+ margin: 0;
3283
+ overflow-x: auto;
3284
+ background: none;
3285
+ }
3286
+ .waiting-question-multi {
3287
+ display: inline-block;
3288
+ margin-left: 6px;
3289
+ padding: 1px 6px;
3290
+ border: 1px solid var(--border);
3291
+ border-radius: 10px;
3292
+ font-size: 10px;
3293
+ color: var(--text-secondary);
3294
+ }
3295
+ .waiting-option-input {
3296
+ width: 100%;
3297
+ margin-top: 6px;
3298
+ border: 1px dashed var(--border);
3299
+ border-radius: 4px;
3300
+ padding: 8px 12px;
3301
+ font-family: var(--mono);
3302
+ font-size: 12px;
3303
+ background: none;
3304
+ color: var(--text-primary);
3305
+ transition: border-color 0.15s ease;
3306
+ }
3307
+ .waiting-option-input:hover,
3308
+ .waiting-option-input:focus {
3309
+ border-color: var(--accent);
3310
+ outline: none;
3311
+ }
3312
+ .waiting-option-input::placeholder {
3313
+ color: var(--text-secondary);
3314
+ }
3044
3315
  .msg-item.msg-idle .msg-icon {
3045
3316
  width: 12px;
3046
3317
  height: 12px;
@@ -3492,36 +3763,29 @@ body::before {
3492
3763
  min-width: 0;
3493
3764
  }
3494
3765
 
3495
- /* margin-left:auto pins every × to the same right edge, so they read as a column
3496
- however long the names in between are. */
3497
- .linked-doc-remove {
3766
+ /* Rides on the shared .row-actions group; only the reveal trigger differs — per row
3767
+ here, per grid in the session info. margin-left:auto pins the group to the same
3768
+ right edge however long the names in between are. */
3769
+ .linked-doc-actions {
3498
3770
  margin-left: auto;
3499
3771
  align-self: center;
3500
3772
  flex-shrink: 0;
3501
- width: 16px;
3502
- height: 16px;
3503
- display: inline-flex;
3504
- align-items: center;
3505
- justify-content: center;
3506
- padding: 0;
3507
- background: none;
3508
- border: none;
3509
- border-radius: 3px;
3510
- color: var(--text-muted);
3511
- font-family: var(--mono);
3512
- font-size: 14px;
3513
- line-height: 1;
3514
- cursor: pointer;
3515
- opacity: 0.45;
3516
- transition: all 0.15s ease;
3517
3773
  }
3518
3774
 
3519
- .linked-doc-item:hover .linked-doc-remove {
3775
+ .linked-doc-item:hover .linked-doc-actions {
3520
3776
  opacity: 1;
3521
3777
  }
3522
3778
 
3523
- .linked-doc-remove:hover {
3779
+ /* The × is a glyph, not an svg, so .row-actions button svg does not size it. */
3780
+ .linked-doc-remove {
3781
+ font-family: var(--mono);
3782
+ font-size: 15px;
3783
+ line-height: 1;
3784
+ }
3785
+
3786
+ .linked-doc-actions .linked-doc-remove:hover {
3524
3787
  background: var(--danger-dim);
3788
+ border-color: var(--danger);
3525
3789
  color: var(--danger);
3526
3790
  }
3527
3791
 
@@ -3610,11 +3874,17 @@ body::before {
3610
3874
  background: var(--warning-dim);
3611
3875
  border: 1px solid var(--warning);
3612
3876
  border-radius: 8px;
3877
+ font-family: var(--mono);
3613
3878
  font-size: 12px;
3614
3879
  color: var(--warning);
3615
3880
  white-space: nowrap;
3881
+ cursor: pointer;
3616
3882
  animation: permission-pulse 1.5s ease-in-out infinite;
3617
3883
  }
3884
+ .permission-badge:hover {
3885
+ background: color-mix(in srgb, var(--warning) 22%, transparent);
3886
+ animation-play-state: paused;
3887
+ }
3618
3888
  @keyframes permission-pulse {
3619
3889
  0%,
3620
3890
  100% {
@@ -3627,6 +3897,136 @@ body::before {
3627
3897
 
3628
3898
  /* #endregion */
3629
3899
 
3900
+ /* #region ANSI */
3901
+
3902
+ /* SGR colours from terminal output, consumed by every pane that renders it.
3903
+ The palette itself lives with the other colour tokens in VARIABLES /
3904
+ LIGHT_THEME / MEDIA_QUERIES, so it flips with the theme like everything else. */
3905
+ .ansi-fg-black {
3906
+ color: var(--ansi-black);
3907
+ }
3908
+ .ansi-fg-red {
3909
+ color: var(--ansi-red);
3910
+ }
3911
+ .ansi-fg-green {
3912
+ color: var(--ansi-green);
3913
+ }
3914
+ .ansi-fg-yellow {
3915
+ color: var(--ansi-yellow);
3916
+ }
3917
+ .ansi-fg-blue {
3918
+ color: var(--ansi-blue);
3919
+ }
3920
+ .ansi-fg-magenta {
3921
+ color: var(--ansi-magenta);
3922
+ }
3923
+ .ansi-fg-cyan {
3924
+ color: var(--ansi-cyan);
3925
+ }
3926
+ .ansi-fg-white {
3927
+ color: var(--ansi-white);
3928
+ }
3929
+ .ansi-fg-bright-black {
3930
+ color: var(--ansi-bright-black);
3931
+ }
3932
+ .ansi-fg-bright-red {
3933
+ color: var(--ansi-bright-red);
3934
+ }
3935
+ .ansi-fg-bright-green {
3936
+ color: var(--ansi-bright-green);
3937
+ }
3938
+ .ansi-fg-bright-yellow {
3939
+ color: var(--ansi-bright-yellow);
3940
+ }
3941
+ .ansi-fg-bright-blue {
3942
+ color: var(--ansi-bright-blue);
3943
+ }
3944
+ .ansi-fg-bright-magenta {
3945
+ color: var(--ansi-bright-magenta);
3946
+ }
3947
+ .ansi-fg-bright-cyan {
3948
+ color: var(--ansi-bright-cyan);
3949
+ }
3950
+ .ansi-fg-bright-white {
3951
+ color: var(--ansi-bright-white);
3952
+ }
3953
+ .ansi-bg-black {
3954
+ background: var(--ansi-black);
3955
+ }
3956
+ .ansi-bg-red {
3957
+ background: var(--ansi-red);
3958
+ }
3959
+ .ansi-bg-green {
3960
+ background: var(--ansi-green);
3961
+ }
3962
+ .ansi-bg-yellow {
3963
+ background: var(--ansi-yellow);
3964
+ }
3965
+ .ansi-bg-blue {
3966
+ background: var(--ansi-blue);
3967
+ }
3968
+ .ansi-bg-magenta {
3969
+ background: var(--ansi-magenta);
3970
+ }
3971
+ .ansi-bg-cyan {
3972
+ background: var(--ansi-cyan);
3973
+ }
3974
+ .ansi-bg-white {
3975
+ background: var(--ansi-white);
3976
+ }
3977
+ .ansi-bg-bright-black {
3978
+ background: var(--ansi-bright-black);
3979
+ }
3980
+ .ansi-bg-bright-red {
3981
+ background: var(--ansi-bright-red);
3982
+ }
3983
+ .ansi-bg-bright-green {
3984
+ background: var(--ansi-bright-green);
3985
+ }
3986
+ .ansi-bg-bright-yellow {
3987
+ background: var(--ansi-bright-yellow);
3988
+ }
3989
+ .ansi-bg-bright-blue {
3990
+ background: var(--ansi-bright-blue);
3991
+ }
3992
+ .ansi-bg-bright-magenta {
3993
+ background: var(--ansi-bright-magenta);
3994
+ }
3995
+ .ansi-bg-bright-cyan {
3996
+ background: var(--ansi-bright-cyan);
3997
+ }
3998
+ .ansi-bg-bright-white {
3999
+ background: var(--ansi-bright-white);
4000
+ }
4001
+ .ansi-bg {
4002
+ padding: 0 1px;
4003
+ border-radius: 2px;
4004
+ }
4005
+ .ansi-inverse {
4006
+ background: var(--text-primary);
4007
+ color: var(--bg-deep);
4008
+ }
4009
+ .ansi-bold {
4010
+ font-weight: 700;
4011
+ }
4012
+ .ansi-dim {
4013
+ opacity: 0.65;
4014
+ }
4015
+ .ansi-italic {
4016
+ font-style: italic;
4017
+ }
4018
+ .ansi-underline {
4019
+ text-decoration: underline;
4020
+ }
4021
+ .ansi-strike {
4022
+ text-decoration: line-through;
4023
+ }
4024
+ .ansi-underline.ansi-strike {
4025
+ text-decoration: underline line-through;
4026
+ }
4027
+
4028
+ /* #endregion */
4029
+
3630
4030
  /* #region LIGHT_THEME */
3631
4031
  body.light {
3632
4032
  --bg-deep: #e8e6e3;
@@ -3649,6 +4049,18 @@ body.light {
3649
4049
  --danger: #c0392b;
3650
4050
  --danger-dim: rgba(192, 57, 43, 0.15);
3651
4051
  --plan: #5a7a5a;
4052
+ --ansi-red: #c0392b;
4053
+ --ansi-green: #1a8a5a;
4054
+ --ansi-yellow: #a8791a;
4055
+ --ansi-blue: #2b6cb0;
4056
+ --ansi-magenta: #8e44ad;
4057
+ --ansi-cyan: #1a7a7a;
4058
+ --ansi-bright-red: #e05548;
4059
+ --ansi-bright-green: #25a86f;
4060
+ --ansi-bright-yellow: #c2921f;
4061
+ --ansi-bright-blue: #3b82d6;
4062
+ --ansi-bright-magenta: #a855c9;
4063
+ --ansi-bright-cyan: #2a9a9a;
3652
4064
  --plan-dim: rgba(90, 122, 90, 0.15);
3653
4065
  }
3654
4066
 
@@ -4578,6 +4990,14 @@ select.form-input option:checked {
4578
4990
  transition: all 0.15s;
4579
4991
  }
4580
4992
 
4993
+ /* Icon buttons sit beside text ones here, and copyWithFeedback swaps the glyph for a
4994
+ checkmark, so both svgs need a size or the button jumps on click. */
4995
+ .storage-item-actions button svg {
4996
+ width: 12px;
4997
+ height: 12px;
4998
+ display: block;
4999
+ }
5000
+
4581
5001
  .storage-item-actions button:hover {
4582
5002
  background: var(--bg-hover);
4583
5003
  color: var(--text-primary);
@@ -4666,6 +5086,18 @@ select.form-input option:checked {
4666
5086
  --danger: #c0392b;
4667
5087
  --danger-dim: rgba(192, 57, 43, 0.15);
4668
5088
  --plan: #5a7a5a;
5089
+ --ansi-red: #c0392b;
5090
+ --ansi-green: #1a8a5a;
5091
+ --ansi-yellow: #a8791a;
5092
+ --ansi-blue: #2b6cb0;
5093
+ --ansi-magenta: #8e44ad;
5094
+ --ansi-cyan: #1a7a7a;
5095
+ --ansi-bright-red: #e05548;
5096
+ --ansi-bright-green: #25a86f;
5097
+ --ansi-bright-yellow: #c2921f;
5098
+ --ansi-bright-blue: #3b82d6;
5099
+ --ansi-bright-magenta: #a855c9;
5100
+ --ansi-bright-cyan: #2a9a9a;
4669
5101
  --plan-dim: rgba(90, 122, 90, 0.15);
4670
5102
  }
4671
5103
 
@@ -4799,23 +5231,29 @@ pre.mermaid svg {
4799
5231
  border-radius: 4px;
4800
5232
  }
4801
5233
 
4802
- .project-group-header .group-chevron {
5234
+ .project-group-header .group-chevron,
5235
+ .session-group-header .group-chevron {
4803
5236
  transition: transform 0.15s ease;
4804
5237
  flex-shrink: 0;
4805
5238
  display: block;
4806
5239
  }
4807
5240
 
4808
- .project-group-header.collapsed .group-chevron {
5241
+ .project-group-header.collapsed .group-chevron,
5242
+ .session-group-header.collapsed .group-chevron {
4809
5243
  transform: rotate(-90deg);
4810
5244
  }
4811
5245
 
4812
- .project-group-header .group-name {
4813
- flex: 1;
5246
+ .project-group-header .group-name,
5247
+ .session-group-header .group-name {
4814
5248
  overflow: hidden;
4815
5249
  text-overflow: ellipsis;
4816
5250
  white-space: nowrap;
4817
5251
  }
4818
5252
 
5253
+ .project-group-header .group-name {
5254
+ flex: 1;
5255
+ }
5256
+
4819
5257
  .project-view-btn {
4820
5258
  color: var(--text-muted);
4821
5259
  cursor: pointer;
@@ -4930,24 +5368,30 @@ pre.mermaid svg {
4930
5368
  letter-spacing: 0.3px;
4931
5369
  }
4932
5370
 
4933
- .pinned-ungroup-btn {
4934
- margin-left: auto;
4935
- font-size: 14px;
4936
- line-height: 1;
5371
+ .pinned-ungroup-btn,
5372
+ .sg-action {
4937
5373
  color: var(--text-muted);
4938
5374
  cursor: pointer;
4939
- padding: 0 2px;
5375
+ line-height: 1;
4940
5376
  opacity: 0;
4941
5377
  transition:
4942
5378
  opacity 0.15s,
4943
5379
  color 0.15s;
4944
5380
  }
4945
5381
 
4946
- .pinned-sub-header:hover .pinned-ungroup-btn {
5382
+ .pinned-ungroup-btn {
5383
+ margin-left: auto;
5384
+ font-size: 14px;
5385
+ padding: 0 2px;
5386
+ }
5387
+
5388
+ .pinned-sub-header:hover .pinned-ungroup-btn,
5389
+ .session-group-header:hover .sg-action {
4947
5390
  opacity: 1;
4948
5391
  }
4949
5392
 
4950
- .pinned-ungroup-btn:hover {
5393
+ .pinned-ungroup-btn:hover,
5394
+ .sg-action:hover {
4951
5395
  color: var(--accent);
4952
5396
  }
4953
5397
 
@@ -5045,3 +5489,168 @@ pre.mermaid svg {
5045
5489
  border: 1px solid var(--text-muted);
5046
5490
  }
5047
5491
  /* #endregion */
5492
+
5493
+ /* #region SESSION_GROUPS */
5494
+ .sg-section-label {
5495
+ padding: 10px 10px 2px;
5496
+ margin-top: 10px;
5497
+ font-size: 10px;
5498
+ font-weight: 600;
5499
+ letter-spacing: 0.6px;
5500
+ text-transform: uppercase;
5501
+ color: var(--text-muted);
5502
+ user-select: none;
5503
+ }
5504
+
5505
+ .sg-section-label:first-child {
5506
+ margin-top: 0;
5507
+ }
5508
+
5509
+ .session-group-header {
5510
+ display: flex;
5511
+ align-items: center;
5512
+ gap: 6px;
5513
+ padding: 7px 10px;
5514
+ margin-top: 2px;
5515
+ cursor: pointer;
5516
+ user-select: none;
5517
+ font-size: 11px;
5518
+ font-weight: 600;
5519
+ color: var(--text-primary);
5520
+ border-radius: 4px;
5521
+ background: transparent;
5522
+ }
5523
+
5524
+ .session-group-header:hover {
5525
+ background: var(--bg-hover);
5526
+ }
5527
+
5528
+ .session-group-header.kb-selected {
5529
+ outline: 1px solid var(--accent);
5530
+ outline-offset: -1px;
5531
+ }
5532
+
5533
+ .sg-sub-label {
5534
+ padding: 8px 10px 2px 8px;
5535
+ font-size: 10px;
5536
+ font-weight: 600;
5537
+ letter-spacing: 0.5px;
5538
+ text-transform: uppercase;
5539
+ color: var(--text-muted);
5540
+ user-select: none;
5541
+ }
5542
+
5543
+ .sg-name-input {
5544
+ flex: 1;
5545
+ min-width: 0;
5546
+ padding: 1px 4px;
5547
+ font: inherit;
5548
+ color: var(--text-primary);
5549
+ background: var(--bg-deep);
5550
+ border: 1px solid var(--accent);
5551
+ border-radius: 3px;
5552
+ outline: none;
5553
+ }
5554
+
5555
+ .sg-action.sg-rename {
5556
+ margin-left: auto;
5557
+ display: flex;
5558
+ align-items: center;
5559
+ }
5560
+
5561
+ .sg-action.sg-delete {
5562
+ font-size: 15px;
5563
+ padding: 0 2px;
5564
+ }
5565
+
5566
+ .session-group-sessions {
5567
+ display: block;
5568
+ margin-left: 6px;
5569
+ }
5570
+
5571
+ .session-group-sessions.collapsed {
5572
+ display: none;
5573
+ }
5574
+
5575
+ .sg-empty {
5576
+ padding: 10px 8px;
5577
+ font-size: 11px;
5578
+ color: var(--text-muted);
5579
+ border: 1px dashed var(--border);
5580
+ border-radius: 4px;
5581
+ margin: 4px 2px;
5582
+ text-align: center;
5583
+ }
5584
+
5585
+ .project-group-header.sg-nested {
5586
+ margin-top: 4px;
5587
+ padding-top: 4px;
5588
+ }
5589
+
5590
+ /* Drag feedback */
5591
+ .session-item.sg-dragging,
5592
+ .project-group-header.sg-dragging,
5593
+ .session-group-header.sg-dragging {
5594
+ opacity: 0.45;
5595
+ }
5596
+
5597
+ .sg-drop-over {
5598
+ outline: 1px dashed var(--accent);
5599
+ outline-offset: -1px;
5600
+ background: var(--accent-dim);
5601
+ }
5602
+
5603
+ .sessions-list.sg-dragging-active .sg-ungroup-zone {
5604
+ border: 1px dashed var(--accent);
5605
+ border-radius: 4px;
5606
+ color: var(--text-primary);
5607
+ }
5608
+
5609
+ /* Move-to-group menu (right-click / long-press) */
5610
+ .sg-menu {
5611
+ position: fixed;
5612
+ z-index: 3000;
5613
+ min-width: 180px;
5614
+ max-width: 260px;
5615
+ padding: 4px;
5616
+ background: var(--bg-elevated);
5617
+ border: 1px solid var(--border);
5618
+ border-radius: 6px;
5619
+ box-shadow: 0 8px 24px rgb(0 0 0 / 35%);
5620
+ display: flex;
5621
+ flex-direction: column;
5622
+ gap: 1px;
5623
+ }
5624
+
5625
+ .sg-menu-label {
5626
+ padding: 6px 8px 4px;
5627
+ font-size: 10px;
5628
+ text-transform: uppercase;
5629
+ letter-spacing: 0.5px;
5630
+ color: var(--text-muted);
5631
+ }
5632
+
5633
+ .sg-menu-item {
5634
+ display: flex;
5635
+ align-items: center;
5636
+ gap: 6px;
5637
+ width: 100%;
5638
+ padding: 6px 8px;
5639
+ border: none;
5640
+ background: none;
5641
+ border-radius: 4px;
5642
+ font: inherit;
5643
+ font-size: 12px;
5644
+ color: var(--text-primary);
5645
+ text-align: left;
5646
+ cursor: pointer;
5647
+ }
5648
+
5649
+ .sg-menu-item:hover {
5650
+ background: var(--bg-hover);
5651
+ }
5652
+
5653
+ .sg-menu-remove {
5654
+ color: var(--text-secondary);
5655
+ }
5656
+ /* #endregion */