You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
stop the base and shimmer text layers cross-fading over each other when shimmer activity finishes
keep the fade-in while active, but switch immediately to the single base layer on completion
force reduced-motion mode to render only the base layer instead of stacking both copies
Root cause
TextShimmer intentionally renders two copies of its text. Both opacity layers were visible during the active-to-inactive cross-fade, and reduced-motion mode made both copies fully opaque while active. This made shimmer-backed labels appear artificially bold even though their computed font weight was unchanged.
Checks
bun typecheck (packages/ui)
bun typecheck (packages/session-ui)
bun test src/timeline/projection.test.ts (packages/session-ui)
Playwright Storybook probe: completion resolves to base opacity 1, shimmer opacity 0
Playwright reduced-motion probe: one visible layer, zero transition, no animation
AI code review — automated review for reference; please use your judgment.
packages/ui/src/typography/text-shimmer/text-shimmer.css:39 — The transition now exists only under [data-active="true"], so the active→inactive flip loses its fade exactly when the opacity change happens — characters will snap instead of easing out. Why it matters: if the overlap fix requires an instant exit this is correct, but as written it reads accidental. Suggestion: either document the intentional asymmetry here, or declare a shorter reverse transition on the base rule so exits still animate without overlapping.
packages/ui/src/typography/text-shimmer/text-shimmer.css:119 — opacity: 0 !important in the reduced-motion block is heavier than needed if source order/specificity already win, and it permanently blocks theme-level overrides of the shimmer layer's opacity. Suggestion: try the plain declaration first; reserve !important for a proven specificity conflict and note which rule it beats.
packages/ui/src/typography/text-shimmer/text-shimmer.css:39 — A one-line comment explaining the mechanism being prevented (two stacked grid-area: 1/1 layers cross-fading during text swaps ⇒ double-exposure) would stop a future refactor from re-hoisting the transition to the unconditional rule.
tests (coverage) — CSS-only change, but the component has observable computed styles: a Storybook/interaction check asserting (a) no running transition on inactive shimmer and (b) opacity: 0 on the shimmer layer under emulated prefers-reduced-motion would pin both fixes against regression.
— automated review (ox-alpha, round2)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Root cause
TextShimmerintentionally renders two copies of its text. Both opacity layers were visible during the active-to-inactive cross-fade, and reduced-motion mode made both copies fully opaque while active. This made shimmer-backed labels appear artificially bold even though their computed font weight was unchanged.Checks
bun typecheck(packages/ui)bun typecheck(packages/session-ui)bun test src/timeline/projection.test.ts(packages/session-ui)1, shimmer opacity0Requested by: @Hona (Hona via Slack)