@tooee/choose 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.
package/dist/Choose.d.ts CHANGED
@@ -1,5 +1,15 @@
1
1
  import type { ActionDefinition } from "@tooee/commands";
2
- import type { ChooseContentProvider, ChooseOptions, ChooseResult } from "./types.js";
2
+ import type { ChooseItem, ChooseContentProvider, ChooseOptions, ChooseResult } from "./types.js";
3
+ declare module "@tooee/commands" {
4
+ interface CommandContext {
5
+ /** Contributed by Choose: the current selection state. */
6
+ choose: {
7
+ activeItem: ChooseItem | undefined;
8
+ selectedItems: ChooseItem[];
9
+ filterQuery: string;
10
+ };
11
+ }
12
+ }
3
13
  interface ChooseProps {
4
14
  contentProvider: ChooseContentProvider;
5
15
  options?: ChooseOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"Choose.d.ts","sourceRoot":"","sources":["../src/Choose.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAc,qBAAqB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGhG,UAAU,WAAW;IACnB,eAAe,EAAE,qBAAqB,CAAA;IACtC,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,sCAAsC;IACtC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IAC1C,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,WAAW,6BAiT7F"}
1
+ {"version":3,"file":"Choose.d.ts","sourceRoot":"","sources":["../src/Choose.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGhG,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,cAAc;QACtB,0DAA0D;QAC1D,MAAM,EAAE;YACN,UAAU,EAAE,UAAU,GAAG,SAAS,CAAA;YAClC,aAAa,EAAE,UAAU,EAAE,CAAA;YAC3B,WAAW,EAAE,MAAM,CAAA;SACpB,CAAA;KACF;CACF;AAED,UAAU,WAAW;IACnB,eAAe,EAAE,qBAAqB,CAAA;IACtC,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,sCAAsC;IACtC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IAC1C,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,WAAW,6BAyV7F"}
package/dist/Choose.js CHANGED
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
2
  import { useState, useEffect, useRef, useCallback, useMemo } from "react";
3
3
  import { useKeyboard } from "@opentui/react";
4
4
  import { AppLayout } from "@tooee/layout";
5
+ import { useHasOverlay, useHasModalOverlay } from "@tooee/overlays";
5
6
  import { ThemePicker, useTheme } from "@tooee/themes";
6
7
  import { useThemeCommands, useQuitCommand } from "@tooee/shell";
7
8
  import { useMode, useSetMode, useCommand, useActions, useProvideCommandContext, useCommandContext, } from "@tooee/commands";
@@ -13,21 +14,38 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
13
14
  const [activeIndex, setActiveIndex] = useState(0);
14
15
  const [selectedIndices, setSelectedIndices] = useState(new Set());
15
16
  const [loading, setLoading] = useState(true);
17
+ const [error, setError] = useState(null);
16
18
  const scrollRef = useRef(null);
17
19
  const { invoke } = useCommandContext();
18
20
  const multi = options?.multi ?? false;
19
21
  useEffect(() => {
20
22
  const result = contentProvider.load();
21
23
  if (result instanceof Promise) {
22
- result.then((loaded) => {
24
+ let active = true;
25
+ setLoading(true);
26
+ setError(null);
27
+ result
28
+ .then((loaded) => {
29
+ // Ignore stale results after contentProvider changed
30
+ if (!active)
31
+ return;
23
32
  setItems(loaded);
24
33
  setLoading(false);
34
+ })
35
+ .catch((err) => {
36
+ if (!active)
37
+ return;
38
+ setItems([]);
39
+ setError(err instanceof Error ? err.message : String(err));
40
+ setLoading(false);
25
41
  });
42
+ return () => {
43
+ active = false;
44
+ };
26
45
  }
27
- else {
28
- setItems(result);
29
- setLoading(false);
30
- }
46
+ setItems(result);
47
+ setError(null);
48
+ setLoading(false);
31
49
  }, [contentProvider]);
32
50
  // Derived state: filtered items computed from items + filterQuery (no extra render cycle)
33
51
  const filteredItems = useMemo(() => fuzzyFilter(items, filterQuery), [items, filterQuery]);
@@ -41,6 +59,8 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
41
59
  useQuitCommand({ onQuit: () => onCancel?.() });
42
60
  const mode = useMode();
43
61
  const setMode = useSetMode();
62
+ const hasOverlay = useHasOverlay();
63
+ const hasModalOverlay = useHasModalOverlay();
44
64
  // Compute selected items for context
45
65
  const getSelectedItems = useCallback(() => {
46
66
  if (multi) {
@@ -154,6 +174,12 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
154
174
  invoke,
155
175
  ]);
156
176
  useKeyboard((key) => {
177
+ // Raw useKeyboard handlers subscribe before the command dispatcher, so
178
+ // preventDefault/surface arbitration cannot protect them. While any
179
+ // overlay (e.g. the theme picker) is open, its modal command surface owns
180
+ // input and this handler must stand down.
181
+ if (hasOverlay)
182
+ return;
157
183
  if (key.name === "escape") {
158
184
  if (mode === "insert") {
159
185
  // Switch to cursor mode (allows theme switching, quit, etc.)
@@ -201,6 +227,9 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
201
227
  if (loading) {
202
228
  return (_jsx("box", { children: _jsx("text", { content: "Loading...", fg: theme.textMuted }) }));
203
229
  }
230
+ if (error) {
231
+ return (_jsx("box", { children: _jsx("text", { content: `Error: ${error}`, fg: theme.error }) }));
232
+ }
204
233
  const selectedCount = selectedIndices.size;
205
234
  const hintParts = mode === "insert"
206
235
  ? ["↑↓ navigate", "Enter confirm", "Esc commands"]
@@ -220,7 +249,17 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
220
249
  }, scrollRef: scrollRef, scrollProps: { focused: false }, overlay: themePicker.isOpen ? (_jsx(ThemePicker, { entries: themePicker.entries, currentTheme: themeName, onSelect: themePicker.confirm, onClose: themePicker.close, onNavigate: themePicker.preview })) : undefined, children: _jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: "row", height: 1, style: { paddingLeft: 1, paddingRight: 1 }, children: [_jsx("text", { content: "> ", fg: theme.accent }), _jsx("input", { focused: mode === "insert", placeholder: options?.placeholder ?? "Filter...", onInput: setFilterQuery, backgroundColor: "transparent", textColor: theme.text, placeholderColor: theme.textMuted, cursorColor: theme.primary, style: { flexGrow: 1 } }), _jsx("text", { content: ` ${filteredItems.length}/${items.length}`, fg: theme.textMuted })] }), filteredItems.length === 0 && !loading && options?.emptyMessage && (_jsx("box", { height: 1, style: { paddingLeft: 2, paddingTop: 1 }, children: _jsx("text", { content: options.emptyMessage, fg: theme.textMuted }) })), filteredItems.map((match, idx) => {
221
250
  const isActive = idx === activeIndex;
222
251
  const isSelected = selectedIndices.has(match.originalIndex);
223
- return (_jsxs("box", { flexDirection: "row", height: 1, backgroundColor: isActive ? theme.backgroundElement : undefined, style: { paddingLeft: 1 }, children: [multi && (_jsx("text", { content: isSelected ? "✓ " : " ", fg: isSelected ? theme.accent : theme.textMuted })), match.item.icon && _jsx("text", { content: `${match.item.icon} `, fg: theme.textMuted }), _jsx("text", { fg: isActive ? theme.primary : theme.text, children: renderHighlightedText(match.item.text, match.positions, theme.warning) }), match.item.description && (_jsx("text", { content: ` ${match.item.description}`, fg: theme.textMuted }))] }, match.originalIndex));
252
+ return (_jsxs("box", { flexDirection: "row", height: 1, backgroundColor: isActive ? theme.backgroundElement : undefined, style: { paddingLeft: 1 }, onMouseDown: (event) => {
253
+ // Like the raw keyboard handler above, row clicks must stand
254
+ // down while a modal overlay (e.g. the theme picker) is up:
255
+ // centered overlays leave clickable margins around them, and
256
+ // mouse events route through the hit-grid, bypassing
257
+ // command-surface arbitration entirely.
258
+ if (hasModalOverlay)
259
+ return;
260
+ if (event.button === 0)
261
+ setActiveIndex(idx);
262
+ }, children: [multi && (_jsx("text", { content: isSelected ? "✓ " : " ", fg: isSelected ? theme.accent : theme.textMuted })), match.item.icon && _jsx("text", { content: `${match.item.icon} `, fg: theme.textMuted }), _jsx("text", { fg: isActive ? theme.primary : theme.text, children: renderHighlightedText(match.item.text, match.positions, theme.warning) }), match.item.description && (_jsx("text", { content: ` ${match.item.description}`, fg: theme.textMuted }))] }, match.originalIndex));
224
263
  })] }) }));
225
264
  }
226
265
  function renderHighlightedText(text, positions, highlightColor) {
@@ -1 +1 @@
1
- {"version":3,"file":"Choose.js","sourceRoot":"","sources":["../src/Choose.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Choose.js","sourceRoot":"","sources":["../src/Choose.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChooseOverlay.d.ts","sourceRoot":"","sources":["../src/ChooseOverlay.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG5C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EAAE,aAAa,EACpB,MAAM,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,6BAsLpB"}
1
+ {"version":3,"file":"ChooseOverlay.d.ts","sourceRoot":"","sources":["../src/ChooseOverlay.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG5C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACnD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EAAE,aAAa,EACpB,MAAM,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,6BAoQpB"}
@@ -1,8 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
2
  import { useState, useEffect, useRef, useCallback, useMemo } from "react";
3
- import { useKeyboard } from "@opentui/react";
4
- import { useTheme } from "@tooee/themes";
5
- import { useMode, useSetMode } from "@tooee/commands";
3
+ import { useTheme, CloseButton } from "@tooee/themes";
4
+ import { useCommand, useMode, useSetMode } from "@tooee/commands";
6
5
  import { fuzzyFilter } from "./fuzzy.js";
7
6
  export function ChooseOverlay({ items: itemsOrLoader, prompt, placeholder, emptyMessage, onSelect, onCancel, }) {
8
7
  const { theme } = useTheme();
@@ -10,16 +9,34 @@ export function ChooseOverlay({ items: itemsOrLoader, prompt, placeholder, empty
10
9
  const setMode = useSetMode();
11
10
  const [items, setItems] = useState(Array.isArray(itemsOrLoader) ? itemsOrLoader : []);
12
11
  const [loading, setLoading] = useState(!Array.isArray(itemsOrLoader));
12
+ const [error, setError] = useState(null);
13
13
  const [filterQuery, setFilterQuery] = useState("");
14
14
  const [activeIndex, setActiveIndex] = useState(0);
15
15
  const scrollRef = useRef(null);
16
16
  // Load items if async loader provided
17
17
  useEffect(() => {
18
18
  if (typeof itemsOrLoader === "function") {
19
- itemsOrLoader().then((loaded) => {
19
+ let active = true;
20
+ setLoading(true);
21
+ setError(null);
22
+ itemsOrLoader()
23
+ .then((loaded) => {
24
+ // Ignore stale results after itemsOrLoader changed
25
+ if (!active)
26
+ return;
20
27
  setItems(loaded);
21
28
  setLoading(false);
29
+ })
30
+ .catch((err) => {
31
+ if (!active)
32
+ return;
33
+ setItems([]);
34
+ setError(err instanceof Error ? err.message : String(err));
35
+ setLoading(false);
22
36
  });
37
+ return () => {
38
+ active = false;
39
+ };
23
40
  }
24
41
  }, [itemsOrLoader]);
25
42
  // Filtered items via fuzzy matching
@@ -42,49 +59,96 @@ export function ChooseOverlay({ items: itemsOrLoader, prompt, placeholder, empty
42
59
  onSelect(match.item);
43
60
  }
44
61
  }, [filteredItems, activeIndex, onSelect]);
45
- useKeyboard((key) => {
46
- if (key.name === "escape") {
47
- key.preventDefault();
48
- if (mode === "insert") {
49
- setMode("cursor");
50
- }
51
- else {
52
- onCancel();
53
- }
54
- return;
55
- }
56
- if (mode === "cursor") {
57
- if (key.raw === "i" || key.raw === "a") {
58
- key.preventDefault();
59
- setMode("insert");
60
- return;
61
- }
62
- if (key.raw === "j") {
63
- key.preventDefault();
64
- moveDown();
65
- return;
66
- }
67
- if (key.raw === "k") {
68
- key.preventDefault();
69
- moveUp();
70
- return;
71
- }
72
- }
73
- if (key.name === "return") {
74
- key.preventDefault();
75
- confirm();
76
- return;
77
- }
78
- if (key.name === "up" || (key.ctrl && key.name === "p")) {
79
- key.preventDefault();
80
- moveUp();
81
- return;
62
+ const leaveInsertModeOrCancel = useCallback(() => {
63
+ if (mode === "insert") {
64
+ setMode("cursor");
82
65
  }
83
- if (key.name === "down" || (key.ctrl && key.name === "n")) {
84
- key.preventDefault();
85
- moveDown();
86
- return;
66
+ else {
67
+ onCancel();
87
68
  }
69
+ }, [mode, onCancel, setMode]);
70
+ const enterInsertMode = useCallback(() => {
71
+ setMode("insert");
72
+ }, [setMode]);
73
+ useCommand({
74
+ id: "choose-overlay:escape",
75
+ title: "Back / cancel",
76
+ hotkey: "Escape",
77
+ modes: ["insert", "cursor"],
78
+ hidden: true,
79
+ handler: leaveInsertModeOrCancel,
80
+ });
81
+ useCommand({
82
+ id: "choose-overlay:insert-mode-i",
83
+ title: "Insert mode",
84
+ hotkey: "i",
85
+ modes: ["cursor"],
86
+ hidden: true,
87
+ handler: enterInsertMode,
88
+ });
89
+ useCommand({
90
+ id: "choose-overlay:insert-mode-a",
91
+ title: "Insert mode",
92
+ hotkey: "a",
93
+ modes: ["cursor"],
94
+ hidden: true,
95
+ handler: enterInsertMode,
96
+ });
97
+ useCommand({
98
+ id: "choose-overlay:move-down-vim",
99
+ title: "Move down",
100
+ hotkey: "j",
101
+ modes: ["cursor"],
102
+ hidden: true,
103
+ handler: moveDown,
104
+ });
105
+ useCommand({
106
+ id: "choose-overlay:move-up-vim",
107
+ title: "Move up",
108
+ hotkey: "k",
109
+ modes: ["cursor"],
110
+ hidden: true,
111
+ handler: moveUp,
112
+ });
113
+ useCommand({
114
+ id: "choose-overlay:confirm",
115
+ title: "Confirm",
116
+ hotkey: "Enter",
117
+ modes: ["insert", "cursor"],
118
+ hidden: true,
119
+ handler: confirm,
120
+ });
121
+ useCommand({
122
+ id: "choose-overlay:move-up",
123
+ title: "Move up",
124
+ hotkey: "up",
125
+ modes: ["insert", "cursor"],
126
+ hidden: true,
127
+ handler: moveUp,
128
+ });
129
+ useCommand({
130
+ id: "choose-overlay:move-up-ctrl-p",
131
+ title: "Move up",
132
+ hotkey: "ctrl+p",
133
+ modes: ["insert", "cursor"],
134
+ hidden: true,
135
+ handler: moveUp,
136
+ });
137
+ useCommand({
138
+ id: "choose-overlay:move-down",
139
+ title: "Move down",
140
+ hotkey: "down",
141
+ modes: ["insert", "cursor"],
142
+ hidden: true,
143
+ handler: moveDown,
144
+ });
145
+ useCommand({
146
+ id: "choose-overlay:move-down-ctrl-n",
147
+ title: "Move down",
148
+ hotkey: "ctrl+n",
149
+ modes: ["insert", "cursor"],
150
+ hidden: true,
151
+ handler: moveDown,
88
152
  });
89
153
  // Auto-scroll to keep active item visible
90
154
  useEffect(() => {
@@ -93,9 +157,18 @@ export function ChooseOverlay({ items: itemsOrLoader, prompt, placeholder, empty
93
157
  }
94
158
  }, [activeIndex, filteredItems.length]);
95
159
  const hintText = mode === "insert" ? "Enter confirm Esc commands" : "j/k navigate i insert Esc cancel";
96
- return (_jsxs("box", { position: "absolute", left: "20%", right: "20%", top: "20%", bottom: "20%", flexDirection: "column", backgroundColor: theme.backgroundPanel, border: true, borderColor: theme.borderActive, children: [prompt && (_jsx("box", { height: 1, paddingLeft: 1, paddingRight: 1, backgroundColor: theme.backgroundElement, children: _jsx("text", { content: prompt, fg: theme.accent }) })), _jsxs("box", { flexDirection: "row", height: 1, style: { paddingLeft: 1, paddingRight: 1 }, children: [_jsx("text", { content: "> ", fg: theme.accent }), _jsx("input", { focused: mode === "insert", placeholder: placeholder ?? "Filter...", onInput: setFilterQuery, backgroundColor: "transparent", textColor: theme.text, placeholderColor: theme.textMuted, cursorColor: theme.primary, style: { flexGrow: 1 } }), _jsx("text", { content: ` ${filteredItems.length}/${items.length}`, fg: theme.textMuted })] }), _jsxs("scrollbox", { ref: scrollRef, flexDirection: "column", style: { flexGrow: 1 }, focused: false, children: [loading && (_jsx("box", { height: 1, style: { paddingLeft: 2 }, children: _jsx("text", { content: "Loading...", fg: theme.textMuted }) })), !loading && filteredItems.length === 0 && emptyMessage && (_jsx("box", { height: 1, style: { paddingLeft: 2 }, children: _jsx("text", { content: emptyMessage, fg: theme.textMuted }) })), filteredItems.map((match, idx) => {
160
+ return (_jsxs("box", { position: "absolute", left: "20%", right: "20%", top: "20%", bottom: "20%", flexDirection: "column", backgroundColor: theme.backgroundPanel, border: true, borderColor: theme.borderActive, children: [prompt && (_jsx("box", { height: 1, paddingLeft: 1, paddingRight: 1, backgroundColor: theme.backgroundElement, children: _jsx("text", { content: prompt, fg: theme.accent }) })), _jsxs("box", { flexDirection: "row", height: 1, style: { paddingLeft: 1, paddingRight: 1 }, children: [_jsx("text", { content: "> ", fg: theme.accent }), _jsx("input", { focused: mode === "insert", placeholder: placeholder ?? "Filter...", onInput: setFilterQuery, backgroundColor: "transparent", textColor: theme.text, placeholderColor: theme.textMuted, cursorColor: theme.primary, style: { flexGrow: 1 } }), _jsx("text", { content: ` ${filteredItems.length}/${items.length}`, fg: theme.textMuted }), _jsx(CloseButton, { onClose: onCancel })] }), _jsxs("scrollbox", { ref: scrollRef, flexDirection: "column", style: { flexGrow: 1 }, focused: false, children: [loading && (_jsx("box", { height: 1, style: { paddingLeft: 2 }, children: _jsx("text", { content: "Loading...", fg: theme.textMuted }) })), !loading && error && (_jsx("box", { height: 1, style: { paddingLeft: 2 }, children: _jsx("text", { content: `Error: ${error}`, fg: theme.error }) })), !loading && !error && filteredItems.length === 0 && emptyMessage && (_jsx("box", { height: 1, style: { paddingLeft: 2 }, children: _jsx("text", { content: emptyMessage, fg: theme.textMuted }) })), filteredItems.map((match, idx) => {
97
161
  const isActive = idx === activeIndex;
98
- return (_jsxs("box", { flexDirection: "row", height: 1, backgroundColor: isActive ? theme.backgroundElement : undefined, style: { paddingLeft: 1 }, children: [match.item.icon && _jsx("text", { content: `${match.item.icon} `, fg: theme.textMuted }), _jsx("text", { fg: isActive ? theme.primary : theme.text, children: renderHighlightedText(match.item.text, match.positions, theme.warning) }), match.item.description && (_jsx("text", { content: ` ${match.item.description}`, fg: theme.textMuted }))] }, match.originalIndex));
162
+ return (_jsxs("box", { flexDirection: "row", height: 1, backgroundColor: isActive ? theme.backgroundElement : undefined, style: { paddingLeft: 1 }, onMouseDown: (event) => {
163
+ // Left-click picks the item — same code path as Enter confirm.
164
+ // (Standalone Choose keeps click-to-highlight; a modal picker
165
+ // overlay follows menu semantics like ContextMenu instead.)
166
+ if (event.button !== 0)
167
+ return;
168
+ event.preventDefault();
169
+ event.stopPropagation();
170
+ onSelect(match.item);
171
+ }, children: [match.item.icon && _jsx("text", { content: `${match.item.icon} `, fg: theme.textMuted }), _jsx("text", { fg: isActive ? theme.primary : theme.text, children: renderHighlightedText(match.item.text, match.positions, theme.warning) }), match.item.description && (_jsx("text", { content: ` ${match.item.description}`, fg: theme.textMuted }))] }, match.originalIndex));
99
172
  })] }), _jsx("box", { height: 1, paddingLeft: 1, paddingRight: 1, backgroundColor: theme.backgroundElement, children: _jsx("text", { content: hintText, fg: theme.textMuted }) })] }));
100
173
  }
101
174
  function renderHighlightedText(text, positions, highlightColor) {
@@ -1 +1 @@
1
- {"version":3,"file":"ChooseOverlay.js","sourceRoot":"","sources":["../src/ChooseOverlay.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChooseOverlay.js","sourceRoot":"","sources":["../src/ChooseOverlay.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAEzE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAWxC,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EAAE,aAAa,EACpB,MAAM,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,GACW;IACnB,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAE5B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAChC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAClD,CAAA;IACD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAA;IAEnD,sCAAsC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,IAAI,MAAM,GAAG,IAAI,CAAA;YACjB,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,aAAa,EAAE;iBACZ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,mDAAmD;gBACnD,IAAI,CAAC,MAAM;oBAAE,OAAM;gBACnB,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAChB,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACtB,IAAI,CAAC,MAAM;oBAAE,OAAM;gBACnB,QAAQ,CAAC,EAAE,CAAC,CAAA;gBACZ,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC1D,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,CAAC,CAAA;YACJ,OAAO,GAAG,EAAE;gBACV,MAAM,GAAG,KAAK,CAAA;YAChB,CAAC,CAAA;QACH,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,oCAAoC;IACpC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;IAE1F,wCAAwC;IACxC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1D,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QACpC,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAC/B,cAAc,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IAE1B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE1C,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,QAAQ,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,QAAQ,EAAE,CAAA;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IAE7B,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,UAAU,CAAC;QACT,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,uBAAuB;KACjC,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,8BAA8B;QAClC,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,eAAe;KACzB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,8BAA8B;QAClC,KAAK,EAAE,aAAa;QACpB,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,eAAe;KACzB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,8BAA8B;QAClC,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,4BAA4B;QAChC,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,CAAC,QAAQ,CAAC;QACjB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,+BAA+B;QACnC,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAA;IACF,UAAU,CAAC;QACT,EAAE,EAAE,iCAAiC;QACrC,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC3B,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAA;IAEF,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,SAAS,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IAEvC,MAAM,QAAQ,GACZ,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,oCAAoC,CAAA;IAE1F,OAAO,CACL,eACE,QAAQ,EAAC,UAAU,EACnB,IAAI,EAAC,KAAK,EACV,KAAK,EAAC,KAAK,EACX,GAAG,EAAC,KAAK,EACT,MAAM,EAAC,KAAK,EACZ,aAAa,EAAC,QAAQ,EACtB,eAAe,EAAE,KAAK,CAAC,eAAe,EACtC,MAAM,QACN,WAAW,EAAE,KAAK,CAAC,YAAY,aAG9B,MAAM,IAAI,CACT,cAAK,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,iBAAiB,YACvF,eAAM,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,GAAI,GACvC,CACP,EAGD,eAAK,aAAa,EAAC,KAAK,EAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAC5E,eAAM,OAAO,EAAC,IAAI,EAAC,EAAE,EAAE,KAAK,CAAC,MAAM,GAAI,EACvC,gBACE,OAAO,EAAE,IAAI,KAAK,QAAQ,EAC1B,WAAW,EAAE,WAAW,IAAI,WAAW,EACvC,OAAO,EAAE,cAAc,EACvB,eAAe,EAAC,aAAa,EAC7B,SAAS,EAAE,KAAK,CAAC,IAAI,EACrB,gBAAgB,EAAE,KAAK,CAAC,SAAS,EACjC,WAAW,EAAE,KAAK,CAAC,OAAO,EAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GACtB,EACF,eAAM,OAAO,EAAE,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,EAClF,KAAC,WAAW,IAAC,OAAO,EAAE,QAAQ,GAAI,IAC9B,EAGN,qBAAW,GAAG,EAAE,SAAS,EAAE,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,aACrF,OAAO,IAAI,CACV,cAAK,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YACvC,eAAM,OAAO,EAAC,YAAY,EAAC,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,GAC9C,CACP,EAEA,CAAC,OAAO,IAAI,KAAK,IAAI,CACpB,cAAK,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YACvC,eAAM,OAAO,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,GAAI,GACjD,CACP,EAEA,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,IAAI,CACnE,cAAK,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YACvC,eAAM,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,GAChD,CACP,EAEA,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;wBAChC,MAAM,QAAQ,GAAG,GAAG,KAAK,WAAW,CAAA;wBACpC,OAAO,CACL,eAEE,aAAa,EAAC,KAAK,EACnB,MAAM,EAAE,CAAC,EACT,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EAC/D,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EACzB,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;gCACrB,+DAA+D;gCAC/D,8DAA8D;gCAC9D,4DAA4D;gCAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oCAAE,OAAM;gCAC9B,KAAK,CAAC,cAAc,EAAE,CAAA;gCACtB,KAAK,CAAC,eAAe,EAAE,CAAA;gCACvB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;4BACtB,CAAC,aAEA,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,eAAM,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,EACjF,eAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,YAC5C,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAClE,EACN,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CACzB,eAAM,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,CACtE,KArBI,KAAK,CAAC,aAAa,CAsBpB,CACP,CAAA;oBACH,CAAC,CAAC,IACQ,EAGZ,cAAK,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,iBAAiB,YACvF,eAAM,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,GAC5C,IACF,CACP,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,SAAmB,EAAE,cAAsB;IACtF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;IACjC,MAAM,KAAK,GAAgD,EAAE,CAAA;IAC7D,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,gBAAgB,GAAG,WAAW,CAAA;YAC9B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;aAAM,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YAC5C,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;YAC1D,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,gBAAgB,GAAG,WAAW,CAAA;QAChC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CACf,eAAc,EAAE,EAAE,cAAc,YAC7B,IAAI,CAAC,IAAI,IADD,CAAC,CAEL,CACR,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,IAAI,CACV,CACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tooee/choose",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "Terminal selection with fuzzy filtering",
5
5
  "keywords": [
6
6
  "cli",
@@ -37,11 +37,12 @@
37
37
  "typecheck": "tsc --noEmit"
38
38
  },
39
39
  "dependencies": {
40
- "@tooee/commands": "0.1.19",
41
- "@tooee/fuzzy": "0.1.19",
42
- "@tooee/layout": "0.1.19",
43
- "@tooee/shell": "0.1.19",
44
- "@tooee/themes": "0.1.19"
40
+ "@tooee/commands": "0.1.21",
41
+ "@tooee/fuzzy": "0.1.21",
42
+ "@tooee/layout": "0.1.21",
43
+ "@tooee/overlays": "0.1.21",
44
+ "@tooee/shell": "0.1.21",
45
+ "@tooee/themes": "0.1.21"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@opentui/core": "^0.2.15",
package/src/Choose.tsx CHANGED
@@ -2,6 +2,7 @@ import { useState, useEffect, useRef, useCallback, useMemo } from "react"
2
2
  import type { ScrollBoxRenderable } from "@opentui/core"
3
3
  import { useKeyboard } from "@opentui/react"
4
4
  import { AppLayout } from "@tooee/layout"
5
+ import { useHasOverlay, useHasModalOverlay } from "@tooee/overlays"
5
6
  import { ThemePicker, useTheme } from "@tooee/themes"
6
7
  import { useThemeCommands, useQuitCommand } from "@tooee/shell"
7
8
  import {
@@ -16,6 +17,17 @@ import type { ActionDefinition } from "@tooee/commands"
16
17
  import type { ChooseItem, ChooseContentProvider, ChooseOptions, ChooseResult } from "./types.js"
17
18
  import { fuzzyFilter } from "./fuzzy.js"
18
19
 
20
+ declare module "@tooee/commands" {
21
+ interface CommandContext {
22
+ /** Contributed by Choose: the current selection state. */
23
+ choose: {
24
+ activeItem: ChooseItem | undefined
25
+ selectedItems: ChooseItem[]
26
+ filterQuery: string
27
+ }
28
+ }
29
+ }
30
+
19
31
  interface ChooseProps {
20
32
  contentProvider: ChooseContentProvider
21
33
  options?: ChooseOptions
@@ -33,6 +45,7 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
33
45
  const [activeIndex, setActiveIndex] = useState(0)
34
46
  const [selectedIndices, setSelectedIndices] = useState<Set<number>>(new Set())
35
47
  const [loading, setLoading] = useState(true)
48
+ const [error, setError] = useState<string | null>(null)
36
49
  const scrollRef = useRef<ScrollBoxRenderable>(null)
37
50
  const { invoke } = useCommandContext()
38
51
 
@@ -41,14 +54,29 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
41
54
  useEffect(() => {
42
55
  const result = contentProvider.load()
43
56
  if (result instanceof Promise) {
44
- result.then((loaded) => {
45
- setItems(loaded)
46
- setLoading(false)
47
- })
48
- } else {
49
- setItems(result)
50
- setLoading(false)
57
+ let active = true
58
+ setLoading(true)
59
+ setError(null)
60
+ result
61
+ .then((loaded) => {
62
+ // Ignore stale results after contentProvider changed
63
+ if (!active) return
64
+ setItems(loaded)
65
+ setLoading(false)
66
+ })
67
+ .catch((err: unknown) => {
68
+ if (!active) return
69
+ setItems([])
70
+ setError(err instanceof Error ? err.message : String(err))
71
+ setLoading(false)
72
+ })
73
+ return () => {
74
+ active = false
75
+ }
51
76
  }
77
+ setItems(result)
78
+ setError(null)
79
+ setLoading(false)
52
80
  }, [contentProvider])
53
81
 
54
82
  // Derived state: filtered items computed from items + filterQuery (no extra render cycle)
@@ -65,6 +93,8 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
65
93
  useQuitCommand({ onQuit: () => onCancel?.() })
66
94
  const mode = useMode()
67
95
  const setMode = useSetMode()
96
+ const hasOverlay = useHasOverlay()
97
+ const hasModalOverlay = useHasModalOverlay()
68
98
 
69
99
  // Compute selected items for context
70
100
  const getSelectedItems = useCallback((): ChooseItem[] => {
@@ -187,6 +217,11 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
187
217
  ])
188
218
 
189
219
  useKeyboard((key) => {
220
+ // Raw useKeyboard handlers subscribe before the command dispatcher, so
221
+ // preventDefault/surface arbitration cannot protect them. While any
222
+ // overlay (e.g. the theme picker) is open, its modal command surface owns
223
+ // input and this handler must stand down.
224
+ if (hasOverlay) return
190
225
  if (key.name === "escape") {
191
226
  if (mode === "insert") {
192
227
  // Switch to cursor mode (allows theme switching, quit, etc.)
@@ -239,6 +274,14 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
239
274
  )
240
275
  }
241
276
 
277
+ if (error) {
278
+ return (
279
+ <box>
280
+ <text content={`Error: ${error}`} fg={theme.error} />
281
+ </box>
282
+ )
283
+ }
284
+
242
285
  const selectedCount = selectedIndices.size
243
286
  const hintParts =
244
287
  mode === "insert"
@@ -311,6 +354,15 @@ export function Choose({ contentProvider, options, actions, onConfirm, onCancel
311
354
  height={1}
312
355
  backgroundColor={isActive ? theme.backgroundElement : undefined}
313
356
  style={{ paddingLeft: 1 }}
357
+ onMouseDown={(event) => {
358
+ // Like the raw keyboard handler above, row clicks must stand
359
+ // down while a modal overlay (e.g. the theme picker) is up:
360
+ // centered overlays leave clickable margins around them, and
361
+ // mouse events route through the hit-grid, bypassing
362
+ // command-surface arbitration entirely.
363
+ if (hasModalOverlay) return
364
+ if (event.button === 0) setActiveIndex(idx)
365
+ }}
314
366
  >
315
367
  {multi && (
316
368
  <text
@@ -1,8 +1,7 @@
1
1
  import { useState, useEffect, useRef, useCallback, useMemo } from "react"
2
2
  import type { ScrollBoxRenderable } from "@opentui/core"
3
- import { useKeyboard } from "@opentui/react"
4
- import { useTheme } from "@tooee/themes"
5
- import { useMode, useSetMode } from "@tooee/commands"
3
+ import { useTheme, CloseButton } from "@tooee/themes"
4
+ import { useCommand, useMode, useSetMode } from "@tooee/commands"
6
5
  import type { ChooseItem } from "./types.js"
7
6
  import { fuzzyFilter } from "./fuzzy.js"
8
7
 
@@ -31,6 +30,7 @@ export function ChooseOverlay({
31
30
  Array.isArray(itemsOrLoader) ? itemsOrLoader : [],
32
31
  )
33
32
  const [loading, setLoading] = useState(!Array.isArray(itemsOrLoader))
33
+ const [error, setError] = useState<string | null>(null)
34
34
  const [filterQuery, setFilterQuery] = useState("")
35
35
  const [activeIndex, setActiveIndex] = useState(0)
36
36
  const scrollRef = useRef<ScrollBoxRenderable>(null)
@@ -38,10 +38,25 @@ export function ChooseOverlay({
38
38
  // Load items if async loader provided
39
39
  useEffect(() => {
40
40
  if (typeof itemsOrLoader === "function") {
41
- itemsOrLoader().then((loaded) => {
42
- setItems(loaded)
43
- setLoading(false)
44
- })
41
+ let active = true
42
+ setLoading(true)
43
+ setError(null)
44
+ itemsOrLoader()
45
+ .then((loaded) => {
46
+ // Ignore stale results after itemsOrLoader changed
47
+ if (!active) return
48
+ setItems(loaded)
49
+ setLoading(false)
50
+ })
51
+ .catch((err: unknown) => {
52
+ if (!active) return
53
+ setItems([])
54
+ setError(err instanceof Error ? err.message : String(err))
55
+ setLoading(false)
56
+ })
57
+ return () => {
58
+ active = false
59
+ }
45
60
  }
46
61
  }, [itemsOrLoader])
47
62
 
@@ -70,51 +85,97 @@ export function ChooseOverlay({
70
85
  }
71
86
  }, [filteredItems, activeIndex, onSelect])
72
87
 
73
- useKeyboard((key) => {
74
- if (key.name === "escape") {
75
- key.preventDefault()
76
- if (mode === "insert") {
77
- setMode("cursor")
78
- } else {
79
- onCancel()
80
- }
81
- return
82
- }
83
-
84
- if (mode === "cursor") {
85
- if (key.raw === "i" || key.raw === "a") {
86
- key.preventDefault()
87
- setMode("insert")
88
- return
89
- }
90
- if (key.raw === "j") {
91
- key.preventDefault()
92
- moveDown()
93
- return
94
- }
95
- if (key.raw === "k") {
96
- key.preventDefault()
97
- moveUp()
98
- return
99
- }
88
+ const leaveInsertModeOrCancel = useCallback(() => {
89
+ if (mode === "insert") {
90
+ setMode("cursor")
91
+ } else {
92
+ onCancel()
100
93
  }
94
+ }, [mode, onCancel, setMode])
101
95
 
102
- if (key.name === "return") {
103
- key.preventDefault()
104
- confirm()
105
- return
106
- }
96
+ const enterInsertMode = useCallback(() => {
97
+ setMode("insert")
98
+ }, [setMode])
107
99
 
108
- if (key.name === "up" || (key.ctrl && key.name === "p")) {
109
- key.preventDefault()
110
- moveUp()
111
- return
112
- }
113
- if (key.name === "down" || (key.ctrl && key.name === "n")) {
114
- key.preventDefault()
115
- moveDown()
116
- return
117
- }
100
+ useCommand({
101
+ id: "choose-overlay:escape",
102
+ title: "Back / cancel",
103
+ hotkey: "Escape",
104
+ modes: ["insert", "cursor"],
105
+ hidden: true,
106
+ handler: leaveInsertModeOrCancel,
107
+ })
108
+ useCommand({
109
+ id: "choose-overlay:insert-mode-i",
110
+ title: "Insert mode",
111
+ hotkey: "i",
112
+ modes: ["cursor"],
113
+ hidden: true,
114
+ handler: enterInsertMode,
115
+ })
116
+ useCommand({
117
+ id: "choose-overlay:insert-mode-a",
118
+ title: "Insert mode",
119
+ hotkey: "a",
120
+ modes: ["cursor"],
121
+ hidden: true,
122
+ handler: enterInsertMode,
123
+ })
124
+ useCommand({
125
+ id: "choose-overlay:move-down-vim",
126
+ title: "Move down",
127
+ hotkey: "j",
128
+ modes: ["cursor"],
129
+ hidden: true,
130
+ handler: moveDown,
131
+ })
132
+ useCommand({
133
+ id: "choose-overlay:move-up-vim",
134
+ title: "Move up",
135
+ hotkey: "k",
136
+ modes: ["cursor"],
137
+ hidden: true,
138
+ handler: moveUp,
139
+ })
140
+ useCommand({
141
+ id: "choose-overlay:confirm",
142
+ title: "Confirm",
143
+ hotkey: "Enter",
144
+ modes: ["insert", "cursor"],
145
+ hidden: true,
146
+ handler: confirm,
147
+ })
148
+ useCommand({
149
+ id: "choose-overlay:move-up",
150
+ title: "Move up",
151
+ hotkey: "up",
152
+ modes: ["insert", "cursor"],
153
+ hidden: true,
154
+ handler: moveUp,
155
+ })
156
+ useCommand({
157
+ id: "choose-overlay:move-up-ctrl-p",
158
+ title: "Move up",
159
+ hotkey: "ctrl+p",
160
+ modes: ["insert", "cursor"],
161
+ hidden: true,
162
+ handler: moveUp,
163
+ })
164
+ useCommand({
165
+ id: "choose-overlay:move-down",
166
+ title: "Move down",
167
+ hotkey: "down",
168
+ modes: ["insert", "cursor"],
169
+ hidden: true,
170
+ handler: moveDown,
171
+ })
172
+ useCommand({
173
+ id: "choose-overlay:move-down-ctrl-n",
174
+ title: "Move down",
175
+ hotkey: "ctrl+n",
176
+ modes: ["insert", "cursor"],
177
+ hidden: true,
178
+ handler: moveDown,
118
179
  })
119
180
 
120
181
  // Auto-scroll to keep active item visible
@@ -160,6 +221,7 @@ export function ChooseOverlay({
160
221
  style={{ flexGrow: 1 }}
161
222
  />
162
223
  <text content={` ${filteredItems.length}/${items.length}`} fg={theme.textMuted} />
224
+ <CloseButton onClose={onCancel} />
163
225
  </box>
164
226
 
165
227
  {/* Scrollable item list */}
@@ -170,7 +232,13 @@ export function ChooseOverlay({
170
232
  </box>
171
233
  )}
172
234
 
173
- {!loading && filteredItems.length === 0 && emptyMessage && (
235
+ {!loading && error && (
236
+ <box height={1} style={{ paddingLeft: 2 }}>
237
+ <text content={`Error: ${error}`} fg={theme.error} />
238
+ </box>
239
+ )}
240
+
241
+ {!loading && !error && filteredItems.length === 0 && emptyMessage && (
174
242
  <box height={1} style={{ paddingLeft: 2 }}>
175
243
  <text content={emptyMessage} fg={theme.textMuted} />
176
244
  </box>
@@ -185,6 +253,15 @@ export function ChooseOverlay({
185
253
  height={1}
186
254
  backgroundColor={isActive ? theme.backgroundElement : undefined}
187
255
  style={{ paddingLeft: 1 }}
256
+ onMouseDown={(event) => {
257
+ // Left-click picks the item — same code path as Enter confirm.
258
+ // (Standalone Choose keeps click-to-highlight; a modal picker
259
+ // overlay follows menu semantics like ContextMenu instead.)
260
+ if (event.button !== 0) return
261
+ event.preventDefault()
262
+ event.stopPropagation()
263
+ onSelect(match.item)
264
+ }}
188
265
  >
189
266
  {match.item.icon && <text content={`${match.item.icon} `} fg={theme.textMuted} />}
190
267
  <text fg={isActive ? theme.primary : theme.text}>