@tooee/shell 0.1.11 → 0.1.12

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 (49) hide show
  1. package/dist/command-palette-provider.d.ts +5 -0
  2. package/dist/command-palette-provider.d.ts.map +1 -0
  3. package/dist/command-palette-provider.js +28 -0
  4. package/dist/command-palette-provider.js.map +1 -0
  5. package/dist/commands.d.ts +9 -0
  6. package/dist/commands.d.ts.map +1 -1
  7. package/dist/commands.js +52 -1
  8. package/dist/commands.js.map +1 -1
  9. package/dist/copy-hook.d.ts +12 -0
  10. package/dist/copy-hook.d.ts.map +1 -0
  11. package/dist/copy-hook.js +35 -0
  12. package/dist/copy-hook.js.map +1 -0
  13. package/dist/copy-on-select.d.ts.map +1 -1
  14. package/dist/copy-on-select.js +1 -3
  15. package/dist/copy-on-select.js.map +1 -1
  16. package/dist/index.d.ts +8 -5
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5 -3
  19. package/dist/index.js.map +1 -1
  20. package/dist/navigation.d.ts +24 -0
  21. package/dist/navigation.d.ts.map +1 -0
  22. package/dist/navigation.js +239 -0
  23. package/dist/navigation.js.map +1 -0
  24. package/dist/provider.d.ts.map +1 -1
  25. package/dist/provider.js +4 -1
  26. package/dist/provider.js.map +1 -1
  27. package/dist/search-hook.d.ts +14 -0
  28. package/dist/search-hook.d.ts.map +1 -0
  29. package/dist/search-hook.js +120 -0
  30. package/dist/search-hook.js.map +1 -0
  31. package/package.json +20 -20
  32. package/src/command-palette-provider.tsx +39 -0
  33. package/src/commands.ts +55 -1
  34. package/src/copy-hook.ts +45 -0
  35. package/src/copy-on-select.ts +1 -4
  36. package/src/index.ts +15 -5
  37. package/src/navigation.ts +297 -0
  38. package/src/provider.tsx +6 -1
  39. package/src/search-hook.ts +147 -0
  40. package/dist/command-palette.d.ts +0 -9
  41. package/dist/command-palette.d.ts.map +0 -1
  42. package/dist/command-palette.js +0 -51
  43. package/dist/command-palette.js.map +0 -1
  44. package/dist/modal.d.ts +0 -33
  45. package/dist/modal.d.ts.map +0 -1
  46. package/dist/modal.js +0 -395
  47. package/dist/modal.js.map +0 -1
  48. package/src/command-palette.ts +0 -73
  49. package/src/modal.ts +0 -454
