claude-code-kanban 7.6.1 → 7.8.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.
@@ -0,0 +1,21 @@
1
+ // Loaded by the page as a plain script and by lib/user-groups.js through require, so the board's
2
+ // transient sweep and the server's prune and expiry delete nested groups by one rule.
3
+ const groupTree = (() => {
4
+ // The groups `goes` names whose child groups all go too.
5
+ function cascade(groups, goes) {
6
+ const children = new Map();
7
+ for (const g of groups) {
8
+ if (!children.has(g.parent)) children.set(g.parent, []);
9
+ children.get(g.parent).push(g);
10
+ }
11
+ const memo = new Map();
12
+ const all = (g) => {
13
+ if (!memo.has(g)) memo.set(g, goes(g) && (children.get(g.id) || []).every(all));
14
+ return memo.get(g);
15
+ };
16
+ return new Set(groups.filter(all));
17
+ }
18
+ return { cascade };
19
+ })();
20
+
21
+ if (typeof module === 'object' && module.exports) module.exports = groupTree;
package/public/index.html CHANGED
@@ -28,6 +28,7 @@
28
28
  <script defer src="/project-match.js"></script>
29
29
  <script defer src="/tree-highlight.js"></script>
30
30
  <script defer src="/link-url.js"></script>
31
+ <script defer src="/group-tree.js"></script>
31
32
  <script defer src="/app.js"></script>
32
33
  </head>
33
34
  <body class="booting">
@@ -391,6 +392,7 @@
391
392
  <path d="M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/>
392
393
  </svg>
393
394
  </button>
395
+ <button id="expand-detail" class="detail-close detail-expand" type="button"></button>
394
396
  <button id="close-detail" class="detail-close" aria-label="Close detail panel">
395
397
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
396
398
  <path d="M6 18L18 6M6 6l12 12"/>
@@ -523,21 +525,25 @@
523
525
 
524
526
  <!-- Confirmation Modal -->
525
527
  <div id="confirm-modal" class="modal-overlay" onclick="closeConfirmModal?.(false)">
526
- <div class="modal modal-sm" onclick="event.stopPropagation()">
527
- <div class="modal-header">
528
- <h3 id="confirm-modal-title" class="modal-title"></h3>
529
- <button class="modal-close" aria-label="Close dialog" onclick="closeConfirmModal?.(false)">
530
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
531
- <path d="M18 6L6 18M6 6l12 12"/>
532
- </svg>
533
- </button>
534
- </div>
535
- <div class="modal-body">
536
- <p id="confirm-modal-message" style="margin: 0; color: var(--text-primary);"></p>
537
- </div>
538
- <div class="modal-footer">
539
- <button id="confirm-cancel-btn" class="btn btn-secondary" onclick="closeConfirmModal?.(false)">Cancel</button>
540
- <button id="confirm-ok-btn" class="btn btn-danger" onclick="closeConfirmModal?.(true)"></button>
528
+ <div class="modal modal-sm confirm-dialog" onclick="event.stopPropagation()" role="alertdialog" aria-labelledby="confirm-modal-title" aria-describedby="confirm-modal-message">
529
+ <div class="modal-body confirm-body">
530
+ <div class="confirm-top">
531
+ <div class="confirm-icon" aria-hidden="true">!</div>
532
+ <div>
533
+ <h3 id="confirm-modal-title" class="confirm-title"></h3>
534
+ <p id="confirm-modal-message" class="confirm-message"></p>
535
+ </div>
536
+ </div>
537
+ <div id="confirm-modal-chip" class="confirm-chip" hidden></div>
538
+ <div id="confirm-modal-list" class="confirm-list" hidden></div>
539
+ <div id="confirm-modal-warn" class="confirm-warn" hidden></div>
540
+ </div>
541
+ <div class="modal-footer confirm-footer">
542
+ <span class="confirm-hint"><span><kbd>Enter</kbd> confirm</span><span><kbd>Esc</kbd> cancel</span></span>
543
+ <div class="confirm-buttons">
544
+ <button id="confirm-cancel-btn" class="btn btn-secondary" onclick="closeConfirmModal?.(false)">Cancel</button>
545
+ <button id="confirm-ok-btn" class="btn btn-danger" onclick="closeConfirmModal?.(true)"></button>
546
+ </div>
541
547
  </div>
542
548
  </div>
543
549
  </div>
@@ -548,7 +554,7 @@
548
554
  <div class="modal-header">
549
555
  <h3 id="team-modal-title" class="modal-title">Team</h3>
