Skip to content

Commit e31665c

Browse files
committed
Modern portfolio site
0 parents  commit e31665c

35 files changed

Lines changed: 5961 additions & 0 deletions

.claude/settings.local.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"permissions": {
3+
"allow": [
4+
"Bash(npm create *)",
5+
"Bash(npm --version)",
6+
"Bash(npx --yes create-vite@4 . --template react-ts)",
7+
"Bash(npm install *)",
8+
"Bash(npx tailwindcss *)",
9+
"Bash(npm run *)",
10+
"Bash(node -e \"const l = require\\('./node_modules/lucide-react'\\); console.log\\(Object.keys\\(l\\).filter\\(k => k.toLowerCase\\(\\).includes\\('git'\\) || k.toLowerCase\\(\\).includes\\('link'\\)\\)\\)\")",
11+
"Bash(node *)",
12+
"Bash(curl -s http://localhost:4173)",
13+
"Bash(pkill -f \"vite --port 4173\")"
14+
]
15+
}
16+
}

.eslintrc.cjs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module.exports = {
2+
root: true,
3+
env: { browser: true, es2020: true },
4+
extends: [
5+
'eslint:recommended',
6+
'plugin:@typescript-eslint/recommended',
7+
'plugin:react-hooks/recommended',
8+
],
9+
ignorePatterns: ['dist', '.eslintrc.cjs'],
10+
parser: '@typescript-eslint/parser',
11+
plugins: ['react-refresh'],
12+
rules: {
13+
'react-refresh/only-export-components': [
14+
'warn',
15+
{ allowConstantExport: true },
16+
],
17+
},
18+
}

.github/workflows/deploy.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
name: Deploy to GitHub Pages
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: pages
15+
cancel-in-progress: false
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- uses: actions/setup-node@v4
24+
with:
25+
node-version: 20
26+
cache: npm
27+
28+
- run: npm ci
29+
- run: npm run build
30+
31+
- uses: actions/upload-pages-artifact@v3
32+
with:
33+
path: dist
34+
35+
deploy:
36+
needs: build
37+
runs-on: ubuntu-latest
38+
environment:
39+
name: github-pages
40+
url: ${{ steps.deployment.outputs.page_url }}
41+
steps:
42+
- uses: actions/deploy-pages@v4
43+
id: deployment

.gitignore

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Dependencies
2+
node_modules/
3+
4+
# Build output
5+
dist/
6+
dist-ssr/
7+
8+
# Logs
9+
logs/
10+
*.log
11+
npm-debug.log*
12+
yarn-debug.log*
13+
yarn-error.log*
14+
pnpm-debug.log*
15+
lerna-debug.log*
16+
17+
# Environment files
18+
.env
19+
.env.local
20+
.env.*.local
21+
22+
# TypeScript
23+
*.tsbuildinfo
24+
25+
# Editor
26+
.vscode/*
27+
!.vscode/extensions.json
28+
.idea/
29+
*.suo
30+
*.ntvs*
31+
*.njsproj
32+
*.sln
33+
*.sw?
34+
35+
# OS
36+
.DS_Store
37+
Thumbs.db
38+
39+
# Compiled Object files, Static and Dynamic libs (Shared Objects)
40+
*.o
41+
*.a
42+
*.so
43+
44+
# Folders
45+
_obj
46+
_test
47+
48+
# Architecture specific extensions/prefixes
49+
*.[568vq]
50+
[568vq].out
51+
52+
*.cgo1.go
53+
*.cgo2.c
54+
_cgo_defun.c
55+
_cgo_gotypes.go
56+
_cgo_export.*
57+
58+
_testmain.go
59+
60+
*.exe
61+
*.test
62+
*.prof
63+
64+
# WebStorm
65+
*.iml
66+
67+
# Directory-based project format:
68+
.idea/
69+
.idea/workspace.xml
70+
**/.idea/workspace.xml
71+
72+
# mac hidden files
73+
.DS_Store
74+
75+
##other
76+
#node_modules/
77+
#bower_components/
78+
.tmp
79+
#.sass-cache
80+
#builds/**/images/*
81+
#*.ogg
82+
#*.mp3
83+
#*.mp4
84+
#*.png
85+
#*.jpeg
86+
*.psd

