@tooee/commands 0.1.19 → 0.1.21

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.
Files changed (46) hide show
  1. package/README.md +33 -0
  2. package/dist/command-store.d.ts +147 -0
  3. package/dist/command-store.d.ts.map +1 -0
  4. package/dist/command-store.js +367 -0
  5. package/dist/command-store.js.map +1 -0
  6. package/dist/context.d.ts +52 -3
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +244 -153
  9. package/dist/context.js.map +1 -1
  10. package/dist/index.d.ts +5 -3
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/match.d.ts.map +1 -1
  15. package/dist/match.js +2 -0
  16. package/dist/match.js.map +1 -1
  17. package/dist/mode.d.ts +7 -1
  18. package/dist/mode.d.ts.map +1 -1
  19. package/dist/mode.js +12 -3
  20. package/dist/mode.js.map +1 -1
  21. package/dist/parse.d.ts.map +1 -1
  22. package/dist/parse.js +17 -5
  23. package/dist/parse.js.map +1 -1
  24. package/dist/sequence.d.ts +17 -2
  25. package/dist/sequence.d.ts.map +1 -1
  26. package/dist/sequence.js +66 -45
  27. package/dist/sequence.js.map +1 -1
  28. package/dist/types.d.ts +51 -1
  29. package/dist/types.d.ts.map +1 -1
  30. package/dist/use-actions.d.ts.map +1 -1
  31. package/dist/use-actions.js +6 -3
  32. package/dist/use-actions.js.map +1 -1
  33. package/dist/use-command.d.ts.map +1 -1
  34. package/dist/use-command.js +12 -4
  35. package/dist/use-command.js.map +1 -1
  36. package/package.json +5 -1
  37. package/src/command-store.ts +554 -0
  38. package/src/context.tsx +353 -165
  39. package/src/index.ts +27 -1
  40. package/src/match.ts +1 -0
  41. package/src/mode.tsx +31 -3
  42. package/src/parse.ts +20 -5
  43. package/src/sequence.ts +80 -52
  44. package/src/types.ts +56 -3
  45. package/src/use-actions.ts +5 -3
  46. package/src/use-command.ts +13 -4
@@ -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,EAGpB,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;AAED,QAAA,MAAM,cAAc,qDAAkD,CAAA;AAGtE,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;AAqLD,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,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA8BzD;AAkBD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAuBpF"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAGd,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGrC,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AAE3B,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;AAED,qFAAqF;AACrF,UAAU,wBAAwB;IAChC,YAAY,EAAE,YAAY,CAAA;IAC1B,+EAA+E;IAC/E,OAAO,EAAE,aAAa,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,QAAA,MAAM,cAAc,0DAAuD,CAAA;AAwB3E,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;AAOD,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,EACX,iBAAiB,GAClB,EAAE,oBAAoB,aAmDtB;AA+ED,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,aAkB7B;AAqFD,wBAAgB,iBAAiB,IAAI;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,CAqBzF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAMpD;AAED,wBAAgB,kBAAkB,IAAI,mBAAmB,CAsBxD;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,IAAI,CAErE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,IAAI,CAkBrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAUzE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA+BzD;AAID,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CA0BpF"}
package/dist/context.js CHANGED
@@ -1,180 +1,283 @@
1
1
  import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
- import { createContext, useContext, useRef, useCallback, useEffect, useMemo, useState, } from "react";
2
+ import { createContext, useContext, useRef, useCallback, useEffect, useMemo, } from "react";
3
3
  import { useKeyboard } from "@opentui/react";
4
+ import { useSelector } from "@xstate/store-react";
4
5
  import { ModeProvider, useMode, useSetMode } from "./mode.js";
5
6
  import { parseHotkey } from "./parse.js";
6
- import { matchStep } from "./match.js";
7
- import { SequenceTracker } from "./sequence.js";
8
- const DEFAULT_MODES = ["cursor"];
7
+ import { ROOT_SURFACE_ID, createCommandStore, selectActiveModalSurface, selectSequence, selectSurfaceCommandMap, stepsKey, } from "./command-store.js";
9
8
  const CommandContext = createContext(null);
10
9
  const CommandSequenceContext = createContext(null);