550
556
  <div style="display:flex;align-items:center;gap:4px;">
551
- <button id="session-info-sticky-btn" class="icon-btn" style="display:none" title="Sticky pin — always show at top" onclick="toggleSessionSticky(_infoModalSessionId); updateStickyBtnState()">
557
+ <button id="session-info-sticky-btn" class="icon-btn" style="display:none" title="Sticky pin — always show in the list" onclick="toggleSessionSticky(_infoModalSessionId); updateStickyBtnState()">
552
558
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2 L15 9 L22 9 L17 14 L19 22 L12 18 L5 22 L7 14 L2 9 L9 9 Z"/></svg>
553
559
  </button>
554
560
  <button id="session-info-cost-btn" class="icon-btn" style="display:none" title="Open in Cost" onclick="openCost(_infoModalSessionId)">
@@ -746,13 +752,16 @@
746
752
  </button>
747
753
  </div>
748
754
  </div>
749
- <div class="storage-tabs">
750
- <button class="storage-tab active" data-tab="sessions" onclick="switchStorageTab('sessions')">Sessions</button>
751
- <button class="storage-tab" data-tab="scratchpads" onclick="switchStorageTab('scratchpads')">Scratchpads</button>
752
- <button class="storage-tab" data-tab="linked-docs" onclick="switchStorageTab('linked-docs')">Linked Docs</button>
755
+ <div class="storage-tabs" role="tablist" aria-label="Storage" title="← → switch tab">
756
+ <button class="storage-tab active" role="tab" aria-selected="true" data-tab="sessions" onclick="switchStorageTab('sessions')">Sessions</button>
757
+ <button class="storage-tab" role="tab" aria-selected="false" data-tab="dismissed" onclick="switchStorageTab('dismissed')">Dismissed</button>
758
+ <button class="storage-tab" role="tab" aria-selected="false" data-tab="scratchpads" onclick="switchStorageTab('scratchpads')">Scratchpads</button>
759
+ <button class="storage-tab" role="tab" aria-selected="false" data-tab="linked-docs" onclick="switchStorageTab('linked-docs')">Linked Docs</button>
760
+ <button class="storage-tab" role="tab" aria-selected="false" data-tab="groups" onclick="switchStorageTab('groups')">Groups</button>
753
761
  </div>
754
762
  <div class="modal-body modal-zoomable" id="storage-modal-body"></div>
755
763
  <div class="modal-footer">
764
+ <button id="storage-groups-clean-btn" class="btn btn-secondary" style="display:none" disabled title="Take the sessions the sidebar hides (not active or dismissed, and not pinned) out of every group" onclick="_storageCleanGroup(null)">Clean all</button>
756
765
  <button id="storage-cleanup-btn" class="btn btn-secondary" onclick="cleanupOrphanedStorage()">Clean Orphaned</button>
757
766
  <button class="btn btn-secondary" onclick="closeStorageManager()">Close</button>
758
767
  </div>
@@ -820,15 +829,31 @@
820
829
  </div>
821
830
  </div>
822
831
  <div class="ns-row ns-extra">
823
- <label class="ns-label" for="ns-model">Model</label>
832
+ <span class="ns-label"></span>
824
833
  <div class="ns-field">
825
- <select id="ns-model" class="form-input">
826
- <option value="">Default</option>
827
- <option value="fable">Fable</option>
828
- <option value="opus">Opus</option>
829
- <option value="sonnet">Sonnet</option>
830
- <option value="haiku">Haiku</option>
831
- </select>
834
+ <div class="ns-inline">
835
+ <fieldset class="ns-notched">
836
+ <legend><label for="ns-model">Model</label></legend>
837
+ <select id="ns-model" class="form-input">
838
+ <option value="">Default</option>
839
+ <option value="fable">Fable</option>
840
+ <option value="opus">Opus</option>
841
+ <option value="sonnet">Sonnet</option>
842
+ <option value="haiku">Haiku</option>
843
+ </select>
844
+ </fieldset>
845
+ <fieldset class="ns-notched">
846
+ <legend><label for="ns-effort">Effort</label></legend>
847
+ <select id="ns-effort" class="form-input">
848
+ <option value="">Default</option>
849
+ <option value="low">Low</option>
850
+ <option value="medium">Medium</option>
851
+ <option value="high">High</option>
852
+ <option value="xhigh">XHigh</option>
853
+ <option value="max">Max</option>
854
+ </select>
855
+ </fieldset>
856
+ </div>
832
857
  </div>
833
858
  </div>
834
859
  <div id="ns-error" class="ns-error" hidden></div>