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 { .stepsList {
position: absolute; position: absolute;
inset: 0; top: 5.5rem;
right: var(--layout-page-gutter);
z-index: 3; z-index: 3;
display: flex;
flex-direction: column;
width: min(33rem, 46vw);
gap: var(--space-3);
padding-left: 3.5rem;
list-style: none; list-style: none;
} }
.stepCard { .stepsList::before {
content: '';
position: absolute; 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; display: flex;
width: 15.625rem; width: 100%;
min-height: 6.125rem;
gap: var(--space-3); gap: var(--space-3);
padding: var(--space-4); padding: var(--space-4);
border: 1px solid var(--border-default); border: 1px solid var(--border-default);
@@ -82,23 +100,28 @@
background: var(--overlay-contact); background: var(--overlay-contact);
box-shadow: 0 0.5rem 1.5rem var(--shadow-color); box-shadow: 0 0.5rem 1.5rem var(--shadow-color);
backdrop-filter: blur(8px); backdrop-filter: blur(8px);
transition: transition: border-color var(--motion-duration-fast) ease;
border-color var(--motion-duration-fast) ease,
transform var(--motion-duration-default) var(--motion-ease-out);
} }
.step05 { top: 7.25rem; right: 2.875rem; } .stepIcon {
.step04 { top: 20.875rem; right: 15.625rem; } position: absolute;
.step03 { top: 31.25rem; left: 48%; } top: 1rem;
.step02 { top: 43.125rem; left: 25%; } left: -3.5rem;
.step01 { top: 51.625rem; left: 4.375rem; } z-index: 1;
display: inline-flex;
.stepNumber { align-items: center;
flex: 0 0 auto; 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); color: var(--accent-default);
font-size: 1.25rem; box-shadow: 0 0.375rem 1rem var(--shadow-color);
font-weight: 800; }
line-height: 1.75rem;
.stepContent {
min-width: 0;
} }
.stepTitle { .stepTitle {
@@ -120,15 +143,11 @@
top: 5rem; top: 5rem;
} }
.stepCard { .stepsList {
width: 14.375rem; 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) { @media (max-width: 760px) {
@@ -167,12 +186,14 @@
.stepsList { .stepsList {
position: relative; position: relative;
inset: auto; top: auto;
right: auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: 100%;
gap: var(--space-3); gap: var(--space-3);
margin-top: 13.75rem; margin-top: 13.75rem;
padding-left: 1.5rem; padding-left: 3.25rem;
} }
.stepsList::before { .stepsList::before {
@@ -180,17 +201,12 @@
position: absolute; position: absolute;
top: 1.25rem; top: 1.25rem;
bottom: 1.25rem; bottom: 1.25rem;
left: 0.5rem; left: 1.125rem;
width: 2px; width: 2px;
background: var(--border-strong); background: var(--border-strong);
} }
.stepCard, .stepCard {
.step05,
.step04,
.step03,
.step02,
.step01 {
position: relative; position: relative;
inset: auto; inset: auto;
width: 100%; width: 100%;
@@ -199,17 +215,9 @@
backdrop-filter: blur(6px); backdrop-filter: blur(6px);
} }
.stepCard::before { .stepIcon {
content: ''; top: 0.75rem;
position: absolute; left: -3.25rem;
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);
} }
} }
@@ -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'; 'use client';
import React from 'react'; import React from 'react';
import {
Code2,
GraduationCap,
Palette,
PanelsTopLeft,
Rocket,
} from 'lucide-react';
import { AboutRiverScene } from './scenes/AboutRiverScene'; import { AboutRiverScene } from './scenes/AboutRiverScene';
import styles from './RiverJourney.module.css'; import styles from './RiverJourney.module.css';
const steps = [ const steps = [
{ number: '01', title: 'Digital Artist', description: 'Explored visual design, illustration and storytelling.' }, { number: '01', icon: Palette, 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: '02', icon: PanelsTopLeft, 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: '03', icon: GraduationCap, 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: '04', icon: Code2, 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: '05', icon: Rocket, title: 'Product Engineer', description: 'Merging product strategy with engineering to ship impactful products.' },
]; ];
export const RiverJourney: React.FC = () => { export const RiverJourney: React.FC = () => {
@@ -30,14 +37,21 @@ export const RiverJourney: React.FC = () => {
</div> </div>
<ol className={styles.stepsList} aria-label="Career journey"> <ol className={styles.stepsList} aria-label="Career journey">
{steps.map((step) => ( {steps.map((step) => {
<li key={step.number} className={`${styles.stepCard} ${styles[`step${step.number}`]}`}> const StepIcon = step.icon;
<div>
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> <h3 className={styles.stepTitle}>{step.title}</h3>
<p className={styles.stepDesc}>{step.description}</p> <p className={styles.stepDesc}>{step.description}</p>
</div> </div>
</li> </li>
))} );
})}
</ol> </ol>
</section> </section>
); );

View File

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

View File

@@ -124,10 +124,10 @@
[data-theme="dark"] { [data-theme="dark"] {
/* Semantic Tokens (Dark) */ /* Semantic Tokens (Dark) */
--bg-page: #010D27; --bg-page: #04132D;
--bg-surface: #07132F; --bg-surface: #081B38;
--bg-raised: #0C1A3A; --bg-raised: #0D2346;
--bg-subtle: #091C3F; --bg-subtle: #0A2852;
--text-primary: #F8FAFF; --text-primary: #F8FAFF;
--text-secondary: #C3CFE0; --text-secondary: #C3CFE0;
--text-muted: #A3B1C6; --text-muted: #A3B1C6;
@@ -142,7 +142,7 @@
--action-primary-pressed: #C3D5EC; --action-primary-pressed: #C3D5EC;
--brand-band: #3D8AFA; --brand-band: #3D8AFA;
--focus-ring: #82B5FF; --focus-ring: #82B5FF;
--overlay-contact: rgba(1, 13, 39, 0.721569); --overlay-contact: rgba(8, 27, 56, 0.82);
--shadow-color: rgba(0, 0, 0, 0.239216); --shadow-color: rgba(0, 0, 0, 0.239216);
/* Hero Scenic Landscape Palette (Night / Dark Mode) */ /* Hero Scenic Landscape Palette (Night / Dark Mode) */