10
+ /** Nesting depth of the nearest command surface (0 at the root app). */
11
+ const CommandSurfaceDepthContext = createContext(0);
12
+ /**
13
+ * Fallback store for hooks that must not throw outside a CommandProvider
14
+ * (useActiveCommandSurface, useSurfaceCommands). Never dispatched to.
15
+ */
16
+ const FALLBACK_COMMAND_STORE = createCommandStore({
17
+ root: {
18
+ getMode: () => "cursor",
19
+ // Placeholder context: augmented domain fields (overlay, view, ...) are
20
+ // only present where their providers run; dispatch never reaches this.
21
+ buildCtx: () => ({
22
+ mode: "cursor",
23
+ setMode: () => { },
24
+ commands: { invoke: () => { }, list: () => [] },
25
+ exit: () => { },
26
+ }),
27
+ },
28
+ });
11
29
  export function CommandProvider({ children, leader, keymap, initialMode, sequenceTimeoutMs, }) {
12
- return (_jsx(ModeProvider, { initialMode: initialMode, children: _jsx(CommandDispatcher, { leader: leader, keymap: keymap, sequenceTimeoutMs: sequenceTimeoutMs, children: children }) }));
30
+ // The store is created here (above the root ModeProvider) so mode changes
31
+ // can be routed into it as transitions; the dispatcher below installs the
32
+ // real root accessors before any key can dispatch.
33
+ const rootAccessRef = useRef({
34
+ getMode: () => initialMode ?? "cursor",
35
+ // Placeholder until CommandDispatcher installs the real accessors on its
36
+ // first render (before any key can dispatch).
37
+ buildCtx: () => ({
38
+ mode: initialMode ?? "cursor",
39
+ setMode: () => { },
40
+ commands: { invoke: () => { }, list: () => [] },
41
+ exit: () => { },
42
+ }),
43
+ });
44
+ const storeRef = useRef(null);
45
+ if (storeRef.current === null) {
46
+ storeRef.current = createCommandStore({
47
+ leader,
48
+ keymap,
49
+ sequenceTimeoutMs,
50
+ root: {
51
+ getMode: () => rootAccessRef.current.getMode(),
52
+ buildCtx: () => rootAccessRef.current.buildCtx(),
53
+ },
54
+ });
55
+ }
56
+ const commandStore = storeRef.current;
57
+ // Root mode changes are transitions: reset any pending chord synchronously
58
+ // (this replaces the old post-render tracker-reset effect).
59
+ const handleModeChange = useCallback(() => commandStore.modeChanged(ROOT_SURFACE_ID), [commandStore]);
60
+ return (_jsx(ModeProvider, { initialMode: initialMode, onModeChange: handleModeChange, children: _jsx(CommandDispatcher, { commandStore: commandStore, rootAccess: rootAccessRef, leader: leader, keymap: keymap, sequenceTimeoutMs: sequenceTimeoutMs, children: children }) }));
13
61
  }
