Optimize WebUI streaming and long history rendering

Batch stream deltas, window long transcripts, lazy-load syntax highlighting, and refine activity/composer interactions.

Add title refresh retries plus tests for streaming, windowing, code blocks, and live activity behavior.
This commit is contained in:
Xubin Ren
2026-05-17 17:04:57 +08:00
parent 175b58e259
commit e5be4dac7a
30 changed files with 1551 additions and 282 deletions
+36 -29
View File
@@ -117,53 +117,60 @@
--cjk-line-height: 1.625;
}
/* L→R sheen over solid label text (overlay stripe). Avoids ``background-clip:
text`` loop seams that read as RTL “erase” or one-frame transparent glyphs. */
@keyframes reasoning-sheen-ltr {
/* L→R sheen clipped to live activity labels. The highlight lives inside
the glyphs, not in the row background, so dark mode stays quiet. */
@keyframes streaming-text-sheen-ltr {
0% {
left: -44%;
background-position: 140% 50%;
}
100% {
left: 118%;
background-position: -40% 50%;
}
}
.reasoning-sheen-track {
.streaming-text-sheen {
position: relative;
color: hsl(var(--muted-foreground));
}
.streaming-text-sheen::after {
content: attr(data-sheen-text);
position: absolute;
inset: 0;
z-index: 1;
display: block;
overflow: hidden;
border-radius: 2px;
white-space: nowrap;
text-overflow: ellipsis;
pointer-events: none;
}
.reasoning-sheen-stripe {
position: absolute;
top: 0;
bottom: 0;
width: 44%;
min-width: 3.25rem;
left: -44%;
border-radius: inherit;
color: transparent;
background: linear-gradient(
90deg,
transparent 0%,
hsl(0 0% 100% / 0.07) 34%,
hsl(0 0% 100% / 0.76) 50%,
hsl(0 0% 100% / 0.07) 66%,
transparent 38%,
hsl(var(--foreground) / 0.98) 50%,
transparent 62%,
transparent 100%
);
mix-blend-mode: soft-light;
opacity: 0.95;
animation: reasoning-sheen-ltr 5.2s linear infinite;
background-size: 260% 100%;
background-position: 140% 50%;
background-repeat: no-repeat;
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: streaming-text-sheen-ltr 2.8s ease-in-out infinite;
}
.dark .reasoning-sheen-stripe {
mix-blend-mode: overlay;
opacity: 1;
.dark .streaming-text-sheen::after {
background-image: linear-gradient(
90deg,
transparent 0%,
transparent 38%,
hsl(var(--foreground) / 0.98) 50%,
transparent 62%,
transparent 100%
);
}
@media (prefers-reduced-motion: reduce) {
.reasoning-sheen-stripe {
.streaming-text-sheen::after {
animation: none;
opacity: 0;
visibility: hidden;
content: "";
}
}