claude-code-kanban 2.1.0 → 2.2.0-rc.10

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
@@ -161,6 +161,11 @@
161
161
  <path d="M12 20h9"/><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/>
162
162
  </svg>
163
163
  </button>
164
+ <button class="icon-btn" onclick="showStorageManager()" title="Storage manager (Shift+S)" aria-label="Storage manager">
165
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
166
+ <ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/>
167
+ </svg>
168
+ </button>
164
169
  <button id="theme-toggle" class="icon-btn" onclick="toggleTheme()" title="Toggle theme" aria-label="Toggle theme">
165
170
  <svg id="theme-icon-dark" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
166
171
  <path d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/>
@@ -390,6 +395,10 @@
390
395
  <td style="padding: 4px 0; color: var(--text-secondary);"><kbd style="background: var(--bg-hover); padding: 2px 6px; border-radius: 4px; font-family: monospace;">N</kbd></td>
391
396
  <td style="padding: 4px 0; color: var(--text-primary);">Toggle scratchpad</td>
392
397
  </tr>
398
+ <tr>
399
+ <td style="padding: 4px 0; color: var(--text-secondary);"><kbd style="background: var(--bg-hover); padding: 2px 6px; border-radius: 4px; font-family: monospace;">Shift+S</kbd></td>
400
+ <td style="padding: 4px 0; color: var(--text-primary);">Storage manager</td>
401
+ </tr>
393
402
  <tr>
394
403
  <td style="padding: 4px 0; color: var(--text-secondary);"><kbd style="background: var(--bg-hover); padding: 2px 6px; border-radius: 4px; font-family: monospace;">J/K</kbd></td>
395
404
  <td style="padding: 4px 0; color: var(--text-primary);">Navigate messages in detail modal</td>
@@ -406,7 +415,7 @@
406
415
 
407
416
  <!-- Delete Confirmation Modal -->
408
417
  <div id="delete-confirm-modal" class="modal-overlay" onclick="closeDeleteConfirmModal()">
409
- <div class="modal" onclick="event.stopPropagation()" style="max-width: 400px;">
418
+ <div class="modal modal-sm" onclick="event.stopPropagation()">
410
419
  <div class="modal-header">
411
420
  <h3 class="modal-title">Delete Task</h3>
412
421
  <button class="modal-close" aria-label="Close dialog" onclick="closeDeleteConfirmModal()">
@@ -427,7 +436,7 @@
427
436
 
428
437
  <!-- Delete All Session Tasks Confirmation Modal -->
429
438
  <div id="delete-session-tasks-modal" class="modal-overlay" onclick="closeDeleteSessionTasksModal()">
430
- <div class="modal" onclick="event.stopPropagation()" style="max-width: 500px;">
439
+ <div class="modal" onclick="event.stopPropagation()">
431
440
  <div class="modal-header">
432
441
  <h3 class="modal-title">Delete All Tasks</h3>
433
442
  <button class="modal-close" aria-label="Close dialog" onclick="closeDeleteSessionTasksModal()">
@@ -449,7 +458,7 @@
449
458
 
450
459
  <!-- Delete Result Modal -->
451
460
  <div id="delete-result-modal" class="modal-overlay" onclick="closeDeleteResultModal()">
452
- <div class="modal" onclick="event.stopPropagation()" style="max-width: 500px;">
461
+ <div class="modal" onclick="event.stopPropagation()">
453
462
  <div class="modal-header">
454
463
  <h3 class="modal-title">Deletion Result</h3>
455
464
  <button class="modal-close" aria-label="Close dialog" onclick="closeDeleteResultModal()">
@@ -517,7 +526,7 @@
517
526
 
518
527
  <!-- Blocked Task Warning Modal -->
519
528
  <div id="blocked-task-modal" class="modal-overlay" onclick="closeBlockedTaskModal()">
520
- <div class="modal" onclick="event.stopPropagation()" style="max-width: 450px;">
529
+ <div class="modal modal-sm" onclick="event.stopPropagation()">
521
530
  <div class="modal-header">
522
531
  <h3 class="modal-title" style="display: flex; align-items: center; gap: 8px;">
523
532
  <svg viewBox="0 0 24 24" fill="none" stroke="#ef4444" stroke-width="2" style="width: 20px; height: 20px;">
@@ -593,6 +602,29 @@
593
602
  </div>
594
603
  </div>
595
604
 