14
- function CommandDispatcher({ children, leader, keymap, sequenceTimeoutMs, }) {
15
- const registryRef = useRef(null);
16
- const contextSourcesRef = useRef(new Map());
17
- const groupsRef = useRef(new Map());
62
+ function CommandDispatcher({ children, commandStore, rootAccess, leader, keymap, sequenceTimeoutMs, }) {
18
63
  const mode = useMode();
19
64
  const modeRef = useRef(mode);
20
65
  modeRef.current = mode;
21
66
  const setMode = useSetMode();
22
- const [sequenceState, setSequenceState] = useState(null);
23
- const clearSequenceStateRef = useRef(() => setSequenceState(null));
24
- clearSequenceStateRef.current = () => setSequenceState(null);
25
67
  const buildCtx = useCallback(() => {
68
+ const registry = commandStore.registryFor(commandStore.rootRecord);
26
69
  const ctx = {
27
70
  mode: modeRef.current,
28
71
  setMode,
29
72
  commands: {
30
- invoke: (id) => registryRef.current?.invoke(id),
31
- list: () => Array.from(registryRef.current?.commands.values() ?? []),
73
+ invoke: (id) => registry.invoke(id),
74
+ list: () => Array.from(registry.commands.values()),
32
75
  },
33
76
  exit: () => { },
34
77
  };
35
- for (const getter of contextSourcesRef.current.values()) {
78
+ for (const getter of commandStore.store.getSnapshot().context.contextSources.values()) {
36
79
  Object.assign(ctx, getter());
37
80
  }
38
81
  return ctx;
39
- }, [setMode]);
40
- if (registryRef.current === null) {
41
- const commands = new Map();
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
- };
58
- }
59
- const trackerRef = useRef(new SequenceTracker({
60
- timeout: sequenceTimeoutMs,
61
- onReset: () => clearSequenceStateRef.current(),
62
- }));
63
- const parseCacheRef = useRef(new Map());
64
- const getParsedHotkey = useCallback((hotkey) => {
65
- const cache = parseCacheRef.current;
66
- const cacheKey = `${hotkey}:${leader ?? ""}`;
67
- let parsed = cache.get(cacheKey);
68
- if (!parsed) {
69
- parsed = parseHotkey(hotkey, leader);
70
- cache.set(cacheKey, parsed);
71
- }
72
- return parsed;
73
- }, [leader]);
82
+ }, [commandStore, setMode]);
83
+ const buildCtxRef = useRef(buildCtx);
84
+ buildCtxRef.current = buildCtx;
85
+ // Install the live root accessors and config (ref writes, same pattern as
86
+ // the previous modeRef mirrors; leader/keymap are read per dispatch).
87
+ rootAccess.current.getMode = () => modeRef.current;
88
+ rootAccess.current.buildCtx = () => buildCtxRef.current();
89
+ commandStore.setConfig({ leader, keymap, sequenceTimeoutMs });
74
90
  useKeyboard((event) => {
75
91
  if (event.defaultPrevented)
76
92
  return;
77
- const registry = registryRef.current;
78
- if (!registry)
79
- return;
80
- const currentMode = mode;
81
- const ctx = buildCtx();
82
- // Collect eligible commands with their parsed hotkeys
83
- const singleStepCandidates = [];
84
- const multiStepCandidates = [];
85
- for (const command of registry.commands.values()) {
86
- const commandModes = command.modes ?? DEFAULT_MODES;
87
- if (!commandModes.includes(currentMode))
88
- continue;
89
- if (command.when && !command.when(ctx))
90
- continue;
91
- const hotkey = keymap?.[command.id] ?? command.defaultHotkey;
92
- if (!hotkey)
93
- continue;
94
- const parsed = getParsedHotkey(hotkey);
95
- if (parsed.steps.length === 1) {
96
- singleStepCandidates.push({ command, parsed });
97
- }
98
- else {
99
- multiStepCandidates.push({ command, hotkey, parsed });
100
- }
101
- }
102
- // Check multi-step sequences first (they consume buffer state)
103
- if (multiStepCandidates.length > 0) {
104
- const multiStepHotkeys = multiStepCandidates.map((candidate) => candidate.parsed);
105
- const result = trackerRef.current.feedWithState(event, multiStepHotkeys);
106
- if (result.matchedIndex >= 0) {
107
- event.preventDefault();
108
- setSequenceState(null);
109
- multiStepCandidates[result.matchedIndex].command.handler(ctx);
110
- return;
111
- }
112
- if (result.pending) {
113
- const firstCandidate = multiStepCandidates[result.pending.indexes[0]];
114
- setSequenceState({
115
- prefix: firstCandidate.parsed.steps.slice(0, result.pending.prefixLength),
116
- candidates: result.pending.indexes
117
- .map((idx) => multiStepCandidates[idx])
118
- .filter(({ command }) => !command.hidden)
119
- .map(({ command, hotkey, parsed }) => ({
120
- command,
121
- hotkey,
122
- steps: parsed.steps,
123
- remainingSteps: parsed.steps.slice(result.pending.prefixLength),
124
- nextStep: parsed.steps[result.pending.prefixLength],
125
- group: groupsRef.current.get(stepsKey(parsed.steps.slice(0, result.pending.prefixLength + 1))),
126
- })),
127
- });
128
- event.preventDefault();
129
- return;
130
- }
131
- setSequenceState(null);
132
- }
133
- // Check single-step matches
134
- for (const { command, parsed } of singleStepCandidates) {
135
- if (matchStep(event, parsed.steps[0])) {
136
- event.preventDefault();
137
- setSequenceState(null);
138
- command.handler(ctx);
139
- return;
140
- }
93
+ const result = commandStore.key(event);
94
+ if (result.handled) {
95
+ event.preventDefault();
96
+ result.invoke?.();
141
97
  }
142
98
  });
143
- useEffect(() => {
144
- trackerRef.current.reset();
145
- setSequenceState(null);
146
- }, [mode]);
99
+ // Clear the store's key buffer and pending timeout on dispatcher unmount so
100
+ // the timer cannot fire after the tree is gone.
101
+ useEffect(() => () => commandStore.dispose(), [commandStore]);
102
+ const sequenceState = useSelector(commandStore.store, (s) => selectSequence(s.context));
147
103
  const ctxValue = useMemo(() => ({
148
- registry: registryRef.current,
104
+ commandStore,
105
+ surface: commandStore.rootRecord,
149
106
  leaderKey: leader,
150
- contextSources: contextSourcesRef.current,
151
- groups: groupsRef.current,
152
- }), [leader]);
107
+ }), [commandStore, leader]);
153
108
  return (_jsx(CommandContext.Provider, { value: ctxValue, children: _jsx(CommandSequenceContext, { value: sequenceState, children: children }) }));
