start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
start [2026/06/11 21:02] jumpstartadminstart [2026/06/11 21:28] (current) jumpstartadmin
Line 57: Line 57:
 .js-card:hover .js-overlay { opacity: 0.3; } .js-card:hover .js-overlay { opacity: 0.3; }
  
-.js-label { position: absolute; left: 0; width: 100%; z-index: 3; padding: 16px; font-family: 'Forevs', serif; font-size: 1.8em; color: rgba(237,232,245,0.85); letter-spacing: 6px; text-align: center; text-transform: uppercase; text-shadow: 0 1px 0 rgba(0,0,0,0.9), 0 -1px 0 rgba(255,255,255,0.05); top: 50%; transform: translateY(-50%); transition: top 0.35s ease, transform 0.35s ease, letter-spacing 0.4s ease, color 0.4s ease, text-shadow 0.4s ease, opacity 0.4s ease; opacity: 0.7; }+.js-label { position: absolute; left: 0; width: 100%; z-index: 3; padding: 16px; font-family: 'Forevs', serif; font-size: 2.7em; color: rgba(237,232,245,0.85); letter-spacing: 6px; text-align: center; text-transform: uppercase; text-shadow: 0 1px 0 rgba(0,0,0,0.9), 0 -1px 0 rgba(255,255,255,0.05); top: 50%; transform: translateY(-50%); transition: top 0.35s ease, transform 0.35s ease, letter-spacing 0.4s ease, color 0.4s ease, text-shadow 0.4s ease, opacity 0.4s ease; opacity: 0.7; }
  
 .js-card:hover .js-label { top: 88%; transform: translateY(-50%); letter-spacing: 10px; color: #ffffff; opacity: 1; text-shadow: 0 0 1px rgba(255,255,255,0.9), 0 0 2px rgba(255,255,255,0.5), 1px 1px 0 rgba(0,0,0,1), -1px -1px 0 rgba(0,0,0,1), 1px -1px 0 rgba(0,0,0,1), -1px 1px 0 rgba(0,0,0,1), 0 2px 8px rgba(0,0,0,0.9), inset 0 0 0 1px rgba(255,255,255,0.1); filter: contrast(1.2) brightness(1.1); } .js-card:hover .js-label { top: 88%; transform: translateY(-50%); letter-spacing: 10px; color: #ffffff; opacity: 1; text-shadow: 0 0 1px rgba(255,255,255,0.9), 0 0 2px rgba(255,255,255,0.5), 1px 1px 0 rgba(0,0,0,1), -1px -1px 0 rgba(0,0,0,1), 1px -1px 0 rgba(0,0,0,1), -1px 1px 0 rgba(0,0,0,1), 0 2px 8px rgba(0,0,0,0.9), inset 0 0 0 1px rgba(255,255,255,0.1); filter: contrast(1.2) brightness(1.1); }
Line 97: Line 97:
 } }
  
-.js-title-sub { font-family: 'Forevs', serif; font-weight: normal; font-size: 3em; letter-spacing: 10px; text-transform: uppercase; color: rgba(184,173,219,0.9); text-shadow: 0 2px 10px rgba(0,0,0,0.9); animation: revealUp 0.8s cubic-bezier(0.16,1,0.3,1) 0.6s both; }+.js-title-sub { font-family: 'Forevs', serif; font-weight: normal; font-size: 3.2em; letter-spacing: 10px; text-transform: uppercase; color: rgba(184,173,219,0.9); text-shadow: 0 2px 10px rgba(0,0,0,0.9); animation: revealUp 0.8s cubic-bezier(0.16,1,0.3,1) 0.6s both; }
  