605
+ <div id="storage-modal" class="modal-overlay" onclick="closeStorageManager()">
606
+ <div class="modal storage-modal" onclick="event.stopPropagation()">
607
+ <div class="modal-header">
608
+ <h3 class="modal-title">Storage Manager</h3>
609
+ <div style="display:flex;align-items:center;gap:8px;">
610
+ <span id="storage-total" class="storage-total"></span>
611
+ <button class="modal-close" aria-label="Close dialog" onclick="closeStorageManager()">
612
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
613
+ </button>
614
+ </div>
615
+ </div>
616
+ <div class="storage-tabs">
617
+ <button class="storage-tab active" data-tab="sessions" onclick="switchStorageTab('sessions')">Sessions</button>
618
+ <button class="storage-tab" data-tab="scratchpads" onclick="switchStorageTab('scratchpads')">Scratchpads</button>
619
+ </div>
620
+ <div class="modal-body" id="storage-modal-body" style="overflow-y:auto;min-height:200px;max-height:60vh;padding-top:16px;padding-right:8px;"></div>
621
+ <div class="modal-footer">
622
+ <button id="storage-cleanup-btn" class="btn btn-secondary" onclick="cleanupOrphanedStorage()">Clean Orphaned</button>
623
+ <button class="btn btn-primary" onclick="closeStorageManager()">Close</button>
624
+ </div>
625
+ </div>
626
+ </div>
627
+
596
628
  <div id="toast" class="toast"></div>
597
629
  </body>
598
630
  </html>
package/public/style.css CHANGED
@@ -488,13 +488,16 @@ body::before {
488
488
  display: block;
489
489
  width: 100%;
490
490
  padding: 12px 14px;
491
- margin-bottom: 2px;
491
+ margin-bottom: 4px;
492
492
  background: transparent;
493
493
  border: 1px solid transparent;
494
494
  border-radius: 8px;
495
495
  text-align: left;
496
496
  cursor: pointer;
497
497
  transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
498
+ box-shadow:
499
+ 0 1px 3px rgba(0, 0, 0, 0.12),
500
+ 0 1px 2px rgba(0, 0, 0, 0.08);
498
501
  }
499
502
 
