@tooee/shell 0.1.0
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 +5 -0
- package/dist/CommandPaletteOverlay.d.ts +7 -0
- package/dist/CommandPaletteOverlay.d.ts.map +1 -0
- package/dist/CommandPaletteOverlay.js +29 -0
- package/dist/CommandPaletteOverlay.js.map +1 -0
- package/dist/ThemePickerOverlay.d.ts +6 -0
- package/dist/ThemePickerOverlay.d.ts.map +1 -0
- package/dist/ThemePickerOverlay.js +20 -0
- package/dist/ThemePickerOverlay.js.map +1 -0
- package/dist/command-palette.d.ts +9 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +51 -0
- package/dist/command-palette.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +49 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/launch.d.ts +6 -0
- package/dist/launch.d.ts.map +1 -0
- package/dist/launch.js +12 -0
- package/dist/launch.js.map +1 -0
- package/dist/modal.d.ts +34 -0
- package/dist/modal.d.ts.map +1 -0
- package/dist/modal.js +440 -0
- package/dist/modal.js.map +1 -0
- package/dist/overlay.d.ts +11 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +145 -0
- package/dist/overlay.js.map +1 -0
- package/dist/provider.d.ts +11 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +13 -0
- package/dist/provider.js.map +1 -0
- package/dist/search.d.ts +2 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +20 -0
- package/dist/search.js.map +1 -0
- package/dist/theme-picker.d.ts +16 -0
- package/dist/theme-picker.d.ts.map +1 -0
- package/dist/theme-picker.js +48 -0
- package/dist/theme-picker.js.map +1 -0
- package/package.json +49 -0
- package/src/CommandPaletteOverlay.tsx +44 -0
- package/src/ThemePickerOverlay.tsx +28 -0
- package/src/command-palette.ts +73 -0
- package/src/commands.ts +60 -0
- package/src/index.ts +11 -0
- package/src/launch.tsx +15 -0
- package/src/modal.ts +504 -0
- package/src/overlay.tsx +220 -0
- package/src/provider.tsx +46 -0
- package/src/search.ts +18 -0
- package/src/theme-picker.ts +84 -0
package/src/provider.tsx
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ReactNode } from "react"
|
|
2
|
+
import { ConfigProvider, useConfig, type TooeeConfig } from "@tooee/config"
|
|
3
|
+
import { ThemeSwitcherProvider } from "@tooee/themes"
|
|
4
|
+
import { CommandProvider, type Mode } from "@tooee/commands"
|
|
5
|
+
import { OverlayProvider } from "./overlay.jsx"
|
|
6
|
+
|
|
7
|
+
export interface TooeeProviderProps {
|
|
8
|
+
children: ReactNode
|
|
9
|
+
leader?: string
|
|
10
|
+
config?: Partial<TooeeConfig>
|
|
11
|
+
initialMode?: Mode
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function TooeeProvider({
|
|
15
|
+
children,
|
|
16
|
+
leader,
|
|
17
|
+
config: configOverrides,
|
|
18
|
+
initialMode,
|
|
19
|
+
}: TooeeProviderProps) {
|
|
20
|
+
return (
|
|
21
|
+
<ConfigProvider overrides={configOverrides}>
|
|
22
|
+
<TooeeProviderInner leader={leader} initialMode={initialMode}>
|
|
23
|
+
{children}
|
|
24
|
+
</TooeeProviderInner>
|
|
25
|
+
</ConfigProvider>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function TooeeProviderInner({
|
|
30
|
+
children,
|
|
31
|
+
leader,
|
|
32
|
+
initialMode,
|
|
33
|
+
}: {
|
|
34
|
+
children: ReactNode
|
|
35
|
+
leader?: string
|
|
36
|
+
initialMode?: Mode
|
|
37
|
+
}) {
|
|
38
|
+
const config = useConfig()
|
|
39
|
+
return (
|
|
40
|
+
<ThemeSwitcherProvider initialTheme={config.theme?.name} initialMode={config.theme?.mode}>
|
|
41
|
+
<CommandProvider leader={leader} keymap={config.keys} initialMode={initialMode}>
|
|
42
|
+
<OverlayProvider>{children}</OverlayProvider>
|
|
43
|
+
</CommandProvider>
|
|
44
|
+
</ThemeSwitcherProvider>
|
|
45
|
+
)
|
|
46
|
+
}
|
package/src/search.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function findMatchingLines(text: string, query: string): number[] {
|
|
2
|
+
if (!query) return []
|
|
3
|
+
const lowerQuery = query.toLowerCase()
|
|
4
|
+
const results: number[] = []
|
|
5
|
+
let lineStart = 0
|
|
6
|
+
let lineNum = 0
|
|
7
|
+
for (let i = 0; i <= text.length; i++) {
|
|
8
|
+
if (i === text.length || text[i] === "\n") {
|
|
9
|
+
const line = text.slice(lineStart, i).toLowerCase()
|
|
10
|
+
if (line.includes(lowerQuery)) {
|
|
11
|
+
results.push(lineNum)
|
|
12
|
+
}
|
|
13
|
+
lineStart = i + 1
|
|
14
|
+
lineNum++
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return results
|
|
18
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from "react"
|
|
2
|
+
import { createElement } from "react"
|
|
3
|
+
import { useThemeSwitcher } from "@tooee/themes"
|
|
4
|
+
import { useOverlay } from "@tooee/overlays"
|
|
5
|
+
import type { OverlayCloseReason } from "@tooee/overlays"
|
|
6
|
+
import { ThemePickerOverlay } from "./ThemePickerOverlay.jsx"
|
|
7
|
+
|
|
8
|
+
export interface ThemePickerEntry {
|
|
9
|
+
id: string
|
|
10
|
+
title: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ThemePickerState {
|
|
14
|
+
isOpen: boolean
|
|
15
|
+
open: () => void
|
|
16
|
+
close: () => void
|
|
17
|
+
confirm: (name: string) => void
|
|
18
|
+
preview: (name: string) => void
|
|
19
|
+
entries: ThemePickerEntry[]
|
|
20
|
+
originalTheme: string
|
|
21
|
+
currentTheme: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const OVERLAY_ID = "theme-picker"
|
|
25
|
+
|
|
26
|
+
export function useThemePicker(): ThemePickerState {
|
|
27
|
+
const { allThemes, setTheme, name: currentTheme } = useThemeSwitcher()
|
|
28
|
+
const overlay = useOverlay()
|
|
29
|
+
const [isOpen, setIsOpen] = useState(false)
|
|
30
|
+
const originalThemeRef = useRef<string>(currentTheme)
|
|
31
|
+
|
|
32
|
+
const entries: ThemePickerEntry[] = allThemes.map((name: string) => ({
|
|
33
|
+
id: name,
|
|
34
|
+
title: name,
|
|
35
|
+
}))
|
|
36
|
+
|
|
37
|
+
const close = useCallback(() => {
|
|
38
|
+
setTheme(originalThemeRef.current)
|
|
39
|
+
setIsOpen(false)
|
|
40
|
+
overlay.hide(OVERLAY_ID)
|
|
41
|
+
}, [setTheme, overlay])
|
|
42
|
+
|
|
43
|
+
const confirm = useCallback(
|
|
44
|
+
(name: string) => {
|
|
45
|
+
setTheme(name)
|
|
46
|
+
setIsOpen(false)
|
|
47
|
+
overlay.hide(OVERLAY_ID)
|
|
48
|
+
},
|
|
49
|
+
[setTheme, overlay],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
const preview = useCallback(
|
|
53
|
+
(name: string) => {
|
|
54
|
+
setTheme(name)
|
|
55
|
+
},
|
|
56
|
+
[setTheme],
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
const open = useCallback(() => {
|
|
60
|
+
originalThemeRef.current = currentTheme
|
|
61
|
+
setIsOpen(true)
|
|
62
|
+
overlay.open(
|
|
63
|
+
OVERLAY_ID,
|
|
64
|
+
({ close }: { close: (reason?: OverlayCloseReason) => void }) =>
|
|
65
|
+
createElement(ThemePickerOverlay, {
|
|
66
|
+
originalTheme: currentTheme,
|
|
67
|
+
close: () => close(),
|
|
68
|
+
}),
|
|
69
|
+
null,
|
|
70
|
+
{ mode: "insert", dismissOnEscape: true, onClose: () => setIsOpen(false) },
|
|
71
|
+
)
|
|
72
|
+
}, [overlay, currentTheme])
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
isOpen,
|
|
76
|
+
open,
|
|
77
|
+
close,
|
|
78
|
+
confirm,
|
|
79
|
+
preview,
|
|
80
|
+
entries,
|
|
81
|
+
originalTheme: originalThemeRef.current,
|
|
82
|
+
currentTheme,
|
|
83
|
+
}
|
|
84
|
+
}
|