Merge nucleic/hazy-harbor-ibis-uoge into main

Mirrored from corpo 8bfa4d2.
This commit is contained in:
2026-08-15 22:38:04 -07:00
parent 3c7f15e29c
commit ef4a19a89b
+29 -52
View File
@@ -659,6 +659,12 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
} }
.line-research { .line-research {
/* drift-right carries the word 0.045em left of its resting position; give the
clipped line that much room on the left so the clip doesn't cut "Solving"
off mid-drift, and pull the box back by the same amount so the resting
position (and the statement's optical alignment) is unchanged. */
padding-left: 0.045em;
margin-left: -0.045em;
animation-delay: 320ms; animation-delay: 320ms;
} }
@@ -675,57 +681,37 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
/* Rests at zero so the headline's left edge is the one the copy below aligns to. /* Rests at zero so the headline's left edge is the one the copy below aligns to.
The drift now arrives at that edge instead of parking 0.045em to the right of The drift now arrives at that edge instead of parking 0.045em to the right of
it, which was what pushed "Research" off the mission line. */ it, which was what pushed "Research" off the mission line.
`none`, not translate3d(0, 0, 0). The identity 3D transform did nothing visually
and pinned the word in an accelerated layer for the life of the page, long after
the 12s drift is over. That layer was not the cause of the Safari gradient
artifact — see the note on .line-runs .word — but it bought nothing either, and
this is the resting form the clean variant was measured against. The keyframe
still supplies the 3D form, so the drift itself is composited exactly as before;
it just ends in a layer that can be thrown away. */
.line-research .word { .line-research .word {
transform: translate3d(0, 0, 0); transform: none;
animation: drift-right 12s 1.35s ease-in-out backwards; animation: drift-right 12s 1.35s ease-in-out backwards;
} }
/* Deliberately wrappable. There is ~5% of slack between "that runs." and the card /* Deliberately wrappable. There is ~5% of slack between "that runs." and the card
at every width, so the pair only ever separates when the type has been scaled at every width, so the pair only ever separates when the type has been scaled
past what the column can hold — at which point two short lines inside the past what the column can hold — at which point two short lines inside the
column beat one long line across the card. */ column beat one long line across the card.
.line-runs .word {
position: relative;
transform: translate3d(0, -0.035em, 0);
animation: drift-up 11s 1.5s ease-in-out backwards;
}
/* The swipe crosses “that runs.” once as the second line arrives. It paces The resting offset is a 2D translate, and there used to be a ::after here that
across “that”, then significantly accelerates through “runs.” The pseudo swept a light across the phrase by laying a second -webkit-background-clip: text
duplicates the whole phrase and clips its gradient to the glyphs; its mask over the same glyphs as the green “future.” gradient. That second mask made
transparent parked positions leave reduced-motion rendering unchanged. */ the green go blocky in macOS Safari 26 on window resize — measured 2026-08-16
.line-runs .word::after { across eight variants: the only clean ones were the two with no pseudo, and the
content: 'the future.'; artifact still appeared with the sweep disabled entirely, so it was the mask
position: absolute; sitting there at rest and not the animation. The sweep was worth less than a
inset: 0; reliable gradient, so it is gone. Do not reintroduce a text-clipped overlay on
padding-right: 0.06em; this word. */
color: transparent; .line-runs .word {
background-image: linear-gradient( transform: translateY(-0.035em);
100deg, animation: drift-up 11s 1.5s ease-in-out backwards;
transparent 20%,
rgb(234 248 240 / 12%) 38%,
rgb(234 248 240 / 46%) 48%,
rgb(234 248 240 / 46%) 62%,
rgb(234 248 240 / 8%) 68%,
transparent 71%
);
background-repeat: no-repeat;
background-size: 60% 100%;
background-position: -115% 0;
background-clip: text;
-webkit-background-clip: text;
pointer-events: none;
/* The delay is set against the line's entrance, not the page's. The park
sits just off the first glyph, and the sweep is linear, so the light
enters almost the moment the delay ends — the delay IS the arrival time.
0.7s launches the dash mid-rise: the line is about half faded-in when
the light takes off, the light outruns it down the length of the word,
and the sprint finishes right as the line settles (~1.38s) — the words
land and the light is already gone. Riding inside the still-fading line
also softens the dash's first frames for free. One iteration, by design:
a sprint run twice is choreography; run once it is an event. */
animation: sheen-pass 0.5s 0.7s linear;
} }
.line-runs .that { .line-runs .that {
@@ -1109,15 +1095,6 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
from { transform: translate3d(0, 0, 0); } from { transform: translate3d(0, 0, 0); }
} }
/* The first segment advances at a measured linear pace until the light has
cleared “that”; the shorter final segment covers the rest of its distance
in one third of the time, so “runs.” gets a deliberate 3× burst. */
@keyframes sheen-pass {
from { background-position: -115% 0; }
66.667% { background-position: 18% 0; }
to { background-position: 235% 0; }
}
@keyframes haze-drift { @keyframes haze-drift {
from { transform: translate3d(-9%, 3%, 0) rotate(-0.8deg); } from { transform: translate3d(-9%, 3%, 0) rotate(-0.8deg); }
to { transform: translate3d(10%, -4%, 0) rotate(0.8deg); } to { transform: translate3d(10%, -4%, 0) rotate(0.8deg); }