diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index b897e394aa1..573ef970fee 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -34,6 +34,7 @@ import { useComments } from "@/context/comments" import { FileIcon } from "@opencode-ai/ui/file-icon" import { Button } from "@opencode-ai/ui/button" import { Icon } from "@opencode-ai/ui/icon" +import { OCSpinner } from "@opencode-ai/ui/oc-spinner" import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import type { IconName } from "@opencode-ai/ui/icons/provider" import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" @@ -1623,6 +1624,12 @@ export const PromptInput: Component = (props) => { return (
+ +
+ +
{language.t("ui.sessionTurn.status.working")}...
+
+
{ diff --git a/packages/ui/src/components/oc-spinner.css b/packages/ui/src/components/oc-spinner.css new file mode 100644 index 00000000000..e8f7b02105e --- /dev/null +++ b/packages/ui/src/components/oc-spinner.css @@ -0,0 +1,6 @@ +[data-component="oc-spinner"] { + color: var(--text-base); + flex-shrink: 0; + width: 20px; + aspect-ratio: 1; +} diff --git a/packages/ui/src/components/oc-spinner.tsx b/packages/ui/src/components/oc-spinner.tsx new file mode 100644 index 00000000000..870d6102743 --- /dev/null +++ b/packages/ui/src/components/oc-spinner.tsx @@ -0,0 +1,66 @@ +import { ComponentProps } from "solid-js" +import "./oc-spinner.css" + +export function OCSpinner(props: Readonly<{ + class?: string + classList?: ComponentProps<"svg">["classList"] + style?: ComponentProps<"svg">["style"] +}>) { + + return ( + + + {/* Layer 1: Static perimeter base */} + + + {/* Layer 1b: Inner background (perimeterBG) - only bottom area */} + + + {/* Layer 2: Animated trail with motion blur on both ends (12 segments) */} + + + + + + + + + + + + + + + ) +} diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts index d1abf5de32d..44588d6c86a 100644 --- a/packages/ui/src/i18n/ar.ts +++ b/packages/ui/src/i18n/ar.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "تفكير - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "جمع الأفكار", "ui.sessionTurn.status.consideringNextSteps": "النظر في الخطوات التالية", + "ui.sessionTurn.status.working": "جاري العمل", "ui.messagePart.diagnostic.error": "خطأ", "ui.messagePart.title.edit": "تحرير", diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts index 36bef265079..cbb42815a0e 100644 --- a/packages/ui/src/i18n/br.ts +++ b/packages/ui/src/i18n/br.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Pensando - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Organizando pensamentos", "ui.sessionTurn.status.consideringNextSteps": "Considerando próximos passos", + "ui.sessionTurn.status.working": "Trabalhando", "ui.messagePart.diagnostic.error": "Erro", "ui.messagePart.title.edit": "Editar", diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts index 0142d161f44..28cdc09c27e 100644 --- a/packages/ui/src/i18n/da.ts +++ b/packages/ui/src/i18n/da.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Tænker - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Samler tanker", "ui.sessionTurn.status.consideringNextSteps": "Overvejer næste skridt", + "ui.sessionTurn.status.working": "Arbejder", "ui.messagePart.diagnostic.error": "Fejl", "ui.messagePart.title.edit": "Rediger", diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts index e004233f606..b59c7122b71 100644 --- a/packages/ui/src/i18n/de.ts +++ b/packages/ui/src/i18n/de.ts @@ -37,6 +37,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Denken - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Gedanken sammeln", "ui.sessionTurn.status.consideringNextSteps": "Nächste Schritte erwägen", + "ui.sessionTurn.status.working": "Arbeiten", "ui.messagePart.diagnostic.error": "Fehler", "ui.messagePart.title.edit": "Bearbeiten", diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts index a92a498c983..4f1bfc763fd 100644 --- a/packages/ui/src/i18n/en.ts +++ b/packages/ui/src/i18n/en.ts @@ -34,6 +34,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Thinking - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Gathering thoughts", "ui.sessionTurn.status.consideringNextSteps": "Considering next steps", + "ui.sessionTurn.status.working": "Working", "ui.messagePart.diagnostic.error": "Error", "ui.messagePart.title.edit": "Edit", diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts index 283548bb343..9f223bf46e3 100644 --- a/packages/ui/src/i18n/es.ts +++ b/packages/ui/src/i18n/es.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Pensando - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Recopilando pensamientos", "ui.sessionTurn.status.consideringNextSteps": "Considerando siguientes pasos", + "ui.sessionTurn.status.working": "Trabajando", "ui.messagePart.diagnostic.error": "Error", "ui.messagePart.title.edit": "Editar", diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts index e9ab8bf8ad1..301d8b85a8b 100644 --- a/packages/ui/src/i18n/fr.ts +++ b/packages/ui/src/i18n/fr.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Réflexion - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Rassemblement des idées", "ui.sessionTurn.status.consideringNextSteps": "Examen des prochaines étapes", + "ui.sessionTurn.status.working": "En cours", "ui.messagePart.diagnostic.error": "Erreur", "ui.messagePart.title.edit": "Modifier", diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts index 4da2578d3ae..2dad27a247d 100644 --- a/packages/ui/src/i18n/ja.ts +++ b/packages/ui/src/i18n/ja.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "思考中 - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "考えをまとめています", "ui.sessionTurn.status.consideringNextSteps": "次のステップを検討中", + "ui.sessionTurn.status.working": "作業中", "ui.messagePart.diagnostic.error": "エラー", "ui.messagePart.title.edit": "編集", diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts index 9fb120b5ea0..15e2aefe306 100644 --- a/packages/ui/src/i18n/ko.ts +++ b/packages/ui/src/i18n/ko.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "생각 중 - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "생각 정리 중", "ui.sessionTurn.status.consideringNextSteps": "다음 단계 고려 중", + "ui.sessionTurn.status.working": "작업 중", "ui.messagePart.diagnostic.error": "오류", "ui.messagePart.title.edit": "편집", diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts index e578e3cdfa3..b0157445df7 100644 --- a/packages/ui/src/i18n/no.ts +++ b/packages/ui/src/i18n/no.ts @@ -36,6 +36,7 @@ export const dict: Record = { "ui.sessionTurn.status.thinkingWithTopic": "Tenker - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Samler tanker", "ui.sessionTurn.status.consideringNextSteps": "Vurderer neste trinn", + "ui.sessionTurn.status.working": "Arbeider", "ui.messagePart.diagnostic.error": "Feil", "ui.messagePart.title.edit": "Rediger", diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts index 0690a75818f..8d4a941b3c8 100644 --- a/packages/ui/src/i18n/pl.ts +++ b/packages/ui/src/i18n/pl.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Myślenie - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Zbieranie myśli", "ui.sessionTurn.status.consideringNextSteps": "Rozważanie kolejnych kroków", + "ui.sessionTurn.status.working": "Pracuję", "ui.messagePart.diagnostic.error": "Błąd", "ui.messagePart.title.edit": "Edycja", diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts index d5a5b59fa85..130828bc4ed 100644 --- a/packages/ui/src/i18n/ru.ts +++ b/packages/ui/src/i18n/ru.ts @@ -33,6 +33,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Размышление - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Сбор мыслей", "ui.sessionTurn.status.consideringNextSteps": "Рассмотрение следующих шагов", + "ui.sessionTurn.status.working": "Работаю", "ui.messagePart.diagnostic.error": "Ошибка", "ui.messagePart.title.edit": "Редактировать", diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts index 25f36b3cd21..cc065b15585 100644 --- a/packages/ui/src/i18n/zh.ts +++ b/packages/ui/src/i18n/zh.ts @@ -37,6 +37,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "思考:{{topic}}", "ui.sessionTurn.status.gatheringThoughts": "正在整理思路", "ui.sessionTurn.status.consideringNextSteps": "正在考虑下一步", + "ui.sessionTurn.status.working": "处理中", "ui.messagePart.diagnostic.error": "错误", "ui.messagePart.title.edit": "编辑", diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts index ebc096cbf74..fc45b9777db 100644 --- a/packages/ui/src/i18n/zht.ts +++ b/packages/ui/src/i18n/zht.ts @@ -37,6 +37,7 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "思考 - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "正在整理思緒", "ui.sessionTurn.status.consideringNextSteps": "正在考慮下一步", + "ui.sessionTurn.status.working": "處理中", "ui.messagePart.diagnostic.error": "錯誤", "ui.messagePart.title.edit": "編輯",