+
{composer}
)
diff --git a/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css b/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css
index 8837752830..f0a59942f7 100644
--- a/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css
+++ b/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css
@@ -20,10 +20,10 @@
display: flex;
flex-direction: column;
align-items: center;
- /* figma Input_Bottom: pad L32/R32/B12; the bottom gradient mask is owned by
- the chat scroller. Top 6 is the gap under the dock todo strip (12px todo
- margin + 6px here); error/status strips still carry their own margin. */
- padding: 6px 32px 12px;
+ /* figma Input_Bottom: pad L32/R32/B8; the bottom gradient mask is owned by
+ the chat scroller. No top pad: the composer stack's gap owns the space
+ above; error/status strips still carry their own margin. */
+ padding: 0 32px 8px;
}
.hero {
@@ -209,12 +209,16 @@
.mirror {
visibility: hidden;
pointer-events: none;
- /* figma min-h 52 (= ~2 × 24 line + 4pt); 14-line cap (336px). */
- min-height: 52px;
max-height: 336px;
overflow: hidden;
}
+/* Hero (centered empty-state) keeps the 2-line floor (figma min-h 52 = ~2 × 24
+ line + 4pt); the docked composer collapses to the content height. */
+.hero .mirror {
+ min-height: 52px;
+}
+
/* Toolbar: attach + Plan + Read-only on the left; model + send on the right
(figma Input_Bottom chrome). */
.row {
diff --git a/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx b/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
index 22f645f0ce..0f922b5930 100644
--- a/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
+++ b/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx
@@ -30,7 +30,7 @@ export type InputBarProps = ComposerBarProps
export function InputBar({
useSession, useInput, inputActions, keyboard, stop, command, translateHint, renderSlot, useNotices, useLexicon, useProjection,
- variant, placeholder, accessory, overlay, leftItems, rightItems, onAdd, addLabel = 'Add attachment',
+ variant, placeholder, accessory, overlay, leftItems, rightItems, footer, onAdd, addLabel = 'Add attachment',
}: InputBarProps) {
const input = useInput(s => s)
const notice = useNotices(s => s)
@@ -417,6 +417,7 @@ export function InputBar({
+ {footer}
)
}
diff --git a/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css b/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css
index 7b506b5553..716f3d9419 100644
--- a/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css
+++ b/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css
@@ -1,13 +1,14 @@
/* Todo strip above the composer (figma 772:51905 / 772:52972 / 772:53419):
tip surface, 14px radius, status icons + secondary item labels. Column is
- calc(100% - 88px) / max 776, centered; InputBar top pad supplies the gap. */
+ calc(100% - 88px) / max 752 (GoalBar's column), centered; the composer
+ stack owns the gap. */
.root {
flex: none;
overflow: hidden;
margin: 0 auto;
width: calc(100% - 88px);
- max-width: 776px;
+ max-width: 752px;
border: 1px solid var(--dsw-alias-border-l1);
border-radius: 14px;
background: var(--dsw-specific-tip);
@@ -20,11 +21,13 @@
--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);
}
+/* Compact scale (GoalBar reference): collapsed header totals the goal
+ strip's 38px (8+8 pad + 20 line + 2 border). */
.body {
display: flex;
flex-direction: column;
- gap: 10px;
- padding: 10px 16px;
+ gap: 8px;
+ padding: 8px 14px;
}
.header {
@@ -41,8 +44,8 @@
.title {
flex: none;
- font-size: 14px;
- line-height: 24px;
+ font-size: 13px;
+ line-height: 20px;
font-weight: 500;
color: var(--dsw-alias-label-primary);
}
diff --git a/packages/client/ui-conversation/tests/chat-stats-bash-sample.spec.tsx b/packages/client/ui-conversation/tests/chat-stats-bash-sample.spec.tsx
index 38edc48cca..2e9aa04f92 100644
--- a/packages/client/ui-conversation/tests/chat-stats-bash-sample.spec.tsx
+++ b/packages/client/ui-conversation/tests/chat-stats-bash-sample.spec.tsx
@@ -12,7 +12,7 @@ import type {
import { createSnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'
import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react'
import type { ToolRowProps } from '@deepseek-ai/dsh-client-ui-conversation/client'
-import { StatsLine, deriveStats, type StatsLineProps } from '../src/client/chat/StatsLine.tsx'
+import { StatsLine, deriveStats, formatDuration, formatTokens, type StatsLineProps } from '../src/client/chat/StatsLine.tsx'
import { BashRow } from '../src/client/toolviews/bash-sample.tsx'
afterEach(cleanup)
@@ -51,7 +51,7 @@ function makeSource(init?: Partial