mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Consume the card:'read' result view (path, numbered lines, totalLines, lang) the read backend PR added. ReadBlock (ui-primitives) draws a per-line gutter with each line's own file number, shiki highlighting via a new highlightLines returning per-line token arrays, a 显示 X / Y 行 window note, a height cap matching TerminalBlock, and a copy control. read-card-model is the single resultView derivation; a keyed ReadRow registers under read with the card resident under its path-link summary. The generic fallback and the details panel are read-aware. Fixture gains a windowed read turn for the built-boot snapshot.
118 lines
2.8 KiB
CSS
118 lines
2.8 KiB
CSS
/* Geometry mirrors CodeBlock (12px radius, code-block surface + banner row,
|
|
markdown code-block font) so a read card and a fenced code block read as one
|
|
family. Content keeps `white-space: pre` and scrolls horizontally rather than
|
|
folding, because a source line's indentation is part of what a reader is
|
|
reading. */
|
|
|
|
.block {
|
|
--dsl-read-radius: 12px;
|
|
--dsl-read-line-height: 22px;
|
|
/* Fixed-width gutter column for the line numbers, so the content edge stays
|
|
put down the whole window regardless of how wide the numbers grow. */
|
|
--dsl-read-gutter: 48px;
|
|
|
|
position: relative;
|
|
margin: 16px 0;
|
|
color: var(--dsw-alias-label-primary);
|
|
background: var(--dsw-alias-markdown-code-block);
|
|
border-radius: var(--dsl-read-radius);
|
|
}
|
|
|
|
.banner {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
gap: 12px;
|
|
padding: 9px 14px;
|
|
background: var(--dsw-alias-markdown-code-block-banner);
|
|
border-top-left-radius: var(--dsl-read-radius);
|
|
border-top-right-radius: var(--dsl-read-radius);
|
|
}
|
|
|
|
.label {
|
|
min-width: 0;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
color: var(--dsw-alias-label-primary);
|
|
font-family: var(--ds-font-family-code);
|
|
font-size: 12px;
|
|
line-height: 18px;
|
|
}
|
|
|
|
.action {
|
|
display: flex;
|
|
align-items: center;
|
|
flex-shrink: 0;
|
|
gap: 12px;
|
|
}
|
|
|
|
.count {
|
|
color: var(--dsw-alias-label-tertiary);
|
|
font: var(--dsw-font-xs-13);
|
|
}
|
|
|
|
.lang {
|
|
color: var(--dsw-alias-label-tertiary);
|
|
font-family: var(--ds-font-family-code);
|
|
font-size: 12px;
|
|
line-height: 18px;
|
|
}
|
|
|
|
.copyButton {
|
|
background-color: transparent;
|
|
border: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
color: var(--dsw-alias-label-secondary);
|
|
cursor: pointer;
|
|
font: var(--dsw-font-xs-13);
|
|
}
|
|
|
|
.body {
|
|
padding: 12px 0;
|
|
font: var(--dsw-font-markdown-code-block);
|
|
overflow-x: auto;
|
|
overflow-y: hidden;
|
|
}
|
|
|
|
/* One row per file line: a fixed gutter column, then the content. No wrapping —
|
|
a source line's leading whitespace is meaningful and scrolls sideways. */
|
|
.line {
|
|
display: flex;
|
|
min-height: var(--dsl-read-line-height);
|
|
line-height: var(--dsl-read-line-height);
|
|
white-space: pre;
|
|
}
|
|
|
|
.gutter {
|
|
flex: none;
|
|
width: var(--dsl-read-gutter);
|
|
padding-right: 14px;
|
|
text-align: right;
|
|
color: var(--dsw-alias-label-tertiary);
|
|
/* The gutter is chrome, not content: keep it out of a text selection so a
|
|
copy of the visible rows carries the source, not the line numbers. */
|
|
user-select: none;
|
|
}
|
|
|
|
.content {
|
|
color: var(--dsw-alias-label-primary);
|
|
}
|
|
|
|
.expand {
|
|
display: block;
|
|
width: 100%;
|
|
padding: 0 0 0 var(--dsl-read-gutter);
|
|
border: none;
|
|
background-color: transparent;
|
|
color: var(--dsw-alias-label-tertiary);
|
|
cursor: pointer;
|
|
font: inherit;
|
|
text-align: left;
|
|
}
|
|
|
|
.expand:hover {
|
|
color: var(--dsw-alias-label-secondary);
|
|
}
|