Commit 081d9938 authored by Mahmoud Aglan's avatar Mahmoud Aglan

kokokokoko

parent 8c142ce1
...@@ -32,7 +32,7 @@ html { ...@@ -32,7 +32,7 @@ html {
body { body {
font-family: 'Tajawal', sans-serif; font-family: 'Tajawal', sans-serif;
font-size: var(--text-base); font-size: var(--text-base);
line-height: 1.7; line-height: 1.75;
color: var(--ink-primary); color: var(--ink-primary);
background-color: var(--bg-deep); background-color: var(--bg-deep);
overflow-x: hidden; overflow-x: hidden;
...@@ -40,14 +40,15 @@ body { ...@@ -40,14 +40,15 @@ body {
} }
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
line-height: 1.25; line-height: 1.2;
font-weight: 700; font-weight: 700;
text-wrap: balance; text-wrap: balance;
letter-spacing: -0.01em;
} }
h1 { font-size: var(--text-5xl); font-weight: 900; } h1 { font-size: var(--text-5xl); font-weight: 900; letter-spacing: -0.025em; line-height: 1.05; }
h2 { font-size: var(--text-4xl); font-weight: 800; } h2 { font-size: var(--text-4xl); font-weight: 800; letter-spacing: -0.02em; line-height: 1.1; }
h3 { font-size: var(--text-3xl); } h3 { font-size: var(--text-3xl); letter-spacing: -0.015em; }
h4 { font-size: var(--text-2xl); } h4 { font-size: var(--text-2xl); }
h5 { font-size: var(--text-xl); } h5 { font-size: var(--text-xl); }
...@@ -86,7 +87,7 @@ ul, ol { ...@@ -86,7 +87,7 @@ ul, ol {
} }
::selection { ::selection {
background: oklch(0.570 0.158 353.3 / 0.3); background: oklch(0.550 0.180 353.3 / 0.35);
color: var(--ink-primary); color: var(--ink-primary);
} }
...@@ -109,6 +110,7 @@ ul, ol { ...@@ -109,6 +110,7 @@ ul, ol {
.section { .section {
padding-block: var(--space-section); padding-block: var(--space-section);
position: relative;
} }
.visually-hidden { .visually-hidden {
...@@ -122,3 +124,14 @@ ul, ol { ...@@ -122,3 +124,14 @@ ul, ol {
white-space: nowrap; white-space: nowrap;
border: 0; border: 0;
} }
/* Noise texture overlay for depth */
body::before {
content: '';
position: fixed;
inset: 0;
pointer-events: none;
z-index: 9999;
opacity: 0.025;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
}
...@@ -5,15 +5,16 @@ ...@@ -5,15 +5,16 @@
right: 0; right: 0;
left: 0; left: 0;
z-index: var(--z-sticky); z-index: var(--z-sticky);
padding-block: var(--space-md); padding-block: var(--space-sm);
transition: background var(--duration-normal) var(--ease-out-quart), transition: all var(--duration-slow) var(--ease-out-expo);
backdrop-filter var(--duration-normal) var(--ease-out-quart);
} }
.nav--scrolled { .nav--scrolled {
background: oklch(0.120 0.008 353.3 / 0.85); background: oklch(0.095 0.006 280 / 0.8);
backdrop-filter: blur(20px) saturate(1.2); backdrop-filter: blur(24px) saturate(1.4);
border-bottom: 1px solid var(--border-subtle); -webkit-backdrop-filter: blur(24px) saturate(1.4);
border-bottom: 1px solid oklch(1 0 0 / 0.04);
padding-block: var(--space-xs);
} }
.nav__inner { .nav__inner {
...@@ -24,66 +25,70 @@ ...@@ -24,66 +25,70 @@
} }
.nav__logo { .nav__logo {
font-size: var(--text-xl); font-size: var(--text-lg);
font-weight: 900; font-weight: 900;
color: var(--ink-primary); color: var(--ink-primary);
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--space-sm); gap: var(--space-sm);
letter-spacing: -0.02em;
} }
.nav__logo-mark { .nav__logo-mark {
width: 2.5rem; width: 2rem;
height: 2.5rem; height: 2rem;
background: var(--brand-primary); background: linear-gradient(135deg, var(--brand-primary), var(--brand-primary-light));
border-radius: var(--radius-md); border-radius: var(--radius-md);
display: grid; display: grid;
place-items: center; place-items: center;
color: white; color: white;
font-weight: 900; font-weight: 900;
font-size: var(--text-sm); font-size: var(--text-xs);
box-shadow: 0 2px 12px oklch(0.550 0.180 353.3 / 0.3);
} }
.nav__links { .nav__links {
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--space-lg); gap: var(--space-xs);
} }
.nav__link { .nav__link {
color: var(--ink-secondary); color: var(--ink-muted);
font-size: var(--text-sm); font-size: var(--text-sm);
font-weight: 500; font-weight: 500;
padding: var(--space-xs) var(--space-sm); padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-sm); border-radius: var(--radius-md);
transition: color var(--duration-fast) var(--ease-out-quart), transition: all var(--duration-fast) var(--ease-out-quart);
background var(--duration-fast) var(--ease-out-quart);
} }
.nav__link:hover, .nav__link:hover {
.nav__link--active {
color: var(--ink-primary); color: var(--ink-primary);
background: oklch(1 0 0 / 0.05); background: oklch(1 0 0 / 0.05);
} }
.nav__link--active {
color: var(--ink-primary);
}
.nav__cta { .nav__cta {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
gap: var(--space-xs); gap: var(--space-xs);
padding: var(--space-sm) var(--space-lg); padding: var(--space-xs) var(--space-md);
background: var(--brand-primary); background: var(--brand-primary);
color: white; color: white;
font-weight: 700; font-weight: 600;
font-size: var(--text-sm); font-size: var(--text-sm);
border-radius: var(--radius-md); border-radius: var(--radius-lg);
transition: transform var(--duration-fast) var(--ease-out-quart), transition: all var(--duration-fast) var(--ease-out-quart);
box-shadow var(--duration-fast) var(--ease-out-quart); box-shadow: 0 2px 8px oklch(0.550 0.180 353.3 / 0.2);
} }
.nav__cta:hover { .nav__cta:hover {
color: white; color: white;
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: var(--shadow-glow); box-shadow: 0 4px 20px oklch(0.550 0.180 353.3 / 0.35);
} }
/* Mobile menu */ /* Mobile menu */
...@@ -94,11 +99,17 @@ ...@@ -94,11 +99,17 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
color: var(--ink-primary); color: var(--ink-primary);
border-radius: var(--radius-md);
transition: background var(--duration-fast) var(--ease-out-quart);
}
.nav__toggle:hover {
background: oklch(1 0 0 / 0.05);
} }
.nav__toggle svg { .nav__toggle svg {
width: 24px; width: 20px;
height: 24px; height: 20px;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
...@@ -111,7 +122,7 @@ ...@@ -111,7 +122,7 @@
top: 0; top: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
width: min(320px, 85vw); width: min(300px, 85vw);
flex-direction: column; flex-direction: column;
align-items: stretch; align-items: stretch;
padding: var(--space-3xl) var(--space-lg); padding: var(--space-3xl) var(--space-lg);
...@@ -120,6 +131,7 @@ ...@@ -120,6 +131,7 @@
transform: translateX(100%); transform: translateX(100%);
transition: transform var(--duration-slow) var(--ease-out-expo); transition: transform var(--duration-slow) var(--ease-out-expo);
z-index: var(--z-modal); z-index: var(--z-modal);
backdrop-filter: blur(20px);
} }
.nav__links--open { .nav__links--open {
...@@ -127,7 +139,7 @@ ...@@ -127,7 +139,7 @@
} }
.nav__link { .nav__link {
font-size: var(--text-lg); font-size: var(--text-base);
padding: var(--space-md); padding: var(--space-md);
} }
...@@ -144,59 +156,88 @@ ...@@ -144,59 +156,88 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
gap: var(--space-sm); gap: var(--space-sm);
padding: var(--space-md) var(--space-xl); padding: var(--space-sm) var(--space-xl);
font-weight: 700; font-weight: 600;
font-size: var(--text-base); font-size: var(--text-sm);
border-radius: var(--radius-md); border-radius: var(--radius-lg);
transition: transform var(--duration-fast) var(--ease-out-quart), transition: all var(--duration-normal) var(--ease-out-quart);
box-shadow var(--duration-fast) var(--ease-out-quart), min-height: 44px;
background var(--duration-fast) var(--ease-out-quart); position: relative;
min-height: 48px; overflow: hidden;
} }
.btn--primary { .btn--primary {
background: var(--brand-primary); background: linear-gradient(135deg, var(--brand-primary), var(--brand-primary-light));
color: white; color: white;
box-shadow: 0 2px 16px oklch(0.550 0.180 353.3 / 0.25),
inset 0 1px 0 oklch(1 0 0 / 0.1);
}
.btn--primary::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, oklch(1 0 0 / 0.1), transparent);
opacity: 0;
transition: opacity var(--duration-fast) var(--ease-out-quart);
} }
.btn--primary:hover { .btn--primary:hover {
color: white; color: white;
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: var(--shadow-glow); box-shadow: 0 6px 30px oklch(0.550 0.180 353.3 / 0.4),
inset 0 1px 0 oklch(1 0 0 / 0.15);
}
.btn--primary:hover::before {
opacity: 1;
} }
.btn--secondary { .btn--secondary {
background: transparent; background: oklch(1 0 0 / 0.03);
color: var(--ink-primary); color: var(--ink-primary);
border: 1px solid var(--border-default); border: 1px solid var(--border-default);
backdrop-filter: blur(8px);
} }
.btn--secondary:hover { .btn--secondary:hover {
color: var(--ink-primary); color: var(--ink-primary);
background: oklch(1 0 0 / 0.05); background: oklch(1 0 0 / 0.07);
border-color: var(--ink-muted); border-color: var(--ink-muted);
transform: translateY(-1px);
} }
.btn--large { .btn--large {
padding: var(--space-lg) var(--space-2xl); padding: var(--space-md) var(--space-2xl);
font-size: var(--text-lg); font-size: var(--text-base);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
min-height: 52px;
} }
/* Screenshot showcase */ /* Screenshot showcase */
.screenshot { .screenshot {
position: relative; position: relative;
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
overflow: hidden; overflow: hidden;
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
box-shadow: var(--shadow-lg); box-shadow: var(--shadow-lg);
transition: transform var(--duration-normal) var(--ease-out-quart), transition: all var(--duration-slow) var(--ease-out-expo);
box-shadow var(--duration-normal) var(--ease-out-quart); background: var(--bg-surface);
}
.screenshot::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
box-shadow: inset 0 1px 0 oklch(1 0 0 / 0.05);
pointer-events: none;
} }
.screenshot:hover { .screenshot:hover {
transform: translateY(-4px); transform: translateY(-6px) scale(1.01);
box-shadow: var(--shadow-lg), var(--shadow-glow); box-shadow: var(--shadow-lg), 0 20px 60px oklch(0 0 0 / 0.4);
border-color: var(--border-glow);
} }
.screenshot img { .screenshot img {
...@@ -205,22 +246,31 @@ ...@@ -205,22 +246,31 @@
} }
.screenshot--framed { .screenshot--framed {
background: var(--bg-surface); background: var(--bg-elevated);
padding: var(--space-sm); padding: 2px;
} }
.screenshot--framed::before { .screenshot--framed::before {
content: ''; content: '';
display: block; display: block;
height: 2rem; height: 1.75rem;
background: var(--bg-elevated); background: var(--bg-surface);
border-radius: var(--radius-sm) var(--radius-sm) 0 0; border-radius: var(--radius-lg) var(--radius-lg) 0 0;
margin: calc(-1 * var(--space-sm)); position: relative;
margin-bottom: var(--space-sm); display: flex;
background-image: radial-gradient(circle, var(--ink-muted) 4px, transparent 4px); align-items: center;
background-size: 16px 16px; padding-right: 12px;
background-position: 12px center; gap: 6px;
background-repeat: repeat-x; margin-bottom: 2px;
}
.screenshot--framed::before {
background-image:
radial-gradient(circle at 14px 50%, oklch(0.600 0.150 25) 4px, transparent 4px),
radial-gradient(circle at 28px 50%, oklch(0.700 0.130 85) 4px, transparent 4px),
radial-gradient(circle at 42px 50%, oklch(0.600 0.150 145) 4px, transparent 4px);
background-repeat: no-repeat;
background-size: 100% 100%;
} }
/* Feature cards */ /* Feature cards */
...@@ -228,31 +278,50 @@ ...@@ -228,31 +278,50 @@
padding: var(--space-xl); padding: var(--space-xl);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
transition: border-color var(--duration-normal) var(--ease-out-quart), transition: all var(--duration-slow) var(--ease-out-expo);
box-shadow var(--duration-normal) var(--ease-out-quart); position: relative;
overflow: hidden;
}
.feature-card::before {
content: '';
position: absolute;
top: 0;
right: 0;
width: 100px;
height: 100px;
background: radial-gradient(circle, var(--brand-primary-ghost), transparent 70%);
opacity: 0;
transition: opacity var(--duration-slow) var(--ease-out-expo);
} }
.feature-card:hover { .feature-card:hover {
border-color: var(--brand-primary-muted); border-color: var(--border-glow);
box-shadow: 0 0 30px oklch(0.570 0.158 353.3 / 0.08); transform: translateY(-3px);
box-shadow: 0 8px 32px oklch(0 0 0 / 0.3), 0 0 0 1px var(--border-glow);
}
.feature-card:hover::before {
opacity: 1;
} }
.feature-card__icon { .feature-card__icon {
width: 3rem; width: 2.75rem;
height: 3rem; height: 2.75rem;
display: grid; display: grid;
place-items: center; place-items: center;
background: var(--brand-primary-dim); background: linear-gradient(135deg, var(--brand-primary-dim), var(--brand-primary-muted));
border-radius: var(--radius-md); border-radius: var(--radius-lg);
margin-bottom: var(--space-lg); margin-bottom: var(--space-lg);
color: var(--brand-primary-light); color: var(--brand-primary-light);
box-shadow: 0 2px 8px oklch(0.550 0.180 353.3 / 0.15);
} }
.feature-card__title { .feature-card__title {
font-size: var(--text-xl); font-size: var(--text-lg);
font-weight: 700; font-weight: 700;
margin-bottom: var(--space-sm); margin-bottom: var(--space-xs);
color: var(--ink-primary); color: var(--ink-primary);
} }
...@@ -265,12 +334,16 @@ ...@@ -265,12 +334,16 @@
/* Stats */ /* Stats */
.stat { .stat {
text-align: center; text-align: center;
position: relative;
} }
.stat__value { .stat__value {
font-size: var(--text-4xl); font-size: var(--text-4xl);
font-weight: 900; font-weight: 900;
color: var(--brand-primary-light); background: linear-gradient(135deg, var(--brand-primary-light), var(--brand-primary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
line-height: 1; line-height: 1;
margin-bottom: var(--space-xs); margin-bottom: var(--space-xs);
} }
...@@ -287,15 +360,18 @@ ...@@ -287,15 +360,18 @@
} }
.section-header__tag { .section-header__tag {
display: inline-block; display: inline-flex;
font-size: var(--text-sm); align-items: center;
font-weight: 700; gap: var(--space-xs);
font-size: var(--text-xs);
font-weight: 600;
color: var(--brand-primary-light); color: var(--brand-primary-light);
margin-bottom: var(--space-md); margin-bottom: var(--space-md);
padding: var(--space-xs) var(--space-md); padding: var(--space-2xs) var(--space-sm);
background: oklch(0.570 0.158 353.3 / 0.1); background: oklch(0.550 0.180 353.3 / 0.08);
border-radius: var(--radius-sm); border-radius: var(--radius-xl);
border: 1px solid oklch(0.570 0.158 353.3 / 0.2); border: 1px solid oklch(0.550 0.180 353.3 / 0.15);
letter-spacing: 0.02em;
} }
.section-header__title { .section-header__title {
...@@ -304,7 +380,7 @@ ...@@ -304,7 +380,7 @@
.section-header__desc { .section-header__desc {
font-size: var(--text-lg); font-size: var(--text-lg);
max-width: 60ch; max-width: 55ch;
} }
/* Footer */ /* Footer */
...@@ -312,6 +388,18 @@ ...@@ -312,6 +388,18 @@
padding-block: var(--space-2xl); padding-block: var(--space-2xl);
background: var(--bg-base); background: var(--bg-base);
border-top: 1px solid var(--border-subtle); border-top: 1px solid var(--border-subtle);
position: relative;
}
.footer::before {
content: '';
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 200px;
height: 1px;
background: linear-gradient(90deg, transparent, var(--brand-primary-dim), transparent);
} }
.footer__grid { .footer__grid {
...@@ -322,19 +410,25 @@ ...@@ -322,19 +410,25 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.footer__grid { .footer__grid {
grid-template-columns: 1fr; grid-template-columns: 1fr 1fr;
gap: var(--space-xl); gap: var(--space-xl);
} }
} }
@media (max-width: 480px) {
.footer__grid {
grid-template-columns: 1fr;
}
}
.footer__brand { .footer__brand {
max-width: 30ch; max-width: 28ch;
} }
.footer__brand-name { .footer__brand-name {
font-size: var(--text-xl); font-size: var(--text-lg);
font-weight: 900; font-weight: 900;
margin-bottom: var(--space-md); margin-bottom: var(--space-sm);
color: var(--ink-primary); color: var(--ink-primary);
} }
...@@ -355,12 +449,13 @@ ...@@ -355,12 +449,13 @@
display: block; display: block;
font-size: var(--text-sm); font-size: var(--text-sm);
color: var(--ink-muted); color: var(--ink-muted);
padding-block: var(--space-xs); padding-block: var(--space-2xs);
transition: color var(--duration-fast) var(--ease-out-quart); transition: all var(--duration-fast) var(--ease-out-quart);
} }
.footer__link:hover { .footer__link:hover {
color: var(--brand-primary-light); color: var(--brand-primary-light);
transform: translateX(-2px);
} }
.footer__bottom { .footer__bottom {
...@@ -377,14 +472,14 @@ ...@@ -377,14 +472,14 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.footer__bottom { .footer__bottom {
flex-direction: column; flex-direction: column;
gap: var(--space-md); gap: var(--space-sm);
text-align: center; text-align: center;
} }
} }
/* Module page hero */ /* Module page hero */
.module-hero { .module-hero {
min-height: 60vh; min-height: 50vh;
display: flex; display: flex;
align-items: center; align-items: center;
padding-top: 6rem; padding-top: 6rem;
...@@ -396,7 +491,9 @@ ...@@ -396,7 +491,9 @@
content: ''; content: '';
position: absolute; position: absolute;
inset: 0; inset: 0;
background: radial-gradient(ellipse at 30% 20%, oklch(0.570 0.158 353.3 / 0.08) 0%, transparent 60%); background:
radial-gradient(ellipse at 70% 30%, oklch(0.550 0.180 353.3 / 0.06) 0%, transparent 50%),
radial-gradient(ellipse at 20% 80%, oklch(0.400 0.130 280 / 0.04) 0%, transparent 50%);
pointer-events: none; pointer-events: none;
} }
...@@ -411,7 +508,7 @@ ...@@ -411,7 +508,7 @@
} }
.module-hero__desc { .module-hero__desc {
font-size: var(--text-xl); font-size: var(--text-lg);
margin-bottom: var(--space-xl); margin-bottom: var(--space-xl);
} }
...@@ -422,20 +519,32 @@ ...@@ -422,20 +519,32 @@
} }
.gallery--2col { .gallery--2col {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 500px), 1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 480px), 1fr));
} }
.gallery--3col { .gallery--3col {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 350px), 1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
} }
/* Testimonial / Quote blocks */ /* Quote blocks */
.quote-block { .quote-block {
padding: var(--space-xl); padding: var(--space-xl);
background: var(--bg-surface); background: var(--bg-surface);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
border-right: 3px solid var(--brand-primary); border-right: 2px solid var(--brand-primary);
position: relative; position: relative;
overflow: hidden;
}
.quote-block::before {
content: '';
position: absolute;
top: 0;
right: 0;
width: 80px;
height: 100%;
background: linear-gradient(to left, oklch(0.550 0.180 353.3 / 0.03), transparent);
pointer-events: none;
} }
.quote-block__text { .quote-block__text {
...@@ -470,18 +579,5 @@ ...@@ -470,18 +579,5 @@
} }
.breadcrumb__separator { .breadcrumb__separator {
opacity: 0.4; opacity: 0.3;
}
/* Page transitions */
.page-enter {
opacity: 0;
transform: translateY(20px);
}
.page-enter--active {
opacity: 1;
transform: translateY(0);
transition: opacity var(--duration-slow) var(--ease-out-expo),
transform var(--duration-slow) var(--ease-out-expo);
} }
...@@ -11,27 +11,44 @@ ...@@ -11,27 +11,44 @@
.hero::before { .hero::before {
content: ''; content: '';
position: absolute; position: absolute;
top: -20%; top: -30%;
right: -20%;
width: 80%;
height: 80%;
background: radial-gradient(ellipse, oklch(0.550 0.180 353.3 / 0.08) 0%, transparent 60%);
pointer-events: none;
animation: hero-glow 10s ease-in-out infinite alternate;
}
.hero::after {
content: '';
position: absolute;
bottom: -20%;
left: -10%; left: -10%;
width: 70%; width: 50%;
height: 70%; height: 50%;
background: radial-gradient(ellipse, oklch(0.570 0.158 353.3 / 0.12) 0%, transparent 65%); background: radial-gradient(ellipse, oklch(0.400 0.100 280 / 0.05) 0%, transparent 60%);
pointer-events: none; pointer-events: none;
animation: hero-glow 8s ease-in-out infinite alternate; animation: hero-glow-alt 12s ease-in-out infinite alternate;
} }
@keyframes hero-glow { @keyframes hero-glow {
from { opacity: 0.6; transform: translate(0, 0) scale(1); } from { opacity: 0.5; transform: translate(0, 0) scale(1); }
to { opacity: 1; transform: translate(3%, 3%) scale(1.05); } to { opacity: 1; transform: translate(2%, 2%) scale(1.08); }
}
@keyframes hero-glow-alt {
from { opacity: 0.3; transform: translate(0, 0) scale(1); }
to { opacity: 0.6; transform: translate(-2%, -1%) scale(1.05); }
} }
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
.hero::before { animation: none; } .hero::before, .hero::after { animation: none; }
} }
.hero__grid { .hero__grid {
display: grid; display: grid;
grid-template-columns: 1fr 1.1fr; grid-template-columns: 1fr 1.2fr;
gap: var(--space-2xl); gap: var(--space-2xl);
align-items: center; align-items: center;
} }
...@@ -50,17 +67,20 @@ ...@@ -50,17 +67,20 @@
.hero__title { .hero__title {
margin-bottom: var(--space-lg); margin-bottom: var(--space-lg);
letter-spacing: -0.02em;
} }
.hero__title-accent { .hero__title-accent {
color: var(--brand-primary-light); background: linear-gradient(135deg, var(--brand-primary-light), var(--brand-primary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
} }
.hero__desc { .hero__desc {
font-size: var(--text-xl); font-size: var(--text-lg);
margin-bottom: var(--space-xl); margin-bottom: var(--space-xl);
max-width: 50ch; max-width: 45ch;
line-height: 1.9;
} }
@media (max-width: 1024px) { @media (max-width: 1024px) {
...@@ -84,13 +104,33 @@ ...@@ -84,13 +104,33 @@
.hero__visual { .hero__visual {
position: relative; position: relative;
perspective: 1200px;
} }
.hero__screenshot { .hero__screenshot {
border-radius: var(--radius-xl); border-radius: var(--radius-2xl);
overflow: hidden; overflow: hidden;
box-shadow: var(--shadow-lg), var(--shadow-glow); box-shadow:
border: 1px solid var(--border-subtle); 0 25px 80px oklch(0 0 0 / 0.5),
0 0 0 1px oklch(1 0 0 / 0.05),
0 0 60px oklch(0.550 0.180 353.3 / 0.08);
border: 1px solid oklch(1 0 0 / 0.06);
transform: rotateY(-2deg) rotateX(1deg);
transition: transform var(--duration-slower) var(--ease-out-expo);
position: relative;
}
.hero__screenshot::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(160deg, oklch(1 0 0 / 0.03) 0%, transparent 40%);
pointer-events: none;
border-radius: inherit;
}
.hero__screenshot:hover {
transform: rotateY(0deg) rotateX(0deg) scale(1.02);
} }
.hero__screenshot img { .hero__screenshot img {
...@@ -98,33 +138,84 @@ ...@@ -98,33 +138,84 @@
height: auto; height: auto;
} }
/* Floating decorative elements */
.hero__visual::before {
content: '';
position: absolute;
top: -10%;
left: -5%;
width: 120%;
height: 120%;
background:
radial-gradient(circle at 10% 20%, oklch(0.550 0.180 353.3 / 0.06) 0%, transparent 30%),
radial-gradient(circle at 90% 80%, oklch(0.400 0.100 280 / 0.04) 0%, transparent 25%);
pointer-events: none;
z-index: -1;
}
/* Pain points section */ /* Pain points section */
.pain-points { .pain-points {
background: var(--bg-base); background: var(--bg-base);
position: relative;
}
.pain-points::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--border-subtle), transparent);
} }
.pain-points__grid { .pain-points__grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
gap: var(--space-lg); gap: var(--space-md);
} }
.pain-point { .pain-point {
padding: var(--space-xl); padding: var(--space-xl);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
transition: all var(--duration-slow) var(--ease-out-expo);
position: relative;
overflow: hidden;
}
.pain-point::after {
content: '';
position: absolute;
bottom: 0;
right: 0;
left: 0;
height: 2px;
background: linear-gradient(90deg, var(--brand-primary), var(--brand-primary-light));
transform: scaleX(0);
transform-origin: right;
transition: transform var(--duration-slow) var(--ease-out-expo);
}
.pain-point:hover {
border-color: var(--border-glow);
transform: translateY(-2px);
}
.pain-point:hover::after {
transform: scaleX(1);
} }
.pain-point__problem { .pain-point__problem {
font-size: var(--text-base); font-size: var(--text-sm);
color: var(--ink-muted); color: var(--ink-muted);
margin-bottom: var(--space-md); margin-bottom: var(--space-md);
line-height: 1.7; line-height: 1.8;
} }
.pain-point__solution { .pain-point__solution {
font-size: var(--text-lg); font-size: var(--text-base);
color: var(--brand-primary-light); color: var(--brand-primary-light);
font-weight: 700; font-weight: 700;
} }
...@@ -132,8 +223,8 @@ ...@@ -132,8 +223,8 @@
/* Modules showcase */ /* Modules showcase */
.modules-showcase__grid { .modules-showcase__grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 350px), 1fr));
gap: var(--space-lg); gap: var(--space-md);
} }
.module-card { .module-card {
...@@ -141,36 +232,58 @@ ...@@ -141,36 +232,58 @@
padding: var(--space-xl); padding: var(--space-xl);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
transition: border-color var(--duration-normal) var(--ease-out-quart), transition: all var(--duration-slow) var(--ease-out-expo);
transform var(--duration-normal) var(--ease-out-quart), position: relative;
box-shadow var(--duration-normal) var(--ease-out-quart); overflow: hidden;
}
.module-card::before {
content: '';
position: absolute;
top: -50%;
right: -50%;
width: 100%;
height: 100%;
background: radial-gradient(circle, var(--brand-primary-ghost), transparent 70%);
opacity: 0;
transition: opacity var(--duration-slow) var(--ease-out-expo);
} }
.module-card:hover { .module-card:hover {
border-color: var(--brand-primary-muted); border-color: var(--border-glow);
transform: translateY(-3px); transform: translateY(-4px);
box-shadow: 0 12px 40px oklch(0 0 0 / 0.3); box-shadow: 0 16px 48px oklch(0 0 0 / 0.3), 0 0 0 1px var(--border-glow);
color: inherit; color: inherit;
} }
.module-card:hover::before {
opacity: 1;
}
.module-card__icon { .module-card__icon {
width: 3.5rem; width: 3rem;
height: 3.5rem; height: 3rem;
display: grid; display: grid;
place-items: center; place-items: center;
background: oklch(0.570 0.158 353.3 / 0.1); background: oklch(0.550 0.180 353.3 / 0.08);
border: 1px solid oklch(0.570 0.158 353.3 / 0.2); border: 1px solid oklch(0.550 0.180 353.3 / 0.15);
border-radius: var(--radius-md); border-radius: var(--radius-lg);
margin-bottom: var(--space-lg); margin-bottom: var(--space-lg);
font-size: 1.5rem; color: var(--brand-primary-light);
transition: all var(--duration-normal) var(--ease-out-quart);
}
.module-card:hover .module-card__icon {
background: oklch(0.550 0.180 353.3 / 0.15);
box-shadow: 0 0 20px oklch(0.550 0.180 353.3 / 0.15);
} }
.module-card__title { .module-card__title {
font-size: var(--text-xl); font-size: var(--text-lg);
font-weight: 700; font-weight: 700;
color: var(--ink-primary); color: var(--ink-primary);
margin-bottom: var(--space-sm); margin-bottom: var(--space-xs);
} }
.module-card__desc { .module-card__desc {
...@@ -182,24 +295,52 @@ ...@@ -182,24 +295,52 @@
.module-card__link { .module-card__link {
font-size: var(--text-sm); font-size: var(--text-sm);
font-weight: 700; font-weight: 600;
color: var(--brand-primary-light); color: var(--brand-primary-light);
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
gap: var(--space-xs); gap: var(--space-xs);
transition: gap var(--duration-normal) var(--ease-out-quart);
}
.module-card:hover .module-card__link {
gap: var(--space-sm);
} }
/* Product screenshots carousel section */ /* Product screenshots carousel section */
.product-showcase { .product-showcase {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
padding-bottom: var(--space-section);
}
.product-showcase::before,
.product-showcase::after {
content: '';
position: absolute;
top: 0;
bottom: 0;
width: 120px;
z-index: var(--z-above);
pointer-events: none;
}
.product-showcase::before {
right: 0;
background: linear-gradient(to left, var(--bg-deep), transparent);
}
.product-showcase::after {
left: 0;
background: linear-gradient(to right, var(--bg-deep), transparent);
} }
.product-showcase__track { .product-showcase__track {
display: flex; display: flex;
gap: var(--space-lg); gap: var(--space-md);
animation: scroll-right 40s linear infinite; animation: scroll-right 50s linear infinite;
width: max-content; width: max-content;
padding-block: var(--space-md);
} }
@keyframes scroll-right { @keyframes scroll-right {
...@@ -209,18 +350,27 @@ ...@@ -209,18 +350,27 @@
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
.product-showcase__track { animation: none; flex-wrap: wrap; width: auto; } .product-showcase__track { animation: none; flex-wrap: wrap; width: auto; }
.product-showcase::before, .product-showcase::after { display: none; }
} }
.product-showcase__item { .product-showcase__item {
flex: 0 0 400px; flex: 0 0 380px;
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
overflow: hidden; overflow: hidden;
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
box-shadow: var(--shadow-md);
transition: all var(--duration-normal) var(--ease-out-quart);
}
.product-showcase__item:hover {
border-color: var(--border-glow);
transform: scale(1.03);
box-shadow: var(--shadow-lg);
} }
.product-showcase__item img { .product-showcase__item img {
width: 100%; width: 100%;
height: 250px; height: 230px;
object-fit: cover; object-fit: cover;
object-position: top right; object-position: top right;
} }
...@@ -228,13 +378,25 @@ ...@@ -228,13 +378,25 @@
/* Numbers / Social proof */ /* Numbers / Social proof */
.social-proof { .social-proof {
background: var(--bg-base); background: var(--bg-base);
position: relative;
}
.social-proof::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse at 30% 50%, oklch(0.550 0.180 353.3 / 0.03) 0%, transparent 50%),
radial-gradient(ellipse at 70% 50%, oklch(0.400 0.100 280 / 0.02) 0%, transparent 50%);
pointer-events: none;
} }
.social-proof__stats { .social-proof__stats {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: var(--space-xl); gap: var(--space-xl);
text-align: center; text-align: center;
position: relative;
} }
/* CTA section */ /* CTA section */
...@@ -248,7 +410,9 @@ ...@@ -248,7 +410,9 @@
content: ''; content: '';
position: absolute; position: absolute;
inset: 0; inset: 0;
background: radial-gradient(ellipse at center, oklch(0.570 0.158 353.3 / 0.06) 0%, transparent 70%); background:
radial-gradient(ellipse at center 30%, oklch(0.550 0.180 353.3 / 0.05) 0%, transparent 60%),
radial-gradient(ellipse at center 70%, oklch(0.400 0.100 280 / 0.03) 0%, transparent 50%);
pointer-events: none; pointer-events: none;
} }
...@@ -262,7 +426,7 @@ ...@@ -262,7 +426,7 @@
} }
.cta-section__desc { .cta-section__desc {
font-size: var(--text-xl); font-size: var(--text-lg);
margin-inline: auto; margin-inline: auto;
margin-bottom: var(--space-xl); margin-bottom: var(--space-xl);
} }
...@@ -274,3 +438,8 @@ ...@@ -274,3 +438,8 @@
gap: var(--space-md); gap: var(--space-md);
flex-wrap: wrap; flex-wrap: wrap;
} }
/* Divider lines between sections */
.section--divided {
border-top: 1px solid var(--border-subtle);
}
/* Module detail pages */ /* Module detail pages */
.module-detail__features { .module-detail__features {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
gap: var(--space-lg); gap: var(--space-md);
} }
.module-detail__screenshot-section { .module-detail__screenshot-section {
...@@ -42,25 +42,27 @@ ...@@ -42,25 +42,27 @@
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
gap: var(--space-sm); gap: var(--space-sm);
font-size: var(--text-base); font-size: var(--text-sm);
color: var(--ink-secondary); color: var(--ink-secondary);
line-height: 1.7;
} }
.module-detail__list-item::before { .module-detail__list-item::before {
content: ''; content: '';
flex-shrink: 0; flex-shrink: 0;
width: 6px; width: 5px;
height: 6px; height: 5px;
margin-top: 0.65em; margin-top: 0.6em;
background: var(--brand-primary); background: var(--brand-primary);
border-radius: 50%; border-radius: 50%;
box-shadow: 0 0 6px oklch(0.550 0.180 353.3 / 0.4);
} }
/* Features overview page */ /* Features overview page */
.features-grid { .features-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
gap: var(--space-lg); gap: var(--space-md);
} }
.feature-item { .feature-item {
...@@ -70,27 +72,41 @@ ...@@ -70,27 +72,41 @@
padding: var(--space-xl); padding: var(--space-xl);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
align-items: start; align-items: start;
transition: all var(--duration-slow) var(--ease-out-expo);
position: relative;
overflow: hidden;
}
.feature-item:hover {
border-color: var(--border-glow);
transform: translateY(-2px);
box-shadow: 0 8px 32px oklch(0 0 0 / 0.2);
} }
.feature-item__number { .feature-item__number {
font-size: var(--text-3xl); font-size: var(--text-2xl);
font-weight: 900; font-weight: 900;
color: var(--brand-primary-dim); background: linear-gradient(135deg, var(--brand-primary-dim), var(--brand-primary-muted));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
line-height: 1; line-height: 1;
opacity: 0.6; opacity: 0.7;
} }
.feature-item__content h4 { .feature-item__content h4 {
font-size: var(--text-lg); font-size: var(--text-base);
margin-bottom: var(--space-xs); font-weight: 700;
margin-bottom: var(--space-2xs);
color: var(--ink-primary); color: var(--ink-primary);
} }
.feature-item__content p { .feature-item__content p {
font-size: var(--text-sm); font-size: var(--text-sm);
color: var(--ink-secondary); color: var(--ink-secondary);
line-height: 1.8;
} }
/* Contact / Pricing page */ /* Contact / Pricing page */
...@@ -116,7 +132,7 @@ ...@@ -116,7 +132,7 @@
.form-group { .form-group {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--space-xs); gap: var(--space-2xs);
} }
.form-group label { .form-group label {
...@@ -128,14 +144,15 @@ ...@@ -128,14 +144,15 @@
.form-group input, .form-group input,
.form-group textarea, .form-group textarea,
.form-group select { .form-group select {
padding: var(--space-md); padding: var(--space-sm) var(--space-md);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-default); border: 1px solid var(--border-subtle);
border-radius: var(--radius-md); border-radius: var(--radius-lg);
color: var(--ink-primary); color: var(--ink-primary);
font-family: inherit; font-family: inherit;
font-size: var(--text-base); font-size: var(--text-sm);
transition: border-color var(--duration-fast) var(--ease-out-quart); transition: all var(--duration-fast) var(--ease-out-quart);
min-height: 44px;
} }
.form-group input:focus, .form-group input:focus,
...@@ -143,19 +160,33 @@ ...@@ -143,19 +160,33 @@
.form-group select:focus { .form-group select:focus {
outline: none; outline: none;
border-color: var(--brand-primary); border-color: var(--brand-primary);
box-shadow: 0 0 0 3px oklch(0.570 0.158 353.3 / 0.15); box-shadow: 0 0 0 3px oklch(0.550 0.180 353.3 / 0.1), 0 0 20px oklch(0.550 0.180 353.3 / 0.05);
background: var(--bg-elevated);
}
.form-group input::placeholder,
.form-group textarea::placeholder {
color: var(--ink-muted);
} }
.form-group textarea { .form-group textarea {
min-height: 150px; min-height: 120px;
resize: vertical; resize: vertical;
} }
.form-group select {
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23888' viewBox='0 0 16 16'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: left 12px center;
padding-left: 36px;
}
.contact-info { .contact-info {
padding: var(--space-xl); padding: var(--space-xl);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
} }
.contact-info__item { .contact-info__item {
...@@ -170,24 +201,25 @@ ...@@ -170,24 +201,25 @@
} }
.contact-info__icon { .contact-info__icon {
width: 2.5rem; width: 2.25rem;
height: 2.5rem; height: 2.25rem;
display: grid; display: grid;
place-items: center; place-items: center;
background: oklch(0.570 0.158 353.3 / 0.1); background: oklch(0.550 0.180 353.3 / 0.08);
border: 1px solid oklch(0.550 0.180 353.3 / 0.15);
border-radius: var(--radius-md); border-radius: var(--radius-md);
color: var(--brand-primary-light); color: var(--brand-primary-light);
flex-shrink: 0; flex-shrink: 0;
} }
.contact-info__label { .contact-info__label {
font-size: var(--text-sm); font-size: var(--text-xs);
color: var(--ink-muted); color: var(--ink-muted);
margin-bottom: 2px; margin-bottom: 2px;
} }
.contact-info__value { .contact-info__value {
font-size: var(--text-base); font-size: var(--text-sm);
color: var(--ink-primary); color: var(--ink-primary);
font-weight: 500; font-weight: 500;
} }
...@@ -196,7 +228,7 @@ ...@@ -196,7 +228,7 @@
.workflow { .workflow {
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--space-md); gap: var(--space-sm);
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
padding: var(--space-xl) 0; padding: var(--space-xl) 0;
...@@ -205,19 +237,27 @@ ...@@ -205,19 +237,27 @@
.workflow__step { .workflow__step {
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--space-sm); gap: var(--space-xs);
padding: var(--space-md) var(--space-lg); padding: var(--space-sm) var(--space-md);
background: var(--bg-surface); background: var(--bg-surface);
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
border-radius: var(--radius-md); border-radius: var(--radius-lg);
font-size: var(--text-sm); font-size: var(--text-sm);
font-weight: 500; font-weight: 500;
color: var(--ink-primary); color: var(--ink-primary);
transition: all var(--duration-normal) var(--ease-out-quart);
white-space: nowrap;
}
.workflow__step:hover {
border-color: var(--border-glow);
box-shadow: 0 0 16px oklch(0.550 0.180 353.3 / 0.1);
} }
.workflow__arrow { .workflow__arrow {
color: var(--brand-primary-dim); color: var(--brand-primary-dim);
font-size: var(--text-xl); font-size: var(--text-lg);
opacity: 0.6;
} }
/* Comparison table */ /* Comparison table */
...@@ -225,15 +265,15 @@ ...@@ -225,15 +265,15 @@
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: collapse;
background: var(--bg-surface); background: var(--bg-surface);
border-radius: var(--radius-lg); border-radius: var(--radius-xl);
overflow: hidden; overflow: hidden;
border: 1px solid var(--border-subtle); border: 1px solid var(--border-subtle);
} }
.comparison-table th { .comparison-table th {
padding: var(--space-md) var(--space-lg); padding: var(--space-sm) var(--space-md);
background: var(--bg-elevated); background: var(--bg-elevated);
font-weight: 700; font-weight: 600;
font-size: var(--text-sm); font-size: var(--text-sm);
color: var(--ink-primary); color: var(--ink-primary);
text-align: right; text-align: right;
...@@ -241,10 +281,15 @@ ...@@ -241,10 +281,15 @@
} }
.comparison-table td { .comparison-table td {
padding: var(--space-md) var(--space-lg); padding: var(--space-sm) var(--space-md);
font-size: var(--text-sm); font-size: var(--text-sm);
color: var(--ink-secondary); color: var(--ink-secondary);
border-bottom: 1px solid var(--border-subtle); border-bottom: 1px solid oklch(1 0 0 / 0.02);
transition: background var(--duration-fast) var(--ease-out-quart);
}
.comparison-table tr:hover td {
background: oklch(1 0 0 / 0.02);
} }
.comparison-table tr:last-child td { .comparison-table tr:last-child td {
...@@ -258,5 +303,16 @@ ...@@ -258,5 +303,16 @@
.comparison-table .cross { .comparison-table .cross {
color: var(--ink-muted); color: var(--ink-muted);
opacity: 0.5; opacity: 0.4;
}
/* Gradient section dividers */
.section--gradient-top::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent 10%, var(--brand-primary-dim), transparent 90%);
} }
:root { :root {
/* Brand seed: oklch(0.570 0.158 353.3) — deep rose/crimson */ /* Brand seed: oklch(0.570 0.158 353.3) — deep rose/crimson */
--brand-primary: oklch(0.570 0.158 353.3); --brand-primary: oklch(0.550 0.180 353.3);
--brand-primary-light: oklch(0.650 0.140 353.3); --brand-primary-light: oklch(0.680 0.160 353.3);
--brand-primary-dim: oklch(0.450 0.120 353.3); --brand-primary-dim: oklch(0.400 0.130 353.3);
--brand-primary-muted: oklch(0.380 0.080 353.3); --brand-primary-muted: oklch(0.320 0.090 353.3);
--brand-primary-ghost: oklch(0.570 0.158 353.3 / 0.06);
/* Backgrounds — true dark, not warm-tinted */ /* Backgrounds — deeper, colder dark */
--bg-deep: oklch(0.120 0.008 353.3); --bg-deep: oklch(0.095 0.006 280);
--bg-base: oklch(0.150 0.010 353.3); --bg-base: oklch(0.115 0.008 280);
--bg-surface: oklch(0.185 0.012 353.3); --bg-surface: oklch(0.145 0.010 280);
--bg-elevated: oklch(0.220 0.014 353.3); --bg-elevated: oklch(0.180 0.012 280);
/* Text */ /* Text */
--ink-primary: oklch(0.950 0.005 353.3); --ink-primary: oklch(0.960 0.003 280);
--ink-secondary: oklch(0.750 0.010 353.3); --ink-secondary: oklch(0.720 0.008 280);
--ink-muted: oklch(0.550 0.008 353.3); --ink-muted: oklch(0.500 0.006 280);
/* Borders */ /* Borders */
--border-subtle: oklch(0.250 0.012 353.3); --border-subtle: oklch(0.200 0.010 280);
--border-default: oklch(0.320 0.015 353.3); --border-default: oklch(0.280 0.012 280);
--border-glow: oklch(0.550 0.180 353.3 / 0.25);
/* Accent — gold for secondary highlights */ /* Accent — warm gold for secondary */
--accent-gold: oklch(0.700 0.120 85); --accent-gold: oklch(0.750 0.130 85);
--accent-gold-dim: oklch(0.550 0.090 85); --accent-gold-dim: oklch(0.550 0.090 85);
/* Functional */ /* Functional */
...@@ -32,45 +34,54 @@ ...@@ -32,45 +34,54 @@
/* Typography scale — 1.333 ratio (perfect fourth) */ /* Typography scale — 1.333 ratio (perfect fourth) */
--text-xs: clamp(0.694rem, 0.65vi + 0.5rem, 0.75rem); --text-xs: clamp(0.694rem, 0.65vi + 0.5rem, 0.75rem);
--text-sm: clamp(0.833rem, 0.8vi + 0.6rem, 0.875rem); --text-sm: clamp(0.833rem, 0.8vi + 0.6rem, 0.875rem);
--text-base: clamp(1rem, 1vi + 0.7rem, 1.063rem); --text-base: clamp(0.938rem, 0.9vi + 0.65rem, 1rem);
--text-lg: clamp(1.125rem, 1.2vi + 0.8rem, 1.25rem); --text-lg: clamp(1.063rem, 1.1vi + 0.75rem, 1.188rem);
--text-xl: clamp(1.333rem, 1.5vi + 0.9rem, 1.5rem); --text-xl: clamp(1.25rem, 1.4vi + 0.85rem, 1.375rem);
--text-2xl: clamp(1.777rem, 2.2vi + 1rem, 2.25rem); --text-2xl: clamp(1.6rem, 2vi + 0.95rem, 2rem);
--text-3xl: clamp(2.369rem, 3vi + 1.2rem, 3rem); --text-3xl: clamp(2.1rem, 2.8vi + 1.1rem, 2.75rem);
--text-4xl: clamp(3.157rem, 4vi + 1.5rem, 4rem); --text-4xl: clamp(2.8rem, 3.5vi + 1.3rem, 3.5rem);
--text-5xl: clamp(4.209rem, 5.5vi + 1.8rem, 5.5rem); --text-5xl: clamp(3.4rem, 4.5vi + 1.5rem, 4.5rem);
/* Spacing */ /* Spacing */
--space-2xs: clamp(0.125rem, 0.25vi, 0.25rem);
--space-xs: clamp(0.25rem, 0.5vi, 0.5rem); --space-xs: clamp(0.25rem, 0.5vi, 0.5rem);
--space-sm: clamp(0.5rem, 1vi, 0.75rem); --space-sm: clamp(0.5rem, 1vi, 0.75rem);
--space-md: clamp(1rem, 2vi, 1.5rem); --space-md: clamp(0.875rem, 1.5vi, 1.25rem);
--space-lg: clamp(1.5rem, 3vi, 2.5rem); --space-lg: clamp(1.25rem, 2.5vi, 2rem);
--space-xl: clamp(2.5rem, 5vi, 4rem); --space-xl: clamp(2rem, 4vi, 3rem);
--space-2xl: clamp(4rem, 8vi, 6rem); --space-2xl: clamp(3rem, 6vi, 5rem);
--space-3xl: clamp(6rem, 12vi, 10rem); --space-3xl: clamp(5rem, 10vi, 8rem);
--space-section: clamp(5rem, 10vi, 8rem); --space-section: clamp(5rem, 10vi, 8rem);
/* Radius */ /* Radius */
--radius-xs: 0.125rem;
--radius-sm: 0.25rem; --radius-sm: 0.25rem;
--radius-md: 0.5rem; --radius-md: 0.5rem;
--radius-lg: 1rem; --radius-lg: 0.875rem;
--radius-xl: 1.5rem; --radius-xl: 1.25rem;
--radius-2xl: 1.75rem;
/* Shadows */ /* Shadows */
--shadow-sm: 0 1px 3px oklch(0 0 0 / 0.3); --shadow-sm: 0 1px 3px oklch(0 0 0 / 0.4);
--shadow-md: 0 4px 12px oklch(0 0 0 / 0.4); --shadow-md: 0 4px 16px oklch(0 0 0 / 0.5);
--shadow-lg: 0 8px 32px oklch(0 0 0 / 0.5); --shadow-lg: 0 12px 48px oklch(0 0 0 / 0.6);
--shadow-glow: 0 0 40px oklch(0.570 0.158 353.3 / 0.2); --shadow-glow: 0 0 60px oklch(0.550 0.180 353.3 / 0.15);
--shadow-glow-strong: 0 0 80px oklch(0.550 0.180 353.3 / 0.25);
--shadow-inner: inset 0 1px 0 oklch(1 0 0 / 0.04);
/* Transitions */ /* Transitions */
--ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1); --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1);
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1); --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
--ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
--duration-fast: 150ms; --duration-fast: 150ms;
--duration-normal: 300ms; --duration-normal: 300ms;
--duration-slow: 500ms; --duration-slow: 500ms;
--duration-slower: 800ms;
/* Z-index scale */ /* Z-index scale */
--z-base: 0; --z-base: 0;
--z-above: 10;
--z-dropdown: 100; --z-dropdown: 100;
--z-sticky: 200; --z-sticky: 200;
--z-modal-backdrop: 300; --z-modal-backdrop: 300;
...@@ -79,7 +90,7 @@ ...@@ -79,7 +90,7 @@
--z-tooltip: 600; --z-tooltip: 600;
/* Layout */ /* Layout */
--container-max: 1280px; --container-max: 1200px;
--container-wide: 1440px; --container-wide: 1400px;
--content-max: 75ch; --content-max: 65ch;
} }
...@@ -2,6 +2,9 @@ document.addEventListener('DOMContentLoaded', () => { ...@@ -2,6 +2,9 @@ document.addEventListener('DOMContentLoaded', () => {
initNav(); initNav();
initReveal(); initReveal();
initMobileMenu(); initMobileMenu();
initParallax();
initCountUp();
initSmoothHover();
}); });
function initNav() { function initNav() {
...@@ -12,12 +15,14 @@ function initNav() { ...@@ -12,12 +15,14 @@ function initNav() {
window.addEventListener('scroll', () => { window.addEventListener('scroll', () => {
if (!ticking) { if (!ticking) {
requestAnimationFrame(() => { requestAnimationFrame(() => {
nav.classList.toggle('nav--scrolled', window.scrollY > 50); nav.classList.toggle('nav--scrolled', window.scrollY > 30);
ticking = false; ticking = false;
}); });
ticking = true; ticking = true;
} }
}, { passive: true }); }, { passive: true });
if (window.scrollY > 30) nav.classList.add('nav--scrolled');
} }
function initMobileMenu() { function initMobileMenu() {
...@@ -32,7 +37,7 @@ function initMobileMenu() { ...@@ -32,7 +37,7 @@ function initMobileMenu() {
}); });
links.addEventListener('click', (e) => { links.addEventListener('click', (e) => {
if (e.target.classList.contains('nav__link')) { if (e.target.classList.contains('nav__link') || e.target.classList.contains('nav__cta')) {
links.classList.remove('nav__links--open'); links.classList.remove('nav__links--open');
toggle.setAttribute('aria-expanded', 'false'); toggle.setAttribute('aria-expanded', 'false');
document.body.style.overflow = ''; document.body.style.overflow = '';
...@@ -41,7 +46,12 @@ function initMobileMenu() { ...@@ -41,7 +46,12 @@ function initMobileMenu() {
} }
function initReveal() { function initReveal() {
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelectorAll('[data-reveal]').forEach(el => {
el.style.opacity = '1';
});
return;
}
const observer = new IntersectionObserver( const observer = new IntersectionObserver(
(entries) => { (entries) => {
...@@ -52,21 +62,127 @@ function initReveal() { ...@@ -52,21 +62,127 @@ function initReveal() {
} }
}); });
}, },
{ threshold: 0.1, rootMargin: '0px 0px -50px 0px' } { threshold: 0.08, rootMargin: '0px 0px -60px 0px' }
); );
document.querySelectorAll('[data-reveal]').forEach((el) => { document.querySelectorAll('[data-reveal]').forEach((el, i) => {
const delay = parseInt(el.dataset.reveal) || 0;
el.style.opacity = '0'; el.style.opacity = '0';
el.style.transform = 'translateY(24px)'; el.style.transform = 'translateY(32px)';
el.style.transition = `opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1), transform 0.6s cubic-bezier(0.16, 1, 0.3, 1)`; el.style.transition = `opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1) ${delay}ms, transform 0.7s cubic-bezier(0.16, 1, 0.3, 1) ${delay}ms`;
const delay = el.dataset.reveal || '0';
el.style.transitionDelay = `${delay}ms`;
observer.observe(el); observer.observe(el);
}); });
} }
document.documentElement.addEventListener('animationend', () => {}); function initParallax() {
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
const heroVisual = document.querySelector('.hero__visual');
if (!heroVisual) return;
let ticking = false;
window.addEventListener('scroll', () => {
if (!ticking) {
requestAnimationFrame(() => {
const scrolled = window.scrollY;
const rate = scrolled * 0.15;
if (scrolled < window.innerHeight) {
heroVisual.style.transform = `translateY(${rate}px)`;
}
ticking = false;
});
ticking = true;
}
}, { passive: true });
}
function initCountUp() {
const stats = document.querySelectorAll('.stat__value');
if (!stats.length) return;
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
animateValue(entry.target);
observer.unobserve(entry.target);
}
});
},
{ threshold: 0.5 }
);
stats.forEach(stat => observer.observe(stat));
}
function animateValue(el) {
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
const text = el.textContent.trim();
const hasPlus = text.startsWith('+');
const hasPercent = text.endsWith('%');
const numStr = text.replace(/[^0-9.]/g, '');
const target = parseFloat(numStr);
if (isNaN(target)) return;
const duration = 1500;
const start = performance.now();
function update(now) {
const elapsed = now - start;
const progress = Math.min(elapsed / duration, 1);
const eased = 1 - Math.pow(1 - progress, 4);
const current = Math.round(eased * target);
el.textContent = (hasPlus ? '+' : '') + current + (hasPercent ? '%' : '');
if (progress < 1) {
requestAnimationFrame(update);
}
}
el.textContent = (hasPlus ? '+' : '') + '0' + (hasPercent ? '%' : '');
requestAnimationFrame(update);
}
function initSmoothHover() {
const cards = document.querySelectorAll('.module-card, .feature-card, .pain-point');
cards.forEach(card => {
card.addEventListener('mouseenter', (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
card.style.setProperty('--mouse-x', `${x}px`);
card.style.setProperty('--mouse-y', `${y}px`);
});
card.addEventListener('mousemove', (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
card.style.setProperty('--mouse-x', `${x}px`);
card.style.setProperty('--mouse-y', `${y}px`);
});
});
}
// Inject styles
const style = document.createElement('style'); const style = document.createElement('style');
style.textContent = `.revealed { opacity: 1 !important; transform: translateY(0) !important; }`; style.textContent = `
.revealed {
opacity: 1 !important;
transform: translateY(0) !important;
}
.module-card::before,
.feature-card::before,
.pain-point::before {
background: radial-gradient(
400px circle at var(--mouse-x, 50%) var(--mouse-y, 50%),
oklch(0.550 0.180 353.3 / 0.04),
transparent 60%
) !important;
opacity: 1 !important;
}
`;
document.head.appendChild(style); document.head.appendChild(style);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment