Collapsible Ask-User Question Card
可收起的提问卡片
`dsh`'s ask-user takeover renders the pending question set as a bottom card capped at `min(60vh, 520px)`, so a long batch or a user who wants to re-read the conversation above before deciding has no way to reduce the card — the conversation above becomes hard to read because only a few lines peek out at the top.
English
Problem
dsh's ask-user takeover renders the pending question set as a bottom card capped at min(60vh, 520px), so a long batch or a user who wants to re-read the conversation above before deciding has no way to reduce the card — the conversation above becomes hard to read because only a few lines peek out at the top.
Decision
Add a minimize/maximize toggle to the question card header, next to the existing dismiss action. Collapsing hides the option body and the footer actions, leaving a header strip (eyebrow, title, both icon buttons) so the user still sees that a question is pending; expanding restores the full card.
- State lives in
QuestionFlowlocal state (minimized), so drafts and the current question index survive collapse/expand — nothing is re-derived or reset, and the answers already picked remain submit-ready. - The toggle is a plain
IconChevronDownOutline14/IconChevronUpOutline14pair on the existing 24px icon-button grid;aria-expandedreflects the card state and the label flips betweennav.minimize/nav.maximize(the collapsed button reads "expand" for screen readers). - While minimized the option body and footer are unmounted (
{!minimized && ...}), so no hidden interactive surface remains in the a11y tree. - The collapse button is disabled while a submit/cancel is in flight (
busy !== null), matching the dismiss button's existing guard. - CSS:
.cardMinimizeddrops themax-heightcap and hides.body/.footer;.headergains bottom padding so the strip is not cramped. - Scope: only the generic question flow (
QuestionFlow) gets the toggle. The plan-review card (PlanReviewPanel) is a different shape (one decision over one plan) and keeps its current layout.
Consequences
- Users can shrink the question card to read the conversation, then expand to answer — drafts and position are preserved because the state lives in the flow component, not in the DOM.
- The minimize action is visually adjacent to dismiss; both share the icon button style, so the header stays balanced.
- Product copy additions are confined to the
questionlocale namespace (nav.minimize/nav.maximize), paired zh/en per the dictionary contract.
Alternatives considered
- Auto-collapse on scroll: collapsing the card when the user scrolls the conversation would reclaim space without a button, but it fights the user mid-interaction and hides the pending-question signal unexpectedly; an explicit toggle keeps the decision with the user.
- Resizable card: a drag handle would let users size the card freely, but it is more machinery than the ask needs and does not address "I want the card out of the way entirely".
- Persisting the collapsed state per session: nice-to-have, but the ask is per-interaction; persisting adds storage and sync complexity without a clear win for this surface.
中文
Problem
dsh 的 ask-user 接管界面把待回答的问题组渲染为底部卡片,高度上限为 min(60vh, 520px);当问题批次较长、或用户想先阅读上方的会话记录再决定时,卡片会占满大部分视口且无法缩小——上方会话几乎被遮住,只能看到顶部几行。
Decision
在提问卡片头部(现有的"放弃整组问题"按钮旁)增加收起/展开切换按钮。收起时隐藏选项主体和底部操作区,只保留一条头部(eyebrow、标题、两个图标按钮),用户仍能看到"有未答问题"的信号;展开后恢复完整卡片。
- 状态存放在
QuestionFlow的本地 state(minimized),因此收起/展开不会丢失草稿和当前题目索引——已选答案仍可直接提交。 - 切换按钮使用
IconChevronDownOutline14/IconChevronUpOutline14,复用现有 24px 图标按钮网格;aria-expanded反映卡片状态,文案在nav.minimize/nav.maximize之间切换(收起后按钮对读屏器显示为"展开")。 - 收起时选项主体和底部通过
{!minimized && ...}卸载,a11y 树中不残留隐藏的可交互面。 - 提交/取消进行中(
busy !== null)时收起按钮禁用,与现有放弃按钮的守卫一致。 - CSS:
.cardMinimized去掉max-height上限并隐藏.body/.footer;.header增加底部 padding,避免折叠后过于局促。 - 范围:只有通用提问流(
QuestionFlow)获得该切换。计划评审卡片(PlanReviewPanel)是另一种形态(对一个计划做一次决策),保持现有布局。
Consequences
- 用户可以缩小提问卡片以阅读会话,再展开作答——草稿和位置因状态存放在流程组件中而得以保留。
- 收起动作紧邻放弃按钮,二者共用图标按钮样式,头部保持平衡。
- 新增产品文案仅落在
questionlocale 命名空间(nav.minimize/nav.maximize),按字典契约中英成对。
Alternatives considered
- 滚动时自动收起:用户滚动会话时自动折叠卡片可以省空间,但会在交互中途与用户对抗,并意外隐藏"待答问题"信号;显式切换把决定权交给用户。
- 可拖拽调整大小:拖拽手柄让用户自由调整卡片大小,但比需求所需的机制更复杂,也没有解决"让卡片完全让开"的诉求。
- 按会话持久化折叠状态:锦上添花,但提问是单次交互;持久化引入存储与同步复杂度,对这个界面没有明确收益。