Skip to content

Commit 0880fec

Browse files
committed
design: simplify portfolio ui and navigation
1 parent 0ec03f4 commit 0880fec

16 files changed

Lines changed: 658 additions & 141 deletions

src/App.css

Lines changed: 123 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@
4545
margin: 0;
4646
padding: 0;
4747
box-sizing: border-box;
48-
font-family: sans-serif;
48+
font-family: "Segoe UI", "SF Pro Display", "Helvetica Neue", sans-serif;
4949
}
5050

5151
body {
5252
margin: 0;
53-
font-family: "Arial", sans-serif;
53+
font-family: "Segoe UI", "SF Pro Display", "Helvetica Neue", sans-serif;
5454
background: var(--bg-color);
5555
color: var(--text-color);
5656
transition: background 0.3s ease, color 0.3s ease;
@@ -62,7 +62,7 @@ a {
6262
}
6363

6464
a:hover {
65-
text-decoration: underline;
65+
text-decoration: none;
6666
}
6767

6868
.theme-toggle {
@@ -216,6 +216,10 @@ a:hover {
216216
margin-bottom: 36px;
217217
}
218218

219+
.page-header.page-header-left {
220+
text-align: left;
221+
}
222+
219223
.page-header h1,
220224
.empty-state h1 {
221225
color: var(--text-color);
@@ -232,6 +236,17 @@ a:hover {
232236
margin: 0 auto;
233237
}
234238

239+
.page-header.page-header-left p {
240+
margin-left: 0;
241+
}
242+
243+
.page-header-actions {
244+
display: flex;
245+
flex-wrap: wrap;
246+
gap: 14px;
247+
margin-top: 22px;
248+
}
249+
235250
.problem-grid {
236251
display: grid;
237252
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
@@ -258,6 +273,14 @@ a:hover {
258273
transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
259274
}
260275

276+
.card-row {
277+
display: flex;
278+
flex-wrap: wrap;
279+
gap: 10px;
280+
align-items: center;
281+
margin-bottom: 14px;
282+
}
283+
261284
.problem-card:hover,
262285
.problem-card:focus-visible {
263286
transform: translateY(-6px);
@@ -455,6 +478,18 @@ a:hover {
455478
.page-button.compact {
456479
justify-content: center;
457480
}
481+
482+
.page-header.page-header-left {
483+
text-align: center;
484+
}
485+
486+
.page-header.page-header-left p {
487+
margin-left: auto;
488+
}
489+
490+
.cta-panel {
491+
align-items: stretch;
492+
}
458493
}
459494

460495
.section-panel {
@@ -464,6 +499,7 @@ a:hover {
464499
border-radius: 28px;
465500
background: var(--card-bg);
466501
box-shadow: var(--shadow-light);
502+
border: 1px solid color-mix(in srgb, var(--input-border) 88%, white 12%);
467503
}
468504

469505
.section-panel h2 {
@@ -472,6 +508,13 @@ a:hover {
472508
margin: 8px 0 28px;
473509
}
474510

511+
.section-copy {
512+
color: var(--text-secondary);
513+
max-width: 780px;
514+
line-height: 1.75;
515+
margin: -8px 0 28px;
516+
}
517+
475518
.section-eyebrow,
476519
.availability-badge {
477520
display: inline-flex;
@@ -506,6 +549,83 @@ a:hover {
506549
.glass-card h3 { margin-bottom: 10px; }
507550
.glass-card p, .timeline-item p { color: var(--text-secondary); line-height: 1.7; }
508551

552+
.ui-badge {
553+
display: inline-flex;
554+
align-items: center;
555+
justify-content: center;
556+
min-height: 32px;
557+
padding: 6px 12px;
558+
border-radius: 999px;
559+
border: 1px solid var(--input-border);
560+
background: color-mix(in srgb, var(--card-bg) 86%, white 14%);
561+
color: var(--text-color);
562+
font-size: 0.82rem;
563+
font-weight: 700;
564+
}
565+
566+
.ui-badge.accent {
567+
color: var(--accent-color);
568+
border-color: color-mix(in srgb, var(--accent-color) 35%, transparent);
569+
background: color-mix(in srgb, var(--accent-color) 12%, transparent);
570+
}
571+
572+
.ui-badge.success {
573+
color: #0f7a4a;
574+
border-color: rgba(15, 122, 74, 0.24);
575+
background: rgba(15, 122, 74, 0.1);
576+
}
577+
578+
[data-theme="dark"] .ui-badge.success {
579+
color: #78e3b1;
580+
border-color: rgba(120, 227, 177, 0.28);
581+
background: rgba(120, 227, 177, 0.12);
582+
}
583+
584+
.home-shell {
585+
padding-bottom: 80px;
586+
}
587+
588+
.home-page-shell {
589+
padding-top: 24px;
590+
}
591+
592+
.compact-grid,
593+
.preview-list {
594+
margin-top: 24px;
595+
}
596+
597+
.cta-panel {
598+
display: flex;
599+
justify-content: space-between;
600+
gap: 24px;
601+
align-items: center;
602+
flex-wrap: wrap;
603+
}
604+
605+
.embedded-section-panel {
606+
overflow: hidden;
607+
}
608+
609+
.embedded-section-panel > .about,
610+
.embedded-section-panel > .skills-section,
611+
.embedded-section-panel > .certificate-gallery {
612+
padding: 0;
613+
margin: 0;
614+
max-width: none;
615+
}
616+
617+
.embedded-section-panel .about-title,
618+
.embedded-section-panel .skills-title,
619+
.embedded-section-panel .certificate-gallery h2 {
620+
display: none;
621+
}
622+
623+
.embedded-section-panel .about,
624+
.embedded-section-panel .skills-section,
625+
.embedded-section-panel .certificate-gallery {
626+
background: transparent !important;
627+
}
628+
509629
.achievement-card {
510630
display: grid;
511631
gap: 14px;

src/App.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ import ErrorBoundary from "./components/ErrorBoundary";
88
import "./App.css";
99

1010
const Hero = lazy(() => import("./components/HeroSection"));
11-
const About = lazy(() => import("./components/AboutSection"));
11+
const About = lazy(() => import("./components/AboutPage"));
1212
const ProjectsPage = lazy(() => import("./components/ProjectsPage"));
13-
const Skills = lazy(() => import("./components/SkillsSection"));
1413
const RewardsPage = lazy(() => import("./components/CertificateGallery"));
1514
const Contact = lazy(() => import("./components/ContactSection"));
1615
const NotFound = lazy(() => import("./components/NotFound"));
@@ -48,7 +47,6 @@ function App() {
4847
<Route path="/about" element={<About />} />
4948
<Route path="/projects" element={<ProjectsPage />} />
5049
<Route path="/projects/:slug" element={<ProjectDetail />} />
51-
<Route path="/skills" element={<Skills />} />
5250
<Route path="/journey" element={<JourneyPage />} />
5351
<Route path="/rewards" element={<RewardsPage />} />
5452
<Route path="/contact" element={<Contact />} />

src/components/AboutPage.jsx

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import React from "react";
2+
import AboutSection from "./AboutSection";
3+
import SkillsSection from "./SkillsSection";
4+
import CertificateGallery from "./CertificateGallery";
5+
import PageHeader from "./ui/PageHeader";
6+
import SectionPanel from "./ui/SectionPanel";
7+
8+
export default function AboutPage() {
9+
return (
10+
<main className="page-shell">
11+
<PageHeader
12+
eyebrow="About SunilCraft"
13+
title="Builder profile, skills, and rewards"
14+
description="A cleaner view of the person behind SunilCraft: engineering focus, practical skills, and milestone snapshots."
15+
align="left"
16+
/>
17+
18+
<SectionPanel
19+
eyebrow="Profile"
20+
title="About"
21+
description="Frontend polish, full-stack execution, and consistent learning in public."
22+
className="embedded-section-panel"
23+
>
24+
<AboutSection />
25+
</SectionPanel>
26+
27+
<SectionPanel
28+
eyebrow="Capability"
29+
title="Skills"
30+
description="Core frontend, backend, and tooling strengths that support the portfolio and coding-journal workflow."
31+
className="embedded-section-panel"
32+
>
33+
<SkillsSection />
34+
</SectionPanel>
35+
36+
<SectionPanel
37+
eyebrow="Recognition"
38+
title="Rewards & Certificates"
39+
description="A compact archive of professional recognition and performance highlights."
40+
className="embedded-section-panel"
41+
>
42+
<CertificateGallery />
43+
</SectionPanel>
44+
</main>
45+
);
46+
}

0 commit comments

Comments
 (0)