detached 4c6ae6a

feat(workspace): add visual border feedback for pane mode

Zellij-style visual feedback when pane mode is active. Adds prominent
orange border around the entire workspace root container.

Changes:
- New CSS class .workspace-pane-mode-active with 4px orange border
- Smooth transitions (150ms ease-in-out) for border appearance
- Applied/removed by backend via CSS class manipulation
- Normal state uses transparent border for smooth transition

Provides clear visual indication that pane mode is active and awaiting
user action, matching Zellij's UX patterns.
commit
4c6ae6a83a91819f2e5ca1e380145f5e847ce1b3
author
bamen · · 2025-10-13 21:58 UTC
committer
bamen · · 2025-10-13 17:06 UTC
parent
d2d9ad1
signature
unsigned
1 file · +18 -0
M internal/app/browser/workspace_css.go +18 -0
@@ -73,12 +73,29 @@ func (wm *WorkspaceManager) generateWorkspaceCSS() string {
7373
7474 activeBorderColor := getActivePaneBorderColor(styling, isDark)
7575
76+ // Pane mode border color (brighter/more prominent than active pane border)
77+ paneModeColor := "#FFA500" // Orange for pane mode
78+ if styling.BorderColor != "" && strings.HasPrefix(styling.BorderColor, "@") {
79+ paneModeColor = styling.BorderColor // Use theme variable if configured
80+ }
81+
7682 css := fmt.Sprintf(`window {
7783 background-color: %s;
7884 padding: 0;
7985 margin: 0;
8086 }
8187
88+ /* Workspace root container - normal state */
89+ paned, box {
90+ border: 0px solid transparent;
91+ transition: border-width 150ms ease-in-out, border-color 150ms ease-in-out;
92+ }
93+
94+ /* Pane mode active - thick orange border around workspace root */
95+ .workspace-pane-mode-active {
96+ border: 4px solid %s !important;
97+ }
98+
8299 /* Base pane styling - subtle border for inactive panes */
83100 .workspace-pane, .stacked-pane-container {
84101 border: 2px solid %s;
@@ -132,6 +149,7 @@ func (wm *WorkspaceManager) generateWorkspaceCSS() string {
132149 /* Collapsed panes are hidden - handled in code via widget visibility */
133150 }`,
134151 windowBackgroundColor, // window background
152+ paneModeColor, // workspace-pane-mode-active border color
135153 inactiveBorderColor, // base pane border color (inactive)
136154 styling.BorderRadius, // base pane border radius
137155 styling.TransitionDuration, // base pane border transition
@@ -73,12 +73,29 @@ func (wm *WorkspaceManager) generateWorkspaceCSS() string {
73 73
74 activeBorderColor := getActivePaneBorderColor(styling, isDark)74 activeBorderColor := getActivePaneBorderColor(styling, isDark)
75 75
76+ // Pane mode border color (brighter/more prominent than active pane border)
77+ paneModeColor := "#FFA500" // Orange for pane mode
78+ if styling.BorderColor != "" && strings.HasPrefix(styling.BorderColor, "@") {
79+ paneModeColor = styling.BorderColor // Use theme variable if configured
80+ }
81+
76 css := fmt.Sprintf(`window {82 css := fmt.Sprintf(`window {
77 background-color: %s;83 background-color: %s;
78 padding: 0;84 padding: 0;
79 margin: 0;85 margin: 0;
80 }86 }
81 87
88+ /* Workspace root container - normal state */
89+ paned, box {
90+ border: 0px solid transparent;
91+ transition: border-width 150ms ease-in-out, border-color 150ms ease-in-out;
92+ }
93+
94+ /* Pane mode active - thick orange border around workspace root */
95+ .workspace-pane-mode-active {
96+ border: 4px solid %s !important;
97+ }
98+
82 /* Base pane styling - subtle border for inactive panes */99 /* Base pane styling - subtle border for inactive panes */
83 .workspace-pane, .stacked-pane-container {100 .workspace-pane, .stacked-pane-container {
84 border: 2px solid %s;101 border: 2px solid %s;
@@ -132,6 +149,7 @@ func (wm *WorkspaceManager) generateWorkspaceCSS() string {
132 /* Collapsed panes are hidden - handled in code via widget visibility */149 /* Collapsed panes are hidden - handled in code via widget visibility */
133 }`,150 }`,
134 windowBackgroundColor, // window background151 windowBackgroundColor, // window background
152+ paneModeColor, // workspace-pane-mode-active border color
135 inactiveBorderColor, // base pane border color (inactive)153 inactiveBorderColor, // base pane border color (inactive)
136 styling.BorderRadius, // base pane border radius154 styling.BorderRadius, // base pane border radius
137 styling.TransitionDuration, // base pane border transition155 styling.TransitionDuration, // base pane border transition

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close