From 28d058ad2ea3642c9c467cd044a01bef723f6cb9 Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Fri, 3 Jul 2026 22:32:53 -0400 Subject: [PATCH] Start fade spans when appended --- static/messages.js | 14 ++------------ tests/test_smooth_text_fade.py | 7 +++---- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/static/messages.js b/static/messages.js index f0ec6b0d..c5f8c211 100644 --- a/static/messages.js +++ b/static/messages.js @@ -2543,7 +2543,6 @@ function attachLiveStream(activeSid, streamId, uploaded=[], options={}){ let _streamFadeLastArrivalMs=0; let _streamFadeArrivalWps=0; let _streamFadeLatestAnimationEndAt=0; - let _streamFadeAppendOffset=0; let _streamFadeVisibleWords=0; let _streamFadeHoldUntilMs=0; let _streamFadeCurrentMs=200; @@ -2560,7 +2559,6 @@ function attachLiveStream(activeSid, streamId, uploaded=[], options={}){ let _lastRunJournalEventId=''; const _STREAM_FADE_MS=200; const _STREAM_FADE_MAX_MS=350; - const _STREAM_FADE_STAGGER_MS=16; const _STREAM_FADE_DONE_MAX_MS=320; const _STREAM_FADE_DONE_DRAIN_MAX_MS=900; const _anchorApi=(typeof window!=='undefined'&&window.HermesAssistantTurnAnchors) @@ -4088,7 +4086,6 @@ function attachLiveStream(activeSid, streamId, uploaded=[], options={}){ _streamFadeLastArrivalMs=0; _streamFadeArrivalWps=0; _streamFadeLatestAnimationEndAt=0; - _streamFadeAppendOffset=0; _streamFadeVisibleWords=0; _streamFadeHoldUntilMs=0; _streamFadeCurrentMs=_STREAM_FADE_MS; @@ -4162,13 +4159,10 @@ function attachLiveStream(activeSid, streamId, uploaded=[], options={}){ const span=document.createElement('span'); span.className='stream-fade-word is-new'; const fadeMs=_streamFadeCurrentMs||_STREAM_FADE_MS; - const delayMs=_streamFadeAppendOffset*_STREAM_FADE_STAGGER_MS; - span.style.animationDelay=delayMs+'ms'; if(fadeMs!==_STREAM_FADE_MS) span.style.setProperty('--stream-fade-ms',fadeMs+'ms'); span.textContent=match[1]; frag.appendChild(span); - _streamFadeAppendOffset+=1; - _streamFadeLatestAnimationEndAt=Math.max(_streamFadeLatestAnimationEndAt,appendStartedAt+delayMs+fadeMs); + _streamFadeLatestAnimationEndAt=Math.max(_streamFadeLatestAnimationEndAt,appendStartedAt+fadeMs); if(match[2]) frag.appendChild(document.createTextNode(match[2])); last=match.index+match[0].length; changed=true; @@ -4241,7 +4235,6 @@ function attachLiveStream(activeSid, streamId, uploaded=[], options={}){ const wordRe=/(\S+)(\s*)/g; const appendStartedAt=performance.now(); let last=0, match, changed=false; - _streamFadeAppendOffset=0; while((match=wordRe.exec(value))){ if(match.index>last) frag.appendChild(document.createTextNode(value.slice(last,match.index))); if(reduceMotion){ @@ -4250,13 +4243,10 @@ function attachLiveStream(activeSid, streamId, uploaded=[], options={}){ const span=document.createElement('span'); span.className='stream-fade-word is-new'; const fadeMs=_streamFadeCurrentMs||_STREAM_FADE_MS; - const delayMs=_streamFadeAppendOffset*_STREAM_FADE_STAGGER_MS; - span.style.animationDelay=delayMs+'ms'; if(fadeMs!==_STREAM_FADE_MS) span.style.setProperty('--stream-fade-ms',fadeMs+'ms'); span.textContent=match[1]; frag.appendChild(span); - _streamFadeAppendOffset+=1; - _streamFadeLatestAnimationEndAt=Math.max(_streamFadeLatestAnimationEndAt,appendStartedAt+delayMs+fadeMs); + _streamFadeLatestAnimationEndAt=Math.max(_streamFadeLatestAnimationEndAt,appendStartedAt+fadeMs); } if(match[2]) frag.appendChild(document.createTextNode(match[2])); last=match.index+match[0].length; diff --git a/tests/test_smooth_text_fade.py b/tests/test_smooth_text_fade.py index f203fe58..c4f09425 100644 --- a/tests/test_smooth_text_fade.py +++ b/tests/test_smooth_text_fade.py @@ -82,14 +82,12 @@ let _streamFadeLastTargetWords=0; let _streamFadeLastArrivalMs=0; let _streamFadeArrivalWps=0; let _streamFadeLatestAnimationEndAt=0; -let _streamFadeAppendOffset=0; let _streamFadeVisibleWords=0; let _streamFadeHoldUntilMs=0; let _streamFadeCurrentMs=200; let _streamFadeDomText=''; const _STREAM_FADE_MS=200; const _STREAM_FADE_MAX_MS=350; -const _STREAM_FADE_STAGGER_MS=16; const _STREAM_FADE_DONE_MAX_MS=320; const _STREAM_FADE_DONE_DRAIN_MAX_MS=900; const performance={performance_stub}; @@ -202,6 +200,9 @@ def test_stream_fade_uses_incremental_renderer_without_changing_default_path(): ["animationend", "span.replaceWith(document.createTextNode"], ) assert "_wrapStreamingFadeWords" not in MESSAGES_JS + assert "animationDelay" not in renderer_block + assert "_STREAM_FADE_STAGGER_MS" not in MESSAGES_JS + assert "_streamFadeAppendOffset" not in MESSAGES_JS def test_stream_fade_appends_new_spans_without_replacing_existing_nodes(): @@ -209,8 +210,6 @@ def test_stream_fade_appends_new_spans_without_replacing_existing_nodes(): function_block(MESSAGES_JS, "_streamFadeAppendText") + r""" const _STREAM_FADE_MS=200; -const _STREAM_FADE_STAGGER_MS=16; -let _streamFadeAppendOffset=0; let _streamFadeLatestAnimationEndAt=0; let _streamFadeCurrentMs=200; const performance={_t:0,now(){return this._t;}};