500
503
  .session-item:hover {
@@ -565,6 +568,11 @@ body::before {
565
568
  text-overflow: ellipsis;
566
569
  }
567
570
 
571
+ .session-item.plan-reveal {
572
+ outline: 1.5px solid var(--plan);
573
+ background: var(--plan-dim);
574
+ }
575
+
568
576
  .session-progress {
569
577
  display: flex;
570
578
  align-items: center;
@@ -1578,6 +1586,13 @@ body::before {
1578
1586
  font-weight: 600;
1579
1587
  }
1580
1588
 
1589
+ .shared-tasklist-badge {
1590
+ display: inline-flex;
1591
+ align-items: center;
1592
+ color: var(--accent);
1593
+ flex-shrink: 0;
1594
+ }
1595
+
1581
1596
  .team-info-btn {
1582
1597
  width: 24px;
1583
1598
  height: 24px;
@@ -1952,6 +1967,14 @@ body::before {
1952
1967
  fill: var(--accent);
1953
1968
  stroke: var(--accent);
1954
1969
  }
1970
+ .session-pin-btn.sticky {
1971
+ opacity: 1;
1972
+ color: var(--warning);
1973
+ }
1974
+ .session-pin-btn.sticky svg {
1975
+ fill: var(--warning);
1976
+ stroke: var(--warning);
1977
+ }
1955
1978
  .pinned-sessions-divider {
1956
1979
  height: 1px;
1957
1980
  margin: 4px 8px;
@@ -2560,10 +2583,10 @@ body.light .msg-assistant .msg-text {
2560
2583
  }
2561
2584
 
2562
2585
  .modal.fullscreen {
2563
- width: 76vw;
2564
- max-width: 76vw;
2565
- height: 85vh;
2566
- max-height: 85vh;
2586
+ width: 90vw;
2587
+ max-width: 90vw;
2588
+ height: 92vh;
2589
+ max-height: 92vh;
2567
2590
  }
2568
2591
 
2569
2592
  .modal.plan-modal {
@@ -2574,6 +2597,17 @@ body.light .msg-assistant .msg-text {
2574
2597
  flex-direction: column;
2575
2598
  }
2576
2599
 
2600
+ .modal.plan-modal.fullscreen {
2601
+ width: 90vw;
2602
+ max-width: 90vw;
2603
+ height: 92vh;
2604
+ max-height: 92vh;
2605
+ }
2606
+
2607
+ .modal-sm {
2608
+ max-width: 440px;
2609
+ }
2610
+
2577
2611
  @keyframes live-border-pulse {
2578
2612
  0%,
2579
2613
  100% {
@@ -2812,6 +2846,196 @@ select.form-input option:checked {
2812
2846
  }
2813
2847
  /* #endregion */
2814
2848
 
2849
+ /* #region STORAGE_MANAGER */
2850
+ .storage-modal {
2851
+ width: 90%;
2852
+ max-width: 860px;
2853
+ max-height: 85vh;
2854
+ display: flex;
2855
+ flex-direction: column;
2856
+ }
2857
+
2858
+ .storage-project-group {
2859
+ margin-bottom: 12px;
2860
+ }
2861
+
2862
+ .storage-project-header {
2863
+ font-size: 12px;
2864
+ font-weight: 600;
2865
+ color: var(--text-secondary);
2866
+ padding: 8px 10px;
2867
+ background: var(--bg-elevated);
2868
+ border-radius: 6px;
2869
+ margin-bottom: 4px;
2870
+ display: flex;
2871
+ justify-content: space-between;
2872
+ align-items: center;
2873
+ }
2874
+
2875
+ .storage-project-header .storage-item-meta {
2876
+ font-weight: 400;
2877
+ }
2878
+
2879
+ .storage-session-group {
2880
+ padding-left: 12px;
2881
+ border-left: 2px solid color-mix(in srgb, var(--border) 60%, transparent);
2882
+ margin-left: 8px;
2883
+ margin-bottom: 8px;
2884
+ }
2885
+
2886
+ .storage-total {
2887
+ font-size: 11px;
2888
+ color: var(--text-muted);
2889
+ font-family: var(--mono);
2890
+ }
2891
+
2892
+ .storage-tabs {
2893
+ display: flex;
2894
+ gap: 0;
2895
+ border-bottom: 1px solid var(--border);
2896
+ margin: -4px -24px 0;
2897
+ padding: 0 24px;
2898
+ flex-shrink: 0;
2899
+ }
2900
+
2901
+ .storage-tab {
2902
+ background: none;
2903
+ border: none;
2904
+ color: var(--text-secondary);
2905
+ padding: 8px 16px;
2906
+ font-size: 13px;
2907
+ font-family: var(--mono);
2908
+ cursor: pointer;
2909
+ border-bottom: 2px solid transparent;
2910
+ transition:
2911
+ color 0.15s,
2912
+ border-color 0.15s;
2913
+ }
2914
+
2915
+ .storage-tab:hover {
2916
+ color: var(--text-primary);
2917
+ }
2918
+
2919
+ .storage-tab.active {
2920
+ color: var(--accent);
2921
+ border-bottom-color: var(--accent);
2922
+ }
2923
+
2924
+ .storage-item {
2925
+ display: flex;
2926
+ align-items: center;
2927
+ justify-content: space-between;
2928
+ padding: 8px 0;
2929
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
2930
+ gap: 8px;
2931
+ }
2932
+
2933
+ .storage-item:last-child {
2934
+ border-bottom: none;
2935
+ }
2936
+
2937
+ .storage-item-clickable {
2938
+ cursor: pointer;
2939
+ }
2940
+
2941
+ .storage-item-clickable:hover {
2942
+ background: var(--bg-hover);
2943
+ border-radius: 4px;
2944
+ }
2945
+
2946
+ .storage-item-id {
2947
+ font-family: var(--mono);
2948
+ font-size: 12px;
2949
+ color: var(--text-secondary);
2950
+ overflow: hidden;
2951
+ text-overflow: ellipsis;
2952
+ white-space: nowrap;
2953
+ flex: 1;
2954
+ min-width: 0;
2955
+ }
2956
+
2957
+ .storage-item-meta {
2958
+ font-size: 11px;
2959
+ color: var(--text-muted);
2960
+ flex-shrink: 0;
2961
+ white-space: nowrap;
2962
+ }
2963
+
2964
+ .storage-item-badge {
2965
+ font-size: 10px;
2966
+ padding: 2px 6px;
2967
+ border-radius: 4px;
2968
+ background: var(--bg-hover);
2969
+ color: var(--text-secondary);
2970
+ flex-shrink: 0;
2971
+ font-family: var(--mono);
2972
+ }
2973
+
2974
+ .storage-item-badge.orphan {
2975
+ background: rgba(239, 68, 68, 0.15);
2976
+ color: #ef4444;
2977
+ }
2978
+
2979
+ .storage-item-badge.pinned {
2980
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
2981
+ color: var(--accent);
2982
+ }
2983
+
2984
+ .storage-item-badge.sticky {
2985
+ background: rgba(234, 179, 8, 0.15);
2986
+ color: #eab308;
2987
+ }
2988
+
2989
+ .storage-item-actions {
2990
+ display: flex;
2991
+ gap: 4px;
2992
+ flex-shrink: 0;
2993
+ }
2994
+
2995
+ .storage-item-actions button {
2996
+ background: none;
2997
+ border: 1px solid var(--border);
2998
+ border-radius: 4px;
2999
+ color: var(--text-secondary);
3000
+ padding: 2px 8px;
3001
+ font-size: 11px;
3002
+ cursor: pointer;
3003
+ font-family: var(--mono);
3004
+ transition: all 0.15s;
3005
+ }
3006
+
3007
+ .storage-item-actions button:hover {
3008
+ background: var(--bg-hover);
3009
+ color: var(--text-primary);
3010
+ }
3011
+
3012
+ .storage-item-actions button.danger:hover {
3013
+ background: rgba(239, 68, 68, 0.15);
3014
+ color: #ef4444;
3015
+ }
3016
+
3017
+ .storage-group-header {
3018
+ font-size: 12px;
3019
+ color: var(--text-muted);
3020
+ padding: 12px 0 4px;
3021
+ font-weight: 600;
3022
+ display: flex;
3023
+ justify-content: space-between;
3024
+ align-items: center;
3025
+ }
3026
+
3027
+ .storage-group-header:first-child {
3028
+ padding-top: 0;
3029
+ }
3030
+
3031
+ .storage-empty {
3032
+ text-align: center;
3033
+ padding: 32px 0;
3034
+ color: var(--text-muted);
3035
+ font-size: 13px;
3036
+ }
3037
+ /* #endregion */
3038
+
2815
3039
  /* #region A11Y */
2816
3040
  .skip-link {
2817
3041
  position: absolute;
@@ -3002,6 +3226,18 @@ select.form-input option:checked {
3002
3226
  white-space: nowrap;
3003
3227
  }
3004
3228
 
3229
+ .project-view-btn {
3230
+ color: var(--text-muted);
3231
+ cursor: pointer;
3232
+ display: flex;
3233
+ align-items: center;
3234
+ transition: color 0.15s;
3235
+ }
3236
+
3237
+ .project-view-btn:hover {
3238
+ color: var(--accent);
3239
+ }
3240
+
3005
3241
  .project-group-header .group-count {
3006
3242
  font-weight: 400;
3007
3243
  color: var(--text-muted);
@@ -3061,6 +3297,80 @@ select.form-input option:checked {
3061
3297
  display: none;
3062
3298
  }
3063
3299
 
3300
+ .pinned-sub-section {
3301
+ margin-bottom: 2px;
3302
+ }
3303
+
3304
+ .pinned-sub-header {
3305
+ display: flex;
3306
+ align-items: center;
3307
+ gap: 4px;
3308
+ padding: 4px 10px 3px 18px;
3309
+ cursor: pointer;
3310
+ user-select: none;
3311
+ font-size: 10px;
3312
+ color: var(--text-muted);
3313
+ }
3314
+
3315
+ .pinned-sub-header:hover {
3316
+ color: var(--text-secondary);
3317
+ }
3318
+
3319
+ .pinned-sub-header .group-chevron {
3320
+ transition: transform 0.15s ease;
3321
+ flex-shrink: 0;
3322
+ }
3323
+
3324
+ .pinned-sub-header.collapsed .group-chevron {
3325
+ transform: rotate(-90deg);
3326
+ }
3327
+
3328
+ .pinned-sub-label {
3329
+ font-weight: 500;
3330
+ letter-spacing: 0.3px;
3331
+ }
3332
+
3333
+ .pinned-ungroup-btn {
3334
+ margin-left: auto;
3335
+ font-size: 14px;
3336
+ line-height: 1;
3337
+ color: var(--text-muted);
3338
+ cursor: pointer;
3339
+ padding: 0 2px;
3340
+ opacity: 0;
3341
+ transition:
3342
+ opacity 0.15s,
3343
+ color 0.15s;
3344
+ }
3345
+
3346
+ .pinned-sub-header:hover .pinned-ungroup-btn {
3347
+ opacity: 1;
3348
+ }
3349
+
3350
+ .pinned-ungroup-btn:hover {
3351
+ color: var(--accent);
3352
+ }
3353
+
3354
+ .pinned-sub-items.collapsed {
3355
+ display: none;
3356
+ }
3357
+
3358
+ .pinned-regroup-banner {
3359
+ display: flex;
3360
+ align-items: center;
3361
+ gap: 5px;
3362
+ padding: 4px 10px;
3363
+ font-size: 10px;
3364
+ color: var(--text-muted);
3365
+ cursor: pointer;
3366
+ user-select: none;
3367
+ transition: color 0.15s;
3368
+ }
3369
+
3370
+ .pinned-regroup-banner:hover {
3371
+ color: var(--accent);
3372
+ }
3373
+
3064
3374
  /* Session list hover accent bar */
3065
3375
  .session-item {
3066
3376
  position: relative;