/* ===== CXART Gallery — Premium Dark Radiology Aesthetic ===== */ @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&family=Playfair+Display:ital,wght@0,700;0,800;1,700&display=swap'); /* ---------- Design Tokens ---------- */ :root { --bg-void: #030308; --bg-primary: #06070e; --bg-secondary: #0a0c18; --bg-card: rgba(12, 14, 28, 0.7); --bg-card-solid: #0c0e1c; --bg-card-hover: rgba(18, 20, 40, 0.8); --border-subtle: rgba(139, 92, 246, 0.08); --border-mid: rgba(139, 92, 246, 0.18); --border-glow: rgba(139, 92, 246, 0.4); --text-primary: #f0eef8; --text-secondary: #a09cb8; --text-muted: #5c577a; --text-accent: #c4b5fd; --accent-purple: #8b5cf6; --accent-violet: #a78bfa; --accent-cyan: #22d3ee; --accent-pink: #f472b6; --accent-emerald: #34d399; --gradient-title: linear-gradient(135deg, #f0eef8 0%, #c4b5fd 40%, #8b5cf6 65%, #22d3ee 100%); --gradient-card-border: linear-gradient(145deg, rgba(139, 92, 246, 0.25), rgba(34, 211, 238, 0.1), rgba(139, 92, 246, 0.05)); --gradient-glow-bg: radial-gradient(ellipse at 50% 0%, rgba(139, 92, 246, 0.08) 0%, transparent 70%); --shadow-card: 0 4px 24px rgba(0, 0, 0, 0.3), 0 1px 3px rgba(0, 0, 0, 0.2); --shadow-card-hover: 0 12px 48px rgba(139, 92, 246, 0.12), 0 4px 16px rgba(0, 0, 0, 0.4); --shadow-lightbox: 0 0 80px rgba(139, 92, 246, 0.15), 0 30px 100px rgba(0, 0, 0, 0.6); --radius-sm: 8px; --radius-md: 14px; --radius-lg: 22px; --radius-xl: 28px; --font-display: 'Playfair Display', Georgia, serif; --font-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', monospace; --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1); --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); --transition-fast: 0.2s var(--ease-out-expo); --transition-smooth: 0.45s var(--ease-out-expo); --transition-spring: 0.55s var(--ease-spring); } /* ---------- Reset & Base ---------- */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; font-size: 16px; } body { font-family: var(--font-sans); background: var(--bg-void); color: var(--text-primary); min-height: 100vh; overflow-x: hidden; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; position: relative; } /* ---------- Particle Canvas ---------- */ #particles { position: fixed; inset: 0; z-index: 0; pointer-events: none; } /* ---------- Ambient Background Effects ---------- */ .ambient-bg { position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; } .ambient-bg__orb { position: absolute; border-radius: 50%; filter: blur(120px); opacity: 0.5; animation: orb-drift 20s ease-in-out infinite alternate; } .ambient-bg__orb--1 { width: 600px; height: 600px; background: rgba(139, 92, 246, 0.07); top: -10%; left: 15%; animation-duration: 25s; } .ambient-bg__orb--2 { width: 500px; height: 500px; background: rgba(34, 211, 238, 0.04); bottom: -15%; right: 10%; animation-duration: 30s; animation-delay: -10s; } .ambient-bg__orb--3 { width: 400px; height: 400px; background: rgba(244, 114, 182, 0.03); top: 40%; left: 60%; animation-duration: 22s; animation-delay: -5s; } @keyframes orb-drift { 0% { transform: translate(0, 0) scale(1); } 33% { transform: translate(30px, -20px) scale(1.1); } 66% { transform: translate(-20px, 30px) scale(0.95); } 100% { transform: translate(15px, -15px) scale(1.05); } } /* ---------- Scanline Overlay ---------- */ .scanlines { position: fixed; inset: 0; z-index: 9998; pointer-events: none; background: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(139, 92, 246, 0.012) 2px, rgba(139, 92, 246, 0.012) 4px ); } /* ---------- Noise texture overlay ---------- */ .noise { position: fixed; inset: 0; z-index: 9997; pointer-events: none; opacity: 0.025; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); background-size: 256px 256px; } /* ---------- Content wrapper ---------- */ .content { position: relative; z-index: 1; } /* ---------- Hero Section ---------- */ .hero { text-align: center; padding: 120px 24px 80px; position: relative; } .hero__badge { display: inline-flex; align-items: center; gap: 10px; padding: 8px 20px; border-radius: 100px; background: rgba(139, 92, 246, 0.06); border: 1px solid rgba(139, 92, 246, 0.15); color: var(--accent-violet); font-family: var(--font-mono); font-size: 0.7rem; font-weight: 500; letter-spacing: 0.15em; text-transform: uppercase; margin-bottom: 36px; backdrop-filter: blur(10px); } .hero__badge::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--accent-emerald); box-shadow: 0 0 8px rgba(52, 211, 153, 0.6); animation: pulse-dot 2s ease-in-out infinite; } @keyframes pulse-dot { 0%, 100% { opacity: 1; transform: scale(1); box-shadow: 0 0 8px rgba(52, 211, 153, 0.6); } 50% { opacity: 0.5; transform: scale(0.7); box-shadow: 0 0 4px rgba(52, 211, 153, 0.3); } } .hero__title { font-family: var(--font-display); font-size: clamp(3.5rem, 9vw, 7rem); font-weight: 800; letter-spacing: -0.02em; line-height: 1; margin-bottom: 28px; background: var(--gradient-title); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; animation: title-shimmer 6s ease-in-out infinite alternate; background-size: 200% 200%; } @keyframes title-shimmer { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } } .hero__subtitle { font-size: clamp(1.05rem, 2.5vw, 1.3rem); color: var(--text-secondary); max-width: 600px; margin: 0 auto 16px; line-height: 1.75; font-weight: 300; letter-spacing: 0.01em; } .hero__divider { width: 60px; height: 2px; background: linear-gradient(90deg, transparent, var(--accent-purple), transparent); margin: 28px auto; border: none; } .hero__meta { font-family: var(--font-mono); font-size: 0.78rem; color: var(--text-muted); letter-spacing: 0.05em; } .hero__meta span { color: var(--accent-violet); font-weight: 600; } /* ---------- Gallery Grid ---------- */ .gallery { max-width: 1320px; margin: 0 auto; padding: 0 28px 120px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; } /* ---------- Card ---------- */ .card { position: relative; background: var(--bg-card); border-radius: var(--radius-lg); overflow: hidden; cursor: pointer; transition: transform var(--transition-smooth), box-shadow var(--transition-smooth); backdrop-filter: blur(12px); box-shadow: var(--shadow-card); /* Animated gradient border */ border: 1px solid transparent; background-clip: padding-box; /* Scroll animation initial state */ opacity: 0; transform: translateY(50px) scale(0.97); } /* Animated border via pseudo-element */ .card::before { content: ''; position: absolute; inset: -1px; border-radius: var(--radius-lg); padding: 1px; background: linear-gradient( 160deg, rgba(139, 92, 246, 0.2), rgba(34, 211, 238, 0.08), rgba(139, 92, 246, 0.05), transparent 60% ); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; z-index: 1; pointer-events: none; transition: opacity var(--transition-smooth); } /* Top glow line */ .card::after { content: ''; position: absolute; top: 0; left: 20%; right: 20%; height: 1px; background: linear-gradient(90deg, transparent, rgba(139, 92, 246, 0.4), transparent); z-index: 2; pointer-events: none; opacity: 0; transition: opacity var(--transition-smooth); } .card.visible { opacity: 1; transform: translateY(0) scale(1); transition: opacity 0.7s var(--ease-out-expo), transform 0.7s var(--ease-out-expo), box-shadow var(--transition-smooth); } .card:hover { transform: translateY(-8px) scale(1.01); box-shadow: var(--shadow-card-hover); } .card.visible:hover { transform: translateY(-8px) scale(1.01); } .card:hover::before { opacity: 1; background: linear-gradient( 160deg, rgba(139, 92, 246, 0.4), rgba(34, 211, 238, 0.2), rgba(139, 92, 246, 0.1), transparent 60% ); } .card:hover::after { opacity: 1; } /* Card Number Badge */ .card__number { position: absolute; top: 16px; left: 16px; z-index: 4; width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; border-radius: 10px; background: rgba(6, 7, 14, 0.7); backdrop-filter: blur(12px); border: 1px solid rgba(139, 92, 246, 0.25); font-family: var(--font-mono); font-size: 0.72rem; font-weight: 700; color: var(--accent-violet); letter-spacing: 0.02em; } /* Image Container */ .card__image-wrap { position: relative; width: 100%; aspect-ratio: 1 / 1; overflow: hidden; background: var(--bg-secondary); } .card__image-wrap::after { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 60%; background: linear-gradient(to top, var(--bg-card-solid) 0%, transparent 100%); pointer-events: none; z-index: 2; } .card__image { width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ease-out-expo), filter 0.6s var(--ease-out-expo); filter: brightness(0.85) contrast(1.08) saturate(0.9); } .card:hover .card__image { transform: scale(1.1); filter: brightness(0.95) contrast(1.12) saturate(1); } /* Card Body */ .card__body { padding: 24px 26px 30px; position: relative; z-index: 3; } .card__title { font-family: var(--font-sans); font-size: 1.2rem; font-weight: 600; line-height: 1.3; margin-bottom: 8px; color: var(--text-primary); letter-spacing: -0.01em; } .card__tagline { font-family: var(--font-display); font-style: italic; font-size: 0.88rem; color: var(--accent-violet); margin-bottom: 14px; line-height: 1.55; font-weight: 400; opacity: 0.85; } .card__description { font-size: 0.84rem; color: var(--text-secondary); line-height: 1.7; font-weight: 300; } .card__tag { display: inline-flex; align-items: center; gap: 6px; margin-top: 18px; padding: 5px 14px; border-radius: 100px; background: rgba(139, 92, 246, 0.06); border: 1px solid rgba(139, 92, 246, 0.12); font-family: var(--font-mono); font-size: 0.65rem; color: var(--text-muted); letter-spacing: 0.08em; text-transform: uppercase; transition: border-color var(--transition-fast), color var(--transition-fast); } .card:hover .card__tag { border-color: rgba(139, 92, 246, 0.25); color: var(--accent-violet); } .card__tag::before { content: ''; width: 4px; height: 4px; border-radius: 50%; background: var(--accent-purple); opacity: 0.5; } /* ---------- Lightbox ---------- */ .lightbox { position: fixed; inset: 0; z-index: 10000; display: flex; align-items: center; justify-content: center; background: rgba(3, 3, 8, 0.88); backdrop-filter: blur(30px) saturate(0.5); opacity: 0; visibility: hidden; transition: opacity var(--transition-smooth), visibility var(--transition-smooth); } .lightbox.active { opacity: 1; visibility: visible; } .lightbox__inner { position: relative; max-width: 80vw; max-height: 85vh; transform: scale(0.92) translateY(20px); transition: transform var(--transition-spring); } .lightbox.active .lightbox__inner { transform: scale(1) translateY(0); } .lightbox__image { max-width: 100%; max-height: 78vh; border-radius: var(--radius-xl); box-shadow: var(--shadow-lightbox); border: 1px solid rgba(139, 92, 246, 0.2); } .lightbox__caption { text-align: center; margin-top: 24px; } .lightbox__caption-title { font-family: var(--font-sans); font-size: 1.35rem; font-weight: 600; color: var(--text-primary); margin-bottom: 6px; letter-spacing: -0.01em; } .lightbox__caption-tagline { font-family: var(--font-display); font-style: italic; font-size: 1rem; color: var(--accent-violet); opacity: 0.8; } .lightbox__close { position: absolute; top: -52px; right: 0; width: 42px; height: 42px; border: 1px solid rgba(139, 92, 246, 0.2); background: rgba(139, 92, 246, 0.08); backdrop-filter: blur(10px); border-radius: 50%; color: var(--text-primary); font-size: 1.1rem; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast); } .lightbox__close:hover { background: rgba(139, 92, 246, 0.2); border-color: rgba(139, 92, 246, 0.4); transform: rotate(90deg); } /* ---------- Footer ---------- */ .footer { text-align: center; padding: 48px 24px 72px; position: relative; } .footer::before { content: ''; position: absolute; top: 0; left: 10%; right: 10%; height: 1px; background: linear-gradient(90deg, transparent, rgba(139, 92, 246, 0.15), transparent); } .footer__text { font-family: var(--font-mono); font-size: 0.75rem; color: var(--text-muted); line-height: 2; letter-spacing: 0.02em; } .footer__text a { color: var(--accent-violet); text-decoration: none; border-bottom: 1px solid rgba(139, 92, 246, 0.2); padding-bottom: 1px; transition: color var(--transition-fast), border-color var(--transition-fast); } .footer__text a:hover { color: var(--accent-cyan); border-color: rgba(34, 211, 238, 0.3); } /* ---------- Responsive ---------- */ @media (max-width: 1080px) { .gallery { grid-template-columns: repeat(2, 1fr); gap: 20px; } } @media (max-width: 640px) { .gallery { grid-template-columns: 1fr; gap: 20px; padding: 0 16px 80px; } .hero { padding: 80px 16px 48px; } .card__body { padding: 20px 20px 26px; } .card__title { font-size: 1.1rem; } } /* ---------- Stagger animation delays ---------- */ .card:nth-child(1) { transition-delay: 0.0s; } .card:nth-child(2) { transition-delay: 0.08s; } .card:nth-child(3) { transition-delay: 0.16s; } .card:nth-child(4) { transition-delay: 0.24s; } .card:nth-child(5) { transition-delay: 0.32s; } .card:nth-child(6) { transition-delay: 0.40s; } /* Clear delay once visible to avoid hover lag */ .card.visible { transition-delay: 0s; } /* ---------- Selection ---------- */ ::selection { background: rgba(139, 92, 246, 0.3); color: var(--text-primary); } /* ---------- Scrollbar ---------- */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: var(--bg-void); } ::-webkit-scrollbar-thumb { background: rgba(139, 92, 246, 0.2); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: rgba(139, 92, 246, 0.35); }