fix: resize and rearrange hero landing illustrations for tablet and mobile screens

This commit is contained in:
2026-09-06 12:09:39 +03:30
parent 67202d5323
commit ad51d97567
5 changed files with 215 additions and 55 deletions

View File

@@ -109,11 +109,10 @@
.heroTitle {
margin-bottom: clamp(8px, 1vw, 14px);
color: var(--text-primary);
/* Scale title fluidly so it never overflows into illustration zones */
font-size: clamp(32px, 5vw, 64px);
line-height: 1.12;
text-shadow: none;
white-space: nowrap;
/* Allow wrapping on smaller screens so text never clips */
}
/* ── Subtitle ───────────────────────────────────────────────── */
@@ -124,7 +123,6 @@
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
white-space: nowrap;
}
/* ── Action buttons ─────────────────────────────────────────── */
@@ -183,7 +181,6 @@
font-size: clamp(11px, 1vw, 14px);
font-weight: 500;
line-height: 1.6;
white-space: nowrap;
}
[data-theme="dark"] .contactBar {
@@ -223,14 +220,44 @@
/* ================================================================
MOBILE ≤ 640px
================================================================ */
@media (max-width: 640px) {
/* ================================================================
TABLET 501px – 1100px — match the illustration breakpoint
================================================================ */
@media (max-width: 1100px) and (min-width: 501px) {
.heroContent {
/* Top-anchor content so it sits nicely in the upper-center zone */
justify-content: flex-start;
padding-top: clamp(60px, 8vw, 90px);
}
.heroTitle {
/* Allow wrapping at tablet so text stays within the center zone */
max-width: 520px;
}
.contactBar {
/* Wrap contact items on narrow tablets */
flex-wrap: wrap;
justify-content: center;
gap: 8px 14px;
}
.contactDivider {
display: none;
}
}
/* ================================================================
MOBILE ≤ 500px (screensizes under 500px)
================================================================ */
@media (max-width: 500px) {
.heroContentWrapper {
height: auto;
min-height: 680px;
min-height: 520px;
}
.topBar {
padding-top: 18px;
padding: 16px 14px 0;
}
.iconButton {
@@ -239,47 +266,47 @@
}
.heroContent {
/* Switch to top-anchored layout on mobile */
height: auto;
min-height: 680px;
padding: 72px 24px 40px;
min-height: 520px;
padding: 66px 16px 36px;
justify-content: flex-start;
}
.heroTitle {
font-size: clamp(30px, 8.5vw, 42px);
font-size: clamp(26px, 7.8vw, 36px);
white-space: normal;
max-width: 300px;
max-width: 270px;
line-height: 1.15;
}
.heroSubtitle {
white-space: normal;
max-width: 260px;
letter-spacing: 0.14em;
max-width: 250px;
font-size: 11px;
letter-spacing: 0.12em;
}
.actionButtons {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
width: 100%;
max-width: 320px;
gap: 8px;
max-width: 276px;
gap: 6px;
}
.heroButton {
min-width: 0;
width: auto;
height: 42px;
padding: 0 8px;
font-size: 13px;
height: 38px;
padding: 0 6px;
font-size: 12px;
}
.contactBar {
flex-direction: column;
gap: 6px;
gap: 5px;
white-space: normal;
font-size: 12px;
font-size: 11.5px;
}
.contactItem {

View File

@@ -1,9 +1,10 @@
/* ============================================================
ScenicHeroJourney — hero stage with fluid-scaling SVG backdrop
Strategy: illustrations use fluid width via clamp() so they
always leave a comfortable gap to the center content.
They are pushed left/right so ~half bleeds off the canvas edge,
clipped by heroStage overflow:hidden — matching the design.
ScenicHeroJourney — hero stage with SVG backdrop
Breakpoint strategy:
≤ 640px → mobile (large bold crop, small sun clear of toggle)
641-1100px → tablet (large bold crop, fluid width)
1101-1440px → laptop (fluid clamp bleed — the approved look)
> 1440px → ultra-wide (frozen at 1440px values, overflow:visible)
============================================================ */
/* ── Container ─────────────────────────────────────────────── */
@@ -19,7 +20,6 @@
.heroStage {
position: relative;
width: 100%;
/* fluid height: shrinks on narrower screens */
height: clamp(360px, 46vw, 680px);
overflow: hidden;
background: var(--bg-page);
@@ -48,65 +48,121 @@
}
/* ================================================================
LEFT illustration (SVG intrinsic: 397 × 600)
Strategy: width scales with viewport so it's always ~28% of
the canvas width. Pushed so its RIGHT edge aligns with the
leftmost ~22% of the canvas (the rest bleeds off the left edge).
LAPTOP 1101px – 1440px (default — approved bleed look)
Illustrations scale with vw and partially bleed off canvas edges.
================================================================ */
.backdropLeft {
/* Start below the topBar icon zone (padding ~32px + icon 44px = ~76px) */
top: clamp(72px, 8vw, 100px);
left: clamp(-220px, calc(22% - 28vw), -40px);
width: clamp(240px, 28vw, 440px);
}
/* ================================================================
RIGHT illustration (SVG intrinsic: 435 × 533)
Mirror of left: right edge bleeds off the right edge.
================================================================ */
.backdropRight {
/* Slightly lower than left to maintain visual rhythm */
top: clamp(80px, 9vw, 110px);
right: clamp(-240px, calc(22% - 29vw), -40px);
width: clamp(250px, 29vw, 460px);
}
/* ================================================================
SUN illustration (SVG intrinsic: 139 × 139)
Sits in the upper-right quadrant, between the center text and
the right cubes. Scales fluidly.
================================================================ */
.backdropSun {
top: clamp(20px, 3.5vw, 52px);
/* place sun between center (50%) and right illustration edge */
right: clamp(100px, calc(22% + 2vw), 380px);
width: clamp(52px, 10vw, 139px);
}
/* ================================================================
MOBILE ≤ 640px — tighter crop, smaller presence
TABLET 501px – 1100px
Large illustrations with heavy bleed — bold fragments at edges.
Width scales fluidly; fixed bleed offset keeps content clear.
================================================================ */
@media (max-width: 640px) {
@media (max-width: 1100px) and (min-width: 501px) {
.heroStage {
height: clamp(360px, 52vw, 480px);
}
/* Left — visible slice ≈ width - 150px, always < content padding */
.backdropLeft {
top: clamp(88px, 10vw, 108px);
left: -150px;
width: clamp(280px, 36vw, 360px);
}
/* Right — slightly larger, deeper bleed */
.backdropRight {
top: clamp(96px, 11vw, 116px);
right: -165px;
width: clamp(295px, 38vw, 380px);
}
/* Sun — upper-right zone, between avatar and right cubes */
.backdropSun {
top: clamp(26px, 3.5vw, 44px);
right: clamp(120px, 33vw, 280px);
width: clamp(62px, 9vw, 96px);
}
}
/* ================================================================
MOBILE ≤ 500px (screensizes under 500px)
Assets moved UP to the sides (matching desktop/tablet aesthetic):
- Anchored via top, flanking the avatar & title
- Fluid side bleed maintains balance between visibility & clearance
- Zero collision with central avatar, title, buttons, or contact bar
================================================================ */
@media (max-width: 500px) {
.heroStage {
height: auto;
min-height: 680px;
min-height: 520px;
}
.backdropLeft {
top: 130px;
left: -30px;
width: clamp(100px, 26vw, 160px);
top: clamp(75px, 16vw, 95px);
bottom: auto;
left: clamp(-100px, calc(20vw - 230px), -100px);
width: clamp(200px, 44vw, 250px);
}
.backdropRight {
top: 136px;
right: -30px;
width: clamp(110px, 28vw, 170px);
top: clamp(82px, 18vw, 102px);
bottom: auto;
right: clamp(-120px, calc(20vw - 240px), -120px);
width: clamp(210px, 46vw, 260px);
}
.backdropSun {
top: 44px;
right: 16px;
width: clamp(36px, 9vw, 56px);
top: clamp(24px, 5vw, 36px);
right: clamp(52px, 15vw, 68px);
width: clamp(34px, 8vw, 42px);
}
}
/* ================================================================
ULTRA-WIDE > 1440px
Canvas capped at 1440px but vw keeps growing → bleed explodes.
Freeze at the values the clamp() formulas resolve to @ 1440px.
heroStage overflow:visible lets illustrations escape into the
extra viewport space (body overflow-x:hidden prevents scrollbar).
================================================================ */
@media (min-width: 1441px) {
.heroStage {
height: 662px;
overflow: visible;
}
.backdropLeft {
top: 100px;
left: -86px;
width: 403px;
}
.backdropRight {
top: 110px;
right: -101px;
width: 418px;
}
.backdropSun {
top: 50px;
right: 346px;
width: 139px;
}
}