feat: complete publications and research sections and resolve conflicts

This commit is contained in:
VuHoangThien
2026-04-14 23:51:53 +07:00
51 changed files with 4897 additions and 1769 deletions

View File

@@ -0,0 +1,208 @@
import React from 'react';
// Khối chứa 2 cột: Active Projects Feed và Funding Calls
const ProjectsAndCenters = () => {
return (
<section id="projects-centers">
<div className="max-w-[1440px] mx-auto px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-12">
{/* --- CỘT TRÁI (7/12): ACTIVE PROJECTS LIST --- */}
<div className="lg:col-span-7">
<div className="flex items-center justify-between mb-8">
<h2 className="text-2xl font-bold text-ui-text">Active Projects Feed</h2>
<a href="#" className="text-sm font-medium text-brand-accent hover:text-brand-blue transition-colors">
View All Projects
</a>
</div>
<div className="space-y-4">
{/* Project Item 1 */}
<div className="project-card">
<div className="project-icon project-icon-blue">
<i className="text-2xl text-brand-blue inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M160 32c0-17.7 14.3-32 32-32h32c17.7 0 32 14.3 32 32c17.7 0 32 14.3 32 32V288c0 17.7-14.3 32-32 32c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32c-17.7 0-32-14.3-32-32V64c0-17.7 14.3-32 32-32zM32 448H320c70.7 0 128-57.3 128-128s-57.3-128-128-128V128c106 0 192 86 192 192c0 49.2-18.5 94-48.9 128H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H320 32c-17.7 0-32-14.3-32-32s14.3-32 32-32zm80-64H304c8.8 0 16 7.2 16 16s-7.2 16-16 16H112c-8.8 0-16-7.2-16-16s7.2-16 16-16z"></path>
</svg>
</i>
</div>
<div className="flex-grow">
<div className="flex flex-wrap items-center gap-2 mb-2">
<span className="badge badge-active">Active</span>
<span className="text-xs text-ui-muted font-medium inline-flex items-center gap-1">
<i className="inline-flex">
<svg className="w-3 h-3" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120V256c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"></path>
</svg>
</i>
Updated 2d ago
</span>
</div>
<h4 className="text-lg font-bold text-ui-text mb-1">Urban Microclimate Modeling</h4>
<p className="text-sm text-ui-muted line-clamp-2 mb-3">
Developing high-resolution predictive models for heat island effects in European metropolitan areas using machine learning.
</p>
<div className="flex items-center justify-between">
<div className="flex -space-x-2">
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-4.jpg" alt="Researcher" title="Dr. Alan Turing" />
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-5.jpg" alt="Researcher" title="Dr. Marie Curie" />
<div className="w-8 h-8 rounded-full border-2 border-white bg-ui-bg flex items-center justify-center text-[10px] font-bold text-ui-muted">+3</div>
</div>
<div className="w-32">
<div className="flex justify-between text-xs mb-1">
<span className="text-ui-muted">Progress</span>
<span className="font-medium">65%</span>
</div>
<div className="progress-bar-track">
<div className="progress-bar-fill progress-fill-blue" style={{ width: '65%' }}></div>
</div>
</div>
</div>
</div>
</div>
{/* Project Item 2 */}
<div className="project-card">
<div className="project-icon project-icon-purple">
<i className="text-2xl text-purple-600 inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M318.6 9.4c-12.5-12.5-32.8-12.5-45.3 0l-120 120c-12.5-12.5-12.5 32.8 0 45.3l16 16c12.5 12.5 32.8 12.5 45.3 0l4-4L325.4 293.4l-4 4c-12.5 12.5-12.5 32.8 0 45.3l16 16c12.5 12.5 32.8 12.5 45.3 0l120-120c12.5-12.5 12.5-32.8 0-45.3l-16-16c-12.5-12.5-32.8-12.5-45.3 0l-4 4L330.6 74.6l4-4c12.5-12.5 12.5-32.8 0-45.3l-16-16zm-152 288c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l48 48c12.5 12.5 32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-1.4-1.4L272 285.3 226.7 240 168 298.7l-1.4-1.4z"></path>
</svg>
</i>
</div>
<div className="flex-grow">
<div className="flex flex-wrap items-center gap-2 mb-2">
<span className="badge badge-collection">Data Collection</span>
<span className="text-xs text-ui-muted font-medium inline-flex items-center gap-1">
<i className="inline-flex">
<svg className="w-3 h-3" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120V256c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"></path>
</svg>
</i>
Updated 1w ago
</span>
</div>
<h4 className="text-lg font-bold text-ui-text mb-1">Digital Rights in the EU Framework</h4>
<p className="text-sm text-ui-muted line-clamp-2 mb-3">
A comparative analysis of member state implementation of digital privacy directives and their impact on civil liberties.
</p>
<div className="flex items-center justify-between">
<div className="flex -space-x-2">
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-6.jpg" alt="Researcher" />
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-7.jpg" alt="Researcher" />
</div>
<div className="w-32">
<div className="flex justify-between text-xs mb-1">
<span className="text-ui-muted">Progress</span>
<span className="font-medium">30%</span>
</div>
<div className="progress-bar-track">
<div className="progress-bar-fill progress-fill-accent" style={{ width: '30%' }}></div>
</div>
</div>
</div>
</div>
</div>
{/* Project Item 3 */}
<div className="project-card">
<div className="project-icon project-icon-orange">
<i className="text-2xl text-orange-600 inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M512 80c0 18-14.3 34.6-38.4 48c-29.1 16.1-72.5 27.5-122.3 30.9c-3.7-1.8-7.4-3.5-11.3-5C300.6 137.4 248.2 128 192 128c-8.3 0-16.4 .2-24.5 .6l-1.1-.6C142.3 114.6 128 98 128 80c0-44.2 86-80 192-80S512 35.8 512 80zM160.7 161.1c10.2-.7 20.7-1.1 31.3-1.1c62.2 0 117.4 12.3 152.5 31.4C369.3 204.9 384 221.7 384 240c0 4-.7 7.9-2.1 11.7c-4.6 13.2-17 25.3-35 35.5c0 0 0 0 0 0c-.1 .1-.3 .1-.4 .2l0 0 0 0c-.3 .2-.6 .3-.9 .5c-35 19.4-90.8 32-153.6 32c-59.6 0-112.9-11.3-148.2-29.1c-1.9-.9-3.7-1.9-5.5-2.9C14.3 274.6 0 258 0 240c0-34.8 53.4-64.5 128-75.4c10.5-1.5 21.4-2.7 32.7-3.5zM416 240c0-21.9-10.6-39.9-24.1-53.4c28.3-4.4 54.2-11.4 76.2-20.5c16.3-6.8 31.5-15.2 43.9-25.5V176c0 19.3-16.5 37.1-43.8 50.9c-14.6 7.4-32.4 13.7-52.4 18.5c.1-1.8 .2-3.5 .2-5.3zm-32 96c0 18-14.3 34.6-38.4 48c-1.8 1-3.6 1.9-5.5 2.9C304.9 404.7 251.6 416 192 416c-62.8 0-118.6-12.6-153.6-32C14.3 370.6 0 354 0 336V300.6c12.5 10.3 27.6 18.7 43.9 25.5C83.4 342.6 135.8 352 192 352s108.6-9.4 148.1-25.9c7.8-3.2 15.3-6.9 22.4-10.9c6.1-3.4 11.8-7.2 17.2-11.2c1.5-1.1 2.9-2.3 4.3-3.4V304v5.7V336zm32 0V304 278.1c19-4.2 36.5-9.5 52.1-16c16.3-6.8 31.5-15.2 43.9-25.5V272c0 10.5-5 21-14.9 30.9c-16.3 16.3-45 29.7-81.3 38.4c.1-1.7 .2-3.5 .2-5.3zM192 448c56.2 0 108.6-9.4 148.1-25.9c16.3-6.8 31.5-15.2 43.9-25.5V432c0 44.2-86 80-192 80S0 476.2 0 432V396.6c12.5 10.3 27.6 18.7 43.9 25.5C83.4 438.6 135.8 448 192 448z"></path>
</svg>
</i>
</div>
<div className="flex-grow">
<div className="flex flex-wrap items-center gap-2 mb-2">
<span className="badge badge-review">Review</span>
<span className="text-xs text-ui-muted font-medium inline-flex items-center gap-1">
<i className="inline-flex">
<svg className="w-3 h-3" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120V256c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"></path>
</svg>
</i>
Updated 3w ago
</span>
</div>
<h4 className="text-lg font-bold text-ui-text mb-1">Behavioral Impacts of Universal Basic Income</h4>
<p className="text-sm text-ui-muted line-clamp-2 mb-3">
Longitudinal study tracking spending habits and employment outcomes in selected pilot regions across France.
</p>
<div className="flex items-center justify-between">
<div className="flex -space-x-2">
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-8.jpg" alt="Researcher" />
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-9.jpg" alt="Researcher" />
<img className="w-8 h-8 rounded-full border-2 border-white object-cover" src="https://storage.googleapis.com/uxpilot-auth.appspot.com/avatars/avatar-1.jpg" alt="Researcher" />
</div>
<div className="w-32">
<div className="flex justify-between text-xs mb-1">
<span className="text-ui-muted">Progress</span>
<span className="font-medium">90%</span>
</div>
<div className="progress-bar-track">
<div className="progress-bar-fill progress-fill-blue" style={{ width: '90%' }}></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{/* --- CỘT PHẢI (5/12): FUNDING CALLS --- */}
<div className="lg:col-span-5">
<div className="flex items-center justify-between mb-8">
<h2 className="text-2xl font-bold text-ui-text">Funding Calls</h2>
</div>
<div className="funding-card">
<div className="space-y-4 flex-grow">
{/* Item 1 */}
<div className="funding-item">
<span className="funding-label-urgent">Closing Soon</span>
<h4>EU Horizon 2025: Sustainable Tech</h4>
<div className="funding-meta">
<span className="funding-due">
<i className="fa-regular fa-calendar"></i> Due Nov 15
</span>
<a href="#" className="funding-link">
Details <i className="fa-solid fa-arrow-right" style={{fontSize:'0.625rem'}}></i>
</a>
</div>
</div>
{/* Item 2 */}
<div className="funding-item">
<span className="funding-label-internal">Internal Grant</span>
<h4>Seed Funding for AI Ethics</h4>
<div className="funding-meta">
<span className="funding-due">
<i className="fa-regular fa-calendar"></i> Due Dec 01
</span>
<a href="#" className="funding-link">
Details <i className="fa-solid fa-arrow-right" style={{fontSize:'0.625rem'}}></i>
</a>
</div>
</div>
</div>
<button className="funding-view-all">
View All Opportunities
</button>
</div>
</div>
</div>
</div>
</section>
);
};
export default ProjectsAndCenters;

