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/README.md +1 -0
- package/lib/approvals.js +82 -0
- package/lib/file-url.js +36 -0
- package/package.json +2 -2
- package/plugin/plugins/claude-code-kanban/.claude-plugin/plugin.json +1 -1
- package/plugin/plugins/claude-code-kanban/hooks/hooks.json +2 -24
- package/plugin/plugins/claude-code-kanban/scripts/agent-spy.sh +17 -3
- package/plugin/plugins/claude-code-kanban/scripts/approval-gate.sh +141 -0
- package/public/app.js +1335 -165
- package/public/index.html +1 -0
- package/public/style.css +648 -39
- package/server.js +256 -81
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
|
-
|
|
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 .
|
|
2336
|
+
.info-grid:hover .row-actions {
|
|
2309
2337
|
opacity: 1;
|
|
2310
2338
|
}
|
|
2311
|
-
.
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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
|
-
.
|
|
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
|
-
/*
|
|
3496
|
-
|
|
3497
|
-
.
|
|
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-
|
|
3775
|
+
.linked-doc-item:hover .linked-doc-actions {
|
|
3520
3776
|
opacity: 1;
|
|
3521
3777
|
}
|
|
3522
3778
|
|
|
3523
|
-
.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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 */
|