ViteReact作品集

portfolio-main — Vite 作品集模板

作者 Garvit1000

Garvit Joshi 的个人作品集网站,采用 React、Vite 与 TailwindCSS 构建,包含邮政主题的首页与浏览器内运行的免费工具 Lab。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

2 个预览视图
桌面端首页1 / 2
桌面端截图首屏预览

由服务器浏览器实际访问页面后截取。

全部页面与视图 2

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-02查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

纯 CSS 绘制的齿孔邮票、弧形文字邮戳与滚动触发的手绘圈选效果

02

Lab 中的 Postmarked 工具在浏览器内完成照片雕刻、EXIF 读取、离线城市匹配与撕下导出

03

统一的 UI 音效系统,通过一个委托监听器播放并提供静音开关

04

内容集中在 src/data/mock.js,项目截图建议 1200px 宽 WebP

05

Lab 页面懒加载,不增加首页包体积

06

可选 GitHub Token 显示完整贡献图,否则回退到公共 API 统计

模板详细介绍

这是一个面向个人展示的作品集模板,仓库为 Garvit Joshi 的个人站点。首页采用温暖的邮政主题:用纯 CSS 绘制带齿孔的邮票、带弧形文字的邮戳,以及滚动进入视口时圈出文字的手绘涂鸦。内容区块包括带品牌色技术标签和 1200px WebP 截图的项目列表、配插画 SVG 的“How I work”卡片、GitHub 卡片、带公司 logo 的经历时间线,以及航空邮件明信片风格的联络区。按钮与链接通过一个统一的事件监听器播放 UI 音效,并提供静音开关。站点只有一套主题:暖白纸张底色、炭黑文字、Averia Sans Libre 标题与圆润正文字体。

站点还包含一个 Lab 区域,提供完全在浏览器中运行的免费工具,无需注册,也不上传数据。其中 Postmarked(/lab/stamp)可把旅行照片转成雕刻风格邮票,并从照片 EXIF 读取拍摄日期与 GPS,配合约 370 个城市的离线列表生成地名,两者均可手动编辑;拖动邮票可撕下并合成纸张撕裂音效,导出为 900 × 1140 的透明齿孔 PNG,最多可把六张照片拼成共享齿孔的整版邮票。Lab 页面为懒加载,不增加首页包体积。

模板使用 React 19、React Router 7、Vite 8、Tailwind CSS 3(配合 CSS 变量)、Hugeicons 与 Simple Icons(CDN)、Lenis 滚动,以及 Vercel Analytics 和 Speed Insights。需要 Node 20.19+ 或 22.12+。内容集中在 src/data/mock.js,项目截图建议约 1200px 宽的 WebP。GitHub 卡片可选配置 VITE_GITHUB_TOKEN 以显示完整贡献图,未配置时回退到公共 API 显示仓库、关注者与账号年龄统计。部署在 Vercel,vercel.json 将所有路由重写到 index.html 以支持深链接刷新。代码采用 MIT 许可。

ViteReact作品集

适合你的项目吗?

适用场景

  • 个人开发者搭建带邮政主题视觉的作品集站点
  • 在浏览器内将旅行照片制作成带邮戳的雕刻风格邮票
  • 把多张照片拼成共享齿孔的整版邮票并导出 PNG
  • 通过修改 src/data/mock.js 替换姓名、简介、项目与经历内容
  • 在 Lab 中新增浏览器内运行的小工具页面