package/dist/modal.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"modal.js","sourceRoot":"","sources":["../src/modal.ts"],"names":[],"mappings":"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"}
@@ -1,73 +0,0 @@
1
- import { useCallback, useMemo, useRef, useState } from "react"
2
- import { createElement } from "react"
3
- import { useCommandContext, useCommand, useMode } from "@tooee/commands"
4
- import type { Mode } from "@tooee/commands"
5
- import { useOverlay } from "@tooee/overlays"
6
- import type { OverlayCloseReason } from "@tooee/overlays"
7
- import type { CommandPaletteEntry } from "@tooee/renderers"
8
- import { CommandPaletteOverlay } from "./CommandPaletteOverlay.js"
9
-
10
- const DEFAULT_MODES: Mode[] = ["cursor"]
11
- const OVERLAY_ID = "command-palette"
12
-
13
- export interface CommandPaletteState {
14
- isOpen: boolean
15
- open: () => void
16
- close: () => void
17
- entries: CommandPaletteEntry[]
18
- }
19
-
20
- export function useCommandPalette(): CommandPaletteState {
21
- const { commands } = useCommandContext()
22
- const mode = useMode()
23
- const overlay = useOverlay()
24
- const [isOpen, setIsOpen] = useState(false)
25
- const launchModeRef = useRef<Mode>(mode)
26
-
27
- const launchMode = launchModeRef.current
28
- const entries = useMemo(() => {
29
- return commands
30
- .filter((cmd) => !cmd.hidden)
31
- .filter((cmd) => {
32
- const cmdModes = cmd.modes ?? DEFAULT_MODES
33
- return cmdModes.includes(launchMode)
34
- })
35
- .map((cmd) => ({
36
- id: cmd.id,
37
- title: cmd.title,
38
- hotkey: cmd.defaultHotkey,
39
- category: cmd.category,
40
- icon: cmd.icon,
41
- }))
42
- }, [commands, launchMode])
43
-
44
- const close = useCallback(() => {
45
- setIsOpen(false)
46
- overlay.hide(OVERLAY_ID)
47
- }, [overlay])
48
-
49
- const open = useCallback(() => {
50
- launchModeRef.current = mode
51
- setIsOpen(true)
52
- overlay.open(
53
- OVERLAY_ID,
54
- ({ close }: { close: (reason?: OverlayCloseReason) => void }) =>
55
- createElement(CommandPaletteOverlay, {
56
- launchMode: mode,
57
- close: () => close(),
58
- }),
59
- null,
60
- { mode: "insert", dismissOnEscape: true, onClose: () => setIsOpen(false) },
61
- )
62
- }, [overlay, mode])
63
-
64
- useCommand({
65
- id: "command-palette",
66
- title: "Command Palette",
67
- hotkey: ":",
68
- modes: ["cursor"],
69
- handler: open,
70
- })
71
-
72
- return { isOpen, open, close, entries }
73
- }
package/src/modal.ts DELETED
@@ -1,454 +0,0 @@
1
- import { useState, useCallback, useRef, useEffect, useMemo } from "react"
2
- import { useCommand, useMode, useSetMode, type Mode } from "@tooee/commands"
3
- import { copyToClipboard } from "@tooee/clipboard"
4
- import { useTerminalDimensions } from "@opentui/react"
5
- import { findMatchingLines } from "./search.js"
6
-
7
- export interface Position {
8
- line: number
9
- col: number
10
- }
11
-
12
- export interface ModalNavigationState {
13
- mode: Mode
14
- setMode: (mode: Mode) => void
15
- cursor: Position | null
16
- selection: { start: Position; end: Position } | null
17
- toggledIndices: Set<number>
18
- searchQuery: string
19
- searchActive: boolean
20
- setSearchQuery: (query: string) => void
21
- matchingLines: number[]
22
- currentMatchIndex: number
23
- submitSearch: () => void
24
- }
25
-
26
- export interface ModalNavigationOptions {
27
- totalLines: number
28
- viewportHeight?: number
29
- getText?: () => string | undefined
30
- blockCount?: number
31
- blockLineMap?: number[]
32
- /** Offset to subtract from search line numbers to get block indices (for when getText has different line structure than visual) */
33
- searchLineOffset?: number
34
- multiSelect?: boolean
35
- }
36
-
37
- export function useModalNavigationCommands(opts: ModalNavigationOptions): ModalNavigationState {
38
- const { height: terminalHeight } = useTerminalDimensions()
39
- const {
40
- totalLines,
41
- viewportHeight = terminalHeight - 2,
42
- getText,
43
- blockCount,
44
- blockLineMap,
45
- searchLineOffset = 0,
46
- multiSelect = false,
47
- } = opts
48
- const mode = useMode()
49
- const setMode = useSetMode()
50
-
51
- const [cursor, setCursor] = useState<Position | null>(null)
52
- const [selectionAnchor, setSelectionAnchor] = useState<Position | null>(null)
53
- const [toggledIndices, setToggledIndices] = useState<Set<number>>(new Set())
54
- const [searchQuery, setSearchQuery] = useState("")
55
- const [searchActive, setSearchActive] = useState(false)
56
- const [currentMatchIndex, setCurrentMatchIndex] = useState(0)
57
- const preSearchModeRef = useRef<Mode>("cursor")
58
-
59
- // Track the "committed" search query (persists after search bar closes)
60
- const [committedQuery, setCommittedQuery] = useState("")
61
-
62
- // Derived state: search matches computed from committed query + content
63
- const matchingLines = useMemo(() => {
64
- if (!committedQuery) return []
65
- const text = getText?.()
66
- return text ? findMatchingLines(text, committedQuery) : []
67
- }, [committedQuery]) // eslint-disable-line react-hooks/exhaustive-deps
68
-
69
- // Live-update committed query while search bar is open
70
- useEffect(() => {
71
- if (searchActive && searchQuery) {
72
- setCommittedQuery(searchQuery)
73
- }
74
- }, [searchActive, searchQuery])
75
-
76
- const searchQueryRef = useRef(searchQuery)
77
- searchQueryRef.current = searchQuery
78
- const matchingLinesRef = useRef(matchingLines)
79
- matchingLinesRef.current = matchingLines
80
-
81
- // Auto-jump to first match when search results change
82
- useEffect(() => {
83
- setCurrentMatchIndex(0)
84
- if (matchingLines.length > 0) {
85
- setCursor((c) => (c ? { line: matchingLines[0], col: 0 } : c))
86
- }
87
- }, [matchingLines])
88
-
89
- const isBlockMode = blockCount != null
90
- const cursorMax = isBlockMode ? Math.max(0, blockCount - 1) : Math.max(0, totalLines - 1)
91
-
92
- const clampCursor = useCallback(
93
- (value: number) => Math.max(0, Math.min(value, cursorMax)),
94
- [cursorMax],
95
- )
96
-
97
- // Clean up toggled indices when cursorMax shrinks (render-time state adjustment)
98
- const [prevCursorMax, setPrevCursorMax] = useState(cursorMax)
99
- if (cursorMax !== prevCursorMax) {
100
- setPrevCursorMax(cursorMax)
101
- setToggledIndices((prev) => {
102
- const filtered = Array.from(prev).filter((index) => index <= cursorMax)
103
- return filtered.length === prev.size ? prev : new Set(filtered)
104
- })
105
- }
106
-
107
- // When entering cursor mode, initialize cursor if not already set
108
- const prevMode = useRef<Mode | null>(null)
109
- useEffect(() => {
110
- if (mode === "cursor" && prevMode.current !== "cursor" && prevMode.current !== "select") {
111
- setCursor((existing) => {
112
- // If cursor already exists (e.g. set by a command via palette), preserve it
113
- if (existing) return existing
114
- // If there's an active search match, start cursor there; otherwise start at scroll position
115
- const matches = matchingLinesRef.current
116
- if (matches.length > 0) {
117
- const matchLine = matches[currentMatchIndex] ?? matches[0]
118
- // In block mode, convert search line to block index using offset
119
- if (isBlockMode) {
120
- const blockIndex = Math.max(0, matchLine - searchLineOffset)
121
- return { line: Math.min(blockIndex, cursorMax), col: 0 }
122
- }
123
- return { line: matchLine, col: 0 }
124
- }
125
- // No search match - start at top
126
- return { line: 0, col: 0 }
127
- })
128
- }
129
- if (mode === "select" && prevMode.current === "cursor" && cursor) {
130
- setSelectionAnchor({ ...cursor })
131
- }
132
- prevMode.current = mode
133
- }, [mode]) // eslint-disable-line react-hooks/exhaustive-deps
134
-
135
- // === CURSOR MODE ===
136
-
137
- useCommand({
138
- id: "cursor-down",
139
- title: "Cursor down",
140
- hotkey: "j",
141
- modes: ["cursor"],
142
- handler: () => {
143
- setCursor((c) => {
144
- if (!c) return c
145
- return { line: clampCursor(c.line + 1), col: 0 }
146
- })
147
- },
148
- })
149
-
150
- useCommand({
151
- id: "cursor-toggle",
152
- title: "Toggle selection",
153
- hotkey: "tab",
154
- modes: ["cursor"],
155
- when: () => multiSelect,
156
- handler: () => {
157
- setToggledIndices((prev) => {
158
- if (!cursor) return prev
159
- const next = new Set(prev)
160
- const idx = cursor.line
161
- if (next.has(idx)) {
162
- next.delete(idx)
163
- } else {
164
- next.add(idx)
165
- }
166
- return next
167
- })
168
- },
169
- })
170
-
171
- useCommand({
172
- id: "cursor-toggle-up",
173
- title: "Toggle and move up",
174
- hotkey: "shift+tab",
175
- modes: ["cursor"],
176
- when: () => multiSelect,
177
- handler: () => {
178
- setToggledIndices((prev) => {
179
- if (!cursor) return prev
180
- const next = new Set(prev)
181
- const idx = cursor.line
182
- if (next.has(idx)) {
183
- next.delete(idx)
184
- } else {
185
- next.add(idx)
186
- }
187
- return next
188
- })
189
- setCursor((c) => {
190
- if (!c) return c
191
- return { line: clampCursor(c.line - 1), col: 0 }
192
- })
193
- },
194
- })
195
-
196
- useCommand({
197
- id: "cursor-up",
198
- title: "Cursor up",
199
- hotkey: "k",
200
- modes: ["cursor"],
201
- handler: () => {
202
- setCursor((c) => {
203
- if (!c) return c
204
- return { line: clampCursor(c.line - 1), col: 0 }
205
- })
206
- },
207
- })
208
-
209
- useCommand({
210
- id: "cursor-half-down",
211
- title: "Cursor half page down",
212
- hotkey: "ctrl+d",
213
- modes: ["cursor"],
214
- handler: () => {
215
- setCursor((c) => {
216
- if (!c) return c
217
- const step = isBlockMode ? Math.floor(cursorMax / 4) || 1 : Math.floor(viewportHeight / 2)
218
- return { line: clampCursor(c.line + step), col: 0 }
219
- })
220
- },
221
- })
222
-
223
- useCommand({
224
- id: "cursor-half-up",
225
- title: "Cursor half page up",
226
- hotkey: "ctrl+u",
227
- modes: ["cursor"],
228
- handler: () => {
229
- setCursor((c) => {
230
- if (!c) return c
231
- const step = isBlockMode ? Math.floor(cursorMax / 4) || 1 : Math.floor(viewportHeight / 2)
232
- return { line: clampCursor(c.line - step), col: 0 }
233
- })
234
- },
235
- })
236
-
237
- useCommand({
238
- id: "cursor-top",
239
- title: "Cursor to top",
240
- hotkey: "g g",
241
- modes: ["cursor"],
242
- handler: () => {
243
- setCursor({ line: 0, col: 0 })
244
- },
245
- })
246
-
247
- useCommand({
248
- id: "cursor-bottom",
249
- title: "Cursor to bottom",
250
- hotkey: "shift+g",
251
- modes: ["cursor"],
252
- handler: () => {
253
- setCursor({ line: cursorMax, col: 0 })
254
- },
255
- })
256
-
257
- useCommand({
258
- id: "cursor-search-start",
259
- title: "Search",
260
- hotkey: "/",
261
- modes: ["cursor"],
262
- handler: () => {
263
- preSearchModeRef.current = mode
264
- setSearchActive(true)
265
- setSearchQuery("")
266
- setMode("insert")
267
- },
268
- })
269
-
270
- useCommand({
271
- id: "cursor-search-next",
272
- title: "Next match",
273
- hotkey: "n",
274
- modes: ["cursor"],
275
- when: () => !searchActive,
276
- handler: () => {
277
- const matches = matchingLinesRef.current
278
- if (matches.length === 0) return
279
- setCurrentMatchIndex((idx) => {
280
- const next = (idx + 1) % matches.length
281
- const line = matches[next]
282
- setCursor({ line, col: 0 })
283
- return next
284
- })
285
- },
286
- })
287
-
288
- useCommand({
289
- id: "cursor-search-prev",
290
- title: "Previous match",
291
- hotkey: "shift+n",
292
- modes: ["cursor"],
293
- when: () => !searchActive,
294
- handler: () => {
295
- const matches = matchingLinesRef.current
296
- if (matches.length === 0) return
297
- setCurrentMatchIndex((idx) => {
298
- const next = (idx - 1 + matches.length) % matches.length
299
- const line = matches[next]
300
- setCursor({ line, col: 0 })
301
- return next
302
- })
303
- },
304
- })
305
-
306
- // === SELECT MODE ===
307
-
308
- useCommand({
309
- id: "select-down",
310
- title: "Extend selection down",
311
- hotkey: "j",
312
- modes: ["select"],
313
- handler: () => {
314
- setCursor((c) => {
315
- if (!c) return c
316
- return { line: clampCursor(c.line + 1), col: 0 }
317
- })
318
- },
319
- })
320
-
321
- useCommand({
322
- id: "select-up",
323
- title: "Extend selection up",
324
- hotkey: "k",
325
- modes: ["select"],
326
- handler: () => {
327
- setCursor((c) => {
328
- if (!c) return c
329
- return { line: clampCursor(c.line - 1), col: 0 }
330
- })
331
- },
332
- })
333
-
334
- useCommand({
335
- id: "select-toggle",
336
- title: "Toggle selection",
337
- hotkey: "tab",
338
- modes: ["select"],
339
- when: () => multiSelect,
340
- handler: () => {
341
- setToggledIndices((prev) => {
342
- if (!cursor) return prev
343
- const next = new Set(prev)
344
- const idx = cursor.line
345
- if (next.has(idx)) {
346
- next.delete(idx)
347
- } else {
348
- next.add(idx)
349
- }
350
- return next
351
- })
352
- },
353
- })
354
-
355
- useCommand({
356
- id: "select-copy",
357
- title: "Copy selection",
358
- hotkey: "y",
359
- modes: ["select"],
360
- handler: () => {
361
- if (!getText || !selectionAnchor || !cursor) return
362
- const text = getText()
363
- if (!text) return
364
-
365
- if (isBlockMode && blockLineMap) {
366
- // Block-based copy: use blockLineMap to find line ranges
367
- const startBlock = Math.min(selectionAnchor.line, cursor.line)
368
- const endBlock = Math.max(selectionAnchor.line, cursor.line)
369
- const startLine = blockLineMap[startBlock] ?? 0
370
- const endLine =
371
- endBlock + 1 < blockLineMap.length
372
- ? (blockLineMap[endBlock + 1] ?? text.split("\n").length)
373
- : text.split("\n").length
374
- const lines = text.split("\n")
375
- const selected = lines.slice(startLine, endLine).join("\n")
376
- if (selected) {
377
- void copyToClipboard(selected)
378
- }
379
- } else {
380
- const lines = text.split("\n")
381
- const startLine = Math.min(selectionAnchor.line, cursor.line)
382
- const endLine = Math.max(selectionAnchor.line, cursor.line)
383
- const selected = lines.slice(startLine, endLine + 1).join("\n")
384
- if (selected) {
385
- void copyToClipboard(selected)
386
- }
387
- }
388
- setMode("cursor")
389
- },
390
- })
391
-
392
- useCommand({
393
- id: "select-cancel",
394
- title: "Cancel selection",
395
- hotkey: "escape",
396
- modes: ["select"],
397
- handler: () => setMode("cursor"),
398
- })
399
-
400
- // === MODE TRANSITIONS ===
401
-
402
- useCommand({
403
- id: "enter-select",
404
- title: "Enter select mode",
405
- hotkey: "v",
406
- modes: ["cursor"],
407
- handler: () => setMode("select"),
408
- })
409
-
410
- // === SEARCH CANCEL (any mode) ===
411
-
412
- useCommand({
413
- id: "search-cancel",
414
- title: "Cancel search",
415
- hotkey: "escape",
416
- modes: ["cursor", "select", "insert"],
417
- when: () => searchActive,
418
- handler: () => {
419
- setSearchActive(false)
420
- setSearchQuery("")
421
- setCommittedQuery("")
422
- setCurrentMatchIndex(0)
423
- setMode(preSearchModeRef.current)
424
- },
425
- })
426
-
427
- // Compute selection from anchor + cursor
428
- const selection =
429
- selectionAnchor && cursor && mode === "select"
430
- ? {
431
- start: selectionAnchor.line <= cursor.line ? selectionAnchor : cursor,
432
- end: selectionAnchor.line <= cursor.line ? cursor : selectionAnchor,
433
- }
434
- : null
435
-
436
- const submitSearch = useCallback(() => {
437
- setSearchActive(false)
438
- setMode(preSearchModeRef.current)
439
- }, [setMode])
440
-
441
- return {
442
- mode,
443
- setMode,
444
- cursor,
445
- selection,
446
- toggledIndices,
447
- searchQuery,
448
- searchActive,
449
- setSearchQuery,
450
- matchingLines,
451
- currentMatchIndex,
452
- submitSearch,
453
- }
454
- }