View File

@@ -0,0 +1,167 @@
import React from 'react';
// Khối chứa danh sách các lĩnh vực nghiên cứu.
const ResearchDomains = () => {
return (
<section id="research-domains">
<div className="max-w-[1440px] mx-auto px-6 lg:px-8">
{/* Tiêu đề Section */}
<div className="text-center mb-16">
<h2 className="text-3xl lg:text-4xl font-bold text-ui-text mb-4">Research Domains</h2>
<p className="text-ui-muted max-w-2xl mx-auto">
Discover our core areas of expertise, where interdisciplinary teams tackle complex global challenges.
</p>
</div>
{/* Grid chứa các thẻ (Cards) */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{/* Domain Card 1 (Nổi bật - Màu xanh) */}
<div className="folder-tab folder-tab-blue group">
{/* Hiệu ứng Glow */}
<div className="absolute top-0 right-0 w-32 h-32 bg-white/10 rounded-full blur-2xl -translate-y-1/2 translate-x-1/2 group-hover:scale-150 transition-transform duration-500"></div>
<div className="domain-icon-blue">
<i className="text-2xl text-white inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512">
<path fill="currentColor" d="M384 32H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H398.4c-5.2 25.8-22.9 47.1-46.4 57.3V448H512c17.7 0 32 14.3 32 32s-14.3 32-32 32H320 128c-17.7 0-32-14.3-32-32s14.3-32 32-32H288V153.3c-23.5-10.3-41.2-31.6-46.4-57.3H128c-17.7 0-32-14.3-32-32s14.3-32 32-32H256c14.6-19.4 37.8-32 64-32s49.4 12.6 64 32zm55.6 288H584.4L512 195.8 439.6 320zM512 416c-62.9 0-115.2-34-126-78.9c-2.6-11 1-22.3 6.7-32.1l95.2-163.2c5-8.6 14.2-13.8 24.1-13.8s19.1 5.3 24.1 13.8l95.2 163.2c5.7 9.8 9.3 21.1 6.7 32.1C627.2 382 574.9 416 512 416zM126.8 195.8L54.4 320H199.3L126.8 195.8zM.9 337.1c-2.6-11 1-22.3 6.7-32.1l95.2-163.2c5-8.6 14.2-13.8 24.1-13.8s19.1 5.3 24.1 13.8l95.2 163.2c5.7 9.8 9.3 21.1 6.7 32.1C242 382 189.7 416 126.8 416S11.7 382 .9 337.1z"></path>
</svg>
</i>
</div>
<h3 className="text-2xl font-bold mb-4">Law & Policy</h3>
<p className="text-white/80 text-sm leading-relaxed mb-8 flex-grow">
Investigating the evolution of international law, human rights, and public policy in a rapidly changing geopolitical landscape.
</p>
<div className="domain-card-footer">
<span className="domain-badge-glass">42 Centers</span>
<i className="text-white/70 group-hover:text-white group-hover:translate-x-1 transition-all inline-flex">
<svg className="w-4 h-4" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path>
</svg>
</i>
</div>
</div>
{/* Domain Card 2 */}
<div className="folder-tab folder-tab-light group">
<div className="domain-icon-light">
<i className="text-2xl text-brand-blue inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M184 0c30.9 0 56 25.1 56 56V456c0 30.9-25.1 56-56 56c-28.9 0-52.7-21.9-55.7-50.1c-5.2 1.4-10.7 2.1-16.3 2.1c-35.3 0-64-28.7-64-64c0-7.4 1.3-14.6 3.6-21.2C21.4 367.4 0 338.2 0 304c0-31.9 18.7-59.5 45.8-72.3C37.1 220.8 32 207 32 192c0-30.7 21.6-56.3 50.4-62.6C80.8 123.9 80 118 80 112c0-29.9 20.6-55.1 48.3-62.1C131.3 21.9 155.1 0 184 0zM328 0c28.9 0 52.6 21.9 55.7 49.9c27.8 7 48.3 32.1 48.3 62.1c0 6-.8 11.9-2.4 17.4c28.8 6.2 50.4 31.9 50.4 62.6c0 15-5.1 28.8-13.8 39.7C493.3 244.5 512 272.1 512 304c0 34.2-21.4 63.4-51.6 74.8c2.3 6.6 3.6 13.8 3.6 21.2c0 35.3-28.7 64-64 64c-5.6 0-11.1-.7-16.3-2.1c-3 28.2-26.8 50.1-55.7 50.1c-30.9 0-56-25.1-56-56V56c0-30.9 25.1-56 56-56z"></path>
</svg>
</i>
</div>
<h3 className="text-2xl font-bold mb-4">Cognitive Science</h3>
<p className="text-ui-muted text-sm leading-relaxed mb-8 flex-grow">
Bridging psychology, neuroscience, and artificial intelligence to understand human cognition and behavior.
</p>
<div className="domain-card-footer">
<span className="domain-badge-white">28 Centers</span>
<i className="text-ui-muted group-hover:text-brand-blue group-hover:translate-x-1 transition-all inline-flex">
<svg className="w-4 h-4" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path>
</svg>
</i>
</div>
</div>
{/* Domain Card 3 */}
<div className="folder-tab folder-tab-light group">
<div className="domain-icon-light">
<i className="text-2xl text-brand-blue inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M266.3 48.3L232.5 73.6c-5.4 4-8.5 10.4-8.5 17.1v9.1c0 6.8 5.5 12.3 12.3 12.3c2.4 0 4.8-.7 6.8-2.1l41.8-27.9c2-1.3 4.4-2.1 6.8-2.1h1c6.2 0 11.3 5.1 11.3 11.3c0 3-1.2 5.9-3.3 8l-19.9 19.9c-5.8 5.8-12.9 10.2-20.7 12.8l-26.5 8.8c-5.8 1.9-9.6 7.3-9.6 13.4c0 3.7-1.5 7.3-4.1 10l-17.9 17.9c-6.4 6.4-9.9 15-9.9 24v4.3c0 16.4 13.6 29.7 29.9 29.7c11 0 21.2-6.2 26.1-16l4-8.1c2.4-4.8 7.4-7.9 12.8-7.9c4.5 0 8.7 2.1 11.4 5.7l16.3 21.7c2.1 2.9 5.5 4.5 9.1 4.5c8.4 0 13.9-8.9 10.1-16.4l-1.1-2.3c-3.5-7 0-15.5 7.5-18l21.2-7.1c7.6-2.5 12.7-9.6 12.7-17.6c0-10.3 8.3-18.6 18.6-18.6H400c8.8 0 16 7.2 16 16s-7.2 16-16 16H379.3c-7.2 0-14.2 2.9-19.3 8l-4.7 4.7c-2.1 2.1-3.3 5-3.3 8c0 6.2 5.1 11.3 11.3 11.3h11.3c6 0 11.8 2.4 16 6.6l6.5 6.5c1.8 1.8 2.8 4.3 2.8 6.8s-1 5-2.8 6.8l-7.5 7.5C386 262 384 266.9 384 272s2 10 5.7 13.7L408 304c10.2 10.2 24.1 16 38.6 16H454c6.5-20.2 10-41.7 10-64c0-111.4-87.6-202.4-197.7-207.7zm172 307.9c-3.7-2.6-8.2-4.1-13-4.1c-6 0-11.8-2.4-16-6.6L396 332c-7.7-7.7-18-12-28.9-12c-9.7 0-19.2-3.5-26.6-9.8L314 287.4c-11.6-9.9-26.4-15.4-41.7-15.4H251.4c-12.6 0-25 3.7-35.5 10.7L188.5 301c-17.8 11.9-28.5 31.9-28.5 53.3v3.2c0 17 6.7 33.3 18.7 45.3l16 16c8.5 8.5 20 13.3 32 13.3H248c13.3 0 24 10.7 24 24c0 2.5 .4 5 1.1 7.3c71.3-5.8 132.5-47.6 165.2-107.2zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zM187.3 100.7c-6.2-6.2-16.4-6.2-22.6 0l-32 32c-6.2 6.2-6.2 16.4 0 22.6s16.4 6.2 22.6 0l32-32c6.2-6.2 6.2-16.4 0-22.6z"></path>
</svg>
</i>
</div>
<h3 className="text-2xl font-bold mb-4">Environmental Studies</h3>
<p className="text-ui-muted text-sm leading-relaxed mb-8 flex-grow">
Developing sustainable solutions for climate change, resource management, and ecological preservation.
</p>
<div className="domain-card-footer">
<span className="domain-badge-white">35 Centers</span>
<i className="text-ui-muted group-hover:text-brand-blue group-hover:translate-x-1 transition-all inline-flex">
<svg className="w-4 h-4" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path>
</svg>
</i>
</div>
</div>
{/* Domain Card 4 */}
<div className="folder-tab folder-tab-light group">
<div className="domain-icon-light">
<i className="text-2xl text-brand-blue inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M248 0h16c13.3 0 24 10.7 24 24V34.7C368.4 48.1 431.9 111.6 445.3 192H448c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h2.7C80.1 111.6 143.6 48.1 224 34.7V24c0-13.3 10.7-24 24-24zM64 288h64V416h40V288h64V416h48V288h64V416h40V288h64V420.3c.6 .3 1.2 .7 1.7 1.1l48 32c11.7 7.8 17 22.4 12.9 35.9S494.1 512 480 512H32c-14.1 0-26.5-9.2-30.6-22.7s1.1-28.1 12.9-35.9l48-32c.6-.4 1.2-.7 1.8-1.1V288z"></path>
</svg>
</i>
</div>
<h3 className="text-2xl font-bold mb-4">History & Humanities</h3>
<p className="text-ui-muted text-sm leading-relaxed mb-8 flex-grow">
Preserving cultural heritage and analyzing historical contexts to inform contemporary societal debates.
</p>
<div className="domain-card-footer">
<span className="domain-badge-white">50 Centers</span>
<i className="text-ui-muted group-hover:text-brand-blue group-hover:translate-x-1 transition-all inline-flex">
<svg className="w-4 h-4" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path>
</svg>
</i>
</div>
</div>
{/* Domain Card 5 */}
<div className="folder-tab folder-tab-light group">
<div className="domain-icon-light">
<i className="text-2xl text-brand-blue inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M64 64c0-17.7-14.3-32-32-32S0 46.3 0 64V400c0 44.2 35.8 80 80 80H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H80c-8.8 0-16-7.2-16-16V64zm406.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L320 210.7l-57.4-57.4c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5-12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L240 221.3l57.4 57.4c12.5 12.5 32.8 12.5 45.3 0l128-128z"></path>
</svg>
</i>
</div>
<h3 className="text-2xl font-bold mb-4">Economics</h3>
<p className="text-ui-muted text-sm leading-relaxed mb-8 flex-grow">
Analyzing global markets, behavioral economics, and policy impacts on socioeconomic development.
</p>
<div className="domain-card-footer">
<span className="domain-badge-white">19 Centers</span>
<i className="text-ui-muted group-hover:text-brand-blue group-hover:translate-x-1 transition-all inline-flex">
<svg className="w-4 h-4" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path>
</svg>
</i>
</div>
</div>
{/* Domain Card 6 - CTA */}
<div className="domain-card-cta group">
<div className="domain-icon-cta">
<i className="text-2xl text-brand-blue inline-flex">
<svg className="w-6 h-6" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32V224H48c-17.7 0-32 14.3-32 32s14.3 32 32 32H192V432c0 17.7 14.3 32 32 32s32-14.3 32-32V288H400c17.7 0 32-14.3 32-32s-14.3-32-32-32H256V80z"></path>
</svg>
</i>
</div>
<h3 className="text-xl font-bold mb-2">View All Domains</h3>
<p className="text-ui-muted text-sm">Explore our complete directory of 15+ research areas.</p>
</div>
</div>
</div>
</section>
);
};
export default ResearchDomains;

View File

@@ -0,0 +1,101 @@
'use client';
import React from 'react';
import { useRouter } from 'next/navigation';
const ResearchHero = () => {
const router = useRouter();
return (
<section id="research-hero">
<div className="max-w-[1440px] mx-auto px-6 lg:px-8">
<div className="flex flex-col lg:flex-row gap-12 items-center">
{/* --- CỘT TRÁI --- */}
<div className="w-full lg:w-1/2 hero-left">
{/* Label: gạch ngang + "Research Hub" */}
<div className="hero-label">
<span className="hero-label-line"></span>
<span className="hero-label-text">Research Hub</span>
</div>
{/* Heading */}
<h1>
Pioneering <br />
<span>Discovery</span>
</h1>
{/* Description */}
<p className="hero-desc">
Explore our cutting-edge research domains, active projects, and interdisciplinary centers driving innovation in liberal arts and sciences.
</p>
{/* Buttons */}
<div className="hero-buttons">
<button className="r-btn-primary" onClick={() => router.push('/research/search')}>
Browse Projects <i className="fa-solid fa-arrow-right text-sm"></i>
</button>
<button className="r-btn-outline">
View Publications
</button>
</div>
</div>
{/* --- CỘT PHẢI: Visual composition --- */}
<div className="w-full lg:w-1/2 relative">
<div className="relative w-full aspect-square max-w-[600px] mx-auto">
{/* Glow nền */}
<div className="absolute inset-0 bg-brand-light rounded-full blur-3xl opacity-50"></div>
{/* Main image card */}
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[80%] h-[80%] bg-white rounded-[32px] border border-ui-border shadow-2xl overflow-hidden z-10">
<img
className="w-full h-full object-cover"
src="https://storage.googleapis.com/uxpilot-auth.appspot.com/11d578de27-837b09c2ea77020bcb48.png"
alt="Research laboratory"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent"></div>
<div className="absolute bottom-0 left-0 p-6 w-full text-white">
<div className="flex items-center gap-2 mb-2">
<span className="px-3 py-1 text-white text-xs font-bold rounded-full" style={{ backgroundColor: 'var(--r-accent)' }}>
Featured
</span>
</div>
<h3 className="text-xl font-bold mb-1" style={{ fontFamily: 'Inter, sans-serif' }}>Cognitive Sciences Lab</h3>
<p className="text-sm opacity-90" style={{ fontFamily: 'Inter, sans-serif' }}>Exploring the intersection of AI and human psychology.</p>
</div>
</div>
{/* Floating stat card 1 — Publications */}
<div className="r-stat-card" style={{ top: '10%', right: '5%' }}>
<div className="w-12 h-12 rounded-full flex items-center justify-center" style={{ backgroundColor: 'var(--r-blue-light)', color: 'var(--r-blue)' }}>
<i className="fa-solid fa-book-open text-xl"></i>
</div>
<div>
<p className="text-2xl font-bold" style={{ color: 'var(--r-text)', fontFamily: 'Inter, sans-serif' }}>12k+</p>
<p className="text-xs font-medium" style={{ color: 'var(--r-muted)', fontFamily: 'Inter, sans-serif' }}>Publications</p>
</div>
</div>
{/* Floating stat card 2 — Active Projects */}
<div className="r-stat-card" style={{ bottom: '15%', left: '0%' }}>
<div className="w-12 h-12 rounded-full flex items-center justify-center" style={{ backgroundColor: '#f0fdf4', color: '#16a34a' }}>
<i className="fa-solid fa-flask text-xl"></i>
</div>
<div>
<p className="text-2xl font-bold" style={{ color: 'var(--r-text)', fontFamily: 'Inter, sans-serif' }}>340</p>
<p className="text-xs font-medium" style={{ color: 'var(--r-muted)', fontFamily: 'Inter, sans-serif' }}>Active Projects</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
);
};
export default ResearchHero;

View File

@@ -0,0 +1,68 @@
import React from 'react';
// Khối chứa 2 banner: Research Guidance và Publication Repository
const ResearchResources = () => {
return (
<section id="research-quick-links">
<div className="max-w-[1440px] mx-auto px-6 lg:px-8">
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
{/* --- Banner 1: Guidance Link --- */}
<a href="#" className="resource-card group">
<div className="resource-card-glow"></div>
<div className="relative z-10 flex items-start gap-6">
<div className="resource-icon">
<i className="text-3xl text-brand-blue inline-flex">
<svg className="w-8 h-8" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm50.7-186.9L162.4 380.6c-19.4 7.5-38.5-11.6-31-31l55.5-144.3c3.3-8.5 9.9-15.1 18.4-18.4l144.3-55.5c19.4-7.5 38.5 11.6 31 31L325.1 306.7c-3.2 8.5-9.9 15.1-18.4 18.4zM288 256a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"></path>
</svg>
</i>
</div>
<div>
<h3 className="text-2xl font-bold text-ui-text mb-2 group-hover:text-brand-blue transition-colors">
Research Guidance
</h3>
<p className="text-ui-muted leading-relaxed mb-4">
Access comprehensive resources, ethical guidelines, grant application support, and methodological frameworks for your research journey.
</p>
<span className="resource-link">
Access Portal
<i className="fa-solid fa-arrow-right group-hover:translate-x-1 transition-transform"></i>
</span>
</div>
</div>
</a>
{/* --- Banner 2: Repository Link --- */}
<a href="#" className="resource-card group">
<div className="resource-card-glow"></div>
<div className="relative z-10 flex items-start gap-6">
<div className="resource-icon">
<i className="text-3xl text-brand-blue inline-flex">
<svg className="w-8 h-8" aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M0 96C0 43 43 0 96 0h96V190.7c0 13.4 15.5 20.9 26 12.5L272 160l54 43.2c10.5 8.4 26 .9 26-12.5V0h32 32c17.7 0 32 14.3 32 32V352c0 17.7-14.3 32-32 32v64c17.7 0 32 14.3 32 32s-14.3 32-32 32H384 96c-53 0-96-43-96-96V96zM64 416c0 17.7 14.3 32 32 32H352V384H96c-17.7 0-32 14.3-32 32z"></path>
</svg>
</i>
</div>
<div>
<h3 className="text-2xl font-bold text-ui-text mb-2 group-hover:text-brand-blue transition-colors">
Publication Repository
</h3>
<p className="text-ui-muted leading-relaxed mb-4">
Browse, search, and request access to thousands of peer-reviewed papers, dissertations, and datasets produced by ULP scholars.
</p>
<span className="resource-link">
Search Repository
<i className="fa-solid fa-arrow-right group-hover:translate-x-1 transition-transform"></i>
</span>
</div>
</div>
</a>
</div>
</div>
</section>
);
};
export default ResearchResources;

View File

@@ -0,0 +1,115 @@
'use client';
import React, { useState } from 'react';
import { useRouter } from 'next/navigation';
const ResearchSearch = () => {
const [query, setQuery] = useState('');
const [activeFilter, setActiveFilter] = useState('Researchers');
const filters = ['Researchers', 'Labs', 'Projects', 'Institutes'];
const router = useRouter();
const handleSearch = () => {
const params = new URLSearchParams({ q: query, type: activeFilter });
router.push(`/research/search?${params.toString()}`);
};
return (
<div className="max-w-5xl mx-auto mb-10" style={{ padding: '0 1rem' }}>
{/* Search bar */}
<div className="relative">
<div className="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
<i className="fa-solid fa-magnifying-glass" style={{ color: '#9ca3af' }}></i>
</div>
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
placeholder="Search across researchers, labs, projects, and disciplines..."
style={{
width: '100%',
paddingLeft: '3rem',
paddingRight: '8rem',
paddingTop: '1rem',
paddingBottom: '1rem',
backgroundColor: '#ffffff',
border: '1px solid #e5e7eb',
borderRadius: '1rem',
boxShadow: '0 1px 2px 0 rgba(0,0,0,0.05)',
fontSize: '1rem',
color: '#374151',
outline: 'none',
transition: 'border-color 0.2s, box-shadow 0.2s',
boxSizing: 'border-box',
}}
onFocus={(e) => {
e.target.style.borderColor = '#263c6f';
e.target.style.boxShadow = '0 0 0 2px rgba(38,60,111,0.15)';
}}
onBlur={(e) => {
e.target.style.borderColor = '#e5e7eb';
e.target.style.boxShadow = '0 1px 2px 0 rgba(0,0,0,0.05)';
}}
/>
<div className="absolute flex items-center" style={{ top: '0.5rem', bottom: '0.5rem', right: '0.5rem' }}>
<button
onClick={handleSearch}
style={{
backgroundColor: '#263c6f',
color: '#ffffff',
padding: '0.5rem 1.5rem',
borderRadius: '0.75rem',
fontSize: '0.875rem',
fontWeight: 500,
border: 'none',
cursor: 'pointer',
height: '100%',
transition: 'opacity 0.2s',
}}
onMouseEnter={(e) => (e.currentTarget.style.opacity = '0.9')}
onMouseLeave={(e) => (e.currentTarget.style.opacity = '1')}
>
Search
</button>
</div>
</div>
{/* Filter pills */}
<div className="flex gap-3 mt-4 px-2" style={{ flexWrap: 'wrap', alignItems: 'center' }}>
<span style={{ fontSize: '0.75rem', fontWeight: 500, color: '#6b7280', textTransform: 'uppercase', letterSpacing: '0.05em', marginTop: '0.25rem' }}>
Filters:
</span>
{filters.map((filter) => (
<button
key={filter}
onClick={() => setActiveFilter(filter)}
style={{
fontSize: '0.75rem',
fontWeight: 500,
padding: '0.25rem 0.75rem',
borderRadius: '9999px',
border: 'none',
cursor: 'pointer',
transition: 'background-color 0.2s',
backgroundColor: activeFilter === filter ? 'rgba(38,60,111,0.1)' : '#f3f4f6',
color: activeFilter === filter ? '#263c6f' : '#4b5563',
}}
onMouseEnter={(e) => {
if (activeFilter !== filter) e.currentTarget.style.backgroundColor = '#e5e7eb';
}}
onMouseLeave={(e) => {
if (activeFilter !== filter) e.currentTarget.style.backgroundColor = '#f3f4f6';
}}
>
{filter}
</button>
))}
</div>
</div>
);
};
export default ResearchSearch;

View File

@@ -0,0 +1,718 @@
/* ============================================================
research.css — Scoped under .research-wrapper
Matches the HTML reference design exactly.
All rules scoped to avoid conflicts with Bootstrap/main.css
============================================================ */
/* --- Local CSS Variables --- */
.research-wrapper {
--r-blue: #263c6f;
--r-blue-hover: #1d2e55;
--r-blue-light: #f0f4f8;
--r-accent: #3b82f6;
--r-border: #e5e7eb;
--r-text: #111827;
--r-muted: #6b7280;
--r-bg: #f9fafb;
--r-white: #ffffff;
--r-shadow-soft: 0 4px 6px -1px rgba(0,0,0,0.05), 0 2px 4px -1px rgba(0,0,0,0.03);
--r-shadow-hover: 0 10px 15px -3px rgba(0,0,0,0.08), 0 4px 6px -2px rgba(0,0,0,0.04);
width: 100%;
background-color: var(--r-bg);
}
/* ============================================================
HERO SECTION
============================================================ */
.research-wrapper #research-hero {
width: 100%;
background-color: var(--r-bg);
border-bottom: 1px solid var(--r-border);
padding-top: 3rem;
padding-bottom: 4rem;
font-family: 'Inter', sans-serif;
}
/* Label row: gạch ngang + text "Research Hub" */
.research-wrapper #research-hero .hero-label {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.research-wrapper #research-hero .hero-label-line {
display: block;
width: 2rem;
height: 2.5px;
background-color: var(--r-accent);
flex-shrink: 0;
}
.research-wrapper #research-hero .hero-label-text {
font-size: 0.875rem;
font-weight: 600;
color: var(--r-blue);
text-transform: uppercase;
letter-spacing: 0.05em;
font-family: 'Inter', sans-serif;
}
/* Heading */
.research-wrapper #research-hero h1 {
font-family: 'Inter', sans-serif;
font-size: 3rem;
font-weight: 700;
color: var(--r-text);
letter-spacing: -0.025em;
line-height: 1.1;
margin: 0;
}
@media (min-width: 1024px) {
.research-wrapper #research-hero h1 {
font-size: 4.5rem;
}
}
.research-wrapper #research-hero h1 span {
color: var(--r-blue);
}
/* Paragraph */
.research-wrapper #research-hero .hero-desc {
font-family: 'Inter', sans-serif;
font-size: 1.125rem;
color: var(--r-muted);
line-height: 1.625;
max-width: 36rem;
margin: 0;
}
/* Left column spacing */
.research-wrapper #research-hero .hero-left {
display: flex;
flex-direction: column;
gap: 2rem;
}
/* Button row */
.research-wrapper #research-hero .hero-buttons {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
/* Hero buttons */
.research-wrapper .r-btn-primary {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 1rem 2rem;
background-color: var(--r-blue);
color: var(--r-white);
border: none;
border-radius: 9999px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background-color 0.2s;
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
text-decoration: none;
}
.research-wrapper .r-btn-primary:hover {
background-color: var(--r-blue-hover);
color: var(--r-white);
}
.research-wrapper .r-btn-outline {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 1rem 2rem;
background-color: var(--r-white);
color: var(--r-text);
border: 1px solid var(--r-border);
border-radius: 9999px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background-color 0.2s;
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
text-decoration: none;
}
.research-wrapper .r-btn-outline:hover {
background-color: #f9fafb;
color: var(--r-text);
}
/* Hero floating stat cards */
.research-wrapper .r-stat-card {
position: absolute;
background-color: var(--r-white);
border-radius: 1rem;
padding: 1rem;
border: 1px solid var(--r-border);
box-shadow: var(--r-shadow-hover);
z-index: 20;
display: flex;
align-items: center;
gap: 1rem;
}
.research-wrapper .r-stat-card p {
margin: 0;
line-height: 1.2;
}
/* ============================================================
RESEARCH DOMAINS SECTION
============================================================ */
.research-wrapper #research-domains {
padding-top: 5rem;
padding-bottom: 5rem;
background-color: var(--r-white);
}
.research-wrapper #research-domains h2 {
font-size: 1.875rem;
font-weight: 700;
color: var(--r-text);
margin-bottom: 1rem;
}
@media (min-width: 1024px) {
.research-wrapper #research-domains h2 {
font-size: 2.25rem;
}
}
.research-wrapper #research-domains > div > div:first-child p {
color: var(--r-muted);
max-width: 42rem;
margin: 0 auto;
}
/* Domain card — folder tab shape */
.research-wrapper .folder-tab {
clip-path: polygon(0 0, calc(100% - 40px) 0, 100% 40px, 100% 100%, 0 100%);
padding: 2rem;
min-height: 320px;
display: flex;
flex-direction: column;
border-radius: 1.5rem;
position: relative;
overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.research-wrapper .folder-tab:hover {
transform: translateY(-4px);
box-shadow: var(--r-shadow-hover);
}
/* Blue variant (first card) */
.research-wrapper .folder-tab-blue {
background-color: var(--r-blue);
color: var(--r-white);
}
.research-wrapper .folder-tab-blue h3 {
color: var(--r-white);
}
.research-wrapper .folder-tab-blue p {
color: rgba(255,255,255,0.8);
}
/* Light variant */
.research-wrapper .folder-tab-light {
background-color: var(--r-blue-light);
color: var(--r-text);
border: 1px solid var(--r-border);
}
/* CTA card (dashed border) */
.research-wrapper .domain-card-cta {
border-radius: 1.5rem;
padding: 2rem;
min-height: 320px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
border: 2px dashed var(--r-border);
background-color: var(--r-bg);
cursor: pointer;
transition: border-color 0.2s;
}
.research-wrapper .domain-card-cta:hover {
border-color: var(--r-blue);
}
.research-wrapper .domain-card-cta h3 {
font-size: 1.25rem;
font-weight: 700;
color: var(--r-text);
margin-bottom: 0.5rem;
}
.research-wrapper .domain-card-cta p {
font-size: 0.875rem;
color: var(--r-muted);
margin: 0;
}
/* Domain card icon box */
.research-wrapper .domain-icon-blue {
width: 3.5rem;
height: 3.5rem;
border-radius: 1rem;
background-color: rgba(255,255,255,0.2);
backdrop-filter: blur(4px);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 2rem;
border: 1px solid rgba(255,255,255,0.3);
flex-shrink: 0;
}
.research-wrapper .domain-icon-light {
width: 3.5rem;
height: 3.5rem;
border-radius: 1rem;
background-color: var(--r-white);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 2rem;
border: 1px solid var(--r-border);
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
flex-shrink: 0;
}
.research-wrapper .domain-card-cta .domain-icon-cta {
width: 4rem;
height: 4rem;
border-radius: 9999px;
background-color: var(--r-white);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 1rem;
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
transition: transform 0.2s;
}
.research-wrapper .domain-card-cta:hover .domain-icon-cta {
transform: scale(1.1);
}
/* Domain card footer row */
.research-wrapper .domain-card-footer {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: auto;
}
.research-wrapper .domain-badge-white {
font-size: 0.875rem;
font-weight: 500;
background-color: var(--r-white);
padding: 0.25rem 0.75rem;
border-radius: 9999px;
border: 1px solid var(--r-border);
color: var(--r-blue);
}
.research-wrapper .domain-badge-glass {
font-size: 0.875rem;
font-weight: 500;
background-color: rgba(255,255,255,0.2);
padding: 0.25rem 0.75rem;
border-radius: 9999px;
color: var(--r-white);
}
/* ============================================================
PROJECTS & CENTERS SECTION
============================================================ */
.research-wrapper #projects-centers {
padding-top: 5rem;
padding-bottom: 5rem;
background-color: var(--r-bg);
border-top: 1px solid var(--r-border);
border-bottom: 1px solid var(--r-border);
}
.research-wrapper #projects-centers h2 {
font-size: 1.5rem;
font-weight: 700;
color: var(--r-text);
margin: 0;
}
/* Project item card */
.research-wrapper .project-card {
background-color: var(--r-white);
border-radius: 1.25rem;
padding: 1.5rem;
border: 1px solid var(--r-border);
box-shadow: var(--r-shadow-soft);
display: flex;
flex-direction: column;
gap: 1.5rem;
align-items: flex-start;
transition: box-shadow 0.25s ease;
}
.research-wrapper .project-card:hover {
box-shadow: var(--r-shadow-hover);
}
@media (min-width: 640px) {
.research-wrapper .project-card {
flex-direction: row;
align-items: center;
}
}
.research-wrapper .project-icon {
width: 4rem;
height: 4rem;
border-radius: 0.75rem;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
border: 1px solid var(--r-border);
}
.research-wrapper .project-icon-blue { background-color: var(--r-blue-light); border-color: var(--r-border); }
.research-wrapper .project-icon-purple { background-color: #faf5ff; border-color: #e9d5ff; }
.research-wrapper .project-icon-orange { background-color: #fff7ed; border-color: #fed7aa; }
/* Status badges */
.research-wrapper .badge {
display: inline-flex;
align-items: center;
padding: 0.25rem 0.625rem;
border-radius: 0.375rem;
font-size: 0.75rem;
font-weight: 600;
border: 1px solid transparent;
}
.research-wrapper .badge-active { background-color: #f0fdf4; color: #15803d; border-color: #bbf7d0; }
.research-wrapper .badge-collection { background-color: #fefce8; color: #a16207; border-color: #fde68a; }
.research-wrapper .badge-review { background-color: #eff6ff; color: #1d4ed8; border-color: #bfdbfe; }
/* Progress bar */
.research-wrapper .progress-bar-track {
width: 8rem;
background-color: var(--r-bg);
border-radius: 9999px;
height: 0.375rem;
}
.research-wrapper .progress-bar-fill {
height: 0.375rem;
border-radius: 9999px;
}
.research-wrapper .progress-fill-blue { background-color: var(--r-blue); }
.research-wrapper .progress-fill-accent { background-color: var(--r-accent); }
/* ============================================================
FUNDING CALLS (right column)
============================================================ */
.research-wrapper .funding-card {
background-color: var(--r-white);
border-radius: 1.5rem;
padding: 1.5rem;
border: 1px solid var(--r-border);
box-shadow: var(--r-shadow-soft);
display: flex;
flex-direction: column;
transition: box-shadow 0.25s ease;
}
.research-wrapper .funding-card:hover {
box-shadow: var(--r-shadow-hover);
}
.research-wrapper .funding-item {
padding: 1.25rem;
background-color: var(--r-bg);
border-radius: 1rem;
border: 1px solid var(--r-border);
transition: border-color 0.2s;
}
.research-wrapper .funding-item:hover {
border-color: var(--r-accent);
}
.research-wrapper .funding-item h4 {
font-size: 1rem;
font-weight: 700;
color: var(--r-text);
margin: 0 0 0.75rem 0;
}
.research-wrapper .funding-label-urgent {
font-size: 0.625rem;
font-weight: 700;
color: #ef4444;
text-transform: uppercase;
letter-spacing: 0.05em;
display: block;
margin-bottom: 0.5rem;
}
.research-wrapper .funding-label-internal {
font-size: 0.625rem;
font-weight: 700;
color: var(--r-blue);
text-transform: uppercase;
letter-spacing: 0.05em;
display: block;
margin-bottom: 0.5rem;
}
.research-wrapper .funding-meta {
display: flex;
justify-content: space-between;
align-items: center;
}
.research-wrapper .funding-due {
font-size: 0.75rem;
color: var(--r-muted);
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 0.375rem;
}
.research-wrapper .funding-link {
font-size: 0.75rem;
font-weight: 600;
color: var(--r-blue);
display: inline-flex;
align-items: center;
gap: 0.25rem;
text-decoration: none;
transition: color 0.15s;
}
.research-wrapper .funding-link:hover {
color: var(--r-blue-hover);
}
.research-wrapper .funding-view-all {
width: 100%;
margin-top: 1.5rem;
padding: 0.75rem;
border-radius: 0.75rem;
border: 1px solid var(--r-border);
font-size: 0.875rem;
font-weight: 600;
color: var(--r-text);
background-color: var(--r-white);
cursor: pointer;
transition: border-color 0.2s, color 0.2s;
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
}
.research-wrapper .funding-view-all:hover {
border-color: var(--r-blue);
color: var(--r-blue);
}
/* ============================================================
RESEARCH RESOURCES (Quick Links)
============================================================ */
.research-wrapper #research-quick-links {
padding-top: 5rem;
padding-bottom: 5rem;
background-color: var(--r-white);
}
.research-wrapper .resource-card {
display: block;
background-color: var(--r-bg);
border-radius: 1.5rem;
padding: 2rem;
border: 1px solid var(--r-border);
position: relative;
overflow: hidden;
text-decoration: none;
transition: border-color 0.2s;
}
.research-wrapper .resource-card:hover {
border-color: var(--r-accent);
}
.research-wrapper .resource-card-glow {
position: absolute;
right: 0;
top: 0;
width: 16rem;
height: 16rem;
background-color: var(--r-blue-light);
border-radius: 9999px;
filter: blur(64px);
opacity: 0.5;
transform: translateY(-50%) translateX(25%);
transition: opacity 0.3s;
pointer-events: none;
}
.research-wrapper .resource-card:hover .resource-card-glow {
opacity: 0.8;
}
.research-wrapper .resource-icon {
width: 4rem;
height: 4rem;
border-radius: 1rem;
background-color: var(--r-white);
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
border: 1px solid var(--r-border);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: transform 0.2s;
}
.research-wrapper .resource-card:hover .resource-icon {
transform: scale(1.05);
}
.research-wrapper .resource-card h3 {
font-size: 1.5rem;
font-weight: 700;
color: var(--r-text);
margin-bottom: 0.5rem;
transition: color 0.2s;
}
.research-wrapper .resource-card:hover h3 {
color: var(--r-blue);
}
.research-wrapper .resource-card p {
color: var(--r-muted);
line-height: 1.625;
margin-bottom: 1rem;
}
.research-wrapper .resource-link {
display: inline-flex;
align-items: center;
font-size: 0.875rem;
font-weight: 600;
color: var(--r-blue);
gap: 0.5rem;
}
/* ============================================================
COLLABORATION CTA SECTION
============================================================ */
.research-wrapper #collaboration-cta {
padding-top: 6rem;
padding-bottom: 6rem;
background-color: var(--r-blue);
position: relative;
overflow: hidden;
}
.research-wrapper #collaboration-cta h2 {
font-size: 2.25rem;
font-weight: 700;
color: var(--r-white);
letter-spacing: -0.025em;
margin-bottom: 1.5rem;
}
@media (min-width: 768px) {
.research-wrapper #collaboration-cta h2 { font-size: 3rem; }
}
@media (min-width: 1024px) {
.research-wrapper #collaboration-cta h2 { font-size: 3.75rem; }
}
.research-wrapper #collaboration-cta p {
font-size: 1.25rem;
color: var(--r-blue-light);
opacity: 0.9;
line-height: 1.625;
max-width: 42rem;
margin: 0 auto 2.5rem;
font-weight: 300;
}
.research-wrapper .cta-btn-white {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 1rem 2rem;
background-color: var(--r-white);
color: var(--r-blue);
border: none;
border-radius: 0.75rem;
font-size: 1rem;
font-weight: 700;
cursor: pointer;
transition: background-color 0.2s;
box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);
text-decoration: none;
width: 100%;
}
@media (min-width: 640px) {
.research-wrapper .cta-btn-white { width: auto; }
}
.research-wrapper .cta-btn-white:hover {
background-color: #f9fafb;
color: var(--r-blue);
}
.research-wrapper .cta-btn-ghost {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 1rem 2rem;
background-color: transparent;
color: var(--r-white);
border: 2px solid rgba(255,255,255,0.3);
border-radius: 0.75rem;
font-size: 1rem;
font-weight: 700;
cursor: pointer;
transition: background-color 0.2s;
text-decoration: none;
width: 100%;
}
@media (min-width: 640px) {
.research-wrapper .cta-btn-ghost { width: auto; }
}
.research-wrapper .cta-btn-ghost:hover {
background-color: rgba(255,255,255,0.1);
color: var(--r-white);
}

