detached 3b4fc68

feat(docs): highlight zellij pane mode in README and homepage shortcuts

commit
3b4fc682ca8fcbf430886ce3cf79dff2ca73e2b6
author
bamen · · 2025-09-19 05:25 UTC
parent
a6d0e00
signature
unsigned
2 files · +127 -24
M README.md +69 -4
@@ -23,6 +23,7 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
2323 - `0.8.0` (2025-09-17): Migrated injected UI from inline scripts to structured Svelte components with a shared shadow host, plus Tailwind v4 theming, GTK color sync, and refreshed omnibox/find flows.
2424
2525 ## Features
26+- **Zellij-inspired pane management**: Split browser into multiple panes with keyboard shortcuts (Ctrl+P to enter pane mode)
2627 - Built‑in browser window (no external browser needed)
2728 - Content filtering system (early stage UBlock-based filtering with EasyList integration)
2829 - Hardware video acceleration with automatic GPU detection (VA-API/VDPAU)
@@ -35,6 +36,8 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
3536 ## Controls & Shortcuts
3637
3738 ### Keyboard Shortcuts
39+
40+#### Browser Controls
3841 | Shortcut | Action | Notes |
3942 |----------|--------|-------|
4043 | **F12** | Open Developer Tools | WebKit inspector |
@@ -45,11 +48,23 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
4548 | **Ctrl/Cmd+-** | Zoom Out | Works across keyboard layouts |
4649 | **Ctrl/Cmd+0** | Reset Zoom | Return to 100% zoom |
4750 | **Ctrl/Cmd+Shift+C** | Copy URL | Copy current URL to clipboard with toast |
48-| **Ctrl/Cmd+R** | Reload Page | Refresh current page |
51+| **Ctrl/Cmd+R** / **F5** | Reload Page | Refresh current page |
4952 | **Ctrl/Cmd+Shift+R** | Hard Reload | Refresh ignoring cache |
50-| **F5** | Reload Page | Alternative reload key |
51-| **Alt+←** | Navigate Back | Go to previous page |
52-| **Alt+→** | Navigate Forward | Go to next page |
53+| **Ctrl+←** / **Ctrl+→** | Navigate Back/Forward | Browser history navigation |
54+
55+#### Zellij-Inspired Pane Management
56+| Shortcut | Action | Notes |
57+|----------|--------|-------|
58+| **Ctrl/Cmd+P** | Enter Pane Mode | Modal mode for pane operations |
59+| **→** / **R** (in pane mode) | Split Right | Create new pane to the right |
60+| **←** / **L** (in pane mode) | Split Left | Create new pane to the left |
61+| **↑** / **U** (in pane mode) | Split Up | Create new pane above |
62+| **↓** / **D** (in pane mode) | Split Down | Create new pane below |
63+| **X** (in pane mode) | Close Pane | Close current pane |
64+| **Enter** (in pane mode) | Confirm Action | Confirm pane operation |
65+| **Escape** (in pane mode) | Exit Pane Mode | Return to normal navigation |
66+| **Alt+Arrow Keys** | Navigate Panes | Move focus between panes |
67+| **Ctrl/Cmd+↑** / **Ctrl/Cmd+↓** | Navigate Panes Up/Down | Vertical pane navigation |
5368
5469 ### Mouse Controls
5570 | Action | Result | Notes |
@@ -140,6 +155,54 @@ Note: The root flag path only generates options; for processing a selection (`--
140155
141156 In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.
142157
158+## Pane Management (Zellij-Inspired)
159+
160+Dumber features a Zellij-inspired pane management system that allows you to split your browser window into multiple panes, each running independent web sessions.
161+
162+### How it Works
163+1. **Enter Pane Mode**: Press `Ctrl+P` to enter pane mode (modal interface with timeout)
164+2. **Split Panes**: Use arrow keys or letter shortcuts to split:
165+ - `→` or `R` - Split right
166+ - `←` or `L` - Split left
167+ - `↑` or `U` - Split up
168+ - `↓` or `D` - Split down
169+3. **Navigate**: Use `Alt+Arrow Keys` to move focus between panes
170+4. **Close**: Press `X` in pane mode to close the current pane
171+
172+### Features
173+- **Binary tree layout**: Panes are organized in a binary tree structure for optimal space usage
174+- **Focus management**: Visual borders and hover-to-focus for intuitive navigation
175+- **Independent sessions**: Each pane maintains its own browsing session, history, and zoom level
176+- **Popup handling**: Configurable popup placement (new pane, same pane, etc.)
177+- **Keyboard-driven**: All operations accessible via keyboard shortcuts
178+
179+### Configuration
180+The pane system is fully configurable via `config.json`:
181+```json
182+"workspace": {
183+ "enable_zellij_controls": true,
184+ "pane_mode": {
185+ "activation_shortcut": "cmdorctrl+p",
186+ "timeout_ms": 3000,
187+ "action_bindings": {
188+ "arrowright": "split-right",
189+ "r": "split-right",
190+ "x": "close-pane",
191+ // ... full key mappings
192+ }
193+ },
194+ "popups": {
195+ "placement": "right",
196+ "open_in_new_pane": true
197+ },
198+ "styling": {
199+ "border_width": 2,
200+ "border_color": "@theme_selected_bg_color",
201+ "transition_duration": 120
202+ }
203+}
204+```
205+
143206 ## Configuration
144207
145208 Dumber follows the XDG Base Directory spec:
@@ -309,8 +372,10 @@ WebKitGTK uses GStreamer for media playback. Dumber includes automatic hardware
309372 ## Roadmap
310373 - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)
311374 - ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback
375+- ✅ Zellij-inspired pane management with binary tree layout and keyboard-driven workflow
312376 - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)
313377 - Full Vim-style motion and keyboard navigation across pages and UI
378+- Tab management system (browser tabs in addition to panes)
314379 - Performance work: faster startup, lower memory, snappier UI
315380 - Other shiny things I'm not yet aware of
316381
@@ -23,6 +23,7 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
23 - `0.8.0` (2025-09-17): Migrated injected UI from inline scripts to structured Svelte components with a shared shadow host, plus Tailwind v4 theming, GTK color sync, and refreshed omnibox/find flows.23 - `0.8.0` (2025-09-17): Migrated injected UI from inline scripts to structured Svelte components with a shared shadow host, plus Tailwind v4 theming, GTK color sync, and refreshed omnibox/find flows.
24 24
25 ## Features25 ## Features
26+- **Zellij-inspired pane management**: Split browser into multiple panes with keyboard shortcuts (Ctrl+P to enter pane mode)
26 - Built‑in browser window (no external browser needed)27 - Built‑in browser window (no external browser needed)
27 - Content filtering system (early stage UBlock-based filtering with EasyList integration)28 - Content filtering system (early stage UBlock-based filtering with EasyList integration)
28 - Hardware video acceleration with automatic GPU detection (VA-API/VDPAU)29 - Hardware video acceleration with automatic GPU detection (VA-API/VDPAU)
@@ -35,6 +36,8 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
35 ## Controls & Shortcuts36 ## Controls & Shortcuts
36 37
37 ### Keyboard Shortcuts38 ### Keyboard Shortcuts
39+
40+#### Browser Controls
38 | Shortcut | Action | Notes |41 | Shortcut | Action | Notes |
39 |----------|--------|-------|42 |----------|--------|-------|
40 | **F12** | Open Developer Tools | WebKit inspector |43 | **F12** | Open Developer Tools | WebKit inspector |
@@ -45,11 +48,23 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
45 | **Ctrl/Cmd+-** | Zoom Out | Works across keyboard layouts |48 | **Ctrl/Cmd+-** | Zoom Out | Works across keyboard layouts |
46 | **Ctrl/Cmd+0** | Reset Zoom | Return to 100% zoom |49 | **Ctrl/Cmd+0** | Reset Zoom | Return to 100% zoom |
47 | **Ctrl/Cmd+Shift+C** | Copy URL | Copy current URL to clipboard with toast |50 | **Ctrl/Cmd+Shift+C** | Copy URL | Copy current URL to clipboard with toast |
48-| **Ctrl/Cmd+R** | Reload Page | Refresh current page |51+| **Ctrl/Cmd+R** / **F5** | Reload Page | Refresh current page |
49 | **Ctrl/Cmd+Shift+R** | Hard Reload | Refresh ignoring cache |52 | **Ctrl/Cmd+Shift+R** | Hard Reload | Refresh ignoring cache |
50-| **F5** | Reload Page | Alternative reload key |53+| **Ctrl+←** / **Ctrl+→** | Navigate Back/Forward | Browser history navigation |
51-| **Alt+←** | Navigate Back | Go to previous page |54+
52-| **Alt+→** | Navigate Forward | Go to next page |55+#### Zellij-Inspired Pane Management
56+| Shortcut | Action | Notes |
57+|----------|--------|-------|
58+| **Ctrl/Cmd+P** | Enter Pane Mode | Modal mode for pane operations |
59+| **→** / **R** (in pane mode) | Split Right | Create new pane to the right |
60+| **←** / **L** (in pane mode) | Split Left | Create new pane to the left |
61+| **↑** / **U** (in pane mode) | Split Up | Create new pane above |
62+| **↓** / **D** (in pane mode) | Split Down | Create new pane below |
63+| **X** (in pane mode) | Close Pane | Close current pane |
64+| **Enter** (in pane mode) | Confirm Action | Confirm pane operation |
65+| **Escape** (in pane mode) | Exit Pane Mode | Return to normal navigation |
66+| **Alt+Arrow Keys** | Navigate Panes | Move focus between panes |
67+| **Ctrl/Cmd+↑** / **Ctrl/Cmd+↓** | Navigate Panes Up/Down | Vertical pane navigation |
53 68
54 ### Mouse Controls69 ### Mouse Controls
55 | Action | Result | Notes |70 | Action | Result | Notes |
@@ -140,6 +155,54 @@ Note: The root flag path only generates options; for processing a selection (`--
140 155
141 In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.156 In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.
142 157
158+## Pane Management (Zellij-Inspired)
159+
160+Dumber features a Zellij-inspired pane management system that allows you to split your browser window into multiple panes, each running independent web sessions.
161+
162+### How it Works
163+1. **Enter Pane Mode**: Press `Ctrl+P` to enter pane mode (modal interface with timeout)
164+2. **Split Panes**: Use arrow keys or letter shortcuts to split:
165+ - `→` or `R` - Split right
166+ - `←` or `L` - Split left
167+ - `↑` or `U` - Split up
168+ - `↓` or `D` - Split down
169+3. **Navigate**: Use `Alt+Arrow Keys` to move focus between panes
170+4. **Close**: Press `X` in pane mode to close the current pane
171+
172+### Features
173+- **Binary tree layout**: Panes are organized in a binary tree structure for optimal space usage
174+- **Focus management**: Visual borders and hover-to-focus for intuitive navigation
175+- **Independent sessions**: Each pane maintains its own browsing session, history, and zoom level
176+- **Popup handling**: Configurable popup placement (new pane, same pane, etc.)
177+- **Keyboard-driven**: All operations accessible via keyboard shortcuts
178+
179+### Configuration
180+The pane system is fully configurable via `config.json`:
181+```json
182+"workspace": {
183+ "enable_zellij_controls": true,
184+ "pane_mode": {
185+ "activation_shortcut": "cmdorctrl+p",
186+ "timeout_ms": 3000,
187+ "action_bindings": {
188+ "arrowright": "split-right",
189+ "r": "split-right",
190+ "x": "close-pane",
191+ // ... full key mappings
192+ }
193+ },
194+ "popups": {
195+ "placement": "right",
196+ "open_in_new_pane": true
197+ },
198+ "styling": {
199+ "border_width": 2,
200+ "border_color": "@theme_selected_bg_color",
201+ "transition_duration": 120
202+ }
203+}
204+```
205+
143 ## Configuration206 ## Configuration
144 207
145 Dumber follows the XDG Base Directory spec:208 Dumber follows the XDG Base Directory spec:
@@ -309,8 +372,10 @@ WebKitGTK uses GStreamer for media playback. Dumber includes automatic hardware
309 ## Roadmap372 ## Roadmap
310 - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)373 - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)
311 - ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback374 - ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback
375+- ✅ Zellij-inspired pane management with binary tree layout and keyboard-driven workflow
312 - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)376 - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)
313 - Full Vim-style motion and keyboard navigation across pages and UI377 - Full Vim-style motion and keyboard navigation across pages and UI
378+- Tab management system (browser tabs in addition to panes)
314 - Performance work: faster startup, lower memory, snappier UI379 - Performance work: faster startup, lower memory, snappier UI
315 - Other shiny things I'm not yet aware of380 - Other shiny things I'm not yet aware of
316 381
M gui/src/pages/Homepage.svelte +58 -20
@@ -44,6 +44,7 @@
4444 // Initialize shortcuts (these are browser shortcuts, not dynamic from API)
4545 const initializeShortcuts = () => {
4646 shortcuts = [
47+ // Browser shortcuts
4748 {
4849 key: 'Ctrl+L',
4950 description: 'Focus address bar',
@@ -60,7 +61,7 @@
6061 action: () => console.log('Ctrl+Shift+C triggered')
6162 },
6263 {
63- key: 'Ctrl+R',
64+ key: 'Ctrl+R / F5',
6465 description: 'Reload page',
6566 action: () => window.location.reload()
6667 },
@@ -69,25 +70,15 @@
6970 description: 'Hard reload',
7071 action: () => console.log('Ctrl+Shift+R triggered')
7172 },
72- {
73- key: 'F5',
74- description: 'Reload page',
75- action: () => window.location.reload()
76- },
7773 {
7874 key: 'F12',
7975 description: 'DevTools',
8076 action: () => console.log('F12 triggered')
8177 },
8278 {
83- key: 'Alt+←',
84- description: 'Navigate back',
85- action: () => console.log('Alt+← triggered')
86- },
87- {
88- key: 'Alt+→',
89- description: 'Navigate forward',
90- action: () => console.log('Alt+→ triggered')
79+ key: 'Alt+← / Alt+→',
80+ description: 'Navigate back/forward',
81+ action: () => console.log('Alt+Arrow triggered')
9182 },
9283 {
9384 key: 'Ctrl+0',
@@ -95,14 +86,61 @@
9586 action: () => console.log('Ctrl+0 triggered')
9687 },
9788 {
98- key: 'Ctrl++',
99- description: 'Zoom in',
100- action: () => console.log('Ctrl++ triggered')
89+ key: 'Ctrl++ / Ctrl+-',
90+ description: 'Zoom in/out',
91+ action: () => console.log('Ctrl+Zoom triggered')
92+ },
93+ // Workspace pane mode
94+ {
95+ key: 'Ctrl+P',
96+ description: 'Enter pane mode',
97+ action: () => console.log('Ctrl+P triggered')
98+ },
99+ {
100+ key: '→ / R (pane mode)',
101+ description: 'Split pane right',
102+ action: () => console.log('Split right triggered')
103+ },
104+ {
105+ key: '← / L (pane mode)',
106+ description: 'Split pane left',
107+ action: () => console.log('Split left triggered')
108+ },
109+ {
110+ key: '↑ / U (pane mode)',
111+ description: 'Split pane up',
112+ action: () => console.log('Split up triggered')
113+ },
114+ {
115+ key: '↓ / D (pane mode)',
116+ description: 'Split pane down',
117+ action: () => console.log('Split down triggered')
118+ },
119+ {
120+ key: 'X (pane mode)',
121+ description: 'Close current pane',
122+ action: () => console.log('Close pane triggered')
123+ },
124+ {
125+ key: 'Enter (pane mode)',
126+ description: 'Confirm action',
127+ action: () => console.log('Confirm triggered')
128+ },
129+ {
130+ key: 'Escape (pane mode)',
131+ description: 'Exit pane mode',
132+ action: () => console.log('Exit pane mode triggered')
133+ },
134+ // Workspace navigation
135+ {
136+ key: 'Alt+Arrow Keys',
137+ description: 'Navigate between panes',
138+ action: () => console.log('Navigate panes triggered')
101139 },
102140 {
103- key: 'Ctrl+-',
104- description: 'Zoom out',
105- action: () => console.log('Ctrl+- triggered')
141+ key: 'Ctrl+↑ / Ctrl+↓',
142+ description: 'Navigate panes up/down',
143+ action: () => console.log('Navigate vertical triggered')
106144 }
107145 ];
108146 shortcutsLoading = false;
@@ -44,6 +44,7 @@
44 // Initialize shortcuts (these are browser shortcuts, not dynamic from API)44 // Initialize shortcuts (these are browser shortcuts, not dynamic from API)
45 const initializeShortcuts = () => {45 const initializeShortcuts = () => {
46 shortcuts = [46 shortcuts = [
47+ // Browser shortcuts
47 {48 {
48 key: 'Ctrl+L',49 key: 'Ctrl+L',
49 description: 'Focus address bar',50 description: 'Focus address bar',
@@ -60,7 +61,7 @@
60 action: () => console.log('Ctrl+Shift+C triggered')61 action: () => console.log('Ctrl+Shift+C triggered')
61 },62 },
62 {63 {
63- key: 'Ctrl+R',64+ key: 'Ctrl+R / F5',
64 description: 'Reload page',65 description: 'Reload page',
65 action: () => window.location.reload()66 action: () => window.location.reload()
66 },67 },
@@ -69,25 +70,15 @@
69 description: 'Hard reload',70 description: 'Hard reload',
70 action: () => console.log('Ctrl+Shift+R triggered')71 action: () => console.log('Ctrl+Shift+R triggered')
71 },72 },
72- {
73- key: 'F5',
74- description: 'Reload page',
75- action: () => window.location.reload()
76- },
77 {73 {
78 key: 'F12',74 key: 'F12',
79 description: 'DevTools',75 description: 'DevTools',
80 action: () => console.log('F12 triggered')76 action: () => console.log('F12 triggered')
81 },77 },
82 {78 {
83- key: 'Alt+←',79+ key: 'Alt+← / Alt+→',
84- description: 'Navigate back',80+ description: 'Navigate back/forward',
85- action: () => console.log('Alt+← triggered')81+ action: () => console.log('Alt+Arrow triggered')
86- },
87- {
88- key: 'Alt+→',
89- description: 'Navigate forward',
90- action: () => console.log('Alt+→ triggered')
91 },82 },
92 {83 {
93 key: 'Ctrl+0',84 key: 'Ctrl+0',
@@ -95,14 +86,61 @@
95 action: () => console.log('Ctrl+0 triggered')86 action: () => console.log('Ctrl+0 triggered')
96 },87 },
97 {88 {
98- key: 'Ctrl++',89+ key: 'Ctrl++ / Ctrl+-',
99- description: 'Zoom in',90+ description: 'Zoom in/out',
100- action: () => console.log('Ctrl++ triggered')91+ action: () => console.log('Ctrl+Zoom triggered')
92+ },
93+ // Workspace pane mode
94+ {
95+ key: 'Ctrl+P',
96+ description: 'Enter pane mode',
97+ action: () => console.log('Ctrl+P triggered')
98+ },
99+ {
100+ key: '→ / R (pane mode)',
101+ description: 'Split pane right',
102+ action: () => console.log('Split right triggered')
103+ },
104+ {
105+ key: '← / L (pane mode)',
106+ description: 'Split pane left',
107+ action: () => console.log('Split left triggered')
108+ },
109+ {
110+ key: '↑ / U (pane mode)',
111+ description: 'Split pane up',
112+ action: () => console.log('Split up triggered')
113+ },
114+ {
115+ key: '↓ / D (pane mode)',
116+ description: 'Split pane down',
117+ action: () => console.log('Split down triggered')
118+ },
119+ {
120+ key: 'X (pane mode)',
121+ description: 'Close current pane',
122+ action: () => console.log('Close pane triggered')
123+ },
124+ {
125+ key: 'Enter (pane mode)',
126+ description: 'Confirm action',
127+ action: () => console.log('Confirm triggered')
128+ },
129+ {
130+ key: 'Escape (pane mode)',
131+ description: 'Exit pane mode',
132+ action: () => console.log('Exit pane mode triggered')
133+ },
134+ // Workspace navigation
135+ {
136+ key: 'Alt+Arrow Keys',
137+ description: 'Navigate between panes',
138+ action: () => console.log('Navigate panes triggered')
101 },139 },
102 {140 {
103- key: 'Ctrl+-',141+ key: 'Ctrl+↑ / Ctrl+↓',
104- description: 'Zoom out',142+ description: 'Navigate panes up/down',
105- action: () => console.log('Ctrl+- triggered')143+ action: () => console.log('Navigate vertical triggered')
106 }144 }
107 ];145 ];
108 shortcutsLoading = false;146 shortcutsLoading = false;

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