@charset "utf-8"; /* ============================================================================= Design Tokens ============================================================================= */ :root { --accent-subtle-deep: #e0e7ff; /* Font Awesome Pro duotone tokens — harmonized with --accent */ --fa-primary-color: #6366f1; --fa-secondary-color: #6366f1; --fa-primary-opacity: 1; --fa-secondary-opacity: 0.38; --accent: #6366f1; --accent-hover: #818cf8; --accent-subtle: #eef2ff; --accent-border: rgba(99, 102, 241, 0.2); --success: #059669; --text: #1a1a1a; --text-secondary: #6b7280; --text-muted: #8591a4; --bg: #ffffff; --bg-page: #f9f8ff; --border: #e5e7eb; --border-subtle: #f1f3f5; /* 3-layer shadow: contact edge + key light + ambient float */ --shadow-sm: 0 1px 2px rgba(0,0,0,0.05), 0 2px 8px rgba(16,24,40,0.05), 0 6px 20px rgba(16,24,40,0.04); --shadow-md: 0 1px 3px rgba(0,0,0,0.07), 0 6px 16px rgba(16,24,40,0.08), 0 20px 48px rgba(16,24,40,0.07); --shadow-lg: 0 2px 4px rgba(0,0,0,0.07), 0 12px 28px rgba(16,24,40,0.09), 0 40px 80px rgba(16,24,40,0.09); --radius: 12px; --radius-sm: 8px; --sans: 'Lato', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --serif: 'Source Serif 4', Georgia, 'Times New Roman', serif; /* #2: Apple-style easing */ --ease: cubic-bezier(0.25, 0.1, 0.25, 1); } /* ============================================================================= Base ============================================================================= */ html { scroll-behavior: smooth; } body { font-family: var(--sans); font-weight: 400; padding-top: 4.5rem; color: var(--text); background: var(--bg-page); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; line-height: 1.65; min-height: 100vh; display: flex; flex-direction: column; } body > .container-lg, body > .container-xl { flex: 1; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-weight: 600; letter-spacing: -0.01em; } a { color: var(--accent); transition: color 0.25s var(--ease); /* #2 */ } a:hover { color: var(--accent-hover); text-decoration: none; } /* ============================================================================= Navbar — glassmorphism ============================================================================= */ .navbar { opacity: 1; background: rgba(255, 255, 255, 0.82) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-bottom: 1px solid var(--border); box-shadow: none; padding: 0.75rem 1.5rem; /* #4: more breathing room */ transition: box-shadow 0.25s var(--ease); } .navbar-brand { font-weight: 700 !important; font-size: 1rem; letter-spacing: -0.02em; color: var(--text) !important; } .navbar-nav .nav-link { font-size: 0.875rem; font-weight: 500; color: var(--text-secondary) !important; padding: 0.5rem 1rem !important; margin: 0 0.15rem; border-radius: 6px; transition: color 0.25s var(--ease), background 0.25s var(--ease); /* #2 */ } .navbar-nav .nav-link:hover { color: var(--accent) !important; background: var(--accent-subtle); } .navbar-nav .nav-item.active .nav-link { color: var(--accent) !important; background: var(--accent-subtle); font-weight: 600; } /* ============================================================================= Cards — elevated, interactive ============================================================================= */ .card { border-radius: var(--radius) !important; border: 1px solid var(--border) !important; box-shadow: var(--shadow-sm); transition: box-shadow 0.25s var(--ease); } .card:hover { box-shadow: var(--shadow-md); } .card-img-overlay { border-radius: var(--radius) !important; } .rounded-xl { border-radius: var(--radius) !important; } .rounded-xl-bottom { border-bottom-right-radius: var(--radius) !important; border-bottom-left-radius: var(--radius) !important; } .rounded-xl-top { border-top-left-radius: var(--radius) !important; border-top-right-radius: var(--radius) !important; } /* Card sections (news, publications) */ .bg-white.shadow-sm.rounded-xl, .my-3.bg-white.shadow-sm.rounded-xl { border: 1px solid var(--border); box-shadow: var(--shadow-sm); border-radius: var(--radius) !important; transition: box-shadow 0.25s var(--ease); } .bg-white.shadow-sm.rounded-xl:hover { box-shadow: var(--shadow-md); } /* Section headers inside cards */ .bg-white h6.border-bottom { font-size: 0.85rem; font-weight: 600; letter-spacing: 0.03em; text-transform: uppercase; color: var(--text-secondary); border-color: var(--border) !important; } .bg-white h6.border-bottom a { font-size: 0.8rem; text-transform: none; letter-spacing: 0; font-weight: 500; } /* ============================================================================= Profile Card ============================================================================= */ .card-body .h1, .card-body .h1.font-weight-normal, .card-body div.h1 { font-family: var(--serif) !important; font-size: 2rem !important; font-weight: 600 !important; letter-spacing: -0.01em; color: var(--text); line-height: 1.2; } .text-profile-position { font-weight: 400; color: var(--text-secondary); font-size: 0.95rem; } .text-profile-bio { font-weight: 400; font-size: 0.95rem; line-height: 1.75; color: var(--text); } .text-profile-bio ul { padding-left: 1.2rem; margin-bottom: 0.5rem; } .text-profile-bio li { margin-bottom: 0.2rem; } /* Research interest chip tags */ .research-tags { display: flex; flex-wrap: wrap; gap: 0.45rem; margin: 0.5rem 0 0.25rem; } .research-tag { display: inline-flex; align-items: center; padding: 0.28rem 0.8rem; background: var(--accent-subtle); color: var(--accent); border: 1px solid var(--accent-border); border-radius: 100px; font-size: 0.8rem; font-weight: 500; transition: background 0.25s var(--ease), color 0.25s var(--ease), border-color 0.25s var(--ease), box-shadow 0.25s var(--ease); cursor: default; user-select: none; } .research-tag:hover { background: var(--accent-subtle-deep, #e0e7ff); color: var(--accent); border-color: rgba(99, 102, 241, 0.50); box-shadow: 0 1px 4px rgba(99, 102, 241, 0.18); } /* Portrait image */ .figure-img.img-thumbnail { border: 2px solid var(--border); border-radius: var(--radius) !important; box-shadow: var(--shadow-sm); transition: box-shadow 0.25s var(--ease); } .figure-img.img-thumbnail:hover { box-shadow: var(--shadow-md); } /* Social links row */ .card-body hr { border-color: var(--border); margin: 1.5rem 0; } .card-body hr + .row .col { display: flex; flex-wrap: wrap; gap: 0.75rem; /* #8: more spacing */ align-items: center; } .card-body hr + .row a { display: inline-flex; align-items: center; gap: 0.4rem; color: var(--text-secondary); font-size: 0.85rem; font-weight: 500; padding: 0.35rem 0.7rem; border-radius: 8px; transition: color 0.25s var(--ease), background 0.25s var(--ease); /* #2 #3: no transform */ text-decoration: none; } .card-body hr + .row a:hover { color: var(--accent); background: var(--accent-subtle); } .card-body hr + .row a i { font-size: 1rem; width: 1.1em; text-align: center; } .email-text { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.82rem; } /* ============================================================================= Education / Experience Card ============================================================================= */ .card-body h6 { font-size: 0.8rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-secondary); margin-bottom: 0.75rem; } /* Override Bootstrap .small inside edu/exp/awards */ .card-body .media-body .small, .card-body .list.small { font-size: 0.875rem !important; } .inline-badge { height: 16px; vertical-align: -10%; margin-right: 3px; line-break: unset; } .no-break { white-space: nowrap; } /* ============================================================================= News Items ============================================================================= */ .news-item-row { padding: 0.2rem 0.5rem; border-radius: var(--radius-sm); transition: background 0.25s var(--ease); } .news-item-row:hover { background: var(--accent-subtle); } .bg-white .px-3.pb-1.small { font-size: 0.875rem !important; } .bg-white .media .text-muted { font-weight: 600; font-size: 0.875rem; } /* ============================================================================= Publication Items ============================================================================= */ /* Cover images */ .cover-image { width: 180px; max-height: 120px; } /* Lazy loading images in publication rows */ .d-none.d-md-block .row img.lazy, .d-none.d-md-block .row img.w-100 { border-radius: var(--radius-sm); object-fit: cover; aspect-ratio: 3 / 2; box-shadow: var(--shadow-sm); transition: box-shadow 0.25s var(--ease); } .d-none.d-md-block .row:hover img.lazy, .d-none.d-md-block .row:hover img.w-100 { box-shadow: var(--shadow-md); } /* Publication title */ .d-none.d-md-block h5.font-weight-normal { font-weight: 500 !important; font-size: 1.1rem; line-height: 1.4; color: var(--text); margin-bottom: 0.3rem !important; } /* Publication author & venue lines — override Bootstrap .small */ .d-none.d-md-block p.small, .d-md-none p.small { font-size: 0.85rem !important; } /* Publication row hover effect */ .d-none.d-md-block .row.no-gutters { transition: background 0.25s var(--ease), box-shadow 0.25s var(--ease); border-color: var(--border) !important; } .d-none.d-md-block .row.no-gutters:hover { background: var(--accent-subtle); box-shadow: var(--shadow-sm); } /* Publication links — clean ghost/outline buttons */ .abstract-links a { display: inline-block; padding: 0.35rem 0.8rem; /* #5: larger touch target */ margin: 0.2rem 0.25rem 0.2rem 0; background: transparent; color: var(--accent) !important; border: 1px solid rgba(99, 102, 241, 0.42); border-radius: 6px; font-size: 0.8rem; font-weight: 500; text-decoration: none; letter-spacing: 0.01em; transition: background 0.25s var(--ease), border-color 0.25s var(--ease), box-shadow 0.25s var(--ease); /* #2 */ } .abstract-links a:hover { background: var(--accent-subtle); color: var(--accent) !important; border-color: rgba(99, 102, 241, 0.70); box-shadow: 0 2px 8px rgba(99, 102, 241, 0.22); } /* Spotlight / award badges in publication venue line */ .badge-success { background: var(--success) !important; font-weight: 500; font-size: 0.8rem; padding: 0.25rem 0.6rem; border-radius: 100px; } /* Abstract body */ .abstract-body { min-height: 100px; } /* ============================================================================= Publications Page — Year Headers ============================================================================= */ h2[id^="year-"] { font-weight: 700; letter-spacing: -0.02em; color: var(--accent); padding-bottom: 0.6rem; border-bottom: 2px solid var(--accent-border); margin-bottom: 1rem; } /* Year filter sidebar — nav-pills */ .nav-pills .nav-link { color: var(--text-secondary); font-size: 0.85rem; font-weight: 500; border-radius: var(--radius-sm); padding: 0.4rem 0.75rem; transition: color 0.25s var(--ease), background 0.25s var(--ease); } .nav-pills .nav-link:hover { color: var(--accent); background: var(--accent-subtle); } .nav-pills .nav-link.active, .nav-pills .show > .nav-link { background: var(--accent) !important; color: #fff !important; font-weight: 600; } /* Year filter sidebar buttons */ .btn-primary { background: var(--accent) !important; border-color: var(--accent) !important; border-radius: var(--radius-sm); font-weight: 500; transition: background 0.25s var(--ease), box-shadow 0.25s var(--ease); } .btn-primary:hover { background: var(--accent-hover) !important; border-color: var(--accent-hover) !important; box-shadow: var(--shadow-md); } .btn-outline-primary { color: var(--accent) !important; border-color: var(--accent-border) !important; border-radius: var(--radius-sm); font-weight: 500; transition: background 0.25s var(--ease), border-color 0.25s var(--ease), color 0.25s var(--ease), box-shadow 0.25s var(--ease); } .btn-outline-primary:hover { background: var(--accent) !important; border-color: var(--accent) !important; color: #fff !important; } /* Bubble visual hash (placeholder for publications without cover) */ svg.bubble-visual-hash { border-radius: var(--radius-sm); } /* Equal contribution note */ .eq-contrib-note { color: var(--text-muted); font-size: 0.8rem; } /* ============================================================================= Lazy Loading — shimmer skeleton ============================================================================= */ @keyframes shimmer { 0% { background-position: -400px 0; } 100% { background-position: 400px 0; } } img.lazy { background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 800px 100%; animation: shimmer 1.5s infinite linear; min-height: 80px; } /* No shimmer on div.lazy — these are mobile publication cards with text overlay. The shimmer animation behind text is distracting and never stops. */ /* ============================================================================= Footer ============================================================================= */ footer.footer { background: var(--bg-page) !important; border-top: none !important; color: var(--text-muted); padding: 3rem 0 2rem !important; margin-top: auto !important; } footer.footer .row { margin: 0 !important; } footer.footer .text-muted { text-align: center; font-size: 0.82rem; } /* ============================================================================= Utilities & Overrides ============================================================================= */ .bg-light { background-color: var(--bg-page) !important; } .bg-white { background-color: var(--bg) !important; } .shadow-sm { box-shadow: var(--shadow-sm) !important; } .border-gray, .border-bottom.border-gray { border-color: var(--border) !important; } .badge-publication { font-size: 100%; } /* Selection color */ ::selection { background: var(--accent-subtle); color: var(--text); } /* Research Highlights — individual project cards (lift on hover) */ .col-md-4 .border.rounded-lg { box-shadow: var(--shadow-sm); transition: box-shadow 0.25s var(--ease), transform 0.25s var(--ease); } .col-md-4 .border.rounded-lg:hover { box-shadow: var(--shadow-md), 0 4px 16px rgba(99, 102, 241, 0.18) !important; transform: translateY(-2px); } /* ============================================================================= Showcase — Reading Grid ============================================================================= */ .grid-item .card { height: 100%; display: flex; flex-direction: column; transition: box-shadow 0.25s var(--ease), transform 0.25s var(--ease); } .grid-item .card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md), 0 4px 16px rgba(99, 102, 241, 0.15); } .grid-item .card img { aspect-ratio: 2 / 3; object-fit: cover; width: 100%; } .grid-item .card .card-body { flex: 1; display: flex; align-items: center; } .grid-item .card .card-text { font-size: 0.9rem; font-weight: 500; line-height: 1.4; margin: 0; } /* ============================================================================= Responsive ============================================================================= */ /* #9: small screens */ @media (max-width: 480px) { .card-body .h1, .card-body .h1.font-weight-normal, .card-body div.h1 { font-size: 1.35rem !important; } .card-body { padding: 1.25rem !important; } .card-body hr + .row .col { gap: 0.4rem; } .card-body hr + .row a { font-size: 0.8rem; padding: 0.5rem 0.6rem; } } @media (max-width: 768px) { .card-body .h1, .card-body .h1.font-weight-normal, .card-body div.h1 { font-size: 1.5rem !important; } .card-body { padding: 1.5rem !important; } /* Larger touch targets for mobile */ .abstract-links a { padding: 0.5rem 1rem; font-size: 0.8rem; min-height: 44px; display: inline-flex; align-items: center; } } /* ============================================================================= Dark Mode ============================================================================= */ [data-theme="dark"] { --accent: #818cf8; --accent-hover: #a5b4fc; --accent-subtle: rgba(99, 102, 241, 0.15); --accent-border: rgba(99, 102, 241, 0.30); --text: #e2e8f0; --text-secondary: #94a3b8; --text-muted: #7c8fa8; --bg: #111827; --bg-page: #0f172a; --accent-subtle-deep: rgba(99, 102, 241, 0.28); --border: #263348; --border-subtle: #1e293b; --shadow-sm: 0 1px 2px rgba(0,0,0,0.18), 0 2px 8px rgba(0,0,0,0.14), 0 6px 20px rgba(0,0,0,0.11); --shadow-md: 0 1px 3px rgba(0,0,0,0.22), 0 6px 16px rgba(0,0,0,0.17), 0 20px 48px rgba(0,0,0,0.14); --shadow-lg: 0 2px 4px rgba(0,0,0,0.25), 0 12px 28px rgba(0,0,0,0.19), 0 40px 80px rgba(0,0,0,0.16); } [data-theme="dark"] body { color-scheme: dark; } [data-theme="dark"] .navbar { background: rgba(15, 23, 42, 0.88) !important; border-bottom-color: var(--border) !important; } [data-theme="dark"] .navbar-toggler-icon { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='%23e2e8f0' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } [data-theme="dark"] .modal-content { background-color: var(--bg); color: var(--text); border-color: var(--border); } [data-theme="dark"] .modal-header, [data-theme="dark"] .modal-footer { border-color: var(--border); } [data-theme="dark"] .close { color: var(--text); } [data-theme="dark"] .card, [data-theme="dark"] .bg-white { background-color: #1a2235 !important; border-color: var(--border) !important; color: var(--text); } [data-theme="dark"] .bg-white.shadow-sm.rounded-xl, [data-theme="dark"] .my-3.bg-white.shadow-sm.rounded-xl { background-color: #1a2235 !important; } [data-theme="dark"] .bg-light { background-color: var(--bg-page) !important; } [data-theme="dark"] .text-muted, [data-theme="dark"] .text-profile-position { color: var(--text-secondary) !important; } [data-theme="dark"] .border-bottom.border-gray, [data-theme="dark"] .border-gray { border-color: var(--border) !important; } [data-theme="dark"] img.lazy { background: linear-gradient(90deg, #1e293b 25%, #263347 50%, #1e293b 75%); } [data-theme="dark"] footer.footer { background: var(--bg-page) !important; } [data-theme="dark"] hr { border-color: var(--border) !important; } [data-theme="dark"] .nav-pills .nav-link { color: var(--text-secondary); } [data-theme="dark"] .nav-pills .nav-link:hover { color: var(--accent); background: var(--accent-subtle); } [data-theme="dark"] .nav-pills .nav-link.active, [data-theme="dark"] .nav-pills .show > .nav-link { background: var(--accent) !important; color: #fff !important; } [data-theme="dark"] .badge-success { background: var(--success) !important; color: #fff !important; } [data-theme="dark"] .abstract-links a:hover { box-shadow: 0 2px 8px rgba(129, 140, 248, 0.30); } [data-theme="dark"] .research-tag:hover { box-shadow: 0 1px 4px rgba(129, 140, 248, 0.28); } [data-theme="dark"] .grid-item .card:hover { box-shadow: var(--shadow-md), 0 4px 16px rgba(129, 140, 248, 0.20); } [data-theme="dark"] .col-md-4 .border.rounded-lg:hover { box-shadow: var(--shadow-md), 0 4px 16px rgba(129, 140, 248, 0.22) !important; } [data-theme="dark"] .d-none.d-md-block .row.no-gutters:hover { box-shadow: var(--shadow-sm), 0 2px 10px rgba(129, 140, 248, 0.15); } [data-theme="dark"] .card-body h5, [data-theme="dark"] .card-body h6, [data-theme="dark"] .card-body .h1, [data-theme="dark"] .card-body div, [data-theme="dark"] .media-body div { color: var(--text); } [data-theme="dark"] .card-body .small, [data-theme="dark"] .media-body .small { color: var(--text-secondary) !important; } [data-theme="dark"] .list li { color: var(--text); } [data-theme="dark"] .text-body, [data-theme="dark"] a.text-body { color: var(--text) !important; } /* Dark mode toggle button */ .theme-toggle { background: none; border: none; cursor: pointer; color: var(--text-secondary); font-size: 1rem; padding: 0.5rem 0.65rem; border-radius: 8px; transition: color 0.25s var(--ease), background 0.25s var(--ease); display: inline-flex; align-items: center; line-height: 1; margin-left: 0.25rem; } .theme-toggle:hover { color: var(--accent); background: var(--accent-subtle); } .icon-sun { display: none; } .icon-moon { display: inline; } [data-theme="dark"] .icon-sun { display: inline; } [data-theme="dark"] .icon-moon { display: none; } /* ── Accessibility: reduced motion ───────────────────────────────────── */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } /* ============================================================================= Font Awesome Pro — icon polish ============================================================================= */ /* Section header leading icons (Education, Experience, Awards, etc.) */ .section-icon { color: var(--accent); margin-right: 0.4rem; font-size: 0.95em; vertical-align: -0.05em; --fa-secondary-opacity: 0.4; } /* News timeline bullet — small dot to anchor each item */ .news-bullet { color: var(--accent); font-size: 0.55em; vertical-align: 0.4em; margin-right: 0.5rem; --fa-secondary-opacity: 0.45; } /* Card header icons get a touch of accent + duotone depth */ h6 > .fa-duotone, .card-body h6 > .fa-duotone, .rounded-xl > h6 > .fa-duotone { color: var(--accent); margin-right: 0.35rem; } /* Profile card social links — unify ALL icon colors to accent indigo */ .card-body a > i, .card-body a > i.fa-brands, .card-body a > i.fab, .card-body a > i.fa-duotone, .card-body a > i.fa-solid { color: var(--accent) !important; --fa-primary-color: var(--accent); --fa-secondary-color: var(--accent); } [data-theme="dark"] .card-body a > i { color: var(--accent-hover) !important; --fa-primary-color: var(--accent-hover); --fa-secondary-color: var(--accent-hover); } /* Theme toggle — keep the moon/sun crisp */ .theme-toggle .fa-duotone { --fa-secondary-opacity: 0.45; } /* Dark mode: keep duotone icons readable on dark backgrounds */ [data-theme="dark"] .section-icon, [data-theme="dark"] .news-bullet, [data-theme="dark"] h6 > .fa-duotone { color: var(--accent-hover); } /* ============================================================================= Polish — Batch A/B/C/D/E ============================================================================= */ /* First-screen breathing room */ body > .container-lg, body > .container-xl { margin-top: 1.25rem; } /* === Round avatar with indigo ring === */ .figure-img.img-thumbnail { border: 2px solid var(--accent) !important; border-radius: 50% !important; padding: 4px; background: var(--bg); box-shadow: 0 0 0 1px var(--accent-border), 0 8px 24px rgba(99, 102, 241, 0.18), 0 2px 6px rgba(15, 23, 42, 0.06); transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease); } .figure-img.img-thumbnail:hover { transform: translateY(-2px) scale(1.02); box-shadow: 0 0 0 1px var(--accent), 0 14px 32px rgba(99, 102, 241, 0.28), 0 4px 10px rgba(15, 23, 42, 0.08); } /* === Section card headers — bigger, tighter === */ .rounded-xl > h6, .card .card-body > .row h6 { font-size: 0.98rem; letter-spacing: -0.005em; font-weight: 600; } /* === News timeline rail === */ .news-timeline { position: relative; } .news-item-row { position: relative; padding-left: 1.1rem; } .news-item-content { position: relative; flex: 1; } .news-bullet-dot { position: absolute; left: -0.92rem; top: 0.55em; width: 8px; height: 8px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 3px var(--accent-subtle); transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease); } .news-item-row:hover .news-bullet-dot { transform: scale(1.25); box-shadow: 0 0 0 4px var(--accent-subtle-deep); } /* Vertical rail for the timeline (per-year media body) */ .news-timeline::before { content: ""; position: absolute; left: calc(1.1rem - 0.92rem + 3.5px); top: 0.55rem; bottom: 0.55rem; width: 1px; background: linear-gradient( to bottom, transparent, var(--accent-border) 12%, var(--accent-border) 88%, transparent ); } /* === Highlights cover rounding === */ #main .rounded-xl .col-md-4 > .border.rounded-lg { overflow: hidden; } .rounded-xl img[alt], .row.no-gutters .border.rounded-lg img { border-radius: 8px 8px 0 0; } /* === Profile social-link icon hover (no chip frame) === */ .card-body hr ~ .row .col > a > i, .card-body hr + .row .col > a > i { transition: transform 0.22s var(--ease), color 0.22s var(--ease); } .card-body hr ~ .row .col > a:hover > i, .card-body hr + .row .col > a:hover > i { transform: translateY(-2px); } /* === Publication item hover lift === */ .media, .row.no-gutters { transition: background 0.22s var(--ease), box-shadow 0.22s var(--ease); } .bg-white.shadow-sm.rounded-xl .row.no-gutters:hover { background: linear-gradient(180deg, var(--accent-subtle) 0%, transparent 100%); } /* === Latest highlight banner === */ .latest-banner-stack { display: flex; flex-direction: column; gap: 0.5rem; margin: 0 0 1rem; } .latest-banner-stack .latest-banner { margin: 0; } .latest-banner { display: flex; align-items: center; gap: 0.7rem; margin: 0 0 1rem; padding: 0.7rem 1.1rem; background: linear-gradient(135deg, var(--accent-subtle) 0%, #ede9fe 100%); border: 1px solid var(--accent-border); border-radius: 14px; color: var(--text); text-decoration: none; box-shadow: 0 2px 10px rgba(99, 102, 241, 0.08); transition: transform 0.22s var(--ease), box-shadow 0.22s var(--ease), border-color 0.22s var(--ease); } .latest-banner:hover { transform: translateY(-1px); border-color: var(--accent); box-shadow: 0 8px 20px rgba(99, 102, 241, 0.22); color: var(--text); text-decoration: none; } .latest-banner-icon { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 8px; background: var(--accent); color: #fff; --fa-primary-color: #fff; --fa-secondary-color: #c7d2fe; flex-shrink: 0; } .latest-banner-label { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--accent); background: rgba(255, 255, 255, 0.6); padding: 0.18rem 0.5rem; border-radius: 999px; border: 1px solid var(--accent-border); } .latest-banner-title { flex: 1; font-size: 0.92rem; font-weight: 500; color: var(--text); } .latest-banner-arrow { color: var(--accent); font-size: 0.85rem; transition: transform 0.25s var(--ease); } .latest-banner:hover .latest-banner-arrow { transform: translateX(3px); } /* === Back-to-top button === */ .back-to-top { position: fixed; right: 1.5rem; bottom: 1.5rem; width: 44px; height: 44px; border-radius: 12px; border: 1px solid var(--accent-border); background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); color: var(--accent); --fa-primary-color: var(--accent); --fa-secondary-color: var(--accent); --fa-secondary-opacity: 0.45; font-size: 1rem; display: flex; align-items: center; justify-content: center; opacity: 0; transform: translateY(8px); pointer-events: none; transition: all 0.28s var(--ease); box-shadow: 0 6px 18px rgba(15, 23, 42, 0.10); z-index: 1000; cursor: pointer; } .back-to-top.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; } .back-to-top:hover { background: var(--accent); color: #fff; --fa-primary-color: #fff; --fa-secondary-color: #fff; border-color: var(--accent); transform: translateY(-2px); box-shadow: 0 10px 24px rgba(99, 102, 241, 0.35); } /* === Section icon gradient (premium) === */ .section-icon { background: linear-gradient(135deg, #818cf8 0%, #4338ca 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; } /* === Dark mode overrides for new components === */ [data-theme="dark"] .figure-img.img-thumbnail { background: var(--bg); border-color: var(--accent-hover) !important; box-shadow: 0 0 0 1px rgba(129, 140, 248, 0.3), 0 8px 24px rgba(0, 0, 0, 0.4); } [data-theme="dark"] .news-bullet-dot { background: var(--accent-hover); box-shadow: 0 0 0 3px rgba(129, 140, 248, 0.18); } [data-theme="dark"] .news-timeline::before { background: linear-gradient( to bottom, transparent, rgba(129, 140, 248, 0.3) 12%, rgba(129, 140, 248, 0.3) 88%, transparent ); } [data-theme="dark"] .latest-banner { background: linear-gradient(135deg, rgba(129, 140, 248, 0.12) 0%, rgba(99, 102, 241, 0.06) 100%); border-color: rgba(129, 140, 248, 0.3); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); } [data-theme="dark"] .latest-banner-label { background: rgba(30, 27, 75, 0.6); color: var(--accent-hover); border-color: rgba(129, 140, 248, 0.3); } [data-theme="dark"] .latest-banner-title { color: var(--text); } [data-theme="dark"] .back-to-top { background: rgba(30, 27, 75, 0.85); border-color: rgba(129, 140, 248, 0.3); color: var(--accent-hover); } [data-theme="dark"] .back-to-top:hover { background: var(--accent-hover); color: #1e1b4b; } [data-theme="dark"] .card-body hr ~ .row .col > a > i, [data-theme="dark"] .card-body hr + .row .col > a > i { background: rgba(129, 140, 248, 0.12); border-color: rgba(129, 140, 248, 0.3); } [data-theme="dark"] .bg-white.shadow-sm.rounded-xl .row.no-gutters:hover { background: linear-gradient(180deg, rgba(129, 140, 248, 0.1) 0%, transparent 100%); } /* === BibTeX copy block === */ .bibtex-toggle { margin-left: 0.4rem; font-weight: 500; } .bibtex-block { position: relative; margin-top: 0.6rem; background: var(--code-bg, #f6f7f9); border: 1px solid var(--border); border-radius: 8px; padding: 0.7rem 0.85rem; } .bibtex-block pre { margin: 0; font-size: 0.74rem; line-height: 1.45; white-space: pre-wrap; word-break: break-word; color: var(--text); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; } .bibtex-copy { position: absolute; top: 0.45rem; right: 0.5rem; background: var(--accent-subtle); color: var(--accent); border: 1px solid var(--accent-border); border-radius: 6px; font-size: 0.7rem; font-weight: 600; padding: 0.18rem 0.5rem; cursor: pointer; transition: background 0.18s var(--ease), color 0.18s var(--ease); } .bibtex-copy:hover { background: var(--accent); color: #fff; } [data-theme="dark"] .bibtex-block { background: rgba(255, 255, 255, 0.04); } /* === A11y: focus-visible rings === */ *:focus { outline: none; } a:focus-visible, button:focus-visible, .theme-toggle:focus-visible, .bibtex-toggle:focus-visible, .bibtex-copy:focus-visible, .back-to-top:focus-visible, .social-sidebar a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; } /* === Floating social sidebar === */ .social-sidebar { position: fixed; left: 1.1rem; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 0.35rem; padding: 0.45rem; border-radius: 16px; background: rgba(255, 255, 255, 0.78); backdrop-filter: blur(14px) saturate(180%); -webkit-backdrop-filter: blur(14px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.6); box-shadow: 0 0 1px rgba(0, 0, 0, 0.04), 0 2px 8px rgba(15, 23, 42, 0.04), 0 10px 32px rgba(99, 102, 241, 0.12); z-index: 999; opacity: 0; transform: translateY(-50%) translateX(-12px); animation: social-sidebar-in 0.6s 0.3s var(--ease) forwards; } @keyframes social-sidebar-in { to { opacity: 1; transform: translateY(-50%) translateX(0); } } .social-sidebar a { position: relative; width: 40px; height: 40px; display: inline-flex; align-items: center; justify-content: flex-start; padding-left: 11px; overflow: hidden; border-radius: 11px; color: var(--accent); --fa-primary-color: var(--accent); --fa-secondary-color: var(--accent); --fa-secondary-opacity: 0.45; font-size: 1.05rem; transition: width 0.35s var(--ease), background 0.25s var(--ease), color 0.25s var(--ease), box-shadow 0.25s var(--ease); text-decoration: none; white-space: nowrap; } .social-sidebar a i { flex-shrink: 0; width: 18px; text-align: center; } .social-sidebar-label { opacity: 0; margin-left: 0; max-width: 0; font-size: 0.82rem; font-weight: 600; letter-spacing: 0.01em; transition: opacity 0.25s var(--ease), margin-left 0.35s var(--ease), max-width 0.35s var(--ease); } .social-sidebar a:hover { width: 140px; background: var(--accent-subtle); color: var(--accent); } .social-sidebar a:hover .social-sidebar-label { opacity: 1; margin-left: 0.55rem; max-width: 100px; } [data-theme="dark"] .social-sidebar { background: rgba(30, 27, 75, 0.70); border-color: rgba(129, 140, 248, 0.22); box-shadow: 0 0 1px rgba(0, 0, 0, 0.2), 0 2px 8px rgba(0, 0, 0, 0.3), 0 10px 32px rgba(129, 140, 248, 0.18); } [data-theme="dark"] .social-sidebar a { color: var(--accent-hover); --fa-primary-color: var(--accent-hover); --fa-secondary-color: var(--accent-hover); } [data-theme="dark"] .social-sidebar a:hover { background: rgba(129, 140, 248, 0.15); color: var(--accent-hover); } /* Hide on narrow viewports (profile card already lists them) */ @media (max-width: 992px) { .social-sidebar { display: none; } } /* === Indigo-tinted card hover shadow === */ .bg-white.shadow-sm.rounded-xl { transition: box-shadow 0.25s var(--ease), transform 0.25s var(--ease); } .bg-white.shadow-sm.rounded-xl:hover { box-shadow: 0 1px 3px rgba(0,0,0,0.05), 0 6px 18px rgba(99, 102, 241, 0.14); } [data-theme="dark"] .bg-white.shadow-sm.rounded-xl:hover { box-shadow: 0 1px 3px rgba(0,0,0,0.4), 0 6px 18px rgba(129, 140, 248, 0.22); } /* === Touch targets ≥ 44px on mobile === */ @media (max-width: 640px) { .abstract-links a, .card-body a, .nav-link { min-height: 44px; display: inline-flex; align-items: center; } }