|
|
@@ -1,5 +1,15 @@
|
|
|
-import { BoxRenderable, TextareaRenderable, MouseEvent, PasteEvent, decodePasteBytes } from "@opentui/core"
|
|
|
-import { createEffect, createMemo, onMount, createSignal, onCleanup, on, Show, Switch, Match } from "solid-js"
|
|
|
+import { BoxRenderable, RGBA, TextareaRenderable, MouseEvent, PasteEvent, decodePasteBytes } from "@opentui/core"
|
|
|
+import {
|
|
|
+ createEffect,
|
|
|
+ createMemo,
|
|
|
+ onMount,
|
|
|
+ createSignal,
|
|
|
+ onCleanup,
|
|
|
+ on,
|
|
|
+ Show,
|
|
|
+ Switch,
|
|
|
+ Match,
|
|
|
+} from "solid-js"
|
|
|
import "opentui-spinner/solid"
|
|
|
import path from "path"
|
|
|
import { fileURLToPath } from "url"
|
|
|
@@ -35,6 +45,7 @@ import { DialogProvider as DialogProviderConnect } from "../dialog-provider"
|
|
|
import { DialogAlert } from "../../ui/dialog-alert"
|
|
|
import { useToast } from "../../ui/toast"
|
|
|
import { useKV } from "../../context/kv"
|
|
|
+import { createFadeIn } from "../../util/signal"
|
|
|
import { useTextareaKeybindings } from "../textarea-keybindings"
|
|
|
import { DialogSkill } from "../dialog-skill"
|
|
|
import { useArgs } from "@tui/context/args"
|
|
|
@@ -75,6 +86,10 @@ function randomIndex(count: number) {
|
|
|
return Math.floor(Math.random() * count)
|
|
|
}
|
|
|
|
|
|
+function fadeColor(color: RGBA, alpha: number) {
|
|
|
+ return RGBA.fromValues(color.r, color.g, color.b, color.a * alpha)
|
|
|
+}
|
|
|
+
|
|
|
let stashed: { prompt: PromptInfo; cursor: number } | undefined
|
|
|
|
|
|
export function Prompt(props: PromptProps) {
|
|
|
@@ -97,6 +112,7 @@ export function Prompt(props: PromptProps) {
|
|
|
const renderer = useRenderer()
|
|
|
const { theme, syntax } = useTheme()
|
|
|
const kv = useKV()
|
|
|
+ const animationsEnabled = createMemo(() => kv.get("animations_enabled", true))
|
|
|
const list = createMemo(() => props.placeholders?.normal ?? [])
|
|
|
const shell = createMemo(() => props.placeholders?.shell ?? [])
|
|
|
const [auto, setAuto] = createSignal<AutocompleteRef>()
|
|
|
@@ -858,6 +874,13 @@ export function Prompt(props: PromptProps) {
|
|
|
return !!current
|
|
|
})
|
|
|
|
|
|
+ const agentMetaAlpha = createFadeIn(() => !!local.agent.current(), animationsEnabled)
|
|
|
+ const modelMetaAlpha = createFadeIn(() => !!local.agent.current() && store.mode === "normal", animationsEnabled)
|
|
|
+ const variantMetaAlpha = createFadeIn(
|
|
|
+ () => !!local.agent.current() && store.mode === "normal" && showVariant(),
|
|
|
+ animationsEnabled,
|
|
|
+ )
|
|
|
+
|
|
|
const placeholderText = createMemo(() => {
|
|
|
if (props.showPlaceholder === false) return undefined
|
|
|
if (store.mode === "shell") {
|
|
|
@@ -1133,17 +1156,24 @@ export function Prompt(props: PromptProps) {
|
|
|
<Show when={local.agent.current()} fallback={<box height={1} />}>
|
|
|
{(agent) => (
|
|
|
<>
|
|
|
- <text fg={highlight()}>{store.mode === "shell" ? "Shell" : Locale.titlecase(agent().name)} </text>
|
|
|
+ <text fg={fadeColor(highlight(), agentMetaAlpha())}>
|
|
|
+ {store.mode === "shell" ? "Shell" : Locale.titlecase(agent().name)}{" "}
|
|
|
+ </text>
|
|
|
<Show when={store.mode === "normal"}>
|
|
|
<box flexDirection="row" gap={1}>
|
|
|
- <text flexShrink={0} fg={keybind.leader ? theme.textMuted : theme.text}>
|
|
|
+ <text
|
|
|
+ flexShrink={0}
|
|
|
+ fg={fadeColor(keybind.leader ? theme.textMuted : theme.text, modelMetaAlpha())}
|
|
|
+ >
|
|
|
{local.model.parsed().model}
|
|
|
</text>
|
|
|
- <text fg={theme.textMuted}>{currentProviderLabel()}</text>
|
|
|
+ <text fg={fadeColor(theme.textMuted, modelMetaAlpha())}>{currentProviderLabel()}</text>
|
|
|
<Show when={showVariant()}>
|
|
|
- <text fg={theme.textMuted}>·</text>
|
|
|
+ <text fg={fadeColor(theme.textMuted, variantMetaAlpha())}>·</text>
|
|
|
<text>
|
|
|
- <span style={{ fg: theme.warning, bold: true }}>{local.model.variant.current()}</span>
|
|
|
+ <span style={{ fg: fadeColor(theme.warning, variantMetaAlpha()), bold: true }}>
|
|
|
+ {local.model.variant.current()}
|
|
|
+ </span>
|
|
|
</text>
|
|
|
</Show>
|
|
|
</box>
|