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:
+36
-29
@@ -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: "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user