reviewflow 3.25.0 → 3.26.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/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.26.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.25.0...reviewflow-v3.26.0) (2026-05-27)
9
+
10
+
11
+ ### Added
12
+
13
+ * **dashboard:** make now lane collapsible ([#225](https://github.com/DGouron/review-flow/issues/225)) ([7c895ba](https://github.com/DGouron/review-flow/commit/7c895bacb79637b0116198a2fdc74d6cf75f9fe5))
14
+
8
15
  ## [3.25.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.24.2...reviewflow-v3.25.0) (2026-05-27)
9
16
 
10
17
 
@@ -372,7 +372,7 @@
372
372
  } from './modules/animations.js';
373
373
  import { escapeHtml, markdownToHtml, sanitizeHttpUrl } from './modules/html.js';
374
374
  import { getAgentIcon, icon, refreshIcons } from './modules/icons.js';
375
- import { MAX_RECONNECT_ATTEMPTS, RECONNECT_DELAY, STORAGE_KEY_CURRENT, STORAGE_KEY_FOCUS_STRIP_MODE, QUALITY_TARGET_SCORE } from './modules/constants.js';
375
+ import { MAX_RECONNECT_ATTEMPTS, RECONNECT_DELAY, STORAGE_KEY_CURRENT, STORAGE_KEY_FOCUS_STRIP_MODE, STORAGE_KEY_NOW_LANE_COLLAPSED, QUALITY_TARGET_SCORE } from './modules/constants.js';
376
376
  import { buildTabBarModel, renderTabBarHtml, readActiveTab, writeActiveTab } from './modules/tabBar.js';
377
377
  import { buildManagePanelModel, renderManagePanelHtml, buildOptimisticAddedRow, validateLocalPathInput } from './modules/managePanel.js';
378
378
  import { renderOverviewHtml } from './modules/overview.js';
@@ -439,6 +439,7 @@
439
439
  let hasLoadedStatusOnce = false;
440
440
  const secondarySections = ['active-followups-section', 'pending-approval-section', 'completed-reviews-section'];
441
441
  const sectionExpandedState = Object.fromEntries(secondarySections.map((sectionIdentifier) => [sectionIdentifier, false]));
442
+ let nowLaneCollapsed = false;
442
443
  const quietRefreshSections = [
443
444
  'active-reviews-section',
444
445
  'active-followups-section',
@@ -507,6 +508,30 @@
507
508
  refreshIcons();
508
509
  }
509
510
 
511
+ function applyNowLaneCollapsed() {
512
+ const lane = document.getElementById('queue-lane-now');
513
+ if (!lane) return;
514
+ const body = document.getElementById('queue-lane-now-body');
515
+ const header = lane.querySelector('.queue-lane-header');
516
+ const toggle = lane.querySelector('.queue-lane-toggle');
517
+ if (body) body.classList.toggle('hidden', nowLaneCollapsed);
518
+ if (toggle) toggle.classList.toggle('collapsed', nowLaneCollapsed);
519
+ if (header) header.setAttribute('aria-expanded', nowLaneCollapsed ? 'false' : 'true');
520
+ }
521
+
522
+ function loadNowLaneCollapsed() {
523
+ const value = localStorage.getItem(STORAGE_KEY_NOW_LANE_COLLAPSED);
524
+ nowLaneCollapsed = value === 'collapsed';
525
+ applyNowLaneCollapsed();
526
+ }
527
+
528
+ function toggleNowLane() {
529
+ nowLaneCollapsed = !nowLaneCollapsed;
530
+ localStorage.setItem(STORAGE_KEY_NOW_LANE_COLLAPSED, nowLaneCollapsed ? 'collapsed' : 'expanded');
531
+ applyNowLaneCollapsed();
532
+ refreshIcons();
533
+ }
534
+
510
535
  function setLoadingFlag(source, isLoading) {
511
536
  if (!(source in loadingState)) return;
512
537
  const nextValue = isLoading
@@ -1841,14 +1866,18 @@
1841
1866
  )
1842
1867
  : `<div class="empty-state">${t('queueLane.emptyReadyToApprove')}</div>`;
1843
1868
 
1869
+ const nowLaneCollapsedClass = nowLaneCollapsed ? 'collapsed' : '';
1844
1870
  return `
1845
1871
  <div class="queue-lanes-grid">
1846
- <div class="queue-lane">
1847
- <div class="queue-lane-header">
1872
+ <div class="queue-lane" id="queue-lane-now">
1873
+ <div class="queue-lane-header clickable" onclick="toggleNowLane()" role="button" tabindex="0" aria-expanded="${nowLaneCollapsed ? 'false' : 'true'}" aria-controls="queue-lane-now-body" onkeydown="activateOnKeydown(event)">
1848
1874
  <span class="queue-lane-title">${t('queueLane.now')}</span>
1849
- <span class="queue-lane-count">${queueLanesModel.nowLaneCount}</span>
1875
+ <span class="queue-lane-header-right">
1876
+ <span class="queue-lane-count">${queueLanesModel.nowLaneCount}</span>
1877
+ <span class="queue-lane-toggle ${nowLaneCollapsedClass}"><i data-lucide="chevron-down"></i></span>
1878
+ </span>
1850
1879
  </div>
1851
- <div class="queue-lane-body">${nowLaneContent}</div>
1880
+ <div class="queue-lane-body ${nowLaneCollapsed ? 'hidden' : ''}" id="queue-lane-now-body">${nowLaneContent}</div>
1852
1881
  </div>
1853
1882
  <div class="queue-lane">
1854
1883
  <div class="queue-lane-header">
@@ -3389,6 +3418,7 @@
3389
3418
  window.confirmMarkAsMerged = confirmMarkAsMerged;
3390
3419
  window.toggleFocusStripMode = toggleFocusStripMode;
3391
3420
  window.toggleSection = toggleSection;
3421
+ window.toggleNowLane = toggleNowLane;
3392
3422
  window.onUsefulLinkAction = onUsefulLinkAction;
3393
3423
  window.activateOnKeydown = activateOnKeydown;
3394
3424
  window.handleCleanupClick = handleCleanupClick;
@@ -3417,6 +3447,7 @@
3417
3447
  Notification.requestPermission().catch(() => {});
3418
3448
  }
3419
3449
  loadFocusStripMode();
3450
+ loadNowLaneCollapsed();
3420
3451
  renderStaticLabels();
3421
3452
  updateSessionMetricsUI();
3422
3453
  connectWebSocket();
@@ -3,6 +3,7 @@ export const RECONNECT_DELAY: 3000;
3
3
  export const STORAGE_KEY_PROJECTS: "review-flow-projects";
4
4
  export const STORAGE_KEY_CURRENT: "review-flow-current-project";
5
5
  export const STORAGE_KEY_FOCUS_STRIP_MODE: "review-flow-focus-strip-mode";
6
+ export const STORAGE_KEY_NOW_LANE_COLLAPSED: "review-flow-now-lane-collapsed";
6
7
  export const STORAGE_KEY_ACTIVE_TAB: "review-flow-active-tab";
7
8
  export const QUALITY_TARGET_SCORE: 8;
8
9
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/dashboard/modules/constants.js"],"names":[],"mappings":"AAAA,qCAAsC,EAAE,CAAC;AACzC,8BAA+B,IAAI,CAAC;AACpC,mCAAoC,sBAAsB,CAAC;AAC3D,kCAAmC,6BAA6B,CAAC;AACjE,2CAA4C,8BAA8B,CAAC;AAC3E,qCAAsC,wBAAwB,CAAC;AAC/D,mCAAoC,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/dashboard/modules/constants.js"],"names":[],"mappings":"AAAA,qCAAsC,EAAE,CAAC;AACzC,8BAA+B,IAAI,CAAC;AACpC,mCAAoC,sBAAsB,CAAC;AAC3D,kCAAmC,6BAA6B,CAAC;AACjE,2CAA4C,8BAA8B,CAAC;AAC3E,6CAA8C,gCAAgC,CAAC;AAC/E,qCAAsC,wBAAwB,CAAC;AAC/D,mCAAoC,CAAC,CAAC"}
@@ -3,5 +3,6 @@ export const RECONNECT_DELAY = 3000;
3
3
  export const STORAGE_KEY_PROJECTS = 'review-flow-projects';
4
4
  export const STORAGE_KEY_CURRENT = 'review-flow-current-project';
5
5
  export const STORAGE_KEY_FOCUS_STRIP_MODE = 'review-flow-focus-strip-mode';
6
+ export const STORAGE_KEY_NOW_LANE_COLLAPSED = 'review-flow-now-lane-collapsed';
6
7
  export const STORAGE_KEY_ACTIVE_TAB = 'review-flow-active-tab';
7
8
  export const QUALITY_TARGET_SCORE = 8;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/dashboard/modules/constants.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AACjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,8BAA8B,CAAC;AAC3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/dashboard/modules/constants.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AACjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,8BAA8B,CAAC;AAC3E,MAAM,CAAC,MAAM,8BAA8B,GAAG,gCAAgC,CAAC;AAC/E,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
@@ -1877,6 +1877,33 @@ body.compact-density .log-entry {
1877
1877
  padding: 0.55rem 0.65rem 0.2rem;
1878
1878
  }
1879
1879
 
1880
+ .queue-lane-header.clickable {
1881
+ cursor: pointer;
1882
+ user-select: none;
1883
+ }
1884
+
1885
+ .queue-lane-header-right {
1886
+ display: inline-flex;
1887
+ align-items: center;
1888
+ gap: 0.5rem;
1889
+ }
1890
+
1891
+ .queue-lane-toggle {
1892
+ display: inline-flex;
1893
+ align-items: center;
1894
+ color: #7d8aa4;
1895
+ }
1896
+
1897
+ .queue-lane-toggle [data-lucide] {
1898
+ width: 15px;
1899
+ height: 15px;
1900
+ transition: transform 0.2s;
1901
+ }
1902
+
1903
+ .queue-lane-toggle.collapsed [data-lucide] {
1904
+ transform: rotate(-90deg);
1905
+ }
1906
+
1880
1907
  .now-lane-copy {
1881
1908
  flex: 1;
1882
1909
  min-width: 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reviewflow",
3
- "version": "3.25.0",
3
+ "version": "3.26.0",
4
4
  "description": "AI-powered code review automation for GitLab/GitHub using Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/main/server.js",