fix(styles): keep Snow wind sway bounded over time (#782)

The horizontal offset multiplied elapsed time by a sine, so flakes swung faster the longer the app ran. It is now the integral of the intended sway velocity, which stays bounded at any session age; Wind still scales the amplitude.

Co-authored-by: Sameh Khamis <[email protected]>
This commit is contained in:
HEOJUNFOandSameh Khamis authored and GitHub committed 2026-10-14 11:48:51 -07:00
1 parent 95d376f13d
commit 750f3da6eb
3 files changed
+9 -2

No files matched your search

+3
View File
@@ -1,5 +1,8 @@
# Changelog # Changelog
- Snow flakes sway within a fixed range instead of drifting sideways faster the
longer the app runs; the Wind setting still scales the sway.
- The right rail ignores panels that other CSS hides, such as during an event - The right rail ignores panels that other CSS hides, such as during an event
view, so they no longer force one-panel-at-a-time layout or collapse visible view, so they no longer force one-panel-at-a-time layout or collapse visible
panels. Panels the rail collapses itself are still restored. panels. Panels the rail collapses itself are still restored.
+2
View File
@@ -1013,6 +1013,8 @@ and sharpen. Display supplies actions and renders settings; effect execution has
no DOM dependency. Existing presets and the 500 ms transition remain unchanged. no DOM dependency. Existing presets and the 500 ms transition remain unchanged.
Stopping the controller revokes animation before asynchronous UI teardown; final Stopping the controller revokes animation before asynchronous UI teardown; final
destruction removes its stages and restores the borrowed bloom configuration. destruction removes its stages and restores the borrowed bloom configuration.
Snow's sideways sway stays within a fixed range at any session age; Wind scales
its amplitude.
## Display control ownership ## Display control ownership
+4 -2
View File
@@ -29,11 +29,13 @@ export const snowShader = {
float depth = 0.5 + layer * 0.5; float depth = 0.5 + layer * 0.5;
float speed = 0.4 + layer * 0.3; float speed = 0.4 + layer * 0.3;
float size = mix(0.01, 0.025, layer); float size = mix(0.01, 0.025, layer);
float windForce = sin(time * 0.5 + layer * 3.14) * (0.05 + wind * 0.2); float windForce = 0.05 + wind * 0.2;
vec2 snowUV = uv * vec2(1.0, 0.5) * (4.0 + layer * 4.0); vec2 snowUV = uv * vec2(1.0, 0.5) * (4.0 + layer * 4.0);
snowUV.y += time * speed; snowUV.y += time * speed;
snowUV.x += time * windForce; // Offset is the integral of a swaying velocity sin(time * 0.5 + phase) * windForce,
// so the sway stays bounded however long the app has been running.
snowUV.x -= 2.0 * cos(time * 0.5 + layer * 3.14) * windForce;
vec2 cell = floor(snowUV); vec2 cell = floor(snowUV);
vec2 f = fract(snowUV); vec2 f = fract(snowUV);