forked from UKSOURCE/hailearning.edu.vn
feat: complete publications and research sections and resolve conflicts
This commit is contained in:
208
app/components/research/ProjectsAndCenters.tsx
Normal file
208
app/components/research/ProjectsAndCenters.tsx
Normal 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;
|
||||
167
app/components/research/ResearchDomains.tsx
Normal file
167
app/components/research/ResearchDomains.tsx
Normal 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;
|
||||
101
app/components/research/ResearchHero.tsx
Normal file
101
app/components/research/ResearchHero.tsx
Normal 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;
|
||||
68
app/components/research/ResearchResources.tsx
Normal file
68
app/components/research/ResearchResources.tsx
Normal 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;
|
||||
115
app/components/research/ResearchSearch.tsx
Normal file
115
app/components/research/ResearchSearch.tsx
Normal 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;
|
||||
718
app/components/research/research.css
Normal file
718
app/components/research/research.css
Normal 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);
|
||||
}
|
||||
79
app/components/research/search/ResearchSearchHeader.tsx
Normal file
79
app/components/research/search/ResearchSearchHeader.tsx
Normal 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;
|
||||
177
app/components/research/search/ResearchSearchResults.tsx
Normal file
177
app/components/research/search/ResearchSearchResults.tsx
Normal 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>1–10</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;
|
||||
94
app/components/research/search/ResearchSearchSidebar.tsx
Normal file
94
app/components/research/search/ResearchSearchSidebar.tsx
Normal 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;
|
||||
Reference in New Issue
Block a user