summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTommy D. Rossi <[email protected]>2025-11-13 17:02:10 +0100
committerGitHub <[email protected]>2025-11-13 17:02:10 +0100
commit609ab069a99d6832c03c5b7b0b88c14b240ba4f8 (patch)
tree9aaffbeb985a0b8a45c4af8ac7f4535a214c7733
parentec3579d7cb9a47d5416f8b02b0e2f3e2e7503c89 (diff)
downloadopencode-609ab069a99d6832c03c5b7b0b88c14b240ba4f8.tar.gz
opencode-609ab069a99d6832c03c5b7b0b88c14b240ba4f8.zip
Add scroll acceleration support to TUI (#4289)
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx31
-rw-r--r--packages/opencode/src/config/config.ts8
-rw-r--r--packages/sdk/js/src/gen/types.gen.ts9
-rw-r--r--packages/web/src/content/docs/config.mdx10
-rw-r--r--packages/web/src/content/docs/tui.mdx8
5 files changed, 61 insertions, 5 deletions
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 4c3dd96ff..e3d199ee4 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -17,7 +17,14 @@ import { useRoute, useRouteData } from "@tui/context/route"
import { useSync } from "@tui/context/sync"
import { SplitBorder } from "@tui/component/border"
import { useTheme } from "@tui/context/theme"
-import { BoxRenderable, ScrollBoxRenderable, TextAttributes, addDefaultParsers } from "@opentui/core"
+import {
+ BoxRenderable,
+ ScrollBoxRenderable,
+ TextAttributes,
+ addDefaultParsers,
+ MacOSScrollAccel,
+ type ScrollAcceleration,
+} from "@opentui/core"
import { Prompt, type PromptRef } from "@tui/component/prompt"
import type { AssistantMessage, Part, ToolPart, UserMessage, TextPart, ReasoningPart } from "@opencode-ai/sdk"
import { useLocal } from "@tui/context/local"
@@ -62,6 +69,16 @@ import { LSP } from "@/lsp/index.ts"
addDefaultParsers(parsers.parsers)
+class CustomSpeedScroll implements ScrollAcceleration {
+ constructor(private speed: number) {}
+
+ tick(_now?: number): number {
+ return this.speed
+ }
+
+ reset(): void {}
+}
+
const context = createContext<{
width: number
conceal: () => boolean
@@ -95,6 +112,17 @@ export function Session() {
const sidebarVisible = createMemo(() => sidebar() === "show" || (sidebar() === "auto" && wide()))
const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4)
+ const scrollAcceleration = createMemo(() => {
+ const tui = sync.data.config.tui
+ if (tui?.scroll_acceleration?.enabled) {
+ return new MacOSScrollAccel()
+ }
+ if (tui?.scroll_speed) {
+ return new CustomSpeedScroll(tui.scroll_speed)
+ }
+ return undefined
+ })
+
createEffect(async () => {
await sync.session
.sync(route.sessionID)
@@ -684,6 +712,7 @@ export function Session() {
stickyScroll={true}
stickyStart="bottom"
flexGrow={1}
+ scrollAcceleration={scrollAcceleration()}
>
<For each={messages()}>
{(message, index) => (
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index e6bed238f..3ca8c25de 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -437,7 +437,13 @@ export namespace Config {
})
export const TUI = z.object({
- scroll_speed: z.number().min(1).optional().default(2).describe("TUI scroll speed"),
+ scroll_speed: z.number().min(1).optional().default(1).describe("TUI scroll speed"),
+ scroll_acceleration: z
+ .object({
+ enabled: z.boolean().describe("Enable scroll acceleration"),
+ })
+ .optional()
+ .describe("Scroll acceleration settings"),
})
export const Layout = z.enum(["auto", "stretch"]).meta({
diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts
index 3e64fc9a0..1d90fe106 100644
--- a/packages/sdk/js/src/gen/types.gen.ts
+++ b/packages/sdk/js/src/gen/types.gen.ts
@@ -301,6 +301,15 @@ export type Config = {
* TUI scroll speed
*/
scroll_speed?: number
+ /**
+ * Scroll acceleration settings
+ */
+ scroll_acceleration?: {
+ /**
+ * Enable scroll acceleration
+ */
+ enabled: boolean
+ }
}
/**
* Command configuration, see https://opencode.ai/docs/commands
diff --git a/packages/web/src/content/docs/config.mdx b/packages/web/src/content/docs/config.mdx
index c02edd2ff..a27acc779 100644
--- a/packages/web/src/content/docs/config.mdx
+++ b/packages/web/src/content/docs/config.mdx
@@ -93,11 +93,19 @@ You can configure TUI-specific settings through the `tui` option.
{
"$schema": "https://opencode.ai/config.json",
"tui": {
- "scroll_speed": 3
+ "scroll_speed": 3,
+ "scroll_acceleration": {
+ "enabled": true
+ }
}
}
```
+Available options:
+
+- `scroll_acceleration.enabled` - Enable macOS-style scroll acceleration. **Takes precedence over `scroll_speed`.**
+- `scroll_speed` - Custom scroll speed multiplier (default: `1`, minimum: `1`). Ignored if `scroll_acceleration.enabled` is `true`.
+
[Learn more about using the TUI here](/docs/tui).
---
diff --git a/packages/web/src/content/docs/tui.mdx b/packages/web/src/content/docs/tui.mdx
index 4dd7608be..f50409c41 100644
--- a/packages/web/src/content/docs/tui.mdx
+++ b/packages/web/src/content/docs/tui.mdx
@@ -336,11 +336,15 @@ You can customize TUI behavior through your OpenCode config file.
{
"$schema": "https://opencode.ai/config.json",
"tui": {
- "scroll_speed": 3
+ "scroll_speed": 3,
+ "scroll_acceleration": {
+ "enabled": true
+ }
}
}
```
### Options
-- `scroll_speed` - Controls how fast the TUI scrolls when using scroll commands (default: `2`, minimum: `1`)
+- `scroll_acceleration` - Enable macOS-style scroll acceleration for smooth, natural scrolling. When enabled, scroll speed increases with rapid scrolling gestures and stays precise for slower movements. **This setting takes precedence over `scroll_speed` and overrides it when enabled.**
+- `scroll_speed` - Controls how fast the TUI scrolls when using scroll commands (default: `1`, minimum: `1`). **Note: This is ignored if `scroll_acceleration.enabled` is set to `true`.**