Commit 1b885f56 authored by HungTQ's avatar HungTQ

feat(projects): improve app preview showcase

parent ce17ed16
...@@ -494,6 +494,88 @@ h3 { ...@@ -494,6 +494,88 @@ h3 {
z-index: 1; z-index: 1;
} }
.project-preview {
align-items: center;
background:
radial-gradient(circle at 22% 18%, rgba(128, 255, 204, 0.20), transparent 30%),
radial-gradient(circle at 82% 20%, rgba(255, 107, 69, 0.18), transparent 30%),
linear-gradient(145deg, rgba(255, 255, 255, 0.10), rgba(66, 217, 255, 0.04)),
#050d14;
border: 1px solid rgba(139, 213, 255, 0.26);
border-radius: 8px;
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.05),
0 18px 48px rgba(0, 0, 0, 0.22);
display: flex;
height: clamp(350px, 34vw, 460px);
justify-content: center;
margin-bottom: 24px;
overflow: hidden;
padding: 22px;
position: relative;
isolation: isolate;
}
.project-preview::before {
background-position: center;
background-size: cover;
content: "";
filter: blur(18px) saturate(1.12);
inset: -24px;
opacity: 0.34;
position: absolute;
transform: scale(1.08);
z-index: -2;
}
.project-preview::after {
background:
linear-gradient(90deg, rgba(255, 255, 255, 0.10), transparent 16% 84%, rgba(255, 255, 255, 0.06)),
linear-gradient(180deg, rgba(255, 255, 255, 0.08), transparent 42%);
border: 1px solid rgba(157, 242, 255, 0.20);
border-radius: 8px;
content: "";
inset: 30px;
opacity: 0.54;
position: absolute;
transform: rotate(-2deg);
z-index: -1;
}
.project-preview-1::before {
background-image: url("/aitalkmate-preview.png");
}
.project-preview-2::before {
background-image: url("/tracking-calo-preview.png");
}
.project-preview img {
border-radius: 18px;
box-shadow:
0 28px 70px rgba(0, 0, 0, 0.48),
0 0 0 1px rgba(255, 255, 255, 0.14);
display: block;
max-height: calc(100% - 4px);
max-width: 100%;
object-fit: contain;
transform: rotate(-1.8deg) scale(1.04);
transition: filter 320ms ease, transform 320ms ease, box-shadow 320ms ease;
}
.project-preview-2 img {
border-radius: 26px;
transform: rotate(2deg) scale(1.03);
}
.project-card:hover .project-preview img {
filter: saturate(1.08) contrast(1.04);
box-shadow:
0 34px 84px rgba(0, 0, 0, 0.52),
0 0 0 1px rgba(255, 255, 255, 0.18);
transform: translateY(-6px) rotate(0deg) scale(1.08);
}
.project-index { .project-index {
color: rgba(157, 242, 255, 0.16); color: rgba(157, 242, 255, 0.16);
font-family: Georgia, "Times New Roman", serif; font-family: Georgia, "Times New Roman", serif;
......
...@@ -28,6 +28,7 @@ const projects = [ ...@@ -28,6 +28,7 @@ const projects = [
name: 'AITALKMATE', name: 'AITALKMATE',
type: 'React Native App', type: 'React Native App',
time: 'Jul 2025 - Feb 2026', time: 'Jul 2025 - Feb 2026',
preview: '/aitalkmate-preview.png',
description: description:
'Cross-platform mobile app for English speaking practice. Designed UI/UX in Figma, implemented front-end features with React Native, and integrated Firebase realtime database and authentication.', 'Cross-platform mobile app for English speaking practice. Designed UI/UX in Figma, implemented front-end features with React Native, and integrated Firebase realtime database and authentication.',
links: [ links: [
...@@ -40,6 +41,7 @@ const projects = [ ...@@ -40,6 +41,7 @@ const projects = [
name: 'TrackingCaloApp', name: 'TrackingCaloApp',
type: 'Android Java App', type: 'Android Java App',
time: 'Dec 2025', time: 'Dec 2025',
preview: '/tracking-calo-preview.png',
description: description:
'Mobile app for tracking daily calories and nutrition. Applied MVVM architecture and Room Database for local offline storage.', 'Mobile app for tracking daily calories and nutrition. Applied MVVM architecture and Room Database for local offline storage.',
links: [{ label: 'Repository', href: 'https://github.com/Anroiy123/TrackingCaloApp' }], links: [{ label: 'Repository', href: 'https://github.com/Anroiy123/TrackingCaloApp' }],
...@@ -239,6 +241,12 @@ function App() { ...@@ -239,6 +241,12 @@ function App() {
{projects.map((project, index) => ( {projects.map((project, index) => (
<article className="project-card reveal" key={project.name} style={{ '--delay': `${index * 110}ms` } as CSSProperties}> <article className="project-card reveal" key={project.name} style={{ '--delay': `${index * 110}ms` } as CSSProperties}>
<div className="project-index">0{index + 1}</div> <div className="project-index">0{index + 1}</div>
<div
className={`project-preview project-preview-${index + 1}`}
aria-label={`${project.name} app preview`}
>
<img src={project.preview} alt={`${project.name} mobile app preview`} loading="lazy" />
</div>
<div className="project-meta"> <div className="project-meta">
<span>{project.type}</span> <span>{project.type}</span>
<span>{project.time}</span> <span>{project.time}</span>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment