@tooee/choose 0.1.22 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -2
- package/dist/Choose.d.ts +14 -17
- package/dist/Choose.d.ts.map +1 -1
- package/dist/Choose.js +42 -266
- package/dist/Choose.js.map +1 -1
- package/dist/ChooseFilter.d.ts +12 -0
- package/dist/ChooseFilter.d.ts.map +1 -0
- package/dist/ChooseFilter.js +9 -0
- package/dist/ChooseFilter.js.map +1 -0
- package/dist/ChooseHighlightedText.d.ts +9 -0
- package/dist/ChooseHighlightedText.d.ts.map +1 -0
- package/dist/ChooseHighlightedText.js +30 -0
- package/dist/ChooseHighlightedText.js.map +1 -0
- package/dist/ChooseList.d.ts +28 -0
- package/dist/ChooseList.d.ts.map +1 -0
- package/dist/ChooseList.js +51 -0
- package/dist/ChooseList.js.map +1 -0
- package/dist/ChooseOverlay.d.ts +34 -5
- package/dist/ChooseOverlay.d.ts.map +1 -1
- package/dist/ChooseOverlay.js +29 -200
- package/dist/ChooseOverlay.js.map +1 -1
- package/dist/ChoosePanel.d.ts +30 -0
- package/dist/ChoosePanel.d.ts.map +1 -0
- package/dist/ChoosePanel.js +25 -0
- package/dist/ChoosePanel.js.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/source.d.ts +5 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +12 -0
- package/dist/source.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/use-choose.d.ts +80 -0
- package/dist/use-choose.d.ts.map +1 -0
- package/dist/use-choose.js +365 -0
- package/dist/use-choose.js.map +1 -0
- package/package.json +11 -11
- package/src/Choose.tsx +68 -355
- package/src/ChooseFilter.tsx +45 -0
- package/src/ChooseHighlightedText.tsx +42 -0
- package/src/ChooseList.tsx +137 -0
- package/src/ChooseOverlay.tsx +73 -307
- package/src/ChoosePanel.tsx +123 -0
- package/src/index.ts +26 -1
- package/src/source.ts +12 -0
- package/src/types.ts +6 -0
- package/src/use-choose.ts +479 -0
package/README.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @tooee/choose
|
|
2
2
|
|
|
3
|
-
Terminal selection with fuzzy filtering.
|
|
3
|
+
Terminal selection with fuzzy filtering. `Choose` and `ChooseOverlay` are compatibility assemblies over the same reusable primitive:
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- `useChoose()` owns normalized source loading, filtering, active/multi-selection state, commands, command context, and a stable controller.
|
|
6
|
+
- `ChooseFilter`, `ChooseList`, and `ChooseHighlightedText` are reusable controlled views.
|
|
7
|
+
- `ChoosePanel` supplies picker chrome and hint/status/footer slots.
|
|
8
|
+
- `Choose` retains the fullscreen app, theme picker, actions, and launch behavior.
|
|
9
|
+
- `ChooseOverlay` retains single-select menu semantics and adds optional multi-select, controller, command, row, and chrome extensions.
|
|
10
|
+
|
|
11
|
+
## Source and controller
|
|
12
|
+
|
|
13
|
+
`ChooseSource` accepts an item array, a `ChooseContentProvider`, or a sync/async loader. Replaced sources ignore stale async results. Successful replacements reset active and selected state; direct array changes are reflected just like loaders.
|
|
14
|
+
|
|
15
|
+
Use `controllerRef` on an assembly, or the controller returned by `useChoose`, to set/clear the filter, move or set the active row, toggle selection, submit/cancel, change mode, or reload the current source.
|
|
16
|
+
|
|
17
|
+
## Command surfaces
|
|
18
|
+
|
|
19
|
+
Built-in interaction uses `useCommand`, so a nested modal command surface suspends the chooser automatically. A filter also blurs while another modal surface owns input. Mouse events bypass command-surface arbitration; pass `suspended` to a custom `ChooseList` host when covered rows can remain visible.
|
|
20
|
+
|
|
21
|
+
`ChooseOverlay` expects its host to provide an owned modal command surface, either through Tooee's overlay manager (`ownCommands: true`, `role: "modal"`) or an explicit `CommandSurfaceProvider`. It does not create another surface internally.
|
|
22
|
+
|
|
23
|
+
Reserved built-in keys:
|
|
24
|
+
|
|
25
|
+
- Both modes: Up, Down, Ctrl+P, Ctrl+N, Enter.
|
|
26
|
+
- Insert mode: Escape and, for multi-select, Tab/Shift+Tab.
|
|
27
|
+
- Cursor mode: `j`, `k`, `i`, `a`, `q`, Escape and, for multi-select, Tab/Shift+Tab.
|
|
28
|
+
|
|
29
|
+
Consumer commands should prefer control chords, leader sequences, or other non-reserved keys. Built-in groups can be disabled through `useChoose({ disable: [...] })` when a custom host deliberately owns one.
|
|
30
|
+
|
|
31
|
+
Part of the [Tooee](https://github.com/gingerhendrix/tooee) monorepo.
|
package/dist/Choose.d.ts
CHANGED
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
activeItem: ChooseItem | undefined;
|
|
8
|
-
selectedItems: ChooseItem[];
|
|
9
|
-
filterQuery: string;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
interface ChooseProps {
|
|
1
|
+
import { type Ref } from "react";
|
|
2
|
+
import { type ActionDefinition } from "@tooee/commands";
|
|
3
|
+
import { type ChooseListProps } from "./ChooseList.js";
|
|
4
|
+
import type { ChooseContentProvider, ChooseOptions, ChooseResult } from "./types.js";
|
|
5
|
+
import { type ChooseController } from "./use-choose.js";
|
|
6
|
+
export interface ChooseProps {
|
|
14
7
|
contentProvider: ChooseContentProvider;
|
|
15
8
|
options?: ChooseOptions;
|
|
9
|
+
/** Legacy name retained for source compatibility. */
|
|
16
10
|
actions?: ActionDefinition[];
|
|
17
|
-
/**
|
|
11
|
+
/** Additive alias used by new chooser compositions. */
|
|
12
|
+
commands?: ActionDefinition[];
|
|
13
|
+
controllerRef?: Ref<ChooseController>;
|
|
14
|
+
renderItem?: ChooseListProps["renderItem"];
|
|
15
|
+
/** @deprecated Prefer commands with an id such as `submit`. */
|
|
18
16
|
onConfirm?: (result: ChooseResult) => void;
|
|
19
|
-
/** @deprecated
|
|
17
|
+
/** @deprecated Prefer commands or launch lifecycle handling. */
|
|
20
18
|
onCancel?: () => void;
|
|
21
19
|
}
|
|
22
|
-
export declare function Choose({ contentProvider, options, actions, onConfirm, onCancel }: ChooseProps): import("react").ReactNode;
|
|
23
|
-
export {};
|
|
20
|
+
export declare function Choose({ contentProvider, options, actions, commands, controllerRef, renderItem, onConfirm, onCancel, }: ChooseProps): import("react").ReactNode;
|
|
24
21
|
//# sourceMappingURL=Choose.d.ts.map
|
package/dist/Choose.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Choose.d.ts","sourceRoot":"","sources":["../src/Choose.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Choose.d.ts","sourceRoot":"","sources":["../src/Choose.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,GAAG,EAAE,MAAM,OAAO,CAAA;AAKrD,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE1E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAElE,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACpF,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElE,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,qBAAqB,CAAA;IACtC,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,qDAAqD;IACrD,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC7B,aAAa,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACrC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IAC1C,+DAA+D;IAC/D,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IAC1C,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,wBAAgB,MAAM,CAAC,EACrB,eAAe,EACf,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EACb,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE,WAAW,6BAoGb"}
|
package/dist/Choose.js
CHANGED
|
@@ -1,293 +1,69 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { useKeyboard } from "@opentui/react";
|
|
2
|
+
import { useImperativeHandle } from "react";
|
|
4
3
|
import { AppLayout } from "@tooee/layout";
|
|
5
4
|
import { useHasOverlay, useHasModalOverlay } from "@tooee/overlays";
|
|
6
5
|
import { ThemePicker, useTheme } from "@tooee/themes";
|
|
7
6
|
import { useThemeCommands, useQuitCommand } from "@tooee/shell";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
7
|
+
import { useCommandContext } from "@tooee/commands";
|
|
8
|
+
import { ChooseFilter } from "./ChooseFilter.js";
|
|
9
|
+
import { ChooseList } from "./ChooseList.js";
|
|
10
|
+
import { buildChooseHints } from "./ChoosePanel.js";
|
|
11
|
+
import { useChoose } from "./use-choose.js";
|
|
12
|
+
export function Choose({ contentProvider, options, actions, commands, controllerRef, renderItem, onConfirm, onCancel, }) {
|
|
11
13
|
const { theme } = useTheme();
|
|
12
|
-
const [items, setItems] = useState([]);
|
|
13
|
-
const [filterQuery, setFilterQuery] = useState("");
|
|
14
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
15
|
-
const [selectedIndices, setSelectedIndices] = useState(new Set());
|
|
16
|
-
const [loading, setLoading] = useState(true);
|
|
17
|
-
const [error, setError] = useState(null);
|
|
18
|
-
const scrollRef = useRef(null);
|
|
19
14
|
const { invoke } = useCommandContext();
|
|
15
|
+
const effectiveCommands = commands ?? actions;
|
|
20
16
|
const multi = options?.multi ?? false;
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
const result = contentProvider.load();
|
|
23
|
-
if (result instanceof Promise) {
|
|
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;
|
|
32
|
-
setItems(loaded);
|
|
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);
|
|
41
|
-
});
|
|
42
|
-
return () => {
|
|
43
|
-
active = false;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
setItems(result);
|
|
47
|
-
setError(null);
|
|
48
|
-
setLoading(false);
|
|
49
|
-
}, [contentProvider]);
|
|
50
|
-
// Derived state: filtered items computed from items + filterQuery (no extra render cycle)
|
|
51
|
-
const filteredItems = useMemo(() => fuzzyFilter(items, filterQuery), [items, filterQuery]);
|
|
52
|
-
// Reset activeIndex when filter changes (render-time state adjustment)
|
|
53
|
-
const [prevFilterQuery, setPrevFilterQuery] = useState("");
|
|
54
|
-
if (filterQuery !== prevFilterQuery) {
|
|
55
|
-
setPrevFilterQuery(filterQuery);
|
|
56
|
-
setActiveIndex(0);
|
|
57
|
-
}
|
|
58
17
|
const { name: themeName, picker: themePicker } = useThemeCommands();
|
|
59
18
|
useQuitCommand({ onQuit: () => onCancel?.() });
|
|
60
|
-
const mode = useMode();
|
|
61
|
-
const setMode = useSetMode();
|
|
62
19
|
const hasOverlay = useHasOverlay();
|
|
63
20
|
const hasModalOverlay = useHasModalOverlay();
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (multi) {
|
|
67
|
-
const selected = Array.from(selectedIndices).map((i) => items[i]);
|
|
68
|
-
if (selected.length === 0 && filteredItems[activeIndex]) {
|
|
69
|
-
return [filteredItems[activeIndex].item];
|
|
70
|
-
}
|
|
71
|
-
return selected;
|
|
72
|
-
}
|
|
73
|
-
const match = filteredItems[activeIndex];
|
|
74
|
-
return match ? [match.item] : [];
|
|
75
|
-
}, [multi, selectedIndices, items, filteredItems, activeIndex]);
|
|
76
|
-
useProvideCommandContext(() => ({
|
|
77
|
-
choose: {
|
|
78
|
-
activeItem: filteredItems[activeIndex]?.item,
|
|
79
|
-
selectedItems: getSelectedItems(),
|
|
80
|
-
filterQuery,
|
|
81
|
-
},
|
|
82
|
-
exit: () => onCancel?.(),
|
|
83
|
-
}));
|
|
84
|
-
useActions(actions);
|
|
85
|
-
const moveUp = useCallback(() => {
|
|
86
|
-
setActiveIndex((i) => Math.max(0, i - 1));
|
|
87
|
-
}, []);
|
|
88
|
-
const moveDown = useCallback(() => {
|
|
89
|
-
setActiveIndex((i) => Math.min(filteredItems.length - 1, i + 1));
|
|
90
|
-
}, [filteredItems.length]);
|
|
91
|
-
// Register a/i to return to insert mode from cursor mode
|
|
92
|
-
useCommand({
|
|
93
|
-
id: "choose:insert-mode-a",
|
|
94
|
-
title: "Insert mode",
|
|
95
|
-
hotkey: "a",
|
|
96
|
-
modes: ["cursor"],
|
|
97
|
-
handler: () => setMode("insert"),
|
|
98
|
-
hidden: true,
|
|
99
|
-
});
|
|
100
|
-
useCommand({
|
|
101
|
-
id: "choose:insert-mode-i",
|
|
102
|
-
title: "Insert mode",
|
|
103
|
-
hotkey: "i",
|
|
104
|
-
modes: ["cursor"],
|
|
105
|
-
handler: () => setMode("insert"),
|
|
106
|
-
hidden: true,
|
|
107
|
-
});
|
|
108
|
-
// Register j/k for vim-style navigation in cursor mode
|
|
109
|
-
useCommand({
|
|
110
|
-
id: "choose:move-down",
|
|
111
|
-
title: "Move down",
|
|
112
|
-
hotkey: "j",
|
|
113
|
-
modes: ["cursor"],
|
|
114
|
-
handler: moveDown,
|
|
115
|
-
hidden: true,
|
|
116
|
-
});
|
|
117
|
-
useCommand({
|
|
118
|
-
id: "choose:move-up",
|
|
119
|
-
title: "Move up",
|
|
120
|
-
hotkey: "k",
|
|
121
|
-
modes: ["cursor"],
|
|
122
|
-
handler: moveUp,
|
|
123
|
-
hidden: true,
|
|
124
|
-
});
|
|
125
|
-
const toggleSelection = useCallback((index) => {
|
|
126
|
-
setSelectedIndices((prev) => {
|
|
127
|
-
const next = new Set(prev);
|
|
128
|
-
const origIndex = filteredItems[index]?.originalIndex;
|
|
129
|
-
if (origIndex === undefined)
|
|
130
|
-
return prev;
|
|
131
|
-
if (next.has(origIndex)) {
|
|
132
|
-
next.delete(origIndex);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
next.add(origIndex);
|
|
136
|
-
}
|
|
137
|
-
return next;
|
|
138
|
-
});
|
|
139
|
-
}, [filteredItems]);
|
|
140
|
-
const confirm = useCallback(() => {
|
|
141
|
-
// If there's a "submit" action, invoke it via the command system
|
|
142
|
-
if (actions?.some((a) => a.id === "submit")) {
|
|
143
|
-
invoke("submit");
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
// Legacy: use onConfirm/onCancel callbacks
|
|
147
|
-
if (multi) {
|
|
148
|
-
const selected = Array.from(selectedIndices).map((i) => items[i]);
|
|
149
|
-
if (selected.length === 0 && filteredItems[activeIndex]) {
|
|
150
|
-
onConfirm?.({ items: [filteredItems[activeIndex].item] });
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
onConfirm?.({ items: selected });
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
const match = filteredItems[activeIndex];
|
|
158
|
-
if (match) {
|
|
159
|
-
onConfirm?.({ items: [match.item] });
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
onCancel?.();
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}, [
|
|
21
|
+
const choose = useChoose({
|
|
22
|
+
source: contentProvider,
|
|
166
23
|
multi,
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
actions,
|
|
174
|
-
invoke,
|
|
175
|
-
]);
|
|
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;
|
|
183
|
-
if (key.name === "escape") {
|
|
184
|
-
if (mode === "insert") {
|
|
185
|
-
// Switch to cursor mode (allows theme switching, quit, etc.)
|
|
186
|
-
setMode("cursor");
|
|
24
|
+
onSubmit: (result) => {
|
|
25
|
+
// Historical standalone behaviour: a command named `submit` wins over
|
|
26
|
+
// the deprecated callback, so existing action-driven CLIs are unchanged.
|
|
27
|
+
if (effectiveCommands?.some((action) => action.id === "submit")) {
|
|
28
|
+
invoke("submit");
|
|
29
|
+
return;
|
|
187
30
|
}
|
|
188
|
-
|
|
189
|
-
|
|
31
|
+
if (multi || result.items.length > 0)
|
|
32
|
+
onConfirm?.(result);
|
|
33
|
+
else
|
|
190
34
|
onCancel?.();
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
confirm();
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
if (key.name === "up" || (key.ctrl && key.name === "p")) {
|
|
199
|
-
key.preventDefault();
|
|
200
|
-
moveUp();
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (key.name === "down" || (key.ctrl && key.name === "n")) {
|
|
204
|
-
key.preventDefault();
|
|
205
|
-
moveDown();
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
if (multi && key.name === "tab") {
|
|
209
|
-
if (key.shift) {
|
|
210
|
-
toggleSelection(activeIndex);
|
|
211
|
-
moveUp();
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
toggleSelection(activeIndex);
|
|
215
|
-
moveDown();
|
|
216
|
-
}
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
35
|
+
},
|
|
36
|
+
onCancel,
|
|
37
|
+
commands: effectiveCommands,
|
|
38
|
+
suspended: hasOverlay,
|
|
219
39
|
});
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if (scrollRef.current && filteredItems.length > 0) {
|
|
223
|
-
// +1 accounts for the filter input row at the top of scroll content
|
|
224
|
-
scrollRef.current.scrollTop = Math.max(0, activeIndex + 1 - 5);
|
|
225
|
-
}
|
|
226
|
-
}, [activeIndex, filteredItems.length]);
|
|
227
|
-
if (loading) {
|
|
40
|
+
useImperativeHandle(controllerRef, () => choose.controller, [choose.controller]);
|
|
41
|
+
if (choose.state.loading) {
|
|
228
42
|
return (_jsx("box", { children: _jsx("text", { content: "Loading...", fg: theme.textMuted }) }));
|
|
229
43
|
}
|
|
230
|
-
if (error) {
|
|
231
|
-
return (_jsx("box", { children: _jsx("text", { content: `Error: ${error}`, fg: theme.error }) }));
|
|
44
|
+
if (choose.state.error) {
|
|
45
|
+
return (_jsx("box", { children: _jsx("text", { content: `Error: ${choose.state.error}`, fg: theme.error }) }));
|
|
232
46
|
}
|
|
233
|
-
const
|
|
234
|
-
const hintParts = mode === "insert"
|
|
235
|
-
? ["↑↓ navigate", "Enter confirm", "Esc commands"]
|
|
236
|
-
: ["j/k navigate", "i insert", "Esc/q quit", "Enter confirm"];
|
|
237
|
-
if (multi && mode === "insert")
|
|
238
|
-
hintParts.splice(2, 0, "Tab toggle");
|
|
239
|
-
const hint = hintParts.join(" ");
|
|
47
|
+
const hints = buildChooseHints(choose.view.mode, { multi });
|
|
240
48
|
return (_jsx(AppLayout, { titleBar: (options?.title ?? options?.prompt)
|
|
241
49
|
? { title: (options.title ?? options.prompt) }
|
|
242
50
|
: undefined, statusBar: {
|
|
243
51
|
items: [
|
|
244
|
-
{
|
|
245
|
-
|
|
52
|
+
{
|
|
53
|
+
label: "Matches:",
|
|
54
|
+
value: `${choose.state.matches.length}/${choose.state.items.length}`,
|
|
55
|
+
},
|
|
56
|
+
...(multi
|
|
57
|
+
? [
|
|
58
|
+
{
|
|
59
|
+
label: "Selected:",
|
|
60
|
+
value: String(choose.state.selectedOriginalIndices.size),
|
|
61
|
+
},
|
|
62
|
+
]
|
|
63
|
+
: []),
|
|
246
64
|
{ label: "Theme:", value: themeName },
|
|
247
|
-
{ label: "", value:
|
|
65
|
+
{ label: "", value: hints.join(" ") },
|
|
248
66
|
],
|
|
249
|
-
},
|
|
250
|
-
const isActive = idx === activeIndex;
|
|
251
|
-
const isSelected = selectedIndices.has(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));
|
|
263
|
-
})] }) }));
|
|
264
|
-
}
|
|
265
|
-
function renderHighlightedText(text, positions, highlightColor) {
|
|
266
|
-
if (positions.length === 0) {
|
|
267
|
-
return text;
|
|
268
|
-
}
|
|
269
|
-
const posSet = new Set(positions);
|
|
270
|
-
const parts = [];
|
|
271
|
-
let current = "";
|
|
272
|
-
let currentHighlight = false;
|
|
273
|
-
for (let i = 0; i < text.length; i++) {
|
|
274
|
-
const isHighlight = posSet.has(i);
|
|
275
|
-
if (i === 0) {
|
|
276
|
-
currentHighlight = isHighlight;
|
|
277
|
-
current = text[i];
|
|
278
|
-
}
|
|
279
|
-
else if (isHighlight === currentHighlight) {
|
|
280
|
-
current += text[i];
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
parts.push({ text: current, highlight: currentHighlight });
|
|
284
|
-
current = text[i];
|
|
285
|
-
currentHighlight = isHighlight;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (current) {
|
|
289
|
-
parts.push({ text: current, highlight: currentHighlight });
|
|
290
|
-
}
|
|
291
|
-
return parts.map((part, i) => part.highlight ? (_jsx("span", { fg: highlightColor, children: part.text }, i)) : (part.text));
|
|
67
|
+
}, 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", style: { flexGrow: 1 }, children: [_jsx(ChooseFilter, { choose: choose, placeholder: options?.placeholder }), _jsx(ChooseList, { choose: choose, rowClick: "activate", renderItem: renderItem, emptyContent: options?.emptyMessage, suspended: hasModalOverlay })] }) }));
|
|
292
68
|
}
|
|
293
69
|
//# sourceMappingURL=Choose.js.map
|
package/dist/Choose.js.map
CHANGED
|
@@ -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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { UseChooseResult } from "./use-choose.js";
|
|
3
|
+
export interface ChooseFilterProps {
|
|
4
|
+
choose: UseChooseResult;
|
|
5
|
+
prompt?: ReactNode;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
right?: ReactNode;
|
|
8
|
+
onClose?: () => void;
|
|
9
|
+
}
|
|
10
|
+
/** Controlled filter row shared by fullscreen and overlay chooser assemblies. */
|
|
11
|
+
export declare function ChooseFilter({ choose, prompt, placeholder, right, onClose, }: ChooseFilterProps): ReactNode;
|
|
12
|
+
//# sourceMappingURL=ChooseFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChooseFilter.d.ts","sourceRoot":"","sources":["../src/ChooseFilter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,MAAa,EACb,WAAyB,EACzB,KAAK,EACL,OAAO,GACR,EAAE,iBAAiB,aAyBnB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { CloseButton, useTheme } from "@tooee/themes";
|
|
3
|
+
/** Controlled filter row shared by fullscreen and overlay chooser assemblies. */
|
|
4
|
+
export function ChooseFilter({ choose, prompt = "> ", placeholder = "Filter...", right, onClose, }) {
|
|
5
|
+
const { theme } = useTheme();
|
|
6
|
+
const { state, view } = choose;
|
|
7
|
+
return (_jsxs("box", { flexDirection: "row", height: 1, style: { paddingLeft: 1, paddingRight: 1 }, children: [typeof prompt === "string" ? _jsx("text", { content: prompt, fg: theme.accent }) : prompt, _jsx("input", { ref: view.filterRef, focused: view.filterFocused, value: state.filterQuery, placeholder: placeholder, onInput: view.onFilterInput, onKeyDown: view.onFilterKeyDown, backgroundColor: "transparent", textColor: theme.text, placeholderColor: theme.textMuted, cursorColor: theme.primary, style: { flexGrow: 1 } }), _jsx("text", { content: ` ${state.matches.length}/${state.items.length}`, fg: theme.textMuted }), right, onClose && _jsx(CloseButton, { onClose: onClose })] }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ChooseFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChooseFilter.js","sourceRoot":"","sources":["../src/ChooseFilter.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAWrD,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,MAAM,GAAG,IAAI,EACb,WAAW,GAAG,WAAW,EACzB,KAAK,EACL,OAAO,GACW;IAClB,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAE9B,OAAO,CACL,eAAK,aAAa,EAAC,KAAK,EAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAC3E,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAM,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,GAAI,CAAC,CAAC,CAAC,MAAM,EAClF,gBACE,GAAG,EAAE,IAAI,CAAC,SAAS,EACnB,OAAO,EAAE,IAAI,CAAC,aAAa,EAC3B,KAAK,EAAE,KAAK,CAAC,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,IAAI,CAAC,aAAa,EAC3B,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,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,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,GAAI,EACvF,KAAK,EACL,OAAO,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,GAAI,IACzC,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export interface ChooseHighlightedTextProps {
|
|
3
|
+
text: string;
|
|
4
|
+
positions: number[];
|
|
5
|
+
highlightColor: string;
|
|
6
|
+
}
|
|
7
|
+
/** Render fuzzy-match characters with one shared segmentation implementation. */
|
|
8
|
+
export declare function ChooseHighlightedText({ text, positions, highlightColor, }: ChooseHighlightedTextProps): ReactNode;
|
|
9
|
+
//# sourceMappingURL=ChooseHighlightedText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChooseHighlightedText.d.ts","sourceRoot":"","sources":["../src/ChooseHighlightedText.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEhD,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,SAAS,EACT,cAAc,GACf,EAAE,0BAA0B,GAAG,SAAS,CA4BxC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { Fragment } from "react";
|
|
3
|
+
/** Render fuzzy-match characters with one shared segmentation implementation. */
|
|
4
|
+
export function ChooseHighlightedText({ text, positions, highlightColor, }) {
|
|
5
|
+
if (positions.length === 0)
|
|
6
|
+
return text;
|
|
7
|
+
const positionSet = new Set(positions);
|
|
8
|
+
const parts = [];
|
|
9
|
+
let current = "";
|
|
10
|
+
let currentHighlighted = false;
|
|
11
|
+
for (let index = 0; index < text.length; index++) {
|
|
12
|
+
const highlighted = positionSet.has(index);
|
|
13
|
+
if (index === 0) {
|
|
14
|
+
current = text[index];
|
|
15
|
+
currentHighlighted = highlighted;
|
|
16
|
+
}
|
|
17
|
+
else if (highlighted === currentHighlighted) {
|
|
18
|
+
current += text[index];
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
parts.push({ text: current, highlighted: currentHighlighted });
|
|
22
|
+
current = text[index];
|
|
23
|
+
currentHighlighted = highlighted;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (current)
|
|
27
|
+
parts.push({ text: current, highlighted: currentHighlighted });
|
|
28
|
+
return parts.map((part, index) => (_jsx(Fragment, { children: part.highlighted ? _jsx("span", { fg: highlightColor, children: part.text }) : part.text }, index)));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ChooseHighlightedText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChooseHighlightedText.js","sourceRoot":"","sources":["../src/ChooseHighlightedText.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AAQhD,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,EACpC,IAAI,EACJ,SAAS,EACT,cAAc,GACa;IAC3B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEvC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,KAAK,GAAkD,EAAE,CAAA;IAC/D,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAE9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,kBAAkB,GAAG,WAAW,CAAA;QAClC,CAAC;aAAM,IAAI,WAAW,KAAK,kBAAkB,EAAE,CAAC;YAC9C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC9D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,kBAAkB,GAAG,WAAW,CAAA;QAClC,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAA;IAE3E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,QAAQ,cACN,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,eAAM,EAAE,EAAE,cAAc,YAAG,IAAI,CAAC,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAD/D,KAAK,CAET,CACZ,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { FuzzyMatch } from "./fuzzy.js";
|
|
3
|
+
import type { ChooseItem } from "./types.js";
|
|
4
|
+
import type { UseChooseResult } from "./use-choose.js";
|
|
5
|
+
export interface ChooseItemRenderContext {
|
|
6
|
+
item: ChooseItem;
|
|
7
|
+
match: FuzzyMatch;
|
|
8
|
+
index: number;
|
|
9
|
+
originalIndex: number;
|
|
10
|
+
positions: number[];
|
|
11
|
+
isActive: boolean;
|
|
12
|
+
isSelected: boolean;
|
|
13
|
+
defaultContent: ReactNode;
|
|
14
|
+
}
|
|
15
|
+
export interface ChooseListProps {
|
|
16
|
+
choose: UseChooseResult;
|
|
17
|
+
/** Fullscreen defaults to activate; picker overlays default to submit. */
|
|
18
|
+
rowClick?: "activate" | "submit" | "none";
|
|
19
|
+
renderItem?: (context: ChooseItemRenderContext) => ReactNode;
|
|
20
|
+
loadingContent?: ReactNode;
|
|
21
|
+
errorContent?: (error: string) => ReactNode;
|
|
22
|
+
emptyContent?: ReactNode;
|
|
23
|
+
/** Mouse guard for visible rows covered by another surface. */
|
|
24
|
+
suspended?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Scrollable chooser rows plus loading/error/empty presentation. */
|
|
27
|
+
export declare function ChooseList({ choose, rowClick, renderItem, loadingContent, errorContent, emptyContent, suspended, }: ChooseListProps): ReactNode;
|
|
28
|
+
//# sourceMappingURL=ChooseList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChooseList.d.ts","sourceRoot":"","sources":["../src/ChooseList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,CAAA;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAA;IACzC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,SAAS,CAAA;IAC5D,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAA;IAC3C,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAcD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,QAAqB,EACrB,UAAU,EACV,cAA6B,EAC7B,YAAkC,EAClC,YAAY,EACZ,SAAS,GACV,EAAE,eAAe,aAoFjB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { useTheme } from "@tooee/themes";
|
|
4
|
+
import { ChooseHighlightedText } from "./ChooseHighlightedText.js";
|
|
5
|
+
function ThemedLine({ content, color }) {
|
|
6
|
+
return (_jsx("box", { height: 1, style: { paddingLeft: 2 }, children: typeof content === "string" ? _jsx("text", { content: content, fg: color }) : content }));
|
|
7
|
+
}
|
|
8
|
+
function defaultErrorContent(error) {
|
|
9
|
+
return `Error: ${error}`;
|
|
10
|
+
}
|
|
11
|
+
/** Scrollable chooser rows plus loading/error/empty presentation. */
|
|
12
|
+
export function ChooseList({ choose, rowClick = "activate", renderItem, loadingContent = "Loading...", errorContent = defaultErrorContent, emptyContent, suspended, }) {
|
|
13
|
+
const { theme } = useTheme();
|
|
14
|
+
const scrollRef = useRef(null);
|
|
15
|
+
const { state, controller } = choose;
|
|
16
|
+
const interactionSuspended = choose.view.suspended || (suspended ?? false);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (scrollRef.current && state.matches.length > 0) {
|
|
19
|
+
scrollRef.current.scrollTop = Math.max(0, state.activeIndex - 5);
|
|
20
|
+
}
|
|
21
|
+
}, [state.activeIndex, state.matches.length]);
|
|
22
|
+
return (_jsxs("scrollbox", { ref: scrollRef, flexDirection: "column", style: { flexGrow: 1 }, focused: false, children: [state.loading && _jsx(ThemedLine, { content: loadingContent, color: theme.textMuted }), !state.loading && state.error && (_jsx(ThemedLine, { content: errorContent(state.error), color: theme.error })), !state.loading && !state.error && state.matches.length === 0 && emptyContent != null && (_jsx(ThemedLine, { content: emptyContent, color: theme.textMuted })), state.matches.map((match, index) => {
|
|
23
|
+
const isActive = index === state.activeIndex;
|
|
24
|
+
const isSelected = state.selectedOriginalIndices.has(match.originalIndex);
|
|
25
|
+
const defaultContent = (_jsxs(_Fragment, { children: [state.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: _jsx(ChooseHighlightedText, { text: match.item.text, positions: match.positions, highlightColor: theme.warning }) }), match.item.description && (_jsx("text", { content: ` ${match.item.description}`, fg: theme.textMuted }))] }));
|
|
26
|
+
const context = {
|
|
27
|
+
item: match.item,
|
|
28
|
+
match,
|
|
29
|
+
index,
|
|
30
|
+
originalIndex: match.originalIndex,
|
|
31
|
+
positions: match.positions,
|
|
32
|
+
isActive,
|
|
33
|
+
isSelected,
|
|
34
|
+
defaultContent,
|
|
35
|
+
};
|
|
36
|
+
return (_jsx("box", { flexDirection: "row", height: 1, backgroundColor: isActive ? theme.backgroundElement : undefined, style: { paddingLeft: 1 }, onMouseDown: (event) => {
|
|
37
|
+
if (interactionSuspended || event.button !== 0 || rowClick === "none")
|
|
38
|
+
return;
|
|
39
|
+
if (rowClick === "submit") {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
event.stopPropagation();
|
|
42
|
+
controller.setActiveIndex(index);
|
|
43
|
+
controller.submit();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
controller.setActiveIndex(index);
|
|
47
|
+
}
|
|
48
|
+
}, children: renderItem ? renderItem(context) : defaultContent }, match.originalIndex));
|
|
49
|
+
})] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ChooseList.js.map
|