Files

64 lines
2.2 KiB
CSS
Raw Permalink Normal View History

/* ============================================================================
HERO WORDMARK SUFFIX - the "-ER" after "SHARP" on the home hero
----------------------------------------------------------------------------
Not drawn in Figma: a project request, so the hero finishes on the full
name. "SHARP" is on screen from the first paint; once the page has settled,
"-ER" slides out from behind the P while it fades in.
HOW "BEHIND THE P" WORKS: the suffix sits in its own box whose inline-start
edge is exactly the P's right edge, and that box clips. The mark starts a
full box-width back - entirely inside the P's side of the clip, so nothing
overlaps "SHARP" - and travels forward to rest. The opacity reaches 1 before
the travel ends, so the glyphs read as solid for the last, slowest part of
the decelerating slide.
The translate is physical (translateX) on purpose: the lockup row is pinned
to dir="ltr" because a Latin wordmark never mirrors, so the P is always to
the left of the suffix, in Arabic too.
Pure CSS, so it runs from the server-rendered HTML without waiting for
hydration, and the `both` fill keeps the suffix hidden through the delay
instead of flashing in first. It replays whenever the hero mounts again,
e.g. on a client-side navigation back to the home page.
REDUCED MOTION: app.css shortens every animation to 0.01ms but leaves the
delay alone, which would hold the suffix hidden for the delay and then pop
it in. Here the animation is removed outright, so "SHARP-ER" is simply there
from the start.
========================================================================= */
@layer theme, base, components, utilities;
@layer components {
.sh-hero-suffix {
overflow: hidden;
}
.sh-hero-suffix__mark {
animation: sh-hero-suffix-in var(--motion-duration-reveal)
var(--motion-ease-entrance) var(--motion-delay-reveal) both;
}
@media (prefers-reduced-motion: reduce) {
.sh-hero-suffix__mark {
animation: none;
}
}
}
@keyframes sh-hero-suffix-in {
from {
opacity: 0;
transform: translateX(-100%);
}
60% {
opacity: 1;
}
to {
opacity: 1;
transform: translateX(0);
}
}