154
109
  }
110
+ /**
111
+ * Mounts an overlay-owned command surface. Children registered via `useCommand`
112
+ * target this surface's local registry, and `useMode`/`useSetMode` read/write
113
+ * this surface's local mode instead of the root app's mode.
114
+ *
115
+ * While a `modal` surface is topmost it owns keyboard input and suspends the
116
+ * parent app's commands; a `passive` surface never becomes the keyboard owner.
117
+ */
118
+ export function CommandSurfaceProvider({ children, id, role = "modal", initialMode = "cursor", }) {
119
+ const parent = useContext(CommandContext);
120
+ if (!parent) {
121
+ throw new Error("CommandSurfaceProvider must be used within a CommandProvider");
122
+ }
123
+ const { commandStore } = parent;
124
+ // Surface-local mode changes are transitions too (F-08): a mid-chord mode
125
+ // switch on a modal surface resets the pending sequence.
126
+ const handleModeChange = useCallback(() => commandStore.modeChanged(id), [commandStore, id]);
127
+ return (_jsx(ModeProvider, { initialMode: initialMode, onModeChange: handleModeChange, children: _jsx(CommandSurfaceInner, { id: id, role: role, children: children }) }));
128
+ }
129
+ function CommandSurfaceInner({ children, id, role, }) {
130
+ const parent = useContext(CommandContext);
131
+ if (!parent) {
132
+ throw new Error("CommandSurfaceProvider must be used within a CommandProvider");
133
+ }
134
+ const { commandStore } = parent;
135
+ const parentDepth = useContext(CommandSurfaceDepthContext);
136
+ const depth = parentDepth + 1;
137
+ const mode = useMode();
138
+ const setMode = useSetMode();
139
+ const modeRef = useRef(mode);
140
+ modeRef.current = mode;
141
+ const buildCtx = useCallback(() => {
142
+ const registry = commandStore.registryFor(recordRef.current);
143
+ const ctx = {
144
+ mode: modeRef.current,
145
+ setMode,
146
+ commands: {
147
+ invoke: (cmdId) => registry.invoke(cmdId),
148
+ list: () => Array.from(registry.commands.values()),
149
+ },
150
+ exit: () => { },
151
+ };
152
+ for (const getter of commandStore.store.getSnapshot().context.contextSources.values()) {
153
+ Object.assign(ctx, getter());
154
+ }
155
+ return ctx;
156
+ }, [commandStore, setMode]);
157
+ const buildCtxRef = useRef(buildCtx);
158
+ buildCtxRef.current = buildCtx;
159
+ const recordRef = useRef(null);
160
+ if (recordRef.current === null ||
161
+ recordRef.current.id !== id ||
162
+ recordRef.current.role !== role ||
163
+ recordRef.current.depth !== depth) {
164
+ recordRef.current = {
165
+ id,
166
+ role,
167
+ depth,
168
+ order: 0,
169
+ getMode: () => modeRef.current,
170
+ buildCtx: () => buildCtxRef.current(),
171
+ };
172
+ }
173
+ const record = recordRef.current;
174
+ // Mount/unmount registration is a keep-effect: it synchronizes the React
175
+ // tree with the store's surface stack.
176
+ useEffect(() => commandStore.pushSurface(record), [commandStore, record]);
177
+ const ctxValue = useMemo(() => ({
178
+ commandStore,
179
+ surface: record,
180
+ leaderKey: parent.leaderKey,
181
+ }), [commandStore, record, parent.leaderKey]);
182
+ return (_jsx(CommandContext.Provider, { value: ctxValue, children: _jsx(CommandSurfaceDepthContext.Provider, { value: depth, children: children }) }));
183
+ }
155
184
  export function useCommandContext() {
156
185
  const ctx = useContext(CommandContext);
157
186
  if (!ctx) {
158
187
  throw new Error("useCommandContext must be used within a CommandProvider");
159
188
  }
160
- const { registry } = ctx;
161
- return {
162
- get commands() {
163
- return Array.from(registry.commands.values());
164
- },
189
+ const { commandStore, surface } = ctx;
190
+ // Reactive: consumers re-render when a command registers or unregisters on
191
+ // this surface (the per-surface map is identity-stable otherwise).
192
+ const commandMap = useSelector(commandStore.store, (s) => selectSurfaceCommandMap(s.context, surface.id));
193
+ const registry = commandStore.registryFor(surface);
194
+ return useMemo(() => ({
195
+ commands: commandMap ? Array.from(commandMap.values()) : [],
165
196
  invoke: registry.invoke,
166
- };
197
+ }), [commandMap, registry]);
198
+ }
199
+ /**
200
+ * Internal: the stable registry facade for the nearest surface, without
201
+ * subscribing to store changes. Registration hooks (useCommand/useActions)
202
+ * only need the facade; subscribing them would re-render every command host
203
+ * on unrelated group/context-source registrations.
204
+ */
205
+ export function useSurfaceRegistry() {
206
+ const ctx = useContext(CommandContext);
207
+ if (!ctx) {
208
+ throw new Error("useCommandRegistry must be used within a CommandProvider");
209
+ }
210
+ return ctx.commandStore.registryFor(ctx.surface);
167
211
  }
