summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorja <[email protected]>2025-12-26 23:12:35 -0500
committerGitHub <[email protected]>2025-12-26 22:12:35 -0600
commit1bcc72c477556088a0a717413dba7acaf58fe204 (patch)
tree8ed23070bdf191c8f1d7a18f526785f5e60a1696
parent4385fa4dd79955cdb1d7086365ee1a238ebf9748 (diff)
downloadopencode-1bcc72c477556088a0a717413dba7acaf58fe204.tar.gz
opencode-1bcc72c477556088a0a717413dba7acaf58fe204.zip
feat: add ability to disable spinner animation (#6084)
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx10
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx9
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx14
3 files changed, 29 insertions, 4 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
index 1217bb54a..cb7b5d282 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
@@ -2,12 +2,13 @@ import { useDialog } from "@tui/ui/dialog"
import { DialogSelect } from "@tui/ui/dialog-select"
import { useRoute } from "@tui/context/route"
import { useSync } from "@tui/context/sync"
-import { createEffect, createMemo, createSignal, onMount } from "solid-js"
+import { createEffect, createMemo, createSignal, onMount, Show } from "solid-js"
import { Locale } from "@/util/locale"
import { Keybind } from "@/util/keybind"
import { useTheme } from "../context/theme"
import { useSDK } from "../context/sdk"
import { DialogSessionRename } from "./dialog-session-rename"
+import { useKV } from "../context/kv"
import "opentui-spinner/solid"
export function DialogSessionList() {
@@ -16,6 +17,7 @@ export function DialogSessionList() {
const { theme } = useTheme()
const route = useRoute()
const sdk = useSDK()
+ const kv = useKV()
const [toDelete, setToDelete] = createSignal<string>()
@@ -45,7 +47,11 @@ export function DialogSessionList() {
value: x.id,
category,
footer: Locale.time(x.time.updated),
- gutter: isWorking ? <spinner frames={spinnerFrames} interval={80} color={theme.primary} /> : undefined,
+ gutter: isWorking ? (
+ <Show when={kv.get("animations_enabled", true)} fallback={<text fg={theme.textMuted}>[⋯]</text>}>
+ <spinner frames={spinnerFrames} interval={80} color={theme.primary} />
+ </Show>
+ ) : undefined,
}
})
.slice(0, 150)
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
index 9494b81cb..f819746d5 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
@@ -29,6 +29,7 @@ import { useDialog } from "@tui/ui/dialog"
import { DialogProvider as DialogProviderConnect } from "../dialog-provider"
import { DialogAlert } from "../../ui/dialog-alert"
import { useToast } from "../../ui/toast"
+import { useKV } from "../../context/kv"
export type PromptProps = {
sessionID?: string
@@ -124,6 +125,7 @@ export function Prompt(props: PromptProps) {
const command = useCommandDialog()
const renderer = useRenderer()
const { theme, syntax } = useTheme()
+ const kv = useKV()
function promptModelWarning() {
toast.show({
@@ -996,8 +998,11 @@ export function Prompt(props: PromptProps) {
justifyContent={status().type === "retry" ? "space-between" : "flex-start"}
>
<box flexShrink={0} flexDirection="row" gap={1}>
- {/* @ts-ignore // SpinnerOptions doesn't support marginLeft */}
- <spinner marginLeft={1} color={spinnerDef().color} frames={spinnerDef().frames} interval={40} />
+ <box marginLeft={1}>
+ <Show when={kv.get("animations_enabled", true)} fallback={<text fg={theme.textMuted}>[⋯]</text>}>
+ <spinner color={spinnerDef().color} frames={spinnerDef().frames} interval={40} />
+ </Show>
+ </box>
<box flexDirection="row" gap={1} flexShrink={0}>
{(() => {
const retry = createMemo(() => {
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index 818b96da4..177c43a46 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -128,6 +128,7 @@ export function Session() {
const [showScrollbar, setShowScrollbar] = createSignal(kv.get("scrollbar_visible", false))
const [userMessageMarkdown, setUserMessageMarkdown] = createSignal(kv.get("user_message_markdown", true))
const [diffWrapMode, setDiffWrapMode] = createSignal<"word" | "none">("word")
+ const [animationsEnabled, setAnimationsEnabled] = createSignal(kv.get("animations_enabled", true))
const wide = createMemo(() => dimensions().width > 120)
const sidebarVisible = createMemo(() => {
@@ -585,6 +586,19 @@ export function Session() {
},
},
{
+ title: animationsEnabled() ? "Disable animations" : "Enable animations",
+ value: "session.toggle.animations",
+ category: "Session",
+ onSelect: (dialog) => {
+ setAnimationsEnabled((prev) => {
+ const next = !prev
+ kv.set("animations_enabled", next)
+ return next
+ })
+ dialog.clear()
+ },
+ },
+ {
title: "Page up",
value: "session.page.up",
keybind: "messages_page_up",