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/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 id="msg-detail-body" class="rendered-md modal-zoomable"></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-count"></span>
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>
@@ -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, so the hub's scope does not also pull in
14
- // `app-2` next to `app`; any other text matches a part of the path.
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
- return exact ? p === q : p.includes(q);
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(--danger);
1689
- border-color: var(--danger);
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
- opacity: 0.7;
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: 4px;
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.35;
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
- font-size: 11px;
2052
- font-weight: 500;
2059
+ margin-left: auto;
2053
2060
  color: var(--text-muted);
2054
- margin-top: 8px;
2061
+ white-space: nowrap;
2055
2062
  }
2056
2063
 
2057
2064
  .task-desc {
2058
- font-size: 12px;
2059
- font-weight: 450;
2065
+ font-size: 11.5px;
2066
+ font-weight: 400;
2067
+ line-height: 1.5;
2060
2068
  color: var(--text-tertiary);
2061
- margin-top: 6px;
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-muted);
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-title {
2166
- font-family: var(--serif);
2167
- font-size: 22px;
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: border-color 0.15s ease;
2195
+ transition:
2196
+ border-color 0.15s ease,
2197
+ background 0.15s ease;
2175
2198
  }
2176
2199
 
2177
- .detail-title:hover {
2178
- border-color: var(--border);
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 .dot {
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: border-color 0.15s ease;
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
- font-size: 14px;
2344
- line-height: 1.7;
2345
- color: var(--text-secondary);
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) .xterm {
3162
+ .terminal-pane:has(.terminal-prompt.visible) .terminal-frame {
3075
3163
  visibility: hidden;
3076
3164
  }
3077
3165
 
3078
- .terminal-host .xterm {
3166
+ .terminal-frame {
3167
+ display: block;
3168
+ width: 100%;
3079
3169
  height: 100%;
3170
+ border: 0;
3080
3171
  }
3081
3172
 
3082
- /* xterm.css paints the viewport #000; it shows below the last row when the height is not a whole number of rows. */
3083
- .terminal-host .xterm .xterm-viewport {
3084
- background-color: var(--bg-deep);
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) .xterm {
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: 6px 0;
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
- .review-pop-quote,
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;