适合人群

  • 需要 React 与 Vite 作品集模板的个人开发者
  • 希望展示项目、经历与社交链接的求职者或自由职业者
  • 对邮政主题视觉与浏览器内图像处理工具感兴趣的开发者
  • 使用 Vercel 部署并需要深链接路由支持的站点

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    需要 Node 20.19+ 或 22.12+,克隆仓库后执行 npm install 与 npm run dev,开发服务器默认在 http://localhost:5173

  2. 2

    可选在 .env 中设置 VITE_GITHUB_TOKEN 以显示完整贡献图;该变量会打包进客户端,不要赋予写权限

  3. 3

    项目截图建议约 1200px 宽的 WebP,卡片实际渲染宽度约 560px

  4. 4

    修改 public/og-image.png 后需更新 index.html 中 og:image 的 ?v= 查询参数,因为 Discord、Slack 和 LinkedIn 按 URL 缓存预览

  5. 5

    部署在 Vercel,vercel.json 将所有路由重写到 index.html 以支持 /lab/og-image 等深链接刷新

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • GitHub 卡片为可选功能:配置 VITE_GITHUB_TOKEN 时显示完整贡献图,未配置时回退到公共 API 仅显示仓库、关注者与账号年龄统计。该变量会打包进客户端,切勿赋予写权限。
  • 部署依赖 Vercel 平台,vercel.json 将所有路由重写到 index.html 以支持深链接刷新;使用其他托管方式需自行处理路由回退。
  • 站点集成 Vercel Analytics 与 Speed Insights 分析服务,部署到 Vercel 时会启用这些外部服务。
  • 图标通过 Hugeicons 与 Simple Icons 的 CDN 加载,运行时依赖外部 CDN 服务。
  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据

Permission is hereby granted, free of charge

许可证原文

With a token, the GitHub card shows the full contribution graph. Without one, it falls back to the public API and shows repo, follower and account-age stats.

README 原文

Deployed on Vercel. `vercel.json` rewrites all routes to `index.html`

README 原文

Analytics | Vercel Analytics and Speed Insights

README 原文

Icons | Hugeicons, Simple Icons (CDN)

README 原文
https://github.com/Garvit1000/portfolio-main/blob/master/LICENSEhttps://github.com/Garvit1000/portfolio-main/blob/master/README.md

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-02。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 88 / 100
技术栈
Vite · React
网站类型
作品集
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-10-01
截图检查日期
2026-10-02

已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。

目录记录的主要技术栈是 Vite。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

已完成服务器许可规则与 AI 来源核对;未经过人工编辑审核。

查看当时使用的来源资料

SHA-256: 684d8948b0c0d74b87410e8cac9d33788b0d1019a560a8aa47726ecdf051735a

2026-10-02T07:57:43.942Z

来源文件 / 仓库
# Garvit Joshi · Portfolio

The personal site of **Garvit Joshi**, full stack developer. A warm, postal-themed portfolio with a small **Lab** of free tools people can use in their browser.

