refactor(about): structure the career journey

This commit is contained in:
2026-09-06 22:04:40 +03:30
parent 74019cba66
commit 568716c976
4 changed files with 86 additions and 71 deletions

View File

@@ -66,15 +66,33 @@
.stepsList {
position: absolute;
inset: 0;
top: 5.5rem;
right: var(--layout-page-gutter);
z-index: 3;
display: flex;
flex-direction: column;
width: min(33rem, 46vw);
gap: var(--space-3);
padding-left: 3.5rem;
list-style: none;
}
.stepCard {
.stepsList::before {
content: '';
position: absolute;
top: 1.25rem;
bottom: 1.25rem;
left: 1.25rem;
width: 2px;
border-radius: var(--radius-pill);
background: var(--border-strong);
}
.stepCard {
position: relative;
display: flex;
width: 15.625rem;
width: 100%;
min-height: 6.125rem;
gap: var(--space-3);
padding: var(--space-4);
border: 1px solid var(--border-default);
@@ -82,23 +100,28 @@
background: var(--overlay-contact);
box-shadow: 0 0.5rem 1.5rem var(--shadow-color);
backdrop-filter: blur(8px);
transition:
border-color var(--motion-duration-fast) ease,
transform var(--motion-duration-default) var(--motion-ease-out);
transition: border-color var(--motion-duration-fast) ease;
}
.step05 { top: 7.25rem; right: 2.875rem; }
.step04 { top: 20.875rem; right: 15.625rem; }
.step03 { top: 31.25rem; left: 48%; }
.step02 { top: 43.125rem; left: 25%; }
.step01 { top: 51.625rem; left: 4.375rem; }
.stepNumber {
flex: 0 0 auto;
.stepIcon {
position: absolute;
top: 1rem;
left: -3.5rem;
z-index: 1;
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.5rem;
height: 2.5rem;
border: 1px solid var(--border-strong);
border-radius: 50%;
background: var(--bg-raised);
color: var(--accent-default);
font-size: 1.25rem;
font-weight: 800;
line-height: 1.75rem;
box-shadow: 0 0.375rem 1rem var(--shadow-color);
}
.stepContent {
min-width: 0;
}
.stepTitle {
@@ -120,15 +143,11 @@
top: 5rem;
}
.stepCard {
width: 14.375rem;
.stepsList {
top: 4.5rem;
right: 2rem;
width: min(28rem, 45vw);
}
.step05 { top: 5.625rem; right: 2rem; }
.step04 { top: 18.75rem; right: 10%; }
.step03 { top: 30.625rem; left: 48%; }
.step02 { top: 43.125rem; left: 24%; }
.step01 { top: 53.125rem; left: 2rem; }
}
@media (max-width: 760px) {
@@ -167,12 +186,14 @@
.stepsList {
position: relative;
inset: auto;
top: auto;
right: auto;
display: flex;
flex-direction: column;
width: 100%;
gap: var(--space-3);
margin-top: 13.75rem;
padding-left: 1.5rem;
padding-left: 3.25rem;
}
.stepsList::before {
@@ -180,17 +201,12 @@
position: absolute;
top: 1.25rem;
bottom: 1.25rem;
left: 0.5rem;
left: 1.125rem;
width: 2px;
background: var(--border-strong);
}
.stepCard,
.step05,
.step04,
.step03,
.step02,
.step01 {
.stepCard {
position: relative;
inset: auto;
width: 100%;
@@ -199,17 +215,9 @@
backdrop-filter: blur(6px);
}
.stepCard::before {
content: '';
position: absolute;
top: 1.375rem;
left: -1rem;
width: 0.625rem;
height: 0.625rem;
transform: translateX(-50%);
border: 3px solid var(--bg-page);
border-radius: 50%;
background: var(--accent-default);
.stepIcon {
top: 0.75rem;
left: -3.25rem;
}
}
@@ -226,10 +234,3 @@
}
}
@media (hover: hover) and (pointer: fine) {
.stepCard:hover {
border-color: var(--accent-default);
transform: translateY(-2px);
}
}

View File

@@ -1,15 +1,22 @@
'use client';
import React from 'react';
import {
Code2,
GraduationCap,
Palette,
PanelsTopLeft,
Rocket,
} from 'lucide-react';
import { AboutRiverScene } from './scenes/AboutRiverScene';
import styles from './RiverJourney.module.css';
const steps = [
{ number: '01', title: 'Digital Artist', description: 'Explored visual design, illustration and storytelling.' },
{ number: '02', title: 'UI/UX Designer', description: 'Designed intuitive interfaces and user-centered experiences.' },
{ number: '03', title: 'Computer Science', description: 'Built strong foundations in algorithms and systems thinking.' },
{ number: '04', title: 'Software Engineer', description: 'Engineered scalable applications and delivered real-world solutions.' },
{ number: '05', title: 'Product Engineer', description: 'Merging product strategy with engineering to ship impactful products.' },
{ number: '01', icon: Palette, title: 'Digital Artist', description: 'Explored visual design, illustration and storytelling.' },
{ number: '02', icon: PanelsTopLeft, title: 'UI/UX Designer', description: 'Designed intuitive interfaces and user-centered experiences.' },
{ number: '03', icon: GraduationCap, title: 'Computer Science', description: 'Built strong foundations in algorithms and systems thinking.' },
{ number: '04', icon: Code2, title: 'Software Engineer', description: 'Engineered scalable applications and delivered real-world solutions.' },
{ number: '05', icon: Rocket, title: 'Product Engineer', description: 'Merging product strategy with engineering to ship impactful products.' },
];
export const RiverJourney: React.FC = () => {
@@ -30,14 +37,21 @@ export const RiverJourney: React.FC = () => {
</div>
<ol className={styles.stepsList} aria-label="Career journey">
{steps.map((step) => (
<li key={step.number} className={`${styles.stepCard} ${styles[`step${step.number}`]}`}>
<div>
<h3 className={styles.stepTitle}>{step.title}</h3>
<p className={styles.stepDesc}>{step.description}</p>
</div>
</li>
))}
{steps.map((step) => {
const StepIcon = step.icon;
return (
<li key={step.number} className={styles.stepCard}>
<span className={styles.stepIcon} aria-hidden="true">
<StepIcon size={20} strokeWidth={1.9} />
</span>
<div className={styles.stepContent}>
<h3 className={styles.stepTitle}>{step.title}</h3>
<p className={styles.stepDesc}>{step.description}</p>
</div>
</li>
);
})}
</ol>
</section>
);

View File

@@ -34,7 +34,7 @@ export const palettes: Record<SceneTheme, ScenePalette> = {
accentSoft: 0x3d8afa,
edge: 0x426b9d,
foliage: 0x3d8afa,
ground: 0x07132f,
ground: 0x04132d,
mountain: 0x0b2f5f,
mountainDark: 0x010d27,
mountainLight: 0x103f7f,