-.js-title-main { font-family: 'Forevs', serif; font-weight: bold; font-size: 8em; letter-spacing: 8px; text-transform: uppercase; color: #EDE8F5; line-height: 1; text-shadow: 0 0 60px rgba(107,79,187,0.9), 0 0 20px rgba(107,79,187,0.5), 0 4px 15px rgba(0,0,0,0.9); animation: revealUp 0.9s cubic-bezier(0.16,1,0.3,1) 0.3s both, glowPulse 4s 1.5s ease-in-out infinite; }+.js-title-main { font-family: 'Forevs', serif; font-weight: bold; font-size: 8.2em; letter-spacing: 8px; text-transform: uppercase; color: #EDE8F5; line-height: 1; text-shadow: 0 0 60px rgba(107,79,187,0.9), 0 0 20px rgba(107,79,187,0.5), 0 4px 15px rgba(0,0,0,0.9); animation: revealUp 0.9s cubic-bezier(0.16,1,0.3,1) 0.3s both, glowPulse 4s 1.5s ease-in-out infinite; }
  
 .js-title-divider { display: flex; align-items: center; gap: 10px; margin-top: 4px; animation: fadeIn 0.6s ease 1s both; } .js-title-divider { display: flex; align-items: center; gap: 10px; margin-top: 4px; animation: fadeIn 0.6s ease 1s both; }
Line 121: Line 121:
 .js-card:nth-child(4) { animation: fadeUp 0.6s 0.45s ease both; } .js-card:nth-child(4) { animation: fadeUp 0.6s 0.45s ease both; }
  
-/* Non-hovered cards — analog TV signal, JS controlled */+/* VHS chromatic aberration — JS controlled */
 .js-card { .js-card {
     position: relative;     position: relative;
Line 127: Line 127:
     overflow: hidden;     overflow: hidden;
     text-decoration: none;     text-decoration: none;
-    transition: filter 1s ease !important;+    transition: filter 0.25s ease !important;
 } }
  
 .js-card.js-fading { .js-card.js-fading {
-    filter: saturate(0.2) brightness(0.88) contrast(0.85) !important;+    filter: saturate(0.55) brightness(0.92) !important;
 } }
  
 +/* Scanline overlay on fading cards */
 .js-card.js-fading::after { .js-card.js-fading::after {
-    content: ''; +    content: '' !important
-    position: absolute; +    position: absolute !important
-    inset: 0; +    inset: 0 !important
-    z-index: 10+    z-index: 12 !important
-    pointer-events: none;+    pointer-events: none !important;
     background: repeating-linear-gradient(     background: repeating-linear-gradient(
         0deg,         0deg,
         transparent 0px,         transparent 0px,
         transparent 3px,         transparent 3px,
-        rgba(255,255,255,0.016) 3px, +        rgba(000, 0.08) 3px, 
-        rgba(255,255,255,0.016) 4px +        rgba(000, 0.08) 4px 
-    )+    ) !important;
-    animation: analogRoll 5s linear infinite;+
 } }
  
-@keyframes analogRoll +/* RGB canvas overlay */ 
-    0%   background-position: 0 0; } +.js-rgb-canvas 
-    100% background-position: 0 300px; }+    position: absolute; 
 +    inset: 0
 +    z-index: 11; 
 +    pointer-events: none; 
 +    opacity: 0; 
 +    transition: opacity 0.6s ease; 
 +
 +.js-card.js-fading .js-rgb-canvas { 
 +    opacity: 1; 
 +
 + 
 +/* Block card hover effects when title zone is active */ 
 +.js-wrap.js-title-active .js-card:hover video { 
 +    transform: scale(1) !important; 
 +    filter: brightness(0.6) saturate(0.8) !important; 
 +} 
 +.js-wrap.js-title-active .js-card:hover .js-overlay { 
 +    opacity: 1 !important; 
 +
 +.js-wrap.js-title-active .js-card:hover .js-label { 
 +    top: 50% !important; 
 +    transform: translateY(-50%) !important; 
 +    letter-spacing: 4px !important; 
 +    color: #EDE8F5 !important; 
 +    text-shadow: 0 1px 0 rgba(0,0,0,0.9), 0 -1px 0 rgba(255,255,255,0.05) !important; 
 +    opacity: 0.7 !important; 
 +} 
 +.js-wrap.js-title-active .js-card:hover .js-label::before { 
 +    transform: translateX(-50%) scaleX(0) !important; 
 +
 +.js-wrap.js-title-active .js-card:hover .js-label::after { 
 +    opacity: 0 !important;
 } }
  
Line 301: Line 332:
  
 <script> <script>
-// Analog fade — only triggers when mouse is in the center 75% of a card+// VHS RGB chromatic aberration using canvas
 (function() { (function() {
     const cards = document.querySelectorAll('.js-card');     const cards = document.querySelectorAll('.js-card');
 +    const wrap = document.querySelector('.js-wrap');
 +    const titleEl = document.querySelector('.js-title-main');
     let activeCard = null;     let activeCard = null;
     let fadeTimeout = null;     let fadeTimeout = null;
 +    const canvases = new Map();
 +    const animFrames = new Map();
  
-    function isInCenterZone(card, e) { +    // Create a canvas overlay for each card 
-        const rect = card.getBoundingClientRect(); +    cards.forEach(card => { 
-        const zoneX rect.width * 0.125+        const canvas = document.createElement('canvas'); 
-        const zoneY rect.height * 0.125+        canvas.className = 'js-rgb-canvas'; 
-        const e.clientX rect.left+        card.appendChild(canvas); 
-        const e.clientY rect.top; +        canvases.set(card, canvas); 
-        return zoneX && x < rect.width - zoneX && zoneY && rect.height zoneY;+    }); 
 + 
 +    function drawRGB(card) { 
 +        const canvas = canvases.get(card); 
 +        const video = card.querySelector('video'); 
 +        if (!video || !canvas) return; 
 + 
 +        const card.offsetWidth; 
 +        const h = card.offsetHeight; 
 +        canvas.width = w; 
 +        canvas.height = h
 +        const ctx canvas.getContext('2d'); 
 + 
 +        function frame() { 
 +            if (!card.classList.contains('js-fading')) { 
 +                ctx.clearRect(0, 0, w, h); 
 +                animFrames.delete(card); 
 +                return; 
 +            } 
 +            ctx.clearRect(0, 0, w, h); 
 + 
 +            ctx.save(); 
 +            ctx.globalCompositeOperation = 'screen'; 
 +            ctx.globalAlpha = 0.18; 
 +            ctx.filter = 'saturate(4) hue-rotate(-20deg)'; 
 +            ctx.drawImage(video, 4, 0, w, h); 
 +            ctx.restore(); 
 + 
 +            ctx.save(); 
 +            ctx.globalCompositeOperation = 'screen'; 
 +            ctx.globalAlpha = 0.14; 
 +            ctx.filter = 'saturate(4) hue-rotate(160deg)'; 
 +            ctx.drawImage(video, -4, 0, w, h); 
 +            ctx.restore(); 
 + 
 +            animFrames.set(card, requestAnimationFrame(frame)); 
 +        } 
 + 
 +        if (!animFrames.has(card)) { 
 +            animFrames.set(card, requestAnimationFrame(frame)); 
 +        } 
 +    } 
 + 
 +    function isTitleZone(e) { 
 +        const sub document.querySelector('.js-title-sub'); 
 +        const main = document.querySelector('.js-title-main')
 +        const divider document.querySelector('.js-title-divider'); 
 +        if (!sub || !main) return false; 
 +        const top = sub.getBoundingClientRect().top - 20; 
 +        const bottom = (divider || main).getBoundingClientRect().bottom + 20; 
 +        const left = main.getBoundingClientRect().left - 40; 
 +        const right = main.getBoundingClientRect().right + 40
 +        return e.clientX >= left && e.clientX <= right && 
 +               e.clientY >= top && e.clientY <= bottom; 
 +    } 
 + 
 +    function setTitleGlow(on) { 
 +        if (!titleEl) return; 
 +        if (on) { 
 +            titleEl.style.transition = 'text-shadow 0.3s ease'; 
 +            titleEl.style.textShadow = '0 0 120px rgba(184,173,219,1), 0 0 60px rgba(107,79,187,1), 0 0 25px rgba(255,255,255,0.8), 0 4px 15px rgba(0,0,0,0.9)'; 
 +            titleEl.style.color = '#ffffff'; 
 +        } else { 
 +            titleEl.style.transition = 'text-shadow 0.3s ease, color 0.3s ease'; 
 +            titleEl.style.textShadow = ''; 
 +            titleEl.style.color = ''; 
 +        }
     }     }
  
Line 319: Line 420:
         if (activeCard === hoveredCard) return;         if (activeCard === hoveredCard) return;
         activeCard = hoveredCard;         activeCard = hoveredCard;
 +        setTitleGlow(false);
 +        wrap.classList.remove('js-title-active');
         cards.forEach(card => {         cards.forEach(card => {
             if (card !== hoveredCard) {             if (card !== hoveredCard) {
                 card.classList.add('js-fading');                 card.classList.add('js-fading');
 +                drawRGB(card);
             } else {             } else {
                 card.classList.remove('js-fading');                 card.classList.remove('js-fading');
Line 330: Line 434:
     function clearFading() {     function clearFading() {
         activeCard = null;         activeCard = null;
 +        setTitleGlow(false);
 +        wrap.classList.remove('js-title-active');
         cards.forEach(card => card.classList.remove('js-fading'));         cards.forEach(card => card.classList.remove('js-fading'));
     }     }
  
-    cards.forEach(card => +    function enterTitleZone() { 
-        card.addEventListener('mousemove', function(e) { +        activeCard = 'title'; 
-            if (isInCenterZone(card, e)) { +        setTitleGlow(true); 
-                clearTimeout(fadeTimeout); +        wrap.classList.add('js-title-active'); 
-                setFading(card); +        cards.forEach(card => card.classList.remove('js-fading')); 
-            } else +    } 
-                fadeTimeout setTimeout(clearFading, 300);+ 
 +    wrap.addEventListener('mousemove', function(e) { 
 +        if (isTitleZone(e)) { 
 +            clearTimeout(fadeTimeout); 
 +            if (activeCard !== 'title') enterTitleZone(); 
 +            return; 
 +        } 
 + 
 +        // Find which card the mouse is over 
 +        let overCard = null; 
 +        cards.forEach(card => 
 +            const rect card.getBoundingClientRect()
 +            if (e.clientX >= rect.left && e.clientX <= rect.right && 
 +                e.clientY >= rect.top && e.clientY <= rect.bottom) { 
 +                overCard = card;
             }             }
         });         });
  
-        card.addEventListener('mouseleave', function() { +        if (overCard) { 
-            fadeTimeout = setTimeout(clearFading, 300); +            clearTimeout(fadeTimeout); 
-        });+            setFading(overCard); 
 +        } 
 +    }); 
 + 
 +    wrap.addEventListener('mouseleave', function() { 
 +        clearTimeout(fadeTimeout); 
 +        fadeTimeout = setTimeout(clearFading, 150);
     });     });
 })(); })();
 </script> </script>
 </html> </html>
  • start.1781211723.txt.gz
  • Last modified: 2026/06/11 21:02
  • by jumpstartadmin