diff --git a/assets/css/custom.css b/assets/css/custom.css index 288bb25..1f7e96f 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -27,11 +27,46 @@ main { } .section { + position: relative; + isolation: isolate; + overflow: visible; padding: 72px 0; } +.section > .container { + padding-inline: clamp(0.75rem, 2vw, 1.25rem); +} + +.section h2 { + letter-spacing: -0.02em; +} + +.section .lead, +.section p { + line-height: 1.7; +} + +.section > .container { + position: relative; + z-index: 2; +} + .section-muted { - background: #f1f3f6; + background: linear-gradient(180deg, rgba(241, 243, 246, 0.78), rgba(246, 247, 249, 0.56)); + border-top: 1px solid rgba(255, 255, 255, 0.72); + border-bottom: 1px solid rgba(229, 231, 235, 0.55); + overflow: visible; +} + +.section-muted::before { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background: + radial-gradient(circle at 12% 18%, rgba(255, 255, 255, 0.42), transparent 30%), + radial-gradient(circle at 86% 78%, rgba(37, 99, 235, 0.1), transparent 24%); + z-index: 0; } .eyebrow { @@ -116,6 +151,24 @@ footer a { .hero-section { padding-top: 40px; } + .hero-collage { + grid-template-columns: 1fr; + } + .hero-collage-main { + min-height: 260px; + } + .hero-collage-stack { + grid-template-columns: 1fr 1fr; + } + .hero-collage-stack img { + min-height: 160px; + } + .hero-collage-strip { + grid-template-columns: 1fr; + } + .hero-strip-photo { + height: 180px; + } } @@ -220,7 +273,14 @@ footer { position: absolute; inset: 0; pointer-events: none; - background: linear-gradient(135deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0)); +} + +.hero-section::after { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0)); +} + +.section-muted::after { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0)); } .hero-card, @@ -246,6 +306,133 @@ footer { box-shadow: 0 20px 60px rgba(15, 23, 42, 0.08); } +.work-card, +.about-panel, +.contact-box, +.testimonial-card { + border-radius: 24px; +} + +.hero-collage { + display: grid; + grid-template-columns: minmax(0, 1.45fr) minmax(0, 0.85fr); + gap: 14px; +} + +.hero-collage-main, +.hero-collage-stack, +.hero-collage-strip { + position: relative; + overflow: hidden; + border-radius: 24px; + background: linear-gradient(135deg, rgba(37, 99, 235, 0.08), rgba(16, 185, 129, 0.08)); +} + +.hero-collage-main { + min-height: 320px; +} + +.hero-collage-main img, +.hero-collage-stack img, +.hero-strip-photo { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.hero-collage-main::after, +.hero-collage-stack::after, +.hero-collage-strip::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(180deg, rgba(15, 23, 42, 0) 35%, rgba(15, 23, 42, 0.2) 100%); + pointer-events: none; +} + +.hero-collage-main img, +.hero-collage-stack img, +.hero-strip-photo { + transform: scale(1.03); +} + +.hero-collage-stack { + display: grid; + gap: 14px; +} + +.hero-collage-stack img { + min-height: 153px; +} + +.hero-collage-badge { + position: absolute; + left: 16px; + bottom: 16px; + z-index: 1; + display: inline-flex; + align-items: center; + padding: 0.45rem 0.8rem; + border-radius: 999px; + background: rgba(255, 255, 255, 0.86); + color: #0f172a; + font-weight: 600; + font-size: 0.8rem; + box-shadow: 0 10px 24px rgba(15, 23, 42, 0.15); +} + +.hero-collage-strip { + display: grid; + grid-template-columns: 96px minmax(0, 1fr); + gap: 14px; + align-items: center; + padding: 14px; +} + +.hero-strip-photo { + height: 96px; + border-radius: 18px; +} + +.hero-strip-copy { + min-width: 0; +} + +.parallax-media { + will-change: transform; + transform-origin: center center; + transition: transform 0.16s linear; +} + +.card-img-top.parallax-media, +.testi-img.parallax-media { + transform: scale(1.02); +} + +.card { + overflow: hidden; +} + +.work-card { + border: 1px solid rgba(229, 231, 235, 0.9); + background: rgba(255, 255, 255, 0.98); +} + +.work-card .card-body, +.testimonial-card .card-body { + padding: 1.35rem; +} + +.testimonial-card { + border: 1px solid rgba(229, 231, 235, 0.9); + background: rgba(255, 255, 255, 0.98); +} + +.contact-box { + background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(248,250,252,0.95)); +} + .btn-primary, .btn-outline-dark { transition: transform 0.25s ease, box-shadow 0.25s ease; @@ -284,4 +471,9 @@ footer { .bg-cursor-glow { display: none; } + + .parallax-media { + transition: none; + transform: none !important; + } } diff --git a/assets/images/pexels/1148998.jpg b/assets/images/pexels/1148998.jpg new file mode 100644 index 0000000..5f2a667 Binary files /dev/null and b/assets/images/pexels/1148998.jpg differ diff --git a/assets/images/pexels/134469.jpg b/assets/images/pexels/134469.jpg new file mode 100644 index 0000000..2408a33 Binary files /dev/null and b/assets/images/pexels/134469.jpg differ diff --git a/assets/images/pexels/1714208.jpg b/assets/images/pexels/1714208.jpg new file mode 100644 index 0000000..0199610 Binary files /dev/null and b/assets/images/pexels/1714208.jpg differ diff --git a/assets/images/pexels/3872166.jpg b/assets/images/pexels/3872166.jpg new file mode 100644 index 0000000..a49e2ac Binary files /dev/null and b/assets/images/pexels/3872166.jpg differ diff --git a/assets/images/pexels/4872054.jpg b/assets/images/pexels/4872054.jpg new file mode 100644 index 0000000..77bd9f7 Binary files /dev/null and b/assets/images/pexels/4872054.jpg differ diff --git a/assets/images/pexels/815996.jpg b/assets/images/pexels/815996.jpg new file mode 100644 index 0000000..850fed6 Binary files /dev/null and b/assets/images/pexels/815996.jpg differ diff --git a/assets/js/main.js b/assets/js/main.js index 01ed082..08c5a97 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -20,10 +20,12 @@ document.addEventListener('DOMContentLoaded', () => { const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; const orbs = Array.from(document.querySelectorAll('.bg-orb')); const cursorGlow = document.querySelector('.bg-cursor-glow'); + const parallaxItems = Array.from(document.querySelectorAll('[data-parallax]')); - if (!prefersReducedMotion && (orbs.length || cursorGlow)) { + if (!prefersReducedMotion && (orbs.length || cursorGlow || parallaxItems.length)) { const pointer = { x: window.innerWidth / 2, y: window.innerHeight / 3 }; const smooth = { x: pointer.x, y: pointer.y }; + let scrollY = window.scrollY; const render = () => { smooth.x += (pointer.x - smooth.x) * 0.08; @@ -37,6 +39,18 @@ document.addEventListener('DOMContentLoaded', () => { orb.style.transform = `translate3d(${dx}px, ${dy}px, 0)`; }); + parallaxItems.forEach((item, index) => { + const depth = Number(item.dataset.parallax || 12); + const direction = Number(item.dataset.parallaxDirection || (index % 2 === 0 ? 1 : -1)); + const rawMoveX = ((smooth.x / window.innerWidth) - 0.5) * depth * 0.7 * direction; + const rawMoveY = ((smooth.y / window.innerHeight) - 0.5) * depth * 0.45 + (scrollY * 0.004 * depth * direction); + const limitX = Math.max(8, depth * 1.6); + const limitY = Math.max(10, depth * 1.8); + const moveX = Math.max(-limitX, Math.min(limitX, rawMoveX)); + const moveY = Math.max(-limitY, Math.min(limitY, rawMoveY)); + item.style.transform = `translate3d(${moveX}px, ${moveY}px, 0) scale(1.02)`; + }); + if (cursorGlow) { cursorGlow.style.transform = `translate3d(${smooth.x}px, ${smooth.y}px, 0)`; } @@ -50,6 +64,7 @@ document.addEventListener('DOMContentLoaded', () => { }, { passive: true }); window.addEventListener('scroll', () => { + scrollY = window.scrollY; pointer.y = window.innerHeight / 3 + (window.scrollY * 0.08); }, { passive: true }); diff --git a/index.php b/index.php index 2ba3f7c..bb36c9a 100644 --- a/index.php +++ b/index.php @@ -26,6 +26,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; $now = date('Y-m-d H:i:s'); // Fetch images for sections +$heroImages = get_images('studio,workspace,creative,editorial'); $workImages = get_images('design,code,analytics'); $testimonialImages = get_images('person,professional,business'); @@ -181,6 +182,36 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+
+ 'https://picsum.photos/seed/hero-main/900/1080', 'alt' => 'Creative desk setup with sketches and display screens'], + ['src' => 'https://picsum.photos/seed/hero-side-a/720/720', 'alt' => 'Moodboard with typography and color samples'], + ['src' => 'https://picsum.photos/seed/hero-side-b/720/720', 'alt' => 'Product interface on a laptop screen'], + ['src' => 'https://picsum.photos/seed/hero-side-c/720/720', 'alt' => 'Team workshop notes and sticky planning cards'], + ]; + $heroSources = []; + for ($i = 0; $i < 4; $i++) { + $heroSources[$i] = $heroImages[$i] ?? $heroDefaults[$i]; + } + ?> +
+ <?= htmlspecialchars($heroSources[0]['alt']) ?> + Live creative direction +
+
+ <?= htmlspecialchars($heroSources[1]['alt']) ?> + <?= htmlspecialchars($heroSources[2]['alt']) ?> +
+
+
+ <?= htmlspecialchars($heroSources[3]['alt']) ?> +
+

Current focus

+

Visual systems, motion, and product storytelling

+

Designed to keep the page lively without overpowering the content.

+
+

Recent highlights