168
212
  export function useCommandRegistry() {
169
213
  const ctx = useContext(CommandContext);
170
214
  if (!ctx) {
171
215
  throw new Error("useCommandRegistry must be used within a CommandProvider");
172
216
  }
173
- return ctx;
217
+ const { commandStore, surface, leaderKey } = ctx;
218
+ // Subscribe to the slices so captured maps stay current across renders (the
219
+ // maps are immutable snapshots now, not shared mutable maps).
220
+ const groups = useSelector(commandStore.store, (s) => s.context.groups);
221
+ const contextSources = useSelector(commandStore.store, (s) => s.context.contextSources);
222
+ const registry = commandStore.registryFor(surface);
223
+ return useMemo(() => ({
224
+ registry,
225
+ leaderKey,
226
+ contextSources: contextSources,
227
+ groups: groups,
228
+ }), [registry, leaderKey, contextSources, groups]);
174
229
  }
175
230
  export function useCommandSequenceState() {
176
231
  return useContext(CommandSequenceContext);
177
232
  }
233
+ /**
234
+ * Metadata for the topmost modal command surface, or null when the root app is
235
+ * the active surface. Intended for which-key/help to read shortcuts from the
236
+ * active interaction surface. `commands` is reactive (F-13).
237
+ */
238
+ export function useActiveCommandSurface() {
239
+ const ctx = useContext(CommandContext);
240
+ const store = (ctx?.commandStore ?? FALLBACK_COMMAND_STORE).store;
241
+ const record = useSelector(store, (s) => selectActiveModalSurface(s.context));
242
+ const commandMap = useSelector(store, (s) => {
243
+ const active = selectActiveModalSurface(s.context);
244
+ return active ? selectSurfaceCommandMap(s.context, active.id) : undefined;
245
+ });
246
+ return useMemo(() => {
247
+ if (!record)
248
+ return null;
249
+ return {
250
+ id: record.id,
251
+ role: record.role,
252
+ commands: commandMap ? Array.from(commandMap.values()) : [],
253
+ };
254
+ }, [record, commandMap]);
255
+ }
256
+ /**
257
+ * Commands registered on a surface (reactive). Defaults to the active modal
258
+ * surface, falling back to the root surface when none is active.
259
+ */
260
+ export function useSurfaceCommands(surfaceId) {
261
+ const ctx = useContext(CommandContext);
262
+ const store = (ctx?.commandStore ?? FALLBACK_COMMAND_STORE).store;
263
+ const commandMap = useSelector(store, (s) => {
264
+ const id = surfaceId ?? selectActiveModalSurface(s.context)?.id ?? ROOT_SURFACE_ID;
265
+ return selectSurfaceCommandMap(s.context, id);
266
+ });
267
+ return useMemo(() => (commandMap ? Array.from(commandMap.values()) : []), [commandMap]);
268
+ }
269
+ /**
270
+ * Advanced/internal — subject to change. The command store instance backing
271
+ * this provider tree, for bridges that must reach the dispatch machinery
272
+ * (e.g. the shell's overlay-replacement sequence reset).
273
+ */
274
+ export function useCommandStore() {
275
+ const ctx = useContext(CommandContext);
276
+ if (!ctx) {
277
+ throw new Error("useCommandStore must be used within a CommandProvider");
278
+ }
279
+ return ctx.commandStore;
280
+ }
178
281
  export function useCommandGroup(group) {
179
282
  const ctx = useContext(CommandContext);
180
283
  if (!ctx) {
@@ -182,16 +285,17 @@ export function useCommandGroup(group) {
182
285
  }
183
286
  const groupRef = useRef(group);
184
287
  groupRef.current = group;
185
- const { groups, leaderKey } = ctx;
288
+ const { commandStore, leaderKey } = ctx;
186
289
  useEffect(() => {
187
290
  const parsed = parseHotkey(groupRef.current.prefix, leaderKey);
188
291
  const registered = {
189
292
  ...groupRef.current,
190
293
  prefixKey: stepsKey(parsed.steps),
191
294
  };
192
- groups.set(registered.prefixKey, registered);
295
+ commandStore.store.trigger.groupRegistered({ group: registered });
193
296
  return () => {
194
- groups.delete(registered.prefixKey);
297
+ // Unregistration is identity-guarded in the store transition (R-05).
298
+ commandStore.store.trigger.groupUnregistered({ group: registered });
195
299
  };
196
300
  }, [
197
301
  group.id,
@@ -200,26 +304,10 @@ export function useCommandGroup(group) {
200
304
  group.description,
201
305
  group.icon,
202
306
  group.order,
203
- groups,
307
+ commandStore,
204
308
  leaderKey,
205
309
  ]);
206
310
  }
207
- function stepsKey(steps) {
208
- return steps.map(formatStepKey).join(" ");
209
- }
210
- function formatStepKey(step) {
211
- const modifiers = [];
212
- if (step.ctrl)
213
- modifiers.push("ctrl");
214
- if (step.meta)
215
- modifiers.push("meta");
216
- if (step.option)
217
- modifiers.push("option");
218
- if (step.shift)
219
- modifiers.push("shift");
220
- modifiers.push(step.key);
221
- return modifiers.join("+");
222
- }
223
311
  let nextContextSourceId = 0;
224
312
  export function useProvideCommandContext(getter) {
225
313
  const ctx = useContext(CommandContext);
@@ -232,13 +320,16 @@ export function useProvideCommandContext(getter) {
232
320
  }
233
321
  const getterRef = useRef(getter);
234
322
  getterRef.current = getter;
235
- const { contextSources } = ctx;
323
+ const { commandStore } = ctx;
236
324
  useEffect(() => {
237
325
  const id = idRef.current;
238
- contextSources.set(id, () => getterRef.current());
326
+ commandStore.store.trigger.contextSourceRegistered({
327
+ id,
328
+ getter: () => getterRef.current(),
329
+ });
239
330
  return () => {
240
- contextSources.delete(id);
331
+ commandStore.store.trigger.contextSourceUnregistered({ id });
241
332
  };
242
- }, [contextSources]);
333
+ }, [commandStore]);
243
334
  }
