aboutsummaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authoruser <user@clank>2026-08-30 19:38:34 +0200
committeruser <user@clank>2026-08-30 19:38:34 +0200
commit4fe7c53c6fc0cd2c15b61f40db80db0bb8ecb848 (patch)
tree663dea37f73fe7b5ce78e9f72d294db8def5f5e1 /web
parentweb: the logo glitches, briefly, every seven seconds (diff)
downloadslosh-4fe7c53c6fc0cd2c15b61f40db80db0bb8ecb848.tar.gz
slosh-4fe7c53c6fc0cd2c15b61f40db80db0bb8ecb848.tar.xz
slosh-4fe7c53c6fc0cd2c15b61f40db80db0bb8ecb848.zip
web: the logo trades the glitch for the shine
A band of light sweeping the glyphs once a loop -- the logo running slosh's own shine preset, which is a better advertisement than a signal fault. The band is a second background layer on the same text clip, parked off the ink for 86% of the loop and crossing in the closing 0.7s; one set of keyframes drives both layers, the colour slide holding its linear pace through every stop. The glitch keyframes go, and reduced motion still keeps only the hue.
Diffstat (limited to 'web')
-rw-r--r--web/site.css61
1 files changed, 22 insertions, 39 deletions
diff --git a/web/site.css b/web/site.css
index c57e742..a5b8755 100644
--- a/web/site.css
+++ b/web/site.css
@@ -101,9 +101,19 @@ kbd {
* loop shifts by exactly one tile (at background-size 200%, position
* 200% is one tile width), and only a 90deg gradient meets its own edge
* seamlessly. */
- background: linear-gradient(90deg,
+ /* Two layers, both clipped to the ink: the shine -- a band of light, the
+ * logo running slosh's own shine preset -- over the colour wash. The
+ * band is parked off the glyphs for most of the loop and sweeps across
+ * in the last split second (the keyframes below); -150%..250% is the
+ * full off-to-off journey for a 60%-wide no-repeat layer. */
+ background-image: linear-gradient(105deg,
+ rgba(255, 255, 255, 0) 32%, rgba(255, 255, 255, 0.85) 50%,
+ rgba(255, 255, 255, 0) 68%),
+ linear-gradient(90deg,
var(--pink) 0%, #c95fff 35%, #5fafff 65%, var(--pink) 100%);
- background-size: 200% 100%;
+ background-size: 60% 100%, 200% 100%;
+ background-repeat: no-repeat, repeat;
+ background-position: -150% 0, 0% 0;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
@@ -115,12 +125,15 @@ kbd {
* compositor, so every pixel cycles the wheel even over the cached clip.
* Chrome and Firefox get both, WebKit gets the rotation alone. */
.logo-float.show pre {
- animation: logo-cycle 5s linear infinite, logo-hue 4s linear infinite,
- logo-glitch 7s linear infinite;
+ animation: logo-cycle 5s linear infinite, logo-hue 4s linear infinite;
}
+/* One set of keyframes drives both layers: the colour slide moves linearly
+ * through every stop (each keyframe holds its proportional position), and
+ * the shine holds off-glyph until 86%, then crosses in the closing 0.7s. */
@keyframes logo-cycle {
- from { background-position: 0% 0; }
- to { background-position: 200% 0; }
+ 0% { background-position: -150% 0, 0% 0; }
+ 86% { background-position: -150% 0, 172% 0; }
+ 100% { background-position: 250% 0, 200% 0; }
}
/* The drop shadow lives in these keyframes because the filter property is
* the animation's: a static filter would lose to it. Listed before the
@@ -131,40 +144,10 @@ kbd {
from { filter: drop-shadow(0 4px 14px rgba(255, 95, 215, 0.3)) hue-rotate(0deg); }
to { filter: drop-shadow(0 4px 14px rgba(255, 95, 215, 0.3)) hue-rotate(360deg); }
}
-/* The distortion: a signal that is fine, fine, fine, and then for a third
- * of a second is not -- torn into bands, shoved sideways, sheared, whole
- * again. Slices via clip-path and shoves via transform, because filter
- * belongs to the hue animation and background to the slide. Doubled
- * percentages make the cuts hard; 7s against the 5s slide and 4s hue means
- * the burst lands somewhere new in the colour every time. */
-@keyframes logo-glitch {
- 0%, 91%, 96%, 100% {
- transform: none;
- clip-path: none;
- }
- 91.5%, 92.3% {
- transform: translateX(-0.35em) skewX(-7deg);
- clip-path: inset(0 0 58% 0);
- }
- 92.4%, 93.4% {
- transform: translateX(0.4em) skewX(5deg);
- clip-path: inset(38% 0 0 0);
- }
- 93.5%, 94.6% {
- transform: translateX(-0.15em);
- clip-path: inset(18% 0 30% 0);
- }
- 94.7%, 95.9% {
- transform: translateX(0.08em) skewX(-2deg);
- clip-path: none;
- }
-}
-
@media (prefers-reduced-motion: reduce) {
- /* The preference is about motion, not colour: the slide -- a pattern
- * that travels -- goes, and so does the glitch, which is nothing but
- * motion; the hue rotation, colour changing in place, stays. Nothing
- * moves, everything still breathes. */
+ /* The preference is about motion, not colour: the slide and the shine --
+ * patterns that travel -- go; the hue rotation, colour changing in
+ * place, stays. Nothing moves, everything still breathes. */
.logo-float.show pre { animation: logo-hue 5s linear infinite; }
}