Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
cddac19
feat(terminal): add View > Terminal menu entry and improve panel togg…
abose Feb 26, 2026
003bddb
feat: shift+escape toggles focus between editor and bottom panel
abose Feb 27, 2026
99f1532
feat(terminal): add F4 shortcut and auto-focus on panel shown
abose Feb 27, 2026
8ea0ca0
feat(terminal): show shift+escape focus hint toast on first terminal …
abose Feb 27, 2026
6aef0c7
refactor(notification): extract inline toast into reusable Notificati…
abose Feb 27, 2026
165b419
fix(workspace): clamp plugin panel width on window resize
abose Feb 27, 2026
810d7cb
feat(panel): add requestClose with onCloseRequested handler for panels
abose Feb 27, 2026
16053f9
feat(terminal): improve close confirmation dialogs with context-speci…
abose Feb 27, 2026
27fe3fd
test(terminal): add integration tests for panel close confirmation
abose Feb 27, 2026
47227f8
fix(terminal): replace awaits() with awaitsFor() in integration tests
abose Feb 27, 2026
51ac411
fix: terminal integ tests working in windows
abose Feb 27, 2026
a7721af
fix(test): terminate test window phnode on test runner reload
abose Feb 27, 2026
09055c3
fix(test): terminate SpecRunner's own PhNode on page reload
abose Feb 27, 2026
b51de0b
fix(terminal): reset stale title when child process exits
abose Feb 28, 2026
7090b25
fix(terminal): use stale-title flag instead of overwriting inst.title
abose Feb 28, 2026
98bb2a6
refactor(terminal): remove unused title parameter from _onTerminalTit…
abose Feb 28, 2026
e5549bc
feat(workspace): add app-drawer toolbar button for Quick Access panel
abose Feb 28, 2026
0d6a086
feat(workspace): add app-drawer icon to Quick Access tab title and en…
abose Feb 28, 2026
9dc7518
feat(terminal): add right-click context menu with Copy, Paste, and Clear
abose Feb 28, 2026
6059846
feat(terminal): add "Open in Integrated Terminal" to project context …
abose Feb 28, 2026
a7f24ae
test(terminal): add integration tests for clear, copy, paste, and con…
abose Feb 28, 2026
625fe0f
fix(workspace): vertically align icon and text in bottom panel tab title
abose Feb 28, 2026
9a879a1
fix(test): wait for async process info update in terminal title test
abose Feb 28, 2026
0b86e65
fix(test): avoid race condition in FileFilters integration tests
abose Feb 28, 2026
6b44f2e
fix(workspace): update escape/shift-escape tests and fix plugin panel…
abose Mar 1, 2026
3d9b54b
fix(test): fix codehints test using HTML file for reliable hints
abose Mar 1, 2026
60b6957
fix(terminal): prevent garbled output when resizing terminal panel
abose Mar 1, 2026
631cc5b
fix(terminal): prevent ghost lines when resizing terminal panel
abose Mar 1, 2026
8f7f648
fix(test): fix intermittent terminal and PreferencesManager test time…
abose Mar 1, 2026
1b924e2
chore: add no-autocommit rule to CLAUDE.md
abose Mar 1, 2026
33ae177
fix(test): fix FileFilters exclude test race condition in Firefox
abose Mar 2, 2026
416b4a4
fix(test): fix terminal integration test timeout on Mac CI
abose Mar 2, 2026
8bffb1e
fix(terminal): prevent prompt from being erased on tab switch and cre…
abose Mar 2, 2026
55ac2f8
fix(terminal): add postinstall chmod for node-pty spawn-helper on macOS
abose Mar 2, 2026
d06e2b1
fix(terminal): clip xterm canvas overflow during panel resize
abose Mar 2, 2026
bb19d50
fix(mcp): dismantle trust ring before reload in phoenix-builder
abose Mar 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Claude Code Instructions

