claude-code-kanban 5.2.0 → 5.3.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/lib/claude-dir.js +7 -1
- package/lib/net-guard.js +41 -14
- package/lib/proc-stats.js +82 -0
- package/lib/retention.js +12 -9
- package/lib/terminal.js +17 -4
- package/lib/worktrees.js +105 -0
- package/package.json +1 -1
- package/plugin/plugins/claude-code-kanban/.claude-plugin/plugin.json +1 -1
- package/plugin/plugins/claude-code-kanban/hooks/hooks.json +1 -1
- package/plugin/plugins/claude-code-kanban/skills/dispatch/SKILL.md +1 -1
- package/plugin/plugins/claude-code-kanban/skills/kanban/SKILL.md +0 -1
- package/public/app.js +653 -372
- package/public/index.html +7 -3
- package/public/project-match.js +6 -4
- package/public/style.css +258 -79
- package/public/terminal-frame.js +341 -0
- package/public/terminal.html +27 -0
- package/public/vendor/claude-hub-sdk.js +13 -3
- package/server.js +57 -50
- package/skill-guides/dispatch.md +4 -4
package/public/index.html
CHANGED
|
@@ -334,6 +334,7 @@
|
|
|
334
334
|
<p class="terminal-boot-slow">Slow to connect. Press <kbd>R</kbd> to reconnect.</p>
|
|
335
335
|
</div>
|
|
336
336
|
<div id="terminal-host" class="terminal-host"></div>
|
|
337
|
+
<textarea id="terminal-key-proxy" class="terminal-key-proxy" tabindex="-1" aria-hidden="true"></textarea>
|
|
337
338
|
</div>
|
|
338
339
|
<div id="agent-footer" class="agent-footer">
|
|
339
340
|
<div class="agent-footer-header" onclick="toggleAgentFooter()">
|
|
@@ -393,7 +394,7 @@
|
|
|
393
394
|
|
|
394
395
|
<!-- Message Detail Modal -->
|
|
395
396
|
<div id="msg-detail-modal" class="modal-overlay" onclick="closeMsgDetailModal()">
|
|
396
|
-
<div class="modal msg-detail-dialog" onclick="event.stopPropagation()">
|
|
397
|
+
<div class="modal msg-detail-dialog review-host" onclick="event.stopPropagation()">
|
|
397
398
|
<div class="modal-header">
|
|
398
399
|
<h3 class="modal-title" id="msg-detail-title">Message</h3>
|
|
399
400
|
<div style="display:flex;gap:4px;align-items:center;">
|
|
@@ -418,7 +419,10 @@
|
|
|
418
419
|
</div>
|
|
419
420
|
</div>
|
|
420
421
|
<div class="modal-body" style="flex: 0 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden;">
|
|
421
|
-
<div
|
|
422
|
+
<div class="preview-split">
|
|
423
|
+
<div id="msg-detail-body" class="rendered-md modal-zoomable"></div>
|
|
424
|
+
<aside id="msg-review-panel" class="review-panel" hidden></aside>
|
|
425
|
+
</div>
|
|
422
426
|
<div id="msg-detail-meta" style="margin-top: 12px; font-size: 11px; color: var(--text-muted); flex-shrink: 0;"></div>
|
|
423
427
|
</div>
|
|
424
428
|
<div id="msg-detail-waiting-footer"></div>
|
|
@@ -739,7 +743,7 @@
|
|
|
739
743
|
</div>
|
|
740
744
|
<div class="modal-body" id="terminal-manager-body"></div>
|
|
741
745
|
<div class="modal-footer terminal-manager-footer">
|
|
742
|
-
<span id="terminal-manager-count" class="terminal-manager-
|
|
746
|
+
<span class="terminal-manager-count"><span id="terminal-manager-count"></span><span id="terminal-manager-stats" class="terminal-manager-stats" title="Memory and CPU of the cck server process. Terminals are not counted. 100% CPU is one core."></span></span>
|
|
743
747
|
<button id="terminal-manager-end-all" class="btn btn-secondary terminal-manager-end" onclick="endAllTerminals()">End all</button>
|
|
744
748
|
</div>
|
|
745
749
|
</div>
|
package/public/project-match.js
CHANGED
|
@@ -10,15 +10,17 @@ const projectMatch = (() => {
|
|
|
10
10
|
function isExactProjectFilter(query) {
|
|
11
11
|
return isExactProjectPath(normalizeProjectPath(query.trim()));
|
|
12
12
|
}
|
|
13
|
-
// An absolute path selects that one project
|
|
14
|
-
//
|
|
13
|
+
// An absolute path selects that one project and its linked worktrees (`repo` is the main
|
|
14
|
+
// checkout of a worktree project), so the hub's scope does not also pull in `app-2` next to
|
|
15
|
+
// `app`; any other text matches a part of the path.
|
|
15
16
|
function projectMatcher(query) {
|
|
16
17
|
const q = normalizeProjectPath(query.trim());
|
|
17
18
|
const exact = isExactProjectPath(q);
|
|
18
|
-
return (project) => {
|
|
19
|
+
return (project, repo) => {
|
|
19
20
|
if (!project) return false;
|
|
20
21
|
const p = normalizeProjectPath(project);
|
|
21
|
-
|
|
22
|
+
if (!exact) return p.includes(q);
|
|
23
|
+
return p === q || (!!repo && normalizeProjectPath(repo) === q);
|
|
22
24
|
};
|
|
23
25
|
}
|
|
24
26
|
return { normalizeProjectPath, isExactProjectPath, isExactProjectFilter, projectMatcher };
|
package/public/style.css
CHANGED
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
--danger: #ef5350;
|
|
27
27
|
--danger-dim: rgba(239, 83, 80, 0.18);
|
|
28
28
|
--team: #60a5fa;
|
|
29
|
-
--team-dim: rgba(96, 165, 250, 0.18);
|
|
30
29
|
--plan: #86a886;
|
|
31
30
|
--plan-dim: rgba(134, 168, 134, 0.18);
|
|
32
31
|
--ansi-red: #e06c66;
|
|
@@ -114,6 +113,18 @@ body::before {
|
|
|
114
113
|
::-webkit-scrollbar-thumb:hover {
|
|
115
114
|
background: var(--text-muted);
|
|
116
115
|
}
|
|
116
|
+
.column-tasks::-webkit-scrollbar-thumb,
|
|
117
|
+
.sessions-list::-webkit-scrollbar-thumb {
|
|
118
|
+
background: transparent;
|
|
119
|
+
}
|
|
120
|
+
.column-tasks:hover::-webkit-scrollbar-thumb,
|
|
121
|
+
.sessions-list:hover::-webkit-scrollbar-thumb {
|
|
122
|
+
background: var(--border);
|
|
123
|
+
}
|
|
124
|
+
.column-tasks::-webkit-scrollbar-thumb:hover,
|
|
125
|
+
.sessions-list::-webkit-scrollbar-thumb:hover {
|
|
126
|
+
background: var(--text-muted);
|
|
127
|
+
}
|
|
117
128
|
|
|
118
129
|
/* #endregion */
|
|
119
130
|
|
|
@@ -817,7 +828,7 @@ body::before {
|
|
|
817
828
|
padding: 13px 15px;
|
|
818
829
|
margin-bottom: 6px;
|
|
819
830
|
background: var(--sidebar-item-bg, transparent);
|
|
820
|
-
border: 1px solid var(--border);
|
|
831
|
+
border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
|
|
821
832
|
border-radius: 9px;
|
|
822
833
|
text-align: left;
|
|
823
834
|
cursor: pointer;
|
|
@@ -921,8 +932,13 @@ body.booting .boot-splash {
|
|
|
921
932
|
/* `.active` is the open session, `.kb-selected` the keyboard cursor. They own different
|
|
922
933
|
properties — fill and border — so the cursor landing on the open session adds to it
|
|
923
934
|
instead of replacing how it looks. */
|
|
935
|
+
.session-item:hover {
|
|
936
|
+
background: color-mix(in srgb, var(--bg-hover) 40%, var(--sidebar-item-bg, transparent));
|
|
937
|
+
}
|
|
938
|
+
|
|
924
939
|
.session-item.active {
|
|
925
940
|
background: var(--session-active-bg);
|
|
941
|
+
border-color: var(--border);
|
|
926
942
|
}
|
|
927
943
|
|
|
928
944
|
.session-item.kb-selected,
|
|
@@ -1685,11 +1701,13 @@ body.booting .boot-splash {
|
|
|
1685
1701
|
}
|
|
1686
1702
|
|
|
1687
1703
|
.icon-btn-danger {
|
|
1688
|
-
color: var(--
|
|
1689
|
-
|
|
1704
|
+
color: var(--text-muted);
|
|
1705
|
+
background: transparent;
|
|
1706
|
+
border-color: transparent;
|
|
1690
1707
|
}
|
|
1691
1708
|
|
|
1692
|
-
.icon-btn-danger:hover
|
|
1709
|
+
.icon-btn-danger:hover,
|
|
1710
|
+
.icon-btn-danger:focus-visible {
|
|
1693
1711
|
background: color-mix(in srgb, var(--danger) 12%, transparent);
|
|
1694
1712
|
color: color-mix(in srgb, var(--danger) 80%, black);
|
|
1695
1713
|
border-color: var(--danger);
|
|
@@ -1969,7 +1987,10 @@ body.booting .boot-splash {
|
|
|
1969
1987
|
}
|
|
1970
1988
|
|
|
1971
1989
|
.task-card.blocked {
|
|
1972
|
-
|
|
1990
|
+
border-left-style: dashed;
|
|
1991
|
+
}
|
|
1992
|
+
.task-card.blocked .task-title {
|
|
1993
|
+
color: var(--text-secondary);
|
|
1973
1994
|
}
|
|
1974
1995
|
.task-card.dragging {
|
|
1975
1996
|
opacity: 0.4;
|
|
@@ -1995,30 +2016,17 @@ body.booting .boot-splash {
|
|
|
1995
2016
|
.task-id {
|
|
1996
2017
|
font-size: 11px;
|
|
1997
2018
|
color: var(--text-muted);
|
|
1998
|
-
margin-bottom:
|
|
2019
|
+
margin-bottom: 6px;
|
|
1999
2020
|
display: flex;
|
|
2000
2021
|
align-items: center;
|
|
2001
2022
|
gap: 8px;
|
|
2002
2023
|
}
|
|
2003
2024
|
|
|
2004
|
-
.task-badge {
|
|
2005
|
-
font-size: 10px;
|
|
2006
|
-
font-weight: 600;
|
|
2007
|
-
padding: 3px 8px;
|
|
2008
|
-
border-radius: 4px;
|
|
2009
|
-
text-transform: uppercase;
|
|
2010
|
-
letter-spacing: 0.04em;
|
|
2011
|
-
}
|
|
2012
|
-
|
|
2013
|
-
.task-badge.blocked {
|
|
2014
|
-
background: color-mix(in srgb, var(--accent) 15%, transparent);
|
|
2015
|
-
color: var(--accent);
|
|
2016
|
-
}
|
|
2017
|
-
|
|
2018
2025
|
.task-title {
|
|
2019
2026
|
font-size: 13px;
|
|
2027
|
+
font-weight: 500;
|
|
2020
2028
|
color: var(--text-primary);
|
|
2021
|
-
line-height: 1.
|
|
2029
|
+
line-height: 1.4;
|
|
2022
2030
|
}
|
|
2023
2031
|
|
|
2024
2032
|
.task-card.completed .task-title {
|
|
@@ -2048,17 +2056,17 @@ body.booting .boot-splash {
|
|
|
2048
2056
|
}
|
|
2049
2057
|
|
|
2050
2058
|
.task-blocked {
|
|
2051
|
-
|
|
2052
|
-
font-weight: 500;
|
|
2059
|
+
margin-left: auto;
|
|
2053
2060
|
color: var(--text-muted);
|
|
2054
|
-
|
|
2061
|
+
white-space: nowrap;
|
|
2055
2062
|
}
|
|
2056
2063
|
|
|
2057
2064
|
.task-desc {
|
|
2058
|
-
font-size:
|
|
2059
|
-
font-weight:
|
|
2065
|
+
font-size: 11.5px;
|
|
2066
|
+
font-weight: 400;
|
|
2067
|
+
line-height: 1.5;
|
|
2060
2068
|
color: var(--text-tertiary);
|
|
2061
|
-
margin-top:
|
|
2069
|
+
margin-top: 4px;
|
|
2062
2070
|
display: -webkit-box;
|
|
2063
2071
|
-webkit-line-clamp: 2;
|
|
2064
2072
|
-webkit-box-orient: vertical;
|
|
@@ -2158,36 +2166,58 @@ body.booting .boot-splash {
|
|
|
2158
2166
|
font-weight: 500;
|
|
2159
2167
|
text-transform: uppercase;
|
|
2160
2168
|
letter-spacing: 0.08em;
|
|
2161
|
-
color: var(--text
|
|
2169
|
+
color: var(--accent-text, var(--accent));
|
|
2162
2170
|
margin-bottom: 8px;
|
|
2171
|
+
display: flex;
|
|
2172
|
+
align-items: center;
|
|
2173
|
+
gap: 8px;
|
|
2163
2174
|
}
|
|
2164
2175
|
|
|
2165
|
-
.detail-
|
|
2166
|
-
|
|
2167
|
-
|
|
2176
|
+
.detail-edit-icon {
|
|
2177
|
+
width: 12px;
|
|
2178
|
+
height: 12px;
|
|
2179
|
+
opacity: 0.8;
|
|
2180
|
+
}
|
|
2181
|
+
|
|
2182
|
+
.detail-title,
|
|
2183
|
+
.detail-title-input {
|
|
2184
|
+
font-family: var(--mono);
|
|
2185
|
+
font-size: 17px;
|
|
2186
|
+
font-weight: 600;
|
|
2168
2187
|
line-height: 1.4;
|
|
2169
|
-
cursor: pointer;
|
|
2170
2188
|
padding: 2px 4px;
|
|
2171
2189
|
margin: -2px -4px;
|
|
2172
2190
|
border-radius: 4px;
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2193
|
+
.detail-title {
|
|
2173
2194
|
border: 1px solid transparent;
|
|
2174
|
-
transition:
|
|
2195
|
+
transition:
|
|
2196
|
+
border-color 0.15s ease,
|
|
2197
|
+
background 0.15s ease;
|
|
2175
2198
|
}
|
|
2176
2199
|
|
|
2177
|
-
.detail-title
|
|
2178
|
-
|
|
2200
|
+
#detail-content.blocked .detail-title {
|
|
2201
|
+
box-shadow: inset 3px 0 var(--warning);
|
|
2202
|
+
padding-left: 13px;
|
|
2203
|
+
margin-left: -13px;
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2206
|
+
.detail-title.editable,
|
|
2207
|
+
.detail-desc.editable {
|
|
2208
|
+
cursor: pointer;
|
|
2209
|
+
}
|
|
2210
|
+
|
|
2211
|
+
.detail-title.editable:hover,
|
|
2212
|
+
.detail-desc.editable:hover {
|
|
2213
|
+
border-color: color-mix(in srgb, var(--accent) 45%, transparent);
|
|
2214
|
+
background: color-mix(in srgb, var(--accent) 5%, var(--bg-elevated));
|
|
2179
2215
|
}
|
|
2180
2216
|
|
|
2181
2217
|
.detail-title-input {
|
|
2182
|
-
font-family: var(--serif);
|
|
2183
|
-
font-size: 22px;
|
|
2184
|
-
line-height: 1.4;
|
|
2185
2218
|
width: 100%;
|
|
2186
|
-
padding: 2px 4px;
|
|
2187
|
-
margin: -2px -4px;
|
|
2188
2219
|
background: var(--bg-elevated);
|
|
2189
2220
|
border: 1px solid var(--accent);
|
|
2190
|
-
border-radius: 4px;
|
|
2191
2221
|
color: var(--text-primary);
|
|
2192
2222
|
box-shadow: 0 0 0 2px var(--accent-dim);
|
|
2193
2223
|
}
|
|
@@ -2226,11 +2256,19 @@ body.booting .boot-splash {
|
|
|
2226
2256
|
border: 1px solid var(--success);
|
|
2227
2257
|
}
|
|
2228
2258
|
|
|
2229
|
-
.detail-status
|
|
2259
|
+
#detail-content.blocked .detail-status.pending {
|
|
2260
|
+
background: var(--warning-dim);
|
|
2261
|
+
color: var(--warning);
|
|
2262
|
+
border-color: color-mix(in srgb, var(--warning) 40%, transparent);
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
.detail-status .dot,
|
|
2266
|
+
.detail-dep .dot {
|
|
2230
2267
|
width: 8px;
|
|
2231
2268
|
height: 8px;
|
|
2232
2269
|
border-radius: 50%;
|
|
2233
2270
|
background: currentColor;
|
|
2271
|
+
flex-shrink: 0;
|
|
2234
2272
|
}
|
|
2235
2273
|
|
|
2236
2274
|
.detail-status.in_progress .dot {
|
|
@@ -2253,35 +2291,20 @@ body.booting .boot-splash {
|
|
|
2253
2291
|
color: var(--accent);
|
|
2254
2292
|
}
|
|
2255
2293
|
|
|
2256
|
-
.detail-box.blocked {
|
|
2257
|
-
background: var(--warning-dim);
|
|
2258
|
-
border: 1px solid rgba(240, 180, 41, 0.35);
|
|
2259
|
-
color: var(--warning);
|
|
2260
|
-
}
|
|
2261
|
-
|
|
2262
|
-
.detail-box.blocks {
|
|
2263
|
-
background: var(--team-dim);
|
|
2264
|
-
border: 1px solid rgba(96, 165, 250, 0.35);
|
|
2265
|
-
color: var(--team);
|
|
2266
|
-
}
|
|
2267
|
-
|
|
2268
2294
|
.detail-desc {
|
|
2269
2295
|
font-size: 14px;
|
|
2270
2296
|
line-height: 1.7;
|
|
2271
2297
|
color: var(--text-secondary);
|
|
2272
|
-
cursor: pointer;
|
|
2273
2298
|
padding: 4px 6px;
|
|
2274
2299
|
margin: -4px -6px;
|
|
2275
2300
|
border-radius: 4px;
|
|
2276
2301
|
border: 1px solid transparent;
|
|
2277
|
-
transition:
|
|
2302
|
+
transition:
|
|
2303
|
+
border-color 0.15s ease,
|
|
2304
|
+
background 0.15s ease;
|
|
2278
2305
|
overflow-x: auto;
|
|
2279
2306
|
}
|
|
2280
2307
|
|
|
2281
|
-
.detail-desc:hover {
|
|
2282
|
-
border-color: var(--border);
|
|
2283
|
-
}
|
|
2284
|
-
|
|
2285
2308
|
.detail-desc-textarea {
|
|
2286
2309
|
width: 100%;
|
|
2287
2310
|
min-height: 120px;
|
|
@@ -2340,9 +2363,68 @@ body.booting .boot-splash {
|
|
|
2340
2363
|
}
|
|
2341
2364
|
|
|
2342
2365
|
.detail-deps {
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2366
|
+
display: grid;
|
|
2367
|
+
grid-template-columns: max-content minmax(0, 1fr);
|
|
2368
|
+
gap: 8px 16px;
|
|
2369
|
+
align-items: start;
|
|
2370
|
+
font-size: 12px;
|
|
2371
|
+
}
|
|
2372
|
+
|
|
2373
|
+
.detail-deps .wait {
|
|
2374
|
+
--chip-color: var(--warning);
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
.detail-deps .next {
|
|
2378
|
+
--chip-color: var(--success);
|
|
2379
|
+
}
|
|
2380
|
+
|
|
2381
|
+
.detail-deps-label {
|
|
2382
|
+
padding-top: 4px;
|
|
2383
|
+
color: var(--chip-color);
|
|
2384
|
+
}
|
|
2385
|
+
|
|
2386
|
+
.detail-deps-list {
|
|
2387
|
+
display: flex;
|
|
2388
|
+
flex-wrap: wrap;
|
|
2389
|
+
gap: 6px;
|
|
2390
|
+
min-width: 0;
|
|
2391
|
+
}
|
|
2392
|
+
|
|
2393
|
+
.detail-dep {
|
|
2394
|
+
--chip-color: var(--text-tertiary);
|
|
2395
|
+
display: inline-flex;
|
|
2396
|
+
align-items: center;
|
|
2397
|
+
gap: 6px;
|
|
2398
|
+
max-width: 100%;
|
|
2399
|
+
padding: 3px 10px;
|
|
2400
|
+
font: inherit;
|
|
2401
|
+
font-size: 12px;
|
|
2402
|
+
color: var(--chip-color);
|
|
2403
|
+
background: color-mix(in srgb, var(--chip-color) 12%, transparent);
|
|
2404
|
+
border: 1px solid color-mix(in srgb, var(--chip-color) 40%, transparent);
|
|
2405
|
+
border-radius: 999px;
|
|
2406
|
+
cursor: pointer;
|
|
2407
|
+
transition:
|
|
2408
|
+
background 0.15s ease,
|
|
2409
|
+
border-color 0.15s ease;
|
|
2410
|
+
}
|
|
2411
|
+
|
|
2412
|
+
.detail-dep:hover,
|
|
2413
|
+
.detail-dep:focus-visible {
|
|
2414
|
+
outline: none;
|
|
2415
|
+
background: color-mix(in srgb, var(--chip-color) 20%, transparent);
|
|
2416
|
+
border-color: var(--chip-color);
|
|
2417
|
+
}
|
|
2418
|
+
|
|
2419
|
+
.detail-dep .dot {
|
|
2420
|
+
width: 6px;
|
|
2421
|
+
height: 6px;
|
|
2422
|
+
}
|
|
2423
|
+
|
|
2424
|
+
.detail-dep-text {
|
|
2425
|
+
overflow: hidden;
|
|
2426
|
+
text-overflow: ellipsis;
|
|
2427
|
+
white-space: nowrap;
|
|
2346
2428
|
}
|
|
2347
2429
|
|
|
2348
2430
|
.detail-desc pre {
|
|
@@ -2370,6 +2452,12 @@ body.booting .boot-splash {
|
|
|
2370
2452
|
font-size: 0.9em;
|
|
2371
2453
|
}
|
|
2372
2454
|
|
|
2455
|
+
#detail-content .detail-desc :not(pre) > code {
|
|
2456
|
+
background: color-mix(in srgb, var(--accent) 10%, transparent);
|
|
2457
|
+
border-color: color-mix(in srgb, var(--accent) 20%, transparent);
|
|
2458
|
+
color: var(--accent-text, var(--accent));
|
|
2459
|
+
}
|
|
2460
|
+
|
|
2373
2461
|
.detail-desc hr {
|
|
2374
2462
|
border: none;
|
|
2375
2463
|
border-top: 1px solid var(--border);
|
|
@@ -3071,17 +3159,23 @@ body.booting .boot-splash {
|
|
|
3071
3159
|
background: var(--bg-deep);
|
|
3072
3160
|
}
|
|
3073
3161
|
|
|
3074
|
-
.terminal-pane:has(.terminal-prompt.visible) .
|
|
3162
|
+
.terminal-pane:has(.terminal-prompt.visible) .terminal-frame {
|
|
3075
3163
|
visibility: hidden;
|
|
3076
3164
|
}
|
|
3077
3165
|
|
|
3078
|
-
.terminal-
|
|
3166
|
+
.terminal-frame {
|
|
3167
|
+
display: block;
|
|
3168
|
+
width: 100%;
|
|
3079
3169
|
height: 100%;
|
|
3170
|
+
border: 0;
|
|
3080
3171
|
}
|
|
3081
3172
|
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3173
|
+
.terminal-key-proxy {
|
|
3174
|
+
position: absolute;
|
|
3175
|
+
width: 0;
|
|
3176
|
+
height: 0;
|
|
3177
|
+
opacity: 0;
|
|
3178
|
+
pointer-events: none;
|
|
3085
3179
|
}
|
|
3086
3180
|
|
|
3087
3181
|
.terminal-manager-modal {
|
|
@@ -3167,6 +3261,15 @@ body.booting .boot-splash {
|
|
|
3167
3261
|
text-overflow: ellipsis;
|
|
3168
3262
|
}
|
|
3169
3263
|
|
|
3264
|
+
.terminal-manager-proc {
|
|
3265
|
+
white-space: nowrap;
|
|
3266
|
+
font-variant-numeric: tabular-nums;
|
|
3267
|
+
}
|
|
3268
|
+
|
|
3269
|
+
.terminal-manager-proc:empty {
|
|
3270
|
+
display: none;
|
|
3271
|
+
}
|
|
3272
|
+
|
|
3170
3273
|
.terminal-manager-actions {
|
|
3171
3274
|
display: flex;
|
|
3172
3275
|
gap: 8px;
|
|
@@ -3196,6 +3299,15 @@ body.booting .boot-splash {
|
|
|
3196
3299
|
color: var(--text-muted);
|
|
3197
3300
|
}
|
|
3198
3301
|
|
|
3302
|
+
.terminal-manager-stats:empty {
|
|
3303
|
+
display: none;
|
|
3304
|
+
}
|
|
3305
|
+
|
|
3306
|
+
.terminal-manager-stats::before {
|
|
3307
|
+
content: '·';
|
|
3308
|
+
margin: 0 6px;
|
|
3309
|
+
}
|
|
3310
|
+
|
|
3199
3311
|
.terminal-manager-empty {
|
|
3200
3312
|
color: var(--text-muted);
|
|
3201
3313
|
padding: 24px 0;
|
|
@@ -3224,7 +3336,7 @@ body.booting .boot-splash {
|
|
|
3224
3336
|
}
|
|
3225
3337
|
|
|
3226
3338
|
/* Opacity, not visibility: a hidden textarea drops focus, and the terminal must keep it. */
|
|
3227
|
-
.terminal-pane:has(.terminal-boot.visible) .
|
|
3339
|
+
.terminal-pane:has(.terminal-boot.visible) .terminal-frame {
|
|
3228
3340
|
opacity: 0;
|
|
3229
3341
|
}
|
|
3230
3342
|
|
|
@@ -5424,7 +5536,7 @@ body.light .msg-assistant .msg-text {
|
|
|
5424
5536
|
fullscreen rule must win, same as for every other per-modal size. */
|
|
5425
5537
|
.modal.msg-detail-dialog {
|
|
5426
5538
|
width: 90vw;
|
|
5427
|
-
max-width: 860px;
|
|
5539
|
+
max-width: calc(860px + var(--review-extra));
|
|
5428
5540
|
max-height: 90vh;
|
|
5429
5541
|
display: flex;
|
|
5430
5542
|
flex-direction: column;
|
|
@@ -5634,6 +5746,7 @@ body.light .msg-assistant .msg-text {
|
|
|
5634
5746
|
flex: 1 1 auto;
|
|
5635
5747
|
}
|
|
5636
5748
|
|
|
5749
|
+
.preview-split > #msg-detail-body,
|
|
5637
5750
|
.preview-split > #preview-modal-body,
|
|
5638
5751
|
.preview-split > #plan-modal-body {
|
|
5639
5752
|
flex: 1 1 auto;
|
|
@@ -5835,7 +5948,8 @@ body.light .msg-assistant .msg-text {
|
|
|
5835
5948
|
/* keycap chips: elevated fill + thicker bottom border reads as a key */
|
|
5836
5949
|
.sp-hint kbd,
|
|
5837
5950
|
.shortcuts kbd,
|
|
5838
|
-
.terminal-boot-slow kbd
|
|
5951
|
+
.terminal-boot-slow kbd,
|
|
5952
|
+
.review-offer-btn kbd {
|
|
5839
5953
|
display: inline-flex;
|
|
5840
5954
|
align-items: center;
|
|
5841
5955
|
justify-content: center;
|
|
@@ -6099,7 +6213,8 @@ select.form-input option:checked {
|
|
|
6099
6213
|
background-color: var(--warning-dim);
|
|
6100
6214
|
}
|
|
6101
6215
|
|
|
6102
|
-
::highlight(review-hot)
|
|
6216
|
+
::highlight(review-hot),
|
|
6217
|
+
::highlight(review-pending) {
|
|
6103
6218
|
background-color: color-mix(in srgb, var(--warning) 45%, transparent);
|
|
6104
6219
|
}
|
|
6105
6220
|
|
|
@@ -6127,7 +6242,7 @@ select.form-input option:checked {
|
|
|
6127
6242
|
#review-pop textarea {
|
|
6128
6243
|
width: 100%;
|
|
6129
6244
|
box-sizing: border-box;
|
|
6130
|
-
margin:
|
|
6245
|
+
margin: 0 0 6px;
|
|
6131
6246
|
padding: 6px;
|
|
6132
6247
|
resize: vertical;
|
|
6133
6248
|
font: inherit;
|
|
@@ -6137,7 +6252,54 @@ select.form-input option:checked {
|
|
|
6137
6252
|
border-radius: 4px;
|
|
6138
6253
|
}
|
|
6139
6254
|
|
|
6140
|
-
|
|
6255
|
+
#review-pop.offer {
|
|
6256
|
+
animation: review-offer-in 120ms ease-out;
|
|
6257
|
+
}
|
|
6258
|
+
|
|
6259
|
+
#review-pop button.review-offer-btn {
|
|
6260
|
+
display: inline-flex;
|
|
6261
|
+
align-items: center;
|
|
6262
|
+
gap: 6px;
|
|
6263
|
+
padding: 4px 6px 4px 8px;
|
|
6264
|
+
background: var(--bg-elevated);
|
|
6265
|
+
border-radius: 6px;
|
|
6266
|
+
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
|
|
6267
|
+
}
|
|
6268
|
+
|
|
6269
|
+
#review-pop button.review-offer-btn:hover,
|
|
6270
|
+
#review-pop button.review-offer-btn:focus-visible {
|
|
6271
|
+
border-color: var(--accent);
|
|
6272
|
+
}
|
|
6273
|
+
|
|
6274
|
+
.review-offer-btn svg {
|
|
6275
|
+
width: 13px;
|
|
6276
|
+
height: 13px;
|
|
6277
|
+
margin: 0;
|
|
6278
|
+
color: var(--accent);
|
|
6279
|
+
}
|
|
6280
|
+
|
|
6281
|
+
.review-offer-btn kbd {
|
|
6282
|
+
min-width: 16px;
|
|
6283
|
+
height: 16px;
|
|
6284
|
+
padding: 0 4px;
|
|
6285
|
+
font-size: 10px;
|
|
6286
|
+
color: var(--text-muted);
|
|
6287
|
+
border-radius: 3px;
|
|
6288
|
+
}
|
|
6289
|
+
|
|
6290
|
+
@keyframes review-offer-in {
|
|
6291
|
+
from {
|
|
6292
|
+
opacity: 0;
|
|
6293
|
+
transform: translateY(3px);
|
|
6294
|
+
}
|
|
6295
|
+
}
|
|
6296
|
+
|
|
6297
|
+
@media (prefers-reduced-motion: reduce) {
|
|
6298
|
+
#review-pop.offer {
|
|
6299
|
+
animation: none;
|
|
6300
|
+
}
|
|
6301
|
+
}
|
|
6302
|
+
|
|
6141
6303
|
.review-card-quote {
|
|
6142
6304
|
overflow: hidden;
|
|
6143
6305
|
padding-left: 8px;
|
|
@@ -6145,10 +6307,6 @@ select.form-input option:checked {
|
|
|
6145
6307
|
border-left: 2px solid var(--warning);
|
|
6146
6308
|
}
|
|
6147
6309
|
|
|
6148
|
-
.review-pop-quote {
|
|
6149
|
-
max-height: 3.2em;
|
|
6150
|
-
}
|
|
6151
|
-
|
|
6152
6310
|
.review-pop-actions {
|
|
6153
6311
|
display: flex;
|
|
6154
6312
|
justify-content: flex-end;
|
|
@@ -7673,6 +7831,27 @@ pre.mermaid svg {
|
|
|
7673
7831
|
background: var(--accent-dim);
|
|
7674
7832
|
}
|
|
7675
7833
|
|
|
7834
|
+
/* Centered in the 6px gap between cards (.session-item margin-bottom). */
|
|
7835
|
+
.session-item.sg-insert-before::after,
|
|
7836
|
+
.session-item.sg-insert-after::after {
|
|
7837
|
+
content: '';
|
|
7838
|
+
position: absolute;
|
|
7839
|
+
left: 4px;
|
|
7840
|
+
right: 4px;
|
|
7841
|
+
height: 2px;
|
|
7842
|
+
border-radius: 1px;
|
|
7843
|
+
background: var(--accent);
|
|
7844
|
+
pointer-events: none;
|
|
7845
|
+
}
|
|
7846
|
+
|
|
7847
|
+
.session-item.sg-insert-before::after {
|
|
7848
|
+
top: -5px;
|
|
7849
|
+
}
|
|
7850
|
+
|
|
7851
|
+
.session-item.sg-insert-after::after {
|
|
7852
|
+
bottom: -5px;
|
|
7853
|
+
}
|
|
7854
|
+
|
|
7676
7855
|
/* An empty section shows only while a drag needs its ungroup drop zone. */
|
|
7677
7856
|
.sessions-list:not(.sg-dragging-active) .sg-section-empty {
|
|
7678
7857
|
display: none;
|