Apple UHD Services & Products Page
A premium dark-themed landing page inspired by Apple — featuring gradient mesh canvas, product showcase cards, pinned scroll services walkthrough, animated stat counters, CSS-only iPhone mockup, and glassmorphism ecosystem section.
Open in Lab
MCP
gsap scrolltrigger lenis css vanilla-js canvas
Targets: JS HTML
Code
/* ============================================
Apple UHD — Services & Products
============================================ */
:root {
--apple-black: #000000;
--apple-dark: #1d1d1f;
--apple-surface: #161617;
--apple-blue: #0071e3;
--apple-blue-glow: rgba(0, 113, 227, 0.25);
--apple-blue-subtle: rgba(0, 113, 227, 0.08);
--apple-purple: #af52de;
--apple-purple-glow: rgba(175, 82, 222, 0.25);
--apple-green: #34c759;
--apple-red: #ff3b30;
--apple-orange: #ff9f0a;
--apple-text: #f5f5f7;
--apple-muted: #86868b;
--apple-dim: #6e6e73;
--glass-bg: rgba(255, 255, 255, 0.04);
--glass-border: rgba(255, 255, 255, 0.08);
--glass-hover: rgba(255, 255, 255, 0.07);
--radius: 16px;
--radius-lg: 24px;
--font: "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
font-family: var(--font);
background: var(--apple-black);
color: var(--apple-text);
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* ---- Canvas Background ---- */
#mesh-bg {
position: fixed;
inset: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
}
main {
position: relative;
z-index: 1;
}
/* ---- Navigation ---- */
.nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
background: rgba(0, 0, 0, 0.72);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.nav-inner {
max-width: 1100px;
margin: 0 auto;
padding: 14px 24px;
display: flex;
align-items: center;
justify-content: space-between;
}
.nav-logo {
color: var(--apple-text);
opacity: 0.9;
}
.nav-links {
display: flex;
gap: 28px;
}
.nav-links a {
color: var(--apple-muted);
text-decoration: none;
font-size: 0.8rem;
letter-spacing: 0.02em;
transition: color 0.3s ease;
}
.nav-links a:hover {
color: var(--apple-text);
}
/* ---- Shared ---- */
.section-container {
max-width: 1100px;
margin: 0 auto;
padding: 0 24px;
}
.tag {
display: inline-block;
padding: 6px 16px;
border-radius: 100px;
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--apple-blue);
background: var(--apple-blue-subtle);
border: 1px solid rgba(0, 113, 227, 0.15);
margin-bottom: 20px;
}
.section-title {
font-size: clamp(2.5rem, 7vw, 4.5rem);
font-weight: 700;
line-height: 1.05;
letter-spacing: -0.04em;
color: var(--apple-text);
margin-bottom: 16px;
}
.section-desc {
font-size: 1.15rem;
line-height: 1.65;
color: var(--apple-muted);
max-width: 560px;
margin-bottom: 48px;
}
.glass-card {
background: var(--glass-bg);
backdrop-filter: blur(24px) saturate(180%);
-webkit-backdrop-filter: blur(24px) saturate(180%);
border: 1px solid var(--glass-border);
border-radius: var(--radius-lg);
transition: border-color 0.4s ease;
}
.glass-card:hover {
border-color: rgba(255, 255, 255, 0.14);
}
.reveal {
opacity: 0;
transform: translateY(30px);
}
/* ---- Buttons ---- */
.btn-primary {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
border-radius: 100px;
background: var(--apple-blue);
color: #fff;
font-size: 0.95rem;
font-weight: 600;
text-decoration: none;
border: none;
cursor: pointer;
transition: background 0.3s ease, transform 0.2s ease;
}
.btn-primary:hover {
background: #0077ed;
transform: scale(1.03);
}
.btn-outline {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
border-radius: 100px;
background: transparent;
color: var(--apple-blue);
font-size: 0.95rem;
font-weight: 600;
text-decoration: none;
border: 1.5px solid rgba(0, 113, 227, 0.4);
cursor: pointer;
transition: border-color 0.3s ease, background 0.3s ease, transform 0.2s ease;
}
.btn-outline:hover {
border-color: var(--apple-blue);
background: rgba(0, 113, 227, 0.08);
transform: scale(1.03);
}
.btn-lg {
padding: 18px 40px;
font-size: 1.05rem;
}
/* ============================================
Section 1: Hero
============================================ */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
position: relative;
padding: 120px 24px 80px;
}
.hero-content {
will-change: transform, opacity, filter;
}
.hero-title {
font-size: clamp(5rem, 18vw, 14rem);
font-weight: 800;
letter-spacing: -0.06em;
line-height: 0.85;
background: linear-gradient(180deg, #fff 20%, #86868b 80%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
opacity: 0;
margin-bottom: 24px;
}
.hero-subtitle {
font-size: clamp(1rem, 2.5vw, 1.4rem);
color: var(--apple-muted);
letter-spacing: -0.01em;
line-height: 1.5;
opacity: 0;
margin-bottom: 40px;
}
.hero-ctas {
display: flex;
gap: 16px;
justify-content: center;
flex-wrap: wrap;
opacity: 0;
transform: translateY(20px);
}
.scroll-indicator {
position: absolute;
bottom: 32px;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
opacity: 0;
}
.scroll-text {
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--apple-dim);
}
.scroll-line {
width: 1px;
height: 32px;
background: linear-gradient(180deg, var(--apple-blue), transparent);
animation: scrollPulse 2s ease-in-out infinite;
}
@keyframes scrollPulse {
0%,
100% {
opacity: 0.3;
transform: scaleY(0.6);
}
50% {
opacity: 1;
transform: scaleY(1);
}
}
/* ============================================
Section 2: Products
============================================ */
.products-section {
padding: 140px 0;
}
.products-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
.product-card {
background: var(--glass-bg);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid var(--glass-border);
border-radius: var(--radius-lg);
padding: 32px 24px;
text-align: center;
transition: border-color 0.3s ease, background 0.3s ease, transform 0.3s ease;
opacity: 0;
transform: translateY(20px);
}
.product-card:hover {
background: var(--glass-hover);
border-color: rgba(255, 255, 255, 0.15);
transform: translateY(-4px);
}
.product-card-featured {
border-color: rgba(0, 113, 227, 0.3);
box-shadow: 0 0 48px rgba(0, 113, 227, 0.08);
}
.product-card-featured:hover {
border-color: rgba(0, 113, 227, 0.5);
}
.product-icon {
width: 80px;
height: 80px;
margin: 0 auto 20px;
color: var(--apple-text);
opacity: 0.7;
}
.product-icon svg {
width: 100%;
height: 100%;
}
.product-name {
font-size: 1.15rem;
font-weight: 700;
margin-bottom: 8px;
letter-spacing: -0.02em;
}
.product-desc {
font-size: 0.85rem;
color: var(--apple-muted);
line-height: 1.55;
margin-bottom: 16px;
}
.product-price {
font-size: 0.8rem;
color: var(--apple-blue);
font-weight: 600;
}
/* ============================================
Section 3: Services (Pinned Scroll)
============================================ */
.services-track {
position: relative;
padding: 140px 0;
}
.services-sticky {
max-width: 1100px;
margin: 0 auto;
padding: 0 24px;
}
.services-left {
margin-bottom: 48px;
}
.services-right {
display: none;
}
.step-dots {
display: none;
}
.step-cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.step-card {
background: var(--glass-bg);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid var(--glass-border);
border-radius: var(--radius-lg);
padding: 32px 24px;
transition: border-color 0.3s ease, background 0.3s ease, transform 0.3s ease;
opacity: 0;
transform: translateY(20px);
}
.step-card.active {
opacity: 0;
transform: translateY(20px);
}
.step-card:hover {
background: var(--glass-hover);
border-color: rgba(255, 255, 255, 0.15);
transform: translateY(-4px);
}
.step-title {
font-size: 1.5rem;
font-weight: 700;
letter-spacing: -0.02em;
margin-bottom: 12px;
}
.step-desc {
font-size: 0.95rem;
color: var(--apple-muted);
line-height: 1.6;
margin-bottom: 16px;
}
.step-meta {
display: flex;
gap: 8px;
}
.step-badge {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border-radius: 100px;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.02em;
}
.music-badge {
color: var(--apple-red);
background: rgba(255, 59, 48, 0.1);
border: 1px solid rgba(255, 59, 48, 0.2);
}
.tv-badge {
color: var(--apple-text);
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.12);
}
.cloud-badge {
color: var(--apple-blue);
background: var(--apple-blue-subtle);
border: 1px solid rgba(0, 113, 227, 0.2);
}
/* Services Visuals */
.services-visuals {
position: relative;
width: 320px;
height: 320px;
}
.how-visual {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transform: scale(0.95);
transition: opacity 0.6s ease, transform 0.6s ease;
}
.how-visual.active {
opacity: 1;
transform: scale(1);
}
/* Music Visual */
.visual-music {
text-align: center;
}
.album-art {
width: 200px;
height: 200px;
border-radius: 20px;
position: relative;
overflow: hidden;
margin: 0 auto 24px;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.album-gradient {
position: absolute;
inset: 0;
background: linear-gradient(135deg, var(--apple-red), var(--apple-purple), var(--apple-blue));
opacity: 0.7;
}
.album-icon {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
.mini-equalizer {
display: flex;
align-items: flex-end;
justify-content: center;
gap: 3px;
position: absolute;
bottom: 16px;
left: 50%;
transform: translateX(-50%);
}
.mini-equalizer span {
width: 3px;
height: 3px;
background: rgba(255, 255, 255, 0.8);
border-radius: 2px;
animation: eqBounce 0.8s ease-in-out infinite alternate;
}
.mini-equalizer span:nth-child(1) {
animation-delay: 0s;
}
.mini-equalizer span:nth-child(2) {
animation-delay: 0.1s;
}
.mini-equalizer span:nth-child(3) {
animation-delay: 0.2s;
}
.mini-equalizer span:nth-child(4) {
animation-delay: 0.3s;
}
.mini-equalizer span:nth-child(5) {
animation-delay: 0.4s;
}
@keyframes eqBounce {
0% {
height: 3px;
}
100% {
height: 16px;
}
}
.music-waveform {
display: flex;
align-items: center;
justify-content: center;
gap: 2px;
}
.music-waveform span {
width: 2px;
background: var(--apple-red);
border-radius: 1px;
opacity: 0.5;
animation: waveform 1.2s ease-in-out infinite alternate;
}
.music-waveform span:nth-child(odd) {
height: 8px;
}
.music-waveform span:nth-child(even) {
height: 14px;
}
.music-waveform span:nth-child(1) {
animation-delay: 0s;
}
.music-waveform span:nth-child(2) {
animation-delay: 0.05s;
}
.music-waveform span:nth-child(3) {
animation-delay: 0.1s;
}
.music-waveform span:nth-child(4) {
animation-delay: 0.15s;
}
.music-waveform span:nth-child(5) {
animation-delay: 0.2s;
}
.music-waveform span:nth-child(6) {
animation-delay: 0.25s;
}
.music-waveform span:nth-child(7) {
animation-delay: 0.3s;
}
.music-waveform span:nth-child(8) {
animation-delay: 0.35s;
}
.music-waveform span:nth-child(9) {
animation-delay: 0.4s;
}
.music-waveform span:nth-child(10) {
animation-delay: 0.45s;
}
.music-waveform span:nth-child(11) {
animation-delay: 0.5s;
}
.music-waveform span:nth-child(12) {
animation-delay: 0.55s;
}
.music-waveform span:nth-child(13) {
animation-delay: 0.6s;
}
.music-waveform span:nth-child(14) {
animation-delay: 0.65s;
}
.music-waveform span:nth-child(15) {
animation-delay: 0.7s;
}
@keyframes waveform {
0% {
height: 4px;
opacity: 0.3;
}
100% {
height: 20px;
opacity: 0.8;
}
}
/* TV Visual */
.visual-tv {
text-align: center;
}
.tv-screen {
width: 260px;
height: 160px;
border-radius: 12px;
position: relative;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.tv-gradient {
position: absolute;
inset: 0;
background: linear-gradient(135deg, #1a1a2e, #16213e, #0f3460);
}
.tv-play-btn {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
.tv-bars {
position: absolute;
bottom: 12px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 4px;
}
.tv-bars span {
height: 3px;
border-radius: 2px;
background: rgba(255, 255, 255, 0.3);
}
.tv-bars span:nth-child(1) {
width: 24px;
background: rgba(255, 255, 255, 0.7);
}
.tv-bars span:nth-child(2) {
width: 40px;
}
.tv-bars span:nth-child(3) {
width: 16px;
}
/* Cloud Visual */
.visual-cloud {
text-align: center;
}
.cloud-sync {
position: relative;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 24px;
}
.sync-dots {
position: absolute;
bottom: -8px;
display: flex;
gap: 6px;
}
.sync-dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--apple-blue);
animation: syncPulse 1.5s ease-in-out infinite;
}
.sync-dot:nth-child(2) {
animation-delay: 0.3s;
}
.sync-dot:nth-child(3) {
animation-delay: 0.6s;
}
@keyframes syncPulse {
0%,
100% {
opacity: 0.3;
transform: scale(0.8);
}
50% {
opacity: 1;
transform: scale(1.2);
}
}
.device-row {
display: flex;
align-items: flex-end;
justify-content: center;
gap: 16px;
}
.mini-device {
border-radius: 4px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.04);
}
.mini-phone {
width: 24px;
height: 40px;
border-radius: 6px;
}
.mini-laptop {
width: 48px;
height: 32px;
border-radius: 3px;
}
.mini-tablet {
width: 36px;
height: 28px;
border-radius: 4px;
}
/* ============================================
Section 4: Stats
============================================ */
.stats-section {
padding: 140px 0;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
margin-top: 48px;
}
.stat-card {
text-align: center;
padding: 32px 16px;
position: relative;
}
.stat-number {
font-size: clamp(3rem, 8vw, 5rem);
font-weight: 800;
letter-spacing: -0.04em;
line-height: 1;
background: linear-gradient(180deg, #fff 0%, var(--apple-blue) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 12px;
}
.stat-label {
font-size: 0.85rem;
color: var(--apple-muted);
line-height: 1.4;
}
.stat-prefix {
position: absolute;
top: 28px;
left: 50%;
transform: translateX(-120%);
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: 800;
color: var(--apple-muted);
opacity: 0.5;
}
/* ============================================
Section 5: Ecosystem
============================================ */
.ecosystem-section {
padding: 140px 0;
}
.ecosystem-card {
padding: 48px;
}
.eco-features {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 32px;
}
.eco-feature {
opacity: 0;
transform: translateX(-20px);
}
.eco-icon {
color: var(--apple-blue);
margin-bottom: 16px;
opacity: 0.8;
}
.eco-feature h4 {
font-size: 1rem;
font-weight: 700;
margin-bottom: 8px;
letter-spacing: -0.01em;
}
.eco-feature p {
font-size: 0.82rem;
color: var(--apple-muted);
line-height: 1.55;
}
/* ============================================
Section 6: Device Mockup
============================================ */
.app-section {
padding: 140px 0;
}
.app-layout {
display: flex;
align-items: center;
gap: 80px;
margin-top: 48px;
}
.app-device {
flex-shrink: 0;
position: relative;
perspective: 1000px;
}
.device-glow {
position: absolute;
width: 320px;
height: 320px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: radial-gradient(circle, var(--apple-blue-glow) 0%, transparent 70%);
border-radius: 50%;
animation: glowPulse 6s ease-in-out infinite;
z-index: -1;
}
@keyframes glowPulse {
0%,
100% {
opacity: 0.5;
transform: translate(-50%, -50%) scale(1);
}
50% {
opacity: 1;
transform: translate(-50%, -50%) scale(1.08);
}
}
.device-phone {
width: 280px;
aspect-ratio: 9 / 19.5;
background: linear-gradient(145deg, #2a2a2e, #1c1c1e);
border-radius: 44px;
border: 2px solid rgba(255, 255, 255, 0.1);
position: relative;
overflow: hidden;
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.05), 0 20px 60px rgba(0, 0, 0, 0.5), inset 0 1px 0
rgba(255, 255, 255, 0.08);
transform-style: preserve-3d;
will-change: transform;
}
.phone-notch {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 120px;
height: 34px;
background: var(--apple-black);
border-radius: 0 0 20px 20px;
z-index: 5;
display: flex;
align-items: center;
justify-content: center;
}
.phone-camera {
width: 10px;
height: 10px;
border-radius: 50%;
background: #1a1a1e;
border: 1.5px solid #2a2a30;
position: relative;
}
.phone-camera::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
width: 4px;
height: 4px;
border-radius: 50%;
background: radial-gradient(circle, #1e3a5f, #0a1628);
}
.phone-screen {
position: absolute;
inset: 0;
border-radius: 42px;
overflow: hidden;
background: linear-gradient(180deg, #0a0a0c 0%, #12121a 100%);
padding: 48px 20px 20px;
display: flex;
flex-direction: column;
}
.phone-status-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 8px;
margin-bottom: 24px;
color: var(--apple-text);
font-size: 0.7rem;
font-weight: 600;
}
.status-time {
font-size: 0.75rem;
font-weight: 700;
}
.status-icons {
display: flex;
align-items: center;
gap: 4px;
}
.phone-hero-card {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
justify-content: center;
}
.phone-app-row {
display: flex;
justify-content: space-between;
gap: 12px;
}
.phone-app-icon {
width: 52px;
height: 52px;
border-radius: 14px;
}
.app-music {
background: linear-gradient(135deg, #fc3c44, #d92d76);
}
.app-tv {
background: linear-gradient(135deg, #2a2a2e, #1a1a1e);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.app-photos {
background: linear-gradient(135deg, #f0c040, #e06040, #a04fe0, #40a0f0);
}
.app-health {
background: linear-gradient(135deg, #ff375f, #ff6482);
}
.app-wallet {
background: linear-gradient(135deg, #1c1c1e, #2c2c2e);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.app-maps {
background: linear-gradient(135deg, #34c759, #4cd964);
}
.app-fitness {
background: linear-gradient(135deg, #b4ff3c, #30d158);
}
.app-store {
background: linear-gradient(135deg, #0071e3, #40a0f0);
}
.phone-widget {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
padding: 16px;
position: relative;
overflow: hidden;
}
.widget-gradient {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(252, 60, 68, 0.15), rgba(175, 82, 222, 0.1));
opacity: 0.6;
}
.widget-label {
position: relative;
font-size: 0.65rem;
color: var(--apple-muted);
text-transform: uppercase;
letter-spacing: 0.08em;
display: block;
margin-bottom: 8px;
}
.widget-eq {
position: relative;
display: flex;
align-items: flex-end;
gap: 3px;
height: 16px;
}
.widget-eq span {
width: 3px;
border-radius: 2px;
background: var(--apple-red);
animation: eqBounce 0.7s ease-in-out infinite alternate;
}
.widget-eq span:nth-child(1) {
animation-delay: 0s;
height: 6px;
}
.widget-eq span:nth-child(2) {
animation-delay: 0.12s;
height: 12px;
}
.widget-eq span:nth-child(3) {
animation-delay: 0.24s;
height: 8px;
}
.widget-eq span:nth-child(4) {
animation-delay: 0.36s;
height: 14px;
}
.phone-home-bar {
width: 36%;
height: 4px;
background: rgba(255, 255, 255, 0.3);
border-radius: 2px;
margin: auto auto 8px;
}
.app-info {
flex: 1;
}
.app-info h3 {
font-size: 1.6rem;
font-weight: 700;
letter-spacing: -0.02em;
margin-bottom: 16px;
}
.app-info p {
font-size: 0.95rem;
color: var(--apple-muted);
line-height: 1.65;
margin-bottom: 24px;
}
.app-features {
list-style: none;
display: flex;
flex-direction: column;
gap: 14px;
}
.app-feature {
display: flex;
align-items: center;
gap: 10px;
font-size: 0.9rem;
color: var(--apple-text);
opacity: 0.85;
}
.app-feature svg {
flex-shrink: 0;
color: var(--apple-green);
}
/* ============================================
Section 7: Privacy
============================================ */
.privacy-section {
padding: 140px 0;
}
.privacy-card {
padding: 48px;
margin-top: 48px;
}
.privacy-features {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 40px;
}
.privacy-feature {
opacity: 0;
transform: translateX(-20px);
}
.privacy-icon {
color: var(--apple-purple);
margin-bottom: 16px;
opacity: 0.85;
}
.privacy-feature h4 {
font-size: 1.05rem;
font-weight: 700;
margin-bottom: 8px;
letter-spacing: -0.01em;
}
.privacy-feature p {
font-size: 0.85rem;
color: var(--apple-muted);
line-height: 1.55;
}
/* ============================================
Section 8: CTA
============================================ */
.cta-section {
padding: 200px 24px;
text-align: center;
position: relative;
overflow: hidden;
}
.cta-rings {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
pointer-events: none;
}
.ring {
position: absolute;
border-radius: 50%;
border: 1px solid rgba(0, 113, 227, 0.12);
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0.5);
opacity: 0;
}
.ring-1 {
width: 400px;
height: 400px;
}
.ring-2 {
width: 600px;
height: 600px;
}
.ring-3 {
width: 800px;
height: 800px;
}
.cta-orbs {
position: absolute;
inset: 0;
pointer-events: none;
}
.cta-orb {
position: absolute;
border-radius: 50%;
filter: blur(80px);
}
.orb-1 {
width: 300px;
height: 300px;
background: rgba(0, 113, 227, 0.15);
top: 20%;
left: 25%;
}
.orb-2 {
width: 250px;
height: 250px;
background: rgba(175, 82, 222, 0.12);
bottom: 20%;
right: 25%;
}
.cta-content {
position: relative;
z-index: 2;
}
.cta-title {
font-size: clamp(3rem, 8vw, 6rem);
font-weight: 800;
letter-spacing: -0.05em;
line-height: 1;
background: linear-gradient(135deg, #fff 30%, var(--apple-blue) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 20px;
}
.cta-desc {
font-size: 1.15rem;
color: var(--apple-muted);
max-width: 500px;
margin: 0 auto 36px;
line-height: 1.6;
}
.cta-buttons {
display: flex;
gap: 16px;
justify-content: center;
flex-wrap: wrap;
}
/* ---- Footer ---- */
.footer {
text-align: center;
padding: 40px 24px;
font-size: 0.75rem;
color: var(--apple-dim);
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
/* ============================================
Reduced Motion
============================================ */
@media (prefers-reduced-motion: reduce) {
.reveal {
opacity: 1;
transform: none;
}
.product-card {
opacity: 1;
transform: none;
}
.eco-feature,
.privacy-feature {
opacity: 1;
transform: none;
}
.scroll-line,
.mini-equalizer span,
.music-waveform span,
.widget-eq span,
.sync-dot,
.device-glow {
animation: none;
}
.scroll-line {
opacity: 0.6;
}
.mini-equalizer span {
height: 8px;
}
.music-waveform span {
height: 10px;
opacity: 0.5;
}
.widget-eq span {
height: 10px;
}
.sync-dot {
opacity: 0.6;
}
.device-glow {
opacity: 0.5;
}
}
/* ============================================
Responsive
============================================ */
@media (max-width: 1024px) {
.products-grid {
grid-template-columns: repeat(2, 1fr);
}
.step-cards {
grid-template-columns: repeat(2, 1fr);
}
.eco-features {
grid-template-columns: repeat(2, 1fr);
}
.app-layout {
flex-direction: column;
gap: 48px;
text-align: center;
}
.app-features {
align-items: center;
}
.stats-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.nav-links {
display: none;
}
.products-section,
.stats-section,
.ecosystem-section,
.app-section,
.privacy-section {
padding: 80px 0;
}
.products-grid {
grid-template-columns: 1fr;
max-width: 400px;
margin: 0 auto;
}
.step-cards {
grid-template-columns: 1fr;
}
.stats-grid {
grid-template-columns: 1fr 1fr;
}
.ecosystem-card,
.privacy-card {
padding: 28px;
border-radius: 20px;
}
.eco-features {
grid-template-columns: 1fr;
}
.privacy-features {
grid-template-columns: 1fr;
}
.device-phone {
width: 240px;
}
.device-glow {
width: 260px;
height: 260px;
}
.cta-section {
padding: 120px 24px;
}
.ring-1 {
width: 260px;
height: 260px;
}
.ring-2 {
width: 400px;
height: 400px;
}
.ring-3 {
width: 540px;
height: 540px;
}
}
@media (max-width: 480px) {
.hero-title {
font-size: clamp(3.5rem, 20vw, 6rem);
}
.hero-ctas {
flex-direction: column;
align-items: center;
}
.section-title {
font-size: clamp(2rem, 8vw, 3rem);
}
.stat-number {
font-size: 3rem;
}
.device-phone {
width: 200px;
}
.device-glow {
width: 220px;
height: 220px;
}
.btn-primary,
.btn-outline {
width: 100%;
max-width: 280px;
}
.cta-buttons {
flex-direction: column;
align-items: center;
}
}/* ============================================
Apple UHD — Services & Products
Script: Canvas mesh, Lenis, GSAP ScrollTrigger
============================================ */
(function () {
"use strict";
/* ---- Reduced Motion ---- */
const reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
const dur = (d) => (reduced ? 0 : d);
/* ============================================
1. Canvas Gradient Mesh (Apple colors)
============================================ */
const canvas = document.getElementById("mesh-bg");
const ctx = canvas.getContext("2d");
const DPR = window.devicePixelRatio || 1;
let W, H;
function resize() {
W = window.innerWidth;
H = window.innerHeight;
canvas.width = W * DPR;
canvas.height = H * DPR;
canvas.style.width = W + "px";
canvas.style.height = H + "px";
ctx.setTransform(DPR, 0, 0, DPR, 0, 0);
}
const ORB_CONFIGS = [
{ color: "rgba(0,113,227,0.22)", fx: 0.22, fy: 0.18, ax: 0.28, ay: 0.22, px: 0.0, py: 0.0 },
{ color: "rgba(175,82,222,0.16)", fx: 0.16, fy: 0.28, ax: 0.32, ay: 0.26, px: 1.3, py: 0.7 },
{ color: "rgba(0,113,227,0.12)", fx: 0.35, fy: 0.14, ax: 0.26, ay: 0.32, px: 2.6, py: 1.4 },
{ color: "rgba(52,199,89,0.10)", fx: 0.12, fy: 0.38, ax: 0.38, ay: 0.18, px: 0.5, py: 3.0 },
];
let orbs = [];
function initOrbs() {
orbs = ORB_CONFIGS.map((cfg) => ({
cx: W * (0.3 + Math.random() * 0.4),
cy: H * (0.2 + Math.random() * 0.6),
r: Math.max(W, H) * (0.25 + Math.random() * 0.15),
color: cfg.color,
fx: cfg.fx,
fy: cfg.fy,
ax: cfg.ax,
ay: cfg.ay,
px: cfg.px,
py: cfg.py,
}));
}
let t = 0;
function draw() {
ctx.fillStyle = "#000000";
ctx.fillRect(0, 0, W, H);
ctx.globalCompositeOperation = "screen";
orbs.forEach((orb) => {
const speed = reduced ? 0 : 1;
const x = orb.cx + Math.sin(t * orb.fx + orb.px) * orb.ax * W * speed;
const y = orb.cy + Math.cos(t * orb.fy + orb.py) * orb.ay * H * speed;
const g = ctx.createRadialGradient(x, y, 0, x, y, orb.r);
g.addColorStop(0, orb.color);
g.addColorStop(0.5, orb.color.replace(/[\d.]+\)$/, "0.06)"));
g.addColorStop(1, "transparent");
ctx.fillStyle = g;
ctx.fillRect(0, 0, W, H);
});
ctx.globalCompositeOperation = "source-over";
/* Vignette */
const vignette = ctx.createRadialGradient(W / 2, H / 2, H * 0.15, W / 2, H / 2, H * 0.85);
vignette.addColorStop(0, "transparent");
vignette.addColorStop(1, "rgba(0,0,0,0.6)");
ctx.fillStyle = vignette;
ctx.fillRect(0, 0, W, H);
t += 0.003;
requestAnimationFrame(draw);
}
resize();
initOrbs();
draw();
window.addEventListener("resize", () => {
resize();
initOrbs();
});
/* ============================================
2. Lenis Smooth Scroll + GSAP ticker
============================================ */
const lenis = new Lenis({
duration: 1.2,
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
smoothWheel: true,
autoRaf: false,
});
gsap.registerPlugin(ScrollTrigger);
lenis.on("scroll", ScrollTrigger.update);
gsap.ticker.add((time) => {
lenis.raf(time * 1000);
});
gsap.ticker.lagSmoothing(0);
/* ============================================
3. Hero entrance timeline
============================================ */
const heroTl = gsap.timeline({ defaults: { ease: "power4.out" }, delay: 0.4 });
heroTl
.to(".hero-title", { opacity: 1, duration: dur(2) })
.to(".hero-subtitle", { opacity: 1, y: -10, duration: dur(1.2) }, "-=1.5")
.to(".hero-ctas", { opacity: 1, y: 0, duration: dur(1) }, "-=0.8")
.to(".scroll-indicator", { opacity: 1, duration: dur(0.8) }, "-=0.4");
/* Hero parallax on scroll */
gsap.to(".hero-content", {
scale: 1.15,
opacity: 0,
filter: "blur(12px)",
scrollTrigger: {
trigger: ".hero",
start: "top top",
end: "70% top",
scrub: true,
},
});
gsap.to(".hero-ctas", {
y: -60,
opacity: 0,
scrollTrigger: {
trigger: ".hero",
start: "20% top",
end: "60% top",
scrub: true,
},
});
/* ============================================
4. Generic .reveal scroll animation
============================================ */
gsap.utils.toArray(".reveal").forEach((el) => {
gsap.fromTo(
el,
{ opacity: 0, y: reduced ? 0 : 40 },
{
opacity: 1,
y: 0,
duration: dur(1),
ease: "power3.out",
scrollTrigger: {
trigger: el,
start: "top 85%",
toggleActions: "play none none none",
},
}
);
});
/* ============================================
5. Product cards stagger reveal
============================================ */
const productCards = document.querySelectorAll(".product-card");
if (productCards.length) {
gsap.fromTo(
productCards,
{ opacity: 0, y: reduced ? 0 : 30, scale: reduced ? 1 : 0.96 },
{
opacity: 1,
y: 0,
scale: 1,
duration: dur(0.7),
stagger: 0.1,
ease: "power3.out",
scrollTrigger: {
trigger: ".products-grid",
start: "top 80%",
toggleActions: "play none none none",
},
}
);
}
/* ============================================
6. Services cards stagger reveal
============================================ */
const stepCards = document.querySelectorAll(".step-card");
if (stepCards.length) {
gsap.fromTo(
stepCards,
{ opacity: 0, y: reduced ? 0 : 30 },
{
opacity: 1,
y: 0,
duration: dur(0.7),
stagger: 0.15,
ease: "power3.out",
scrollTrigger: {
trigger: ".step-cards",
start: "top 80%",
toggleActions: "play none none none",
},
}
);
}
/* ============================================
7. Stat counter count-up
============================================ */
document.querySelectorAll(".stat-number").forEach((el) => {
const target = parseInt(el.dataset.target, 10);
const suffix = el.dataset.suffix || "";
el.textContent = "0" + suffix;
ScrollTrigger.create({
trigger: el,
start: "top 85%",
once: true,
onEnter: () => {
gsap.to(
{ val: 0 },
{
val: target,
duration: dur(2),
ease: "power2.out",
onUpdate: function () {
const current = Math.round(this.targets()[0].val);
el.textContent = current.toLocaleString() + suffix;
},
}
);
},
});
});
/* ============================================
8. Ecosystem features stagger
============================================ */
const ecoFeatures = document.querySelectorAll(".eco-feature");
if (ecoFeatures.length) {
gsap.fromTo(
ecoFeatures,
{ opacity: 0, x: reduced ? 0 : -20 },
{
opacity: 1,
x: 0,
duration: dur(0.6),
stagger: 0.15,
ease: "power3.out",
scrollTrigger: {
trigger: ".eco-features",
start: "top 80%",
toggleActions: "play none none none",
},
}
);
}
/* ============================================
9. Privacy features stagger
============================================ */
const privacyFeatures = document.querySelectorAll(".privacy-feature");
if (privacyFeatures.length) {
gsap.fromTo(
privacyFeatures,
{ opacity: 0, x: reduced ? 0 : -20 },
{
opacity: 1,
x: 0,
duration: dur(0.6),
stagger: 0.15,
ease: "power3.out",
scrollTrigger: {
trigger: ".privacy-features",
start: "top 80%",
toggleActions: "play none none none",
},
}
);
}
/* ============================================
10. Device mockup mouse-tilt parallax
============================================ */
const devicePhone = document.querySelector(".app-device .device-phone");
if (devicePhone && !reduced) {
gsap.to(devicePhone, {
y: -40,
rotateX: 5,
scrollTrigger: {
trigger: ".app-section",
start: "top center",
end: "bottom center",
scrub: true,
},
});
window.addEventListener("mousemove", (e) => {
const rect = devicePhone.getBoundingClientRect();
const cx = rect.left + rect.width / 2;
const cy = rect.top + rect.height / 2;
const x = (e.clientX - cx) / (rect.width / 2);
const y = (e.clientY - cy) / (rect.height / 2);
gsap.to(devicePhone, {
rotateY: x * 8,
rotateX: -y * 8,
duration: 0.8,
ease: "power2.out",
});
});
}
/* ============================================
11. CTA rings expansion
============================================ */
gsap.utils.toArray(".ring").forEach((ring, i) => {
gsap.fromTo(
ring,
{ scale: 0.5, opacity: 0 },
{
scale: 1,
opacity: 1,
duration: dur(1.5),
delay: i * 0.15,
scrollTrigger: {
trigger: ".cta-section",
start: "top 80%",
toggleActions: "play none none none",
},
}
);
});
/* CTA orbs gentle float */
if (!reduced) {
gsap.to(".orb-1", {
x: 30,
y: -20,
duration: 6,
ease: "sine.inOut",
repeat: -1,
yoyo: true,
});
gsap.to(".orb-2", {
x: -25,
y: 15,
duration: 5,
ease: "sine.inOut",
repeat: -1,
yoyo: true,
});
}
})();<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Apple | Think Different</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<canvas id="mesh-bg"></canvas>
<!-- Navigation -->
<nav class="nav">
<div class="nav-inner">
<div class="nav-logo">
<svg width="18" height="22" viewBox="0 0 18 22" fill="none" aria-hidden="true">
<path d="M14.94 11.58c-.02-2.27 1.85-3.36 1.93-3.41-1.05-1.54-2.69-1.75-3.27-1.78-1.39-.14-2.72.82-3.43.82-.71 0-1.81-.8-2.97-.78-1.53.02-2.94.89-3.73 2.26-1.59 2.76-.41 6.85 1.14 9.09.76 1.1 1.66 2.33 2.85 2.29 1.14-.05 1.57-.74 2.95-.74 1.38 0 1.77.74 2.98.71 1.23-.02 2.01-1.12 2.76-2.22.87-1.27 1.23-2.51 1.25-2.57-.03-.01-2.4-.92-2.42-3.66zM12.68 4.58c.63-.76 1.05-1.82.94-2.88-.91.04-2.01.61-2.66 1.37-.58.67-1.1 1.75-.96 2.78 1.02.08 2.06-.51 2.68-1.27z" fill="currentColor"/>
</svg>
</div>
<div class="nav-links">
<a href="#products">Products</a>
<a href="#services">Services</a>
<a href="#ecosystem">Ecosystem</a>
</div>
</div>
</nav>
<main id="main">
<!-- Section 1: Hero -->
<section class="hero" id="hero">
<div class="hero-content">
<h1 class="hero-title">Apple.</h1>
<p class="hero-subtitle">Think different. Create different. Experience different.</p>
<div class="hero-ctas">
<a href="#products" class="btn-primary">Explore Products</a>
<a href="#services" class="btn-outline">Discover Services</a>
</div>
</div>
<div class="scroll-indicator">
<span class="scroll-text">Scroll</span>
<span class="scroll-line"></span>
</div>
</section>
<!-- Section 2: Products Showcase -->
<section class="products-section" id="products">
<div class="section-container">
<span class="tag reveal">Products</span>
<h2 class="section-title reveal">Designed to be<br>loved.</h2>
<p class="section-desc reveal">Hardware and software that work together seamlessly — creating experiences that feel effortless.</p>
<div class="products-grid">
<div class="product-card product-card-featured">
<div class="product-icon">
<svg viewBox="0 0 80 80" fill="none" aria-hidden="true">
<rect x="16" y="8" width="48" height="64" rx="8" stroke="currentColor" stroke-width="1.5" fill="none"/>
<line x1="16" y1="16" x2="64" y2="16" stroke="currentColor" stroke-width="1" opacity="0.3"/>
<line x1="16" y1="60" x2="64" y2="60" stroke="currentColor" stroke-width="1" opacity="0.3"/>
<circle cx="40" cy="66" r="2" fill="currentColor" opacity="0.4"/>
<rect x="30" y="10" width="20" height="4" rx="2" fill="currentColor" opacity="0.3"/>
</svg>
</div>
<h3 class="product-name">iPhone 16 Pro</h3>
<p class="product-desc">Titanium. A18 Pro chip. 48MP camera system. The most powerful iPhone ever.</p>
<span class="product-price">From $999</span>
</div>
<div class="product-card">
<div class="product-icon">
<svg viewBox="0 0 80 80" fill="none" aria-hidden="true">
<rect x="8" y="16" width="64" height="40" rx="4" stroke="currentColor" stroke-width="1.5" fill="none"/>
<line x1="8" y1="48" x2="72" y2="48" stroke="currentColor" stroke-width="1" opacity="0.3"/>
<path d="M32 56 L48 56 L52 64 L28 64 Z" stroke="currentColor" stroke-width="1.5" fill="none"/>
<circle cx="40" cy="52" r="1.5" fill="currentColor" opacity="0.4"/>
</svg>
</div>
<h3 class="product-name">MacBook Pro</h3>
<p class="product-desc">M4 Pro and M4 Max. The most advanced Mac chips for unmatched performance.</p>
<span class="product-price">From $1,599</span>
</div>
<div class="product-card">
<div class="product-icon">
<svg viewBox="0 0 80 80" fill="none" aria-hidden="true">
<rect x="12" y="24" width="56" height="36" rx="6" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M12 36 Q40 20 68 36" stroke="currentColor" stroke-width="1" opacity="0.3" fill="none"/>
<circle cx="18" cy="52" r="2" fill="currentColor" opacity="0.4"/>
<circle cx="62" cy="52" r="2" fill="currentColor" opacity="0.4"/>
<rect x="30" y="28" width="20" height="3" rx="1.5" fill="currentColor" opacity="0.3"/>
</svg>
</div>
<h3 class="product-name">Apple Watch Ultra 2</h3>
<p class="product-desc">The most rugged and capable Apple Watch. Built for endurance.</p>
<span class="product-price">From $799</span>
</div>
<div class="product-card">
<div class="product-icon">
<svg viewBox="0 0 80 80" fill="none" aria-hidden="true">
<ellipse cx="30" cy="40" rx="12" ry="18" stroke="currentColor" stroke-width="1.5" fill="none"/>
<ellipse cx="50" cy="40" rx="12" ry="18" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M30 22 L30 16 Q30 12 34 12 L34 22" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M50 22 L50 16 Q50 12 46 12 L46 22" stroke="currentColor" stroke-width="1.5" fill="none"/>
</svg>
</div>
<h3 class="product-name">AirPods Pro 2</h3>
<p class="product-desc">Adaptive Audio. Personalized Spatial Audio. Hearing health features.</p>
<span class="product-price">From $249</span>
</div>
</div>
</div>
</section>
<!-- Section 3: Services (Pinned Scroll) -->
<section class="services-track" id="services">
<div class="services-sticky">
<div class="services-left">
<span class="tag">Services</span>
<h2 class="section-title">Entertainment.<br>Redefined.</h2>
<div class="step-dots">
<button class="step-dot active" aria-label="Apple Music"></button>
<button class="step-dot" aria-label="Apple TV+"></button>
<button class="step-dot" aria-label="iCloud+"></button>
</div>
<div class="step-cards">
<div class="step-card active">
<h3 class="step-title">Apple Music</h3>
<p class="step-desc">Over 100 million songs. Spatial Audio with Dolby Atmos. Lossless quality. One subscription, endless discovery.</p>
<div class="step-meta">
<span class="step-badge music-badge">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<circle cx="5" cy="12" r="2.5" stroke="currentColor" stroke-width="1.2" fill="none"/>
<circle cx="11" cy="10" r="2.5" stroke="currentColor" stroke-width="1.2" fill="none"/>
<path d="M7.5 12V4L13.5 2.5V10" stroke="currentColor" stroke-width="1.2" fill="none"/>
</svg>
100M+ Songs
</span>
</div>
</div>
<div class="step-card">
<h3 class="step-title">Apple TV+</h3>
<p class="step-desc">Award-winning Apple Originals. Critically acclaimed series, films, and documentaries. Stories that move you.</p>
<div class="step-meta">
<span class="step-badge tv-badge">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<rect x="1" y="2" width="14" height="10" rx="1.5" stroke="currentColor" stroke-width="1.2" fill="none"/>
<path d="M5 14h6" stroke="currentColor" stroke-width="1.2"/>
<path d="M6 6l4 2-4 2z" fill="currentColor" opacity="0.6"/>
</svg>
Apple Originals
</span>
</div>
</div>
<div class="step-card">
<h3 class="step-title">iCloud+</h3>
<p class="step-desc">Keep all your photos, files, and data safe and accessible everywhere. Private Relay. Hide My Email. HomeKit Secure Video.</p>
<div class="step-meta">
<span class="step-badge cloud-badge">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M4 12a3 3 0 01-.5-5.96A4.5 4.5 0 0112.28 5 3.5 3.5 0 0112.5 12H4z" stroke="currentColor" stroke-width="1.2" fill="none"/>
</svg>
2TB Storage
</span>
</div>
</div>
</div>
</div>
<div class="services-right">
<div class="services-visuals">
<!-- Music Visual -->
<div class="how-visual active">
<div class="visual-music">
<div class="album-art">
<div class="album-gradient"></div>
<div class="album-icon">
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" aria-hidden="true">
<circle cx="24" cy="24" r="20" stroke="rgba(255,255,255,0.2)" stroke-width="1" fill="none"/>
<circle cx="24" cy="24" r="12" stroke="rgba(255,255,255,0.15)" stroke-width="1" fill="none"/>
<circle cx="24" cy="24" r="4" fill="rgba(255,255,255,0.3)"/>
</svg>
</div>
<div class="mini-equalizer">
<span></span><span></span><span></span><span></span><span></span>
</div>
</div>
<div class="music-waveform">
<span></span><span></span><span></span><span></span><span></span>
<span></span><span></span><span></span><span></span><span></span>
<span></span><span></span><span></span><span></span><span></span>
</div>
</div>
</div>
<!-- TV+ Visual -->
<div class="how-visual">
<div class="visual-tv">
<div class="tv-screen">
<div class="tv-gradient"></div>
<div class="tv-play-btn">
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" aria-hidden="true">
<circle cx="20" cy="20" r="18" stroke="rgba(255,255,255,0.3)" stroke-width="1.5" fill="rgba(255,255,255,0.08)"/>
<path d="M16 12l12 8-12 8z" fill="rgba(255,255,255,0.7)"/>
</svg>
</div>
<div class="tv-bars">
<span></span><span></span><span></span>
</div>
</div>
</div>
</div>
<!-- iCloud Visual -->
<div class="how-visual">
<div class="visual-cloud">
<div class="cloud-sync">
<svg width="80" height="60" viewBox="0 0 80 60" fill="none" aria-hidden="true">
<path d="M20 48a12 12 0 01-2-23.8A18 18 0 0154 18a14 14 0 012 27.8H20z" stroke="rgba(255,255,255,0.25)" stroke-width="1.5" fill="rgba(255,255,255,0.04)"/>
</svg>
<div class="sync-dots">
<span class="sync-dot"></span>
<span class="sync-dot"></span>
<span class="sync-dot"></span>
</div>
</div>
<div class="device-row">
<div class="mini-device mini-phone"></div>
<div class="mini-device mini-laptop"></div>
<div class="mini-device mini-tablet"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Section 4: Stats -->
<section class="stats-section" id="stats">
<div class="section-container">
<span class="tag reveal">By the Numbers</span>
<h2 class="section-title reveal">Apple at a glance.</h2>
<div class="stats-grid">
<div class="stat-card reveal">
<div class="stat-number" data-target="2" data-suffix="B+">0</div>
<p class="stat-label">Active devices worldwide</p>
</div>
<div class="stat-card reveal">
<div class="stat-number" data-target="180" data-suffix="+">0</div>
<p class="stat-label">Countries & regions</p>
</div>
<div class="stat-card reveal">
<div class="stat-number" data-target="1" data-suffix="M+">0</div>
<p class="stat-label">Apps on the App Store</p>
</div>
<div class="stat-card reveal">
<div class="stat-number" data-target="320" data-suffix="B+">0</div>
<p class="stat-label">Paid to developers</p>
<span class="stat-prefix">$</span>
</div>
</div>
</div>
</section>
<!-- Section 5: Ecosystem (Glass Card) -->
<section class="ecosystem-section" id="ecosystem">
<div class="section-container">
<span class="tag reveal">Ecosystem</span>
<h2 class="section-title reveal">It all works<br>together.</h2>
<p class="section-desc reveal">When your devices and services connect seamlessly, technology disappears — and the experience begins.</p>
<div class="glass-card ecosystem-card reveal">
<div class="eco-features">
<div class="eco-feature">
<div class="eco-icon">
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" aria-hidden="true">
<path d="M14 3v22M3 14h22" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
<circle cx="14" cy="14" r="10" stroke="currentColor" stroke-width="1" opacity="0.3"/>
</svg>
</div>
<h4>AirDrop</h4>
<p>Share files, photos, and links instantly with nearby Apple devices.</p>
</div>
<div class="eco-feature">
<div class="eco-icon">
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" aria-hidden="true">
<rect x="4" y="4" width="20" height="20" rx="4" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M10 14h8M14 10v8" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" opacity="0.5"/>
</svg>
</div>
<h4>Handoff</h4>
<p>Start on one device, pick up right where you left off on another.</p>
</div>
<div class="eco-feature">
<div class="eco-icon">
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" aria-hidden="true">
<circle cx="14" cy="12" r="4" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M7 24c0-4 3-7 7-7s7 3 7 7" stroke="currentColor" stroke-width="1.5" fill="none"/>
</svg>
</div>
<h4>Apple ID</h4>
<p>One account for all your Apple services, purchases, and settings.</p>
</div>
<div class="eco-feature">
<div class="eco-icon">
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" aria-hidden="true">
<rect x="5" y="8" width="18" height="14" rx="2" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M5 12h18" stroke="currentColor" stroke-width="1" opacity="0.3"/>
<circle cx="9" cy="18" r="1.5" fill="currentColor" opacity="0.4"/>
</svg>
</div>
<h4>Apple Pay</h4>
<p>Secure, contactless payments on every Apple device.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Section 6: Device Mockup -->
<section class="app-section" id="app">
<div class="section-container">
<span class="tag reveal">Experience</span>
<h2 class="section-title reveal">Your world.<br>In your pocket.</h2>
<div class="app-layout">
<div class="app-device">
<div class="device-glow"></div>
<div class="device-phone">
<div class="phone-notch">
<div class="phone-camera"></div>
</div>
<div class="phone-screen">
<div class="phone-status-bar">
<span class="status-time">9:41</span>
<div class="status-icons">
<svg width="14" height="10" viewBox="0 0 14 10" fill="none" aria-hidden="true">
<rect x="0" y="6" width="2" height="4" rx="0.5" fill="currentColor" opacity="0.5"/>
<rect x="3" y="4" width="2" height="6" rx="0.5" fill="currentColor" opacity="0.6"/>
<rect x="6" y="2" width="2" height="8" rx="0.5" fill="currentColor" opacity="0.8"/>
<rect x="9" y="0" width="2" height="10" rx="0.5" fill="currentColor"/>
</svg>
<svg width="16" height="10" viewBox="0 0 16 10" fill="none" aria-hidden="true">
<rect x="0" y="1" width="14" height="8" rx="1.5" stroke="currentColor" stroke-width="0.8" fill="none"/>
<rect x="1" y="2.5" width="10" height="5" rx="0.5" fill="currentColor" opacity="0.6"/>
<rect x="14.5" y="3" width="1.5" height="4" rx="0.5" fill="currentColor" opacity="0.4"/>
</svg>
</div>
</div>
<div class="phone-hero-card">
<div class="phone-app-row">
<div class="phone-app-icon app-music"></div>
<div class="phone-app-icon app-tv"></div>
<div class="phone-app-icon app-photos"></div>
<div class="phone-app-icon app-health"></div>
</div>
<div class="phone-widget">
<div class="widget-gradient"></div>
<span class="widget-label">Now Playing</span>
<div class="widget-eq">
<span></span><span></span><span></span><span></span>
</div>
</div>
<div class="phone-app-row">
<div class="phone-app-icon app-wallet"></div>
<div class="phone-app-icon app-maps"></div>
<div class="phone-app-icon app-fitness"></div>
<div class="phone-app-icon app-store"></div>
</div>
</div>
<div class="phone-home-bar"></div>
</div>
</div>
</div>
<div class="app-info reveal">
<h3>Designed for your life</h3>
<p>Every app, every service, every interaction — designed to be intuitive, beautiful, and private. Your iPhone is the key to your entire Apple ecosystem.</p>
<ul class="app-features">
<li class="app-feature">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true">
<path d="M10 2a8 8 0 100 16 8 8 0 000-16z" stroke="currentColor" stroke-width="1.2" fill="none"/>
<path d="M7 10l2 2 4-4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Face ID & biometric security
</li>
<li class="app-feature">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true">
<path d="M10 2a8 8 0 100 16 8 8 0 000-16z" stroke="currentColor" stroke-width="1.2" fill="none"/>
<path d="M7 10l2 2 4-4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Privacy built into every layer
</li>
<li class="app-feature">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true">
<path d="M10 2a8 8 0 100 16 8 8 0 000-16z" stroke="currentColor" stroke-width="1.2" fill="none"/>
<path d="M7 10l2 2 4-4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Seamless ecosystem integration
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Section 7: Privacy -->
<section class="privacy-section" id="privacy">
<div class="section-container">
<span class="tag reveal">Privacy</span>
<h2 class="section-title reveal">Privacy is a<br>fundamental right.</h2>
<div class="glass-card privacy-card">
<div class="privacy-features">
<div class="privacy-feature">
<div class="privacy-icon">
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" aria-hidden="true">
<rect x="8" y="14" width="16" height="12" rx="2" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M11 14V10a5 5 0 0110 0v4" stroke="currentColor" stroke-width="1.5" fill="none"/>
<circle cx="16" cy="20" r="1.5" fill="currentColor" opacity="0.6"/>
</svg>
</div>
<h4>On-Device Intelligence</h4>
<p>Your data is processed on your device whenever possible, never on servers.</p>
</div>
<div class="privacy-feature">
<div class="privacy-icon">
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" aria-hidden="true">
<circle cx="16" cy="16" r="10" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M16 6v10l6 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" fill="none"/>
</svg>
</div>
<h4>App Tracking Transparency</h4>
<p>You decide which apps can track your activity across other apps and websites.</p>
</div>
<div class="privacy-feature">
<div class="privacy-icon">
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" aria-hidden="true">
<path d="M16 4L6 10v8c0 6.6 4.3 12.4 10 14 5.7-1.6 10-7.4 10-14v-8L16 4z" stroke="currentColor" stroke-width="1.5" fill="none"/>
<path d="M12 16l3 3 5-6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<h4>End-to-End Encryption</h4>
<p>iMessage, FaceTime, and iCloud data are encrypted so only you can access them.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Section 8: CTA -->
<section class="cta-section" id="cta">
<div class="cta-rings">
<span class="ring ring-1"></span>
<span class="ring ring-2"></span>
<span class="ring ring-3"></span>
</div>
<div class="cta-orbs">
<span class="cta-orb orb-1"></span>
<span class="cta-orb orb-2"></span>
</div>
<div class="cta-content">
<h2 class="cta-title reveal">Experience Apple.</h2>
<p class="cta-desc reveal">The products you love. The services you rely on. The privacy you deserve.</p>
<div class="cta-buttons reveal">
<a href="#" class="btn-primary btn-lg">Shop Now</a>
<a href="#" class="btn-outline btn-lg">Visit Apple Store</a>
</div>
</div>
</section>
<!-- Footer -->
<footer class="footer">
<p>© UHD Landing — Inspired by Apple. Built with Stealthis.</p>
</footer>
</main>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lenis@1.1.18/dist/lenis.min.js"></script>
<script src="./script.js"></script>
</body>
</html>Apple UHD — Services & Products
A cinematic Apple-inspired landing page showcasing products and services. Built with canvas gradient mesh, GSAP ScrollTrigger pinned sections, glassmorphism cards, animated counters, and a CSS-only iPhone 15 mockup with mouse-tilt parallax.