## Git Commits
- **Never commit unless the user explicitly asks you to commit or grants autocommit permission.** Only exception: if a commit is technically required for the current task to work (e.g. testing a CI pipeline).
- Use Conventional Commits format: `type(scope): description` (e.g. `fix: ...`, `feat: ...`, `chore: ...`).
- Keep commit subject lines concise; use the body for detail.
- Never include `Co-Authored-By` lines in commit messages.
Expand Down
6 changes: 6 additions & 0 deletions docs/API-Reference/command/Commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,12 @@ Toggles code inspection
## VIEW\_TOGGLE\_PROBLEMS
Toggles problems panel visibility

**Kind**: global variable
<a name="VIEW_TERMINAL"></a>

## VIEW\_TERMINAL
Opens the terminal panel

**Kind**: global variable
<a name="TOGGLE_LINE_NUMBERS"></a>

Expand Down
92 changes: 69 additions & 23 deletions docs/API-Reference/view/PanelView.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@ const PanelView = brackets.getModule("view/PanelView")
* [.isVisible()](#Panel+isVisible) ⇒ <code>boolean</code>
* [.registerCanBeShownHandler(canShowHandlerFn)](#Panel+registerCanBeShownHandler) ⇒ <code>boolean</code>
* [.canBeShown()](#Panel+canBeShown) ⇒ <code>boolean</code>
* [.registerOnCloseRequestedHandler(handler)](#Panel+registerOnCloseRequestedHandler)
* [.requestClose()](#Panel+requestClose) ⇒ <code>Promise.&lt;boolean&gt;</code>
* [.show()](#Panel+show)
* [.hide()](#Panel+hide)
* [.focus()](#Panel+focus) ⇒ <code>boolean</code>
* [.setVisible(visible)](#Panel+setVisible)
* [.setTitle(newTitle)](#Panel+setTitle)
* [.destroy()](#Panel+destroy)
Expand Down Expand Up @@ -49,8 +52,7 @@ Determines if the panel is visible
<a name="Panel+registerCanBeShownHandler"></a>

### panel.registerCanBeShownHandler(canShowHandlerFn) ⇒ <code>boolean</code>
Registers a call back function that will be called just before panel is shown. The handler should return true
if the panel can be shown, else return false and the panel will not be shown.
Registers a call back function that will be called just before panel is shown. The handler should return trueif the panel can be shown, else return false and the panel will not be shown.

**Kind**: instance method of [<code>Panel</code>](#Panel)
**Returns**: <code>boolean</code> - true if visible, false if not
Expand All @@ -65,6 +67,24 @@ if the panel can be shown, else return false and the panel will not be shown.
Returns true if th panel can be shown, else false.

**Kind**: instance method of [<code>Panel</code>](#Panel)
<a name="Panel+registerOnCloseRequestedHandler"></a>

### panel.registerOnCloseRequestedHandler(handler)
Registers an async handler that is called before the panel is closed via user interaction (e.g. clicking thetab close button). The handler should return `true` to allow the close, or `false` to prevent it.

**Kind**: instance method of [<code>Panel</code>](#Panel)

| Param | Type | Description |
| --- | --- | --- |
| handler | <code>function</code> \| <code>null</code> | An async function returning a boolean, or null to clear the handler. |

<a name="Panel+requestClose"></a>

### panel.requestClose() ⇒ <code>Promise.&lt;boolean&gt;</code>
Requests the panel to hide, invoking the registered onCloseRequested handler first (if any).If the handler returns false, the panel stays open. If it returns true or no handler isregistered, `hide()` is called.

**Kind**: instance method of [<code>Panel</code>](#Panel)
**Returns**: <code>Promise.&lt;boolean&gt;</code> - Resolves to true if the panel was hidden, false if prevented.
<a name="Panel+show"></a>

### panel.show()
Expand All @@ -77,6 +97,13 @@ Shows the panel
Hides the panel

**Kind**: instance method of [<code>Panel</code>](#Panel)
<a name="Panel+focus"></a>

### panel.focus() ⇒ <code>boolean</code>
Attempts to focus the panel. Override this in panels that support focus(e.g. terminal). The default implementation returns false.

**Kind**: instance method of [<code>Panel</code>](#Panel)
**Returns**: <code>boolean</code> - true if the panel accepted focus, false otherwise
<a name="Panel+setVisible"></a>

### panel.setVisible(visible)
Expand All @@ -102,8 +129,7 @@ Updates the display title shown in the tab bar for this panel.
<a name="Panel+destroy"></a>

### panel.destroy()
Destroys the panel, removing it from the tab bar, internal maps, and the DOM.
After calling this, the Panel instance should not be reused.
Destroys the panel, removing it from the tab bar, internal maps, and the DOM.After calling this, the Panel instance should not be reused.

**Kind**: instance method of [<code>Panel</code>](#Panel)
<a name="Panel+getPanelType"></a>
Expand Down Expand Up @@ -171,6 +197,18 @@ The editor holder element, passed from WorkspaceManager
## \_recomputeLayout : <code>function</code>
recomputeLayout callback from WorkspaceManager

**Kind**: global variable
<a name="_defaultPanelId"></a>

## \_defaultPanelId : <code>string</code> \| <code>null</code>
The default/quick-access panel ID

**Kind**: global variable
<a name="_$addBtn"></a>

## \_$addBtn : <code>jQueryObject</code>
The "+" button inside the tab overflow area

**Kind**: global variable
<a name="EVENT_PANEL_HIDDEN"></a>

Expand All @@ -193,24 +231,25 @@ type for bottom panel
<a name="MAXIMIZE_THRESHOLD"></a>

## MAXIMIZE\_THRESHOLD : <code>number</code>
Pixel threshold for detecting near-maximize state during resize.
If the editor holder height is within this many pixels of zero, the
panel is treated as maximized. Keeps the maximize icon responsive
during drag without being overly sensitive.
Pixel threshold for detecting near-maximize state during resize.If the editor holder height is within this many pixels of zero, thepanel is treated as maximized. Keeps the maximize icon responsiveduring drag without being overly sensitive.

**Kind**: global constant
<a name="MIN_PANEL_HEIGHT"></a>

## MIN\_PANEL\_HEIGHT : <code>number</code>
Minimum panel height (matches Resizer minSize) used as a floor
when computing a sensible restore height.
Minimum panel height (matches Resizer minSize) used as a floorwhen computing a sensible restore height.

**Kind**: global constant
<a name="PREF_BOTTOM_PANEL_MAXIMIZED"></a>

## PREF\_BOTTOM\_PANEL\_MAXIMIZED
Preference key for persisting the maximize state across reloads.

**Kind**: global constant
<a name="init"></a>

## init($container, $tabBar, $tabsOverflow, $editorHolder, recomputeLayoutFn)
Initializes the PanelView module with references to the bottom panel container DOM elements.
Called by WorkspaceManager during htmlReady.
## init($container, $tabBar, $tabsOverflow, $editorHolder, recomputeLayoutFn, defaultPanelId)
Initializes the PanelView module with references to the bottom panel container DOM elements.Called by WorkspaceManager during htmlReady.

**Kind**: global function

Expand All @@ -221,30 +260,24 @@ Called by WorkspaceManager during htmlReady.
| $tabsOverflow | <code>jQueryObject</code> | The scrollable area holding tab elements. |
| $editorHolder | <code>jQueryObject</code> | The editor holder element (for maximize height calculation). |
| recomputeLayoutFn | <code>function</code> | Callback to trigger workspace layout recomputation. |
| defaultPanelId | <code>string</code> | The ID of the default/quick-access panel. |

<a name="exitMaximizeOnResize"></a>

## exitMaximizeOnResize()
Exit maximize state without resizing (for external callers like drag-resize).
Clears internal maximize state and resets the button icon.
Exit maximize state without resizing (for external callers like drag-resize).Clears internal maximize state and resets the button icon.

**Kind**: global function
<a name="enterMaximizeOnResize"></a>

## enterMaximizeOnResize()
Enter maximize state during a drag-resize that reaches the maximum
height. No pre-maximize height is stored because the user arrived
here via continuous dragging; a sensible default will be computed if
they later click the Restore button.
Enter maximize state during a drag-resize that reaches the maximumheight. No pre-maximize height is stored because the user arrivedhere via continuous dragging; a sensible default will be computed ifthey later click the Restore button.

**Kind**: global function
<a name="restoreIfMaximized"></a>

## restoreIfMaximized()
Restore the container's CSS height to the pre-maximize value and clear maximize state.
Must be called BEFORE Resizer.hide() so the Resizer reads the correct height.
If not maximized, this is a no-op.
When the saved height is near-max or unknown, a sensible default is used.
Restore the container's CSS height to the pre-maximize value and clear maximize state.Must be called BEFORE Resizer.hide() so the Resizer reads the correct height.If not maximized, this is a no-op.When the saved height is near-max or unknown, a sensible default is used.

**Kind**: global function
<a name="isMaximized"></a>
Expand All @@ -266,3 +299,16 @@ Hides every open bottom panel tab in a single batch

**Kind**: global function
**Returns**: <code>Array.&lt;string&gt;</code> - The IDs of panels that were open (useful for restoring later).
<a name="getActiveBottomPanel"></a>

## getActiveBottomPanel() ⇒ [<code>Panel</code>](#Panel) \| <code>null</code>
Returns the currently active (visible) bottom panel, or null if none.

**Kind**: global function
<a name="showNextPanel"></a>

## showNextPanel() ⇒ <code>boolean</code>
Cycle to the next open bottom panel tab. If the container is hiddenor no panels are open, does nothing and returns false.

**Kind**: global function
**Returns**: <code>boolean</code> - true if a panel switch occurred
Expand Down
23 changes: 21 additions & 2 deletions docs/API-Reference/view/PluginPanelView.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ const PluginPanelView = brackets.getModule("view/PluginPanelView")
* [.isVisible()](#Panel+isVisible) ⇒ <code>boolean</code>
* [.registerCanBeShownHandler(canShowHandlerFn)](#Panel+registerCanBeShownHandler) ⇒ <code>boolean</code>
* [.canBeShown()](#Panel+canBeShown) ⇒ <code>boolean</code>
* [.registerOnCloseRequestedHandler(handler)](#Panel+registerOnCloseRequestedHandler)
* [.requestClose()](#Panel+requestClose) ⇒ <code>Promise.&lt;boolean&gt;</code>
* [.show()](#Panel+show)
* [.hide()](#Panel+hide)
* [.setVisible(visible)](#Panel+setVisible)
Expand Down Expand Up @@ -49,8 +51,7 @@ Determines if the panel is visible
<a name="Panel+registerCanBeShownHandler"></a>

### panel.registerCanBeShownHandler(canShowHandlerFn) ⇒ <code>boolean</code>
Registers a call back function that will be called just before panel is shown. The handler should return true
if the panel can be shown, else return false and the panel will not be shown.
Registers a call back function that will be called just before panel is shown. The handler should return trueif the panel can be shown, else return false and the panel will not be shown.

**Kind**: instance method of [<code>Panel</code>](#Panel)
**Returns**: <code>boolean</code> - true if visible, false if not
Expand All @@ -65,6 +66,24 @@ if the panel can be shown, else return false and the panel will not be shown.
Returns true if th panel can be shown, else false.

**Kind**: instance method of [<code>Panel</code>](#Panel)
<a name="Panel+registerOnCloseRequestedHandler"></a>

### panel.registerOnCloseRequestedHandler(handler)
Registers an async handler that is called before the panel is closed via user interaction.The handler should return `true` to allow the close, or `false` to prevent it.

**Kind**: instance method of [<code>Panel</code>](#Panel)

| Param | Type | Description |
| --- | --- | --- |
| handler | <code>function</code> \| <code>null</code> | An async function returning a boolean, or null to clear the handler. |

<a name="Panel+requestClose"></a>

### panel.requestClose() ⇒ <code>Promise.&lt;boolean&gt;</code>
Requests the panel to hide, invoking the registered onCloseRequested handler first (if any).If the handler returns false, the panel stays open. If it returns true or no handler isregistered, `hide()` is called.

**Kind**: instance method of [<code>Panel</code>](#Panel)
**Returns**: <code>Promise.&lt;boolean&gt;</code> - Resolves to true if the panel was hidden, false if prevented.
<a name="Panel+show"></a>

### panel.show()
Expand Down
Loading
Loading