/* ============================================================ STYLES — Mitko Stojanov (Boxy / Editorial + Animations) ============================================================ */ /* ── Page Load ───────────────────────────────────────────── */ body.is-loading { opacity: 0; } body { transition: opacity 0.5s ease; } /* ── Grid Background ─────────────────────────────────────── */ .grid-bg { background-image: linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px); background-size: 60px 60px; } /* ── Navbar ───────────────────────────────────────────────── */ #navbar { background: transparent; } #navbar.scrolled { background: rgba(12, 10, 9, 0.97); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); border-bottom: 1px solid rgba(255, 255, 255, 0.04); } /* ── Icon boxes ──────────────────────────────────────────── */ .icon-box { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border: 1px solid rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.02); overflow: visible; opacity: 0; transform: scale(0.85); transition: opacity 0.5s ease 0.4s, transform 0.5s ease 0.4s; } .icon-box svg { overflow: visible; } .card.in-view .icon-box, .reveal-left.active .icon-box, .reveal-right.active .icon-box { opacity: 1; transform: scale(1); } /* ── Tags ────────────────────────────────────────────────── */ .tag { display: inline-block; padding: 6px 12px; font-size: 13px; color: #a8a29e; border: 1px solid rgba(255, 255, 255, 0.06); background: rgba(255, 255, 255, 0.02); font-family: 'Inter', system-ui, sans-serif; } .tag-accent { color: #f59e0b; border-color: rgba(245, 158, 11, 0.15); background: rgba(245, 158, 11, 0.05); } /* ── Tag cascade animation ───────────────────────────────── */ .tag-cascade .tag { opacity: 0; transform: translateY(8px); transition: opacity 0.35s ease, transform 0.35s ease; } .tag-cascade.cascading .tag { opacity: 1; transform: translateY(0); } /* ── Card (boxy, solid) ──────────────────────────────────── */ .card { position: relative; transition: background-color 0.3s ease; } /* Top accent line — draws in on view */ .card::before { content: ''; position: absolute; top: 0; left: 0; width: 0; height: 2px; background: #f59e0b; transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); } .card.in-view::before { width: 100%; } /* ── Card title underline on hover ───────────────────────── */ .card-title { position: relative; display: inline-block; } .card-title::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 0; height: 2px; background: #f59e0b; transition: width 0.3s ease; } .card:hover .card-title::after { width: 100%; } /* ── Stat cells ──────────────────────────────────────────── */ .stat-cell { position: relative; transition: background-color 0.3s ease; } .stat-cell:hover { background: rgba(255, 255, 255, 0.02); } /* Top sweep highlight on view */ .stat-cell::after { content: ''; position: absolute; top: 0; left: 0; width: 0; height: 1px; background: linear-gradient(90deg, #f59e0b, transparent); transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1); } .stat-cell.in-view::after { width: 100%; } /* ── Scroll Indicator — Line Draw ────────────────────────── */ .line-draw { height: 0; opacity: 0; transition: none; } .line-draw.drawn { animation: lineDraw 1.2s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes lineDraw { 0% { height: 0; opacity: 0; } 20% { height: 0; opacity: 1; } 100% { height: 40px; opacity: 1; } } /* Pulse after drawn */ .line-draw.drawn { animation: lineDraw 1.2s cubic-bezier(0.4, 0, 0.2, 1) forwards, linePulse 2.5s ease-in-out 1.2s infinite; } @keyframes linePulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } /* ── Reveal Animations ───────────────────────────────────── */ /* Basic fade-up */ .reveal { opacity: 0; transform: translateY(20px); transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1); } .reveal.active { opacity: 1; transform: translateY(0); } /* Slide from left */ .reveal-left { opacity: 0; transform: translateX(-40px); transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1); } .reveal-left.active { opacity: 1; transform: translateX(0); } /* Slide from right */ .reveal-right { opacity: 0; transform: translateX(40px); transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1); } .reveal-right.active { opacity: 1; transform: translateX(0); } /* Stagger delays */ .reveal[style*="animation-delay: 0.05s"], .reveal-left[style*="animation-delay: 0.05s"], .reveal-right[style*="animation-delay: 0.05s"] { transition-delay: 0.05s; } .reveal[style*="animation-delay: 0.1s"], .reveal-left[style*="animation-delay: 0.1s"], .reveal-right[style*="animation-delay: 0.1s"] { transition-delay: 0.1s; } .reveal[style*="animation-delay: 0.15s"], .reveal-left[style*="animation-delay: 0.15s"], .reveal-right[style*="animation-delay: 0.15s"] { transition-delay: 0.15s; } .reveal[style*="animation-delay: 0.2s"], .reveal-left[style*="animation-delay: 0.2s"], .reveal-right[style*="animation-delay: 0.2s"] { transition-delay: 0.2s; } /* ── Clip Reveal (heading) ───────────────────────────────── */ .clip-reveal { clip-path: inset(0 100% 0 0); opacity: 1; transform: none; } .clip-reveal.active { clip-path: inset(0 0% 0 0); transition: clip-path 1s cubic-bezier(0.77, 0, 0.175, 1); } /* ── Typewriter ──────────────────────────────────────────── */ .typewriter-wrap { visibility: hidden; } .typewriter-wrap.typing, .typewriter-wrap.typed { visibility: visible; } .typewriter-cursor { display: inline-block; width: 2px; height: 1em; background: #f59e0b; margin-left: 2px; vertical-align: text-bottom; animation: cursorBlink 0.7s step-end infinite; } .typewriter-wrap.typed .typewriter-cursor { animation: cursorBlink 0.7s step-end infinite 2s; animation-fill-mode: forwards; } @keyframes cursorBlink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } /* ── Text highlight sweep ────────────────────────────────── */ .text-highlight { background: linear-gradient(to right, rgba(245, 158, 11, 0.15) 100%, transparent 0); background-size: 0% 100%; background-repeat: no-repeat; background-position: left center; padding: 1px 4px; margin: 0 -4px; transition: background-size 0.8s cubic-bezier(0.4, 0, 0.2, 1); color: white; font-weight: 500; } .text-highlight.highlighted { background-size: 100% 100%; } /* ── Arrow slide (CTA) ───────────────────────────────────── */ .arrow-slide { display: inline-block; transition: transform 0.3s ease; } .cta-primary:hover .arrow-slide { animation: arrowBounce 0.6s ease infinite; } @keyframes arrowBounce { 0%, 100% { transform: translateX(0); } 50% { transform: translateX(5px); } } /* ── Social button hover fill ────────────────────────────── */ .social-btn { position: relative; overflow: hidden; z-index: 1; } .social-btn::before { content: ''; position: absolute; inset: 0; background: rgba(245, 158, 11, 0.05); transform: translateX(-100%); transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1); z-index: -1; } .social-btn:hover::before { transform: translateX(0); } .social-btn:hover { color: white !important; border-color: rgba(245, 158, 11, 0.25) !important; } /* ── Section scroll offset ───────────────────────────────── */ section[id] { scroll-margin-top: 80px; } /* ── Prevent horizontal overflow ─────────────────────────── */ html, body { max-width: 100%; overflow-x: hidden; } /* ── Scrollbar ───────────────────────────────────────────── */ ::-webkit-scrollbar { width: 4px; } ::-webkit-scrollbar-track { background: #0c0a09; } ::-webkit-scrollbar-thumb { background: rgba(245, 158, 11, 0.15); } ::-webkit-scrollbar-thumb:hover { background: rgba(245, 158, 11, 0.3); } /* ── Selection ───────────────────────────────────────────── */ ::selection { background: rgba(245, 158, 11, 0.25); color: white; } /* ── Focus ────────────────────────────────────────────────── */ a:focus-visible, button:focus-visible { outline: 2px solid #f59e0b; outline-offset: 2px; } /* ── Active nav link ─────────────────────────────────────── */ .nav-link.active { color: #f59e0b; } /* ── Responsive ──────────────────────────────────────────── */ @media (max-width: 640px) { .text-5xl { font-size: 2.5rem; } .text-7xl { font-size: 3.5rem; } } /* ── Print ────────────────────────────────────────────────── */ @media print { .fixed, #navbar, .scroll-indicator, #scroll-progress { display: none !important; } .reveal, .reveal-left, .reveal-right, .clip-reveal { opacity: 1 !important; transform: none !important; clip-path: none !important; } .typewriter-wrap { visibility: visible !important; } .tag-cascade .tag { opacity: 1 !important; transform: none !important; } body { background: white !important; color: black !important; } } /* ── Reduced Motion ──────────────────────────────────────── */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } .reveal, .reveal-left, .reveal-right, .clip-reveal { opacity: 1 !important; transform: none !important; clip-path: none !important; } .typewriter-wrap { visibility: visible !important; } .icon-box { opacity: 1 !important; transform: none !important; } .tag-cascade .tag { opacity: 1 !important; transform: none !important; } body.is-loading { opacity: 1 !important; } }