View File

@@ -0,0 +1,79 @@
'use client';
import React, { useState } from 'react';
import { useRouter } from 'next/navigation';
const FILTERS = ['Researchers', 'Labs', 'Projects', 'Institutes'];
const ResearchSearchHeader = () => {
const [query, setQuery] = useState('');
const [activeFilter, setActiveFilter] = useState('Researchers');
const router = useRouter();
const handleSearch = () => {
const params = new URLSearchParams({ q: query, type: activeFilter });
router.push(`/research/search?${params.toString()}`);
};
return (
<section id="repo-header">
<div className="max-w-[1440px] mx-auto px-6 lg:px-8">
{/* Title row */}
<div className="flex flex-col lg:flex-row justify-between items-start lg:items-end gap-6 mb-8 w-full">
<div className="flex-1 max-w-3xl">
<h1>Research Search</h1>
<p>Search across researchers, labs, active projects, and institutes.</p>
</div>
<div className="flex gap-3 shrink-0">
<button className="pub-btn-outline" onClick={() => router.back()}>
<i className="fa-solid fa-arrow-left"></i>
Back to Research
</button>
</div>
</div>
{/* Search bar */}
<div className="pub-search-bar">
<span className="pub-search-icon">
<i className="fa-solid fa-magnifying-glass"></i>
</span>
<input
type="text"
placeholder="Search researchers, labs, projects, and disciplines..."
value={query}
onChange={(e) => setQuery(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
/>
<div className="pub-search-btn-wrap">
<button className="pub-btn-primary" onClick={handleSearch}>Search</button>
</div>
</div>
{/* Filter tabs */}
<div className="flex flex-wrap items-center gap-3 mt-5">
<span className="text-xs font-bold uppercase tracking-widest" style={{ color: 'var(--pub-muted)' }}>
Filter by:
</span>
{FILTERS.map((f) => (
<button
key={f}
onClick={() => setActiveFilter(f)}
className="pub-btn-outline"
style={activeFilter === f ? {
backgroundColor: 'var(--pub-blue-light)',
color: 'var(--pub-blue)',
borderColor: 'transparent',
} : {}}
>
{f}
</button>
))}
</div>
</div>
</section>
);
};
export default ResearchSearchHeader;

View File

@@ -0,0 +1,177 @@
'use client';
import React, { useState } from 'react';
const SORT_OPTIONS = ['Relevance', 'Newest First', 'Most Active', 'Alphabetical'];
const RESULTS = [
{
type: 'Project',
badgeClass: 'pub-badge-open',
badgeIcon: 'fa-flask',
badgeLabel: 'Active Project',
statusClass: 'pub-badge-peer',
statusLabel: 'Environmental Studies',
title: 'Urban Microclimate Modeling',
lead: 'Dr. Alan Turing',
updated: 'Updated 2 days ago',
center: 'Institute for Climate Research',
desc: 'Developing high-resolution predictive models for heat island effects in European metropolitan areas using machine learning and satellite data.',
tags: ['Climate', 'Machine Learning', 'Urban Studies'],
progress: 65,
},
{
type: 'Lab',
badgeClass: 'pub-badge-institutional',
badgeIcon: 'fa-building-user',
badgeLabel: 'Research Lab',
statusClass: 'pub-badge-peer',
statusLabel: 'Cognitive Science',
title: 'Cognitive Sciences Lab',
lead: 'Prof. Marie Curie',
updated: 'Updated 1 week ago',
center: 'Center for Digital Humanities',
desc: 'Exploring the intersection of artificial intelligence and human psychology, with a focus on decision-making processes and behavioral modeling.',
tags: ['AI', 'Psychology', 'Neuroscience'],
progress: null,
},
{
type: 'Project',
badgeClass: 'pub-badge-request',
badgeIcon: 'fa-gavel',
badgeLabel: 'Data Collection',
statusClass: 'pub-badge-peer',
statusLabel: 'Law & Policy',
title: 'Digital Rights in the EU Framework',
lead: 'Dr. Elena Rostova',
updated: 'Updated 1 week ago',
center: 'Institute for Advanced European Studies',
desc: 'A comparative analysis of member state implementation of digital privacy directives and their impact on civil liberties across the EU.',
tags: ['Digital Rights', 'EU Law', 'Privacy'],
progress: 30,
},
];
const ResearchSearchResults = () => {
const [isSortOpen, setIsSortOpen] = useState(false);
const [selectedSort, setSelectedSort] = useState('Relevance');
return (
<div className="pub-results">
{/* Toolbar */}
<div className="pub-results-toolbar">
<p className="pub-results-count">
Showing <strong>110</strong> of <strong>340</strong> results
</p>
<div className="pub-sort-wrap">
<label>Sort by:</label>
<div className="pub-sort-dropdown">
<button
className={`pub-sort-dropdown-btn ${isSortOpen ? 'open' : ''}`}
onClick={() => setIsSortOpen(!isSortOpen)}
>
<span>{selectedSort}</span>
<i className="fa-solid fa-chevron-down"></i>
</button>
{isSortOpen && (
<div className="pub-sort-dropdown-menu">
{SORT_OPTIONS.map((opt) => (
<div
key={opt}
className={`pub-sort-dropdown-option ${selectedSort === opt ? 'selected' : ''}`}
onClick={() => { setSelectedSort(opt); setIsSortOpen(false); }}
>
{opt}
</div>
))}
</div>
)}
</div>
</div>
</div>
{/* Result cards */}
<div className="pub-card-list">
{RESULTS.map((item, idx) => (
<div key={idx} className="pub-card">
<div className="pub-card-top">
<h3 className="pub-card-title">
<a href="#">{item.title}</a>
</h3>
<div className="pub-badges">
<span className={`pub-badge ${item.badgeClass}`}>
<i className={`fa-solid ${item.badgeIcon}`}></i> {item.badgeLabel}
</span>
<span className="pub-badge pub-badge-peer">{item.statusLabel}</span>
</div>
</div>
<div className="pub-card-meta">
<div className="pub-meta-item">
<i className="fa-solid fa-user"></i>
<strong>{item.lead}</strong>
</div>
<div className="pub-meta-item">
<i className="fa-regular fa-clock"></i> {item.updated}
</div>
<div className="pub-meta-item">
<i className="fa-solid fa-building-columns"></i> {item.center}
</div>
</div>
<p className="pub-card-abstract">{item.desc}</p>
<div className="pub-keywords">
<span className="pub-keywords-label">Tags:</span>
{item.tags.map((tag) => (
<span key={tag} className="pub-keyword-tag">{tag}</span>
))}
</div>
{item.progress !== null && (
<div style={{ marginBottom: '1rem' }}>
<div className="flex justify-between text-xs mb-1" style={{ color: 'var(--pub-muted)' }}>
<span>Progress</span>
<span style={{ fontWeight: 600, color: 'var(--pub-text)' }}>{item.progress}%</span>
</div>
<div style={{ width: '100%', height: '6px', backgroundColor: 'var(--pub-bg)', borderRadius: '9999px' }}>
<div style={{ width: `${item.progress}%`, height: '6px', backgroundColor: 'var(--pub-blue)', borderRadius: '9999px' }}></div>
</div>
</div>
)}
<div className="pub-card-actions">
<button className="pub-action-btn pub-action-btn-primary">
<i className="fa-solid fa-arrow-right"></i> View Details
</button>
<button className="pub-action-btn pub-action-btn-secondary">
<i className="fa-regular fa-bookmark"></i> Save
</button>
</div>
</div>
))}
</div>
{/* Pagination */}
<div className="pub-pagination">
<button className="pub-page-btn" disabled>
<i className="fa-solid fa-arrow-left"></i> Previous
</button>
<div className="pub-page-numbers">
<button className="pub-page-num active">1</button>
<button className="pub-page-num">2</button>
<button className="pub-page-num">3</button>
<span className="pub-page-ellipsis">...</span>
<button className="pub-page-num">34</button>
</div>
<button className="pub-page-btn">
Next <i className="fa-solid fa-arrow-right"></i>
</button>
</div>
</div>
);
};
export default ResearchSearchResults;

View File

@@ -0,0 +1,94 @@
'use client';
import React, { useState } from 'react';
const DOMAINS = ['Law & Policy (42)', 'Cognitive Science (28)', 'Environmental Studies (35)', 'History & Humanities (50)', 'Economics (19)'];
const STATUSES = ['Active', 'Data Collection', 'Review', 'Completed'];
const TYPES = ['Researchers', 'Labs', 'Projects', 'Institutes'];
const AccordionSection = ({
title,
open,
onToggle,
children,
}: {
title: string;
open: boolean;
onToggle: () => void;
children: React.ReactNode;
}) => (
<div className="pub-accordion-item">
<button
className={`pub-accordion-trigger ${open ? 'open' : ''}`}
onClick={onToggle}
>
{title}
<i className="fa-solid fa-chevron-down"></i>
</button>
<div className={`pub-accordion-body ${open ? 'open' : ''}`}>
{children}
</div>
</div>
);
const ResearchSearchSidebar = () => {
const [isDomainOpen, setIsDomainOpen] = useState(true);
const [isStatusOpen, setIsStatusOpen] = useState(true);
const [isTypeOpen, setIsTypeOpen] = useState(true);
return (
<aside className="pub-sidebar">
<div className="pub-sidebar-inner">
<div className="pub-sidebar-header">
<h2>
<i className="fa-solid fa-filter"></i> Filters
</h2>
<button className="pub-clear-btn">Clear All</button>
</div>
<div className="pub-accordion">
{/* Research Domain */}
<AccordionSection title="Research Domain" open={isDomainOpen} onToggle={() => setIsDomainOpen(!isDomainOpen)}>
<div className="pub-filter-list">
{DOMAINS.map((d, i) => (
<label key={d} className="pub-filter-label">
<input type="checkbox" className="pub-checkbox" defaultChecked={i === 0} />
<span>{d}</span>
</label>
))}
</div>
</AccordionSection>
{/* Project Status */}
<AccordionSection title="Project Status" open={isStatusOpen} onToggle={() => setIsStatusOpen(!isStatusOpen)}>
<div className="pub-filter-list">
{STATUSES.map((s) => (
<label key={s} className="pub-filter-label">
<input type="checkbox" className="pub-checkbox" />
<span>{s}</span>
</label>
))}
</div>
</AccordionSection>
{/* Type */}
<AccordionSection title="Type" open={isTypeOpen} onToggle={() => setIsTypeOpen(!isTypeOpen)}>
<div className="pub-filter-list">
{TYPES.map((t) => (
<label key={t} className="pub-filter-label">
<input type="checkbox" className="pub-checkbox" />
<span>{t}</span>
</label>
))}
</div>
</AccordionSection>
</div>
</div>
</aside>
);
};
export default ResearchSearchSidebar;