dmux 3.1.1 → 3.2.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/dist/CleanTextInput.d.ts +9 -0
- package/dist/CleanTextInput.d.ts.map +1 -1
- package/dist/CleanTextInput.js +127 -47
- package/dist/CleanTextInput.js.map +1 -1
- package/dist/DmuxApp.d.ts +2 -2
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +1396 -750
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/paneActions.d.ts.map +1 -1
- package/dist/actions/paneActions.js +68 -11
- package/dist/actions/paneActions.js.map +1 -1
- package/dist/actions/types.d.ts +1 -0
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +1 -0
- package/dist/actions/types.js.map +1 -1
- package/dist/components/ActionInputDialog.d.ts.map +1 -1
- package/dist/components/ActionInputDialog.js +3 -2
- package/dist/components/ActionInputDialog.js.map +1 -1
- package/dist/components/DialogBox.d.ts +16 -0
- package/dist/components/DialogBox.d.ts.map +1 -0
- package/dist/components/DialogBox.js +12 -0
- package/dist/components/DialogBox.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +9 -0
- package/dist/components/FooterHelp.d.ts.map +1 -1
- package/dist/components/FooterHelp.js +41 -5
- package/dist/components/FooterHelp.js.map +1 -1
- package/dist/components/PaneCard.d.ts +3 -1
- package/dist/components/PaneCard.d.ts.map +1 -1
- package/dist/components/PaneCard.js +50 -33
- package/dist/components/PaneCard.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +3 -5
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +40 -10
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/dashboard.js +1 -1
- package/dist/decorative-pane.d.ts +3 -0
- package/dist/decorative-pane.d.ts.map +1 -0
- package/dist/decorative-pane.js +136 -0
- package/dist/decorative-pane.js.map +1 -0
- package/dist/hooks/useActionSystem.d.ts +14 -1
- package/dist/hooks/useActionSystem.d.ts.map +1 -1
- package/dist/hooks/useActionSystem.js +93 -4
- package/dist/hooks/useActionSystem.js.map +1 -1
- package/dist/hooks/useNavigation.js +1 -1
- package/dist/hooks/useNavigation.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +1 -2
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +13 -27
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneRunner.d.ts.map +1 -1
- package/dist/hooks/usePaneRunner.js +8 -3
- package/dist/hooks/usePaneRunner.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +210 -37
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +7 -13
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +217 -29
- package/dist/index.js.map +1 -1
- package/dist/popups/agentChoicePopup.d.ts +7 -0
- package/dist/popups/agentChoicePopup.d.ts.map +1 -0
- package/dist/popups/agentChoicePopup.js +74 -0
- package/dist/popups/agentChoicePopup.js.map +1 -0
- package/dist/popups/choicePopup.d.ts +7 -0
- package/dist/popups/choicePopup.d.ts.map +1 -0
- package/dist/popups/choicePopup.js +64 -0
- package/dist/popups/choicePopup.js.map +1 -0
- package/dist/popups/components/FileList.d.ts +13 -0
- package/dist/popups/components/FileList.d.ts.map +1 -0
- package/dist/popups/components/FileList.js +61 -0
- package/dist/popups/components/FileList.js.map +1 -0
- package/dist/popups/components/PopupContainer.d.ts +14 -0
- package/dist/popups/components/PopupContainer.d.ts.map +1 -0
- package/dist/popups/components/PopupContainer.js +15 -0
- package/dist/popups/components/PopupContainer.js.map +1 -0
- package/dist/popups/components/PopupInputBox.d.ts +11 -0
- package/dist/popups/components/PopupInputBox.d.ts.map +1 -0
- package/dist/popups/components/PopupInputBox.js +10 -0
- package/dist/popups/components/PopupInputBox.js.map +1 -0
- package/dist/popups/components/PopupWrapper.d.ts +37 -0
- package/dist/popups/components/PopupWrapper.d.ts.map +1 -0
- package/dist/popups/components/PopupWrapper.js +88 -0
- package/dist/popups/components/PopupWrapper.js.map +1 -0
- package/dist/popups/components/index.d.ts +8 -0
- package/dist/popups/components/index.d.ts.map +1 -0
- package/dist/popups/components/index.js +8 -0
- package/dist/popups/components/index.js.map +1 -0
- package/dist/popups/config.d.ts +40 -0
- package/dist/popups/config.d.ts.map +1 -0
- package/dist/popups/config.js +40 -0
- package/dist/popups/config.js.map +1 -0
- package/dist/popups/confirmPopup.d.ts +7 -0
- package/dist/popups/confirmPopup.d.ts.map +1 -0
- package/dist/popups/confirmPopup.js +72 -0
- package/dist/popups/confirmPopup.js.map +1 -0
- package/dist/popups/hooksPopup.d.ts +7 -0
- package/dist/popups/hooksPopup.d.ts.map +1 -0
- package/dist/popups/hooksPopup.js +71 -0
- package/dist/popups/hooksPopup.js.map +1 -0
- package/dist/popups/inputPopup.d.ts +7 -0
- package/dist/popups/inputPopup.d.ts.map +1 -0
- package/dist/popups/inputPopup.js +48 -0
- package/dist/popups/inputPopup.js.map +1 -0
- package/dist/popups/kebabMenuPopup.d.ts +7 -0
- package/dist/popups/kebabMenuPopup.d.ts.map +1 -0
- package/dist/popups/kebabMenuPopup.js +52 -0
- package/dist/popups/kebabMenuPopup.js.map +1 -0
- package/dist/popups/logsPopup.d.ts +12 -0
- package/dist/popups/logsPopup.d.ts.map +1 -0
- package/dist/popups/logsPopup.js +364 -0
- package/dist/popups/logsPopup.js.map +1 -0
- package/dist/popups/mergePopup.d.ts +7 -0
- package/dist/popups/mergePopup.d.ts.map +1 -0
- package/dist/popups/mergePopup.js +310 -0
- package/dist/popups/mergePopup.js.map +1 -0
- package/dist/popups/newPanePopup.d.ts +7 -0
- package/dist/popups/newPanePopup.d.ts.map +1 -0
- package/dist/popups/newPanePopup.js +234 -0
- package/dist/popups/newPanePopup.js.map +1 -0
- package/dist/popups/progressPopup.d.ts +8 -0
- package/dist/popups/progressPopup.d.ts.map +1 -0
- package/dist/popups/progressPopup.js +54 -0
- package/dist/popups/progressPopup.js.map +1 -0
- package/dist/popups/remotePopup.d.ts +6 -0
- package/dist/popups/remotePopup.d.ts.map +1 -0
- package/dist/popups/remotePopup.js +166 -0
- package/dist/popups/remotePopup.js.map +1 -0
- package/dist/popups/settingsPopup.d.ts +7 -0
- package/dist/popups/settingsPopup.d.ts.map +1 -0
- package/dist/popups/settingsPopup.js +212 -0
- package/dist/popups/settingsPopup.js.map +1 -0
- package/dist/popups/shortcutsPopup.d.ts +6 -0
- package/dist/popups/shortcutsPopup.d.ts.map +1 -0
- package/dist/popups/shortcutsPopup.js +74 -0
- package/dist/popups/shortcutsPopup.js.map +1 -0
- package/dist/popups/templates/SimpleInputPopup.d.ts +15 -0
- package/dist/popups/templates/SimpleInputPopup.d.ts.map +1 -0
- package/dist/popups/templates/SimpleInputPopup.js +28 -0
- package/dist/popups/templates/SimpleInputPopup.js.map +1 -0
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +2066 -968
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes.d.ts +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +73 -6
- package/dist/server/routes.js.map +1 -1
- package/dist/services/ConfigWatcher.d.ts.map +1 -1
- package/dist/services/ConfigWatcher.js +10 -3
- package/dist/services/ConfigWatcher.js.map +1 -1
- package/dist/services/LogService.d.ts +112 -0
- package/dist/services/LogService.d.ts.map +1 -0
- package/dist/services/LogService.js +252 -0
- package/dist/services/LogService.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -1
- package/dist/services/PaneWorkerManager.js +35 -9
- package/dist/services/PaneWorkerManager.js.map +1 -1
- package/dist/services/TunnelService.d.ts +1 -0
- package/dist/services/TunnelService.d.ts.map +1 -1
- package/dist/services/TunnelService.js +56 -15
- package/dist/services/TunnelService.js.map +1 -1
- package/dist/shared/StateManager.d.ts +49 -1
- package/dist/shared/StateManager.d.ts.map +1 -1
- package/dist/shared/StateManager.js +97 -2
- package/dist/shared/StateManager.js.map +1 -1
- package/dist/spacer-pane.d.ts +8 -0
- package/dist/spacer-pane.d.ts.map +1 -0
- package/dist/spacer-pane.js +40 -0
- package/dist/spacer-pane.js.map +1 -0
- package/dist/theme/colors.d.ts +25 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +33 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/asciiArt.d.ts +26 -0
- package/dist/utils/asciiArt.d.ts.map +1 -0
- package/dist/utils/asciiArt.js +88 -0
- package/dist/utils/asciiArt.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +8 -4
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/fileScanner.d.ts +23 -0
- package/dist/utils/fileScanner.d.ts.map +1 -0
- package/dist/utils/fileScanner.js +123 -0
- package/dist/utils/fileScanner.js.map +1 -0
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/hooks.d.ts.map +1 -1
- package/dist/utils/hooks.js +65 -36
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/layoutManager.d.ts +45 -0
- package/dist/utils/layoutManager.d.ts.map +1 -0
- package/dist/utils/layoutManager.js +500 -0
- package/dist/utils/layoutManager.js.map +1 -0
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +125 -11
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/popup.d.ts +97 -0
- package/dist/utils/popup.d.ts.map +1 -0
- package/dist/utils/popup.js +509 -0
- package/dist/utils/popup.js.map +1 -0
- package/dist/utils/postPaneCleanup.d.ts +12 -0
- package/dist/utils/postPaneCleanup.d.ts.map +1 -0
- package/dist/utils/postPaneCleanup.js +53 -0
- package/dist/utils/postPaneCleanup.js.map +1 -0
- package/dist/utils/shellPaneDetection.d.ts +44 -0
- package/dist/utils/shellPaneDetection.d.ts.map +1 -0
- package/dist/utils/shellPaneDetection.js +175 -0
- package/dist/utils/shellPaneDetection.js.map +1 -0
- package/dist/utils/tmux.d.ts +53 -1
- package/dist/utils/tmux.d.ts.map +1 -1
- package/dist/utils/tmux.js +352 -84
- package/dist/utils/tmux.js.map +1 -1
- package/dist/utils/welcomePane.d.ts +22 -0
- package/dist/utils/welcomePane.d.ts.map +1 -0
- package/dist/utils/welcomePane.js +119 -0
- package/dist/utils/welcomePane.js.map +1 -0
- package/dist/utils/welcomePaneManager.d.ts +36 -0
- package/dist/utils/welcomePaneManager.d.ts.map +1 -0
- package/dist/utils/welcomePaneManager.js +160 -0
- package/dist/utils/welcomePaneManager.js.map +1 -0
- package/dist/workers/PaneWorker.js +2 -0
- package/dist/workers/PaneWorker.js.map +1 -1
- package/package.json +5 -2
- package/dist/components/NewPaneDialog.d.ts +0 -9
- package/dist/components/NewPaneDialog.d.ts.map +0 -1
- package/dist/components/NewPaneDialog.js +0 -11
- package/dist/components/NewPaneDialog.js.map +0 -1
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import { generateSidebarGridLayout, getWindowDimensions, getAllPaneIds, } from "./tmux.js";
|
|
3
|
+
import { LogService } from "../services/LogService.js";
|
|
4
|
+
// Spacer pane identifier
|
|
5
|
+
const SPACER_PANE_TITLE = "dmux-spacer";
|
|
6
|
+
export const DEFAULT_LAYOUT_CONFIG = {
|
|
7
|
+
SIDEBAR_WIDTH: 40,
|
|
8
|
+
MIN_COMFORTABLE_WIDTH: 50,
|
|
9
|
+
MAX_COMFORTABLE_WIDTH: 80,
|
|
10
|
+
MIN_COMFORTABLE_HEIGHT: 15,
|
|
11
|
+
};
|
|
12
|
+
// Export individual constants for convenience (allows direct imports)
|
|
13
|
+
export const SIDEBAR_WIDTH = DEFAULT_LAYOUT_CONFIG.SIDEBAR_WIDTH;
|
|
14
|
+
export const MIN_COMFORTABLE_WIDTH = DEFAULT_LAYOUT_CONFIG.MIN_COMFORTABLE_WIDTH;
|
|
15
|
+
export const MAX_COMFORTABLE_WIDTH = DEFAULT_LAYOUT_CONFIG.MAX_COMFORTABLE_WIDTH;
|
|
16
|
+
export const MIN_COMFORTABLE_HEIGHT = DEFAULT_LAYOUT_CONFIG.MIN_COMFORTABLE_HEIGHT;
|
|
17
|
+
/**
|
|
18
|
+
* Finds the spacer pane ID if it exists
|
|
19
|
+
*/
|
|
20
|
+
function findSpacerPane() {
|
|
21
|
+
try {
|
|
22
|
+
const allPanes = getAllPaneIds();
|
|
23
|
+
for (const paneId of allPanes) {
|
|
24
|
+
const title = execSync(`tmux display-message -t '${paneId}' -p '#{pane_title}'`, { encoding: "utf-8", stdio: "pipe" }).trim();
|
|
25
|
+
if (title === SPACER_PANE_TITLE) {
|
|
26
|
+
return paneId;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Ignore errors
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Creates a spacer pane that displays static gray dots
|
|
37
|
+
* Always splits from the last content pane to ensure spacer comes last
|
|
38
|
+
* @param lastContentPaneId - The ID of the last content pane to split from
|
|
39
|
+
* Returns the new pane ID
|
|
40
|
+
*/
|
|
41
|
+
function createSpacerPane(lastContentPaneId) {
|
|
42
|
+
try {
|
|
43
|
+
// Store the currently active pane
|
|
44
|
+
const originalPaneId = execSync(`tmux display-message -p '#{pane_id}'`, { encoding: "utf-8", stdio: "pipe" }).trim();
|
|
45
|
+
// Switch to the last content pane
|
|
46
|
+
execSync(`tmux select-pane -t '${lastContentPaneId}'`, { stdio: "pipe" });
|
|
47
|
+
// Create a new pane running our spacer-pane script (just dots, no ASCII art)
|
|
48
|
+
// This will split from the currently active pane (the last content pane)
|
|
49
|
+
const scriptPath = `${process.cwd()}/dist/spacer-pane.js`;
|
|
50
|
+
const newPaneId = execSync(`tmux split-window -h -P -F '#{pane_id}' "node '${scriptPath}'"`, { encoding: "utf-8", stdio: "pipe" }).trim();
|
|
51
|
+
// Set the pane title to identify it as a spacer
|
|
52
|
+
execSync(`tmux select-pane -t '${newPaneId}' -T '${SPACER_PANE_TITLE}'`, {
|
|
53
|
+
stdio: "pipe"
|
|
54
|
+
});
|
|
55
|
+
// Return focus to the originally active pane
|
|
56
|
+
execSync(`tmux select-pane -t '${originalPaneId}'`, { stdio: "pipe" });
|
|
57
|
+
LogService.getInstance().debug(`Created spacer pane: ${newPaneId} (split from ${lastContentPaneId}, restored focus to ${originalPaneId})`, "Layout");
|
|
58
|
+
return newPaneId;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
LogService.getInstance().debug(`Failed to create spacer pane: ${error}`, "Layout");
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Destroys the spacer pane if it exists
|
|
67
|
+
*/
|
|
68
|
+
function destroySpacerPane(spacerId) {
|
|
69
|
+
try {
|
|
70
|
+
execSync(`tmux kill-pane -t '${spacerId}'`, { stdio: "pipe" });
|
|
71
|
+
LogService.getInstance().debug(`Destroyed spacer pane: ${spacerId}`, "Layout");
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
LogService.getInstance().debug(`Failed to destroy spacer pane: ${error}`, "Layout");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Determines if we need a spacer pane based on layout configuration
|
|
79
|
+
* We need a spacer when panes in the last row would exceed MAX_COMFORTABLE_WIDTH if stretched to fill
|
|
80
|
+
*/
|
|
81
|
+
function needsSpacerPane(numContentPanes, layout, config) {
|
|
82
|
+
const { cols, rows } = layout;
|
|
83
|
+
const MIN_SPACER_WIDTH = 20; // Minimum width for spacer pane (tmux may reject layouts with tiny panes)
|
|
84
|
+
// No spacer needed if we have no content or only one column
|
|
85
|
+
if (cols === 0 || cols === 1)
|
|
86
|
+
return false;
|
|
87
|
+
// Calculate number of panes in last row (row-based layout)
|
|
88
|
+
// For 5 panes in 3 cols: (5 % 3) || 3 = 2 (last row has 2 panes)
|
|
89
|
+
// For 6 panes in 3 cols: (6 % 3) || 3 = 3 (last row is full)
|
|
90
|
+
const panesInLastRow = (numContentPanes % cols) || cols;
|
|
91
|
+
// If last row is full, no spacer needed
|
|
92
|
+
if (panesInLastRow === cols)
|
|
93
|
+
return false;
|
|
94
|
+
// Calculate available width for the last row
|
|
95
|
+
const contentWidth = layout.windowWidth - config.SIDEBAR_WIDTH - 1;
|
|
96
|
+
const bordersInLastRow = panesInLastRow - 1;
|
|
97
|
+
const availableWidth = contentWidth - bordersInLastRow;
|
|
98
|
+
// Calculate width per pane if we distribute evenly
|
|
99
|
+
const widthPerPane = availableWidth / panesInLastRow;
|
|
100
|
+
LogService.getInstance().debug(`Spacer check: ${panesInLastRow} panes in last row, ${Math.round(availableWidth)} available width, ${Math.round(widthPerPane)} per pane (max: ${config.MAX_COMFORTABLE_WIDTH})`, "Layout");
|
|
101
|
+
// Need spacer if distributing width evenly would exceed comfortable width
|
|
102
|
+
if (widthPerPane <= config.MAX_COMFORTABLE_WIDTH) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// Calculate what the spacer width would be
|
|
106
|
+
const contentPaneWidth = config.MAX_COMFORTABLE_WIDTH;
|
|
107
|
+
const totalBorders = panesInLastRow; // Total borders if we add spacer (between N+1 panes)
|
|
108
|
+
const totalContentWidth = panesInLastRow * contentPaneWidth;
|
|
109
|
+
const spacerWidth = contentWidth - totalContentWidth - totalBorders;
|
|
110
|
+
// Only use spacer if it would be wide enough (avoid tmux rejecting tiny panes)
|
|
111
|
+
if (spacerWidth < MIN_SPACER_WIDTH) {
|
|
112
|
+
LogService.getInstance().debug(`Spacer would be too narrow (${spacerWidth} < ${MIN_SPACER_WIDTH}), skipping spacer`, "Layout");
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
// Cache last layout dimensions to avoid unnecessary spacer recreation
|
|
118
|
+
let lastLayoutDimensions = null;
|
|
119
|
+
/**
|
|
120
|
+
* MASTER LAYOUT FUNCTION
|
|
121
|
+
* Single entry point for all layout operations
|
|
122
|
+
* Called on: initial setup, pane creation, pane deletion, terminal resize
|
|
123
|
+
*/
|
|
124
|
+
export function recalculateAndApplyLayout(controlPaneId, contentPaneIds, terminalWidth, terminalHeight, config = DEFAULT_LAYOUT_CONFIG) {
|
|
125
|
+
// Step 1: Filter out any existing spacer from content panes
|
|
126
|
+
const existingSpacerId = findSpacerPane();
|
|
127
|
+
const realContentPanes = contentPaneIds.filter(id => id !== existingSpacerId);
|
|
128
|
+
// Check if dimensions and pane count have changed since last layout
|
|
129
|
+
const dimensionsUnchanged = lastLayoutDimensions &&
|
|
130
|
+
lastLayoutDimensions.width === terminalWidth &&
|
|
131
|
+
lastLayoutDimensions.height === terminalHeight &&
|
|
132
|
+
lastLayoutDimensions.paneCount === realContentPanes.length;
|
|
133
|
+
if (dimensionsUnchanged && existingSpacerId) {
|
|
134
|
+
LogService.getInstance().debug(`Layout unchanged (${terminalWidth}x${terminalHeight}, ${realContentPanes.length} panes), skipping spacer recreation`, "Layout");
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Update last layout dimensions
|
|
138
|
+
lastLayoutDimensions = {
|
|
139
|
+
width: terminalWidth,
|
|
140
|
+
height: terminalHeight,
|
|
141
|
+
paneCount: realContentPanes.length
|
|
142
|
+
};
|
|
143
|
+
// Step 2: Calculate layout for real content panes only
|
|
144
|
+
const layout = calculateOptimalLayout(realContentPanes.length, terminalWidth, terminalHeight, config);
|
|
145
|
+
// Step 3: Determine if we need a spacer pane
|
|
146
|
+
const needsSpacer = needsSpacerPane(realContentPanes.length, layout, config);
|
|
147
|
+
// Step 4: Manage spacer pane creation/destruction
|
|
148
|
+
// ALWAYS destroy existing spacer on layout recalc to ensure fresh positioning
|
|
149
|
+
let spacerId = null;
|
|
150
|
+
LogService.getInstance().debug(`Spacer management: needs=${needsSpacer}, existing=${existingSpacerId || 'none'}`, "Layout");
|
|
151
|
+
// Destroy existing spacer if present (we'll recreate if needed)
|
|
152
|
+
if (existingSpacerId) {
|
|
153
|
+
LogService.getInstance().debug(`Destroying existing spacer for recreation: ${existingSpacerId}`, "Layout");
|
|
154
|
+
destroySpacerPane(existingSpacerId);
|
|
155
|
+
}
|
|
156
|
+
// Create new spacer if needed
|
|
157
|
+
if (needsSpacer) {
|
|
158
|
+
try {
|
|
159
|
+
const lastContentPaneId = realContentPanes[realContentPanes.length - 1];
|
|
160
|
+
if (!lastContentPaneId) {
|
|
161
|
+
throw new Error('No content panes available to split from');
|
|
162
|
+
}
|
|
163
|
+
spacerId = createSpacerPane(lastContentPaneId);
|
|
164
|
+
LogService.getInstance().debug(`Created fresh spacer pane: ${spacerId}`, "Layout");
|
|
165
|
+
// CRITICAL: Wait for tmux to fully register the new pane before applying layout
|
|
166
|
+
execSync("sleep 0.05", { stdio: "pipe" });
|
|
167
|
+
// Verify the pane appears in list-panes output
|
|
168
|
+
let paneVerified = false;
|
|
169
|
+
for (let attempts = 0; attempts < 3; attempts++) {
|
|
170
|
+
try {
|
|
171
|
+
const output = execSync('tmux list-panes -F "#{pane_id}"', {
|
|
172
|
+
encoding: 'utf-8',
|
|
173
|
+
stdio: 'pipe',
|
|
174
|
+
}).trim();
|
|
175
|
+
if (output.includes(spacerId)) {
|
|
176
|
+
paneVerified = true;
|
|
177
|
+
LogService.getInstance().debug(`Verified spacer pane ${spacerId} in list-panes (attempt ${attempts + 1})`, "Layout");
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Pane not ready yet, wait a bit
|
|
183
|
+
if (attempts < 2)
|
|
184
|
+
execSync("sleep 0.05", { stdio: "pipe" });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!paneVerified) {
|
|
188
|
+
LogService.getInstance().debug(`WARNING: Spacer pane ${spacerId} not verified, continuing anyway`, "Layout");
|
|
189
|
+
// Don't throw - continue and let it fail with better logs
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
LogService.getInstance().debug(`Continuing without spacer pane: ${error}`, "Layout");
|
|
194
|
+
spacerId = null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Step 5: Build final pane list (real panes + spacer if exists)
|
|
198
|
+
let finalContentPanes = spacerId
|
|
199
|
+
? [...realContentPanes, spacerId]
|
|
200
|
+
: realContentPanes;
|
|
201
|
+
// CRITICAL: Sort panes by tmux index, then put spacer LAST
|
|
202
|
+
// Tmux applies layout geometry by pane index order!
|
|
203
|
+
const paneIndices = new Map();
|
|
204
|
+
try {
|
|
205
|
+
const output = execSync(`tmux list-panes -F '#{pane_index} #{pane_id}'`, {
|
|
206
|
+
encoding: 'utf-8',
|
|
207
|
+
stdio: 'pipe'
|
|
208
|
+
}).trim();
|
|
209
|
+
output.split('\n').forEach(line => {
|
|
210
|
+
const [index, id] = line.split(' ');
|
|
211
|
+
if (id)
|
|
212
|
+
paneIndices.set(id, parseInt(index));
|
|
213
|
+
});
|
|
214
|
+
// Sort by index, but force spacer to the end
|
|
215
|
+
finalContentPanes = finalContentPanes.sort((a, b) => {
|
|
216
|
+
// Spacer always last
|
|
217
|
+
if (a === spacerId)
|
|
218
|
+
return 1;
|
|
219
|
+
if (b === spacerId)
|
|
220
|
+
return -1;
|
|
221
|
+
// Otherwise sort by tmux index
|
|
222
|
+
const indexA = paneIndices.get(a) || 0;
|
|
223
|
+
const indexB = paneIndices.get(b) || 0;
|
|
224
|
+
return indexA - indexB;
|
|
225
|
+
});
|
|
226
|
+
LogService.getInstance().debug(`Pane order sorted by index: ${finalContentPanes.map(p => `${p}(idx:${paneIndices.get(p)})`).join(', ')}`, "Layout");
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
LogService.getInstance().debug(`Failed to sort by index: ${err}`, "Layout");
|
|
230
|
+
}
|
|
231
|
+
// Step 6: Recalculate layout with spacer included if present
|
|
232
|
+
const finalLayout = spacerId
|
|
233
|
+
? calculateOptimalLayout(finalContentPanes.length, terminalWidth, terminalHeight, config)
|
|
234
|
+
: layout;
|
|
235
|
+
// Log current tmux state before applying layout
|
|
236
|
+
try {
|
|
237
|
+
const currentPanes = execSync('tmux list-panes -F "#{pane_id} #{pane_width}x#{pane_height} @#{pane_left},#{pane_top}"', {
|
|
238
|
+
encoding: 'utf-8',
|
|
239
|
+
stdio: 'pipe'
|
|
240
|
+
}).trim();
|
|
241
|
+
LogService.getInstance().debug(`Current pane positions before layout:\n${currentPanes}`, "Layout");
|
|
242
|
+
}
|
|
243
|
+
catch { }
|
|
244
|
+
// CRITICAL ORDER: Resize sidebar FIRST (before window), then window
|
|
245
|
+
// This prevents tmux from redistributing window width changes to the sidebar
|
|
246
|
+
// Step 1: Check sidebar width and resize if needed
|
|
247
|
+
// Do this BEFORE window resize to lock sidebar width
|
|
248
|
+
let sidebarResized = false;
|
|
249
|
+
try {
|
|
250
|
+
const currentSidebarWidth = execSync(`tmux display-message -t '${controlPaneId}' -p '#{pane_width}'`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
251
|
+
if (currentSidebarWidth !== String(config.SIDEBAR_WIDTH)) {
|
|
252
|
+
LogService.getInstance().debug(`Resizing sidebar: ${currentSidebarWidth} → ${config.SIDEBAR_WIDTH}`, "Layout");
|
|
253
|
+
execSync(`tmux resize-pane -t '${controlPaneId}' -x ${config.SIDEBAR_WIDTH}`, { stdio: "pipe" });
|
|
254
|
+
sidebarResized = true;
|
|
255
|
+
// Wait for tmux to settle after sidebar resize
|
|
256
|
+
try {
|
|
257
|
+
execSync("sleep 0.1", { stdio: "pipe" });
|
|
258
|
+
}
|
|
259
|
+
catch { }
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
LogService.getInstance().debug(`Sidebar width already correct: ${config.SIDEBAR_WIDTH}`, "Layout");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
LogService.getInstance().debug(`Failed to check/resize sidebar: ${error}`, "Layout");
|
|
267
|
+
}
|
|
268
|
+
// Step 2: Check window dimensions and resize if needed
|
|
269
|
+
// Do this AFTER sidebar resize so sidebar width is locked
|
|
270
|
+
const currentWindowDims = getWindowDimensions();
|
|
271
|
+
const needsWindowResize = currentWindowDims.width !== finalLayout.windowWidth ||
|
|
272
|
+
currentWindowDims.height !== terminalHeight;
|
|
273
|
+
if (needsWindowResize) {
|
|
274
|
+
LogService.getInstance().debug(`Resizing window: ${currentWindowDims.width}x${currentWindowDims.height} → ${finalLayout.windowWidth}x${terminalHeight}`, "Layout");
|
|
275
|
+
setWindowDimensions(finalLayout.windowWidth, terminalHeight);
|
|
276
|
+
// Wait for tmux to complete the window resize
|
|
277
|
+
try {
|
|
278
|
+
execSync("sleep 0.05", { stdio: "pipe" });
|
|
279
|
+
}
|
|
280
|
+
catch { }
|
|
281
|
+
// CRITICAL: Re-enforce sidebar width after window resize!
|
|
282
|
+
// Window resizes cause tmux to redistribute width changes to ALL panes including sidebar
|
|
283
|
+
try {
|
|
284
|
+
const sidebarWidthAfterResize = execSync(`tmux display-message -t '${controlPaneId}' -p '#{pane_width}'`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
285
|
+
if (sidebarWidthAfterResize !== String(config.SIDEBAR_WIDTH)) {
|
|
286
|
+
LogService.getInstance().debug(`Sidebar changed after window resize: ${sidebarWidthAfterResize} → ${config.SIDEBAR_WIDTH}, fixing`, "Layout");
|
|
287
|
+
execSync(`tmux resize-pane -t '${controlPaneId}' -x ${config.SIDEBAR_WIDTH}`, { stdio: "pipe" });
|
|
288
|
+
// Wait for tmux to settle
|
|
289
|
+
try {
|
|
290
|
+
execSync("sleep 0.1", { stdio: "pipe" });
|
|
291
|
+
}
|
|
292
|
+
catch { }
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
LogService.getInstance().debug(`Failed to re-check sidebar after window resize: ${error}`, "Layout");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
LogService.getInstance().debug(`Window dimensions already correct: ${finalLayout.windowWidth}x${terminalHeight}`, "Layout");
|
|
301
|
+
}
|
|
302
|
+
// Log window state after sidebar enforcement
|
|
303
|
+
try {
|
|
304
|
+
const windowInfo = execSync('tmux display-message -p "Window: #{window_width}x#{window_height}, Layout: #{window_layout}"', {
|
|
305
|
+
encoding: 'utf-8',
|
|
306
|
+
stdio: 'pipe'
|
|
307
|
+
}).trim();
|
|
308
|
+
LogService.getInstance().debug(`After sidebar enforcement: ${windowInfo}`, "Layout");
|
|
309
|
+
}
|
|
310
|
+
catch { }
|
|
311
|
+
applyPaneLayout(controlPaneId, finalContentPanes, finalLayout, terminalHeight, config);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Calculates optimal layout configuration based on terminal dimensions
|
|
315
|
+
* Prioritizes columns over rows for maximum horizontal space usage
|
|
316
|
+
*/
|
|
317
|
+
export function calculateOptimalLayout(numContentPanes, terminalWidth, terminalHeight, config = DEFAULT_LAYOUT_CONFIG) {
|
|
318
|
+
const { SIDEBAR_WIDTH, MIN_COMFORTABLE_WIDTH, MAX_COMFORTABLE_WIDTH, MIN_COMFORTABLE_HEIGHT, } = config;
|
|
319
|
+
// Special case: welcome pane or no panes
|
|
320
|
+
if (numContentPanes === 0) {
|
|
321
|
+
return {
|
|
322
|
+
cols: 0,
|
|
323
|
+
rows: 0,
|
|
324
|
+
windowWidth: terminalWidth, // Unlimited width for welcome pane
|
|
325
|
+
paneDistribution: [],
|
|
326
|
+
actualPaneWidth: 0,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// Try all column counts and score them to find the best layout
|
|
330
|
+
let bestLayout = null;
|
|
331
|
+
let bestScore = -1;
|
|
332
|
+
for (let cols = numContentPanes; cols >= 1; cols--) {
|
|
333
|
+
const rows = Math.ceil(numContentPanes / cols);
|
|
334
|
+
const columnBorders = cols - 1; // Vertical borders between columns
|
|
335
|
+
const rowBorders = rows - 1; // Horizontal borders between rows
|
|
336
|
+
// Calculate minimum required dimensions (can we fit at MIN width?)
|
|
337
|
+
const minRequiredWidth = SIDEBAR_WIDTH + cols * MIN_COMFORTABLE_WIDTH + columnBorders;
|
|
338
|
+
const minRequiredHeight = rows * MIN_COMFORTABLE_HEIGHT + rowBorders;
|
|
339
|
+
// Check if this layout fits in terminal at minimum comfortable size
|
|
340
|
+
if (minRequiredWidth <= terminalWidth &&
|
|
341
|
+
minRequiredHeight <= terminalHeight) {
|
|
342
|
+
// This layout fits! Now calculate actual pane dimensions
|
|
343
|
+
// Calculate ideal window max-width (cap each pane at MAX_COMFORTABLE_WIDTH)
|
|
344
|
+
// Window should be: sidebar + (columns * MAX width) + borders OR terminal width, whichever is smaller
|
|
345
|
+
const idealMaxWidth = SIDEBAR_WIDTH + cols * MAX_COMFORTABLE_WIDTH + columnBorders;
|
|
346
|
+
const windowWidth = Math.min(idealMaxWidth, terminalWidth);
|
|
347
|
+
// Calculate actual pane width using the constrained windowWidth (not terminalWidth)
|
|
348
|
+
// This ensures panes don't exceed MAX_COMFORTABLE_WIDTH
|
|
349
|
+
const effectiveContentWidth = windowWidth - SIDEBAR_WIDTH - columnBorders;
|
|
350
|
+
const actualPaneWidth = effectiveContentWidth / cols;
|
|
351
|
+
// Calculate pane distribution for spanning (e.g., [2, 1, 1, 1])
|
|
352
|
+
const distribution = distributePanes(numContentPanes, cols);
|
|
353
|
+
// Calculate pane height
|
|
354
|
+
const availableHeight = terminalHeight - rowBorders;
|
|
355
|
+
const paneHeight = Math.floor(availableHeight / rows);
|
|
356
|
+
// Score this layout (higher is better)
|
|
357
|
+
// Prefer layouts that:
|
|
358
|
+
// 1. Have more vertical space (bigger height)
|
|
359
|
+
// 2. Are more balanced (fewer rows, but not too wide)
|
|
360
|
+
// 3. Don't have a single pane in the last row
|
|
361
|
+
const panesInLastRow = (numContentPanes % cols) || cols;
|
|
362
|
+
const balanceScore = panesInLastRow === 1 ? 0.5 : 1.0; // Penalize single pane in last row
|
|
363
|
+
const heightScore = paneHeight / terminalHeight; // More vertical space is better
|
|
364
|
+
const widthScore = actualPaneWidth <= MAX_COMFORTABLE_WIDTH ? 1.0 : 0.8; // Prefer panes within comfortable width
|
|
365
|
+
const score = balanceScore * heightScore * widthScore;
|
|
366
|
+
LogService.getInstance().debug(`Layout option: ${cols} cols x ${rows} rows, paneHeight=${paneHeight}, score=${score.toFixed(3)}`, "Layout");
|
|
367
|
+
// Update best if this score is higher, OR if tied but with fewer columns (more width per pane)
|
|
368
|
+
const isBetter = score > bestScore || (score === bestScore && cols < (bestLayout?.cols || Infinity));
|
|
369
|
+
if (isBetter) {
|
|
370
|
+
bestScore = score;
|
|
371
|
+
bestLayout = {
|
|
372
|
+
cols,
|
|
373
|
+
rows,
|
|
374
|
+
windowWidth,
|
|
375
|
+
paneDistribution: distribution,
|
|
376
|
+
actualPaneWidth,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Return the best layout we found
|
|
382
|
+
if (bestLayout) {
|
|
383
|
+
LogService.getInstance().debug(`Best layout: ${numContentPanes} panes → ${bestLayout.cols} cols x ${bestLayout.rows} rows, window=${bestLayout.windowWidth}, paneWidth=${bestLayout.actualPaneWidth}`, "Layout");
|
|
384
|
+
return bestLayout;
|
|
385
|
+
}
|
|
386
|
+
// Ultimate fallback: single column (forced cramped layout if terminal too small)
|
|
387
|
+
return {
|
|
388
|
+
cols: 1,
|
|
389
|
+
rows: numContentPanes,
|
|
390
|
+
windowWidth: terminalWidth,
|
|
391
|
+
paneDistribution: [numContentPanes],
|
|
392
|
+
actualPaneWidth: terminalWidth - SIDEBAR_WIDTH,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Distributes panes as evenly as possible across columns
|
|
397
|
+
* Examples:
|
|
398
|
+
* 5 panes, 3 cols → [2, 2, 1] (first 2 columns get extra pane)
|
|
399
|
+
* 5 panes, 4 cols → [2, 1, 1, 1] (first column gets extra pane)
|
|
400
|
+
* 6 panes, 3 cols → [2, 2, 2] (perfectly even)
|
|
401
|
+
*/
|
|
402
|
+
export function distributePanes(numPanes, cols) {
|
|
403
|
+
const distribution = [];
|
|
404
|
+
const basePerCol = Math.floor(numPanes / cols);
|
|
405
|
+
const remainder = numPanes % cols;
|
|
406
|
+
for (let i = 0; i < cols; i++) {
|
|
407
|
+
// First 'remainder' columns get an extra pane
|
|
408
|
+
distribution.push(basePerCol + (i < remainder ? 1 : 0));
|
|
409
|
+
}
|
|
410
|
+
return distribution;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Sets window dimensions using tmux resize-window
|
|
414
|
+
* Constrains width (for max-width behavior) while letting height follow terminal
|
|
415
|
+
*/
|
|
416
|
+
function setWindowDimensions(width, height) {
|
|
417
|
+
try {
|
|
418
|
+
// Use manual mode to constrain width, but also set height to match terminal
|
|
419
|
+
execSync(`tmux set-window-option window-size manual`, { stdio: "pipe" });
|
|
420
|
+
execSync(`tmux resize-window -x ${width} -y ${height}`, { stdio: "pipe" });
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
// Log but don't fail - some tmux versions may not support this
|
|
424
|
+
LogService.getInstance().warn(`Could not set window dimensions to ${width}x${height}: ${error}`, "Layout");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Applies the calculated layout to tmux panes
|
|
429
|
+
* Unified approach: trust the layout calculation for all cases
|
|
430
|
+
*/
|
|
431
|
+
function applyPaneLayout(controlPaneId, contentPaneIds, layout, terminalHeight, config) {
|
|
432
|
+
const numContentPanes = contentPaneIds.length;
|
|
433
|
+
if (numContentPanes === 0) {
|
|
434
|
+
// No content panes, just resize sidebar
|
|
435
|
+
try {
|
|
436
|
+
execSync(`tmux resize-pane -t '${controlPaneId}' -x ${config.SIDEBAR_WIDTH}`, { stdio: "pipe" });
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
LogService.getInstance().error("Error resizing control pane", "Layout", undefined, error instanceof Error ? error : undefined);
|
|
440
|
+
}
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
try {
|
|
444
|
+
// Always use custom layout string generation - unified approach for all cases
|
|
445
|
+
// Use the calculated window dimensions, not current tmux dimensions (may be stale)
|
|
446
|
+
const layoutString = generateSidebarGridLayout(controlPaneId, contentPaneIds, config.SIDEBAR_WIDTH, layout.windowWidth, terminalHeight, layout.cols, config.MAX_COMFORTABLE_WIDTH);
|
|
447
|
+
if (layoutString) {
|
|
448
|
+
// Log pane state right before applying layout
|
|
449
|
+
try {
|
|
450
|
+
const paneList = execSync('tmux list-panes -F "#{pane_id}=#{pane_index}"', {
|
|
451
|
+
encoding: 'utf-8',
|
|
452
|
+
stdio: 'pipe'
|
|
453
|
+
}).trim();
|
|
454
|
+
LogService.getInstance().debug(`Panes right before layout apply: ${paneList}`, "Layout");
|
|
455
|
+
}
|
|
456
|
+
catch { }
|
|
457
|
+
try {
|
|
458
|
+
execSync(`tmux select-layout '${layoutString}'`, { stdio: "pipe" });
|
|
459
|
+
LogService.getInstance().debug("Layout string applied successfully", "Layout");
|
|
460
|
+
}
|
|
461
|
+
catch (layoutError) {
|
|
462
|
+
// Log the error for debugging
|
|
463
|
+
const errorMsg = layoutError?.message || String(layoutError);
|
|
464
|
+
LogService.getInstance().debug(`Layout string application failed: ${errorMsg}`, "Layout");
|
|
465
|
+
LogService.getInstance().debug(`Failed layout string: ${layoutString}`, "Layout");
|
|
466
|
+
// Fallback to main-vertical if custom layout fails
|
|
467
|
+
execSync(`tmux set-window-option main-pane-width ${config.SIDEBAR_WIDTH}`, { stdio: "pipe" });
|
|
468
|
+
execSync("tmux select-layout main-vertical", { stdio: "pipe" });
|
|
469
|
+
LogService.getInstance().debug("Fell back to main-vertical layout", "Layout");
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
// Empty layout string - fallback to main-vertical
|
|
474
|
+
LogService.getInstance().debug("Empty layout string, using main-vertical fallback", "Layout");
|
|
475
|
+
execSync(`tmux set-window-option main-pane-width ${config.SIDEBAR_WIDTH}`, { stdio: "pipe" });
|
|
476
|
+
execSync("tmux select-layout main-vertical", { stdio: "pipe" });
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
// Fallback: just resize sidebar
|
|
481
|
+
try {
|
|
482
|
+
execSync(`tmux resize-pane -t '${controlPaneId}' -x ${config.SIDEBAR_WIDTH}`, { stdio: "pipe" });
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
// Ignore
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Generates a custom tmux layout string with pane spanning support
|
|
491
|
+
* This is a complex function that will be fully implemented in Phase 8
|
|
492
|
+
*/
|
|
493
|
+
function generateLayoutString(controlPaneId, contentPanes, layout, config) {
|
|
494
|
+
// TODO: Implement custom layout string generation
|
|
495
|
+
// This will create layout strings like:
|
|
496
|
+
// "layout-string,40x24,0,0{20x24,0,0,1,19x24,21,0[19x12,21,0,2,19x11,21,13,3]}"
|
|
497
|
+
// For now, return empty string to use default layout
|
|
498
|
+
return "";
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=layoutManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutManager.js","sourceRoot":"","sources":["../../src/utils/layoutManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paneCreation.d.ts","sourceRoot":"","sources":["../../src/utils/paneCreation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"paneCreation.d.ts","sourceRoot":"","sources":["../../src/utils/paneCreation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAWxD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,GAC5C,OAAO,CAAC,gBAAgB,CAAC,CAmY3B"}
|