CLAUDE.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# CLAUDE.md — pkaranje.github.io
2+
3+
Personal portfolio website for Pratik Karanje. Static site deployed to GitHub Pages via GitHub Actions.
4+
5+
## Tech Stack
6+
7+
| Layer | Tool |
8+
|---|---|
9+
| Framework | React 18 + TypeScript |
10+
| Build | Vite 4 |
11+
| Styling | Tailwind CSS 3 |
12+
| Animation | Framer Motion 12 |
13+
| Particles | @tsparticles/react + @tsparticles/slim |
14+
| Icons | lucide-react v1 (note: no `Github`/`Linkedin` icons — use `GitBranch`/`Link2`) |
15+
| Utilities | clsx + tailwind-merge → `cn()` at `src/lib/utils.ts` |
16+
| Deployment | GitHub Actions → GitHub Pages (`dist/`) |
17+
18+
## Commands
19+
20+
```bash
21+
npm run dev # start dev server at localhost:5173
22+
npm run build # tsc type-check + vite build → dist/
23+
npm run preview # preview production build at localhost:4173
24+
```
25+
26+
Always run `npm run build` after making changes to confirm zero TypeScript errors before committing.
27+
28+
## Project Structure
29+
30+
```
31+
src/
32+
├── App.tsx # Root — composes Navbar + all sections
33+
├── index.css # Tailwind directives + dot-grid utility class
34+
├── main.tsx # React entry point
35+
├── data/
36+
│ └── resume.ts # ★ Single source of truth for ALL content
37+
├── lib/
38+
│ └── utils.ts # cn() helper (clsx + twMerge)
39+
└── components/
40+
├── Navbar.tsx # Fixed top nav, active section tracking
41+
├── ui/
42+
│ └── sparkles.tsx # SparklesCore (tsparticles wrapper)
43+
└── sections/
44+
├── Hero.tsx # Two-column card: text left / photo right
45+
├── Skills.tsx # 8 skill category cards
46+
├── Experience.tsx # Work history cards
47+
├── Certifications.tsx # Certs + education + languages
48+
├── Projects.tsx # 6 project cards
49+
└── Contact.tsx # Contact link cards + email CTA
50+
51+
public/
52+
├── profile.jpeg # Profile photo (served at /profile.jpeg)
53+
└── CV_Detailed_Pratik_Karanje.pdf # Resume PDF (linked from hero Download button)
54+
```
55+
56+
## Content Updates
57+
58+
**All resume data lives in `src/data/resume.ts` only.** Never hardcode content in components. The file exports:
59+
60+
- `personal` — name, title, email, phone, github, linkedin, location, summary
61+
- `skills` — array of `{ category, items[] }`
62+
- `experience` — array of `{ role, company, period, highlights[] }`
63+
- `projects` — array of `{ name, org, tech[], description, link? }`
64+
- `certifications` — array of `{ name, issuer, status }`
65+
- `education` — array of `{ degree, institution, period }`
66+
67+
## Design System
68+
69+
**Theme:** Light. Background `#f0f4f8` (`bg-brand-50`) with `dot-grid` class (radial-gradient dots defined in `index.css`).
70+
71+
**Section alternation:**
72+
- `dot-grid` sections: Hero, Skills, Certifications, Contact
73+
- `bg-white` sections: Experience, Projects
74+
75+
**Cards:** `bg-white rounded-2xl border border-gray-100 shadow-sm` — standard card pattern used everywhere.
76+
77+
**Typography:**
78+
- Section eyebrow: `text-sm font-semibold text-gray-400 uppercase tracking-widest`
79+
- Section heading: `text-4xl md:text-5xl font-bold text-gray-900`
80+
- Body: `text-sm text-gray-500 leading-relaxed`
81+
82+
**Buttons:**
83+
- Primary (dark): `px-6 py-3 rounded-full bg-gray-900 text-white font-semibold hover:bg-gray-700`
84+
- Secondary (outline): `px-6 py-3 rounded-full border border-gray-200 text-gray-700 hover:border-gray-400`
85+
86+
**Animations:** All use Framer Motion `whileInView` with `viewport={{ once: true }}`. Standard pattern:
87+
```tsx
88+
<motion.div
89+
initial={{ y: 24, opacity: 0 }}
90+
whileInView={{ y: 0, opacity: 1 }}
91+
viewport={{ once: true }}
92+
transition={{ duration: 0.55 }}
93+
>
94+
```
95+
Use `ease: "easeOut"` (string) not an array — the installed framer-motion version rejects numeric arrays for `ease`.
96+
97+
## Path Alias
98+
99+
`@/` maps to `src/` (configured in both `vite.config.ts` and `tsconfig.json`).
100+
101+
```ts
102+
import { cn } from "@/lib/utils"; // ✓
103+
import { cn } from "../../lib/utils"; // also fine
104+
```
105+
106+
## Deployment
107+
108+
Pushing to `main` triggers `.github/workflows/deploy.yml` which:
109+
1. Runs `npm ci && npm run build`
110+
2. Uploads `dist/` as a Pages artifact
111+
3. Deploys to `https://pkaranje.github.io`
112+
113+
GitHub Pages source must be set to **GitHub Actions** (not branch) in repo Settings → Pages.
114+
115+
## Known Constraints
116+
117+
- `lucide-react@1.x` does not export `Github` or `Linkedin` — use `GitBranch` and `Link2` instead.
118+
- `base: "./"` is set in `vite.config.ts` so asset paths work correctly on GitHub Pages.
119+
- The `SparklesCore` component (`src/components/ui/sparkles.tsx`) uses `initParticlesEngine` which only initialises once globally — do not instantiate it in components that mount/unmount frequently.
120+
- Profile photo fallback uses `ui-avatars.com` if `/profile.jpeg` fails to load (Hero component `onError` handler).

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# React + TypeScript + Vite
2+
3+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4+
5+
Currently, two official plugins are available:
6+
7+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9+
10+
## Expanding the ESLint configuration
11+
12+
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
13+
14+
- Configure the top-level `parserOptions` property like this:
15+
16+
```js
17+
parserOptions: {
18+
ecmaVersion: 'latest',
19+
sourceType: 'module',
20+
project: ['./tsconfig.json', './tsconfig.node.json'],
21+
tsconfigRootDir: __dirname,
22+
},
23+
```
24+
25+
- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
26+
- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
27+
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list

0 commit comments

Comments
 (0)