hotkey-router 0.1.0 โ 0.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/README.md +113 -4
- package/data/browser-hotkeys.json +349 -0
- package/dist/auto.js +967 -0
- package/dist/auto.js.map +7 -0
- package/dist/auto.min.js +3 -0
- package/dist/hotkey-router.cjs +40 -17
- package/dist/hotkey-router.cjs.map +2 -2
- package/dist/hotkey-router.js +40 -17
- package/dist/hotkey-router.js.map +2 -2
- package/dist/hotkey-router.min.js +2 -2
- package/dist/reservations.js +528 -0
- package/dist/reservations.js.map +7 -0
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -14,8 +14,8 @@ It is a predictable, plugin-first routing layer for keyboard shortcuts.
|
|
|
14
14
|
* ๐ฏ Deterministic winner selection (priority + recency)
|
|
15
15
|
* ๐ Input-safe by default
|
|
16
16
|
* ๐งช Testable via `trigger()`
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* ๐จ Optional opt-in browser/OS conflict warnings (tree-shakable)
|
|
18
|
+
* ๐ฆ ~3 kB minified + gzipped (core); ~7.5 kB with conflict warnings
|
|
19
19
|
* ๐ซ Zero dependencies
|
|
20
20
|
|
|
21
21
|
---
|
|
@@ -93,6 +93,99 @@ hotkeys.registerPlugin('docs', {
|
|
|
93
93
|
})
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
## Conflict warnings (v0.2.0+)
|
|
97
|
+
|
|
98
|
+
Some combos are reserved by the browser chrome (find bar, devtools, bookmarks) or the OS (Spotlight, window management) โ they never reach page-world JavaScript, no matter how early you listen or whether you call `preventDefault`. Hotkey Router ships an **opt-in** reservation table that emits a soft warning at bind time, so the silent failure becomes a noisy one.
|
|
99
|
+
|
|
100
|
+
The feature is opt-in by design: the core router stays ~3 KB gzipped, and the ~5 KB reservation data is tree-shaken out entirely unless you import it.
|
|
101
|
+
|
|
102
|
+
### Two ways to opt in
|
|
103
|
+
|
|
104
|
+
**One-line ergonomic** โ use the `auto` entry. Same default export as `hotkey-router`, with warnings pre-installed:
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
import hotkeys from 'hotkey-router/auto'
|
|
108
|
+
|
|
109
|
+
hotkeys.bind('meta+shift+f', toggleFullscreen)
|
|
110
|
+
// Firefox on macOS:
|
|
111
|
+
// [hotkey-router] "meta+shift+f" reserved by firefox on macOS:
|
|
112
|
+
// "Toggle fullscreen" [hard] โ will not fire.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Explicit install** โ keep using the tiny core, install warnings yourself:
|
|
116
|
+
|
|
117
|
+
```js
|
|
118
|
+
import hotkeys from 'hotkey-router'
|
|
119
|
+
import { installReservationWarnings } from 'hotkey-router/reservations'
|
|
120
|
+
|
|
121
|
+
installReservationWarnings(hotkeys)
|
|
122
|
+
hotkeys.bind('meta+shift+f', toggleFullscreen)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`installReservationWarnings()` returns an `uninstall` function if you ever need to detach. The warning is **never fatal** โ the binding is still registered, in case you're running in a browser/platform where the conflict doesn't apply.
|
|
126
|
+
|
|
127
|
+
### Severity โ log level
|
|
128
|
+
|
|
129
|
+
| Severity | Log level | Meaning |
|
|
130
|
+
| ----------------- | --------- | ------------------------------------------------------- |
|
|
131
|
+
| `hard` | `warn` | Browser intercepts before page world; combo won't fire. |
|
|
132
|
+
| `os` | `warn` | OS intercepts globally. |
|
|
133
|
+
| `menu-activation` | `warn` | Alt+letter activates the browser menu bar (Win/Linux). |
|
|
134
|
+
| `find-bar-only` | `info` | Reserved only when the find bar is focused. |
|
|
135
|
+
| `compose` | `info` | macOS Option+letter types a special char in inputs. |
|
|
136
|
+
| `system-text` | `info` | Mac Ctrl+letter cursor controls inside text inputs. |
|
|
137
|
+
| `devtools-open` | `info` | Only relevant when DevTools is already open. |
|
|
138
|
+
|
|
139
|
+
### Per-bind opt-out
|
|
140
|
+
|
|
141
|
+
```js
|
|
142
|
+
hotkeys.bind('meta+shift+f', toggleFullscreen, null, { warnOnReserved: false })
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
To turn warnings off globally, just don't install them (use the bare `hotkey-router` entry instead of `hotkey-router/auto`).
|
|
146
|
+
|
|
147
|
+
### Force a platform/browser (tests, SSR previews)
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
installReservationWarnings(hotkeys, { platform: 'mac', browser: 'firefox' })
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Accepted platforms: `'mac' | 'windows' | 'linux'`. Browsers: `'firefox' | 'chrome' | 'safari' | 'edge'`.
|
|
154
|
+
|
|
155
|
+
### Caveats
|
|
156
|
+
|
|
157
|
+
- Reservations reflect **default** keybindings. Users with custom shortcuts (Edge 95+ rebinds, Firefox add-ons, OS-level customization) may not match.
|
|
158
|
+
- KDE/XFCE desktop reservations beyond GNOME are not yet catalogued โ Linux coverage is conservative.
|
|
159
|
+
- Layout-specific differences (Dvorak, AZERTY) change which physical key produces `event.key === 'f'`. For layout-stable bindings against the physical key, use `code:KeyX` syntax โ the reservation lookup normalizes both.
|
|
160
|
+
|
|
161
|
+
### Programmatic lookup
|
|
162
|
+
|
|
163
|
+
If you want to query the table yourself (e.g. building a cheatsheet that flags conflicts):
|
|
164
|
+
|
|
165
|
+
```js
|
|
166
|
+
import { lookupReservation } from 'hotkey-router/reservations'
|
|
167
|
+
|
|
168
|
+
const r = lookupReservation(
|
|
169
|
+
{ meta: true, shift: true, key: 'f' },
|
|
170
|
+
{ platform: 'mac', browser: 'firefox' }
|
|
171
|
+
)
|
|
172
|
+
// โ { source: 'browser', action: 'Toggle fullscreen', severity: 'hard', ... }
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Extension hook (`onBind`)
|
|
176
|
+
|
|
177
|
+
Reservation warnings are built on a public `onBind` hook โ useful for telemetry, dev panels, or any cross-cutting concern that needs to observe every binding:
|
|
178
|
+
|
|
179
|
+
```js
|
|
180
|
+
const off = hotkeys.onBind(({ combo, raw, options, plugin, id }) => {
|
|
181
|
+
// combo: parsed combo { ctrl, meta, alt, shift, key, code, bareModifier }
|
|
182
|
+
// raw: original hotkey string
|
|
183
|
+
})
|
|
184
|
+
// off() unsubscribes.
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
96
189
|
## Bare-modifier bindings (v0.1.0+)
|
|
97
190
|
|
|
98
191
|
Some UX patterns are driven by a bare modifier rather than a chord โ e.g. "hold Alt to enter select mode, release Alt to exit."
|
|
@@ -164,11 +257,12 @@ off()
|
|
|
164
257
|
preventDefault?: boolean
|
|
165
258
|
stopPropagation?: boolean
|
|
166
259
|
stopImmediatePropagation?: boolean
|
|
167
|
-
repeat?: boolean
|
|
260
|
+
repeat?: boolean // default false on keydown
|
|
168
261
|
once?: boolean
|
|
169
262
|
when?: (event) => boolean
|
|
170
263
|
allowIn?: (event) => boolean
|
|
171
|
-
priority?: number
|
|
264
|
+
priority?: number // default 0
|
|
265
|
+
warnOnReserved?: boolean // only read when conflict warnings are installed
|
|
172
266
|
}
|
|
173
267
|
```
|
|
174
268
|
|
|
@@ -240,6 +334,21 @@ Remove all hotkeys associated with a plugin.
|
|
|
240
334
|
|
|
241
335
|
---
|
|
242
336
|
|
|
337
|
+
## `onBind(hook)`
|
|
338
|
+
|
|
339
|
+
Subscribe to bind events. The hook receives `{ combo, raw, options, plugin, id }` after every successful `bind()`. Returns an unsubscribe function. Used internally by `installReservationWarnings`; exposed for telemetry, dev panels, and custom validation.
|
|
340
|
+
|
|
341
|
+
```js
|
|
342
|
+
const off = hotkeys.onBind(({ raw }) => {
|
|
343
|
+
console.debug('bound:', raw)
|
|
344
|
+
})
|
|
345
|
+
// off() unsubscribes.
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Hook errors are caught and logged via `console.error` โ a buggy hook can't break the bind.
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
243
352
|
## `pause()` / `resume()`
|
|
244
353
|
|
|
245
354
|
Temporarily disable or re-enable all routing.
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Machine-readable companion to docs/browser-hotkeys.md. Each combo entry describes who claims the binding and how strongly. Intended for runtime conflict warnings in keyboard-routing libraries (e.g. hotkey-router) and dev-time validation in apps like WebRadar. Update both this file and the markdown together โ the markdown is the human source of truth, this file is the machine projection.",
|
|
3
|
+
"version": {
|
|
4
|
+
"generated": "2026-05-17",
|
|
5
|
+
"schema": "1.0",
|
|
6
|
+
"sources": [
|
|
7
|
+
"https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly",
|
|
8
|
+
"https://firefox-source-docs.mozilla.org/devtools-user/keyboard_shortcuts/index.html",
|
|
9
|
+
"https://support.google.com/chrome/answer/157179",
|
|
10
|
+
"https://developer.chrome.com/docs/devtools/shortcuts",
|
|
11
|
+
"https://support.apple.com/guide/safari/keyboard-shortcuts-and-gestures-cpsh003/mac",
|
|
12
|
+
"https://developer.apple.com/documentation/safari-developer-tools/web-inspector",
|
|
13
|
+
"https://support.microsoft.com/en-us/microsoft-edge/keyboard-shortcuts-in-microsoft-edge-50d3edab-30d9-c7e4-21ce-37fe2713cfad",
|
|
14
|
+
"https://support.apple.com/en-us/102650",
|
|
15
|
+
"https://support.microsoft.com/en-us/windows/keyboard-shortcuts-in-windows-dcc61a57-8ff0-cffe-9796-cb9706c75eec",
|
|
16
|
+
"https://help.gnome.org/gnome-help/shell-keyboard-shortcuts.html"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"severityLevels": {
|
|
20
|
+
"hard": "Browser or OS intercepts before page-world keydown fires. preventDefault() can't recover it.",
|
|
21
|
+
"find-bar-only": "Reserved only when the browser's find bar has focus. Fires in page world during normal browsing.",
|
|
22
|
+
"menu-activation": "Win/Linux Alt+letter activates the browser menu bar. Hard to suppress reliably.",
|
|
23
|
+
"system-text": "Only reserved while a text input has focus (terminal-style cursor controls on macOS).",
|
|
24
|
+
"compose": "macOS Option+letter types a special character in text inputs. Outside inputs, free for page world.",
|
|
25
|
+
"os": "Operating system intercepts globally, before any application sees it.",
|
|
26
|
+
"devtools-open": "Only relevant when DevTools is already open; outside DevTools it fires normally."
|
|
27
|
+
},
|
|
28
|
+
"$keyFormat": "Each combo key uses hotkey-router-compatible syntax: modifiers in canonical order (ctrl|meta|alt|shift) joined by '+', then the key (lowercased letter, or symbolic name). Per-platform tables use the platform's native modifier name โ `meta` on macOS = Cmd, `meta` on Windows = Win, `ctrl` on Linux/Windows = the primary modifier.",
|
|
29
|
+
"platforms": {
|
|
30
|
+
"mac": {
|
|
31
|
+
"browsers": {
|
|
32
|
+
"firefox": {
|
|
33
|
+
"meta+a": { "action": "Select all", "severity": "hard" },
|
|
34
|
+
"meta+b": { "action": "Bookmarks sidebar", "severity": "hard" },
|
|
35
|
+
"meta+c": { "action": "Copy", "severity": "hard" },
|
|
36
|
+
"meta+d": { "action": "Bookmark this page", "severity": "hard" },
|
|
37
|
+
"meta+e": { "action": "Search from page", "severity": "hard" },
|
|
38
|
+
"meta+f": { "action": "Find in page", "severity": "hard" },
|
|
39
|
+
"meta+g": { "action": "Find next", "severity": "hard" },
|
|
40
|
+
"meta+j": { "action": "Downloads", "severity": "hard" },
|
|
41
|
+
"meta+l": { "action": "Focus address bar", "severity": "hard" },
|
|
42
|
+
"meta+n": { "action": "New window", "severity": "hard" },
|
|
43
|
+
"meta+o": { "action": "Open file", "severity": "hard" },
|
|
44
|
+
"meta+p": { "action": "Print", "severity": "hard" },
|
|
45
|
+
"meta+r": { "action": "Reload", "severity": "hard" },
|
|
46
|
+
"meta+s": { "action": "Save page", "severity": "hard" },
|
|
47
|
+
"meta+t": { "action": "New tab", "severity": "hard" },
|
|
48
|
+
"meta+u": { "action": "View source", "severity": "hard" },
|
|
49
|
+
"meta+v": { "action": "Paste", "severity": "hard" },
|
|
50
|
+
"meta+w": { "action": "Close tab", "severity": "hard" },
|
|
51
|
+
"meta+x": { "action": "Cut", "severity": "hard" },
|
|
52
|
+
"meta+y": { "action": "Redo", "severity": "hard" },
|
|
53
|
+
"meta+z": { "action": "Undo", "severity": "hard" },
|
|
54
|
+
"meta+shift+a": { "action": "Add-ons manager", "severity": "hard" },
|
|
55
|
+
"meta+shift+b": { "action": "Bookmarks toolbar", "severity": "hard" },
|
|
56
|
+
"meta+shift+c": { "action": "Inspector (element picker)", "severity": "hard" },
|
|
57
|
+
"meta+shift+d": { "action": "Bookmark all tabs", "severity": "hard" },
|
|
58
|
+
"meta+shift+e": { "action": "Network Monitor", "severity": "hard" },
|
|
59
|
+
"meta+shift+f": { "action": "Toggle fullscreen", "severity": "hard" },
|
|
60
|
+
"meta+shift+g": { "action": "Find previous", "severity": "find-bar-only" },
|
|
61
|
+
"meta+shift+j": { "action": "Browser Console", "severity": "hard" },
|
|
62
|
+
"meta+shift+n": { "action": "New private window", "severity": "hard" },
|
|
63
|
+
"meta+shift+o": { "action": "Bookmarks library", "severity": "hard" },
|
|
64
|
+
"meta+shift+p": { "action": "New private window (alt)", "severity": "hard" },
|
|
65
|
+
"meta+shift+q": { "action": "Quit (with confirm)", "severity": "hard" },
|
|
66
|
+
"meta+shift+s": { "action": "Firefox Screenshot", "severity": "hard" },
|
|
67
|
+
"meta+shift+t": { "action": "Reopen closed tab", "severity": "hard" },
|
|
68
|
+
"meta+shift+v": { "action": "Paste as plain text", "severity": "hard" },
|
|
69
|
+
"meta+shift+w": { "action": "Close window", "severity": "hard" },
|
|
70
|
+
"meta+shift+z": { "action": "Redo", "severity": "hard" },
|
|
71
|
+
"meta+alt+c": { "action": "Inspector", "severity": "hard" },
|
|
72
|
+
"meta+alt+e": { "action": "Network Monitor", "severity": "hard" },
|
|
73
|
+
"meta+alt+i": { "action": "DevTools Toolbox", "severity": "hard" },
|
|
74
|
+
"meta+alt+j": { "action": "Browser Console", "severity": "hard" },
|
|
75
|
+
"meta+alt+k": { "action": "Web Console", "severity": "hard" },
|
|
76
|
+
"meta+alt+m": { "action": "Responsive Design Mode", "severity": "hard" },
|
|
77
|
+
"meta+alt+z": { "action": "Debugger", "severity": "hard" }
|
|
78
|
+
},
|
|
79
|
+
"chrome": {
|
|
80
|
+
"meta+a": { "action": "Select all", "severity": "hard" },
|
|
81
|
+
"meta+c": { "action": "Copy", "severity": "hard" },
|
|
82
|
+
"meta+d": { "action": "Bookmark this page", "severity": "hard" },
|
|
83
|
+
"meta+e": { "action": "Search selected text", "severity": "find-bar-only" },
|
|
84
|
+
"meta+f": { "action": "Find in page", "severity": "hard" },
|
|
85
|
+
"meta+g": { "action": "Find next", "severity": "hard" },
|
|
86
|
+
"meta+l": { "action": "Focus address bar", "severity": "hard" },
|
|
87
|
+
"meta+n": { "action": "New window", "severity": "hard" },
|
|
88
|
+
"meta+o": { "action": "Open file", "severity": "hard" },
|
|
89
|
+
"meta+p": { "action": "Print", "severity": "hard" },
|
|
90
|
+
"meta+r": { "action": "Reload", "severity": "hard" },
|
|
91
|
+
"meta+s": { "action": "Save page", "severity": "hard" },
|
|
92
|
+
"meta+t": { "action": "New tab", "severity": "hard" },
|
|
93
|
+
"meta+v": { "action": "Paste", "severity": "hard" },
|
|
94
|
+
"meta+w": { "action": "Close tab", "severity": "hard" },
|
|
95
|
+
"meta+x": { "action": "Cut", "severity": "hard" },
|
|
96
|
+
"meta+y": { "action": "History page", "severity": "hard" },
|
|
97
|
+
"meta+z": { "action": "Undo", "severity": "hard" },
|
|
98
|
+
"meta+shift+b": { "action": "Bookmarks bar toggle", "severity": "hard" },
|
|
99
|
+
"meta+shift+c": { "action": "DevTools Inspector", "severity": "hard" },
|
|
100
|
+
"meta+shift+d": { "action": "Bookmark all tabs", "severity": "hard" },
|
|
101
|
+
"meta+shift+g": { "action": "Find previous", "severity": "find-bar-only" },
|
|
102
|
+
"meta+shift+j": { "action": "Downloads page", "severity": "hard" },
|
|
103
|
+
"meta+shift+m": { "action": "Switch user / guest", "severity": "hard" },
|
|
104
|
+
"meta+shift+n": { "action": "New incognito window", "severity": "hard" },
|
|
105
|
+
"meta+shift+r": { "action": "Hard reload", "severity": "hard" },
|
|
106
|
+
"meta+shift+t": { "action": "Reopen closed tab", "severity": "hard" },
|
|
107
|
+
"meta+shift+v": { "action": "Paste as plain text", "severity": "hard" },
|
|
108
|
+
"meta+shift+w": { "action": "Close window", "severity": "hard" },
|
|
109
|
+
"meta+shift+z": { "action": "Redo", "severity": "hard" },
|
|
110
|
+
"meta+alt+i": { "action": "DevTools", "severity": "hard" },
|
|
111
|
+
"meta+alt+j": { "action": "DevTools (console)", "severity": "hard" },
|
|
112
|
+
"meta+alt+u": { "action": "View source", "severity": "hard" }
|
|
113
|
+
},
|
|
114
|
+
"safari": {
|
|
115
|
+
"meta+a": { "action": "Select all", "severity": "hard" },
|
|
116
|
+
"meta+c": { "action": "Copy", "severity": "hard" },
|
|
117
|
+
"meta+d": { "action": "Add to Reading List", "severity": "hard" },
|
|
118
|
+
"meta+f": { "action": "Find in page", "severity": "hard" },
|
|
119
|
+
"meta+g": { "action": "Find next", "severity": "hard" },
|
|
120
|
+
"meta+j": { "action": "Downloads", "severity": "hard" },
|
|
121
|
+
"meta+l": { "action": "Focus Smart Search", "severity": "hard" },
|
|
122
|
+
"meta+n": { "action": "New window", "severity": "hard" },
|
|
123
|
+
"meta+p": { "action": "Print", "severity": "hard" },
|
|
124
|
+
"meta+r": { "action": "Reload", "severity": "hard" },
|
|
125
|
+
"meta+s": { "action": "Save page", "severity": "hard" },
|
|
126
|
+
"meta+t": { "action": "New tab", "severity": "hard" },
|
|
127
|
+
"meta+v": { "action": "Paste", "severity": "hard" },
|
|
128
|
+
"meta+w": { "action": "Close tab", "severity": "hard" },
|
|
129
|
+
"meta+x": { "action": "Cut", "severity": "hard" },
|
|
130
|
+
"meta+z": { "action": "Undo", "severity": "hard" },
|
|
131
|
+
"meta+shift+c": { "action": "Inspector pick element", "severity": "hard" },
|
|
132
|
+
"meta+shift+d": { "action": "Add Reading List item", "severity": "hard" },
|
|
133
|
+
"meta+shift+g": { "action": "Find previous", "severity": "find-bar-only" },
|
|
134
|
+
"meta+shift+h": { "action": "Go to homepage", "severity": "hard" },
|
|
135
|
+
"meta+shift+n": { "action": "New private window", "severity": "hard" },
|
|
136
|
+
"meta+shift+r": { "action": "Reader mode", "severity": "hard" },
|
|
137
|
+
"meta+shift+t": { "action": "Reopen last closed tab", "severity": "hard" },
|
|
138
|
+
"meta+shift+v": { "action": "Paste as plain text", "severity": "hard" },
|
|
139
|
+
"meta+shift+w": { "action": "Close window", "severity": "hard" },
|
|
140
|
+
"meta+shift+z": { "action": "Redo", "severity": "hard" },
|
|
141
|
+
"meta+alt+c": { "action": "Web Inspector pick", "severity": "hard" },
|
|
142
|
+
"meta+alt+i": { "action": "Web Inspector", "severity": "hard" }
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"system": {
|
|
146
|
+
"meta+space": { "action": "Spotlight", "severity": "os" },
|
|
147
|
+
"meta+tab": { "action": "App switcher", "severity": "os" },
|
|
148
|
+
"meta+h": { "action": "Hide app", "severity": "os" },
|
|
149
|
+
"meta+m": { "action": "Minimize window", "severity": "os" },
|
|
150
|
+
"meta+q": { "action": "Quit app", "severity": "os" },
|
|
151
|
+
"meta+shift+3": { "action": "Screenshot full screen", "severity": "os" },
|
|
152
|
+
"meta+shift+4": { "action": "Screenshot selection", "severity": "os" },
|
|
153
|
+
"meta+shift+5": { "action": "Screen recording tool", "severity": "os" },
|
|
154
|
+
"meta+shift+q": { "action": "Log out", "severity": "os" },
|
|
155
|
+
"meta+ctrl+q": { "action": "Lock screen", "severity": "os" },
|
|
156
|
+
"meta+ctrl+space": { "action": "Character Viewer", "severity": "os" },
|
|
157
|
+
"meta+alt+esc": { "action": "Force-quit dialog", "severity": "os" }
|
|
158
|
+
},
|
|
159
|
+
"noteForLetterCombos": {
|
|
160
|
+
"alt+a..z": { "behavior": "compose", "note": "Option+letter types special characters in text inputs (Option+Eโยด, Option+Aโรฅ, Option+Fโฦ). Outside inputs, free for page world." },
|
|
161
|
+
"ctrl+a..z": { "behavior": "system-text", "note": "Mac uses Ctrl+letter as terminal-style cursor controls inside text inputs (Ctrl+A=line start, Ctrl+E=line end, Ctrl+K=delete-to-end, etc.). Outside inputs, free for page world." }
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"windows": {
|
|
165
|
+
"browsers": {
|
|
166
|
+
"firefox": {
|
|
167
|
+
"ctrl+a": { "action": "Select all", "severity": "hard" },
|
|
168
|
+
"ctrl+b": { "action": "Bookmarks sidebar", "severity": "hard" },
|
|
169
|
+
"ctrl+c": { "action": "Copy", "severity": "hard" },
|
|
170
|
+
"ctrl+d": { "action": "Bookmark this page", "severity": "hard" },
|
|
171
|
+
"ctrl+f": { "action": "Find in page", "severity": "hard" },
|
|
172
|
+
"ctrl+g": { "action": "Find next", "severity": "hard" },
|
|
173
|
+
"ctrl+h": { "action": "History sidebar", "severity": "hard" },
|
|
174
|
+
"ctrl+j": { "action": "Downloads", "severity": "hard" },
|
|
175
|
+
"ctrl+l": { "action": "Focus address bar", "severity": "hard" },
|
|
176
|
+
"ctrl+n": { "action": "New window", "severity": "hard" },
|
|
177
|
+
"ctrl+o": { "action": "Open file", "severity": "hard" },
|
|
178
|
+
"ctrl+p": { "action": "Print", "severity": "hard" },
|
|
179
|
+
"ctrl+r": { "action": "Reload", "severity": "hard" },
|
|
180
|
+
"ctrl+s": { "action": "Save page", "severity": "hard" },
|
|
181
|
+
"ctrl+t": { "action": "New tab", "severity": "hard" },
|
|
182
|
+
"ctrl+u": { "action": "View source", "severity": "hard" },
|
|
183
|
+
"ctrl+v": { "action": "Paste", "severity": "hard" },
|
|
184
|
+
"ctrl+w": { "action": "Close tab", "severity": "hard" },
|
|
185
|
+
"ctrl+x": { "action": "Cut", "severity": "hard" },
|
|
186
|
+
"ctrl+y": { "action": "Redo", "severity": "hard" },
|
|
187
|
+
"ctrl+z": { "action": "Undo", "severity": "hard" },
|
|
188
|
+
"ctrl+shift+a": { "action": "Add-ons manager", "severity": "hard" },
|
|
189
|
+
"ctrl+shift+b": { "action": "Bookmarks toolbar", "severity": "hard" },
|
|
190
|
+
"ctrl+shift+c": { "action": "Inspector (element picker)", "severity": "hard" },
|
|
191
|
+
"ctrl+shift+d": { "action": "Bookmark all tabs", "severity": "hard" },
|
|
192
|
+
"ctrl+shift+e": { "action": "Network Monitor", "severity": "hard" },
|
|
193
|
+
"ctrl+shift+g": { "action": "Find previous", "severity": "find-bar-only" },
|
|
194
|
+
"ctrl+shift+i": { "action": "Developer Tools", "severity": "hard" },
|
|
195
|
+
"ctrl+shift+j": { "action": "Browser Console", "severity": "hard" },
|
|
196
|
+
"ctrl+shift+k": { "action": "Web Console", "severity": "hard" },
|
|
197
|
+
"ctrl+shift+m": { "action": "Responsive Design Mode", "severity": "hard" },
|
|
198
|
+
"ctrl+shift+n": { "action": "New private window", "severity": "hard" },
|
|
199
|
+
"ctrl+shift+o": { "action": "Bookmarks library", "severity": "hard" },
|
|
200
|
+
"ctrl+shift+p": { "action": "New private window (alt)", "severity": "hard" },
|
|
201
|
+
"ctrl+shift+s": { "action": "Firefox Screenshot", "severity": "hard" },
|
|
202
|
+
"ctrl+shift+t": { "action": "Reopen closed tab", "severity": "hard" },
|
|
203
|
+
"ctrl+shift+v": { "action": "Paste as plain text", "severity": "hard" },
|
|
204
|
+
"ctrl+shift+w": { "action": "Close window", "severity": "hard" },
|
|
205
|
+
"ctrl+shift+y": { "action": "Downloads (alt)", "severity": "hard" },
|
|
206
|
+
"ctrl+shift+z": { "action": "Debugger", "severity": "hard" },
|
|
207
|
+
"alt+f": { "action": "File menu", "severity": "menu-activation" },
|
|
208
|
+
"alt+e": { "action": "Edit menu", "severity": "menu-activation" },
|
|
209
|
+
"alt+v": { "action": "View menu", "severity": "menu-activation" },
|
|
210
|
+
"alt+b": { "action": "Bookmarks menu", "severity": "menu-activation" },
|
|
211
|
+
"alt+t": { "action": "Tools menu", "severity": "menu-activation" },
|
|
212
|
+
"alt+h": { "action": "Help menu", "severity": "menu-activation" },
|
|
213
|
+
"alt+d": { "action": "Focus address bar", "severity": "hard" }
|
|
214
|
+
},
|
|
215
|
+
"chrome": {
|
|
216
|
+
"ctrl+a": { "action": "Select all", "severity": "hard" },
|
|
217
|
+
"ctrl+c": { "action": "Copy", "severity": "hard" },
|
|
218
|
+
"ctrl+d": { "action": "Bookmark this page", "severity": "hard" },
|
|
219
|
+
"ctrl+e": { "action": "Search from page", "severity": "hard" },
|
|
220
|
+
"ctrl+f": { "action": "Find in page", "severity": "hard" },
|
|
221
|
+
"ctrl+g": { "action": "Find next", "severity": "hard" },
|
|
222
|
+
"ctrl+h": { "action": "History page", "severity": "hard" },
|
|
223
|
+
"ctrl+j": { "action": "Downloads", "severity": "hard" },
|
|
224
|
+
"ctrl+k": { "action": "Search from page", "severity": "hard" },
|
|
225
|
+
"ctrl+l": { "action": "Focus address bar", "severity": "hard" },
|
|
226
|
+
"ctrl+n": { "action": "New window", "severity": "hard" },
|
|
227
|
+
"ctrl+o": { "action": "Open file", "severity": "hard" },
|
|
228
|
+
"ctrl+p": { "action": "Print", "severity": "hard" },
|
|
229
|
+
"ctrl+r": { "action": "Reload", "severity": "hard" },
|
|
230
|
+
"ctrl+s": { "action": "Save page", "severity": "hard" },
|
|
231
|
+
"ctrl+t": { "action": "New tab", "severity": "hard" },
|
|
232
|
+
"ctrl+u": { "action": "View source", "severity": "hard" },
|
|
233
|
+
"ctrl+v": { "action": "Paste", "severity": "hard" },
|
|
234
|
+
"ctrl+w": { "action": "Close tab", "severity": "hard" },
|
|
235
|
+
"ctrl+x": { "action": "Cut", "severity": "hard" },
|
|
236
|
+
"ctrl+z": { "action": "Undo", "severity": "hard" },
|
|
237
|
+
"ctrl+shift+b": { "action": "Bookmarks bar toggle", "severity": "hard" },
|
|
238
|
+
"ctrl+shift+d": { "action": "Bookmark all tabs", "severity": "hard" },
|
|
239
|
+
"ctrl+shift+g": { "action": "Find previous", "severity": "find-bar-only" },
|
|
240
|
+
"ctrl+shift+i": { "action": "DevTools", "severity": "hard" },
|
|
241
|
+
"ctrl+shift+j": { "action": "DevTools (console)", "severity": "hard" },
|
|
242
|
+
"ctrl+shift+m": { "action": "Switch user / guest", "severity": "hard" },
|
|
243
|
+
"ctrl+shift+n": { "action": "Incognito window", "severity": "hard" },
|
|
244
|
+
"ctrl+shift+r": { "action": "Hard reload", "severity": "hard" },
|
|
245
|
+
"ctrl+shift+t": { "action": "Reopen closed tab", "severity": "hard" },
|
|
246
|
+
"ctrl+shift+v": { "action": "Paste as plain text", "severity": "hard" },
|
|
247
|
+
"ctrl+shift+w": { "action": "Close window", "severity": "hard" },
|
|
248
|
+
"alt+d": { "action": "Focus address bar", "severity": "hard" },
|
|
249
|
+
"alt+e": { "action": "Customize menu", "severity": "menu-activation" },
|
|
250
|
+
"alt+f": { "action": "Customize menu (alt)", "severity": "menu-activation" }
|
|
251
|
+
},
|
|
252
|
+
"edge": {
|
|
253
|
+
"ctrl+a": { "action": "Select all", "severity": "hard" },
|
|
254
|
+
"ctrl+c": { "action": "Copy", "severity": "hard" },
|
|
255
|
+
"ctrl+d": { "action": "Favorite this page", "severity": "hard" },
|
|
256
|
+
"ctrl+e": { "action": "Search from page", "severity": "hard" },
|
|
257
|
+
"ctrl+f": { "action": "Find in page", "severity": "hard" },
|
|
258
|
+
"ctrl+g": { "action": "Find next", "severity": "hard" },
|
|
259
|
+
"ctrl+h": { "action": "History", "severity": "hard" },
|
|
260
|
+
"ctrl+j": { "action": "Downloads", "severity": "hard" },
|
|
261
|
+
"ctrl+k": { "action": "Search from page", "severity": "hard" },
|
|
262
|
+
"ctrl+l": { "action": "Focus address bar", "severity": "hard" },
|
|
263
|
+
"ctrl+m": { "action": "Mute current tab", "severity": "hard" },
|
|
264
|
+
"ctrl+n": { "action": "New window", "severity": "hard" },
|
|
265
|
+
"ctrl+o": { "action": "Open file", "severity": "hard" },
|
|
266
|
+
"ctrl+p": { "action": "Print", "severity": "hard" },
|
|
267
|
+
"ctrl+r": { "action": "Reload", "severity": "hard" },
|
|
268
|
+
"ctrl+s": { "action": "Save page", "severity": "hard" },
|
|
269
|
+
"ctrl+t": { "action": "New tab", "severity": "hard" },
|
|
270
|
+
"ctrl+u": { "action": "View source", "severity": "hard" },
|
|
271
|
+
"ctrl+v": { "action": "Paste", "severity": "hard" },
|
|
272
|
+
"ctrl+w": { "action": "Close tab", "severity": "hard" },
|
|
273
|
+
"ctrl+x": { "action": "Cut", "severity": "hard" },
|
|
274
|
+
"ctrl+z": { "action": "Undo", "severity": "hard" },
|
|
275
|
+
"ctrl+shift+b": { "action": "Favorites bar toggle", "severity": "hard" },
|
|
276
|
+
"ctrl+shift+d": { "action": "Bookmark all tabs in folder", "severity": "hard" },
|
|
277
|
+
"ctrl+shift+e": { "action": "Search in sidebar", "severity": "hard" },
|
|
278
|
+
"ctrl+shift+g": { "action": "Find previous", "severity": "find-bar-only" },
|
|
279
|
+
"ctrl+shift+i": { "action": "DevTools", "severity": "hard" },
|
|
280
|
+
"ctrl+shift+j": { "action": "DevTools (console)", "severity": "hard" },
|
|
281
|
+
"ctrl+shift+k": { "action": "Duplicate tab", "severity": "hard" },
|
|
282
|
+
"ctrl+shift+l": { "action": "Paste and search", "severity": "hard" },
|
|
283
|
+
"ctrl+shift+m": { "action": "Switch user / guest", "severity": "hard" },
|
|
284
|
+
"ctrl+shift+n": { "action": "InPrivate window", "severity": "hard" },
|
|
285
|
+
"ctrl+shift+o": { "action": "Open favorites", "severity": "hard" },
|
|
286
|
+
"ctrl+shift+p": { "action": "Print (system dialog)", "severity": "hard" },
|
|
287
|
+
"ctrl+shift+r": { "action": "Hard reload", "severity": "hard" },
|
|
288
|
+
"ctrl+shift+t": { "action": "Reopen closed tab", "severity": "hard" },
|
|
289
|
+
"ctrl+shift+u": { "action": "Read Aloud toggle", "severity": "hard" },
|
|
290
|
+
"ctrl+shift+v": { "action": "Paste without formatting", "severity": "hard" },
|
|
291
|
+
"ctrl+shift+w": { "action": "Close window", "severity": "hard" },
|
|
292
|
+
"ctrl+shift+y": { "action": "Collections", "severity": "hard" },
|
|
293
|
+
"alt+d": { "action": "Focus address bar", "severity": "hard" },
|
|
294
|
+
"alt+e": { "action": "Settings menu", "severity": "menu-activation" },
|
|
295
|
+
"alt+f": { "action": "Settings menu (alt)", "severity": "menu-activation" },
|
|
296
|
+
"alt+shift+b": { "action": "Focus favorites bar", "severity": "hard" },
|
|
297
|
+
"alt+shift+i": { "action": "Send feedback dialog", "severity": "hard" },
|
|
298
|
+
"alt+shift+t": { "action": "Focus app bar toolbar", "severity": "hard" }
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"system": {
|
|
302
|
+
"meta+a": { "action": "Action Center", "severity": "os" },
|
|
303
|
+
"meta+c": { "action": "Windows search", "severity": "os" },
|
|
304
|
+
"meta+d": { "action": "Show desktop", "severity": "os" },
|
|
305
|
+
"meta+e": { "action": "File Explorer", "severity": "os" },
|
|
306
|
+
"meta+g": { "action": "Game bar", "severity": "os" },
|
|
307
|
+
"meta+h": { "action": "Voice dictation", "severity": "os" },
|
|
308
|
+
"meta+i": { "action": "Settings", "severity": "os" },
|
|
309
|
+
"meta+l": { "action": "Lock", "severity": "os" },
|
|
310
|
+
"meta+n": { "action": "Notification center", "severity": "os" },
|
|
311
|
+
"meta+p": { "action": "Project / display mode", "severity": "os" },
|
|
312
|
+
"meta+r": { "action": "Run dialog", "severity": "os" },
|
|
313
|
+
"meta+s": { "action": "Search", "severity": "os" },
|
|
314
|
+
"meta+v": { "action": "Clipboard history", "severity": "os" },
|
|
315
|
+
"meta+w": { "action": "Widgets", "severity": "os" },
|
|
316
|
+
"meta+x": { "action": "Quick Link menu", "severity": "os" },
|
|
317
|
+
"meta+z": { "action": "Snap layouts", "severity": "os" },
|
|
318
|
+
"meta+tab": { "action": "Task View", "severity": "os" },
|
|
319
|
+
"meta+shift+s": { "action": "Screenshot region", "severity": "os" },
|
|
320
|
+
"ctrl+shift+esc": { "action": "Task Manager", "severity": "os" },
|
|
321
|
+
"ctrl+alt+del": { "action": "Security screen", "severity": "os" },
|
|
322
|
+
"alt+tab": { "action": "Switch windows", "severity": "os" },
|
|
323
|
+
"alt+f4": { "action": "Close active window", "severity": "os" }
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
"linux": {
|
|
327
|
+
"browsers": {
|
|
328
|
+
"firefox": "$ref:platforms.windows.browsers.firefox",
|
|
329
|
+
"chrome": "$ref:platforms.windows.browsers.chrome",
|
|
330
|
+
"edge": "$ref:platforms.windows.browsers.edge"
|
|
331
|
+
},
|
|
332
|
+
"system": {
|
|
333
|
+
"$comment": "GNOME defaults. KDE and other DEs have similar-shaped reservations but vary; this is a conservative baseline.",
|
|
334
|
+
"meta+tab": { "action": "Switch windows", "severity": "os" },
|
|
335
|
+
"meta+a": { "action": "Show applications", "severity": "os" },
|
|
336
|
+
"meta+l": { "action": "Lock screen", "severity": "os" },
|
|
337
|
+
"meta+v": { "action": "Notification list", "severity": "os" },
|
|
338
|
+
"alt+tab": { "action": "Switch applications", "severity": "os" },
|
|
339
|
+
"alt+esc": { "action": "Cycle windows", "severity": "os" },
|
|
340
|
+
"alt+f2": { "action": "Run command", "severity": "os" },
|
|
341
|
+
"alt+f4": { "action": "Close window", "severity": "os" },
|
|
342
|
+
"ctrl+alt+tab": { "action": "Top-bar accessibility switcher", "severity": "os" },
|
|
343
|
+
"ctrl+alt+del": { "action": "Power-off dialog", "severity": "os" },
|
|
344
|
+
"ctrl+shift+alt+r": { "action": "Toggle screencast recording", "severity": "os" }
|
|
345
|
+
},
|
|
346
|
+
"noteForCtrlAlt": "Some Linux setups map right-Alt (AltGr) to 'compose' for typing accented characters, in which case AltGr+letter is reported as ctrl+alt+letter and types a special character. Avoid the ctrl+alt+letter namespace on Linux."
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|