|
|
@@ -1,7 +1,7 @@
|
|
|
import { render, useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
|
|
|
import { Clipboard } from "@tui/util/clipboard"
|
|
|
import { Selection } from "@tui/util/selection"
|
|
|
-import { MouseButton, TextAttributes } from "@opentui/core"
|
|
|
+import { createCliRenderer, MouseButton, TextAttributes, type CliRendererConfig } from "@opentui/core"
|
|
|
import { RouteProvider, useRoute } from "@tui/context/route"
|
|
|
import { Switch, Match, createEffect, untrack, ErrorBoundary, createSignal, onMount, batch, Show, on } from "solid-js"
|
|
|
import { win32DisableProcessedInput, win32FlushInputBuffer, win32InstallCtrlCGuard } from "./win32"
|
|
|
@@ -103,6 +103,43 @@ async function getTerminalBackgroundColor(): Promise<"dark" | "light"> {
|
|
|
|
|
|
import type { EventSource } from "./context/sdk"
|
|
|
|
|
|
+function rendererConfig(config: TuiConfig.Info): CliRendererConfig {
|
|
|
+ const input = config.tui?.renderer
|
|
|
+ const kitty = input?.use_kitty_keyboard
|
|
|
+
|
|
|
+ return {
|
|
|
+ targetFps: input?.target_fps ?? 60,
|
|
|
+ maxFps: input?.max_fps,
|
|
|
+ gatherStats: input?.gather_stats ?? false,
|
|
|
+ exitOnCtrlC: false,
|
|
|
+ useMouse: input?.use_mouse,
|
|
|
+ enableMouseMovement: input?.enable_mouse_movement,
|
|
|
+ useAlternateScreen: input?.use_alternate_screen,
|
|
|
+ autoFocus: input?.auto_focus ?? false,
|
|
|
+ useKittyKeyboard:
|
|
|
+ kitty === undefined || kitty === true
|
|
|
+ ? {}
|
|
|
+ : kitty === false
|
|
|
+ ? null
|
|
|
+ : {
|
|
|
+ disambiguate: kitty.disambiguate,
|
|
|
+ alternateKeys: kitty.alternate_keys,
|
|
|
+ events: kitty.events,
|
|
|
+ allKeysAsEscapes: kitty.all_keys_as_escapes,
|
|
|
+ reportText: kitty.report_text,
|
|
|
+ },
|
|
|
+ openConsoleOnError: input?.open_console_on_error ?? false,
|
|
|
+ consoleOptions: {
|
|
|
+ keyBindings: [{ name: "y", ctrl: true, action: "copy-selection" }],
|
|
|
+ onCopySelection: (text) => {
|
|
|
+ Clipboard.copy(text).catch((error) => {
|
|
|
+ console.error(`Failed to copy console selection to clipboard: ${error}`)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
export function tui(input: {
|
|
|
url: string
|
|
|
args: Args
|
|
|
@@ -130,73 +167,58 @@ export function tui(input: {
|
|
|
resolve()
|
|
|
}
|
|
|
|
|
|
- render(
|
|
|
- () => {
|
|
|
- return (
|
|
|
- <ErrorBoundary
|
|
|
- fallback={(error, reset) => <ErrorComponent error={error} reset={reset} onExit={onExit} mode={mode} />}
|
|
|
- >
|
|
|
- <ArgsProvider {...input.args}>
|
|
|
- <ExitProvider onExit={onExit}>
|
|
|
- <KVProvider>
|
|
|
- <ToastProvider>
|
|
|
- <RouteProvider>
|
|
|
- <TuiConfigProvider config={input.config}>
|
|
|
- <SDKProvider
|
|
|
- url={input.url}
|
|
|
- directory={input.directory}
|
|
|
- fetch={input.fetch}
|
|
|
- headers={input.headers}
|
|
|
- events={input.events}
|
|
|
- >
|
|
|
- <SyncProvider>
|
|
|
- <ThemeProvider mode={mode}>
|
|
|
- <LocalProvider>
|
|
|
- <KeybindProvider>
|
|
|
- <PromptStashProvider>
|
|
|
- <DialogProvider>
|
|
|
- <CommandProvider>
|
|
|
- <FrecencyProvider>
|
|
|
- <PromptHistoryProvider>
|
|
|
- <PromptRefProvider>
|
|
|
- <App />
|
|
|
- </PromptRefProvider>
|
|
|
- </PromptHistoryProvider>
|
|
|
- </FrecencyProvider>
|
|
|
- </CommandProvider>
|
|
|
- </DialogProvider>
|
|
|
- </PromptStashProvider>
|
|
|
- </KeybindProvider>
|
|
|
- </LocalProvider>
|
|
|
- </ThemeProvider>
|
|
|
- </SyncProvider>
|
|
|
- </SDKProvider>
|
|
|
- </TuiConfigProvider>
|
|
|
- </RouteProvider>
|
|
|
- </ToastProvider>
|
|
|
- </KVProvider>
|
|
|
- </ExitProvider>
|
|
|
- </ArgsProvider>
|
|
|
- </ErrorBoundary>
|
|
|
- )
|
|
|
- },
|
|
|
- {
|
|
|
- targetFps: 60,
|
|
|
- gatherStats: false,
|
|
|
- exitOnCtrlC: false,
|
|
|
- useKittyKeyboard: {},
|
|
|
- autoFocus: false,
|
|
|
- openConsoleOnError: false,
|
|
|
- consoleOptions: {
|
|
|
- keyBindings: [{ name: "y", ctrl: true, action: "copy-selection" }],
|
|
|
- onCopySelection: (text) => {
|
|
|
- Clipboard.copy(text).catch((error) => {
|
|
|
- console.error(`Failed to copy console selection to clipboard: ${error}`)
|
|
|
- })
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- )
|
|
|
+ const renderer = await createCliRenderer(rendererConfig(input.config))
|
|
|
+
|
|
|
+ await render(() => {
|
|
|
+ return (
|
|
|
+ <ErrorBoundary
|
|
|
+ fallback={(error, reset) => <ErrorComponent error={error} reset={reset} onExit={onExit} mode={mode} />}
|
|
|
+ >
|
|
|
+ <ArgsProvider {...input.args}>
|
|
|
+ <ExitProvider onExit={onExit}>
|
|
|
+ <KVProvider>
|
|
|
+ <ToastProvider>
|
|
|
+ <RouteProvider>
|
|
|
+ <TuiConfigProvider config={input.config}>
|
|
|
+ <SDKProvider
|
|
|
+ url={input.url}
|
|
|
+ renderer={renderer}
|
|
|
+ directory={input.directory}
|
|
|
+ fetch={input.fetch}
|
|
|
+ headers={input.headers}
|
|
|
+ events={input.events}
|
|
|
+ >
|
|
|
+ <SyncProvider>
|
|
|
+ <ThemeProvider mode={mode}>
|
|
|
+ <LocalProvider>
|
|
|
+ <KeybindProvider>
|
|
|
+ <PromptStashProvider>
|
|
|
+ <DialogProvider>
|
|
|
+ <CommandProvider>
|
|
|
+ <FrecencyProvider>
|
|
|
+ <PromptHistoryProvider>
|
|
|
+ <PromptRefProvider>
|
|
|
+ <App />
|
|
|
+ </PromptRefProvider>
|
|
|
+ </PromptHistoryProvider>
|
|
|
+ </FrecencyProvider>
|
|
|
+ </CommandProvider>
|
|
|
+ </DialogProvider>
|
|
|
+ </PromptStashProvider>
|
|
|
+ </KeybindProvider>
|
|
|
+ </LocalProvider>
|
|
|
+ </ThemeProvider>
|
|
|
+ </SyncProvider>
|
|
|
+ </SDKProvider>
|
|
|
+ </TuiConfigProvider>
|
|
|
+ </RouteProvider>
|
|
|
+ </ToastProvider>
|
|
|
+ </KVProvider>
|
|
|
+ </ExitProvider>
|
|
|
+ </ArgsProvider>
|
|
|
+ </ErrorBoundary>
|
|
|
+ )
|
|
|
+ }, renderer)
|
|
|
})
|
|
|
}
|
|
|
|