@tooee/commands 0.1.19 → 0.1.20
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/dist/context.d.ts +25 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +157 -22
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/context.tsx +234 -22
- package/src/index.ts +6 -1
- package/src/types.ts +34 -0
package/dist/context.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
|
-
import type { Command, CommandContext, CommandGroup, CommandRegistry, CommandSequenceState, RegisteredCommandGroup } from "./types.js";
|
|
2
|
+
import type { ActiveCommandSurface, Command, CommandContext, CommandGroup, CommandRegistry, CommandSequenceState, CommandSurfaceRole, RegisteredCommandGroup } from "./types.js";
|
|
3
3
|
import type { Mode } from "./mode.js";
|
|
4
4
|
type ContextGetter = () => Partial<CommandContext>;
|
|
5
5
|
interface CommandContextValue {
|
|
@@ -17,12 +17,36 @@ export interface CommandProviderProps {
|
|
|
17
17
|
sequenceTimeoutMs?: number;
|
|
18
18
|
}
|
|
19
19
|
export declare function CommandProvider({ children, leader, keymap, initialMode, sequenceTimeoutMs, }: CommandProviderProps): ReactNode;
|
|
20
|
+
export interface CommandSurfaceProviderProps {
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
/** Stable id for the surface (typically the overlay id). */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Interaction role (default "modal"). */
|
|
25
|
+
role?: CommandSurfaceRole;
|
|
26
|
+
/** Initial local mode for this surface (default "cursor"). */
|
|
27
|
+
initialMode?: Mode;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Mounts an overlay-owned command surface. Children registered via `useCommand`
|
|
31
|
+
* target this surface's local registry, and `useMode`/`useSetMode` read/write
|
|
32
|
+
* this surface's local mode instead of the root app's mode.
|
|
33
|
+
*
|
|
34
|
+
* While a `modal` surface is topmost it owns keyboard input and suspends the
|
|
35
|
+
* parent app's commands; a `passive` surface never becomes the keyboard owner.
|
|
36
|
+
*/
|
|
37
|
+
export declare function CommandSurfaceProvider({ children, id, role, initialMode, }: CommandSurfaceProviderProps): ReactNode;
|
|
20
38
|
export declare function useCommandContext(): {
|
|
21
39
|
commands: Command[];
|
|
22
40
|
invoke: (id: string) => void;
|
|
23
41
|
};
|
|
24
42
|
export declare function useCommandRegistry(): CommandContextValue;
|
|
25
43
|
export declare function useCommandSequenceState(): CommandSequenceState | null;
|
|
44
|
+
/**
|
|
45
|
+
* Metadata for the topmost modal command surface, or null when the root app is
|
|
46
|
+
* the active surface. Intended for which-key/help to read shortcuts from the
|
|
47
|
+
* active interaction surface.
|
|
48
|
+
*/
|
|
49
|
+
export declare function useActiveCommandSurface(): ActiveCommandSurface | null;
|
|
26
50
|
export declare function useCommandGroup(group: CommandGroup): void;
|
|
27
51
|
export declare function useProvideCommandContext(getter: () => Partial<CommandContext>): void;
|
|
28
52
|
export {};
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,YAAY,EACZ,eAAe,EACf,oBAAoB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,eAAe,EACf,oBAAoB,EAEpB,kBAAkB,EAGlB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAQrC,KAAK,aAAa,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAA;AAElD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC1C,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;CAC5C;AAWD,QAAA,MAAM,cAAc,qDAAkD,CAAA;AA+BtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,EACX,iBAAiB,GAClB,EAAE,oBAAoB,aAQtB;AAqOD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAA;IACnB,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAA;IACV,0CAA0C;IAC1C,IAAI,CAAC,EAAE,kBAAkB,CAAA;IACzB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,IAAI,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,EAAE,EACF,IAAc,EACd,WAAsB,GACvB,EAAE,2BAA2B,aAQ7B;AAmFD,wBAAgB,iBAAiB,IAAI;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,CAazF;AAED,wBAAgB,kBAAkB,IAAI,mBAAmB,CAMxD;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,IAAI,CAErE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,IAAI,CAGrE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA8BzD;AAkBD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAuBpF"}
|
package/dist/context.js
CHANGED
|
@@ -8,6 +8,33 @@ import { SequenceTracker } from "./sequence.js";
|
|
|
8
8
|
const DEFAULT_MODES = ["cursor"];
|
|
9
9
|
const CommandContext = createContext(null);
|
|
10
10
|
const CommandSequenceContext = createContext(null);
|
|
11
|
+
const CommandSurfaceStackContext = createContext(null);
|
|
12
|
+
/** Nesting depth of the nearest command surface (0 at the root app). */
|
|
13
|
+
const CommandSurfaceDepthContext = createContext(0);
|
|
14
|
+
/**
|
|
15
|
+
* Build a command registry whose `invoke` resolves the command context lazily
|
|
16
|
+
* via `getCtx`, so a surface always dispatches with its own (local) mode and
|
|
17
|
+
* the current shared context sources.
|
|
18
|
+
*/
|
|
19
|
+
function createRegistry(getCtx) {
|
|
20
|
+
const commands = new Map();
|
|
21
|
+
return {
|
|
22
|
+
commands,
|
|
23
|
+
register(command) {
|
|
24
|
+
commands.set(command.id, command);
|
|
25
|
+
return () => {
|
|
26
|
+
commands.delete(command.id);
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
invoke(id) {
|
|
30
|
+
const ctx = getCtx();
|
|
31
|
+
const cmd = commands.get(id);
|
|
32
|
+
if (cmd && (!cmd.when || cmd.when(ctx))) {
|
|
33
|
+
cmd.handler(ctx);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
11
38
|
export function CommandProvider({ children, leader, keymap, initialMode, sequenceTimeoutMs, }) {
|
|
12
39
|
return (_jsx(ModeProvider, { initialMode: initialMode, children: _jsx(CommandDispatcher, { leader: leader, keymap: keymap, sequenceTimeoutMs: sequenceTimeoutMs, children: children }) }));
|
|
13
40
|
}
|
|
@@ -37,25 +64,47 @@ function CommandDispatcher({ children, leader, keymap, sequenceTimeoutMs, }) {
|
|
|
37
64
|
}
|
|
38
65
|
return ctx;
|
|
39
66
|
}, [setMode]);
|
|
67
|
+
const buildCtxRef = useRef(buildCtx);
|
|
68
|
+
buildCtxRef.current = buildCtx;
|
|
40
69
|
if (registryRef.current === null) {
|
|
41
|
-
|
|
42
|
-
registryRef.current = {
|
|
43
|
-
commands,
|
|
44
|
-
register(command) {
|
|
45
|
-
commands.set(command.id, command);
|
|
46
|
-
return () => {
|
|
47
|
-
commands.delete(command.id);
|
|
48
|
-
};
|
|
49
|
-
},
|
|
50
|
-
invoke(id) {
|
|
51
|
-
const ctx = buildCtx();
|
|
52
|
-
const cmd = commands.get(id);
|
|
53
|
-
if (cmd && (!cmd.when || cmd.when(ctx))) {
|
|
54
|
-
cmd.handler(ctx);
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
};
|
|
70
|
+
registryRef.current = createRegistry(() => buildCtxRef.current());
|
|
58
71
|
}
|
|
72
|
+
// --- Command surface stack ----------------------------------------------
|
|
73
|
+
// The root registry above is the implicit base surface. Modal overlays push
|
|
74
|
+
// surfaces on top of it; while a modal surface is topmost, key dispatch is
|
|
75
|
+
// arbitrated to that surface only and the root (and lower surfaces) are
|
|
76
|
+
// suspended — even for keys the surface does not handle.
|
|
77
|
+
const surfaceEntriesRef = useRef([]);
|
|
78
|
+
const surfaceOrderRef = useRef(0);
|
|
79
|
+
const [surfaceVersion, setSurfaceVersion] = useState(0);
|
|
80
|
+
const registerSurface = useCallback((entry) => {
|
|
81
|
+
entry.order = surfaceOrderRef.current++;
|
|
82
|
+
surfaceEntriesRef.current = [...surfaceEntriesRef.current, entry];
|
|
83
|
+
setSurfaceVersion((v) => v + 1);
|
|
84
|
+
return () => {
|
|
85
|
+
surfaceEntriesRef.current = surfaceEntriesRef.current.filter((e) => e !== entry);
|
|
86
|
+
setSurfaceVersion((v) => v + 1);
|
|
87
|
+
};
|
|
88
|
+
}, []);
|
|
89
|
+
const getActiveModalSurface = useCallback(() => {
|
|
90
|
+
let best = null;
|
|
91
|
+
for (const entry of surfaceEntriesRef.current) {
|
|
92
|
+
if (entry.role !== "modal")
|
|
93
|
+
continue;
|
|
94
|
+
if (best === null ||
|
|
95
|
+
entry.depth > best.depth ||
|
|
96
|
+
(entry.depth === best.depth && entry.order > best.order)) {
|
|
97
|
+
best = entry;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return best;
|
|
101
|
+
}, []);
|
|
102
|
+
const activeModalSurface = useMemo(() => {
|
|
103
|
+
const surface = getActiveModalSurface();
|
|
104
|
+
return surface ? { id: surface.id, role: surface.role } : null;
|
|
105
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
106
|
+
}, [getActiveModalSurface, surfaceVersion]);
|
|
107
|
+
const surfaceStackValue = useMemo(() => ({ register: registerSurface, getActiveModalSurface, activeModalSurface }), [registerSurface, getActiveModalSurface, activeModalSurface]);
|
|
59
108
|
const trackerRef = useRef(new SequenceTracker({
|
|
60
109
|
timeout: sequenceTimeoutMs,
|
|
61
110
|
onReset: () => clearSequenceStateRef.current(),
|
|
@@ -74,11 +123,14 @@ function CommandDispatcher({ children, leader, keymap, sequenceTimeoutMs, }) {
|
|
|
74
123
|
useKeyboard((event) => {
|
|
75
124
|
if (event.defaultPrevented)
|
|
76
125
|
return;
|
|
77
|
-
const
|
|
78
|
-
if (!
|
|
126
|
+
const rootRegistry = registryRef.current;
|
|
127
|
+
if (!rootRegistry)
|
|
79
128
|
return;
|
|
80
|
-
|
|
81
|
-
const
|
|
129
|
+
// Arbitration: a topmost modal surface owns input; otherwise the root app.
|
|
130
|
+
const activeSurface = getActiveModalSurface();
|
|
131
|
+
const registry = activeSurface ? activeSurface.registry : rootRegistry;
|
|
132
|
+
const currentMode = activeSurface ? activeSurface.getMode() : modeRef.current;
|
|
133
|
+
const ctx = activeSurface ? activeSurface.buildCtx() : buildCtx();
|
|
82
134
|
// Collect eligible commands with their parsed hotkeys
|
|
83
135
|
const singleStepCandidates = [];
|
|
84
136
|
const multiStepCandidates = [];
|
|
@@ -139,18 +191,92 @@ function CommandDispatcher({ children, leader, keymap, sequenceTimeoutMs, }) {
|
|
|
139
191
|
return;
|
|
140
192
|
}
|
|
141
193
|
}
|
|
194
|
+
// A modal surface swallows unhandled keys: dispatch never falls through to
|
|
195
|
+
// the root app while a modal surface is topmost.
|
|
142
196
|
});
|
|
143
197
|
useEffect(() => {
|
|
144
198
|
trackerRef.current.reset();
|
|
145
199
|
setSequenceState(null);
|
|
146
200
|
}, [mode]);
|
|
201
|
+
// Reset any in-flight sequence when keyboard ownership changes (e.g. a modal
|
|
202
|
+
// surface opens/closes) so partial chords don't leak across surfaces. Passive
|
|
203
|
+
// surfaces such as which-key must not clear the sequence they are displaying.
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
trackerRef.current.reset();
|
|
206
|
+
setSequenceState(null);
|
|
207
|
+
}, [activeModalSurface?.id]);
|
|
147
208
|
const ctxValue = useMemo(() => ({
|
|
148
209
|
registry: registryRef.current,
|
|
149
210
|
leaderKey: leader,
|
|
150
211
|
contextSources: contextSourcesRef.current,
|
|
151
212
|
groups: groupsRef.current,
|
|
152
213
|
}), [leader]);
|
|
153
|
-
return (_jsx(CommandContext.Provider, { value: ctxValue, children: _jsx(CommandSequenceContext, { value: sequenceState, children: children }) }));
|
|
214
|
+
return (_jsx(CommandContext.Provider, { value: ctxValue, children: _jsx(CommandSurfaceStackContext.Provider, { value: surfaceStackValue, children: _jsx(CommandSequenceContext, { value: sequenceState, children: children }) }) }));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Mounts an overlay-owned command surface. Children registered via `useCommand`
|
|
218
|
+
* target this surface's local registry, and `useMode`/`useSetMode` read/write
|
|
219
|
+
* this surface's local mode instead of the root app's mode.
|
|
220
|
+
*
|
|
221
|
+
* While a `modal` surface is topmost it owns keyboard input and suspends the
|
|
222
|
+
* parent app's commands; a `passive` surface never becomes the keyboard owner.
|
|
223
|
+
*/
|
|
224
|
+
export function CommandSurfaceProvider({ children, id, role = "modal", initialMode = "cursor", }) {
|
|
225
|
+
return (_jsx(ModeProvider, { initialMode: initialMode, children: _jsx(CommandSurfaceInner, { id: id, role: role, children: children }) }));
|
|
226
|
+
}
|
|
227
|
+
function CommandSurfaceInner({ children, id, role, }) {
|
|
228
|
+
const parent = useContext(CommandContext);
|
|
229
|
+
const stack = useContext(CommandSurfaceStackContext);
|
|
230
|
+
if (!parent || !stack) {
|
|
231
|
+
throw new Error("CommandSurfaceProvider must be used within a CommandProvider");
|
|
232
|
+
}
|
|
233
|
+
const parentDepth = useContext(CommandSurfaceDepthContext);
|
|
234
|
+
const depth = parentDepth + 1;
|
|
235
|
+
const mode = useMode();
|
|
236
|
+
const setMode = useSetMode();
|
|
237
|
+
const modeRef = useRef(mode);
|
|
238
|
+
modeRef.current = mode;
|
|
239
|
+
const registryRef = useRef(null);
|
|
240
|
+
const buildCtx = useCallback(() => {
|
|
241
|
+
const ctx = {
|
|
242
|
+
mode: modeRef.current,
|
|
243
|
+
setMode,
|
|
244
|
+
commands: {
|
|
245
|
+
invoke: (cmdId) => registryRef.current?.invoke(cmdId),
|
|
246
|
+
list: () => Array.from(registryRef.current?.commands.values() ?? []),
|
|
247
|
+
},
|
|
248
|
+
exit: () => { },
|
|
249
|
+
};
|
|
250
|
+
for (const getter of parent.contextSources.values()) {
|
|
251
|
+
Object.assign(ctx, getter());
|
|
252
|
+
}
|
|
253
|
+
return ctx;
|
|
254
|
+
}, [parent.contextSources, setMode]);
|
|
255
|
+
const buildCtxRef = useRef(buildCtx);
|
|
256
|
+
buildCtxRef.current = buildCtx;
|
|
257
|
+
if (registryRef.current === null) {
|
|
258
|
+
registryRef.current = createRegistry(() => buildCtxRef.current());
|
|
259
|
+
}
|
|
260
|
+
const { register } = stack;
|
|
261
|
+
useEffect(() => {
|
|
262
|
+
const entry = {
|
|
263
|
+
id,
|
|
264
|
+
role,
|
|
265
|
+
depth,
|
|
266
|
+
order: 0,
|
|
267
|
+
registry: registryRef.current,
|
|
268
|
+
getMode: () => modeRef.current,
|
|
269
|
+
buildCtx: () => buildCtxRef.current(),
|
|
270
|
+
};
|
|
271
|
+
return register(entry);
|
|
272
|
+
}, [register, id, role, depth]);
|
|
273
|
+
const ctxValue = useMemo(() => ({
|
|
274
|
+
registry: registryRef.current,
|
|
275
|
+
leaderKey: parent.leaderKey,
|
|
276
|
+
contextSources: parent.contextSources,
|
|
277
|
+
groups: parent.groups,
|
|
278
|
+
}), [parent.leaderKey, parent.contextSources, parent.groups]);
|
|
279
|
+
return (_jsx(CommandContext.Provider, { value: ctxValue, children: _jsx(CommandSurfaceDepthContext.Provider, { value: depth, children: children }) }));
|
|
154
280
|
}
|
|
155
281
|
export function useCommandContext() {
|
|
156
282
|
const ctx = useContext(CommandContext);
|
|
@@ -175,6 +301,15 @@ export function useCommandRegistry() {
|
|
|
175
301
|
export function useCommandSequenceState() {
|
|
176
302
|
return useContext(CommandSequenceContext);
|
|
177
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Metadata for the topmost modal command surface, or null when the root app is
|
|
306
|
+
* the active surface. Intended for which-key/help to read shortcuts from the
|
|
307
|
+
* active interaction surface.
|
|
308
|
+
*/
|
|
309
|
+
export function useActiveCommandSurface() {
|
|
310
|
+
const ctx = useContext(CommandSurfaceStackContext);
|
|
311
|
+
return ctx ? ctx.activeModalSurface : null;
|
|
312
|
+
}
|
|
178
313
|
export function useCommandGroup(group) {
|
|
179
314
|
const ctx = useContext(CommandContext);
|
|
180
315
|
if (!ctx) {
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { Command, CommandContext, CommandContextBase, CommandGroup, CommandHandler, CommandSequenceCandidate, CommandSequenceState, CommandWhen, ParsedHotkey, ParsedStep, RegisteredCommandGroup, } from "./types.js";
|
|
1
|
+
export type { ActiveCommandSurface, Command, CommandContext, CommandContextBase, CommandGroup, CommandHandler, CommandSequenceCandidate, CommandSequenceState, CommandSurfaceEntry, CommandSurfaceRole, CommandWhen, ParsedHotkey, ParsedStep, RegisteredCommandGroup, } from "./types.js";
|
|
2
2
|
export type { Mode } from "./mode.js";
|
|
3
3
|
export { ModeProvider, useMode, useSetMode } from "./mode.js";
|
|
4
4
|
export type { ModeProviderProps } from "./mode.js";
|
|
@@ -6,8 +6,8 @@ export { parseHotkey } from "./parse.js";
|
|
|
6
6
|
export { matchStep } from "./match.js";
|
|
7
7
|
export { DEFAULT_SEQUENCE_TIMEOUT_MS, SequenceTracker } from "./sequence.js";
|
|
8
8
|
export type { SequenceFeedResult, SequencePendingMatch, SequenceTrackerOptions, } from "./sequence.js";
|
|
9
|
-
export { CommandProvider, useCommandContext, useCommandGroup, useCommandRegistry, useCommandSequenceState, useProvideCommandContext, } from "./context.js";
|
|
10
|
-
export type { CommandProviderProps } from "./context.js";
|
|
9
|
+
export { CommandProvider, CommandSurfaceProvider, useActiveCommandSurface, useCommandContext, useCommandGroup, useCommandRegistry, useCommandSequenceState, useProvideCommandContext, } from "./context.js";
|
|
10
|
+
export type { CommandProviderProps, CommandSurfaceProviderProps } from "./context.js";
|
|
11
11
|
export { useCommand } from "./use-command.js";
|
|
12
12
|
export type { UseCommandOptions } from "./use-command.js";
|
|
13
13
|
export { useActions } from "./use-actions.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,sBAAsB,GACvB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5E,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,sBAAsB,GACvB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC5E,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { ModeProvider, useMode, useSetMode } from "./mode.js";
|
|
|
2
2
|
export { parseHotkey } from "./parse.js";
|
|
3
3
|
export { matchStep } from "./match.js";
|
|
4
4
|
export { DEFAULT_SEQUENCE_TIMEOUT_MS, SequenceTracker } from "./sequence.js";
|
|
5
|
-
export { CommandProvider, useCommandContext, useCommandGroup, useCommandRegistry, useCommandSequenceState, useProvideCommandContext, } from "./context.js";
|
|
5
|
+
export { CommandProvider, CommandSurfaceProvider, useActiveCommandSurface, useCommandContext, useCommandGroup, useCommandRegistry, useCommandSequenceState, useProvideCommandContext, } from "./context.js";
|
|
6
6
|
export { useCommand } from "./use-command.js";
|
|
7
7
|
export { useActions } from "./use-actions.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAM5E,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -40,6 +40,37 @@ export interface CommandRegistry {
|
|
|
40
40
|
register: (command: Command) => () => void;
|
|
41
41
|
invoke: (id: string) => void;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Interaction role of a command surface.
|
|
45
|
+
* - `modal`: owns keyboard input while topmost and suspends every lower surface
|
|
46
|
+
* (including the root app) — even for keys it does not handle.
|
|
47
|
+
* - `passive`: never becomes the keyboard owner; purely visual.
|
|
48
|
+
*/
|
|
49
|
+
export type CommandSurfaceRole = "modal" | "passive";
|
|
50
|
+
/**
|
|
51
|
+
* A command surface is an interaction surface that can own keyboard input.
|
|
52
|
+
* The root app is the implicit base surface; modal overlays push surfaces on
|
|
53
|
+
* top of it. Each surface carries its own command registry and local mode so
|
|
54
|
+
* the same command definitions can be rooted in a standalone app or pushed by
|
|
55
|
+
* an overlay without leaking mode/command state into the parent.
|
|
56
|
+
*/
|
|
57
|
+
export interface CommandSurfaceEntry {
|
|
58
|
+
id: string;
|
|
59
|
+
role: CommandSurfaceRole;
|
|
60
|
+
/** Nesting depth (root children are depth 0; the first overlay surface is 1). */
|
|
61
|
+
depth: number;
|
|
62
|
+
/** Monotonic registration order, used to break depth ties. */
|
|
63
|
+
order: number;
|
|
64
|
+
registry: CommandRegistry;
|
|
65
|
+
/** Reads this surface's current local mode. */
|
|
66
|
+
getMode: () => Mode;
|
|
67
|
+
/** Builds the command context handed to this surface's command handlers. */
|
|
68
|
+
buildCtx: () => CommandContext;
|
|
69
|
+
}
|
|
70
|
+
export interface ActiveCommandSurface {
|
|
71
|
+
id: string;
|
|
72
|
+
role: CommandSurfaceRole;
|
|
73
|
+
}
|
|
43
74
|
export interface CommandGroup {
|
|
44
75
|
id: string;
|
|
45
76
|
title: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAC7B,QAAQ,EAAE;QAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,OAAO,EAAE,CAAA;KAAE,CAAA;IACjE,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAA;AAE1D,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,cAAc,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IACd,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,IAAI,CAAA;IAC1C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,cAAc,EAAE,UAAU,EAAE,CAAA;IAC5B,QAAQ,EAAE,UAAU,CAAA;IACpB,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,UAAU,EAAE,wBAAwB,EAAE,CAAA;CACvC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/context.tsx
CHANGED
|
@@ -10,11 +10,14 @@ import {
|
|
|
10
10
|
} from "react"
|
|
11
11
|
import { useKeyboard } from "@opentui/react"
|
|
12
12
|
import type {
|
|
13
|
+
ActiveCommandSurface,
|
|
13
14
|
Command,
|
|
14
15
|
CommandContext,
|
|
15
16
|
CommandGroup,
|
|
16
17
|
CommandRegistry,
|
|
17
18
|
CommandSequenceState,
|
|
19
|
+
CommandSurfaceEntry,
|
|
20
|
+
CommandSurfaceRole,
|
|
18
21
|
ParsedHotkey,
|
|
19
22
|
ParsedStep,
|
|
20
23
|
RegisteredCommandGroup,
|
|
@@ -36,8 +39,45 @@ interface CommandContextValue {
|
|
|
36
39
|
groups: Map<string, RegisteredCommandGroup>
|
|
37
40
|
}
|
|
38
41
|
|
|
42
|
+
interface CommandSurfaceStackValue {
|
|
43
|
+
/** Register a surface; returns an unregister function. Mutates entry.order. */
|
|
44
|
+
register: (entry: CommandSurfaceEntry) => () => void
|
|
45
|
+
/** Resolve the topmost modal surface (deepest, then most-recently registered). */
|
|
46
|
+
getActiveModalSurface: () => CommandSurfaceEntry | null
|
|
47
|
+
/** Reactive metadata for the active modal surface (for which-key/help). */
|
|
48
|
+
activeModalSurface: ActiveCommandSurface | null
|
|
49
|
+
}
|
|
50
|
+
|
|
39
51
|
const CommandContext = createContext<CommandContextValue | null>(null)
|
|
40
52
|
const CommandSequenceContext = createContext<CommandSequenceState | null>(null)
|
|
53
|
+
const CommandSurfaceStackContext = createContext<CommandSurfaceStackValue | null>(null)
|
|
54
|
+
/** Nesting depth of the nearest command surface (0 at the root app). */
|
|
55
|
+
const CommandSurfaceDepthContext = createContext(0)
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Build a command registry whose `invoke` resolves the command context lazily
|
|
59
|
+
* via `getCtx`, so a surface always dispatches with its own (local) mode and
|
|
60
|
+
* the current shared context sources.
|
|
61
|
+
*/
|
|
62
|
+
function createRegistry(getCtx: () => CommandContext): CommandRegistry {
|
|
63
|
+
const commands = new Map<string, Command>()
|
|
64
|
+
return {
|
|
65
|
+
commands,
|
|
66
|
+
register(command: Command) {
|
|
67
|
+
commands.set(command.id, command)
|
|
68
|
+
return () => {
|
|
69
|
+
commands.delete(command.id)
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
invoke(id: string) {
|
|
73
|
+
const ctx = getCtx()
|
|
74
|
+
const cmd = commands.get(id)
|
|
75
|
+
if (cmd && (!cmd.when || cmd.when(ctx))) {
|
|
76
|
+
cmd.handler(ctx)
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
}
|
|
41
81
|
|
|
42
82
|
export interface CommandProviderProps {
|
|
43
83
|
children: ReactNode
|
|
@@ -101,26 +141,58 @@ function CommandDispatcher({
|
|
|
101
141
|
return ctx as CommandContext
|
|
102
142
|
}, [setMode])
|
|
103
143
|
|
|
144
|
+
const buildCtxRef = useRef(buildCtx)
|
|
145
|
+
buildCtxRef.current = buildCtx
|
|
146
|
+
|
|
104
147
|
if (registryRef.current === null) {
|
|
105
|
-
|
|
106
|
-
registryRef.current = {
|
|
107
|
-
commands,
|
|
108
|
-
register(command: Command) {
|
|
109
|
-
commands.set(command.id, command)
|
|
110
|
-
return () => {
|
|
111
|
-
commands.delete(command.id)
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
invoke(id: string) {
|
|
115
|
-
const ctx = buildCtx()
|
|
116
|
-
const cmd = commands.get(id)
|
|
117
|
-
if (cmd && (!cmd.when || cmd.when(ctx))) {
|
|
118
|
-
cmd.handler(ctx)
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
}
|
|
148
|
+
registryRef.current = createRegistry(() => buildCtxRef.current())
|
|
122
149
|
}
|
|
123
150
|
|
|
151
|
+
// --- Command surface stack ----------------------------------------------
|
|
152
|
+
// The root registry above is the implicit base surface. Modal overlays push
|
|
153
|
+
// surfaces on top of it; while a modal surface is topmost, key dispatch is
|
|
154
|
+
// arbitrated to that surface only and the root (and lower surfaces) are
|
|
155
|
+
// suspended — even for keys the surface does not handle.
|
|
156
|
+
const surfaceEntriesRef = useRef<CommandSurfaceEntry[]>([])
|
|
157
|
+
const surfaceOrderRef = useRef(0)
|
|
158
|
+
const [surfaceVersion, setSurfaceVersion] = useState(0)
|
|
159
|
+
|
|
160
|
+
const registerSurface = useCallback((entry: CommandSurfaceEntry) => {
|
|
161
|
+
entry.order = surfaceOrderRef.current++
|
|
162
|
+
surfaceEntriesRef.current = [...surfaceEntriesRef.current, entry]
|
|
163
|
+
setSurfaceVersion((v) => v + 1)
|
|
164
|
+
return () => {
|
|
165
|
+
surfaceEntriesRef.current = surfaceEntriesRef.current.filter((e) => e !== entry)
|
|
166
|
+
setSurfaceVersion((v) => v + 1)
|
|
167
|
+
}
|
|
168
|
+
}, [])
|
|
169
|
+
|
|
170
|
+
const getActiveModalSurface = useCallback((): CommandSurfaceEntry | null => {
|
|
171
|
+
let best: CommandSurfaceEntry | null = null
|
|
172
|
+
for (const entry of surfaceEntriesRef.current) {
|
|
173
|
+
if (entry.role !== "modal") continue
|
|
174
|
+
if (
|
|
175
|
+
best === null ||
|
|
176
|
+
entry.depth > best.depth ||
|
|
177
|
+
(entry.depth === best.depth && entry.order > best.order)
|
|
178
|
+
) {
|
|
179
|
+
best = entry
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return best
|
|
183
|
+
}, [])
|
|
184
|
+
|
|
185
|
+
const activeModalSurface = useMemo<ActiveCommandSurface | null>(() => {
|
|
186
|
+
const surface = getActiveModalSurface()
|
|
187
|
+
return surface ? { id: surface.id, role: surface.role } : null
|
|
188
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
189
|
+
}, [getActiveModalSurface, surfaceVersion])
|
|
190
|
+
|
|
191
|
+
const surfaceStackValue = useMemo<CommandSurfaceStackValue>(
|
|
192
|
+
() => ({ register: registerSurface, getActiveModalSurface, activeModalSurface }),
|
|
193
|
+
[registerSurface, getActiveModalSurface, activeModalSurface],
|
|
194
|
+
)
|
|
195
|
+
|
|
124
196
|
const trackerRef = useRef(
|
|
125
197
|
new SequenceTracker({
|
|
126
198
|
timeout: sequenceTimeoutMs,
|
|
@@ -146,11 +218,14 @@ function CommandDispatcher({
|
|
|
146
218
|
useKeyboard((event) => {
|
|
147
219
|
if (event.defaultPrevented) return
|
|
148
220
|
|
|
149
|
-
const
|
|
150
|
-
if (!
|
|
221
|
+
const rootRegistry = registryRef.current
|
|
222
|
+
if (!rootRegistry) return
|
|
151
223
|
|
|
152
|
-
|
|
153
|
-
const
|
|
224
|
+
// Arbitration: a topmost modal surface owns input; otherwise the root app.
|
|
225
|
+
const activeSurface = getActiveModalSurface()
|
|
226
|
+
const registry = activeSurface ? activeSurface.registry : rootRegistry
|
|
227
|
+
const currentMode = activeSurface ? activeSurface.getMode() : modeRef.current
|
|
228
|
+
const ctx = activeSurface ? activeSurface.buildCtx() : buildCtx()
|
|
154
229
|
|
|
155
230
|
// Collect eligible commands with their parsed hotkeys
|
|
156
231
|
const singleStepCandidates: { command: Command; parsed: ParsedHotkey }[] = []
|
|
@@ -218,6 +293,9 @@ function CommandDispatcher({
|
|
|
218
293
|
return
|
|
219
294
|
}
|
|
220
295
|
}
|
|
296
|
+
|
|
297
|
+
// A modal surface swallows unhandled keys: dispatch never falls through to
|
|
298
|
+
// the root app while a modal surface is topmost.
|
|
221
299
|
})
|
|
222
300
|
|
|
223
301
|
useEffect(() => {
|
|
@@ -225,6 +303,14 @@ function CommandDispatcher({
|
|
|
225
303
|
setSequenceState(null)
|
|
226
304
|
}, [mode])
|
|
227
305
|
|
|
306
|
+
// Reset any in-flight sequence when keyboard ownership changes (e.g. a modal
|
|
307
|
+
// surface opens/closes) so partial chords don't leak across surfaces. Passive
|
|
308
|
+
// surfaces such as which-key must not clear the sequence they are displaying.
|
|
309
|
+
useEffect(() => {
|
|
310
|
+
trackerRef.current.reset()
|
|
311
|
+
setSequenceState(null)
|
|
312
|
+
}, [activeModalSurface?.id])
|
|
313
|
+
|
|
228
314
|
const ctxValue = useMemo(
|
|
229
315
|
() => ({
|
|
230
316
|
registry: registryRef.current!,
|
|
@@ -237,7 +323,123 @@ function CommandDispatcher({
|
|
|
237
323
|
|
|
238
324
|
return (
|
|
239
325
|
<CommandContext.Provider value={ctxValue}>
|
|
240
|
-
<
|
|
326
|
+
<CommandSurfaceStackContext.Provider value={surfaceStackValue}>
|
|
327
|
+
<CommandSequenceContext value={sequenceState}>{children}</CommandSequenceContext>
|
|
328
|
+
</CommandSurfaceStackContext.Provider>
|
|
329
|
+
</CommandContext.Provider>
|
|
330
|
+
)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export interface CommandSurfaceProviderProps {
|
|
334
|
+
children: ReactNode
|
|
335
|
+
/** Stable id for the surface (typically the overlay id). */
|
|
336
|
+
id: string
|
|
337
|
+
/** Interaction role (default "modal"). */
|
|
338
|
+
role?: CommandSurfaceRole
|
|
339
|
+
/** Initial local mode for this surface (default "cursor"). */
|
|
340
|
+
initialMode?: Mode
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Mounts an overlay-owned command surface. Children registered via `useCommand`
|
|
345
|
+
* target this surface's local registry, and `useMode`/`useSetMode` read/write
|
|
346
|
+
* this surface's local mode instead of the root app's mode.
|
|
347
|
+
*
|
|
348
|
+
* While a `modal` surface is topmost it owns keyboard input and suspends the
|
|
349
|
+
* parent app's commands; a `passive` surface never becomes the keyboard owner.
|
|
350
|
+
*/
|
|
351
|
+
export function CommandSurfaceProvider({
|
|
352
|
+
children,
|
|
353
|
+
id,
|
|
354
|
+
role = "modal",
|
|
355
|
+
initialMode = "cursor",
|
|
356
|
+
}: CommandSurfaceProviderProps) {
|
|
357
|
+
return (
|
|
358
|
+
<ModeProvider initialMode={initialMode}>
|
|
359
|
+
<CommandSurfaceInner id={id} role={role}>
|
|
360
|
+
{children}
|
|
361
|
+
</CommandSurfaceInner>
|
|
362
|
+
</ModeProvider>
|
|
363
|
+
)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function CommandSurfaceInner({
|
|
367
|
+
children,
|
|
368
|
+
id,
|
|
369
|
+
role,
|
|
370
|
+
}: {
|
|
371
|
+
children: ReactNode
|
|
372
|
+
id: string
|
|
373
|
+
role: CommandSurfaceRole
|
|
374
|
+
}) {
|
|
375
|
+
const parent = useContext(CommandContext)
|
|
376
|
+
const stack = useContext(CommandSurfaceStackContext)
|
|
377
|
+
if (!parent || !stack) {
|
|
378
|
+
throw new Error("CommandSurfaceProvider must be used within a CommandProvider")
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const parentDepth = useContext(CommandSurfaceDepthContext)
|
|
382
|
+
const depth = parentDepth + 1
|
|
383
|
+
|
|
384
|
+
const mode = useMode()
|
|
385
|
+
const setMode = useSetMode()
|
|
386
|
+
const modeRef = useRef(mode)
|
|
387
|
+
modeRef.current = mode
|
|
388
|
+
|
|
389
|
+
const registryRef = useRef<CommandRegistry | null>(null)
|
|
390
|
+
|
|
391
|
+
const buildCtx = useCallback((): CommandContext => {
|
|
392
|
+
const ctx: Record<string, any> = {
|
|
393
|
+
mode: modeRef.current,
|
|
394
|
+
setMode,
|
|
395
|
+
commands: {
|
|
396
|
+
invoke: (cmdId: string) => registryRef.current?.invoke(cmdId),
|
|
397
|
+
list: () => Array.from(registryRef.current?.commands.values() ?? []),
|
|
398
|
+
},
|
|
399
|
+
exit: () => {},
|
|
400
|
+
}
|
|
401
|
+
for (const getter of parent.contextSources.values()) {
|
|
402
|
+
Object.assign(ctx, getter())
|
|
403
|
+
}
|
|
404
|
+
return ctx as CommandContext
|
|
405
|
+
}, [parent.contextSources, setMode])
|
|
406
|
+
|
|
407
|
+
const buildCtxRef = useRef(buildCtx)
|
|
408
|
+
buildCtxRef.current = buildCtx
|
|
409
|
+
|
|
410
|
+
if (registryRef.current === null) {
|
|
411
|
+
registryRef.current = createRegistry(() => buildCtxRef.current())
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const { register } = stack
|
|
415
|
+
useEffect(() => {
|
|
416
|
+
const entry: CommandSurfaceEntry = {
|
|
417
|
+
id,
|
|
418
|
+
role,
|
|
419
|
+
depth,
|
|
420
|
+
order: 0,
|
|
421
|
+
registry: registryRef.current!,
|
|
422
|
+
getMode: () => modeRef.current,
|
|
423
|
+
buildCtx: () => buildCtxRef.current(),
|
|
424
|
+
}
|
|
425
|
+
return register(entry)
|
|
426
|
+
}, [register, id, role, depth])
|
|
427
|
+
|
|
428
|
+
const ctxValue = useMemo<CommandContextValue>(
|
|
429
|
+
() => ({
|
|
430
|
+
registry: registryRef.current!,
|
|
431
|
+
leaderKey: parent.leaderKey,
|
|
432
|
+
contextSources: parent.contextSources,
|
|
433
|
+
groups: parent.groups,
|
|
434
|
+
}),
|
|
435
|
+
[parent.leaderKey, parent.contextSources, parent.groups],
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
return (
|
|
439
|
+
<CommandContext.Provider value={ctxValue}>
|
|
440
|
+
<CommandSurfaceDepthContext.Provider value={depth}>
|
|
441
|
+
{children}
|
|
442
|
+
</CommandSurfaceDepthContext.Provider>
|
|
241
443
|
</CommandContext.Provider>
|
|
242
444
|
)
|
|
243
445
|
}
|
|
@@ -269,6 +471,16 @@ export function useCommandSequenceState(): CommandSequenceState | null {
|
|
|
269
471
|
return useContext(CommandSequenceContext)
|
|
270
472
|
}
|
|
271
473
|
|
|
474
|
+
/**
|
|
475
|
+
* Metadata for the topmost modal command surface, or null when the root app is
|
|
476
|
+
* the active surface. Intended for which-key/help to read shortcuts from the
|
|
477
|
+
* active interaction surface.
|
|
478
|
+
*/
|
|
479
|
+
export function useActiveCommandSurface(): ActiveCommandSurface | null {
|
|
480
|
+
const ctx = useContext(CommandSurfaceStackContext)
|
|
481
|
+
return ctx ? ctx.activeModalSurface : null
|
|
482
|
+
}
|
|
483
|
+
|
|
272
484
|
export function useCommandGroup(group: CommandGroup): void {
|
|
273
485
|
const ctx = useContext(CommandContext)
|
|
274
486
|
if (!ctx) {
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type {
|
|
2
|
+
ActiveCommandSurface,
|
|
2
3
|
Command,
|
|
3
4
|
CommandContext,
|
|
4
5
|
CommandContextBase,
|
|
@@ -6,6 +7,8 @@ export type {
|
|
|
6
7
|
CommandHandler,
|
|
7
8
|
CommandSequenceCandidate,
|
|
8
9
|
CommandSequenceState,
|
|
10
|
+
CommandSurfaceEntry,
|
|
11
|
+
CommandSurfaceRole,
|
|
9
12
|
CommandWhen,
|
|
10
13
|
ParsedHotkey,
|
|
11
14
|
ParsedStep,
|
|
@@ -24,13 +27,15 @@ export type {
|
|
|
24
27
|
} from "./sequence.js"
|
|
25
28
|
export {
|
|
26
29
|
CommandProvider,
|
|
30
|
+
CommandSurfaceProvider,
|
|
31
|
+
useActiveCommandSurface,
|
|
27
32
|
useCommandContext,
|
|
28
33
|
useCommandGroup,
|
|
29
34
|
useCommandRegistry,
|
|
30
35
|
useCommandSequenceState,
|
|
31
36
|
useProvideCommandContext,
|
|
32
37
|
} from "./context.js"
|
|
33
|
-
export type { CommandProviderProps } from "./context.js"
|
|
38
|
+
export type { CommandProviderProps, CommandSurfaceProviderProps } from "./context.js"
|
|
34
39
|
export { useCommand } from "./use-command.js"
|
|
35
40
|
export type { UseCommandOptions } from "./use-command.js"
|
|
36
41
|
export { useActions } from "./use-actions.js"
|
package/src/types.ts
CHANGED
|
@@ -45,6 +45,40 @@ export interface CommandRegistry {
|
|
|
45
45
|
invoke: (id: string) => void
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Interaction role of a command surface.
|
|
50
|
+
* - `modal`: owns keyboard input while topmost and suspends every lower surface
|
|
51
|
+
* (including the root app) — even for keys it does not handle.
|
|
52
|
+
* - `passive`: never becomes the keyboard owner; purely visual.
|
|
53
|
+
*/
|
|
54
|
+
export type CommandSurfaceRole = "modal" | "passive"
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* A command surface is an interaction surface that can own keyboard input.
|
|
58
|
+
* The root app is the implicit base surface; modal overlays push surfaces on
|
|
59
|
+
* top of it. Each surface carries its own command registry and local mode so
|
|
60
|
+
* the same command definitions can be rooted in a standalone app or pushed by
|
|
61
|
+
* an overlay without leaking mode/command state into the parent.
|
|
62
|
+
*/
|
|
63
|
+
export interface CommandSurfaceEntry {
|
|
64
|
+
id: string
|
|
65
|
+
role: CommandSurfaceRole
|
|
66
|
+
/** Nesting depth (root children are depth 0; the first overlay surface is 1). */
|
|
67
|
+
depth: number
|
|
68
|
+
/** Monotonic registration order, used to break depth ties. */
|
|
69
|
+
order: number
|
|
70
|
+
registry: CommandRegistry
|
|
71
|
+
/** Reads this surface's current local mode. */
|
|
72
|
+
getMode: () => Mode
|
|
73
|
+
/** Builds the command context handed to this surface's command handlers. */
|
|
74
|
+
buildCtx: () => CommandContext
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface ActiveCommandSurface {
|
|
78
|
+
id: string
|
|
79
|
+
role: CommandSurfaceRole
|
|
80
|
+
}
|
|
81
|
+
|
|
48
82
|
export interface CommandGroup {
|
|
49
83
|
id: string
|
|
50
84
|
title: string
|