@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.
Files changed (57) hide show
  1. package/README.md +5 -0
  2. package/dist/CommandPaletteOverlay.d.ts +7 -0
  3. package/dist/CommandPaletteOverlay.d.ts.map +1 -0
  4. package/dist/CommandPaletteOverlay.js +29 -0
  5. package/dist/CommandPaletteOverlay.js.map +1 -0
  6. package/dist/ThemePickerOverlay.d.ts +6 -0
  7. package/dist/ThemePickerOverlay.d.ts.map +1 -0
  8. package/dist/ThemePickerOverlay.js +20 -0
  9. package/dist/ThemePickerOverlay.js.map +1 -0
  10. package/dist/command-palette.d.ts +9 -0
  11. package/dist/command-palette.d.ts.map +1 -0
  12. package/dist/command-palette.js +51 -0
  13. package/dist/command-palette.js.map +1 -0
  14. package/dist/commands.d.ts +18 -0
  15. package/dist/commands.d.ts.map +1 -0
  16. package/dist/commands.js +49 -0
  17. package/dist/commands.js.map +1 -0
  18. package/dist/index.d.ts +12 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +9 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/launch.d.ts +6 -0
  23. package/dist/launch.d.ts.map +1 -0
  24. package/dist/launch.js +12 -0
  25. package/dist/launch.js.map +1 -0
  26. package/dist/modal.d.ts +34 -0
  27. package/dist/modal.d.ts.map +1 -0
  28. package/dist/modal.js +440 -0
  29. package/dist/modal.js.map +1 -0
  30. package/dist/overlay.d.ts +11 -0
  31. package/dist/overlay.d.ts.map +1 -0
  32. package/dist/overlay.js +145 -0
  33. package/dist/overlay.js.map +1 -0
  34. package/dist/provider.d.ts +11 -0
  35. package/dist/provider.d.ts.map +1 -0
  36. package/dist/provider.js +13 -0
  37. package/dist/provider.js.map +1 -0
  38. package/dist/search.d.ts +2 -0
  39. package/dist/search.d.ts.map +1 -0
  40. package/dist/search.js +20 -0
  41. package/dist/search.js.map +1 -0
  42. package/dist/theme-picker.d.ts +16 -0
  43. package/dist/theme-picker.d.ts.map +1 -0
  44. package/dist/theme-picker.js +48 -0
  45. package/dist/theme-picker.js.map +1 -0
  46. package/package.json +49 -0
  47. package/src/CommandPaletteOverlay.tsx +44 -0
  48. package/src/ThemePickerOverlay.tsx +28 -0
  49. package/src/command-palette.ts +73 -0
  50. package/src/commands.ts +60 -0
  51. package/src/index.ts +11 -0
  52. package/src/launch.tsx +15 -0
  53. package/src/modal.ts +504 -0
  54. package/src/overlay.tsx +220 -0
  55. package/src/provider.tsx +46 -0
  56. package/src/search.ts +18 -0
  57. package/src/theme-picker.ts +84 -0
@@ -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
+ }