mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-09-09 04:02:35 +00:00
235 lines
5.9 KiB
CSS
235 lines
5.9 KiB
CSS
/* Floating capsule input (figma Input_Bottom 75:8208): card floats above the
|
||
viewport bottom inside the centered message column; textarea on top, action
|
||
row below, one primary circle button bottom-right. Input width rides the
|
||
column (800 is a cap, not a fixed size — layout rule: the box shrinks with
|
||
the center column keeping its padding). Hero variant = the same card
|
||
centered in the empty state; the transition between the two is a position
|
||
move of one component. */
|
||
|
||
.root {
|
||
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 8 hosts the error strip's breathing room. */
|
||
padding: 8px 32px 12px;
|
||
}
|
||
|
||
.hero {
|
||
padding: 0;
|
||
}
|
||
|
||
.error {
|
||
width: 100%;
|
||
max-width: 800px;
|
||
margin-bottom: 6px;
|
||
padding: 4px 8px;
|
||
border-radius: 8px;
|
||
background: var(--dsw-alias-interactive-bg-hover-danger);
|
||
color: var(--dsw-alias-state-error-primary);
|
||
font-size: 12px;
|
||
line-height: 18px;
|
||
}
|
||
|
||
.card {
|
||
display: flex;
|
||
flex-direction: column;
|
||
/* figma Input 75:8208: 12px between the text area and the button row; 10px
|
||
top pad on the card before .InputText. */
|
||
gap: 12px;
|
||
width: 100%;
|
||
max-width: 800px;
|
||
padding-top: 10px;
|
||
/* Input stroke: black/0.10 light, white/0.06 dark (figma darkmode note says
|
||
the input border is one notch weaker than buttons) — exactly the
|
||
l2-darkmode-thin pair. Fill: the input surface token (elevated in dark). */
|
||
border: 1px solid var(--dsw-alias-border-l2-darkmode-thin);
|
||
border-radius: 20px;
|
||
background: var(--dsw-specific-input-major);
|
||
box-shadow: var(--dsw-shadow-lv2);
|
||
font-size: 16px;
|
||
line-height: 24px;
|
||
}
|
||
|
||
.accessory {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
padding: 10px 12px 0;
|
||
}
|
||
|
||
/* Mirror-div auto-grow wrapper: the hidden mirror is in normal flow and sets the height
|
||
(min 2 lines / max 14 lines); the textarea rides it absolutely. Mirror and textarea
|
||
MUST share font, line-height, padding and wrapping rules or heights diverge. */
|
||
.grow {
|
||
position: relative;
|
||
}
|
||
|
||
.input {
|
||
position: absolute;
|
||
inset: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
resize: none;
|
||
overflow-y: auto;
|
||
border: none;
|
||
outline: none;
|
||
background: transparent;
|
||
color: var(--dsw-alias-label-primary);
|
||
/* Business blue, not brand-primary: that token resolves to ink in this sheet. */
|
||
caret-color: var(--dsw-alias-state-business-primary);
|
||
}
|
||
|
||
.input,
|
||
.mirror {
|
||
/* figma .InputText 34:10434: pl 16 / pr 12 / pt 4. */
|
||
padding: 4px 12px 0 16px;
|
||
font-size: inherit;
|
||
line-height: inherit;
|
||
white-space: pre-wrap;
|
||
word-break: break-word;
|
||
overflow-wrap: anywhere;
|
||
}
|
||
|
||
/* figma 34:10434: #ADB2B8 light / #81858C dark — the caption pair exactly. */
|
||
.input::placeholder {
|
||
color: var(--dsw-alias-label-caption);
|
||
user-select: none;
|
||
}
|
||
|
||
/* Running lock: grayed but the draft stays visible; the turn ending re-enables. */
|
||
.input:disabled {
|
||
color: var(--dsw-alias-label-tertiary);
|
||
cursor: not-allowed;
|
||
}
|
||
|
||
.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;
|
||
}
|
||
|
||
/* Toolbar: attach + Plan + Read-only on the left; model + send on the right
|
||
(figma Input_Bottom chrome). */
|
||
.row {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 12px;
|
||
padding: 0 10px 10px 10px;
|
||
min-width: 0;
|
||
}
|
||
|
||
.tools,
|
||
.modes,
|
||
.trailing {
|
||
display: flex;
|
||
align-items: center;
|
||
min-width: 0;
|
||
}
|
||
|
||
/* figma 75:8208: 16 between + and the mode chips; 4 between Plan / Read-only. */
|
||
.tools {
|
||
gap: 16px;
|
||
}
|
||
|
||
.modes {
|
||
gap: 4px;
|
||
}
|
||
|
||
.trailing {
|
||
flex: none;
|
||
gap: 12px;
|
||
}
|
||
|
||
/* Attach circle (figma + control): 28px, selector fill, primary glyph. */
|
||
.add {
|
||
display: grid;
|
||
place-items: center;
|
||
flex: none;
|
||
width: 28px;
|
||
height: 28px;
|
||
border: none;
|
||
border-radius: 999px;
|
||
background: var(--dsw-specific-selector);
|
||
color: var(--dsw-alias-label-primary);
|
||
cursor: pointer;
|
||
}
|
||
|
||
.add:hover:not(:disabled) {
|
||
background: var(--dsw-alias-interactive-bg-hover-solid);
|
||
}
|
||
|
||
.add:disabled {
|
||
opacity: 0.5;
|
||
cursor: default;
|
||
}
|
||
|
||
/* Plan / Read-only / model — native <select>, chip-like closed chrome
|
||
(figma ToggleButton: 13/20 medium secondary, 12px chevron). */
|
||
.select {
|
||
max-width: 220px;
|
||
height: 28px;
|
||
padding: 0 20px 0 8px;
|
||
border: none;
|
||
border-radius: 8px;
|
||
outline: none;
|
||
background-color: transparent;
|
||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
|
||
background-repeat: no-repeat;
|
||
background-position: right 4px center;
|
||
background-size: 12px 12px;
|
||
color: var(--dsw-alias-label-secondary);
|
||
font-size: 13px;
|
||
line-height: 20px;
|
||
font-weight: 500;
|
||
white-space: nowrap;
|
||
cursor: pointer;
|
||
appearance: none;
|
||
}
|
||
|
||
.select:hover:not(:disabled) {
|
||
background-color: var(--dsw-alias-interactive-bg-hover);
|
||
}
|
||
|
||
.select:disabled {
|
||
opacity: 0.5;
|
||
cursor: default;
|
||
}
|
||
|
||
/* Primary send (figma IconButton 34:10465): 34px circle, #3964FE light /
|
||
#679EFE dark — the info-fill pair (500→400), NOT button-primary (ink);
|
||
white glyph; empty text = 0.4 opacity. */
|
||
.primary {
|
||
display: grid;
|
||
place-items: center;
|
||
flex: none;
|
||
width: 34px;
|
||
height: 34px;
|
||
border: none;
|
||
border-radius: 999px;
|
||
background: var(--dsw-alias-button-info-fill);
|
||
color: var(--dsw-alias-label-primary-foreground);
|
||
cursor: pointer;
|
||
}
|
||
|
||
.primary:hover {
|
||
background: var(--dsw-alias-button-info-hover);
|
||
}
|
||
|
||
.primary:disabled {
|
||
opacity: 0.4;
|
||
cursor: default;
|
||
}
|
||
|
||
/* Stop state: same slot, dimmed brand fill — the running-state send-key
|
||
replacement is a design gap filled by us (figma gives no stop form). */
|
||
.stopping,
|
||
.stopping:hover {
|
||
background: var(--dsw-alias-button-primary-dimmed);
|
||
color: var(--dsw-alias-brand-text);
|
||
}
|