From 30cb8d8cd118e825a52b5bc7e372f614af0f781a Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 27 Jun 2026 01:57:17 +0800 Subject: [PATCH 1/2] fix(app): animate prompt selectors after loading --- bun.lock | 4 ++++ packages/app/package.json | 1 + packages/app/src/components/prompt-input.tsx | 11 ++++++++--- packages/app/src/index.css | 1 + packages/ui/package.json | 3 ++- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index c7ac6ab61c77..84c4f9e5002f 100644 --- a/bun.lock +++ b/bun.lock @@ -83,6 +83,7 @@ "@types/luxon": "catalog:", "@types/node": "catalog:", "@typescript/native-preview": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", @@ -990,6 +991,7 @@ "@typescript/native-preview": "catalog:", "solid-js": "catalog:", "tailwindcss": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", @@ -5315,6 +5317,8 @@ "turndown": ["turndown@7.2.0", "", { "dependencies": { "@mixmark-io/domino": "^2.2.0" } }, "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A=="], + "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], + "tw-to-css": ["tw-to-css@0.0.12", "", { "dependencies": { "postcss": "8.4.31", "postcss-css-variables": "0.18.0", "tailwindcss": "3.3.2" } }, "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw=="], "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], diff --git a/packages/app/package.json b/packages/app/package.json index b8f52ebfc75d..52420afedc1e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -38,6 +38,7 @@ "@types/luxon": "catalog:", "@types/node": "catalog:", "@typescript/native-preview": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index f9a99aebb603..3659e9d3437a 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1343,9 +1343,9 @@ export const PromptInput: Component = (props) => { } const agentsLoading = () => props.controls.agents.loading - const agentsShouldFadeIn = createMemo((prev) => prev ?? agentsLoading()) + const agentsShouldFadeIn = createMemo((prev) => prev ?? agentsLoading()) const providersLoading = () => props.controls.model.loading - const providersShouldFadeIn = createMemo((prev) => prev ?? providersLoading()) + const providersShouldFadeIn = createMemo((prev) => prev ?? providersLoading()) const [promptReady] = createResource( () => prompt.ready.promise, @@ -1359,6 +1359,7 @@ export const PromptInput: Component = (props) => { const modelControlState = createMemo(() => ({ loading: providersLoading(), + shouldAnimate: providersShouldFadeIn(), paid: props.controls.model.paid, title: language.t("command.model.choose"), keybind: command.keybind("model.choose"), @@ -1519,10 +1520,11 @@ export const PromptInput: Component = (props) => { {props.toolbar} - +
@@ -2000,6 +2004,7 @@ function ComposerModelControl(props: { state: ComposerModelControlState }) { style: props.state.style, class: "min-w-0 max-w-[220px] justify-start text-[13px] font-[440] leading-5 text-v2-text-text-faint group", + classList: { "animate-in fade-in": props.state.shouldAnimate }, "data-action": "prompt-model", }} onClose={props.state.onClose} diff --git a/packages/app/src/index.css b/packages/app/src/index.css index 77982626a71a..95b6e7aa5078 100644 --- a/packages/app/src/index.css +++ b/packages/app/src/index.css @@ -1,6 +1,7 @@ @import "@opencode-ai/ui/styles/tailwind"; @import "@opencode-ai/session-ui/styles"; @import "@opencode-ai/ui/v2/styles/tailwind.css"; +@import "tw-animate-css"; @font-face { font-family: "JetBrainsMono Nerd Font Mono"; diff --git a/packages/ui/package.json b/packages/ui/package.json index 991ec8232e7e..6312702331af 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -64,15 +64,16 @@ "generate:v2-oc2": "bun run script/build-oc2-v2-overrides.ts" }, "devDependencies": { + "@solidjs/meta": "catalog:", "@tailwindcss/vite": "catalog:", "@tsconfig/node22": "catalog:", "@types/bun": "catalog:", "@types/katex": "0.16.7", "@types/luxon": "catalog:", "@typescript/native-preview": "catalog:", - "@solidjs/meta": "catalog:", "solid-js": "catalog:", "tailwindcss": "catalog:", + "tw-animate-css": "1.4.0", "typescript": "catalog:", "vite": "catalog:", "vite-plugin-icons-spritesheet": "3.0.1", From 1310c07d0ff90b37dac0f0bce44d19668897578e Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 27 Jun 2026 02:34:25 +0800 Subject: [PATCH 2/2] refactor(app): use animation utilities for prompt controls --- packages/app/src/components/prompt-input.tsx | 6 +++--- packages/app/src/index.css | 9 --------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 3659e9d3437a..56f5296a8968 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1767,7 +1767,7 @@ export const PromptInput: Component = (props) => {
= (props) => {
= (props) => {