diff --git a/website/.vitepress/theme/Landing.vue b/website/.vitepress/theme/Landing.vue index dc37acb..80c6b72 100644 --- a/website/.vitepress/theme/Landing.vue +++ b/website/.vitepress/theme/Landing.vue @@ -79,34 +79,7 @@ onMounted(() => { }) })() - /* ---------- Parallax on the hero palace ---------- */ - ;(function(){ - if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return - const stage = document.querySelector('.mempalace-landing .palace-stage') - if (!stage) return - const svg = stage.querySelector('svg.palace') - const halo = stage.querySelector('.halo') - let targetX = 0, targetY = 0, x = 0, y = 0, raf - function onMove(e){ - const rect = stage.getBoundingClientRect() - const cx = rect.left + rect.width / 2 - const cy = rect.top + rect.height / 2 - targetX = ((e.clientX - cx) / rect.width) * 14 - targetY = ((e.clientY - cy) / rect.height) * 10 - if (!raf) raf = requestAnimationFrame(tick) - } - function tick(){ - x += (targetX - x) * 0.08 - y += (targetY - y) * 0.08 - if (svg) svg.style.transform = 'translate(' + x + 'px,' + y + 'px)' - if (halo) halo.style.transform = 'translate(' + (x*0.5) + 'px,' + (y*0.5) + 'px)' - if (Math.abs(x - targetX) > 0.05 || Math.abs(y - targetY) > 0.05){ - raf = requestAnimationFrame(tick) - } else { raf = null } - } - window.addEventListener('mousemove', onMove, { passive: true }) - })() /* ---------- Reveal-on-scroll for cards ---------- */ ;(function(){ @@ -482,7 +455,7 @@ onBeforeUnmount(() => { - +
- + @@ -1404,26 +1316,40 @@ body.mempalace-active { overflow-x: hidden; } max-width: 640px; justify-self: end; z-index: 2; + display: flex; + align-items: center; + justify-content: center; } .mempalace-landing .palace-stage .halo { position: absolute; inset: -12% -8% -5% -12%; - background: radial-gradient(50% 45% at 50% 55%, rgba(74,163,255,0.45), transparent 70%); + background: radial-gradient(50% 45% at 50% 55%, rgba(74,163,255,0.35), transparent 70%); filter: blur(30px); - opacity: 0.7; + opacity: 0.6; animation: mpl-haloPulse 7s ease-in-out infinite; z-index: 0; } @keyframes mpl-haloPulse { - 0%, 100% { opacity: 0.55; transform: scale(1); } - 50% { opacity: 0.9; transform: scale(1.06); } + 0%, 100% { opacity: 0.45; transform: scale(1); } + 50% { opacity: 0.75; transform: scale(1.06); } } -.mempalace-landing .palace-stage svg.palace { +.mempalace-landing .palace-stage .palace-video { position: relative; z-index: 2; width: 100%; height: 100%; - overflow: visible; + object-fit: cover; + pointer-events: none; + + --mask-left: linear-gradient(to right, transparent 0%, black 25%); + --mask-right: linear-gradient(to left, transparent 0%, black 25%); + --mask-top: linear-gradient(to bottom, transparent 0%, black 15%); + --mask-bottom: linear-gradient(to top, transparent 0%, black 15%); + + -webkit-mask-image: var(--mask-left), var(--mask-right), var(--mask-top), var(--mask-bottom); + -webkit-mask-composite: source-in; + mask-image: var(--mask-left), var(--mask-right), var(--mask-top), var(--mask-bottom); + mask-composite: intersect; } .mempalace-landing .palace-stage .stars { position: absolute; inset: 0; z-index: 1; pointer-events: none; } .mempalace-landing .palace-stage .stars i { @@ -1440,37 +1366,6 @@ body.mempalace-active { overflow-x: hidden; } 0%, 100% { opacity: 0; transform: scale(0.6); } 50% { opacity: 0.9; transform: scale(1); } } -.mempalace-landing .palace .float { - transform-origin: 50% 55%; - animation: mpl-float 9s ease-in-out infinite, mpl-yaw 60s linear infinite; -} -@keyframes mpl-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } -@keyframes mpl-yaw { - 0% { transform: translateY(0) rotate(-1.5deg); } - 50% { transform: translateY(-10px) rotate(1.5deg); } - 100% { transform: translateY(0) rotate(-1.5deg); } -} -.mempalace-landing .palace .edge { stroke: var(--prism); stroke-width: 1.1; fill: none; } -.mempalace-landing .palace .edge-soft { stroke: var(--prism); stroke-width: 0.7; fill: none; opacity: 0.35; } -.mempalace-landing .palace .facet-fill-front { fill: url(#facetFront); } -.mempalace-landing .palace .facet-fill-right { fill: url(#facetRight); } -.mempalace-landing .palace .facet-fill-left { fill: url(#facetLeft); } -.mempalace-landing .palace .beam { stroke: url(#beam); stroke-width: 1.5; } -.mempalace-landing .palace .core { fill: url(#core); } -.mempalace-landing .palace .draw { - stroke-dasharray: 600; - stroke-dashoffset: 600; - animation: mpl-draw 2.2s ease-out 0.3s forwards; -} -@keyframes mpl-draw { to { stroke-dashoffset: 0; } } -.mempalace-landing .palace .beam-flare { - animation: mpl-beamPulse 5s ease-in-out infinite; - transform-origin: 50% 100%; -} -@keyframes mpl-beamPulse { - 0%, 100% { opacity: 0.45; transform: scaleY(1); } - 50% { opacity: 0.9; transform: scaleY(1.1); } -} /* Forgetting */ .mempalace-landing .forgetting { @@ -2062,8 +1957,8 @@ body.mempalace-active { overflow-x: hidden; } .mempalace-landing .mech:nth-child(2) { border-bottom: var(--rule) solid var(--hair); } } @media (max-width: 900px) { - .mempalace-landing .hero { grid-template-columns: 1fr; gap: 3rem; } - .mempalace-landing .palace-stage { justify-self: center; max-width: 480px; } + .mempalace-landing .hero { grid-template-columns: 1fr; gap: 2rem; } + .mempalace-landing .palace-stage { justify-self: center; max-width: 400px; order: -1; aspect-ratio: 1 / 0.85; } .mempalace-landing .anatomy-head { grid-template-columns: 1fr; } .mempalace-landing .anatomy-diagram { grid-template-columns: 1fr; } .mempalace-landing .forgetting-head { grid-template-columns: 1fr; } diff --git a/website/public/hero_video.mp4 b/website/public/hero_video.mp4 new file mode 100644 index 0000000..24cc82d Binary files /dev/null and b/website/public/hero_video.mp4 differ