244
335
  //# sourceMappingURL=context.js.map
@@ -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,10 @@ 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, useCommandStore, useProvideCommandContext, useSurfaceCommands, } from "./context.js";
10
+ export { ROOT_SURFACE_ID, createCommandStore, selectActiveModalSurface, selectGroups, selectSequence, selectSurfaceCommandMap, selectSurfaceCommands, } from "./command-store.js";
11
+ export type { CommandStore, CommandStoreConfig, CommandStoreContext, CommandStoreInstance, ContextGetter, CreateCommandStoreOptions, KeyDispatchResult, SurfaceRecord, } from "./command-store.js";
12
+ export type { CommandProviderProps, CommandSurfaceProviderProps } from "./context.js";
11
13
  export { useCommand } from "./use-command.js";
12
14
  export type { UseCommandOptions } from "./use-command.js";
13
15
  export { useActions } from "./use-actions.js";
@@ -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;AACxD,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"}
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,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,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,8 @@ 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, useCommandStore, useProvideCommandContext, useSurfaceCommands, } from "./context.js";
6
+ export { ROOT_SURFACE_ID, createCommandStore, selectActiveModalSurface, selectGroups, selectSequence, selectSurfaceCommandMap, selectSurfaceCommands, } from "./command-store.js";
6
7
  export { useCommand } from "./use-command.js";
7
8
  export { useActions } from "./use-actions.js";
8
9
  //# 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":"AAcA,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,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"}
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,eAAe,EACf,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAY3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAOpE"}
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAQpE"}
package/dist/match.js CHANGED
@@ -12,6 +12,8 @@ export function matchStep(event, step) {
12
12
  return false;
13
13
  if (event.option !== step.option)
14
14
  return false;
15
+ if ((event.super ?? false) !== (step.super ?? false))
16
+ return false;
15
17
  return true;
16
18
  }
17
19
  //# sourceMappingURL=match.js.map
package/dist/match.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"match.js","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,IAAgB;IACzD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAC1C,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC9C,OAAO,IAAI,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../src/match.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,IAAgB;IACzD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAC1C,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAClE,OAAO,IAAI,CAAA;AACb,CAAC"}
package/dist/mode.d.ts CHANGED
@@ -3,8 +3,14 @@ export type Mode = "cursor" | "insert" | "select";
3
3
  export interface ModeProviderProps {
4
4
  children: ReactNode;
5
5
  initialMode?: Mode;
6
+ /**
7
+ * Internal: called synchronously whenever `setMode` changes the mode (not
8
+ * for same-value calls). Used by the command dispatcher to treat mode
9
+ * changes as transitions (sequence reset) instead of post-render repairs.
10
+ */
11
+ onModeChange?: (mode: Mode) => void;
6
12
  }
7
- export declare function ModeProvider({ children, initialMode }: ModeProviderProps): ReactNode;
13
+ export declare function ModeProvider({ children, initialMode, onModeChange, }: ModeProviderProps): ReactNode;
8
14
  export declare function useMode(): Mode;
9
15
  export declare function useSetMode(): (mode: Mode) => void;
10
16
  //# sourceMappingURL=mode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../src/mode.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjG,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AASjD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB,WAAW,CAAC,EAAE,IAAI,CAAA;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,WAAsB,EAAE,EAAE,iBAAiB,aAOnF;AAED,wBAAgB,OAAO,IAAI,IAAI,CAM9B;AAED,wBAAgB,UAAU,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAMjD"}
1
+ {"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../src/mode.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAEd,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AASjD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;CACpC;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAsB,EACtB,YAAY,GACb,EAAE,iBAAiB,aAiBnB;AAED,wBAAgB,OAAO,IAAI,IAAI,CAM9B;AAED,wBAAgB,UAAU,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAMjD"}