From d6dbdb0b40d95bea41e3e2fcd8acc8a82e5bde27 Mon Sep 17 00:00:00 2001 From: Aaron Iker Date: Tue, 20 Jan 2026 01:24:48 +0100 Subject: [PATCH] feat: small transitions, spacing, polishing --- packages/app/src/components/prompt-input.tsx | 63 +++++++++++++++++--- packages/app/src/pages/layout.tsx | 10 ++-- packages/app/src/pages/session.tsx | 4 +- packages/ui/src/components/button.css | 45 ++++++++++++-- packages/ui/src/components/message-nav.css | 24 +++++--- packages/ui/src/components/message-nav.tsx | 11 ++-- packages/ui/src/components/scroll-fade.css | 2 + packages/ui/src/components/scroll-reveal.tsx | 2 +- packages/ui/src/components/select.css | 5 +- 9 files changed, 131 insertions(+), 35 deletions(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index d0c56f93ae..81222709f2 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1557,7 +1557,7 @@ export const PromptInput: Component = (props) => {
-
+
@@ -1608,13 +1608,60 @@ export const PromptInput: Component = (props) => { title="Thinking effort" keybind={command.keybind("model.variant.cycle")} > - + {(() => { + const [text, setText] = createSignal(local.model.variant.current() ?? "Default") + const [animating, setAnimating] = createSignal(false) + let locked = false + + const handleClick = async () => { + if (locked) return + + local.model.variant.cycle() + const newText = local.model.variant.current() ?? "Default" + + if (newText === text()) return + + locked = true + setAnimating(true) + + // Wait for exit animation + const charCount = text().length + await new Promise((r) => setTimeout(r, charCount * 40 + 400)) + + // Reset animating before setting new text so @starting-style works + setAnimating(false) + setText(newText) + + // Wait for enter animation + const newCharCount = newText.length + await new Promise((r) => setTimeout(r, newCharCount * 40 + 400)) + + locked = false + } + + return ( + + ) + })()} diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index dd42b338ef..1f2f04fa3e 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -34,7 +34,7 @@ import { DiffChanges } from "@opencode-ai/ui/diff-changes" import { Spinner } from "@opencode-ai/ui/spinner" import { Dialog } from "@opencode-ai/ui/dialog" import { getFilename } from "@opencode-ai/util/path" -import { Session, type Message, type TextPart } from "@opencode-ai/sdk/v2/client" +import { Session, type Message, type TextPart, UserMessage } from "@opencode-ai/sdk/v2/client" import { usePlatform } from "@/context/platform" import { createStore, produce, reconcile } from "solid-js/store" import { @@ -1352,7 +1352,7 @@ export default function Layout(props: ParentProps) { }) const hoverMessages = createMemo(() => - sessionStore.message[props.session.id]?.filter((message) => message.role === "user"), + sessionStore.message[props.session.id]?.filter((message) => message.role === "user") as UserMessage[], ) const hoverReady = createMemo(() => sessionStore.message[props.session.id] !== undefined) const hoverAllowed = createMemo(() => !props.mobile && layout.sidebar.opened()) @@ -1425,8 +1425,8 @@ export default function Layout(props: ParentProps) { } > - - Loading messages…
}> + + Loading messages…
}> -