diff --git a/packages/app/src/pages/session/composer/session-question-dock.tsx b/packages/app/src/pages/session/composer/session-question-dock.tsx
index 7ba07b15d0..9dd8908934 100644
--- a/packages/app/src/pages/session/composer/session-question-dock.tsx
+++ b/packages/app/src/pages/session/composer/session-question-dock.tsx
@@ -4,6 +4,7 @@ import { useMutation } from "@tanstack/solid-query"
import { Button } from "@opencode-ai/ui/button"
import { DockPrompt } from "@opencode-ai/ui/dock-prompt"
import { Icon } from "@opencode-ai/ui/icon"
+import { IconButton } from "@opencode-ai/ui/icon-button"
import { showToast } from "@opencode-ai/ui/toast"
import type { QuestionAnswer, QuestionRequest } from "@opencode-ai/sdk/v2"
import { useLanguage } from "@/context/language"
@@ -25,6 +26,7 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit
custom: cached?.custom ?? ([] as string[]),
customOn: cached?.customOn ?? ([] as boolean[]),
editing: false,
+ collapsed: false,
})
let root: HTMLDivElement | undefined
@@ -35,6 +37,7 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit
const input = createMemo(() => store.custom[store.tab] ?? "")
const on = createMemo(() => store.customOn[store.tab] === true)
const multi = createMemo(() => question()?.multiple === true)
+ const picked = createMemo(() => store.answers[store.tab]?.length ?? 0)
const summary = createMemo(() => {
const n = Math.min(store.tab + 1, total())
@@ -43,6 +46,8 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit
const last = createMemo(() => store.tab >= total() - 1)
+ const fold = () => setStore("collapsed", (value) => !value)
+
const customUpdate = (value: string, selected: boolean = on()) => {
const prev = input().trim()
const next = value.trim()
@@ -261,9 +266,21 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit
kind="question"
ref={(el) => (root = el)}
header={
- <>
+
{
+ if (event.key !== "Enter" && event.key !== " ") return
+ event.preventDefault()
+ fold()
+ }}
+ >
{summary()}
-
+
{(_, i) => (
- >
+
+ {
+ event.preventDefault()
+ event.stopPropagation()
+ }}
+ onClick={(event) => {
+ event.stopPropagation()
+ fold()
+ }}
+ aria-label={store.collapsed ? language.t("session.todo.expand") : language.t("session.todo.collapse")}
+ />
+
+
}
footer={
<>
@@ -301,56 +343,121 @@ export const SessionQuestionDock: Component<{ request: QuestionRequest; onSubmit
>
}
>
-
{question()?.question}
-
{language.t("ui.question.singleHint")} }>
- {language.t("ui.question.multiHint")}
+ {
+ if (!store.collapsed) return
+ if (event.key !== "Enter" && event.key !== " ") return
+ event.preventDefault()
+ fold()
+ }}
+ >
+ {question()?.question}
+
+ 0}>
+
+ {picked()} answer{picked() === 1 ? "" : "s"} selected
+
-
-
- {(opt, i) => {
- const picked = () => store.answers[store.tab]?.includes(opt.label) ?? false
- return (
+
+ {language.t("ui.question.singleHint")}
}>
+ {language.t("ui.question.multiHint")}
+
+
+
+ {(opt, i) => {
+ const picked = () => store.answers[store.tab]?.includes(opt.label) ?? false
+ return (
+
+ )
+ }}
+
+
+ selectOption(i())}
+ onClick={customOpen}
>
-
-
+ {
+ e.preventDefault()
+ e.stopPropagation()
+ customToggle()
+ }}
+ >
+
}>
- {opt.label}
-
- {opt.description}
-
+ {language.t("ui.messagePart.option.typeOwnAnswer")}
+ {input() || language.t("ui.question.custom.placeholder")}
- )
- }}
-
-
-
+
-
-
-
- {language.t("ui.messagePart.option.typeOwnAnswer")}
-
-
-
+ data-slot="question-custom-input"
+ placeholder={language.t("ui.question.custom.placeholder")}
+ value={input()}
+ rows={1}
+ disabled={sending()}
+ onKeyDown={(e) => {
+ if (e.key === "Escape") {
+ e.preventDefault()
+ setStore("editing", false)
+ return
+ }
+ if (e.key !== "Enter" || e.shiftKey) return
+ e.preventDefault()
+ commitCustom()
+ }}
+ onInput={(e) => {
+ customUpdate(e.currentTarget.value)
+ e.currentTarget.style.height = "0px"
+ e.currentTarget.style.height = `${e.currentTarget.scrollHeight}px`
+ }}
+ />
+
+
+
+
)
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index bb16581d66..52179230c2 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -829,7 +829,7 @@
[data-slot="question-body"] {
display: flex;
flex-direction: column;
- gap: 16px;
+ gap: 0;
flex: 1;
min-height: 0;
padding: 8px 8px 0;
@@ -909,7 +909,7 @@
font-weight: var(--font-weight-medium);
line-height: var(--line-height-large);
color: var(--text-strong);
- padding: 0 10px;
+ padding: 16px 10px 0;
}
[data-slot="question-hint"] {
@@ -1052,8 +1052,26 @@
line-height: var(--line-height-large);
color: var(--text-base);
min-width: 0;
- overflow-wrap: anywhere;
- white-space: normal;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ [data-slot="question-option"][data-custom="true"] {
+ [data-slot="option-description"] {
+ overflow: visible;
+ text-overflow: clip;
+ white-space: normal;
+ overflow-wrap: anywhere;
+ }
+
+ &[data-picked="true"] {
+ [data-slot="question-custom-input"]:focus-visible {
+ outline: none;
+ outline-offset: 0;
+ border-radius: 0;
+ }
+ }
}
[data-slot="question-custom"] {