From 2c17a980ffdc019d46b9e48a22bf719c009075e0 Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 17 Feb 2026 17:06:21 +0000 Subject: refactor(ui): extract dock prompt shell --- packages/app/src/components/question-dock.tsx | 316 ++++++++++----------- .../app/src/pages/session/session-prompt-dock.tsx | 106 ++++--- packages/ui/src/components/dock-prompt.tsx | 21 ++ packages/ui/src/components/message-part.css | 117 +++++++- 4 files changed, 333 insertions(+), 227 deletions(-) create mode 100644 packages/ui/src/components/dock-prompt.tsx diff --git a/packages/app/src/components/question-dock.tsx b/packages/app/src/components/question-dock.tsx index 1a0bbbe97..cd2e495b1 100644 --- a/packages/app/src/components/question-dock.tsx +++ b/packages/app/src/components/question-dock.tsx @@ -1,6 +1,7 @@ import { For, Show, createMemo, onCleanup, onMount, type Component } from "solid-js" import { createStore } from "solid-js/store" import { Button } from "@opencode-ai/ui/button" +import { DockPrompt } from "@opencode-ai/ui/dock-prompt" import { Icon } from "@opencode-ai/ui/icon" import { showToast } from "@opencode-ai/ui/toast" import type { QuestionAnswer, QuestionRequest } from "@opencode-ai/sdk/v2" @@ -232,9 +233,11 @@ export const QuestionDock: Component<{ request: QuestionRequest }> = (props) => } return ( -
(root = el)}> -
-
+ (root = el)} + header={ + <>
{summary()}
@@ -254,172 +257,169 @@ export const QuestionDock: Component<{ request: QuestionRequest }> = (props) => )}
-
- -
-
{question()?.question}
- {language.t("ui.question.singleHint")}
}> -
{language.t("ui.question.multiHint")}
- -
- - {(opt, i) => { - const picked = () => store.answers[store.tab]?.includes(opt.label) ?? false - return ( - - ) - }} - - - + + } + footer={ + <> + +
+ 0}> + + + +
+ + } + > +
{question()?.question}
+ {language.t("ui.question.singleHint")}
}> +
{language.t("ui.question.multiHint")}
+ +
+ + {(opt, i) => { + const picked = () => store.answers[store.tab]?.includes(opt.label) ?? false + return ( + + + + {opt.label} + + {opt.description} + + + + ) + }} + + + + + + {language.t("ui.messagePart.option.typeOwnAnswer")} + {input() || language.t("ui.question.custom.placeholder")} + + + } + > +
{ + if (store.sending) { + e.preventDefault() + return } + if (e.target instanceof HTMLTextAreaElement) return + const input = e.currentTarget.querySelector('[data-slot="question-custom-input"]') + if (input instanceof HTMLTextAreaElement) input.focus() + }} + onSubmit={(e) => { + e.preventDefault() + commitCustom() + }} + > + + + {language.t("ui.messagePart.option.typeOwnAnswer")} +