Files
hesu-JT/css/style.css
T
2026-09-02 18:35:45 +08:00

1031 lines
34 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
HESU — Homepage styles (hand-written CSS)
Sections: tokens · base · layout · header/nav · hero ·
business · presence · partner · news · footer ·
placeholders · animations · responsive
============================================================ */
/* ---------- Design tokens ---------- */
:root {
/* Ink / dark surfaces */
--ink-950: #060d1a;
--ink-900: #0a1424;
--ink-800: #0e1c30;
--ink-700: #13233c;
--ink-600: #1b2f4d;
--ink-500: #274063;
--bg-solid: #010F1E; /* header + footer */
/* Orange (deep → light) */
--orange-900: #c44400;
--orange-700: #ff6a00;
--orange-500: #ff8a1e;
--orange-300: #ffb15c;
--orange-100: #ffd9b0;
--grad-orange: linear-gradient(135deg, var(--orange-700), var(--orange-300));
--grad-orange-soft: linear-gradient(135deg, rgba(255,106,0,0.95), rgba(255,177,92,0.95));
/* Light surfaces */
--surface-light: #f4f6f9;
--surface-light-2: #ffffff;
--line: #e3e7ee;
/* Text */
--text-dark: #18222f;
--text-mid: #404040;
--text-light: #ffffff;
--text-light-80: rgba(255, 255, 255, 0.8);
--text-light-60: rgba(255, 255, 255, 0.6);
--text-light-40: rgba(255, 255, 255, 0.4);
/* Type */
/* --font-display: 'Archivo', 'Segoe UI', system-ui, sans-serif; */
--font-display: 'Inter', 'Segoe UI', system-ui, sans-serif;
--font-body: 'Inter', 'Segoe UI', system-ui, sans-serif;
/* Layout */
--container: min(92vw, 1440px);
--radius: 10px;
--radius-lg: 16px;
--header-h: 80px;
--ease: cubic-bezier(.2, .7, .2, 1);
}
/* ---------- Reset / base ---------- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
body {
font-family: var(--font-body);
color: var(--text-light);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
overflow-x: hidden;
}
a { color: inherit; text-decoration: none; }
ul { list-style: none; }
img { max-width: 100%; display: block; }
/* ---------- Layout helpers ---------- */
.container {
width: 100%;
max-width: var(--container);
margin-inline: auto;
padding-inline: 32px;
}
.page-content {
background: url(../image/home-bgs.png) no-repeat;
color: var(--text-light);
background-size: 100% 100%;
}
.page-content > section { background: transparent; }
.section-head { margin-bottom: 48px; }
.section-head.center { text-align: center; }
.section-head.center .section-lead { max-width: 850px; margin: 18px auto 28px; }
.section-title {
font-family: var(--font-display);
/* font-weight: 800; */
font-size: clamp(1.8rem, 3vw, 2.6rem);
letter-spacing: 0.01em;
line-height: 1.15;
text-transform: uppercase;
}
.section-title-d{
color: #202020;
}
.section-lead { color: var(--text-light-60); font-size: 1.02rem; }
.section-lead strong { color: var(--orange-500); }
/* ---------- Buttons ---------- */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-family: var(--font-display);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.12em;
font-size: 0.78rem;
border-radius: var(--radius);
cursor: pointer;
/* border: 1px solid transparent;*/
transition: transform .25s var(--ease), background .25s var(--ease), color .25s var(--ease), box-shadow .25s var(--ease);
}
.btn-contact {
background: linear-gradient(88.61deg, #FF6000 7.43%, #FFA557 98.82%);
padding: 8px 22px;
color: #fff;
}
.btn-contact:hover { transform: translateY(-2px);background: linear-gradient(88.61deg, rgba(255, 132, 17, 0.8) 7.43%, rgba(255, 207, 87, 0.8) 98.82%);
}
.btn-explore {
background: #000;
color: #fff;
padding: 13px 30px;
backdrop-filter: blur(6px);
}
.btn-explore:hover { background: rgba(8, 16, 30, 0.8); border-color: #fff; transform: translateY(-2px); }
.btn-outline {
background: transparent;
color: #fff;
border: 1px solid var(--orange-500);
padding: 12px 28px;
}
.btn-outline:hover { background: var(--orange-500); color: #1a0f00; }
/* ============================================================
HEADER
============================================================ */
.site-header {
position: fixed;
inset: 0 0 auto 0;
z-index: 50;
height: var(--header-h);
display: flex;
align-items: center;
background: var(--bg-solid);
transition: box-shadow .35s var(--ease), height .35s var(--ease);
}
.site-header.scrolled {
box-shadow: 0 6px 24px rgba(0,0,0,0.45);
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
width: 100%;
}
/* Logo (image/logo.png — light artwork, for the dark header/footer bars) */
.logo { display: inline-flex; align-items: center; }
.logo-img { display: block; height: 32px; width: auto; }
/* Nav */
.main-nav { display: flex; }
.nav-list { display: flex; align-items: center; gap: 36px; }
.nav-item { position: relative; }
.nav-item > a {
font-family: var(--font-display);
font-weight: 600;
font-size: 0.92rem;
letter-spacing: 0.04em;
color: var(--text-light-80);
padding: 8px 0;
display: inline-flex;
align-items: center;
gap: 6px;
transition: color .2s var(--ease);
}
.nav-item > a:hover { color: var(--orange-500); }
/* active page marker (orange underline) */
.nav-item > a.active { color: var(--orange-500); position: relative; }
.nav-item > a.active::after {
content: "";
position: absolute;
left: 0; right: 0; bottom: 0;
height: 2px;
background: var(--orange-700);
border-radius: 2px;
}
.caret {
width: 6px; height: 6px;
border-right: 2px solid currentColor;
border-bottom: 2px solid currentColor;
transform: rotate(45deg) translateY(-2px);
opacity: .7;
}
/* ============================================================
FULL-SCREEN MEGA MENU (desktop hover)
============================================================ */
.nav-item.mega-on > a { color: var(--orange-500); }
/* Contact Us lives in the header button on desktop; inside the drawer on mobile */
.nav-item.nav-contact { display: none; }
/* drawer logo is mobile-only (desktop keeps the header logo) */
.drawer-logo { display: none; }
.mega {
position: fixed;
top: var(--header-h);
left: 0; right: 0; bottom: 0;
background: linear-gradient(180deg, rgb(123 123 123 / 80%) 0%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.01) 115.88%);
/* background: linear-gradient(180deg, rgb(255 255 255 / 80%) 0%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0.01) 115.88%); */
-webkit-backdrop-filter: blur(14px) saturate(120%);
backdrop-filter: blur(14px) saturate(120%);
z-index: 45;
overflow: hidden;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition: opacity .3s var(--ease), visibility .3s;
}
.mega.open { opacity: 1; visibility: visible; pointer-events: auto; }
.mega-inner {
max-width: var(--container);
margin: 0 auto;
height: 100%;
display: flex;
gap: 48px;
padding: 44px 32px 36px;
}
.mega-left { flex: 0 0 280px; padding-top: 4px; }
.mega-title {
font-family: var(--font-display);
font-weight: 800;
font-size: clamp(1.3rem, 2vw, 1.85rem);
line-height: 1.15;
color: #fff;
margin-bottom: 14px;
}
/* right cards grid — 4 per row, multiple rows, scrolls on overflow */
.mega-right {
flex: 1;
min-width: 0;
min-height: 0;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 18px;
align-content: start;
overflow-y: auto;
padding-right: 8px;
}
@media (max-width: 1180px) {
.mega-left { flex-basis: 230px; }
.mega-right { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 980px) {
.mega-right { grid-template-columns: repeat(2, 1fr); }
}
.mega-card {
display: flex; flex-direction: column;
overflow: hidden;
text-decoration: none;
opacity: 0;
transform: translateY(16px);
transition: transform .3s var(--ease), border-color .3s, background .3s, opacity .3s;
}
.mega.open .mega-card { opacity: 1; transform: none; }
.mega.open .mega-card:nth-child(1) { transition-delay: .05s; }
.mega.open .mega-card:nth-child(2) { transition-delay: .10s; }
.mega.open .mega-card:nth-child(3) { transition-delay: .15s; }
.mega.open .mega-card:nth-child(4) { transition-delay: .20s; }
.mega-card:hover {
transform: translateY(-6px);
border-color: rgba(255,138,30,0.6);
background: rgba(255,138,30,0.06);
}
.mega-card-img { width: 100%; aspect-ratio: 4 / 3; position: relative; }
.mega-card-text { padding: 14px 12px 16px; text-align: center; }
.mega-card-text h4 {
font-family: var(--font-display);
font-weight: 700;
font-size: 0.92rem;
color: #fff;
line-height: 1.3;
}
.mega-card-text p { display: none; }
.header-right { display: flex; align-items: center; gap: 16px; }
/* Mobile toggle */
.menu-toggle {
display: none;
flex-direction: column;
justify-content: center;
gap: 5px;
width: 40px; height: 40px;
background: transparent; border: 0; cursor: pointer;
}
.menu-toggle span {
display: block; width: 24px; height: 2px; background: #fff;
transition: transform .3s var(--ease), opacity .3s;
}
.menu-toggle.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.menu-toggle.open span:nth-child(2) { opacity: 0; }
.menu-toggle.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
/* ============================================================
HERO
============================================================ */
.hero {
position: relative;
min-height: 88vh;
display: flex;
flex-direction: column;
justify-content: center;
overflow: hidden;
margin-top: var(--header-h); /* banner starts BELOW the fixed nav */
}
.hero-bg {
position: absolute; inset: 0;
z-index: 0;
background-image: url(../image/home/banner.jpg);
background-size: cover;
background-position: center;
}
.hero-logo{
width: 40%;
}
.hero-bg::before { display: none; } /* star field placeholder removed */
.hero-content {
position: relative;
z-index: 2;
text-align: center;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.hero-title {
font-family: var(--font-display);
font-weight: 900;
font-size: clamp(3.5rem, 10vw, 7rem);
letter-spacing: 0.3em;
line-height: 1;
margin-right: -0.3em; /* compensate trailing letterspacing for centering */
background: linear-gradient(180deg, #fff, #fff);
-webkit-background-clip: text; background-clip: text;
-webkit-text-fill-color: transparent;
}
.hero-sub {
font-family: var(--font-display);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.14em;
font-size: clamp(0.95rem, 2vw, 2.35rem);
color: #fff;
margin-top: 18px;
}
.hero-tag {
color: var(--text-light-80);
font-size: 0.95rem;
margin-top: 10px;
}
.btn-explore { margin-top: 34px; }
/* Stats bar */
.hero-stats {
position: relative;
z-index: 2;
padding: 30px 0;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
text-align: center;
}
.stat { display: flex; flex-direction: column; gap: 6px; }
.stat-num {
font-family: var(--font-display);
font-weight: 900;
font-size: clamp(1.8rem, 4vw, 2.8rem);
line-height: 1;
background: linear-gradient(88.61deg, #E68735 7.43%, rgba(255, 96, 0, 0.98) 98.82%);
-webkit-background-clip: text; background-clip: text;
-webkit-text-fill-color: transparent;
}
.stat-label {
text-transform: uppercase;
letter-spacing: 0.14em;
font-size: 0.72rem;
}
/* ============================================================
BUSINESS (bento grid)
============================================================ */
.business { padding: 96px 0; }
.bento-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* row 1 = orange banner (short) · row 2 = Auto Export (tall) · row 3 = aftermarket/logistics */
grid-template-rows: 170px 340px 320px;
grid-auto-rows: 270px;
gap: 18px;
text-transform: uppercase;
}
.cell { position: relative; overflow: hidden; }
/* orange banner */
.cell-banner {
grid-column: 1 / 3;
grid-row: 1;
background: url(../image/home/Mask1.jpg) center/cover no-repeat;
display: flex;
flex-direction: column;
justify-content: center;
padding: 0 36px;
}
.banner-title {
font-family: var(--font-display); font-weight: 900;
font-size: clamp(2rem, 4vw, 3rem); letter-spacing: 0.04em; line-height: 1;
margin-top: 6px;
}
/* media cells */
.cell-media { box-shadow: 0 10px 30px rgba(16,24,40,0.08); }
.cell-media .cell-ph { position: absolute; inset: 0; }
.cell-media::after { /* dark veil for title legibility */
content: ""; position: absolute; inset: 0; z-index: 1;
transition: background .35s var(--ease);
}
.cell-media:hover::after { background: rgba(6,13,28,0.55); }
.cell-title {
position: absolute; left: 22px; bottom: 18px; z-index: 2;
font-family: var(--font-display); font-weight: 700;
font-size: 1.15rem; color: #fff;
}
.cell-materials { grid-column: 3; grid-row: 1 / 3; }
.cell-auto { grid-column: 1 / 3; grid-row: 2; }
.cell-aftermarket{ grid-column: 1; grid-row: 3; }
.cell-logistics { grid-column: 2 / 4; grid-row: 3; }
/* staggered scroll-in for bento cells */
.bento-grid .cell.reveal:nth-child(1) { transition-delay: 0s; }
.bento-grid .cell.reveal:nth-child(2) { transition-delay: .24s; }
.bento-grid .cell.reveal:nth-child(3) { transition-delay: .48s; }
.bento-grid .cell.reveal:nth-child(4) { transition-delay: .72s; }
.bento-grid .cell.reveal:nth-child(5) { transition-delay: .96s; }
/* ============================================================
GLOBAL PRESENCE
============================================================ */
.presence { padding: 96px 0; }
/* bg image + SVG overlay share one box and the 1219 × 660 map coordinate space.
isolation + the JS-painted backdrop (an exact copy of .page-content's bg,
aligned pixel-for-pixel) give the blended img a LOCAL backdrop — Chrome
captures cross-element blend backdrops as the element enters the viewport,
and that capture lags a frame or two (the map flashes its intrinsic colors).
With the backdrop inside the group there is nothing to capture late. */
.map-wrap {
position: relative;
width: 100%;
aspect-ratio: 1219 / 660;
overflow: hidden;
margin: 8px auto 24px;
isolation: isolate;
}
.map-bg {
position: absolute;
inset: 0;
display: block;
width: 100%;
height: 100%;
object-fit: contain;
/* the SVG's internal color-dodge/multiply blends can't reach past the <img>
boundary — blend the whole map against the section background instead so
the dots tint with it (Figma behaviour). Dark backgrounds only: on light
surfaces color-dodge washes the map out to white. */
mix-blend-mode: color-dodge;
/* hidden until the blend backdrop (page bg image) has loaded — color-dodge
over an unloaded near-white backdrop washes the map out. Fading the img
itself keeps the blend correct (an ancestor opacity<1 would isolate the
group and pop the color in at animation end). main.js adds .ready. */
opacity: 0;
transition: opacity .7s var(--ease);
}
/* !important so it also overrides the inline no-FOUC guard (style="opacity:0")
and the JS fade's final inline value — the fade itself is JS-driven
(main.js) because CSS animations/transitions lose to !important in the
cascade and would snap instead of fading. */
.map-bg.ready { opacity: 1 !important; }
/* keep the slide-up entrance but drop the fade — see .map-bg note above */
.map-wrap.reveal { opacity: 1; transform: translateY(28px); }
.map-overlay {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
/* location highlights — accumulating window cycled by main.js.
Entrance: overlapping sequence (label → curve draw → dot pop → double ripple).
Exit: elements reverse into their base states (line un-draws, dot shrinks,
label slides away) so leaving mirrors entering. Children own their hidden
base states; the group itself never toggles opacity. */
.map-wrap .location .label {
fill: #fff;
font-size: 12px;
font-weight: 700;
letter-spacing: .7px;
opacity: 0;
transform: translateY(5px);
transition: opacity .3s ease, transform .3s ease;
}
.map-wrap .location .line {
fill: none;
stroke: var(--orange-700);
stroke-width: 1.4;
stroke-linecap: round;
stroke-linejoin: round;
vector-effect: non-scaling-stroke;
/* non-active lines stay fully undrawn from frame one (no first-flash on large screens) */
stroke-dasharray: 1;
stroke-dashoffset: 1;
opacity: 0;
transition: stroke-dashoffset .55s ease-in .05s, opacity .25s ease .25s;
}
.map-wrap .location .dot {
fill: var(--orange-700);
transform-box: fill-box;
transform-origin: center;
opacity: 0;
transform: scale(.55);
transition: opacity .28s ease, transform .28s ease;
}
.map-wrap .location .halo {
fill: none;
stroke: var(--orange-700);
stroke-width: 1.2;
opacity: 0;
transform-box: fill-box;
transform-origin: center;
vector-effect: non-scaling-stroke;
transition: opacity .4s ease;
}
/* exit choreography — .out is added by main.js on deactivate; animations reverse
into the hidden base (transitions can't fire off animation removal) */
.map-wrap .location.out .label { animation: labelOut .3s ease both; }
.map-wrap .location.out .line { animation: lineOut .5s ease-in both; }
.map-wrap .location.out .dot { animation: dotOut .28s ease both; }
.map-wrap .location.out .halo { animation: haloOut .45s ease-out both; }
.map-wrap .location.active .label { animation: labelIn .28s .02s ease-out both; }
.map-wrap .location.active .line { animation: drawLine .55s .12s cubic-bezier(.3,.7,.2,1) both; }
.map-wrap .location.active .dot {
animation: dotIn .32s .5s cubic-bezier(.2,1.5,.35,1) both,
breatheR 3.4s 1s ease-in-out infinite;
}
.map-wrap .location.active .halo { animation: pulse .9s .62s ease-out infinite; }
.map-wrap .location.active .halo2 { animation-delay: 1.07s; }
/* minor markers (China domestic network) — same choreography, yellow & smaller */
.map-wrap .location--minor .label { font-size: 11px; letter-spacing: .5px; }
.map-wrap .location--minor .line { stroke: #FFD100; stroke-width: 1.2; }
.map-wrap .location--minor .dot { fill: #FFD100; }
.map-wrap .location--minor .halo { stroke: #FFD100; stroke-width: 1; }
.map-wrap .location--minor.active .dot {
/* re-declared to swap the breathe keyframe for the smaller radius */
animation: dotIn .32s .5s cubic-bezier(.2,1.5,.35,1) both,
breatheRy 3.4s 1s ease-in-out infinite;
}
@keyframes breatheRy {
0%, 100% { r: 5px; }
50% { r: 5.7px; }
}
@keyframes labelIn {
from { opacity: 0; transform: translateY(5px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes drawLine {
from { stroke-dashoffset: 1; opacity: 0; }
1% { opacity: 1; }
to { stroke-dashoffset: 0; opacity: 1; }
}
@keyframes dotIn {
from { opacity: 0; transform: scale(.25); }
to { opacity: 1; transform: scale(1); }
}
@keyframes pulse {
0% { opacity: .7; transform: scale(.5); }
70% { opacity: 0; transform: scale(2.2); }
100% { opacity: 0; transform: scale(2.2); }
}
@keyframes breatheR {
0%, 100% { r: 7.5px; }
50% { r: 8.3px; }
}
@keyframes labelOut {
from { opacity: 1; transform: translateY(0); }
to { opacity: 0; transform: translateY(5px); }
}
@keyframes lineOut {
from { stroke-dashoffset: 0; opacity: 1; }
to { stroke-dashoffset: 1; opacity: 0; }
}
@keyframes dotOut {
from { opacity: 1; transform: scale(1); }
to { opacity: 0; transform: scale(.55); }
}
@keyframes haloOut {
from { opacity: .5; }
to { opacity: 0; }
}
/* ============================================================
HESU GLOBAL NETWORK & LOCAL SERVICE — peek strip
Middle 2 cards fully visible; outer 2 ~3/4 with edge fade.
============================================================ */
.network { padding: 96px 0; background: var(--ink-900); }
.network-stage { position: relative; }
.network-strip {
width: 100%;
overflow: hidden;
-webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 13%, #000 87%, transparent 100%);
mask-image: linear-gradient(90deg, transparent 0%, #000 13%, #000 87%, transparent 100%);
}
.network-track {
display: flex;
justify-content: flex-start;
align-items: stretch;
gap: 18px; /* must match GAP in main.js — card-step math depends on it */
padding: 6px 0;
transform: translateX(-120px); /* JS positions precisely (centered pair) */
transition: transform .5s var(--ease);
cursor: grab;
user-select: none;
touch-action: pan-y;
will-change: transform;
}
.network-track:active { cursor: grabbing; }
.network-track.dragging { transition: none; }
.network-card {
position: relative;
flex: 0 0 400px; /* fallback; JS sizes precisely per viewport */
height: 320px;
overflow: hidden;
-webkit-user-drag: none;
}
.network-card .cell-ph { position: absolute; inset: 0; transition: transform .6s var(--ease); }
.network-card:hover .cell-ph { transform: scale(1.06); }
.network-card::after {
content: ""; position: absolute; inset: 0;
background: linear-gradient(180deg, transparent 45%, rgba(6,13,28,0.88) 100%);
}
.hub-label {
position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
color: #fff;
text-align: center;
padding: 16px;
font-family: var(--font-display);
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
}
/* ============================================================
PARTNER
============================================================ */
.partner { padding: 110px 0 96px; background: var(--ink-900); }
.partner-inner { position: relative; display: flex; flex-direction: row; }
.partner-carousel {
position: relative;
width: 80%;
margin-left: auto;
margin-top: 100px;
aspect-ratio: 2 / 1;
overflow: hidden;
box-shadow: 0 24px 60px rgba(0,0,0,0.5);
}
.partner-carousel .slide {
position: absolute; inset: 0;
opacity: 0;
transition: opacity .7s var(--ease);
}
.partner-carousel .slide.is-active { opacity: 1; }
.partner-dots {
position: absolute;
left: 18px; bottom: 18px;
display: flex; align-items: center; gap: 8px;
z-index: 3;
}
.partner-dots button {
border: 0; cursor: pointer; padding: 0;
width: 9px; height: 9px; border-radius: 999px;
background: rgba(255,255,255,0.55);
transition: width .35s var(--ease), background .35s;
}
.partner-dots button.active {
width: 30px;
background: var(--orange-500);
border-radius: 999px;
}
/* orange overlay block */
.partner-overlay {
position: absolute;
left: 0; top: 0;
width: 50%;
background: linear-gradient(283.27deg, rgba(255, 174, 0, 0.32) 1.97%, #FF6000 100%);
color: #fff;
padding: 60px 38px;
border-radius: var(--radius);
box-shadow: 0 24px 60px rgba(255,106,0,0.3);
z-index: 4;
}
.partner-title {
font-family: var(--font-display);
/* font-weight: 900; */
font-size: clamp(1.3rem, 2.4vw, 1.9rem);
line-height: 1.18;
letter-spacing: 0.01em;
}
.partner-features {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 18px 10px;
margin-top: 32px;
}
.partner-features li {
display: flex; flex-direction: column; align-items: center;
text-align: center;
}
.pf-ico {
display: inline-flex; align-items: center; justify-content: center;
}
.pf-ico img { width: 80px; height: 80px; object-fit: contain; display: block; }
.partner-features strong { display: block; font-family: var(--font-display); font-weight: 700; font-size: 0.7rem; }
.partner-features em { display: none; }
/* ============================================================
NEWS
============================================================ */
.news { padding: 96px 0; }
.news-head {
display: flex; align-items: center; justify-content: space-between;
margin-bottom: 40px;
}
.view-more {
font-family: var(--font-display);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
font-size: 0.85rem;
background: linear-gradient(88.61deg, #FF6000 7.43%, #FFA557 98.82%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
transition: color .2s;
}
.view-more .plus { color: var(--orange-700); margin-left: 4px; }
.view-more:hover { color: var(--orange-700); }
.news-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 22px;
}
.news-card .news-img {
aspect-ratio: 4 / 3;
overflow: hidden;
margin-bottom: 16px;
position: relative;
}
.news-img .cell-ph { position: absolute; inset: 0; transition: transform .5s var(--ease); }
.news-card:hover .news-img .cell-ph { transform: scale(1.06); }
.news-title {
font-family: var(--font-display);
/* font-weight: 700; */
font-size: 1rem;
line-height: 1.35;
color: #fff;
transition: color .2s;
}
.news-card:hover .news-title { color: var(--orange-500); }
/* ============================================================
FOOTER
============================================================ */
.site-footer { position: relative;
z-index: 2;
margin-top: -25px;background: var(--bg-solid);color: var(--text-light-60);padding-top: 56px;border-radius: 30px 30px 0 0;}
.footer-top {
display: flex;
justify-content: space-between;
align-items: center;
gap: 24px;
flex-wrap: wrap;
}
.footer-social { display: flex; gap: 12px; }
.social { display: inline-flex; transition: transform .2s, opacity .2s; }
.social img { width: 28px; height: 28px; display: block; }
.social:hover { transform: translateY(-2px); opacity: .8; }
.footer-grid {
display: grid;
grid-template-columns: 35% 1fr 1fr 1fr 1fr;
gap: 36px;
padding: 48px 0;
width: 100%;
}
.footer-intro .footer-slogan { font-size: 1rem; line-height: 1.7; margin-bottom: 16px; font-weight: bold; color: #fff; }
.footer-intro .footer-contact { font-size: 0.85rem; line-height: 1.8; color: var(--text-light-60); }
.footer-col h4 {
color: #fff;
font-family: var(--font-display);
font-weight: 700;
font-size: 1rem;
margin-bottom: 18px;
letter-spacing: 0.04em;
}
.footer-col ul { display: flex; flex-direction: column; gap: 12px; font-size: 0.9rem; }
.footer-col a { transition: color .2s; }
.footer-col a:hover { color: var(--orange-500); }
.footer-bottom {
border-top: 1px solid #9F9F9F;
padding: 22px 0;
font-size: 0.82rem;
}
.footer-bottom .container {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
flex-wrap: wrap;
display:none;
}
.footer-links { display: flex; gap: 18px; }
.footer-links a:hover { color: var(--orange-500); }
/* ============================================================
PLACEHOLDER IMAGE TREATMENTS
(distinct gradients so each photo slot reads as a unique image.
Swap .cell-ph / .slide / .news-img backgrounds for real photos.)
============================================================ */
.ph {
background-size: cover;
background-position: center;
display: flex; align-items: flex-start; justify-content: flex-end;
}
/* themed gradients */
.ph-materials { background: url(../image/home/Businesses2.jpg) center/cover no-repeat; }
.ph-auto { background: url(../image/home/Businesses1.jpg) center/cover no-repeat; }
.ph-aftermarket { background: url(../image/home/Businesses3.jpg) center/cover no-repeat; }
.ph-logistics { background: url(../image/home/Businesses4.jpg) center/cover no-repeat; }
.ph-middleeast { background: url(../image/Company-History.jpg) center/cover no-repeat; }
.ph-easterneurope { background: url(../image/Company-Overview.jpg) center/cover no-repeat; }
.ph-africa { background: url(../image/home/Service4.jpg) center/cover no-repeat; }
.ph-warehouse { background: url(../image/home/Partner.jpg) center/cover no-repeat; }
.ph-warehouse1 { background: url(../image/home/Partner1.jpg) center/cover no-repeat; }
.ph-warehouse2 { background: url(../image/home/Partner2.jpg) center/cover no-repeat; }
.ph-warehouse3 { background: url(../image/home/Partner3.jpg) center/cover no-repeat; }
.ph-logistics2 { background: url(../image/home/Global-Logistics.jpg) center/cover no-repeat; }
.ph-aboutlb1 { background: url(../image/about-us/lb1.jpg) center/cover no-repeat; }
.ph-aboutlb2 { background: url(../image/about-us/lb2.jpg) center/cover no-repeat; }
.ph-aboutlb3 { background: url(../image/about-us/lb3.jpg) center/cover no-repeat; }
.ph-aboutlb4 { background: url(../image/about-us/lb4.jpg) center/cover no-repeat; }
.ph-fair { background: url(../image/home/new1.jpg) center/cover no-repeat; }
.ph-dubai { background: url(../image/home/new2.jpg) center/cover no-repeat; }
.ph-factory { background: url(../image/home/new3.jpg) center/cover no-repeat; }
.ph-visit { background: url(../image/home/new4.jpg) center/cover no-repeat; }
.ph-service1 { background: url(../image/home/Service1.jpg) center/cover no-repeat; }
.ph-service2 { background: url(../image/home/Service2.jpg) center/cover no-repeat; }
.ph-service3 { background: url(../image/home/Service3.jpg) center/cover no-repeat; }
.ph-service4 { background: url(../image/home/Service4.jpg) center/cover no-repeat; }
.ph-select1{ background: url(../image/Select1.jpg) center/cover no-repeat; }
.ph-select2{ background: url(../image/Select2.jpg) center/cover no-repeat; }
.ph-select3{ background: url(../image/Select3.jpg) center/cover no-repeat; }
.ph-select4{ background: url(../image/Select4.jpg) center/cover no-repeat; }
/* ============================================================
SCROLL REVEAL
============================================================ */
.reveal { opacity: 0; transform: translateY(28px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
.reveal.in { opacity: 1; transform: none; }
/* ============================================================
RESPONSIVE
============================================================ */
@media (max-width: 1024px) {
:root { --header-h: 68px; }
.container { padding-inline: 24px; }
.logo-img { height: 27px; }
.partner-carousel { width: 100%; margin-top: 0; }
.partner-overlay {
position: relative; top: 0;
width: 100%; margin-bottom: 18px;
padding: 30px 28px;
}
.partner-inner { display: flex; flex-direction: column; }
.footer-grid { grid-template-columns: 1fr 1fr; }
.footer-intro { grid-column: 1 / -1; }
}
@media (max-width: 860px) {
/* mobile nav */
.menu-toggle { display: flex; }
.header-right .btn-contact { display: none; }
.nav-item.nav-contact { display: block; }
/* company logo pinned at the top of the drawer, links home */
.drawer-logo {
display: block;
margin: 0 0 20px;
padding-bottom: 16px;
border-bottom: 1px solid rgba(255,255,255,0.08);
}
.drawer-logo .logo-img { height: 30px; }
.main-nav {
position: fixed;
flex-direction: column;
inset: 0 0 0 auto;
width: min(82vw, 360px);
background: var(--ink-900);
border-left: 1px solid rgba(255,255,255,0.08);
padding: calc(var(--header-h) + 16px) 26px 32px;
transform: translateX(100%);
transition: transform .35s var(--ease);
z-index: 49;
overflow-y: auto;
}
.main-nav.open { transform: translateX(0); box-shadow: -30px 0 60px rgba(0,0,0,0.5); }
.nav-list { flex-direction: column; align-items: stretch; gap: 6px; }
.nav-item > a { padding: 14px 6px; font-size: 1rem; border-bottom: 1px solid rgba(255,255,255,0.06); }
/* mega -> inline collapsible list on mobile */
.mega {
position: static; background: transparent;
opacity: 1; visibility: visible; pointer-events: auto;
display: none; overflow: visible; z-index: auto;
}
.nav-item.has-mega.open .mega { display: block; }
.mega-inner { display: block; min-height: 0; padding: 4px 0 2px 12px; gap: 0; }
.mega-left { display: none; }
.mega-right { display: block; }
.mega-card {
display: flex; flex-direction: row; align-items: center;
aspect-ratio: auto;
padding: 12px 4px;
opacity: 1;
transform: none;
}
.mega-card:hover { transform: none; background: transparent; }
.mega-card-img { display: none; }
.mega-card-text {
position: static; display: block; text-align: left;
background: none; padding: 0;
}
.mega-card-text p { display: none; }
.mega-card-text h4 { font-size: 0.98rem; color: var(--text-light-80); font-weight: 600; text-align: left; }
.nav-backdrop {
position: fixed; inset: 0; z-index: 48;
background: rgba(0,0,0,0.5); opacity: 0; visibility: hidden;
transition: opacity .3s, visibility .3s;
}
.nav-backdrop.show { opacity: 1; visibility: visible; }
/* hero */
.stats-grid { grid-template-columns: 1fr 1fr; gap: 28px 16px; }
.hero { min-height: 82vh; }
/* business bento -> 2-col friendly */
.bento-grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: 190px; }
.cell-banner { grid-column: 1 / 3; grid-row: auto; }
.cell-materials { grid-column: auto; grid-row: span 1; }
.cell-auto { grid-column: 1 / 3; grid-row: auto; }
.cell-aftermarket { grid-column: auto; grid-row: auto; }
.cell-logistics { grid-column: 1 / 3; grid-row: auto; }
.news-grid { grid-template-columns: 1fr 1fr; }
/* network carousel — same drag/loop system as desktop, mobile sizing */
.network { padding: 0px 0 70px; }
.network-track { gap: 12px; }
.network-card { height: 340px; }
.section-head { margin-bottom: 36px; }
.business, .presence, .news, .partner { padding: 72px 0; }
}
@media (max-width: 560px) {
.container { padding-inline: 18px; }
.bento-grid { grid-template-columns: 1fr; grid-auto-rows: 180px; }
.cell-banner, .cell-auto, .cell-logistics { grid-column: auto; }
.news-grid { grid-template-columns: 1fr; }
.network-card { flex: 0 0 84vw; height: 280px; }
.partner-features { grid-template-columns: repeat(2, 1fr);}
.pf-ico img { width: 50px; height: 50px; }
.footer-grid { grid-template-columns: 1fr; gap: 32px; }
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
* { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
.reveal { opacity: 1; transform: none; }
}