@flighthq/shortcut 0.1.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.
@@ -0,0 +1,2 @@
1
+ export * from './shortcut';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './shortcut';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Accelerator, AcceleratorParseError, ParsedAccelerator, ShortcutBackend, ShortcutEvent, ShortcutModifier, ShortcutSignals } from '@flighthq/types';
2
+ export declare function areAcceleratorsEqual(a: string, b: string): boolean;
3
+ export declare function createParsedAccelerator(): ParsedAccelerator;
4
+ export declare function createWebShortcutBackend(): ShortcutBackend;
5
+ export declare function disableGlobalShortcut(accelerator: string): boolean;
6
+ export declare function enableGlobalShortcut(accelerator: string): boolean;
7
+ export declare function enableGlobalShortcutSignals(): ShortcutSignals;
8
+ export declare function formatAcceleratorForDisplay(accelerator: string, platform?: string): string;
9
+ export declare function getAcceleratorKey(accelerator: string): string | null;
10
+ export declare function getAcceleratorKeyLabel(key: string): string;
11
+ export declare function getAcceleratorModifierLabel(modifier: ShortcutModifier, platform?: string): string;
12
+ export declare function getAcceleratorModifiers(accelerator: string, out: ShortcutModifier[]): readonly ShortcutModifier[] | null;
13
+ export declare function getRegisteredGlobalShortcuts(): readonly Accelerator[];
14
+ export declare function getShortcutBackend(): ShortcutBackend;
15
+ export declare function hasGlobalShortcutConflict(accelerator: string): boolean;
16
+ export declare function isAcceleratorValid(input: string): boolean;
17
+ export declare function isGlobalShortcutRegistered(accelerator: string): boolean;
18
+ export declare function normalizeAccelerator(input: string): Accelerator | null;
19
+ export declare function parseAccelerator(input: string, out: ParsedAccelerator): ParsedAccelerator | null;
20
+ export declare function parseAcceleratorDetailed(input: string, out: ParsedAccelerator): ParsedAccelerator | AcceleratorParseError;
21
+ export declare function registerGlobalShortcut(accelerator: string, handler: (event: Readonly<ShortcutEvent>) => void): boolean;
22
+ export declare function resolveCommandOrControlModifier(platform?: string): Exclude<ShortcutModifier, 'CommandOrControl'>;
23
+ export declare function resumeAllGlobalShortcuts(): void;
24
+ export declare function setShortcutBackend(backend: ShortcutBackend | null): void;
25
+ export declare function suspendAllGlobalShortcuts(): void;
26
+ export declare function unregisterAllGlobalShortcuts(): void;
27
+ export declare function unregisterGlobalShortcut(accelerator: string): boolean;
28
+ //# sourceMappingURL=shortcut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcut.d.ts","sourceRoot":"","sources":["../src/shortcut.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAIzB,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKlE;AAGD,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D;AAKD,wBAAgB,wBAAwB,IAAI,eAAe,CAwB1D;AAID,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAIlE;AAGD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAIjE;AAMD,wBAAgB,2BAA2B,IAAI,eAAe,CAI7D;AAOD,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1F;AAGD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAID,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAKD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG;AAID,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,gBAAgB,EAAE,GACtB,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAMpC;AAMD,wBAAgB,4BAA4B,IAAI,SAAS,WAAW,EAAE,CAQrE;AAGD,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAID,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAItE;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAIvE;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAItE;AAKD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CAMhG;AAKD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,iBAAiB,GACrB,iBAAiB,GAAG,qBAAqB,CAM3C;AAKD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,IAAI,GAChD,OAAO,CAQT;AAKD,wBAAgB,+BAA+B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAEhH;AAGD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAGD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI,CAExE;AAID,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAGD,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAID,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAIrE"}
@@ -0,0 +1,535 @@
1
+ import { createSignal, emitSignal } from '@flighthq/signals';
2
+ // True when two accelerator strings (in any accepted spelling) represent the same chord.
3
+ // Returns false when either is unparseable.
4
+ export function areAcceleratorsEqual(a, b) {
5
+ const na = normalizeAccelerator(a);
6
+ const nb = normalizeAccelerator(b);
7
+ if (na === null || nb === null)
8
+ return false;
9
+ return na === nb;
10
+ }
11
+ // Allocates a zeroed ParsedAccelerator for use as an `out` argument to parseAccelerator.
12
+ export function createParsedAccelerator() {
13
+ return { key: '', modifiers: [] };
14
+ }
15
+ // Builds the default web backend. Web pages cannot register OS-level global hotkeys; every
16
+ // operation returns a sentinel — register / unregister / isRegistered / setEnabled are false,
17
+ // getRegistered returns [], and unregisterAll / setAllEnabled are no-ops.
18
+ export function createWebShortcutBackend() {
19
+ return {
20
+ getRegistered() {
21
+ return _emptyList;
22
+ },
23
+ isRegistered() {
24
+ return false;
25
+ },
26
+ register() {
27
+ return false;
28
+ },
29
+ setAllEnabled() {
30
+ // No-op: web has no global-hotkey registry.
31
+ },
32
+ setEnabled() {
33
+ return false;
34
+ },
35
+ unregister() {
36
+ return false;
37
+ },
38
+ unregisterAll() {
39
+ // No-op: web has no global-hotkey registry to clear.
40
+ },
41
+ };
42
+ }
43
+ // Disables a registered global shortcut without unregistering it; the handler is preserved and
44
+ // can be re-enabled later. Returns false when not registered or unsupported.
45
+ export function disableGlobalShortcut(accelerator) {
46
+ const normalized = normalizeAccelerator(accelerator);
47
+ if (normalized === null)
48
+ return false;
49
+ return getShortcutBackend().setEnabled(normalized, false);
50
+ }
51
+ // Re-enables a previously disabled global shortcut. Returns false when not registered or unsupported.
52
+ export function enableGlobalShortcut(accelerator) {
53
+ const normalized = normalizeAccelerator(accelerator);
54
+ if (normalized === null)
55
+ return false;
56
+ return getShortcutBackend().setEnabled(normalized, true);
57
+ }
58
+ // Opts in to the global shortcut signal group. Returns a ShortcutSignals object (stable — the same
59
+ // object is returned on repeated calls). The `onTrigger` signal is fired for every global shortcut
60
+ // trigger, with the ShortcutEvent payload. Requires a prior call to registerGlobalShortcut to fire.
61
+ // Handlers registered with registerGlobalShortcut are always called first; the signal fires after.
62
+ export function enableGlobalShortcutSignals() {
63
+ if (_signals !== null)
64
+ return _signals;
65
+ _signals = { onTrigger: createSignal() };
66
+ return _signals;
67
+ }
68
+ // Formats an accelerator string for human-readable display per the current OS:
69
+ // macOS: ⌘⇧K (symbols, no separator)
70
+ // Windows/Linux: Ctrl+Shift+K (text labels, '+' separator)
71
+ // Returns '' when `accelerator` is unparseable.
72
+ // Pass `platform` to override OS detection (e.g. 'macos', 'windows', 'linux') for testability.
73
+ export function formatAcceleratorForDisplay(accelerator, platform) {
74
+ const result = _parse(accelerator);
75
+ if (result === null)
76
+ return '';
77
+ const isMac = _isMacOS(platform);
78
+ const parts = [];
79
+ for (const mod of result.modifiers) {
80
+ const resolved = mod === 'CommandOrControl' ? resolveCommandOrControlModifier(platform) : mod;
81
+ parts.push(_getModifierLabel(resolved, isMac));
82
+ }
83
+ parts.push(getAcceleratorKeyLabel(result.key));
84
+ return isMac ? parts.join('') : parts.join('+');
85
+ }
86
+ // Returns the canonical key token from a parsed or normalized accelerator, or null when unparseable.
87
+ export function getAcceleratorKey(accelerator) {
88
+ const result = _parse(accelerator);
89
+ return result === null ? null : result.key;
90
+ }
91
+ // Renders a key name label for display in menus and tooltips (e.g. 'ArrowUp' → '↑', 'Return' → '↵').
92
+ // Returns the key as-is when no special display name is registered.
93
+ export function getAcceleratorKeyLabel(key) {
94
+ return _keyDisplayNames.get(key) ?? key;
95
+ }
96
+ // Renders a modifier key label for the current OS (e.g. 'Meta' → '⌘' on macOS, 'Win' on Windows).
97
+ // 'CommandOrControl' is resolved before formatting. Returns '' for unrecognized modifiers.
98
+ // Pass `platform` to override OS detection (e.g. 'macos', 'windows', 'linux') for testability.
99
+ export function getAcceleratorModifierLabel(modifier, platform) {
100
+ const resolved = modifier === 'CommandOrControl' ? resolveCommandOrControlModifier(platform) : modifier;
101
+ return _getModifierLabel(resolved, _isMacOS(platform));
102
+ }
103
+ // Returns the modifier list from a parsed or normalized accelerator, or null when unparseable.
104
+ // Writes into `out` (must be an array). `out` is cleared and filled in place.
105
+ export function getAcceleratorModifiers(accelerator, out) {
106
+ const result = _parse(accelerator);
107
+ if (result === null)
108
+ return null;
109
+ out.length = 0;
110
+ for (const m of result.modifiers)
111
+ out.push(m);
112
+ return out;
113
+ }
114
+ // Returns all currently registered accelerators in normalized form. Empty on the web backend.
115
+ // The backend's registry is re-normalized rather than trusted: a native backend may populate the
116
+ // registry with non-normalized strings, so each entry is parsed and any that fail to parse are dropped
117
+ // — the Accelerator type is earned, not asserted.
118
+ export function getRegisteredGlobalShortcuts() {
119
+ const raw = getShortcutBackend().getRegistered();
120
+ const result = [];
121
+ for (const entry of raw) {
122
+ const normalized = normalizeAccelerator(entry);
123
+ if (normalized !== null)
124
+ result.push(normalized);
125
+ }
126
+ return result;
127
+ }
128
+ // The active shortcut backend, or a lazily-created web default. There is always a backend.
129
+ export function getShortcutBackend() {
130
+ if (_backend === null)
131
+ _backend = createWebShortcutBackend();
132
+ return _backend;
133
+ }
134
+ // True when the (normalized) chord is already registered. A conflict probe over isGlobalShortcutRegistered.
135
+ // Returns false when `accelerator` is unparseable.
136
+ export function hasGlobalShortcutConflict(accelerator) {
137
+ const normalized = normalizeAccelerator(accelerator);
138
+ if (normalized === null)
139
+ return false;
140
+ return isGlobalShortcutRegistered(normalized);
141
+ }
142
+ // True when `input` is a parseable accelerator (valid modifiers + recognized key).
143
+ // Callers can use this to distinguish a malformed accelerator from an unsupported one before
144
+ // attempting to register.
145
+ export function isAcceleratorValid(input) {
146
+ return _parse(input) !== null;
147
+ }
148
+ // True when the accelerator is currently registered. Returns false on web (no global hotkeys).
149
+ // Input is normalized before the query so any accepted spelling matches.
150
+ export function isGlobalShortcutRegistered(accelerator) {
151
+ const normalized = normalizeAccelerator(accelerator);
152
+ if (normalized === null)
153
+ return false;
154
+ return getShortcutBackend().isRegistered(normalized);
155
+ }
156
+ // Returns the canonical normalized form of `input` (fixed modifier order, canonical key name), or
157
+ // null when unparseable. Two normalized strings that compare === represent the same chord.
158
+ // Accepted spellings: Ctrl/Control, Cmd/Command/Meta, Alt/Option, Win/Super, Shift; separators + or -.
159
+ export function normalizeAccelerator(input) {
160
+ const result = _parse(input);
161
+ if (result === null)
162
+ return null;
163
+ return _formatNormalized(result);
164
+ }
165
+ // Parses `input` into modifiers + key and writes into `out`. Returns `out` on success, null on
166
+ // malformed input. Case- and separator-insensitive; alias modifiers (Cmd → Meta, Ctrl → Control,
167
+ // Option → Alt, Win → Super) are resolved. Use createParsedAccelerator() to allocate the `out`.
168
+ export function parseAccelerator(input, out) {
169
+ const result = _parse(input);
170
+ if (result === null)
171
+ return null;
172
+ out.key = result.key;
173
+ out.modifiers = result.modifiers.slice();
174
+ return out;
175
+ }
176
+ // Like parseAccelerator but returns an AcceleratorParseError describing why parsing failed instead
177
+ // of null. The common path (parse + ignore error) should use parseAccelerator; this is for
178
+ // diagnostics and validation UIs.
179
+ export function parseAcceleratorDetailed(input, out) {
180
+ const result = _parseDetailed(input);
181
+ if ('reason' in result)
182
+ return result;
183
+ out.key = result.key;
184
+ out.modifiers = result.modifiers.slice();
185
+ return out;
186
+ }
187
+ // Registers a global hotkey. Returns false when the host lacks global-hotkey support (e.g. web).
188
+ // Input is normalized before registration so any accepted spelling maps to the same registry slot.
189
+ // When enableGlobalShortcutSignals() has been called, the onTrigger signal fires after the handler.
190
+ export function registerGlobalShortcut(accelerator, handler) {
191
+ const normalized = normalizeAccelerator(accelerator);
192
+ if (normalized === null)
193
+ return false;
194
+ const wrappedHandler = (event) => {
195
+ handler(event);
196
+ if (_signals !== null)
197
+ emitSignal(_signals.onTrigger, event);
198
+ };
199
+ return getShortcutBackend().register(normalized, wrappedHandler);
200
+ }
201
+ // Resolves 'CommandOrControl' to 'Meta' on macOS and 'Control' on Windows/Linux.
202
+ // Reads the platform directly via navigator.platform to avoid depending on @flighthq/platform.
203
+ // Pass `platform` to override OS detection (e.g. 'macos', 'windows', 'linux') for testability.
204
+ export function resolveCommandOrControlModifier(platform) {
205
+ return _isMacOS(platform) ? 'Meta' : 'Control';
206
+ }
207
+ // Resumes all global shortcuts after suspendAllGlobalShortcuts(). No-op on unsupported hosts.
208
+ export function resumeAllGlobalShortcuts() {
209
+ getShortcutBackend().setAllEnabled(true);
210
+ }
211
+ // Installs a native host shortcut backend; pass null to fall back to the web default.
212
+ export function setShortcutBackend(backend) {
213
+ _backend = backend;
214
+ }
215
+ // Temporarily silences all registered global shortcuts without unregistering them — useful when a
216
+ // modal or text field has focus. Resume with resumeAllGlobalShortcuts(). No-op on unsupported hosts.
217
+ export function suspendAllGlobalShortcuts() {
218
+ getShortcutBackend().setAllEnabled(false);
219
+ }
220
+ // Unregisters every global hotkey. No-op when the host lacks global-hotkey support.
221
+ export function unregisterAllGlobalShortcuts() {
222
+ getShortcutBackend().unregisterAll();
223
+ }
224
+ // Unregisters a global hotkey. Returns false when not registered or unsupported (e.g. web).
225
+ // Input is normalized before the lookup.
226
+ export function unregisterGlobalShortcut(accelerator) {
227
+ const normalized = normalizeAccelerator(accelerator);
228
+ if (normalized === null)
229
+ return false;
230
+ return getShortcutBackend().unregister(normalized);
231
+ }
232
+ let _backend = null;
233
+ let _signals = null;
234
+ const _emptyList = [];
235
+ // Canonical modifier order used in normalized form: Control < Alt < Shift < Meta < Super < CommandOrControl.
236
+ // CommandOrControl carries its own ordinal (last) so any chord — including one mixing Control and
237
+ // CommandOrControl — has a single, input-independent normalized order.
238
+ const _modifierOrder = ['Control', 'Alt', 'Shift', 'Meta', 'Super', 'CommandOrControl'];
239
+ // Alias map: lowercase alias → canonical ShortcutModifier.
240
+ const _modifierAliases = new Map([
241
+ ['alt', 'Alt'],
242
+ ['cmd', 'Meta'],
243
+ ['command', 'Meta'],
244
+ ['commandorcontrol', 'CommandOrControl'],
245
+ ['control', 'Control'],
246
+ ['ctrl', 'Control'],
247
+ ['meta', 'Meta'],
248
+ ['option', 'Alt'],
249
+ ['shift', 'Shift'],
250
+ ['super', 'Super'],
251
+ ['win', 'Super'],
252
+ ]);
253
+ // Alias map: lowercase alias → canonical ShortcutKeyName (and other accepted key names).
254
+ const _keyAliases = new Map([
255
+ // Letters (uppercase canonical form)
256
+ ['a', 'A'],
257
+ ['b', 'B'],
258
+ ['c', 'C'],
259
+ ['d', 'D'],
260
+ ['e', 'E'],
261
+ ['f', 'F'],
262
+ ['g', 'G'],
263
+ ['h', 'H'],
264
+ ['i', 'I'],
265
+ ['j', 'J'],
266
+ ['k', 'K'],
267
+ ['l', 'L'],
268
+ ['m', 'M'],
269
+ ['n', 'N'],
270
+ ['o', 'O'],
271
+ ['p', 'P'],
272
+ ['q', 'Q'],
273
+ ['r', 'R'],
274
+ ['s', 'S'],
275
+ ['t', 'T'],
276
+ ['u', 'U'],
277
+ ['v', 'V'],
278
+ ['w', 'W'],
279
+ ['x', 'X'],
280
+ ['y', 'Y'],
281
+ ['z', 'Z'],
282
+ // Digits
283
+ ['0', '0'],
284
+ ['1', '1'],
285
+ ['2', '2'],
286
+ ['3', '3'],
287
+ ['4', '4'],
288
+ ['5', '5'],
289
+ ['6', '6'],
290
+ ['7', '7'],
291
+ ['8', '8'],
292
+ ['9', '9'],
293
+ // Function keys
294
+ ['f1', 'F1'],
295
+ ['f2', 'F2'],
296
+ ['f3', 'F3'],
297
+ ['f4', 'F4'],
298
+ ['f5', 'F5'],
299
+ ['f6', 'F6'],
300
+ ['f7', 'F7'],
301
+ ['f8', 'F8'],
302
+ ['f9', 'F9'],
303
+ ['f10', 'F10'],
304
+ ['f11', 'F11'],
305
+ ['f12', 'F12'],
306
+ ['f13', 'F13'],
307
+ ['f14', 'F14'],
308
+ ['f15', 'F15'],
309
+ ['f16', 'F16'],
310
+ ['f17', 'F17'],
311
+ ['f18', 'F18'],
312
+ ['f19', 'F19'],
313
+ ['f20', 'F20'],
314
+ ['f21', 'F21'],
315
+ ['f22', 'F22'],
316
+ ['f23', 'F23'],
317
+ ['f24', 'F24'],
318
+ // Arrows
319
+ ['arrowdown', 'ArrowDown'],
320
+ ['arrowleft', 'ArrowLeft'],
321
+ ['arrowright', 'ArrowRight'],
322
+ ['arrowup', 'ArrowUp'],
323
+ ['down', 'ArrowDown'],
324
+ ['left', 'ArrowLeft'],
325
+ ['right', 'ArrowRight'],
326
+ ['up', 'ArrowUp'],
327
+ // Navigation
328
+ ['end', 'End'],
329
+ ['home', 'Home'],
330
+ ['pagedown', 'PageDown'],
331
+ ['pageup', 'PageUp'],
332
+ ['pgdn', 'PageDown'],
333
+ ['pgup', 'PageUp'],
334
+ // Editing
335
+ ['backspace', 'Backspace'],
336
+ ['delete', 'Delete'],
337
+ ['del', 'Delete'],
338
+ ['escape', 'Escape'],
339
+ ['esc', 'Escape'],
340
+ ['enter', 'Return'],
341
+ ['return', 'Return'],
342
+ ['insert', 'Insert'],
343
+ ['ins', 'Insert'],
344
+ ['space', 'Space'],
345
+ ['spacebar', 'Space'],
346
+ [' ', 'Space'],
347
+ ['tab', 'Tab'],
348
+ // Numpad
349
+ ['num0', 'Numpad0'],
350
+ ['num1', 'Numpad1'],
351
+ ['num2', 'Numpad2'],
352
+ ['num3', 'Numpad3'],
353
+ ['num4', 'Numpad4'],
354
+ ['num5', 'Numpad5'],
355
+ ['num6', 'Numpad6'],
356
+ ['num7', 'Numpad7'],
357
+ ['num8', 'Numpad8'],
358
+ ['num9', 'Numpad9'],
359
+ ['numpad0', 'Numpad0'],
360
+ ['numpad1', 'Numpad1'],
361
+ ['numpad2', 'Numpad2'],
362
+ ['numpad3', 'Numpad3'],
363
+ ['numpad4', 'Numpad4'],
364
+ ['numpad5', 'Numpad5'],
365
+ ['numpad6', 'Numpad6'],
366
+ ['numpad7', 'Numpad7'],
367
+ ['numpad8', 'Numpad8'],
368
+ ['numpad9', 'Numpad9'],
369
+ ['numpadadd', 'NumpadAdd'],
370
+ ['numpaddecimal', 'NumpadDecimal'],
371
+ ['numpaddivide', 'NumpadDivide'],
372
+ ['numpadenter', 'NumpadEnter'],
373
+ ['numpadmultiply', 'NumpadMultiply'],
374
+ ['numpadsubtract', 'NumpadSubtract'],
375
+ // Punctuation / symbols
376
+ ["'", 'Quote'],
377
+ [',', 'Comma'],
378
+ ['-', 'Minus'],
379
+ ['.', 'Period'],
380
+ ['/', 'Slash'],
381
+ [';', 'Semicolon'],
382
+ ['=', 'Equal'],
383
+ ['[', 'BracketLeft'],
384
+ ['\\', 'Backslash'],
385
+ [']', 'BracketRight'],
386
+ ['`', 'Backquote'],
387
+ ['backquote', 'Backquote'],
388
+ ['backslash', 'Backslash'],
389
+ ['bracketleft', 'BracketLeft'],
390
+ ['bracketright', 'BracketRight'],
391
+ ['comma', 'Comma'],
392
+ ['equal', 'Equal'],
393
+ ['minus', 'Minus'],
394
+ ['period', 'Period'],
395
+ ['plus', 'Plus'],
396
+ ['quote', 'Quote'],
397
+ ['semicolon', 'Semicolon'],
398
+ ['slash', 'Slash'],
399
+ // Note: '+' as a key name is mapped via 'plus'; bare '+' is the separator so it is filtered out.
400
+ // Media
401
+ ['medianexttrack', 'MediaNextTrack'],
402
+ ['mediaplaypause', 'MediaPlayPause'],
403
+ ['mediaprevioustrack', 'MediaPreviousTrack'],
404
+ ['mediastop', 'MediaStop'],
405
+ ['volumedown', 'VolumeDown'],
406
+ ['volumemute', 'VolumeMute'],
407
+ ['volumeup', 'VolumeUp'],
408
+ // Lock / utility
409
+ ['capslock', 'CapsLock'],
410
+ ['numlock', 'NumLock'],
411
+ ['print', 'PrintScreen'],
412
+ ['printscreen', 'PrintScreen'],
413
+ ['scrolllock', 'ScrollLock'],
414
+ ]);
415
+ // Human-readable display names for special keys; absent entries use the key name itself.
416
+ const _keyDisplayNames = new Map([
417
+ ['ArrowDown', '↓'],
418
+ ['ArrowLeft', '←'],
419
+ ['ArrowRight', '→'],
420
+ ['ArrowUp', '↑'],
421
+ ['Backspace', '⌫'],
422
+ ['CapsLock', '⇪'],
423
+ ['Delete', '⌦'],
424
+ ['End', 'End'],
425
+ ['Escape', 'Esc'],
426
+ ['Home', 'Home'],
427
+ ['Insert', 'Ins'],
428
+ ['MediaNextTrack', '⏭'],
429
+ ['MediaPlayPause', '⏯'],
430
+ ['MediaPreviousTrack', '⏮'],
431
+ ['MediaStop', '⏹'],
432
+ ['NumLock', 'NumLk'],
433
+ ['PageDown', 'PgDn'],
434
+ ['PageUp', 'PgUp'],
435
+ ['PrintScreen', 'PrtSc'],
436
+ ['Return', '↵'],
437
+ ['ScrollLock', 'ScrLk'],
438
+ ['Space', 'Space'],
439
+ ['Tab', '⇥'],
440
+ ['VolumeDown', '🔉'],
441
+ ['VolumeMute', '🔇'],
442
+ ['VolumeUp', '🔊'],
443
+ ]);
444
+ // Returns the platform-specific label string for an already-resolved (non-CommandOrControl) modifier.
445
+ // Internal: callers must resolve CommandOrControl before calling this.
446
+ function _getModifierLabel(resolved, isMac) {
447
+ switch (resolved) {
448
+ case 'Alt':
449
+ return isMac ? '⌥' : 'Alt';
450
+ case 'Control':
451
+ return isMac ? '⌃' : 'Ctrl';
452
+ case 'Meta':
453
+ return isMac ? '⌘' : 'Win';
454
+ case 'Shift':
455
+ return isMac ? '⇧' : 'Shift';
456
+ case 'Super':
457
+ return isMac ? '⌘' : 'Super';
458
+ default:
459
+ return '';
460
+ }
461
+ }
462
+ // Returns true when running on macOS.
463
+ // Accepts an optional `platform` override (e.g. 'macos', 'windows', 'linux') for testability.
464
+ // Falls back to navigator.platform heuristic. Lightweight — avoids importing @flighthq/platform.
465
+ function _isMacOS(platform) {
466
+ if (platform !== undefined)
467
+ return /^mac/i.test(platform);
468
+ if (typeof navigator === 'undefined')
469
+ return false;
470
+ const p = navigator.platform ?? '';
471
+ return /mac/i.test(p);
472
+ }
473
+ // Core parser. Returns a _Parsed on success or null on failure.
474
+ function _parse(input) {
475
+ const result = _parseDetailed(input);
476
+ if ('reason' in result)
477
+ return null;
478
+ return result;
479
+ }
480
+ // Core parser with error diagnostics.
481
+ function _parseDetailed(input) {
482
+ if (!input || input.trim().length === 0) {
483
+ return { reason: 'empty', token: '' };
484
+ }
485
+ const tokens = _splitTokens(input.trim());
486
+ if (tokens.length === 0) {
487
+ return { reason: 'empty', token: '' };
488
+ }
489
+ const modifiers = [];
490
+ const seenModifiers = new Set();
491
+ let key = null;
492
+ // Process all tokens: if a token is a known modifier alias, treat it as a modifier.
493
+ // The last non-modifier token is the key; if all tokens are modifiers, it is missing-key.
494
+ for (const token of tokens) {
495
+ const lower = token.toLowerCase();
496
+ const mod = _modifierAliases.get(lower);
497
+ if (mod !== undefined) {
498
+ if (seenModifiers.has(mod)) {
499
+ return { reason: 'duplicate-modifier', token };
500
+ }
501
+ seenModifiers.add(mod);
502
+ modifiers.push(mod);
503
+ }
504
+ else {
505
+ // Could be the key. If we already have a key, the earlier one was an unknown modifier token.
506
+ if (key !== null) {
507
+ return { reason: 'unknown-modifier', token: key };
508
+ }
509
+ key = token;
510
+ }
511
+ }
512
+ if (key === null) {
513
+ return { reason: 'missing-key', token: '' };
514
+ }
515
+ const canonicalKey = _keyAliases.get(key.toLowerCase());
516
+ if (canonicalKey === undefined) {
517
+ return { reason: 'unknown-key', token: key };
518
+ }
519
+ // Sort modifiers in canonical order (Control < Alt < Shift < Meta < Super < CommandOrControl).
520
+ // CommandOrControl has its own ordinal so a chord containing both Control and CommandOrControl
521
+ // sorts deterministically instead of tying on a shared index.
522
+ modifiers.sort((a, b) => _modifierOrder.indexOf(a) - _modifierOrder.indexOf(b));
523
+ return { key: canonicalKey, modifiers };
524
+ }
525
+ // Splits input into tokens using '+' or '-' as separator. Filters out empty tokens from split.
526
+ function _splitTokens(input) {
527
+ return input.split(/[+-]/).filter((t) => t.length > 0);
528
+ }
529
+ // Builds the normalized Accelerator string from a _Parsed result.
530
+ function _formatNormalized(parsed) {
531
+ if (parsed.modifiers.length === 0)
532
+ return parsed.key;
533
+ return [...parsed.modifiers, parsed.key].join('+');
534
+ }
535
+ //# sourceMappingURL=shortcut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcut.js","sourceRoot":"","sources":["../src/shortcut.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@flighthq/shortcut",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "src/**/*.test.ts",
16
+ "!dist/**/*.test.js",
17
+ "!dist/**/*.test.d.ts",
18
+ "!dist/**/*.test.js.map",
19
+ "!dist/**/*.test.d.ts.map"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc -b",
23
+ "clean": "tsc -b --clean",
24
+ "test": "vitest run --config vitest.config.ts",
25
+ "test:watch": "vitest --watch --config vitest.config.ts",
26
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
27
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
28
+ },
29
+ "dependencies": {
30
+ "@flighthq/signals": "0.1.0",
31
+ "@flighthq/types": "0.1.0"
32
+ },
33
+ "devDependencies": {
34
+ "typescript": "^5.3.0"
35
+ },
36
+ "description": "Global OS hotkey registration over a swappable web/native backend",
37
+ "sideEffects": false
38
+ }