**Live:** [garvit.me](https://www.garvit.me/)

![Preview](public/og-image.png)

## What's inside

### Portfolio
- **Postage-stamp hero.** Perforated stamps drawn in pure CSS (two masks unioned), a postmark with curved ring text, and a hand-drawn scribble that circles a word as it scrolls into view.
- **Projects** with brand-coloured tech pills and 1200px WebP screenshots.
- **How I work** cards with illustrated SVG visuals, a **GitHub card**, and an **experience timeline** with company logos.
- **Air-mail postcard** contact section with a handwritten address and a "REPLY PAID" postmark.
- **UI sounds** on every button and link through one delegated listener, with a mute toggle.
- One single theme: warm off-white paper, charcoal ink, Averia Sans Libre headings and rounded body type.

### Lab
Free tools that run entirely in the browser. No sign-up and nothing uploaded.

- **Postmarked** (`/lab/stamp`). Turn a trip photo into an engraved postage stamp, postmarked from where and when it was taken.
  - **Engraving:** the photo is redrawn as one-ink line engraving (carmine, ultramarine, olive, sepia or black), with auto-levels and partial histogram equalisation so dark photos keep their detail.
  - **Self-postmarking:** the capture date and GPS are read from the photo's EXIF in the browser, and the place name comes from an offline list of about 370 cities (`src/data/places.js`). Both are editable, and photos without location data ask you to type it.
  - **Tear to download:** drag the stamp off the sheet and it rips free with a synthesised paper-tear sound, then saves as a 900 × 1140 PNG with transparent perforations.
  - **Sheets:** add up to six photos for a sheet of stamps that share perforations, each with its own postmark.

Lab pages are lazy-loaded, so they add nothing to the homepage bundle.

## Tech stack

| | |
|---|---|
| Framework | React 19, React Router 7 |
| Build | Vite 8 |
| Styling | Tailwind CSS 3 with CSS variables |
| Icons | Hugeicons, Simple Icons (CDN) |
| Scrolling | Lenis |
| Analytics | Vercel Analytics and Speed Insights |

## Getting started

Requires **Node 20.19+** (or 22.12+).

```bash
git clone https://github.com/Garvit1000/portfolio-main.git
cd portfolio-main
npm install
npm run dev
```

The dev server runs at <http://localhost:5173>.

### GitHub card (optional)

With a token, the GitHub card shows the full contribution graph. Without one, it falls back to the public API and shows repo, follower and account-age stats.

```env
# .env
VITE_GITHUB_TOKEN=your_github_personal_access_token
```

A classic token with no scopes is enough, since it only reads public data. Note that `VITE_` variables are bundled into the client, so never give this token write access.

## Scripts

| Command | What it does |
|---|---|
| `npm run dev` | Start the dev server |
| `npm run build` | Production build into `dist/` |
| `npm run preview` | Serve the production build locally |

## Project structure

```
src/
├── App.jsx                 # Routes: /, /lab, /lab/og-image (others redirect home)
├── index.css               # Design tokens, surfaces, buttons, stamps, postcard
├── data/mock.js            # All portfolio content: bio, projects, experience, links
├── components/
│   ├── Hero.jsx, HeroStamps.jsx, stamp-art.jsx   # Hero, stamps, postmark, stamp artwork
│   ├── Projects.jsx, About.jsx, Experience.jsx, Contact.jsx
│   ├── Scribble.jsx        # Hand-drawn circle highlight
│   ├── SocialLinks.jsx, TechPill.jsx, GitHubCard.jsx
│   └── SoundProvider.jsx   # UI sounds
├── pages/
│   ├── Lab.jsx             # Lab index (tool cards)
│   └── StampTool.jsx       # Postmarked: stamp tool UI and tear-off interaction
├── data/places.js          # Offline city list for turning GPS into a place name
└── lib/
    ├── stamp-render.js     # Engraving, stamp layout, postmark and sheet renderer
    ├── exif.js             # Minimal EXIF reader (capture date + GPS)
    ├── tear-sound.js       # Synthesised paper-tear sound
    └── sound-engine.js …   # Synthesised UI sounds
```

## Editing content

Almost everything you'd want to change lives in [`src/data/mock.js`](src/data/mock.js): name, title, bio, projects (with images in `src/assets/`), work experience (with logos in `src/assets/logos/`) and social links.

Project screenshots should be about 1200px wide WebP files. Anything larger is wasted, because cards render at around 560px.

## Adding to the Lab

To add a new tool, create a page in `src/pages/`, add a lazy route in `App.jsx`, and add an entry (with a `Preview` component for the card) to the `TOOLS` array in [`src/pages/Lab.jsx`](src/pages/Lab.jsx).

## Deployment

Deployed on Vercel. `vercel.json` rewrites all routes to `index.html` so deep links like `/lab/og-image` work on refresh.

When you change `public/og-image.png`, bump the `?v=` query on the `og:image` URLs in `index.html`. Link previews on Discord, Slack and LinkedIn are cached by URL.

## License

MIT. See [LICENSE](LICENSE).

## Contact

**Garvit Joshi** · [[email protected]](mailto:[email protected]) · [LinkedIn](https://linkedin.com/in/garvit-joshi1) · [GitHub](https://github.com/Garvit1000) · [X](https://x.com/Garvit1000)
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。